casa.ai API v0.1.0
CLI-first API (ADR-10) — dieselben Tool-Funktionen wie UI/CLI. Auth per Bearer-Session-Token (Better Auth).
Diese Seite wird bei jedem Aufruf aus der Spec gerendert. Rohdatei: /api/openapi.json.
Authentifizierung
bearerAuth — Better-Auth-Session-Token (`Authorization: Bearer <token>`).
Endpunkte
ablesung
PATCH/api/ablesung/{id}
Berichtigt den Stand EINER Ablesung (correct_meter_reading); Zeitpunkt und Anlass bleiben. Antwort mit `stand`, `vorherigerStand` und neu gerechneter `plausibilitaet`. Eine Ablesung, auf der eine festgeschriebene Abrechnung beruht, ist gesperrt (409).
operationId: berichtigeAblesung · Auth: bearerAuth
Request-Body (Pflicht): application/json → AblesungBerichtigenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Die berichtigte Ablesung mit altem und neuem Stand. | AblesungBerichtigtResponse |
400 | ungültige Eingabe, unbekanntes Feld (auch die Zähler-Id im Body) oder Stand mit Komma statt Punkt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden) | |
404 | unbekannter ODER fremder Zähler bzw. unbekannte oder fremde Ablesung — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | festgeschriebene Abrechnung beruht auf der Ablesung (ABRECHNUNG_FESTGESCHRIEBEN), Zähler archiviert oder negativer Verbrauch (ApiErrorBody, code conflict, Klartext) | |
abrechnung
POST/api/abrechnung
Startet einen Betriebskosten-Abrechnungslauf (start_billing_run) — Readiness fail-closed, Eingabe INV-TIME-01-gebunden.
operationId: startAbrechnung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | Lauf gestartet — die Antwort trägt den bindingContentHash (INV-TIME-01), das Bindungs-Siegel BEIDER Geld-Seiten: Umlage-Eingabe UND VZ-Stammdaten der Gegenrechnung (seit #1812). | AbrechnungStartResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | unbekanntes ODER fremdes Objekt (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | blockierende Readiness-Befunde oder bereits ein offener Lauf (ApiErrorBody, code conflict) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
GET/api/abrechnung/{id}
Liest die Ergebniszahlen eines Abrechnungslaufs maschinenlesbar — Geld ausschließlich als Integer-STRING, cent-genau.
operationId: getAbrechnungErgebnis · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Ergebniszahlen des Laufs. GELD REIST AUSSCHLIESSLICH ALS INTEGER-STRING ({ cents: "<Integer>", currency: "EUR" }), ustRatePercent ebenso — nie als JSON-number: Beträge jenseits 2^53 überleben so exakt. `null` bleibt `null` (Wohnraum hat KEINEN USt-Satz, das ist etwas anderes als 0 %). Ist der Lauf nicht rechenbar, ist `umlage` EXPLIZIT `null` mit Klartext in `umlageFehler` und den `readinessFindings` — NIE ein leeres `lines`-Array (das wäre von „alles verteilt, Summe 0" nicht unterscheidbar). `rechenbar` ist abgeleitet (umlage !== null && gegenrechnung !== null). `lines`, `totalUmlagefaehig` und `totalVerteiltNetto` reisen zusammen, damit INV-BK-01 am gelieferten Dokument nachprüfbar bleibt. WIEDERHOLBARKEIT: run, umlage, gegenrechnung und readinessFindings stammen aus dem gebundenen Snapshot und sind bei zweimaligem Lesen byte-gleich — seit #1812 auch die VZ-Seite, die als eigener vz-Zweig im Snapshot liegt und in den bindingContentHash eingeht. EINZIGE Ausnahme: ein vor #1812 gebundener ALT-Lauf hat keinen vz-Zweig; seine VZ-Stammdaten werden weiterhin bei jedem Lesen live gelesen, ohne dass sich bindingContentHash ändert. | AbrechnungErgebnisResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel, insbesondere kein 403) | |
POST/api/abrechnung/{id}/berechnet
Setzt den Lauf auf `berechnet` (mark_billing_run_berechnet) — nur bei freigabefähigem Prüfbericht. KEIN Body.
operationId: markAbrechnungBerechnet · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Übergang vollzogen (id, status). | AbrechnungBerechnetResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Prüfbericht nicht freigabefähig — der Lauf bleibt Entwurf (ApiErrorBody, code conflict) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
GET/api/abrechnung/{id}/s35a-bescheinigungen
Erzeugt die §35a-Bescheinigungen ALLER Wohnraum-Mieter eines FESTGESCHRIEBENEN Abrechnungslaufs (Serienlauf je Objekt) — Geld ausschließlich als Integer-STRING.
operationId: getAbrechnungS35aBescheinigungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
format | query | nein | json | pdf | Ohne Angabe (oder `json`) die JSON-Serie; `pdf` liefert EIN Dokument (application/pdf) mit je Bescheinigung einer Seite. |
| Status | Bedeutung | Body |
|---|
200 | Die Serie: je Wohnraum-Vertrag mit Anteil > 0 eine Bescheinigung (Nutzungszeitraum, Einheiten, je §35a-Kategorie der Arbeits-/Lohnkostenanteil; bei Bewohnerwechsel zeitanteilig, Mehrfachbuchungen summiert). Je Vertrag dieselbe Summe wie im §35a-Ausweis der NK-Abrechnung. Gewerbemieter und Eigentümer-Leerstand erhalten keine Bescheinigung; ein Betrag ohne mieterscharfen Anteil steht mit Grund in nichtBescheinigt. INVARIANTE: summeBescheinigungen + summeNichtBescheinigt = summeS35aKosten, cent-genau, Restcent deterministisch. Mit ?format=pdf stattdessen application/pdf (Content-Disposition attachment), byte-deterministisch. | S35aBescheinigungenResponse |
400 | unbekanntes Format oder unbekannter Query-Parameter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Lauf nicht festgeschrieben, Bestandslauf ohne beim Binden gesiegelte §35a-Klassifikation bzw. ohne gesiegelte Anzeigefelder (nie Live-Fallback), oder seine §35a-Belege sind nicht bescheinigungsfähig (Kategorie fehlt, Buchungsdatum außerhalb des Zeitraums) — ApiErrorBody, code conflict, ohne Zahl | |
abschluss
GET/api/abschluss/{id}/freeze
Fragt, ob an einer Abrechnung noch geschrieben werden darf (Muster F7). Ein bestandskräftiger Lauf plus `vorhaben=neuberechnung` endet mit 409 und nennt den Korrekturweg — ein stilles „nichts passiert" sähe für den Bediener wie Erfolg aus.
operationId: getAbschlussFreeze · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
vorhaben | query | ja | storno | neuberechnung | Was mit der Abrechnung geschehen soll. GESCHLOSSENES Vokabular mit ZWEI Wörtern; ein Inline-Edit ist hier nicht abgelehnt, sondern nicht formulierbar. Ein unbekanntes Wort fällt NIE still auf einen Zweig zurück. |
snapshotHash | query | nein | string | Der Hash, den der Aufrufer am AKTUELLEN Stand gebildet hat (`bildeAbschlussSnapshotHash`, 64 Hex-Zeichen klein). Nur MIT ihm fährt die Route die zweite Hälfte von F7 und meldet eine Abweichung mit 409; ohne ihn steht `snapshotGeprueft: false` in der Antwort. Die Route bildet ihn NICHT selbst — der Stand entsteht im Rechenwerk (S12-T11), und ein hier nachgebauter Hash wäre die zweite Wahrheit über denselben Stand. |
| Status | Bedeutung | Body |
|---|
200 | die Freeze-Auskunft samt Korrekturweg (AbschlussFreezeResponse) | AbschlussFreezeResponse |
400 | keine UUID, fehlendes/unbekanntes `vorhaben` ODER ein `snapshotHash` in falscher Form (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Lauf unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | die Abrechnung ist festgeschrieben und das Vorhaben ist `neuberechnung`, ODER der mitgegebene Stand passt nicht mehr zum festgeschriebenen (ApiErrorBody, code conflict) | |
POST/api/abschluss/{id}/storno
Storniert EINEN Abschluss-Lauf — der einzige Weg, an einer festgeschriebenen Abrechnung überhaupt etwas zu bewegen. Der Lauf bleibt danach vollständig lesbar (GG4/GoBD).
operationId: storniereAbschlussLauf · Auth: bearerAuth
Request-Body (Pflicht): application/json → AbschlussStornoRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | der stornierte Lauf samt Stichtag (AbschlussStornoResponse) | AbschlussStornoResponse |
400 | ungültige Eingabe, fehlender Grund ODER fehlender/unförmiger Stichtag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Lauf unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | der Lauf ist bereits storniert (ApiErrorBody, code conflict). Fail-loud statt No-op: ein zweites Storno überschriebe Grund und Tag des ersten. | |
altbestand
GET/api/altbestand/posten
Liest die übernommene OP-, Mahn- und Zahlhistorie EINES Mieters (die Auskunft bei Mieterwiderspruch, ADR 0019).
operationId: listAltbestandPosten · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
contractId | query | ja | string(uuid) | PFLICHT. Eine Sicht „alle übernommenen Zeilen des Mandanten" wäre ein Massenexport von Zahlungsverhalten und Mahnhistorie; die Auskunft ist je Mieter, weil der Anlass je Mieter ist. |
| Status | Bedeutung | Body |
|---|
200 | Alle Zeilen dieses Mieters, aufsteigend nach (datum, quellSchluessel) — die Ordnung ist Vertrag, eine wechselnde Reihenfolge wäre gegen einen Widerspruch nicht verwendbar. Geliefert werden ALLE Arten, auch die gebuchten: journalEntryId zeigt bei art=op auf die Eröffnungs-Sollstellung und ist bei mahnung/zahlung null. betragCents ist ein signierter Integer-STRING. Ein fremder Vertrag liefert eine LEERE Liste wie ein nie existierter (kein Existenz-Orakel). | AltbestandPostenListResponse |
400 | fehlende oder ungültige contractId (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/altbestand/provenienz
Liest die Herkunft EINER Eröffnungs-Sollstellung: Altsystem, Exportzeitpunkt, Datei-Hash, Stichtag, Quellzeile (GG7).
operationId: getEroeffnungsProvenienz · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
journalEntryId | query | ja | string(uuid) | Die Buchung, deren Herkunft erklärt werden soll. |
| Status | Bedeutung | Body |
|---|
200 | provenienz mit quellsystem, exportiertAm, dateiHash, uebernahmestichtag, quellSchluessel und contractId — oder null. null ist BEWUSST die Antwort für drei ununterscheidbare Lagen: fremder Mandant, nie existiert, oder eine Buchung, die nicht aus einer Übernahme stammt. Ein 404 für eine davon wäre genau das Existenz-Orakel, das es nicht geben darf. | AltbestandProvenienzResponse |
400 | fehlende oder ungültige journalEntryId (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/altbestand/uebernahme
Übernimmt einen Altbestand (uebernehme_altbestand): offene Posten buchen, Mahn-/Zahlhistorie ablegen, Provenienz binden.
operationId: uebernehmeAltbestand · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | übernommen (propertyId, uebernahmestichtag, uebernahmeId, eroeffnung|null, anzahlPostenNeu, anzahlPostenReplay) | |
400 | ungültige Eingabe, doppelter Quellschlüssel im Umschlag, Währungsmischung oder ein fachlich abgewiesener Rückstand (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | Vertrag oder Konto am Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found — ein fremder und ein nie existierender Vertrag liefern DIESELBE Antwort, kein Existenz-Orakel) | |
409 | der Buchungssatz saldiert nicht oder der Idempotency-Key ist anders gebunden (ApiErrorBody, code conflict) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
ausnahmen
GET/api/ausnahmen
Listet die Ausnahme-Inbox (offene Verarbeitungs-/Routing-Ausnahmen des aufrufenden Tenants).
operationId: listAusnahmen · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | offene Ausnahmen (AusnahmenListResponse) | AusnahmenListResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
auswertung
GET/api/auswertung/einnahmen-ausgaben
Liest das Einnahmen-/Ausgaben-Journal eines Objekts für einen Zeitraum: je Geldbewegung eine Zeile mit Gegenkonto, Beleg und Netto/USt/Brutto, dazu die Summen je Gegenkonto. Eine Umbuchung zwischen zwei Geldkonten ist weder Einnahme noch Ausgabe — sie steht in `umbuchungen`.
operationId: liesEinnahmenAusgabenJournal · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Das Objekt (UUID) — Pflicht, s. Kommentar in der Spec-Quelle. |
von | query | ja | string(date) | Erster Tag des Zeitraums (einschließlich). |
bis | query | ja | string(date) | Letzter Tag des Zeitraums (einschließlich). |
je-konto | query | nein | string | Auf GENAU EIN Gegenkonto eingrenzen (`gl_accounts.account_no` am Objekt) — die Kontosicht (WinCASA `JOURNAL_EINAUS_K`). Die Summen gelten dann für dieses Konto; ein Konto ohne Bewegung ergibt eine LEERE Liste, keinen Fehler. |
| Status | Bedeutung | Body |
|---|
200 | Die Aufstellung des Zeitraums (EinnahmenAusgabenResponse). Geld reist als Integer-STRING in Cent, nie als JSON-number. `ustHerkunft` sagt je Zeile, ob der USt-Betrag GEBUCHT oder aus dem Satz ABGELEITET ist (GG7). ACHTUNG PII: `gegenkonto`/`geldkonten` sind Kontonummern und können Personenkonten benennen (`gl_accounts.account_no`, Kategorie kontakt). | EinnahmenAusgabenResponse |
400 | fehlendes/ungültiges Objekt, fehlender oder verdrehter Zeitraum (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
Einnahmen-Überschuss-Aufstellung EINES Objekts für EIN Kalenderjahr (Zufluss/Abfluss, § 11 EStG): Einnahmen und Werbungskosten je Gruppe, Brutto/USt/Netto, Überschuss — für das Objekt oder den Anteil eines Eigentümers; Kautionen, durchlaufende Posten, Rücklagen und Eigentümer-Einlagen/-Entnahmen zählen nicht.
operationId: getEinnahmenUeberschuss · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Objekt (Buchungskreis). |
jahr | query | ja | string | Kalenderjahr (JJJJ). |
eigentuemer | query | nein | string(uuid) | Eigentümer (`persons.id`); fehlt ⇒ Objekt gesamt. Der Anteil folgt dem Eigentumsanteil am Tag jeder Position, Rest-Cent nach größtem Rest. |
format | query | nein | json | csv | `json` (Vorgabe) oder `csv` (UTF-8 mit BOM, Semikolon, Dezimalkomma, CRLF, Quellenkopf) — zur Weitergabe an Eigentümer oder Steuerberater. |
| Status | Bedeutung | Body |
|---|
200 | Die Aufstellung als Katalog-Tabelle (`betrag`-Zellen sind Integer-Cent-Strings) oder bei format=csv die fertige CSV-Datei. | AuswertungResponse |
400 | ungültige Query — fehlendes/ungültiges Objekt oder Jahr, unbekannter Parameter oder Format (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt oder fremd, oder die Person hat im Jahr keinen Anteil (ApiErrorBody, code not_found) | |
422 | Stammdaten nicht auswertbar — Einheit ohne Eigentümer, uneinheitliche Anteile, nicht einordenbares Gegenkonto (ApiErrorBody, code invalid_request) | |
GET/api/auswertung/finanzstatus
Finanzstatus EINES Objekts: Entwicklung der Geldkonten im Zeitraum (Anfangsbestand, Zugänge, Abgänge, Endbestand, laufender Saldo je Buchung nach Wertstellung) und Vermögensübersicht zum Stichtag.
operationId: getFinanzstatus · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Objekt (Buchungskreis). PFLICHT: `account_no` ist nur JE OBJEKT eindeutig — ohne Eingrenzung vermischte der Status gleichnamige Konten verschiedener Objekte. |
stichtag | query | nein | string(date) | Stichtag der Vermögensübersicht (EINSCHLIESSLICH). Entweder `stichtag` ODER `von`+`bis` — beides zusammen oder keins von beidem ist ein 400. |
von | query | nein | string(date) | Beginn des Zeitraums (einschließlich). Alles davor ist der Anfangsbestand der Geldkonten. |
bis | query | nein | string(date) | Ende des Zeitraums (einschließlich) und zugleich der Stichtag der mitgelieferten Vermögensübersicht. |
| Status | Bedeutung | Body |
|---|
200 | Der Finanzstatus. Alle Cent-Felder sind vorzeichenbehaftete Integer-STRINGS, nie JSON-numbers — ein Jahresumsatz überschreitet 2^53. `entwicklung` ist im Stichtags-Modus `null`. `stimmt` und `bilanzgleichgewicht` werden AUSGEWIESEN, nicht erzwungen: eine Schieflage soll sichtbar sein. | FinanzstatusResponse |
400 | ungültige Query — fehlende/unbrauchbare Objekt-Referenz, kein oder doppelter Modus, verdrehter Zeitraum (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/auswertung/saldenliste
Summen- und Saldenliste der Sachkonten EINES Objekts für einen Zeitraum: je Konto Anfangsbestand, Soll- und Haben-Umsatz und Endsaldo, gegliedert nach Kontenklassen.
operationId: getSaldenliste · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Objekt (Buchungskreis). PFLICHT: `account_no` ist nur JE OBJEKT eindeutig — ohne Eingrenzung vermischte die Liste gleichnamige Konten verschiedener Objekte. |
von | query | ja | string(date) | Beginn des Zeitraums (einschließlich). Alles davor ist der Anfangsbestand. |
bis | query | ja | string(date) | Ende des Zeitraums (einschließlich). Sätze danach zählen nirgends mit. |
nurBewegt | query | nein | true | false | `true` ⇒ nur Konten mit mindestens einer Buchung IM Zeitraum. Konten mit Vortrag, aber ohne Bewegung, entfallen dann ebenfalls (gefilterteKonten nennt ihre Zahl). |
format | query | nein | json | csv | `json` (Vorgabe) oder `csv`. Bei `csv` ist die Antwort `text/csv` (UTF-8 mit BOM, Semikolon, Dezimalkomma, CRLF) — nicht der JSON-Umschlag. |
| Status | Bedeutung | Body |
|---|
200 | Die Liste. Alle Cent-Felder sind vorzeichenbehaftete Integer-STRINGS, nie JSON-numbers — eine Jahressumme überschreitet 2^53. Bei format=csv ist der Body die fertige CSV-Datei (Content-Disposition attachment). | SaldenlisteResponse |
400 | ungültige Query — fehlendes/verdrehtes Datum, fehlende oder unbrauchbare Objekt-Referenz (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/auswertung/ust-liste
Umsatzsteuer, Vorsteuer und Zahllast eines Objekts über einen Zeitraum — je Steuersatz, auf Wunsch je Konto.
operationId: getAuswertungUstListe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Objekt (Buchungskreis). |
von | query | ja | string(date) | Erster Tag des Zeitraums (einschliesslich). |
bis | query | ja | string(date) | Letzter Tag des Zeitraums (einschliesslich). |
rhythmus | query | nein | monat | quartal | jahr | Rhythmus der ausgewiesenen Perioden (Default quartal). |
je-konto | query | nein | true | false | true ⇒ die Antwort trägt zusätzlich das Detail je Konto und Satz (`zeilen`); sonst ist `zeilen` null. Kebab-Schreibweise, weil die CLI-Flagge `--je-konto` unverändert durchgereicht wird. |
| Status | Bedeutung | Body |
|---|
200 | Umsatzsteuer-Liste des Objekts (UstListeResponse) | UstListeResponse |
400 | Objekt-Referenz, Zeitraum oder Rhythmus unbrauchbar (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
auswertungen
GET/api/auswertungen
Der Katalog der Auswertungen: welche Berichte es gibt, welche Zeitachsen sie kennen und welche Spalten sie liefern.
operationId: getAuswertungsKatalog · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | Der Katalog. Die Reihenfolge ist die Lesefolge der Buchhaltung, nicht die Einfüge-Reihenfolge. | AuswertungKatalogResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/auswertungen/{auswertung}
EINE Auswertung des Katalogs für ein Objekt und einen Zeitraum, als JSON oder CSV — mit Quellenangabe (Mandant, Objekt, Zeitraum, Datenstand).
operationId: getAuswertung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
auswertung | path | ja | string | Katalog-Name des Berichts (`GET /api/auswertungen` nennt die verfügbaren). |
objekt | query | ja | string(uuid) | Objekt (Buchungskreis). PFLICHT: Kontonummern sind nur JE OBJEKT eindeutig, und die Quellenangabe muss sagen, für welches Objekt die Zahl gilt. |
von | query | ja | string(date) | Beginn des Zeitraums (einschließlich). PFLICHT — ein Export ohne Untergrenze ist später nicht vergleichbar. |
bis | query | ja | string(date) | Ende des Zeitraums (einschließlich). PFLICHT — sonst änderte derselbe Ausdruck morgen sein Ergebnis. |
stichtag | query | nein | string(date) | Nur bei Auswertungen mit Zeitbezug `zeitraum-und-stichtag` (offene Posten: Stichtag der Verzugstage). Vorgabe: der Abruftag. |
format | query | nein | json | csv | `json` (Vorgabe) oder `csv`. Bei `csv` ist die Antwort `text/csv` (UTF-8 mit BOM, Semikolon, Dezimalkomma, CRLF) mit der Quellenangabe als Kopfzeilen. |
nurBewegt | query | nein | true | false | Nur `saldenliste`: `true` ⇒ nur Konten mit mindestens einer Buchung IM Zeitraum. |
konto | query | nein | string | Nur `buchungsliste`: Kontonummer am Objekt — der Satz zählt, wenn EINE seiner Zeilen darauf liegt. |
beleg | query | nein | mit | ohne | Nur `buchungsliste`: `mit` ⇒ die Beleg-Kette löst auf, `ohne` ⇒ sie löst nicht auf. |
menge | query | nein | offen | alle | Nur `offene-posten`: `offen` (Vorgabe) = Arbeitsliste, `alle` zusätzlich die erledigten Posten. |
einheit | query | nein | string(uuid) | Nur `hausgeld-steuerzuarbeit`: Einheit (alternativ `eigentuemer`). |
eigentuemer | query | nein | string(uuid) | Nur `hausgeld-steuerzuarbeit`: Eigentümer (alternativ `einheit`). |
abschlusslauf | query | nein | string(uuid) | Nur `hausgeld-steuerzuarbeit`: festgeschriebener Abschluss-Lauf. Ohne `einheit` ist die Antwort leer; fremder oder unbekannter Lauf ⇒ 404 (not_found), nicht festgeschriebener (unbestätigter, ohne Anker) oder stornierter Lauf ⇒ 409 (conflict); ohne Angabe gilt der aktive Lauf des Jahres (keiner ⇒ leer). |
| Status | Bedeutung | Body |
|---|
200 | Die Auswertung. Jede Zelle ist ein String oder null; `spalten[i].typ` sagt, wie sie zu lesen ist (`betrag` ⇒ Integer-Cents). Bei format=csv ist der Body die fertige CSV-Datei (Content-Disposition attachment), deren Kopfzeilen dieselbe Quellenangabe tragen. | AuswertungResponse |
400 | ungültige Parameter — fehlendes Objekt oder Datum, verdrehter Zeitraum, oder ein Filter, den DIESE Auswertung nicht führt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | der Katalog führt diese Auswertung nicht (ApiErrorBody, code not_found) | |
bank
GET/api/bank
Listet Bankverbindungen (3-Wege-Filter, optional auf EIN Objekt eingegrenzt).
operationId: listBankverbindungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | archiviert | alle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback. |
propertyId | query | nein | string(uuid) | grenzt auf EIN Objekt ein (Filter, keine Autorisierung — sichtbar ist ohnehin nur der eigene Tenant, RLS). |
| Status | Bedeutung | Body |
|---|
200 | Bankverbindungsliste (BankListResponse) | BankListResponse |
400 | ungültiger status-Filter oder ungültige propertyId (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/bank
Legt EINE Bankverbindung an einem Objekt an (IBAN-validiert).
operationId: createBankverbindung · Auth: bearerAuth
Request-Body (Pflicht): application/json → BankCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegte Bankverbindung (Bank) | |
400 | ungültige Eingabe, ungültige IBAN ODER Objekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekanntes Objekt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/bank/{id}
Liest EINE Bankverbindung (auch archiviert).
operationId: getBankverbindung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Bank | Bank |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
PATCH/api/bank/{id}
Ändert Bankverbindungs-Stammfelder (IBAN/Kontoart/Gläubiger-ID).
operationId: updateBankverbindung · Auth: bearerAuth
Request-Body (Pflicht): application/json → BankUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geänderte Bankverbindung | |
400 | leerer/ungültiger Patch, ungültige IBAN ODER archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Kontoart oder Bank-Sachkonto des Kautionskontos einer aktiven Kautionsabrede geändert (ApiErrorBody, code conflict) | |
POST/api/bank/{id}/archive
Archiviert eine Bankverbindung (archived_at statt DELETE, K5).
operationId: archiveBankverbindung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | archiviert (BankArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). | |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Kautionskonto einer aktiven Kautionsabrede — nicht archivierbar (ApiErrorBody, code conflict) | |
GET/api/bank/{id}/umsaetze
Liest die IMPORTIERTEN Umsätze einer Bankverbindung — die `bankTransactionId`, die POST /api/bankabgleich/* erwartet.
operationId: listBankUmsaetze · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | Die Bankverbindung. |
menge | query | nein | alle | offen | gebucht | `alle` (Default) · `offen` (kein wirksamer Buchungsanspruch) · `gebucht`. Der Default ist bewusst `alle`: diese Route ist die Auskunft über den IMPORT, nicht die Arbeitsliste — ein bereits gebuchter Umsatz darf nicht spurlos verschwinden. |
providerId | query | nein | string | Auf GENAU EINE Bank-Referenz eingrenzen (bei camt `AcctSvcrRef`) — der Weg, einen Umsatz aus dem eigenen Auszug wiederzufinden. |
correlationId | query | nein | string | Auf EINEN Import-Lauf eingrenzen. |
buchungVon | query | nein | string(date) | Untere Grenze des Buchungsdatums (einschließlich). |
buchungBis | query | nein | string(date) | Obere Grenze des Buchungsdatums (einschließlich). |
limit | query | nein | integer | 1…200; Default 50. `abgeschnitten` sagt, ob mehr da war. |
| Status | Bedeutung | Body |
|---|
200 | Die Umsätze der Verbindung, jüngstes Buchungsdatum zuerst. `betragCents` ist ein vorzeichenbehafteter Integer-STRING (> 0 Eingang, < 0 Ausgang), nie eine JSON-number. `gebucht` kommt aus DEMSELBEN Anspruchs-Prädikat wie Arbeitsliste und Reconciliation (INV-BANK-01) — es gibt keine zweite Formulierung. ACHTUNG PII: verwendungszweck, gegenkontoIban und gegenkontoInhaber sind personenbezogen (freitext/bankdaten/name) und reisen absichtlich mit, weil ohne sie kein Mensch einen Umsatz zuordnen kann; der rohe Provider-Datensatz (`raw`) reist NICHT mit. | BankUmsatzListResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannte Bankverbindung, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel, insbesondere kein 403) | |
POST/api/bank/{id}/umsatz-import
Importiert einen Kontoauszug als Datei (camt.053/camt.052/MT940) auf eine Bankverbindung. Die Datei wird serverseitig geparst; verbucht wird das ERKANNTE Format, nicht das deklarierte. Wiederholung ist gefahrlos (Dedup).
operationId: importBankUmsaetze · Auth: bearerAuth
Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | Die Bankverbindung, auf die importiert wird. |
format | query | ja | camt.053 | camt.052 | mt940 | Leseformat der Datei — wählt NUR den Parser. Verbucht und gemeldet wird das aus der Datei erkannte Format. Unbekannter Wert ⇒ 400, nie stiller Fallback. |
| Status | Bedeutung | Body |
|---|
201 | Import-Report (BankUmsatzImportResponse) — total = imported + deduplicated + discarded + excluded. Ein vom Import AUSGENOMMENES Konto liefert ebenfalls 201, mit excluded > 0 und exclusion (Begründung), keinen Fehler. | BankUmsatzImportResponse |
400 | fehlendes/unbekanntes format, kein oder MEHR ALS EIN file-Feld ODER unlesbare Auszugsdatei (ApiErrorBody, code invalid_request) — kein Teil-Import | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannte Bankverbindung ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | die Bankverbindung bezieht ihre Umsätze bereits über einen nicht getrennten Bankzugang — ein Datei-Import würde doppelt buchen (ApiErrorBody, code conflict). Ausweg: Bankzugang trennen. | |
413 | Datei überschreitet die zulässige Maximalgröße (ApiErrorBody, code payload_too_large) | |
bankabgleich
POST/api/bankabgleich/verbuchen
Legt vor, gibt frei und bucht (execute_bank_transaction_booking) — `modus` wählt das Freigabe-Gate: einzeln (gelb erlaubt) oder sammel (all-green).
operationId: verbucheBankumsatz · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | Gebucht. Je Umsatz entsteht GENAU EIN wirksamer Buchungsanspruch (INV-BANK-01); Zahlungssatz, Verrechnung und Anspruch liegen in EINER Transaktion. Im Sammelweg wird ERST vollständig freigegeben und DANN gebucht — scheitert eine einzelne Buchung, bleiben die übrigen gebucht und der betroffene Umsatz steht in der Reconciliation weiterhin `offen` (kein stiller Verlust, aber auch keine vorgetäuschte Gesamt-Atomarität). | BankabgleichVerbuchungResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | fehlende Step-up-Frische oder keine Zuständigkeit (ApiErrorBody, code forbidden — fail-closed) | |
404 | Umsatz/Vorschlag/Sachkonto/Bankverbindung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel; eine archivierte Bankverbindung ist von einer nie existierenden nicht zu unterscheiden) | |
409 | bereits entschieden, Ampel blockiert, Sammel-Freigabe nicht durchgehend grün, Vorschlag nicht mehr freigegeben — ODER die Stammdaten geben das Bank-Sachkonto nicht her: keine bzw. mehrere Zuordnungen am Objekt der Bankverbindung, oder ein mitgeschicktes bankGlAccountNo weicht vom abgeleiteten ab (ApiErrorBody, code conflict). Diese Ablehnungen sind DETERMINISTISCH — ein Retry hilft nie; die Meldung nennt den Klärungsweg (Kontenplan pflegen bzw. den Wert weglassen). | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
POST/api/bankabgleich/vorlegen
Legt EINEN Bankumsatz als Buchungsvorschlag vor (create_bank_transaction_booking_proposal) — vorbereitend, reversibel, ohne Freigabe.
operationId: legeBankumsatzVor · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | Vorschlags-Version angelegt. `ampel` stammt aus der BEWERTUNG und entscheidet, ob einzeln oder gesammelt freigegeben werden darf. | BankabgleichVorlageResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | Umsatz/Sachkonto/Bankverbindung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel; eine archivierte Bankverbindung ist von einer nie existierenden nicht zu unterscheiden) | |
409 | Debitor nicht eindeutig, kein Tilgungsziel — ODER die Stammdaten geben das Bank-Sachkonto nicht her: keine bzw. mehrere Zuordnungen am Objekt der Bankverbindung, oder ein mitgeschicktes bankGlAccountNo weicht vom abgeleiteten ab (ApiErrorBody, code conflict). Diese Ablehnungen sind DETERMINISTISCH — ein Retry hilft nie; die Meldung nennt den Klärungsweg (Kontenplan pflegen bzw. den Wert weglassen). | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
bankzugang
GET/api/bankzugang
Listet die Bankzugänge des aufrufenden Tenants samt Status (ohne Anbieter-Zugangsdaten).
operationId: listBankzugaenge · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | Bankzugänge des Tenants (BankzugangListResponse) | BankzugangListResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
bauabzug
GET/api/bauabzug/anmeldung
Liest die einbehaltene Bauabzugsteuer je Monat EINES Kalenderjahres — Grundlage der Anmeldung (§ 48a EStG): Summe, Zahl der Einbehalte und Fälligkeit am 10. des Folgemonats. Gezählt wird nur tatsächlich Einbehaltenes: ein Einbehalt zählt, solange seine Buchung (Kreditor an Verbindlichkeit Finanzamt, entsteht mit der Freigabe des Zahlungsauftrags) wirksam, also nicht storniert ist; ein noch nicht freigegebener Auftrag zählt nicht.
operationId: listBauabzugAnmeldung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
jahr | query | ja | string | Kalenderjahr JJJJ |
| Status | Bedeutung | Body |
|---|
200 | { jahr, monate[] } aufsteigend nach Monat; Monate ohne Einbehalt erscheinen nicht. Cent-Felder sind Integer-STRINGS. | BauabzugAnmeldungResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/bauabzug/freistellungsbescheinigung
Liest die hinterlegten Freistellungsbescheinigungen (§ 48b EStG) EINES Kreditors: Nummer, gültig bis, Umfang, Auftragsbezug und ausstellendes Finanzamt, absteigend nach Gültigkeit.
operationId: listFreistellungsbescheinigungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
kreditorPersonId | query | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { kreditorPersonId, bescheinigungen[] } — ein fremder/unbekannter Kreditor ergibt eine leere Liste (kein Existenz-Orakel). | FreistellungsbescheinigungenResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/bauabzug/freistellungsbescheinigung
Hinterlegt eine Freistellungsbescheinigung am Kreditor (hinterlege_freistellungsbescheinigung). Ohne gültige Bescheinigung behält der Zahlungsauftrag für eine Bauleistung über der Bagatellgrenze 15 % für das Finanzamt ein.
operationId: hinterlegeFreistellungsbescheinigung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | hinterlegt — { freistellungsbescheinigungId, kreditorPersonId, nummer, gueltigBis, umfang } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht (ApiErrorBody, code forbidden) | |
404 | Kreditor unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | dieselbe Nummer ist am Kreditor bereits hinterlegt (ApiErrorBody, code conflict) | |
POST/api/bauabzug/kostenart
Kennzeichnet eine Kostenart als Bauleistung (§ 48 Abs. 1 Satz 3 EStG) oder nimmt das Kennzeichen zurück (setze_kostenart_bauleistung). Eingangsrechnungen auf Aufwandskonten dieser Kostenart lösen am Zahlungsauftrag die Bauabzugs-Prüfung aus.
operationId: setzeKostenartBauleistung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | gesetzt — { costCategoryId, istBauleistung } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht (ApiErrorBody, code forbidden) | |
404 | Kostenart unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/bauabzug/objekt-einstellung
Setzt die Lage des Auftraggebers am Objekt, die § 48 EStG unterscheidet (setze_bauabzug_objekt_einstellung): ausschließlich steuerfreie Vermietungsumsätze nach § 4 Nr. 12 UStG heben die Bagatellgrenze auf 15.000 € (§ 48 Abs. 2 Nr. 1 EStG); ein Vermieter von höchstens zwei Wohnungen ist vom Abzug ausgenommen (§ 48 Abs. 1 Satz 2 EStG, Grund vermieter-hoechstens-zwei-wohnungen). Ohne Einstellung gilt 5.000 € und keine Ausnahme.
operationId: setzeBauabzugObjektEinstellung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | gesetzt — { propertyId, ausschliesslichSteuerfreieVermietung, hoechstensZweiWohnungen } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
GET/api/bauabzug/pruefungen
Liest die Bauabzugs-Entscheidungen je Bauleistungs-Position der Zahlungsaufträge: Grund, Rechnungsbetrag, Auszahlung, Einbehalt, Fälligkeit und den Befund der Freistellungsbescheinigung — eine fehlende oder abgelaufene wird mit Status, Nummer und Gültigkeit benannt.
operationId: listBauabzugPruefungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
paymentOrderId | query | nein | string(uuid) | nur die Positionen dieses Zahlungsauftrags |
| Status | Bedeutung | Body |
|---|
200 | { pruefungen[] } nach Zahlungstag und Posten geordnet; ein fremder/unbekannter Auftrag ergibt eine leere Liste. Cent-Felder sind Integer-STRINGS. | BauabzugPruefungenResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/bauabzug/volle-zahlung
Erlaubt, einen offenen Posten (Bauleistung) trotz fehlender Freistellungsbescheinigung VOLL zu zahlen (erlaube_volle_zahlung_bauleistung) — nur mit dokumentierter Begründung und nur mit dem Recht bauabzug.volle-zahlung. Je Posten gilt die erste Erlaubnis.
operationId: erlaubeVolleZahlungBauleistung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | erlaubt — { openItemId, begruendung, erlaubtVon } | |
400 | ungültige Eingabe, z. B. leere Begründung (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | das Recht bauabzug.volle-zahlung fehlt (ApiErrorBody, code forbidden) | |
404 | Posten unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | für diesen Posten ist die volle Zahlung bereits erlaubt (ApiErrorBody, code conflict) | |
beleg
POST/api/beleg
Reicht einen Beleg über die echte Ingest-Vordertür ein (Byte-Typ-/Malware-Gate, Blob, Ingest, Dispatch-Enqueue).
operationId: uploadBeleg · Auth: bearerAuth
Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)
| Status | Bedeutung | Body |
|---|
201 | Ingest-Ergebnis der Vordertür (BelegUploadResponse) — outcome received|duplicate|quarantined. | BelegUploadResponse |
400 | kaputter/fehlender multipart-Body oder keine Datei im Feld file (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
413 | Upload überschreitet die zulässige Maximalgröße — früh am Transport abgewiesen (ApiErrorBody, code payload_too_large) | |
beschluss
POST/api/beschluss/{id}/status
Schreibt den Lebenszyklus-Status eines Beschlusses fort (append-only-Verlauf plus Projektion).
operationId: setzeBeschlussStatus · Auth: bearerAuth
Request-Body (Pflicht): application/json → BeschlussStatusRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | der geschriebene Wechsel (BeschlussStatusResponse) | BeschlussStatusResponse |
400 | ungültige Eingabe ODER unzulässiger Übergang unter der geltenden Kantenmenge — z. B. bestandskraeftig → angenommen, oder jeder Ausgang aus dem Endzustand nichtig (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Beschluss unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
buchung
POST/api/buchung
Führt einen freigegebenen Buchungsvorschlag aus (execute_booking) — optional rückdatiert.
operationId: executeBuchung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | gebucht (journalEntryId, proposalId, proposalVersion, konto, betragCents, betragCurrency) | |
400 | ungültige Eingabe oder unzulässiges Buchungsdatum (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | unbekannter Vorschlag ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Zustand lässt die Buchung nicht zu: keine/abgelehnte Freigabe, überholt, bereits gebucht (ApiErrorBody, code conflict) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
POST/api/buchung/eroeffnungsbestand
Baut Anfangsbestände auf (import_opening_balances) — die Migrationsnaht.
operationId: importEroeffnungsbestand · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | aufgebaut (propertyId, uebernahmestichtag, gebucht[], anzahlNeu, anzahlReplay) | |
400 | ungültige Eingabe, unzulässiger Stichtag oder fachlich abgewiesener Rückstand (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | Konto am Objekt unbekannt ODER fremdes Objekt (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | der Buchungssatz saldiert nicht (ApiErrorBody, code conflict) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable) | |
cli
POST/api/cli/login/exchange
Schritt 3 des CLI-Browser-Logins: tauscht den einmaligen Rückruf-Code gegen den Session-Token (nur im Antwort-Body, nie in einer URL).
operationId: exchangeCliLoginCode · Auth: keine (öffentlich)
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | Session-Token (Bearer) — ausschließlich hier im Body, nie in einer URL (Query-Strings landen in Access-Logs, Proxy-Logs und der Browser-History). Gehört in eine sichere Ablage, nie in eine Ausgabe. | |
400 | Anmeldevorgang unbekannt, abgelaufen, noch nicht bestätigt oder bereits eingelöst (ApiErrorBody, code invalid_request) | |
POST/api/cli/login/start
Schritt 1 des CLI-Browser-Logins: startet eine Anmelderunde und liefert die im Browser zu öffnende Anmelde-URL.
operationId: startCliLogin · Auth: keine (öffentlich)
Request-Body (Pflicht): application/json → CliLoginStartRequest
| Status | Bedeutung | Body |
|---|
200 | Anmelderunde angelegt — `verificationUrl` im Browser öffnen, `loginId` für den Tausch aufbewahren. | |
400 | state fehlt/unbrauchbar, redirectUri ist keine Loopback-Adresse ODER frisch ist kein Boolean (ApiErrorBody, code invalid_request) | |
429 | zu viele gleichzeitig offene Anmeldevorgänge (ApiErrorBody, code invalid_request) | |
datev
POST/api/datev/belegpaket
Erzeugt den DATEV-Buchungsstapel mit Beleglinks UND das zugehörige Belegpaket (ZIP mit document.xml und den unveränderten Original-Belegen) in EINEM Lauf (eine Historien-Zeile). Body wie beim Buchungsstapel. Die Antwort trägt "stapel" (Metadaten, laufId, hinweise, datei), "belegpaket" (null, wenn keine Buchung einen übertragbaren Beleg hat), "ohneBeleg" (Zeilennummer und Grund je Buchung ohne Beleg im Paket; nie Buchungstext oder Name) und "hinweis" (Text genau dann, wenn belegpaket null ist). In der Historie liegt nur die Stapel-Datei mit den Beleglinks; das ZIP wird NICHT abgelegt und ist nur in dieser Antwort abrufbar. Ist der Belegspeicher nicht erreichbar, gibt es 503, keinen Teil-Export und keine Historien-Zeile.
operationId: exportiereDatevBelegpaket · Auth: bearerAuth
Request-Body (Pflicht): application/json → DatevBelegpaketRequest
| Status | Bedeutung | Body |
|---|
200 | Stapel, Belegpaket und Ohne-Beleg-Liste (DatevBelegpaketResponse) | DatevBelegpaketResponse |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found) | |
409 | leerer Umfang, Zeitraum nicht in einem Kalenderjahr, fehlende Kontenzuordnung, Sachkontenlänge, kein eindeutiges Hauptkonto oder Abstimmung gegen das Journal; benannt, nie mit Buchungstext (ApiErrorBody, code conflict) | |
503 | Belegspeicher nicht erreichbar; nichts exportiert, keine Historien-Zeile (ApiErrorBody, code unavailable) | |
POST/api/datev/buchungsstapel
Erzeugt den DATEV-Buchungsstapel (EXTF 700) für ein oder mehrere Objekte und ein Kalenderjahr und legt den Lauf in der Export-Historie ab. Die Antwort trägt die Datei (Windows-1252, Base64) samt sha256 und "hinweise" auf nicht festgeschriebene Perioden (Hinweis, kein Abweis). Der Export löst KEINE Festschreibung aus; "festschreibung" ist nur das Kennzeichen im Kopfsatz. Ein abweichendes Wirtschaftsjahr geht als zwei Stapel (zwei Aufrufe): exportiert wird der Teil des Kalenderjahres `jahr`, der im Wirtschaftsjahr ab `wirtschaftsjahrBeginn` liegt; berührt das Wirtschaftsjahr das Jahr nicht, ist das ein 400.
operationId: exportiereDatevBuchungsstapel · Auth: bearerAuth
Request-Body (Pflicht): application/json → DatevBuchungsstapelRequest
| Status | Bedeutung | Body |
|---|
200 | der Lauf samt Datei (DatevBuchungsstapelResponse) | DatevBuchungsstapelResponse |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found) | |
409 | leerer Umfang, Zeitraum nicht in einem Kalenderjahr (Klartext nennt beide Teilzeiträume), fehlende Kontenzuordnung, Sachkontenlänge, kein eindeutiges Hauptkonto oder Abstimmung gegen das Journal; benannt, nie mit Buchungstext (ApiErrorBody, code conflict) | |
POST/api/datev/debkred
Erzeugt die DATEV-Stammdatendatei Debitoren/Kreditoren (EXTF, Personenkonten mit Name, Anschrift und bestätigter IBAN) zu einem Buchungsstapel für ein oder mehrere Objekte und ein Kalenderjahr. Die Antwort trägt die Datei (Windows-1252, Base64) samt sha256 und Zahlen. "umfang" ist Pflicht (buchungsstapel oder alle-aktiven). Die Datei enthält Namen und Anschriften: sie steht NICHT in der Export-Historie und ist nicht erneut abrufbar (siehe "hinweise"); der Beleg im Kommando-Log trägt nur sha256 und Zahlen.
operationId: exportiereDatevDebKred · Auth: bearerAuth
Request-Body (Pflicht): application/json → DatevDebKredRequest
| Status | Bedeutung | Body |
|---|
200 | die Datei samt Zahlen (DatevDebKredResponse) | DatevDebKredResponse |
400 | ungültige Eingabe, fehlender umfang oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found) | |
409 | leerer Umfang, Zeitraum, fehlende Kontenzuordnung, Sachkontenlänge, Personenkonto ohne Geschäftspartner oder bereits verwendeter Idempotency-Key, dessen Datei sich nicht bytegleich herstellen lässt (anderer Body oder geänderte Stammdaten seit dem Erstlauf; bei gleichem Body und unveränderten Stammdaten antwortet der Retry mit 200 und derselben Datei; neuen Key verwenden); benannt, nie mit Name oder Anschrift, ohne Datei (ApiErrorBody, code conflict) | |
GET/api/datev/historie
Listet die früheren DATEV-Buchungsstapel-Läufe, die für die angemeldete Person sichtbar sind, jüngster zuerst: Lauf-Id, Zeitraum, Objekte, Dateiname, sha256, Zeilenzahl, Summe, Zeitpunkt und erzeugende Person; nie Buchungstexte und keine Datei-Bytes. Ein Lauf über mehrere Objekte steht in der Liste jedes seiner Objekte (nur als Kennzahlen); seine Datei liefert der Download nur, wenn die Person für ALLE Objekte des Laufs zuständig ist. Die Historie hält nur die Stapel-Datei; ein Belegpaket (ZIP) und die DebKred-Datei sind nicht darin. Seitenweise: "weiter" der Antwort ist der Cursor für die nächste Seite. Mandant und Zuständigkeit stammen aus der Session.
operationId: listeDatevHistorie · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | nein | array<string(uuid)> | Nur Läufe, die dieses Objekt berühren; wiederholbar (Läufe, die mindestens eines berühren). Ein Objekt außerhalb der eigenen Zuständigkeit liefert nichts. |
limit | query | nein | integer | Seitengröße, 1 bis 200 (Vorgabe 200) |
weiter | query | nein | string | Cursor "weiter" der vorigen Seite |
| Status | Bedeutung | Body |
|---|
200 | Eine Seite der Historie (DatevHistorieListResponse) | DatevHistorieListResponse |
400 | ungültiges objekt, limit oder weiter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
GET/api/datev/historie/{laufId}/datei
Liefert die abgelegte Stapel-Datei eines früheren Laufs erneut, byte-gleich zum ursprünglichen Export (gleiche sha256), ohne neuen Buchungslauf, ohne Kommando-Log-Eintrag und ohne neue Historien-Zeile. Nur die Stapel-Datei: ein Belegpaket (ZIP) und die DebKred-Datei liegen nicht in der Historie. Unbekannte, fremde oder nicht vollständig zuständige Lauf-Id ⇒ 404. Stimmen die abgelegten Bytes nicht mehr zu ihrem sha256, gibt es 500 und kein Byte.
operationId: ladeDatevHistorieDatei · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Lauf-Id und Datei (DatevHistorieDateiResponse) | DatevHistorieDateiResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Lauf unbekannt, fremder Mandant oder die Person ist nicht für alle Objekte des Laufs zuständig (ApiErrorBody, code not_found) | |
500 | abgelegte Datei passt nicht mehr zu ihrem sha256; nichts ausgeliefert (ApiErrorBody, code internal) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
eigentum
POST/api/eigentum/{id}/beenden
Beendet eine Eigentumszeile; die Pfad-Id ist die `ownershipId`. `endeExklusiv` ist der erste Tag OHNE Eigentum („zum 30.06." ⇒ 2025-07-01). Beenden kürzt nur das Fenster; dasselbe Ende ein zweites Mal ist ein Erfolg ohne Änderung (`beendet` false). Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).
operationId: beendeEigentum · Auth: bearerAuth
Request-Body (Pflicht): application/json → EigentumBeendenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | das beendete Eigentum (EigentumBeendenResponse) | EigentumBeendenResponse |
400 | keine UUID, ungültiges Datum, Ende nicht nach Beginn oder Vollmacht beginnt nicht vor dem Ende (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Eigentumszeile unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | die Zeile endet bereits zu einem ANDEREN Tag (ApiErrorBody, code conflict) | |
einheit
GET/api/einheit
Listet Einheiten (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv; optional je Gebäude oder Objekt).
operationId: listEinheiten · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | archiviert | alle | aktiv | archiviert (Default aktiv). Wirkt NUR auf units.archived_at — seit #445 kaskadiert archive_building bzw. archive_property abwärts, sodass mit-archivierte Einheiten aus dem aktiv-Default verschwinden. |
gebaeudeId | query | nein | string(uuid) | Nur Einheiten DIESES Gebäudes. Einschränkung innerhalb des Tenants, keine Autorisierungsgrenze. |
objektId | query | nein | string(uuid) | Nur Einheiten dieses Objekts (über alle seine Gebäude hinweg). Einschränkung innerhalb des Tenants. |
| Status | Bedeutung | Body |
|---|
200 | Einheitenliste (EinheitListResponse) | EinheitListResponse |
400 | ungültiger status-Filter oder Eltern-ID keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/einheit
Legt eine Einheit an einem aktiven Gebäude an.
operationId: createEinheit · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegte Einheit (Einheit) | |
400 | ungültige Eingabe ODER Elterngebäude archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Elterngebäude unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Einheitennummer im Objekt bereits an eine aktive Einheit vergeben (ApiErrorBody, code conflict, #5534) | |
GET/api/einheit/{id}
Liest EINE Einheit (auch archiviert) samt Gebäude- und Objekt-Bezug.
operationId: getEinheit · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Einheit | Einheit |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
PATCH/api/einheit/{id}
Ändert unitNo/unitKind/bezeichnung (nur nicht-archivierte Einheiten).
operationId: updateEinheit · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geänderte Einheit | |
400 | leerer/ungültiger Patch ODER Einheit archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | neue Einheitennummer im Objekt bereits an eine aktive Einheit vergeben (ApiErrorBody, code conflict, #5534) | |
POST/api/einheit/{id}/archive
Archiviert eine Einheit (archived_at statt DELETE, K5).
operationId: archiveEinheit · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | archiviert (EinheitArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). | |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/einheit/{id}/attribut
Liest die Attribut-Historie einer Einheit (alle Zeitscheiben je Attribut, active zum Stichtag).
operationId: listEinheitAttribute · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
attributeKey | query | nein | string | nur Scheiben dieses Attribut-Schlüssels (exakte Übereinstimmung) |
asOf | query | nein | string(date) | Stichtag YYYY-MM-DD, gegen den `active` gemessen wird (Default: heute UTC). Ungültiges Format ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Attribut-Historie (EinheitAttributListResponse) | EinheitAttributListResponse |
400 | keine UUID oder ungültiger asOf (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheit/{id}/attribut
Setzt/ändert eine Attribut-Zeitscheibe „ab Datum" (SCD-2; Überschneidungen desselben Attributs werden abgelehnt).
operationId: setEinheitAttribut · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitAttributSetRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gesetzte Zeitscheibe (EinheitAttributSetResponse) | |
400 | ungültige Eingabe, leerer/degenerierter Bereich ODER Überschneidung mit einer bestehenden Scheibe desselben Attributs (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt, archiviert ODER fremder Tenant (ApiErrorBody, code not_found bzw. invalid_request bei archiviert) | |
GET/api/einheit/{id}/belegung
Löst die Belegung einer Einheit zum Stichtag auf („wer wohnt in Einheit X?"), optional stattdessen die Historie. EINE Zustandsachse mit vier Ausgängen: aktiver Mietvertrag (Mietpartei) · Eigentümer als Selbstnutzer · Drittnutzer-Kontakt · Leerstand. Der Zustand wird ABGELEITET, wo casa den Mietvertrag selbst führt (aktiver Vertrag ⇒ vermietet, Vertragslücke ⇒ Leerstand), und aus der gepflegten Zeitscheibe GELESEN, wo nicht (fremdverwaltete WEG-Einheit). Ein Widerspruch zwischen beiden ist ein BEFUND, keine Sperre.
operationId: getEinheitBelegung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | nein | string(date) | Stichtag YYYY-MM-DD, zu dem aufgelöst wird (Default: heute UTC). Ungültiges Format ⇒ 400. |
historie | query | nein | string | `1` ⇒ statt der Auflösung die volle, nicht-archivierte Zeitscheiben-Historie (EinheitBelegungHistorieResponse). |
| Status | Bedeutung | Body |
|---|
200 | aufgelöste Belegung (EinheitBelegungResponse) bzw. Historie (EinheitBelegungHistorieResponse) bei `historie=1` | EinheitBelegungResponse |
400 | keine UUID oder ungültiger Stichtag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheit/{id}/belegung
Setzt/ändert die GEPFLEGTE Belegungs-Zeitscheibe „ab Datum" (SCD-2; Überschneidungen werden abgelehnt). Pflegt ausschliesslich den Fall, in dem casa den Mietvertrag NICHT führt. Personenzahl 0 bei zustand=leerstand wird abgelehnt: eine leerstehende Einheit zählt bei personenbasierter Umlage fiktiv als 1 Person (BGH VIII ZR 159/05), 0 ist nicht wählbar.
operationId: setEinheitBelegung · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitBelegungSetRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gesetzte Zeitscheibe (EinheitBelegungSetResponse) | |
400 | ungültige Eingabe, leerer/degenerierter Bereich, Personenzahl 0 bei Leerstand (BGH-Gate), Drittnutzer ausserhalb von „vermietet" ODER Überschneidung mit einer bestehenden Scheibe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit oder Drittnutzer-Person unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/einheit/{id}/eigentuemerwechsel
Listet die Eigentümerwechsel-Vorgänge einer Einheit, aufsteigend nach Grundbuch-Stichtag, mit den beteiligten abgehenden und neuen Eigentumszeilen. Eine Einheit ohne Wechsel ist eine leere Liste.
operationId: listEinheitEigentuemerwechsel · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die Wechsel-Vorgänge der Einheit (EigentuemerwechselListeResponse) | EigentuemerwechselListeResponse |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
POST/api/einheit/{id}/eigentuemerwechsel
Erfasst einen Eigentümerwechsel als EINEN Vorgang: die abgehenden Eigentumszeilen enden am Grundbuch-Stichtag, die neuen beginnen an ihm; optional mit Verwalterzustimmung. Der Stichtag ist die Eintragung im Grundbuch, Abteilung I — nicht der Notartermin. Laufende SEV-Mandate abgehender Eigentümer werden nicht beendet, sondern in `sevMandateOffen` genannt. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).
operationId: erfasseEinheitEigentuemerwechsel · Auth: bearerAuth
Request-Body (Pflicht): application/json → EigentuemerwechselErfassenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | der erfasste Wechsel mit beendeten und neuen Zeilen sowie offenen SEV-Mandaten, ohne Zustellanschrift (EigentuemerwechselErfassenResponse) | EigentuemerwechselErfassenResponse |
400 | keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: abgehende Zeile doppelt, Anteil kein positiver Integer-String | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit, Person oder abgehende Eigentumszeile unbekannt, fremder Mandant ODER Zeile gehört nicht zur Einheit (ApiErrorBody, code not_found) — alle Fälle identisch | |
409 | Zustandskonflikt (ApiErrorBody, code conflict): Anteilssumme der neuen Eigentümer weicht von der der abgehenden ab, der Stichtag liegt in einem bereits festgeschriebenen Abrechnungsjahr (Korrektur des Abschlusses), Überlappung, eine abgehende Zeile ist bereits beendet oder schon durch einen Wechsel beendet, das Objekt trägt kein Eigentum | |
POST/api/einheit/{id}/eigentum
Erfasst eine Eigentumszeile (Person, Anteil in Zehntausendsteln als Integer-String, Beginn, optional Ende, Zustellanschrift, Vollmacht, Umsatzsteuer-Option) an der Einheit. Die Einheit steht im Pfad. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header). Ein Löschweg existiert bewusst nicht: Eigentum wird beendet.
operationId: erfasseEinheitEigentum · Auth: bearerAuth
Request-Body (Pflicht): application/json → EigentumErfassenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die erfasste Eigentumszeile samt Befunden zur Anteilssumme, ohne Zustellanschrift (EigentumErfassenResponse) | EigentumErfassenResponse |
400 | keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: Ende nicht nach Beginn, Anteil kein positiver Integer-String | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit oder Person unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | Zustandskonflikt (ApiErrorBody, code conflict): dieselbe Person hält die Einheit schon im überlappenden Zeitraum (Überlappung), das Objekt trägt kein Eigentum (Miet-Objekt), die Person oder Einheit ist archiviert | |
PUT/api/einheit/{id}/einnahmeart
Setzt die Einnahmeart einer Einheit (Wohnung, andere Räume, an Angehörige vermietet, nicht steuerpflichtig) und optional das Geschoss — die Merkmale, nach denen die Auswertung `einnahmen-ueberschuss-einnahmeart` die Mieteinnahmen gliedert. `einnahmeart: null` entfernt sie; die Auswertung meldet eine Einheit ohne Einnahmeart dann als Befund, statt einen Wert zu raten.
operationId: setEinheitEinnahmeart · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitEinnahmeartSetRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | wirksamer Stand nach dem Aufruf (EinheitEinnahmeartResponse) | EinheitEinnahmeartResponse |
400 | ungültige Eingabe (unbekannte Einnahmeart, leeres oder zu langes Geschoss) oder Einheit archiviert (ApiErrorBody) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheit/{id}/reactivate
Reaktiviert eine Einheit (#445).
operationId: reactivateEinheit · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | reaktiviert (EinheitReactivateResponse). | |
400 | keine UUID ODER Gebäude/Objekt archiviert (ApiErrorBody, code invalid_request) — erst den Elternteil reaktivieren. | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Einheitennummer im Objekt inzwischen an eine andere aktive Einheit vergeben (ApiErrorBody, code conflict, #5534) — erst die Nummer der aktiven Einheit ändern. | |
GET/api/einheit/{id}/sev-mandat
Löst die Sondereigentumsverwaltung einer Einheit zum Stichtag auf („beauftragt der Eigentümer uns hier zusätzlich mit der Vermietung, und mit welchen Vertragswerten?"), optional stattdessen die Historie. Halboffen: ein Mandat ab 01.01.2025 wird zum 01.06.2025 gefunden, zum 31.12.2024 nicht; ein zum 01.07.2025 beendetes am 30.06. noch, am 01.07. nicht mehr. `mandat: null` heisst „am Stichtag keine Sondereigentumsverwaltung" — nicht „Einheit unbekannt" (dafür 404).
operationId: getEinheitSevMandat · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | nein | string(date) | Stichtag YYYY-MM-DD, zu dem aufgelöst wird (Default: heute UTC). Ungültiges Format ⇒ 400. |
historie | query | nein | string | `1` ⇒ statt der Auflösung alle Zeitabschnitte (SevMandatHistorieResponse). |
| Status | Bedeutung | Body |
|---|
200 | wirksames Mandat (SevMandatResponse) bzw. alle Zeitabschnitte (SevMandatHistorieResponse) bei `historie=1` | SevMandatResponse |
400 | keine UUID oder ungültiger Stichtag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheit/{id}/sev-mandat
Vereinbart die Sondereigentumsverwaltung für einen Eigentümer und diese Einheit als Zeitabschnitt. NUR in einem Objekt der Verwaltungsart "pro" ("WEG mit Mietverwaltung"): in einem reinen Mietobjekt gibt es kein Sondereigentum, das zusätzlich beauftragt werden könnte, in einer reinen WEG führt die Verwaltung die Mietseite nicht. Die Person muss im GESAMTEN Mandatszeitraum Eigentümerin der Einheit sein. Es gibt bewusst KEIN Änderungs-Kommando: ein Wechsel von „mit Mietinkasso" zu „ohne" ist beenden + neu anlegen (Parität Immoware24).
operationId: legeEinheitSevMandatAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevMandatAnlegenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | angelegte Vereinbarung (SevMandatAnlegenResponse) | |
400 | ungültige Eingabe, leerer Zeitraum, unstimmige Vertragswerte (Art ohne Wert oder Wert ohne Art), Mietgutschrift ohne Mietinkasso, fehlendes Auszahlungsziel, Objekt nicht "pro", Person im Zeitraum nicht Eigentümerin ODER Überschneidung mit einem bestehenden Mandat derselben Wohnung (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit, Person oder Bankverbindung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheit/{id}/sev-mieterabrechnung
Berechnet die Betriebskostenabrechnung des Mieters der SEV-Wohnung aus der Hausgeld-Einzelabrechnung, die der Server aus dem genannten festgeschriebenen WEG-Abschlusslauf lädt (hashgeprüft; nie Beträge, Positionen oder Schlüssel aus dem Body) — umlagefähiger Anteil, Geldkreis miete — plus umlagefähigen Kosten der Wohnung; Vermieter ist der Eigentümer laut unit_ownerships (bei Wechsel ein Abschnitt je Eigentümer). Bei Mietinkasso lädt der Server die Vorauszahlungen aus der Mietbuchhaltung des Vertrags (ein Vorauszahlungsfeld im Body ist ein 400). Dazu derselbe Prüfbericht wie bei Mietobjekten, einschließlich heizkostenv_ohne_verbrauch (Kürzungsrecht nach § 12 HeizkostenV). Schreibt nichts.
operationId: berechneSevMieterabrechnung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { abrechnung, pruefbericht } — abrechnung mit abschnitte (vermieter, kosten mit herkunft/herkunftText, vorauszahlungen mit herkunft), Summen und nichtUmlagefaehig; pruefbericht { freigabefaehig, proben, funde }. Cent-Felder sind Ganzzahl-STRINGS. | |
400 | ungültige Eingabe (auch eine Einzelabrechnung oder Vorauszahlungen im Body), Wohnung nicht im Abschlusslauf, Kostenart ohne Zuordnung, keine lückenlose Sondereigentumsverwaltung im ganzen Abrechnungsjahr, Umfangswechsel mit ↔ ohne Mietinkasso im Abrechnungsjahr ODER Eigentumslücke (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit, Vertrag oder Abschlusslauf unbekannt, fremder Tenant ODER Objekt nicht zuständig — je dieselbe Antwort (ApiErrorBody, code not_found) | |
409 | der Abschlusslauf ist storniert, sein Beschluss nicht angenommen/bestandskräftig, er trägt keinen Festschreibungs-Anker ODER sein Stand passt nicht mehr zum Hash — nie Betrag oder Hash in der Antwort (ApiErrorBody, code conflict) | |
GET/api/einheit/{id}/sev-mieterkosten
Die SE-Kosten der Wohnung, die für die Mieterabrechnung bereitstehen: genau die umlagefähig gekennzeichneten, bezahlten, nicht stornierten Rechnungen mit Rechnungsdatum im Zeitraum (beide Grenzen inklusiv).
operationId: listSevMieterKosten · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
von | query | ja | string(date) | Beginn YYYY-MM-DD (inklusiv). Fehlend oder ungültig ⇒ 400. |
bis | query | ja | string(date) | Ende YYYY-MM-DD (inklusiv). Fehlend oder ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | umlagefähige SE-Kosten im Zeitraum (SevMieterKostenResponse) | SevMieterKostenResponse |
400 | fehlender oder ungültiger Zeitraum (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt, fremder Tenant ODER Objekt nicht zuständig (ApiErrorBody, code not_found) | |
GET/api/einheit/{id}/wechselzeitraum
Prüft vorab, ob sich ein nachträglich erfasster früherer Bewohner- oder Eigentümerzeitraum (von/bis, beide Tage INKLUSIVE) in den Bestand der Einheit einfügt: ok · ueberlappt (mit Zeilen-Id der betroffenen Zeile; auch wenn das Ende auf den Beginn des bestehenden Zeitraums fällt) · zeitraum-verdreht · beginn-unbekannt, dazu eine etwaige Lücke zum nächsten bestehenden Zeitraum (gemeldet, nicht verboten). Reiner Read, schreibt nichts; erfasst wird über die Belegungs- und Eigentumsendpunkte.
operationId: pruefeEinheitWechselzeitraum · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
art | query | ja | bewohner | eigentuemer | bewohner | eigentuemer |
von | query | ja | string(date) | Erster Tag des Zeitraums (inklusive), JJJJ-MM-TT. |
bis | query | ja | string(date) | Letzter Tag des Zeitraums (inklusive), JJJJ-MM-TT. |
| Status | Bedeutung | Body |
|---|
200 | Prüfergebnis (WechselzeitraumResponse) | WechselzeitraumResponse |
400 | keine UUID, ungültige Art oder ungültiger Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
einheitengruppe
GET/api/einheitengruppe
Listet die Abrechnungskreise (3-Wege-Archiv-Filter, optional auf ein Objekt eingegrenzt).
operationId: listEinheitengruppen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | string | aktiv | archiviert | alle (Default aktiv) |
propertyId | query | nein | string(uuid) | nur Kreise dieses Objekts |
| Status | Bedeutung | Body |
|---|
200 | Kreis-Liste (EinheitengruppeListResponse) | EinheitengruppeListResponse |
400 | ungültiger Filter/UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/einheitengruppe
Legt einen Abrechnungskreis an einem aktiven Objekt an.
operationId: createEinheitengruppe · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitengruppeCreateRequest
| Status | Bedeutung | Body |
|---|
200 | angelegter Kreis (Einheitengruppe) | |
400 | ungültige Eingabe ODER Objekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/einheitengruppe/{id}
Liest einen Abrechnungskreis mit seinen Mitgliedschaften (active zum Stichtag).
operationId: getEinheitengruppe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
asOf | query | nein | string(date) | Stichtag YYYY-MM-DD, gegen den `active` je Mitgliedschaft gemessen wird (Default heute UTC). Ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Kreis-Detail inkl. Mitgliedschaften (EinheitengruppeDetailResponse) | EinheitengruppeDetailResponse |
400 | keine UUID oder ungültiger asOf (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Kreis unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
PATCH/api/einheitengruppe/{id}
Ändert Stammfelder eines Abrechnungskreises (name/groupKind).
operationId: updateEinheitengruppe · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitengruppeUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geänderter Kreis (Einheitengruppe) | |
400 | leerer/ungültiger Patch ODER Kreis archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Kreis unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheitengruppe/{id}/archive
Archiviert einen Abrechnungskreis (archived_at statt DELETE).
operationId: archiveEinheitengruppe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Archiv-Ergebnis (UmlageArchiveResponse) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Kreis unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheitengruppe/{id}/mitglied
Nimmt eine Einheit „ab Datum" in den Kreis auf (SCD-2; Überschneidungen derselben Einheit im Kreis werden abgelehnt).
operationId: addEinheitengruppeMitglied · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitengruppeMitgliedAddRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | aufgenommene Mitgliedschaft (EinheitengruppeMitgliedAddResponse) | |
400 | ungültige Eingabe, leerer Bereich, Einheit gehört nicht zum Objekt des Kreises, Kreis/Einheit archiviert ODER Überschneidung (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Kreis oder Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/einheitengruppe/{id}/mitglied/beenden
Beendet die offene Mitgliedschaft einer Einheit zum Stichtag.
operationId: endEinheitengruppeMitglied · Auth: bearerAuth
Request-Body (Pflicht): application/json → EinheitengruppeMitgliedEndRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | beendete Mitgliedschaft (EinheitengruppeMitgliedEndResponse) | |
400 | ungültige Eingabe ODER Ende vor Beginn (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Kreis oder Mitgliedschaft unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
einstellungen
POST/api/einstellungen/festschreibung
Schaltet die Festschreibung der Buchungsperioden für ein Objekt (propertyId) oder als Mandanten-Vorgabe (propertyId null) ein oder aus. Ausschalten lässt bestehende Festschreibungen unberührt. Nur ein Mensch mit Admin-Recht.
operationId: setzeFestschreibungSchalter · Auth: bearerAuth
Request-Body (Pflicht): application/json → FestschreibungSchalterRequest
| Status | Bedeutung | Body |
|---|
200 | der jetzt gespeicherte Wert (FestschreibungSchalterResponse) | FestschreibungSchalterResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht — nur ein Mensch (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found) | |
fremdvertrag
GET/api/fremdvertrag
Liest die Verträge mit Dritten des Mandanten (Versicherung, Wartung, Dienstleistung, Versorgung), begrenzt auf die Objekte mit Zuständigkeit des Aufrufers: Art, Bezeichnung, Partner, Beginn, Konditionen zum Stichtag (Beträge als Integer-STRING in Cent), Fristenstand, Zahl der Schadenfälle. Filter propertyId, art, status (aktiv | beendet | alle, Vorgabe aktiv), limit (Vorgabe 50, höchstens 200) und offset. Nur lesend.
operationId: getFremdvertragListe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
propertyId | query | nein | string(uuid) | |
art | query | nein | versicherung | wartung | dienstleistung | versorgung | |
status | query | nein | aktiv | beendet | alle | |
limit | query | nein | integer | |
offset | query | nein | integer | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, zeilen[], gesamt, limit, offset } — leer ohne Verträge; Geld ist ein Integer-STRING in Cent. | FremdvertragListeResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder unbekannter Filterwert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/fremdvertrag
Legt einen Vertrag mit Dritten samt ersten Konditionen an: propertyId, art, partnerPersonId (Rolle Kreditor oder Dienstleister), bezeichnung, beginn, kuendigungsfristMonate; optional laufzeitEnde, vertragsnummer, Verlängerung (ohne Angabe: Vorgabe der Einstellung, sonst ja, 12 Monate), beitrag mit beitragIntervall, selbstbehalt (nur Versicherung) und bemerkung. Geld ist ein Objekt {cents, currency}.
operationId: legeFremdvertragAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragAnlegenRequest
| Status | Bedeutung | Body |
|---|
200 | Vertrags-Id und die ersten Konditionen (Version 1). | FremdvertragAnlegenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
GET/api/fremdvertrag/{id}
Liest EINEN Vertrag mit Dritten: Konditionen zum Stichtag, Konditionen-Historie, Ereignisse, Fristenstand (spaetesterZugang, aufgabeAb), Dauerzahlungs-Abgleich und Schadenfälle. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr). Nur lesend.
operationId: getFremdvertrag · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | nein | string(date) | |
| Status | Bedeutung | Body |
|---|
200 | Der Vertrag mit allen Bestandteilen; Geld ist ein Integer-STRING in Cent. | FremdvertragResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/fremdvertrag/{id}/beendigung
Beendet den Vertrag zum Tag beendetAm (nicht vor dem Beginn, optional grund). Die Vertrags-Id steht im Pfad.
operationId: beendeFremdvertrag · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragBeendigungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Ereignis-Id und Beendigungstag. | FremdvertragBeendigungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vertrag schon beendet (ApiErrorBody, code conflict) | |
POST/api/fremdvertrag/{id}/dauerzahlung
Verknüpft den Vertrag mit einer Dauerzahlung desselben Objekts. Weichen Beitrag und Dauerzahlung ab, nennt die Antwort den Befund; er sperrt nicht. Die Vertrags-Id steht im Pfad.
operationId: verknuepfeFremdvertragDauerzahlung · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragDauerzahlungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vertrags-Id, Dauerzahlungs-Id und optional der Abweichungs-Befund. | FremdvertragDauerzahlungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vertrag oder Dauerzahlung unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vertrag schon verknüpft oder Dauerzahlung schon vergeben (ApiErrorBody, code conflict) | |
POST/api/fremdvertrag/{id}/dauerzahlung/loesen
Löst die Verknüpfung des Vertrags mit seiner Dauerzahlung (Body {}). Die Dauerzahlung selbst bleibt unberührt. Die Vertrags-Id steht im Pfad.
operationId: loeseFremdvertragDauerzahlung · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragDauerzahlungLoesenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vertrags-Id und die bis eben verknüpfte Dauerzahlung. | FremdvertragDauerzahlungLoesenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Der Vertrag ist mit keiner Dauerzahlung verknüpft (ApiErrorBody, code conflict) | |
POST/api/fremdvertrag/{id}/frist-entscheid
Hält die Entscheidung zu einem Vertragsende fest: bezugEnde, entscheidung (verlaengern | kuendigen | neu_ausschreiben), optional grund. Es wird nie eine Kündigung angelegt. Danach verschwindet die Zeile aus dem Fristenwächter. Die Vertrags-Id steht im Pfad.
operationId: entscheideFremdvertragFrist · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragFristEntscheidRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Ereignis-Id, Entscheidung und Hinweis. | FremdvertragFristEntscheidResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Zu diesem Vertragsende ist schon entschieden oder der Vertrag ist beendet (ApiErrorBody, code conflict) | |
POST/api/fremdvertrag/{id}/konditionen
Legt eine neue Konditions-Version des Vertrags an (kein Teil-Patch: jeder Schlüssel ist Pflicht, leer ist null). gueltigAb muss nach dem gueltigAb der letzten Version liegen. Die Vertrags-Id steht im Pfad.
operationId: aendereFremdvertragKonditionen · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragKonditionenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vertrags-Id und die neue Konditions-Version. | FremdvertragKonditionenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vertrag beendet oder gueltigAb nicht nach der letzten Version (ApiErrorBody, code conflict) | |
POST/api/fremdvertrag/{id}/kuendigung
Hält die Kündigung des Vertrags fest (wirksamZum nicht vor heute, optional grund). Die Antwort nennt das früheste Vertragsende und den spätesten Zugang als Auskunft; sie sperrt nicht. Die Vertrags-Id steht im Pfad.
operationId: kuendigeFremdvertrag · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragKuendigungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Ereignis-Id, Wirksamkeit, frühestes Ende und spätester Zugang. | FremdvertragKuendigungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vertrag schon beendet (ApiErrorBody, code conflict) | |
GET/api/fremdvertrag/einstellung
Liest die Einstellung der Verträge mit Dritten des Mandanten: Vorlauf-Tage, Vorgaben für die Verlängerung, Meldefrist für Schadenfälle, Schadenhonorar (Basispunkte und Text) und Herkunft (vorgabe | mandant). Ohne gespeicherte Einstellung gilt die Vorgabe. Nur lesend.
operationId: getFremdvertragEinstellung · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | Die Einstellung des Mandanten oder die Vorgabe. | FremdvertragEinstellungResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
PUT/api/fremdvertrag/einstellung
Setzt die Einstellung der Verträge mit Dritten des Mandanten (alle sechs Werte, kein Teil-Patch): vorlaufTage, Vorgaben für die Verlängerung, schadenMeldefristTage, Schadenhonorar in Basispunkten und ob es aktiv ist. Nur ein Mensch mit dem Recht, Rollen und Rechte zu verwalten.
operationId: setzeFremdvertragEinstellung · Auth: bearerAuth
Request-Body (Pflicht): application/json → FremdvertragEinstellungSetzenRequest
| Status | Bedeutung | Body |
|---|
200 | Gesetzte Werte, Stand davor und geaendert-Kennzeichen. | FremdvertragEinstellungSetzenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
GET/api/fremdvertrag/fristen
Liest den Fristenwächter der Verträge mit Dritten: je Vertrag kategorie (kuendigungsfrist | frist-verpasst | ohne-laufzeit), spaetesterZugang, aufgabeAb, tageBisFrist, Ampel und offen. Filter stichtag (Vorgabe: Berliner Tag der Server-Uhr), propertyId, art, nurOffen (Vorgabe true) und mitUeberwachungsluecken (Verträge ohne Laufzeitende). Nur lesend, begrenzt auf die Objekte mit Zuständigkeit des Aufrufers.
operationId: getFremdvertragFristen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
stichtag | query | nein | string(date) | |
propertyId | query | nein | string(uuid) | |
art | query | nein | versicherung | wartung | dienstleistung | versorgung | |
nurOffen | query | nein | true | false | |
mitUeberwachungsluecken | query | nein | true | false | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, zeilen[] } — leer ohne Fristen. | FremdvertragFristenResponse |
400 | ungültige Query, z. B. unbekannter Parameter, kein Kalendertag oder unbekannte Art (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
gebaeude
GET/api/gebaeude
Listet Gebäude (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv; optional je Objekt).
operationId: listGebaeude · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | archiviert | alle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback. |
objektId | query | nein | string(uuid) | Nur Gebäude DIESES Objekts. Einschränkung innerhalb des Tenants, KEINE Autorisierungsgrenze (die macht RLS) — eine fremde ID schneidet auf die leere Menge. |
| Status | Bedeutung | Body |
|---|
200 | Gebäudeliste (GebaeudeListResponse) | GebaeudeListResponse |
400 | ungültiger status-Filter oder objektId keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/gebaeude
Legt ein Gebäude an einem aktiven Objekt an.
operationId: createGebaeude · Auth: bearerAuth
Request-Body (Pflicht): application/json → GebaeudeCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegtes Gebäude (Gebaeude) | |
400 | ungültige Eingabe ODER Elternobjekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Elternobjekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
GET/api/gebaeude/{id}
Liest EIN Gebäude (auch archiviert).
operationId: getGebaeude · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Gebaeude | Gebaeude |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
PATCH/api/gebaeude/{id}
Ändert die Gebäude-Adresse (nur nicht-archivierte Gebäude).
operationId: updateGebaeude · Auth: bearerAuth
Request-Body (Pflicht): application/json → GebaeudeUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geändertes Gebäude | |
400 | leerer/ungültiger Patch ODER Gebäude archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/gebaeude/{id}/archive
Archiviert ein Gebäude (archived_at statt DELETE, K5). Kaskadiert abwärts: alle Einheiten des Gebäudes werden mitarchiviert (#445).
operationId: archiveGebaeude · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | archiviert (GebaeudeArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). Alle Einheiten des Gebäudes werden in derselben Transaktion mitarchiviert (Kaskade #445, ein Kommando). | |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/gebaeude/{id}/reactivate
Nimmt die Archiv-Kaskade eines Gebäudes zurück (#445) — nur der eigene Teilbaum, nie aufwärts.
operationId: reactivateGebaeude · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | reaktiviert (GebaeudeReactivateResponse). | |
400 | keine UUID, Kaskade zu groß ODER das ELTERNOBJEKT ist archiviert (ApiErrorBody, code invalid_request) — erst das Objekt reaktivieren. | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | eine zurückgeholte Einheit trüge eine Nummer, die im Objekt inzwischen an eine aktive Einheit vergeben ist (ApiErrorBody, code conflict, #5534) — nichts wurde reaktiviert. | |
health
GET/api/health
Liveness der Web-App (App-Prozess + DB-Erreichbarkeit).
operationId: getHealth · Auth: keine (öffentlich)
honorar
GET/api/honorar/anpassungen
Geschichte der Honorar-Anpassungen EINES Objekts, neueste zuerst — ohne den Akteur, der sie vorgenommen hat.
operationId: listHonorarAnpassungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Das Objekt. |
| Status | Bedeutung | Body |
|---|
200 | { anpassungen: [ { id, propertyId, wirksamAb, grundlage, beschlussId, zustimmungAm, begruendung, scheibeAlt, scheibeNeu, createdAt } ] } | HonorarAnpassungenResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/honorar/anpassungen
Passt die Honorarvereinbarung eines Objekts an (passe_honorarvereinbarung_an): neue Zeitscheibe ab einem Monatsersten, die laufende endet am Vortag. WEG nur mit tragendem Beschluss, keine Rückwirkung auf gestellte Monate. Derselbe Idempotency-Key legt die Anpassung nur einmal an.
operationId: passeHonorarvereinbarungAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → PasseHonorarvereinbarungAnRequest
| Status | Bedeutung | Body |
|---|
201 | { anpassungId, neueScheibe, geschlosseneScheibe, vergleich, hinweise } — Cent-Felder und Sätze als Integer-STRINGS. | HonorarAnpassungResponse |
400 | ungültige Eingabe oder verletzte Regel des Fachkerns, z. B. weg-braucht-beschluss oder vereinbarung-ungueltig (ApiErrorBody, code invalid_request; die Meldung beginnt mit dem Regel-Code) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt oder Beschluss unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | zu diesem Datum gibt es schon eine Anpassung (anpassung-existiert) ODER die Anpassung wirkt auf einen gestellten Monat zurück (ApiErrorBody, code conflict) | |
POST/api/honorar/lauf
Stellt das Verwalterhonorar EINES Objekts für EINE Periode — Monat oder Quartal, passend zum Rhythmus (#5583) — (stelle_verwalterhonorar): Soll Aufwand „Verwaltervergütung" an Haben Kreditor Verwalter, Rechnungsnummer aus dem Nummernkreis des Verwalters (HON-nnnnnn). NUR mit dem Inhalts-Hash aus POST /api/honorar/lauf/vorschlag. Genau einmal je Periode — ein zweiter Start ist `unveraendert`, eine geänderte Vereinbarung eine Differenzbuchung. Bei vereinbarter Entnahme ein Zahlungsauftrag `awaiting-approval` in der bestehenden Zahlungsfreigabe (gib_zahlungsauftrag_frei, Vier-Augen) — nie direkt ausgeführt.
operationId: stelleVerwalterhonorar · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | gestellt — { laufId, propertyId, monat, ergebnis (gebucht · differenz_gebucht · unveraendert), buchung, paymentOrderId, paymentOrderContentHash } | |
400 | ungültige Eingabe — u. a. ein unbekanntes Feld (Betrag und Konten kommen nie aus der Eingabe) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht, keine Zuständigkeit für das Objekt oder kein menschlicher Akteur (ApiErrorBody, code forbidden) | |
404 | keine Honorarvereinbarung hinterlegt ODER Objekt mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Inhalt seit dem Vorschlag geändert, keine gültige Buchungskonfiguration, keine eindeutige bestätigte Bankverbindung des Verwalters für die Entnahme oder ein gleichzeitiger Lauf derselben Periode — es wird nichts gebucht (ApiErrorBody, code conflict) | |
POST/api/honorar/lauf/storno
Storniert den Honorarlauf EINES Objekts für EINE Periode — Monat oder Quartal (#5583) — (storniere_verwalterhonorar): je wirksamer Honorarbuchung ein Storno-Satz über den bestehenden Storno-Weg (storno_entry, Periode des Originals) und Abbruch noch nicht eingereichter Entnahmeaufträge. Danach ist die Periode neu stellbar.
operationId: storniereVerwalterhonorar · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | storniert — { laufId, stornoEntryIds, cancelledPaymentOrderIds } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht, keine Zuständigkeit für das Objekt oder kein menschlicher Akteur (ApiErrorBody, code forbidden) | |
409 | für den Monat ist kein Honorar gebucht (auch: Objekt mandantenfremd — kein Existenz-Orakel) oder die Entnahme ist bereits eingereicht — es wird nichts storniert (ApiErrorBody, code conflict) | |
POST/api/honorar/lauf/vorschlag
Vorschlag des Honorarlaufs EINES Objekts für EINE Periode (Monat oder Quartal, passend zum Rhythmus, #5583): die Rechnung aus der Honorarvorschau, das für die Periode schon Gebuchte, die Differenz, ob eine Entnahme entstünde, und der Inhalts-Hash — ohne zu schreiben.
operationId: honorarlaufVorschlag · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | der Vorschlag — { propertyId, monat, nettoCents, umsatzsteuerCents, bruttoCents, currency, positionen, sonderleistungen, sonderleistungenNettoCents, sonderleistungenUmsatzsteuerCents, monatsrechnungen, gebuchtCents, differenzCents (vorzeichenbehaftet), entnahme, buchungsteile, vorschlagHash }. Cent-Felder sind Integer-STRINGS. Beim Quartal (#5583) ist die Rechnung die Summe der drei `monatsrechnungen`, die der `vorschlagHash` mitdeckt. Jede erfasste, nicht stornierte Sonderleistung des Monats ist eine EIGENE Position mit eigener USt (#5189). `buchungsteile` zeigt die Sätze, die das Stellen bucht — Gutschrift und Rechnung getrennt, nie saldiert (ein gleich teurer Tausch hat Differenz 0, bucht aber beide). | |
400 | ungültige Eingabe oder unbrauchbar gespeicherte Vereinbarung (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | keine Honorarvereinbarung hinterlegt ODER Objekt mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | nicht stellbar: keine gültige Buchungskonfiguration (Objekt-Option `verwalterhonorar.buchung`), keine Zeitscheibe für den Monat, Eigenbestand oder Monat ausserhalb des Verwaltungszeitraums (ApiErrorBody, code conflict) | |
GET/api/honorar/rentabilitaet
Rentabilität EINES Objekts über einen Zeitraum ganzer Monate: Ertrag, Aufwand, Deckungsbeitrag, Marge, Kapazitätsanteil und Urteil samt den geltenden Kalkulationssätzen. Ohne erfasste Zeit lautet das Urteil nicht-beurteilbar, nie wirtschaftlich.
operationId: getRentabilitaet · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Das Objekt. |
von | query | ja | string | Erster Monat `JJJJ-MM` (inklusiv). |
bis | query | ja | string | Letzter Monat `JJJJ-MM` (inklusiv), höchstens 24 Monate ab von. |
| Status | Bedeutung | Body |
|---|
200 | Alle Cent-Felder und Basispunkte sind Integer-STRINGS; margeBasispunkte ist null ohne Ertrag. Keine Mitarbeiternamen. | RentabilitaetResponse |
400 | ungültige Query, Zeitraum ungültig oder länger als 24 Monate (zeitraum-zu-lang), oder unbrauchbare Kalkulations-Option mit Regel-Text (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/honorar/sonderleistungen
Erfasst EINE Sonderleistung (erfasse_sonderleistung) mit dem Preis-Schnappschuss aus dem Katalog des Objekts. Derselbe Idempotency-Key legt sie nur einmal an.
operationId: erfasseSonderleistung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | { sonderleistungId, bezeichnung, menge, nettoCents, umsatzsteuersatzProzent, umsatzsteuerCents, bruttoCents, currency } — Cent-Felder und Satz als Integer-STRINGS. | |
400 | ungültige Eingabe, unbekanntes Feld, Leistung nicht im Katalog, Menge passt nicht zur Preisart, Einheit nicht im Objekt oder unbrauchbarer Katalog (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | am Objekt ist kein Sonderleistungs-Katalog hinterlegt ODER das Objekt ist mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/honorar/sonderleistungen/serie
Serienerfassung (erfasse_sonderleistungsserie): EINE Leistung mit Preis je Einheit für jede Einheit, die am Leistungsdatum zum Objekt gehört — in einem Schritt (z. B. § 35a-Bescheinigung). Dieselbe Serie (Objekt, Leistung, Leistungsdatum) entsteht nur einmal; eine Wiederholung meldet bereitsErfasst: true.
operationId: erfasseSonderleistungsserie · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | { serieId, anzahl, sonderleistungIds, nettoCents, currency, bereitsErfasst } | |
400 | ungültige Eingabe, Leistung nicht im Katalog, Leistung nicht je Einheit, Objekt ohne Einheiten am Leistungsdatum (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | kein Sonderleistungs-Katalog am Objekt ODER Objekt mandantenfremd (ApiErrorBody, code not_found) | |
POST/api/honorar/sonderleistungen/storno
Storniert eine erfasste Sonderleistung (storniere_sonderleistung). Sie bleibt auffindbar, zählt aber in keiner Honorarrechnung mehr.
operationId: storniereSonderleistung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | { sonderleistungId, storniert: true } | |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | keine Sonderleistung mit dieser Id an diesem Objekt ODER mandantenfremd (ApiErrorBody, code not_found) | |
409 | die Sonderleistung ist bereits storniert (ApiErrorBody, code conflict) | |
POST/api/honorar/sonderleistungen/vorlage
Kopiert den Vorlage-Katalog des Mandanten (Mandanten-Option `verwalterhonorar.sonderleistungen`) als EIGENEN Sonderleistungs-Katalog an ein Objekt (uebernimm_sonderleistungsvorlage). Eine Kopie, kein Verweis; ein vorhandener Katalog wird nie überschrieben.
operationId: uebernimmSonderleistungsvorlage · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | { anzahl } — Zahl der übernommenen Katalogeinträge | |
400 | ungültige Eingabe oder unbrauchbare Vorlage (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found) | |
409 | kein Vorlage-Katalog hinterlegt ODER das Objekt hat schon einen Katalog (ApiErrorBody, code conflict) | |
GET/api/honorar/vorschau
Verwalterhonorar EINES Objekts für EINEN Monat als Vorschau: Positionsaufstellung je Einheit/Basis/Zuschlag, Netto, Umsatzsteuer und Brutto — ohne Buchung.
operationId: getHonorarVorschau · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Objekt, dessen Verwaltungsvertrag abgerechnet wird. Die Honorarvereinbarung hängt je Objekt, es gibt keinen mandantenweiten Default. |
monat | query | ja | string | Abrechnungsmonat `JJJJ-MM`. Das Honorar ist eine monatliche Größe; ein Teilmonat ist nicht vereinbart und wird benannt abgelehnt (409 conflict), statt eine Tageskonvention zu erfinden. |
| Status | Bedeutung | Body |
|---|
200 | Die Aufstellung. Alle Cent-Felder und der USt-Satz sind Integer-STRINGS, nie JSON-numbers. | HonorarVorschauResponse |
400 | ungültige Query oder unbrauchbar gespeicherte Vereinbarung (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | für dieses Objekt ist keine Honorarvereinbarung hinterlegt (oder das Objekt gehört einem anderen Mandanten — unter RLS ununterscheidbar, kein Existenz-Orakel). Hinterlegt wird sie als OBJEKT-Option unter dem Schlüssel `verwalterhonorar.vereinbarungen` über `POST /api/option`; ihr Wert ist die LISTE der Zeitscheiben. | |
409 | nicht berechenbar: keine Zeitscheibe für den Monat (Lücke oder Wechsel mitten im Monat), Eigenbestand ohne Honorar, Monat nicht vollständig im Verwaltungszeitraum oder vereinbarter Zuschlag ohne Ereignisquelle (ApiErrorBody, code conflict) | |
inkasso
GET/api/inkasso
Listet die Inkasso-Übergaben des Mandanten, neueste zuerst; Query `objekt` (UUID) und `status` (entwurf | uebergeben | zurueckgenommen | abgeschlossen). Nur lesend. Die Übergabe ist ein Datensatz: sie sendet nichts an Dritte und erzeugt kein Partnerformat.
operationId: listeInkassoUebergaben · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | nein | string(uuid) | nur Übergaben dieses Objekts |
status | query | nein | entwurf | uebergeben | zurueckgenommen | abgeschlossen | nur Übergaben mit diesem Status |
| Status | Bedeutung | Body |
|---|
200 | { uebergaben[] } — Cent-Felder sind Integer-STRINGS; Empfänger, Begründung, Grund und Notiz sind Freitext. | InkassoUebergabeListeResponse |
400 | ungültige Query, z. B. unbekannter Parameter, keine UUID oder unbekannter Status (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/inkasso
Legt eine Inkasso-Übergabe als ENTWURF an (lege_inkasso_uebergabe_an): je Posten offener Rest, Fälligkeit, Mahnstufe, Mahngebühren und Verzugszinsen bis zum Stichtag; die Forderungsaufstellung wird gebildet, gehasht und eingefroren. Voraussetzung ist Mahnstufe 3 oder anwalt; darunter nur mit `begruendungMahnstufe`. Die Übergabe ist ein Datensatz: sie sendet nichts an Dritte und erzeugt kein Partnerformat. Derselbe Posten kann nicht in zwei aktiven Übergaben stehen (409). Der Idempotency-Key kommt vom Aufrufer.
operationId: legeInkassoUebergabeAn · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | die angelegte Übergabe (Status entwurf) samt ausgeschriebener Forderungsaufstellung und Postenliste | InkassoUebergabeDetailResponse |
400 | ungültige Eingabe, `begruendung-mahnstufe-fehlt`, `posten-gehoert-nicht-zur-uebergabe` (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
404 | Objekt oder Schuldner unbekannt ODER mandantenfremd (ApiErrorBody, code not_found) | |
409 | `posten-bereits-uebergeben` oder `posten-nicht-mehr-offen` (ApiErrorBody, code conflict) | |
GET/api/inkasso/{id}
Liest EINE Inkasso-Übergabe samt eingefrorener Forderungsaufstellung (ausgeschrieben, Cent als Integer-Strings) und Postenliste. Unbekannt und mandantenfremd antworten gleich. Nur lesend.
operationId: getInkassoUebergabe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | uebergabeId |
| Status | Bedeutung | Body |
|---|
200 | die Übergabe | InkassoUebergabeDetailResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
POST/api/inkasso/{id}/abschluss
Schließt die übergebene Inkasso-Übergabe ab (schliesse_inkasso_uebergabe_ab): Body `{ art, notiz? }` mit art bezahlt | vergleich | uneinbringlich | sonstiges. Die Posten werden frei. Der Idempotency-Key kommt vom Aufrufer.
operationId: schliesseInkassoUebergabeAb · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | uebergabeId |
| Status | Bedeutung | Body |
|---|
200 | abgeschlossen | InkassoUebergabeAbschlussResponse |
400 | ungültige Eingabe, z. B. unbekannte Abschlussart (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
404 | Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | unzulässiger Statusübergang, z. B. noch im Entwurf oder schon abgeschlossen (ApiErrorBody, code conflict) | |
GET/api/inkasso/{id}/forderungsaufstellung
Lädt die eingefrorene Forderungsaufstellung als CSV-Datei in einer JSON-Antwort (`datei`: dateiname, sha256, groesseBytes, inhaltBase64; dazu `aufstellungHash`). Semikolon-getrennt, UTF-8 mit BOM, Dezimalkomma; zweimal geladen ⇒ byte-gleich. Der Dateiname trägt keine Personenangaben. Reiner Lesezugriff — nichts wird geschrieben; `Cache-Control: no-store`.
operationId: getInkassoForderungsaufstellung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | uebergabeId |
| Status | Bedeutung | Body |
|---|
200 | die Datei samt Prüfsumme | InkassoAufstellungDateiResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
POST/api/inkasso/{id}/uebergabe
Übergibt den Entwurf (uebergebe_inkasso): setzt den Mahnstatus jedes Postens auf „Beim Rechtsanwalt" (anwalt), in derselben Transaktion. Body `{ uebergebenAm }`. Sendet nichts an Dritte. Eine zweite Übergabe ⇒ 409. Der Idempotency-Key kommt vom Aufrufer.
operationId: uebergebeInkasso · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | uebergabeId |
| Status | Bedeutung | Body |
|---|
200 | übergeben | InkassoUebergabeUebergebenResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
404 | Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | nicht mehr im Entwurf, oder ein Posten ist nicht mehr offen bzw. gesperrt (ApiErrorBody, code conflict) | |
POST/api/inkasso/{id}/zuruecknahme
Nimmt die Übergabe mit Pflichtgrund zurück (nimm_inkasso_uebergabe_zurueck): die Posten werden frei; der Mahnstatus wird NICHT zurückgestuft. Body `{ grund }` (höchstens 500 Zeichen). Ohne Grund ⇒ 400. Der Idempotency-Key kommt vom Aufrufer.
operationId: nimmInkassoUebergabeZurueck · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | uebergabeId |
| Status | Bedeutung | Body |
|---|
200 | zurückgenommen | InkassoUebergabeZuruecknahmeResponse |
400 | ungültige Eingabe, z. B. fehlender Grund (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
404 | Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | unzulässiger Statusübergang, z. B. schon zurückgenommen oder abgeschlossen (ApiErrorBody, code conflict) | |
instandhaltung
GET/api/instandhaltung
Liest die Instandhaltungs-Vorgänge des Mandanten, begrenzt auf die Objekte mit Zuständigkeit des Aufrufers: Nummer, Titel, Typ, Dringlichkeit, Status, Objekt, Einheit, Auftragswert (Cent als Integer-STRING), Auftragsnummer und die Zahl offener Befunde. Filter propertyId, status, dringlichkeit, typ, nurOffen (ohne abgeschlossen und storniert), limit (Vorgabe 50, höchstens 200) und offset. Nur lesend.
operationId: getInstandhaltungListe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
propertyId | query | nein | string(uuid) | |
status | query | nein | string | |
dringlichkeit | query | nein | string | |
typ | query | nein | string | |
nurOffen | query | nein | true | false | |
limit | query | nein | integer | |
offset | query | nein | integer | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, limit, offset, zeilen[] } — leer ohne Vorgänge; Geld ist ein Integer-STRING in Cent. | InstandhaltungListeResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder unbekannter Statuswert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/instandhaltung
Erfasst eine Meldung: Pflicht propertyId, typSchluessel (aktiver Vorgangstyp), titel, beschreibung, dringlichkeit; optional unitId, melderPersonId, beginnAm, haeufigkeit, baulichVeraendernd. Der Vorgang entsteht im Status gemeldet mit Nummer. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).
operationId: meldeInstandhaltung · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungMeldenRequest
| Status | Bedeutung | Body |
|---|
200 | Der Vorgang mit Nummer, Status, nächsten Schritten und Befunden. | InstandhaltungMeldungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt, Einheit oder Melder unbekannt oder mandantenfremd (ApiErrorBody, code not_found) | |
GET/api/instandhaltung/{id}
Liest EINEN Instandhaltungs-Vorgang mit Verlauf, Angeboten, Aufträgen, Freigabestand des lebenden Auftrags, Rechnungen mit Zahlungsstand (nicht-gebucht | nicht-ermittelbar | offen | ausgeglichen), Befunden und nächsten Schritten. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr). Nur lesend.
operationId: getInstandhaltungVorgang · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | nein | string(date) | |
| Status | Bedeutung | Body |
|---|
200 | Der Vorgang mit allen Bestandteilen; Geld ist ein Integer-STRING in Cent. | InstandhaltungVorgangResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/instandhaltung/{id}/abschluss
Schließt den Vorgang ab; optional begruendung. Die Vorgangs-Id steht im Pfad.
operationId: schliesseInstandhaltungVorgang · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungAbschlussRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vorgangs-Id, vorheriger und neuer Status, Ereignis-Id und Begründung. | InstandhaltungAbschlussResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Zu dem Vorgang läuft noch ein Auftrag (ApiErrorBody, code conflict) | |
POST/api/instandhaltung/{id}/angebot
Erfasst das Angebot eines zugeordneten Dienstleisters: dienstleisterPersonId, betrag als Objekt {cents, currency}, optional gueltigBis, realisierungAb, dokumentId. Die Vorgangs-Id steht im Pfad.
operationId: erfasseInstandhaltungAngebot · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungAngebotRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Das Angebot; Geld als {cents, currency}. | InstandhaltungAngebotResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vorgang gesperrt oder Angebot nicht mehr änderbar (code conflict) | |
POST/api/instandhaltung/{id}/angebot/verwerfen
Verwirft ein Angebot des Vorgangs mit Grund. Die Vorgangs-Id steht im Pfad.
operationId: verwerfeInstandhaltungAngebot · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungAngebotVerwerfenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Das verworfene Angebot. | InstandhaltungAngebotResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Angebot nicht änderbar, in Auftrag oder Vorgang gesperrt (code conflict) | |
POST/api/instandhaltung/{id}/angebot/waehlen
Wählt ein vorliegendes Angebot des Vorgangs. Die Vorgangs-Id steht im Pfad.
operationId: waehleInstandhaltungAngebot · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungAngebotWaehlenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Das gewählte Angebot, Zahl der Angebote und ein möglicher Befund. | InstandhaltungAngebotWaehlenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Angebot nicht wählbar oder Vorgang gesperrt (code conflict) | |
POST/api/instandhaltung/{id}/auftrag
Erteilt den Auftrag des Vorgangs, nachdem die Kostenfreigabe vollständig ist: optional auftragId (ohne Angabe der lebende Auftrag des Vorgangs). Ein Auftrag ohne gültige Freigabe wird nie erteilt (409). Gestattungs- und Freistellungsbefunde sind Warnungen, die Erteilung läuft trotzdem. Die Vorgangs-Id steht im Pfad.
operationId: erteileInstandhaltungAuftrag · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungAuftragErteilenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Auftrags-Id, Auftragsnummer, Erteilungstag und Befunde. | InstandhaltungAuftragErteilenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Auftrag nicht freigegeben oder die Freigabe ist nicht mehr gültig (ApiErrorBody, code conflict) | |
POST/api/instandhaltung/{id}/auftrag/ausfuehrung
Meldet die Ausführung des erteilten Auftrags: ausgefuehrtAm (nicht nach heute, nicht vor der Erteilung), optional notiz und auftragId (ohne Angabe der lebende Auftrag). Die Vorgangs-Id steht im Pfad.
operationId: meldeInstandhaltungAusfuehrung · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungAuftragAusfuehrungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Auftrags-Id und Ausführungstag. | InstandhaltungAuftragAusfuehrungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Auftrag nicht erteilt (ApiErrorBody, code conflict) | |
POST/api/instandhaltung/{id}/auftrag/stornieren
Storniert den Auftrag des Vorgangs mit Grund (Pflicht); optional auftragId. Nach der Freigabe fällt der Vorgang zurück in angebote_offen, eine neue Freigabe ist nötig. Ein ausgeführter Auftrag oder ein Auftrag mit Rechnung lässt sich nicht mehr stornieren (409). Die Vorgangs-Id steht im Pfad.
operationId: storniereInstandhaltungAuftrag · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungAuftragStornierenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Auftrags-Id und neuer Vorgangsstatus. | InstandhaltungAuftragStornierenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Auftrag ausgeführt, Rechnung verknüpft oder schon storniert (ApiErrorBody, code conflict) | |
POST/api/instandhaltung/{id}/dienstleister
Weist dem Vorgang einen Dienstleister zu; es entsteht ein Angebot im Status angefragt. Die Vorgangs-Id steht im Pfad.
operationId: weiseInstandhaltungDienstleisterZu · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungDienstleisterRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vorgangsstatus und das angefragte Angebot. | InstandhaltungDienstleisterResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vorgang gesperrt oder Dienstleister schon zugeordnet (code conflict) | |
POST/api/instandhaltung/{id}/freigabe
Beantragt die Kostenfreigabe des Vorgangs (Auftrag im Status zur_freigabe): optional angebotId, kostenobergrenze als Objekt {cents, currency}, dienstleisterPersonId, costCategoryId. Zu einem Vorgang mit lebendem Auftrag ist ein zweiter Antrag ein Konflikt. Die Vorgangs-Id steht im Pfad.
operationId: beantrageInstandhaltungKostenfreigabe · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungFreigabeBeantragenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Auftrag-Id, Version, Betrag {cents, currency}, nötige Stufen und Befunde. | InstandhaltungFreigabeBeantragenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vorgang gesperrt oder es läuft schon ein Auftrag (code conflict) | |
POST/api/instandhaltung/{id}/freigabe/entscheid
Entscheidet eine Stufe (verwalter, zweit) der Kostenfreigabe des Vorgangs: approved oder rejected mit rejectReason. Eine zweite Stufe ist nur bei aktivem Vier-Augen-Schalter und erreichter Schwelle nötig. Der Antragsteller kann bei aktivem Vier-Augen nicht selbst freigeben (403). Die Vorgangs-Id steht im Pfad.
operationId: entscheideInstandhaltungKostenfreigabe · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungFreigabeEntscheidenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Entscheidung, Auftrags- und Vorgangsstatus, offene Stufen. | InstandhaltungFreigabeEntscheidenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Selbstfreigabe verboten oder Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Stufe schon entschieden oder Auftrag hat sich geändert (code conflict) | |
POST/api/instandhaltung/{id}/qualifizieren
Qualifiziert einen Vorgang: Typ, Dringlichkeit, baulich verändernd, Gestattungsbeschluss, Beginn und Häufigkeit, oder ausdrücklich beginnUnbekannt. Die Vorgangs-Id steht im Pfad, nie im Body. Aus gemeldet wird in_klaerung.
operationId: qualifiziereInstandhaltungVorgang · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungQualifizierenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Der Vorgang mit Status, nächsten Schritten und Befunden. | InstandhaltungQualifizierenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vorgang steht jenseits von in_klaerung (code conflict) | |
POST/api/instandhaltung/{id}/rechnung
Verknüpft einen Rechnungsbeleg mit dem ausgeführten Auftrag: documentId, rechnungsdatum, optional auftragId. Befunde (freistellung-fehlt, rechnung-ueber-auftrag, gestattungsbeschluss-fehlt) sperren nicht: die Verknüpfung gelingt und nennt sie. Die harte Sperre der Zahlung ohne Freistellungsbescheinigung liegt im Zahlungsauftrag. Die Vorgangs-Id steht im Pfad.
operationId: verknuepfeInstandhaltungRechnung · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungRechnungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Rechnungs-Id, Betrag, Auftragswert, Abweichung, Summe, Bauleistung und Befunde mit Code, Schwere und Text. | InstandhaltungRechnungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Beleg schon verknüpft oder Auftrag nicht ausgeführt (ApiErrorBody, code conflict) | |
POST/api/instandhaltung/{id}/stornieren
Storniert den Vorgang mit Grund (Pflicht). Läuft noch ein Auftrag, ist erst der Auftrag zu stornieren (409). Die Vorgangs-Id steht im Pfad.
operationId: storniereInstandhaltungVorgang · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungVorgangStornierenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vorgangs-Id, vorheriger und neuer Status, Ereignis-Id und Grund. | InstandhaltungAbschlussResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Zu dem Vorgang läuft noch ein Auftrag (ApiErrorBody, code conflict) | |
GET/api/instandhaltung/aufgaben
Liest die offene Instandhaltung-Arbeit als abgeleitete Aufgaben (sofort-unbearbeitet, angebot-ausstehend, freigabe-wartet, rechnung-fehlt) der Objekte mit Zuständigkeit des Aufrufers. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr) und propertyId. Nur lesend.
operationId: getInstandhaltungAufgaben · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
stichtag | query | nein | string(date) | |
propertyId | query | nein | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, zeilen[] } — leer ohne offene Arbeit. | InstandhaltungAufgabenResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/instandhaltung/einstellung
Liest die Instandhaltung-Einstellung des Mandanten: Zweitfreigabe-Schwelle, Vergleichsangebote-Schwelle (Cent als Integer-STRING), Mindestangebote und die Herkunft (vorgabe | mandant). Nur lesend.
operationId: getInstandhaltungEinstellung · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | Die Einstellung; ohne gespeicherte Zeile gilt die Vorgabe des Kerns (herkunft vorgabe). | InstandhaltungEinstellungResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
PUT/api/instandhaltung/einstellung
Setzt die Instandhaltung-Einstellung des Mandanten: zweitfreigabeAbCents (Cent als Integer-String, null = nie), vergleichsangeboteAbCents, mindestangebote. Nur ein Mensch mit Recht (sonst 403).
operationId: setzeInstandhaltungEinstellung · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungEinstellungSetzenRequest
| Status | Bedeutung | Body |
|---|
200 | Die gesetzte Einstellung samt vorherigem Stand; Geld als Integer-String in Cent. | InstandhaltungEinstellungSetzenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
GET/api/instandhaltung/katalog
Liest den aufgelösten Vorgangstypen-Katalog des Mandanten (Vorgabe plus Abweichungen); standardmäßig nur aktive Typen, mit auchInaktive=true alle. Nur lesend.
operationId: getInstandhaltungKatalog · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
auchInaktive | query | nein | true | false | |
| Status | Bedeutung | Body |
|---|
200 | { typen[] } — schluessel, bezeichnung, ohneAngebotErlaubt, aktiv, vorgabe. | InstandhaltungKatalogResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
PUT/api/instandhaltung/katalog
Legt einen Vorgangstyp im Katalog des Mandanten an oder ändert ihn: schluessel, bezeichnung, ohneAngebotErlaubt, aktiv. Nur ein Mensch mit Recht (sonst 403).
operationId: setzeInstandhaltungVorgangstyp · Auth: bearerAuth
Request-Body (Pflicht): application/json → InstandhaltungKatalogSetzenRequest
| Status | Bedeutung | Body |
|---|
200 | Der gesetzte Vorgangstyp. | InstandhaltungKatalogSetzenResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
kaution
GET/api/kaution
Liest die Kautionsliste des Mandanten zum Stichtag: vereinbart · erhalten · offen · getrennte Anlage (§ 551 BGB).
operationId: listKautionsliste · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
propertyId | query | nein | string(uuid) | Auf EIN Objekt eingrenzen (Filter, keine Autorisierung). |
stichtag | query | nein | string(date) | Stichtag der Eingänge UND des Vertragsfilters; weggelassen ⇒ heute (Render-Uhr der Anfrage, nie die Browser-Uhr). |
archiveScope | query | nein | alle | aktiv | archiviert | 3-Wege-Filter auf die Archiv-Kette des Vertrags-Reads; Default `aktiv`. |
abrechnungsstand | query | nein | abgerechnet | nicht-abgerechnet | abrechnungsreif | Filter auf den Abrechnungsstand (#6897): `abgerechnet` (nicht stornierte Abrechnung vorhanden), `nicht-abgerechnet` (keine; auch Bürgschaft/Verpfändung), `abrechnungsreif` (Vertrag beendet UND nicht abgerechnet; nie eine Sicherheit ohne Geldfluss). Zeilen und Summen entstehen aus der gefilterten Menge; ohne Angabe alle Zeilen. |
| Status | Bedeutung | Body |
|---|
200 | Zeilen + Summen aus DERSELBEN Zeilenmenge. Je Zeile trägt `abrechnung` den Abrechnungsstand (`null` ⇒ nicht abgerechnet). Cent-Felder sind vorzeichenbehaftete Integer-STRINGS. `offenCents` ist POSITIV bei Rückstand; ein dokumentarisch übernommener Bestand steht auf `eingang-unbekannt` und trägt `mahnbarerRestCents: "0"` — er wird durch die Umstellung nicht gemahnt. `summen` summiert nur EUR-Zeilen; andere Währungen stehen je Währung getrennt in `summenFremdwaehrung`. ACHTUNG: `mietpartei` ist personenbezogen. | KautionslisteResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/kaution/abrechnung
Liest den gespeicherten Abrechnungsstand EINES Vertrags (nicht stornierte Kautionsabrechnung) mit Rückbehalt-Status keiner | gehalten | teilfreigegeben | freigegeben, dem noch gehaltenen Rest und den Teilfreigaben.
operationId: getKautionsabrechnungStand · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
contractId | query | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Der gespeicherte Stand; Cent-Felder sind Integer-STRINGS. `rueckbehaltBegruendung` ist Freitext eines Menschen (personenbezogen). | KautionsabrechnungStandResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel); keine geltende Abrechnung ⇒ ApiErrorBody, code KAUTION_KEINE_ABRECHNUNG. | |
POST/api/kaution/abrechnung
Rechnet die Kaution eines beendeten Vertrags ab (rechne_kaution_ab): Kaution + Zinsen − ausgewählte fällige Forderungen dieses Vertrags (Verrechnung über die bestehende OP-Verrechnung) − Rückbehalt mit Grundart (BK-Nachzahlung gedeckelt, Sonstiges mit Begründung). Bucht NUR mit hashgebundener Freigabe des Inhalts (vorschlagHash aus POST /api/kaution/abrechnung/vorschlag, freigegeben über POST /api/kaution/abrechnung/freigabe). Die Auszahlung geht als Zahlungsauftrag in die bestehende Freigabe (gib_zahlungsauftrag_frei, Vier-Augen) — nie direkt. Genau einmal je Vertrag.
operationId: rechneKautionAb · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | Die Abrechnung: Bestand, Zinsen, Guthaben, Verrechnung je Posten, Rückbehalt und Deckel, Auszahlung, Restforderung, Art; dazu `paymentOrderId`/`paymentOrderContentHash` des Auftrags `awaiting-approval` (null bei Auszahlung 0). Cent-Felder sind Integer-STRINGS. | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vertrag nicht beendet oder bereits abgerechnet, Posten nicht verrechenbar, Rückbehalt: Sonstiges ohne Begründung, zweite BK-Zeile, BK nicht wählbar (letztes Guthaben bzw. keine bekannte Nachzahlung), BK über dem Deckel oder Summe über dem Guthaben, keine Kautionsanlage oder keine bestätigte Bankverbindung des Mieters, Empfänger offen (mehrere wählbar, keine Wahl) oder gewählte Bankverbindung nicht (mehr) bestätigt bzw. nicht die eines Mieters des Vertrags, keine Freigabe des Inhalts oder Inhalt seit der Freigabe geändert — es wird nichts gebucht (ApiErrorBody, code conflict) | |
POST/api/kaution/abrechnung/freigabe
Gibt einen Vorschlag der Kautionsabrechnung, Rückbehalt-Freigabe bzw. des Stornos frei (gib_kautionsabrechnung_frei): bindet die Freigabe an genau den vorgelegten Inhalts-Hash, bucht selbst nichts. Erst danach buchen POST /api/kaution/abrechnung, POST /api/kaution/rueckbehalt-freigabe bzw. POST /api/kaution/abrechnung/storno.
operationId: gibKautionsabrechnungFrei · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | freigegeben — { approvalId, art, contractId, vorschlagHash } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreib-/Freigaberecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag bzw. (art storno) Abrechnung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | der Inhalt weicht vom vorgelegten Hash ab (neu vorschlagen), über diesen Vorschlag ist bereits entschieden oder der Schritt ist nicht möglich (ApiErrorBody, code conflict) | |
POST/api/kaution/abrechnung/storno
Storniert eine ausgeführte Kautionsabrechnung (storniere_kautionsabrechnung): NUR mit hashgebundener Freigabe (vorschlagHash aus POST /api/kaution/abrechnung/vorschlag, art storno, freigegeben über POST /api/kaution/abrechnung/freigabe). Danach ist POST /api/kaution/abrechnung für denselben Vertrag wieder möglich.
operationId: storniereKautionsabrechnung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | storniert — { kautionsabrechnungId, contractId, storniertAm, stornierteZahlungsauftraege, stornierteVerrechnungen } | |
400 | ungültige Eingabe, auch unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Abrechnung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | keine Freigabe des Inhalts, fremder Hash, bereits storniert oder Auszahlungsauftrag schon eingereicht (mit Auftrag und Status) — es wird nichts geschrieben (ApiErrorBody, code conflict) | |
POST/api/kaution/abrechnung/vorschlag
Berechnet den VORSCHLAG einer Kautionsabrechnung (art abrechnung), einer Rückbehalt-Freigabe (art rueckbehalt) bzw. eines Stornos (art storno) samt Inhalts-Hash — mit derselben Rechnung wie die Ausführung, ohne zu schreiben.
operationId: kautionsabrechnungsvorschlag · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | der Vorschlag — { art, contractId, vorschlagHash, status (offen · freigegeben · abgelehnt), inhalt }. Cent-Felder im Inhalt sind Integer-STRINGS. | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag bzw. (art storno) Abrechnung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | die Abrechnung bzw. Rückbehalt-Freigabe ist so nicht möglich (dieselben Gründe wie bei der Ausführung) (ApiErrorBody, code conflict) | |
POST/api/kaution/eingang
Verbucht einen Bankumsatz des am Vertrag hinterlegten Kautionskontos als Eingang der Kaution (verbuche_kautionseingang): Bank an Kautions-Personenkonto des Mieters, mit Buchungsanspruch und Tilgung der offenen Raten — ohne Zuordnung zum Mietkonto. Nur bei Barkaution.
operationId: verbucheKautionseingang · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | verbucht (Wiederholung ⇒ `replay: true`, nichts doppelt). Cent-Felder sind Integer-STRINGS. | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag oder Bankumsatz unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | keine gültige Freigabe des Vorschlags (fehlt, abgelehnt oder Inhalt seither geändert), kein Kautionskonto oder nicht das am Vertrag hinterlegte, keine Abrede, Bürgschaft/Verpfändung (kein Zahlungsstrom), kein Eingang oder Umsatz bereits anders verbucht (ApiErrorBody, code conflict) | |
GET/api/kaution/einstellung
Liest die Kaution-Einstellung des Mandanten: die Frist des Rückbehalts in Monaten (Vorgabe 6; beginnt mit dem Abrechnungsdatum der Kautionsabrechnung) und `istVorgabe` (true, solange der Mandant nichts eingestellt hat).
operationId: getKautionEinstellung · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | { rueckbehaltFristMonate, istVorgabe } | KautionEinstellungResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
PUT/api/kaution/einstellung
Setzt die Frist des Rückbehalts des Mandanten (setze_kaution_rueckbehalt_frist): ganze Zahl 1…36 Monate. Nur ein Mensch mit Admin-Recht (rollenrechte.verwalten). Gilt nur für neue Abrechnungen — das Wiedervorlage-Datum wird beim Buchen an der Abrechnung festgeschrieben, bestehende bleiben unverändert. Idempotent: derselbe Wert nochmal ändert nichts.
operationId: setzeKautionRueckbehaltFrist · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | { rueckbehaltFristMonate, istVorgabe: false } — die jetzt geltende Frist | KautionEinstellungResponse |
400 | monate keine ganze Zahl 1…36 oder unbekanntes Feld (ApiErrorBody, code invalid_request) — nichts geschrieben | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch oder ohne Admin-Recht (ApiErrorBody, code forbidden) | |
POST/api/kaution/freigabe
Gibt einen Kautions-Vorschlag frei (gib_kaution_frei): bindet die Freigabe an genau den vorgelegten Inhalts-Hash. Erst danach buchen POST /api/kaution/sollstellung bzw. POST /api/kaution/eingang.
operationId: gibKautionFrei · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | freigegeben — { approvalId, art, contractId, vorschlagHash } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreib-/Freigaberecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag oder Bankumsatz unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | der Inhalt weicht vom vorgelegten Hash ab (neu vorschlagen), über diesen Vorschlag ist bereits entschieden oder der Geldpfad ist nicht möglich (ApiErrorBody, code conflict) | |
POST/api/kaution/rueckbehalt-freigabe
Gibt den Rückbehalt einer Kautionsabrechnung als eigenen Schritt frei (gib_kautionsrueckbehalt_frei): optional gegen dann fällige Forderungen dieses Vertrags verrechnet, der Rest als Zahlungsauftrag in die bestehende Freigabe. Mit betragCents nur einen TEILBETRAG (#6900): Status teilfreigegeben mit Rest, der letzte Schritt (Rest 0) freigegeben; ohne betragCents der ganze Rest. Jeder Schritt bucht NUR mit hashgebundener Freigabe seines Inhalts (art rueckbehalt).
operationId: gibKautionsrueckbehaltFrei · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | Rückbehalt, verrechneter Teil, Auszahlung, Restforderung (Integer-STRINGS) und der Auftrag `awaiting-approval` (null bei Auszahlung 0). | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | kein gehaltener Rückbehalt, bereits freigegeben, Teilbetrag 0/negativ/über dem Rest, Posten nicht verrechenbar, Auszahlungsseite unvollständig, keine Freigabe des Inhalts oder Inhalt seit der Freigabe geändert — es wird nichts gebucht (ApiErrorBody, code conflict) | |
GET/api/kaution/rueckbehalt-fristen
Liest Fristende und Überfälligkeit je gehaltenem Rückbehalt: für jede nicht stornierte Kautionsabrechnung im Rückbehalt-Status gehalten oder teilfreigegeben Vertrag, Abrechnungsdatum, Rückbehalt, Rest, fristEnde (beim Buchen gespeicherter Termin (Wiedervorlage am): Abrechnungsdatum + Frist des Mandanten zum Buchungszeitpunkt; eine spätere Änderung der Frist wirkt nur auf neue Abrechnungen), ueberfaellig und die Tage der Überschreitung. Nur lesend — keine automatische Aktion, keine Mail.
operationId: getKautionRueckbehaltFristen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
stichtag | query | nein | string(date) | |
nurUeberfaellig | query | nein | true | false | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, fristMonate, zeilen[] } — nur Rückbehalte der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS. | KautionRueckbehaltFristenResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/kaution/sollstellung
Stellt die bis zum Stichtag fälligen Kautionsraten eines Vertrags soll (stelle_kaution_soll): SOLL Kautions-Personenkonto des Mieters / HABEN Kaution, je Rate ein Satz — getrennt vom Mietkonto, idempotent je Rate. Nur bei Barkaution.
operationId: stelleKautionSoll · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | Der vollständige Ratenplan mit Status je Rate (`sollgestellt` · `bereits-sollgestellt` · `nicht-faellig`); Cent-Felder sind Integer-STRINGS. Wiederholen bucht nichts doppelt (`neuSollgestellt: 0`). | |
400 | ungültige Eingabe oder Stichtag in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | keine gültige Freigabe des Vorschlags (fehlt, abgelehnt oder Inhalt seither geändert), keine Kautionsabrede (übernommener Bestand — „vereinbart, Eingang unbekannt", wird nicht sollgestellt), Bürgschaft/Verpfändung (kein Zahlungsstrom), kein Mieter für das Kautions-Personenkonto, kein Mietbeginn oder Kontonummer am Objekt belegt (ApiErrorBody, code conflict) | |
POST/api/kaution/vorschlag
Berechnet den VORSCHLAG eines Kautions-Geldpfads (Ratensollstellung oder Kautionseingang) samt Inhalts-Hash — mit derselben Rechnung wie die Ausführung, ohne zu schreiben.
operationId: kautionsvorschlag · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | der Vorschlag — { art, vorschlagHash, status (offen · freigegeben · abgelehnt), inhalt }. Cent-Felder im Inhalt sind Integer-STRINGS. | |
400 | ungültige Eingabe oder Stichtag in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vertrag oder Bankumsatz unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | der Geldpfad ist für diesen Vertrag/Umsatz nicht möglich (keine Abrede, kein Zahlungsstrom, falsche Anlage …) (ApiErrorBody, code conflict) | |
GET/api/kaution/zinsen
Liest die gebuchten Zinsgutschriften EINER Kaution (aufsteigend nach Zeitraum; stornierte erscheinen nicht).
operationId: listKautionszinsen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
contractId | query | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { contractId, gutschriften[] } — Cent-Felder sind Integer-STRINGS. | KautionszinsenResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/kaution/zinsen/buchung
Bucht das freigegebene Zinsjahr (buche_kautionszinsen): je Kaution mit Zins ein Satz zum 31.12. SOLL 1481 Zinsforderung Kautionskonto / HABEN Kautions-Personenkonto des Mieters (§ 551 Abs. 3 BGB), ohne Bankumsatz-Anspruch — idempotent je Konto, Jahr und Kaution.
operationId: bucheKautionszinsen · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | gebucht — Zins je Kaution mit Status (`gebucht` · `bereits-gebucht` · `kein-anteil`). Wiederholen bucht nichts doppelt (`neuGebucht: 0`). Cent-Felder sind Integer-STRINGS. | |
400 | ungültige Eingabe oder 31.12. des Jahres liegt in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | keine gültige Freigabe (fehlt, abgelehnt oder Inhalt seither geändert), das Jahr ist nicht das nächste offene des Kontos oder mit anderem Inhalt gebucht, oder an einem Tag mit Kapital gilt kein Zinssatz (ApiErrorBody, code conflict) | |
PUT/api/kaution/zinsen/festzins
Pflegt den Zinssatz EINES Kautionskontos „gültig ab heute" (setze_kautionskonto_festzins mit gueltigAb = heute, Verwaltungstag): legt einen Eintrag der Satzhistorie an oder überschreibt den von heute; basispunkte null löscht den Eintrag von heute. Für andere Tage: POST /api/kaution/zinsen/saetze. Reine Stammdatenänderung ohne Buchung und ohne Freigabe. Nur ein Mensch; ein Konto einer anderen Art oder ein heute in einem gebuchten Zinszeitraum ⇒ 409.
operationId: setzeKautionskontoFestzins · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | { bankAccountId, basispunkte } — der jetzt gespeicherte Satz von heute (null = Eintrag gelöscht) | |
400 | Schemafehler, z. B. Satz außerhalb 0…2000 (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch (ein Agent pflegt den Satz nicht) | |
404 | Konto unbekannt, archiviert, eines fremden Mandanten oder außerhalb der Zuständigkeit; Löschen, wenn es für heute keinen Eintrag gibt | |
409 | das Konto ist kein Kautionskonto, oder heute liegt in einem gebuchten Zinszeitraum des Kontos | |
POST/api/kaution/zinsen/freigabe
Gibt ein Zinsjahr frei (gib_kautionszinsen_frei): bindet die Freigabe an genau den vorgelegten Inhalts-Hash. Erst danach bucht POST /api/kaution/zinsen/buchung.
operationId: gibKautionszinsenFrei · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | freigegeben — { approvalId, bankAccountId, jahr, vorschlagHash } | |
400 | ungültige Eingabe oder 31.12. des Jahres liegt in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreib-/Freigaberecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | der Inhalt weicht vom vorgelegten Hash ab (neu vorschlagen), über dieses Zinsjahr ist bereits entschieden oder der Zinslauf ist nicht möglich (ApiErrorBody, code conflict) | |
GET/api/kaution/zinsen/saetze
Liest die Satzhistorie „gültig ab" EINES Kautionskontos, aufsteigend nach gueltigAb. Der Satz an einem Tag ist der Eintrag mit dem größten gueltigAb <= Tag; vor dem ersten Eintrag gilt kein Satz. Ein fremdes, unbekanntes oder nicht zuständiges Konto liefert eine leere Liste (kein Existenz-Orakel).
operationId: listKautionZinssaetze · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
bankAccountId | query | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { bankAccountId, saetze[] } — Satzhistorie aufsteigend nach gueltigAb | KautionZinssaetzeResponse |
400 | bankAccountId fehlt oder keine UUID, unbekannter Query-Parameter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/kaution/zinsen/saetze
Schreibt EINEN Eintrag der Satzhistorie eines Kautionskontos (setze_kautionskonto_festzins): Upsert auf (Konto, gueltigAb) — gleicher gueltigAb überschreibt den Satz, ein wiederholter gleicher Aufruf ändert nichts; basispunkte null löscht den Eintrag dieses Tages. Ein gueltigAb in einem gebuchten Zinszeitraum des Kontos wird abgewiesen (Anlegen, Überschreiben und Löschen). Reine Stammdatenänderung ohne Buchung und ohne Freigabe. Nur ein Mensch.
operationId: setzeKautionZinssatz · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | { bankAccountId, gueltigAb, basispunkte } — der jetzt gespeicherte Satz dieses Tages (null = Eintrag gelöscht) | |
400 | Schemafehler, z. B. Satz außerhalb 0…2000 oder gueltigAb kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch (ein Agent pflegt den Satz nicht) | |
404 | Konto unbekannt, archiviert, eines fremden Mandanten oder außerhalb der Zuständigkeit; Löschen eines Eintrags, den es für den Tag nicht gibt | |
409 | das Konto ist kein Kautionskonto, oder gueltigAb liegt in einem gebuchten Zinszeitraum des Kontos | |
GET/api/kaution/zinsen/stand
Liest den Zinsstand je Kautions-Anlagekonto: bis wann das Konto verzinst ist (letzter gebuchter Zinszeitraum, null ohne Zinslauf), die Zahl der Barkautionen und die noch unbeanspruchten Haben-Umsätze. Nur lesend; ob ein Umsatz ein Zins ist, entscheidet die Antwort nicht.
operationId: getKautionZinsstand · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | { konten[] } — nur Anlagekonten der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS. | KautionZinsstandResponse |
400 | unbekannter Query-Parameter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/kaution/zinsen/storno
Storno des ZULETZT gebuchten Zinsjahres eines Kautionskontos in drei Stufen (stufe vorschlag | freigabe | ausfuehren; Tools gib_kautionszinsjahr_storno_frei und storniere_kautionszinsjahr, Artefakt-Art kautionszinsjahr-storno): je Kaution die Gegenbuchung des Jahreszinssatzes über den Weg von storno_entry. Danach ist das Jahr wieder das nächste offene Zinsjahr und bucht unter der nächsten Generation (g<n+1>) neu; ein zweiter Storno bucht nichts. Nur solange dem Jahr keine Bankgutschrift zugeordnet und keine Kaution abgerechnet ist.
operationId: storniereKautionszinsjahr · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | vorschlag: { vorschlagHash, status, bankAccountId, jahr, generation, bereitsStorniert, summeCents, currency, anteile[{ contractId, zinsCents }] }; freigabe: { approvalId, bankAccountId, jahr, vorschlagHash }; ausfuehren: { bankAccountId, jahr, generation, storniertAm, neuStorniert, nullzinsjahr, stornierteSaetze }. Cent-Felder sind Integer-STRINGS. | |
400 | ungültige Eingabe, auch fehlender oder zu langer Grund und unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | nicht das zuletzt gebuchte Jahr, dem Jahr ist eine Bankgutschrift zugeordnet, eine Kaution des Jahres ist abgerechnet, keine gültige Freigabe (fehlt, abgelehnt oder Inhalt seither geändert) — es wird nichts geschrieben (ApiErrorBody, code conflict) | |
POST/api/kaution/zinsen/vorschlag
Berechnet den VORSCHLAG des Jahreszinslaufs eines Kautionskontos (nächstes offenes Kalenderjahr): je Kaution mit Guthaben im Jahr Stand zum 01.01., Zinstage, Satz bzw. Sätze und Zins (taggenau, Zinseszins über den Stand zum 01.01.), dazu die Summe — samt Inhalts-Hash, ohne zu schreiben. Eine Kaution, deren Abrechnungstag im Jahr liegt, ist nicht enthalten.
operationId: kautionszinsvorschlag · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | der Vorschlag — Hash, Freigabe-Status (offen · freigegeben · abgelehnt), Zins je Kaution, Summe und der vollständige Inhalt. Cent-Felder sind Integer-STRINGS. | |
400 | ungültige Eingabe oder 31.12. des Jahres liegt in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | das Jahr ist nicht das nächste offene des Kontos, an einem Tag mit Kapital gilt kein Zinssatz, das Jahr ist mit anderem Inhalt gebucht oder eine Kaution hat im Jahr einen Abgang ohne Abrechnung; art gutschrift: der Umsatz ist kein Haben-Umsatz auf einem Kautionskonto, ist schon gebucht (Bankumsatz-Anspruch) oder das Jahr hat keinen offenen Saldo auf 1481 (ApiErrorBody, code conflict) | |
kontenrahmen
GET/api/kontenrahmen
Listet die verfügbaren Musterkontenrahmen (Code-Katalog, kein Mandanten-Stammdatum).
operationId: listKontenrahmen · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | Vorlagenliste (KontenrahmenListResponse) | KontenrahmenListResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/kontenrahmen/{id}/apply
Spielt einen Musterkontenrahmen auf den Kontenplan EINES Objekts ein (Bulk-Anlage).
operationId: applyKontenrahmen · Auth: bearerAuth
Request-Body (Pflicht): application/json → KontenrahmenApplyRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string | Kennung des Musterkontenrahmens |
| Status | Bedeutung | Body |
|---|
200 | eingespielt (KontenrahmenApplyResponse). WIEDERHOLUNG IST HARMLOS: der Idempotency Key ist deterministisch (apply_chart_of_accounts:<propertyId>:<rahmenId>:<version>), ein zweiter Aufruf ist ein Replay des Erst-Ergebnisses — kein zweiter Kontensatz, kein zweites Kommando. | |
400 | ungültige Eingabe ODER Objekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannter Rahmen ODER unbekanntes/fremdes Objekt (ApiErrorBody, code not_found) | |
konto
GET/api/konto
Listet Konten (3-Wege-Filter, optional auf EIN Objekt eingegrenzt).
operationId: listKonten · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | archiviert | alle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback. |
propertyId | query | nein | string(uuid) | grenzt auf EIN Objekt ein (Filter, keine Autorisierung — sichtbar ist ohnehin nur der eigene Tenant, RLS). |
| Status | Bedeutung | Body |
|---|
200 | Kontenliste (KontoListResponse) | KontoListResponse |
400 | ungültiger status-Filter oder ungültige propertyId (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/konto
Legt EIN Konto im Kontenplan eines Objekts an.
operationId: createKonto · Auth: bearerAuth
Request-Body (Pflicht): application/json → KontoCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegtes Konto (Konto) | |
400 | ungültige Eingabe, unbekannte Kostenkategorie, am Objekt schon vergebene Kontonummer ODER Objekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekanntes Objekt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/konto/{id}
Liest EIN Konto (auch archiviert) samt Kostenkategorie.
operationId: getKonto · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Konto | Konto |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
PATCH/api/konto/{id}
Ändert Konto-Stammfelder (nach Erstbuchung nur noch den Namen).
operationId: updateKonto · Auth: bearerAuth
Request-Body (Pflicht): application/json → KontoUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geändertes Konto | |
400 | leerer/ungültiger Patch, Konto archiviert, unbekannte Kostenkategorie, schon vergebene Kontonummer ODER buchungsrelevantes Feld nach Erstbuchung (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/konto/{id}/archive
Archiviert ein Konto (archived_at statt DELETE, K5).
operationId: archiveKonto · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | archiviert (KontoArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). | |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/konto/{id}/umlageschluessel
Ordnet dem Konto einen Umlageschlüssel zu oder hebt die Zuordnung auf (allocationKeyId null).
operationId: assignKontoUmlageschluessel · Auth: bearerAuth
Request-Body (Pflicht): application/json → KontoUmlageschluesselRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geändertes Konto (Konto) | Konto |
400 | keine UUID, Konto archiviert ODER Schlüssel aus fremdem Objekt/archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Konto/Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
mahnlauf
GET/api/mahnlauf
Liest die Übersicht des Registers „Mahnlauf": die offenen Vorgänge (fällig oder in Arbeit) der Objekte mit Zuständigkeit, den Vorgang, den das Register öffnet (Query `lauf` ist der Deep-Link), die früheren (ausgeführten) Vorgänge und — ohne offenen Vorgang — die Zahl der zu mahnenden Debitoren. Ein Vorgang gehört dem, der ihn bearbeitet; ein fremd bearbeiteter Vorgang ist nur anzusehen. Nur lesend — nichts davon mahnt.
operationId: getMahnlaufUebersicht · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
lauf | query | nein | string(uuid) | Deep-Link: Vorgang, der bevorzugt geöffnet wird |
| Status | Bedeutung | Body |
|---|
200 | { offene[], gewaehlt, fruehere[], zuMahnendeDebitoren } — Cent-Felder sind Integer-STRINGS; Namen nur, soweit die Lesung sie führt. | MahnlaufUebersichtResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/mahnlauf
Startet einen Mahnlauf-Vorgang (starte_mahnlauf_vorgang) oder öffnet den eigenen, schon vorbereiteten: der Vorbereitungs-Schlüssel entsteht serverseitig aus Mandant, Nutzer, Stichtag und der Zahl ausgeführter Vorgänge, nie aus dem Body. Ein zweiter Aufruf desselben Nutzers zum selben Stichtag liefert denselben Vorgang (`neu: false`, 200) und legt keinen zweiten an. Ein Vorgang gehört dem, der ihn bearbeitet. Mahnt nicht — Ausführen, Freigabe und Versand sind ein eigener Schritt. Der Idempotency-Key kommt vom Aufrufer.
operationId: starteMahnlaufVorgang · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | der eigene vorbereitete Vorgang wurde geöffnet (`neu: false`) | MahnlaufStartResponse |
201 | ein neuer Vorgang wurde angelegt (`neu: true`) | MahnlaufStartResponse |
400 | ungültige Eingabe, z. B. kein Kalendertag oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
409 | der Schlüssel trägt einen ausgeführten oder von jemand anderem bearbeiteten Vorgang (ApiErrorBody, code conflict) | |
GET/api/mahnlauf/{laufId}
Liest EINEN Vorgang: Kopf (Stichtag, Status, Schritt, Summen, wer ihn bearbeitet), Umfang (Objekte und Einheiten der Zuständigkeit), die Positionen der Ableitung mit Beträgen und — bei einem ausgeführten Vorgang — das Ergebnis. Unbekannter, mandantenfremder oder nicht sichtbarer Vorgang: dieselbe 404. Nur lesend.
operationId: getMahnlaufVorgang · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
| Status | Bedeutung | Body |
|---|
200 | der Vorgang — Cent-Felder sind Integer-STRINGS | MahnlaufVorgangResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt ODER mandantenfremd ODER nicht sichtbar — dieselbe Meldung (ApiErrorBody, code not_found) | |
PATCH/api/mahnlauf/{laufId}
Bereitet einen Vorgang vor — mit GENAU EINEM der Schlüssel `stichtag` (setze_mahnlauf_stichtag), `umfang` (setze_mahnlauf_umfang: objektIds und abgewaehlteEinheitIds) oder `schritt` (setze_mahnlauf_schritt, 0 bis 3). Zwei Schlüssel oder keiner ⇒ 400. Ein Vorgang gehört dem, der ihn bearbeitet (fremd in Arbeit ⇒ 409); ein ausgeführter Vorgang ist nicht mehr änderbar (409). Mahnt nicht. Der Idempotency-Key kommt vom Aufrufer.
operationId: bereiteMahnlaufVorgangVor · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
| Status | Bedeutung | Body |
|---|
200 | gesetzt — der Vorgang nach dem Aufruf (`geaendert: false`, wenn der Wert schon so stand) | MahnlaufVorbereitetResponse |
400 | ungültige Eingabe, z. B. zwei Schlüssel oder keiner, Schritt außerhalb 0…3 (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
404 | Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | Vorgang fremd in Arbeit, bereits ausgeführt, gleichzeitig geändert oder ein Objekt läuft in einem anderen Vorgang (ApiErrorBody, code conflict) | |
POST/api/mahnlauf/{laufId}/ausfuehren
Führt einen vorbereiteten Mahnlauf-Vorgang aus (fuehre_mahnlauf_vorgang_aus, Außenwirkung): erzeugt je Schreiben einen Eintrag und gibt die unauffälligen Schreiben frei. Verlangt eine frische Anmeldung, das Ausführungsrecht und einen Menschen; Mandant und Akteur kommen aus der Sitzung, der Step-up-Nachweis nie aus dem Body. Ein zweiter Aufruf liefert das Erst-Ergebnis (`erstAusfuehrung: false`). Der Versand ist ein eigener Schritt.
operationId: fuehreMahnlaufVorgangAus · Auth: bearerAuth
Request-Body (optional): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
| Status | Bedeutung | Body |
|---|
200 | ausgeführt (oder das Erst-Ergebnis eines schon ausgeführten Vorgangs) | MahnlaufAusfuehrenResponse |
400 | ungültige Eingabe, z. B. ein Body mit `stepUp` oder einem anderen Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet. | |
404 | Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | Vorgang fremd in Arbeit oder gleichzeitig geändert, nichts zu mahnen (ApiErrorBody, code conflict) | |
POST/api/mahnlauf/{laufId}/ausschluss
Nimmt eine Position mit Pflichtgrund aus dem Mahnlauf (schliesse_mahnposition_aus): `positionsSchluessel` aus der Lesung, `grund` höchstens 200 Zeichen. Erneutes Ausschließen lässt eine Zeile stehen (der jüngere Grund gilt). Ein Vorgang gehört dem, der ihn bearbeitet; ein ausgeführter Vorgang ist nicht mehr änderbar. Mahnt nicht.
operationId: schliesseMahnpositionAus · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
| Status | Bedeutung | Body |
|---|
200 | ausgeschlossen — der Grund wird nicht zurückgegeben | MahnlaufAusschlussResponse |
400 | Grund fehlt oder zu lang, Position nicht ausschließbar, ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
404 | Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | Vorgang fremd in Arbeit oder bereits ausgeführt (ApiErrorBody, code conflict) | |
POST/api/mahnlauf/{laufId}/ausschluss/aufheben
Holt eine ausgeschlossene Position in den Mahnlauf zurück (hole_mahnposition_zurueck). Gab es keinen Ausschluss, ist das ein Erfolg ohne Wirkung (`zurueckgeholt: false`). Ein Vorgang gehört dem, der ihn bearbeitet; ein ausgeführter Vorgang ist nicht mehr änderbar. Mahnt nicht.
operationId: holeMahnpositionZurueck · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
| Status | Bedeutung | Body |
|---|
200 | zurückgeholt | MahnlaufAusschlussAufhebenResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden) | |
404 | Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | Vorgang fremd in Arbeit oder bereits ausgeführt (ApiErrorBody, code conflict) | |
GET/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/datei
Lädt die Datei EINES Mahnschreibens als JSON (`datei`: dateiname, sha256, groesseBytes, inhaltBase64) und vermerkt den Download (vermerke_mahnschreiben_download) VOR der Antwort. Die binäre PDF-Route `…/pdf` bleibt daneben bestehen und liefert dieselben Bytes. Keine Außenwirkung, kein Step-up.
operationId: getMahnschreibenDatei · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
mahnschreibenId | path | ja | string(uuid) | mahnschreibenId (aus dem Ergebnis des Vorgangs) |
| Status | Bedeutung | Body |
|---|
200 | die Datei samt Prüfsumme | MahnlaufSchreibenDateiResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Schreibrecht (daten.schreiben) fehlt (ApiErrorBody, code forbidden) | |
404 | Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found) | |
POST/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/erneut
Sendet EIN fehlgeschlagenes Schreiben erneut (sende_mahnschreiben_erneut, Außenwirkung, frische Anmeldung): nur für den Status `fehlgeschlagen`, sonst 409. Ein zweiter Versand desselben Schreibens ist ausgeschlossen.
operationId: sendeMahnschreibenErneut · Auth: bearerAuth
Request-Body (optional): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
mahnschreibenId | path | ja | string(uuid) | mahnschreibenId (aus dem Ergebnis des Vorgangs) |
| Status | Bedeutung | Body |
|---|
200 | erneut gesendet (`ausgang` versandt oder wieder fehlgeschlagen) | MahnlaufErneutResponse |
400 | ungültige Eingabe, z. B. ein Body mit `stepUp` (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet. | |
404 | Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | Schreiben nicht fehlgeschlagen, bereits versendet oder zugestellt, Vorgang nicht ausgeführt (ApiErrorBody, code conflict) | |
POST/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/freigabe
Entscheidet über EIN Schreiben einzeln (entscheide_mahnschreiben): `entscheidung` freigeben oder zurueckweisen, beim Zurückweisen mit `grundCode` (optional `grundNotiz`). Nach freigeben folgt der Versand genau dieses Schreibens (Außenwirkung, frische Anmeldung, Ausführungsrecht); der Versandweg ist mail. Ein Agent darf nicht; eine rote Ampel ist nicht freigebbar.
operationId: entscheideMahnschreiben · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
mahnschreibenId | path | ja | string(uuid) | mahnschreibenId (aus dem Ergebnis des Vorgangs) |
| Status | Bedeutung | Body |
|---|
200 | entschieden (bei freigeben samt Versand-Ergebnis) | MahnlaufSchreibenFreigabeResponse |
400 | ungültige Eingabe, z. B. zurueckweisen ohne Grundcode oder freigeben mit Grund (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet. | |
404 | Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | schon entschieden, Ampel rot oder Inhalt zwischenzeitlich geändert (ApiErrorBody, code conflict) | |
POST/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/zustellung
Dokumentiert die von Hand erfolgte Zustellung EINES Schreibens (dokumentiere_mahnzustellung, Außenwirkung): `zugestelltAm`, `kanal` (brief, einschreiben, persoenliche_uebergabe) und die ausdrückliche Bestätigung `tatsacheBestaetigt: true`. Genau ein Nachweis je Schreiben; ein zweiter ist ein Konflikt.
operationId: dokumentiereMahnzustellung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
mahnschreibenId | path | ja | string(uuid) | mahnschreibenId (aus dem Ergebnis des Vorgangs) |
| Status | Bedeutung | Body |
|---|
200 | dokumentiert | MahnlaufZustellungResponse |
400 | Angaben fehlen, Bestätigung false, Datum in der Zukunft oder nach dem Stichtag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet. | |
404 | Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | bereits dokumentiert oder versendet, Vorgang nicht ausgeführt (ApiErrorBody, code conflict) | |
POST/api/mahnlauf/{laufId}/versand
Versendet die Schreiben eines AUSGEFÜHRTEN Vorgangs (versende_mahnschreiben, Außenwirkung, eigene frische Anmeldung): `versandweg` mail oder druck, optional `mahnschreibenIds` für „Versand fortsetzen" (nur diese Schreiben). Nur wenn der Vorgang ausgeführt ist und mindestens ein Schreiben `download_bereit` ist, sonst 409 OHNE Verbrauch der Anmeldung; ein zweiter Versand desselben Schreibens ist ausgeschlossen. Die Antwort nennt die Zähler und je Schreiben den Ausgang.
operationId: versendeMahnlauf · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
laufId | path | ja | string(uuid) | vorgangId |
| Status | Bedeutung | Body |
|---|
200 | der Versand lief — Zähler und Ergebnis je Schreiben (einzelne Schreiben können fehlgeschlagen sein) | MahnlaufVersandResponse |
400 | ungültige Eingabe, z. B. unbekannter Versandweg oder ein Body mit `stepUp` (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet. | |
404 | Vorgang oder eines der Schreiben unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | Vorgang nicht ausgeführt oder nichts mehr zu versenden (ApiErrorBody, code conflict) | |
mandat
GET/api/mandat
Listet SEPA-Mandate (Status-Filter alle|pending|active|revoked|expired, Default alle).
operationId: listMandate · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | pending | active | revoked | expired | alle | pending | active | revoked | expired (Default alle). Unbekannter Wert ⇒ 400. |
vertragId | query | nein | string(uuid) | nur Mandate dieses Vertrags (UUID) |
personId | query | nein | string(uuid) | nur Mandate dieser Person (UUID) |
| Status | Bedeutung | Body |
|---|
200 | Mandatsliste (MandatListResponse) | MandatListResponse |
400 | ungültiger status-Filter oder UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/mandat
Legt ein SEPA-Mandat zu einem Vertrag an (Status pending).
operationId: createMandat · Auth: bearerAuth
Request-Body (Pflicht): application/json → MandatCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegtes Mandat (Mandat) | |
400 | ungültige Eingabe ODER doppelte mandateRef im Tenant (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vertrag ODER Person unbekannt, archiviert oder fremder Tenant (ApiErrorBody, code not_found). Die Ziel-Prüfung leistet der Tool-Layer. | |
GET/api/mandat/{id}
Liest EIN SEPA-Mandat samt Vertrags-/Personen-Bezug (auch widerrufen/abgelaufen).
operationId: getMandat · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Mandat | Mandat |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/mandat/{id}/status
Führt den Mandatsstatus (validierter Übergang nach active/revoked/expired).
operationId: setMandatStatus · Auth: bearerAuth
Request-Body (Pflicht): application/json → MandatStatusRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Status geführt (MandatStatusResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses. | |
400 | ungültiges Ziel oder unerlaubter Übergang (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
me
GET/api/me
Aktuelle Session (Tenant + User + Step-up-Status).
operationId: getMe · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | Session (Tenant + User + Step-up) | MeResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle); Clients mappen den Status auf code "unauthenticated" | |
mieterhoehung
POST/api/mieterhoehung/{id}/entscheidung
Entscheidet EINE Mieterhöhungs-Fassung (entscheide_mieterhoehung): freigeben (`approved`) oder ablehnen (`rejected`, mit Grund-Code). Bindung und Inhalts-Hash bestimmt der Server frisch aus der Datenbank; der Rumpf trägt keinen Hash. Verlangt eine frische Anmeldung (Step-up). Ein Agent darf nicht entscheiden.
operationId: entscheideMieterhoehung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | mieterhoehungId |
| Status | Bedeutung | Body |
|---|
200 | entschieden — { approvalId, mieterhoehungId, decision, bindung, contentHash } | |
400 | ungültige Eingabe, z. B. Ablehnung ohne Grund (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Entscheider ist ein Agent bzw. ohne Berechtigung, oder Step-up nötig (ApiErrorBody, code forbidden) | |
404 | Fassung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Fassung verfallen oder schon entschieden (ApiErrorBody, code conflict) | |
POST/api/mieterhoehung/{id}/feststellung
Stellt die Reaktion des Mieters auf ein Erhöhungsverlangen fest (stelle_mieterhoehung_fest): ausdrückliche Zustimmung (Zustand `wirksam`), Widerspruch oder Sonderkündigung (Zustand `abgelehnt`). Setzt einen wirksamen Zustellnachweis voraus; die Feststellung ist append-only und fällt genau einmal. Nur ein Mensch darf sie festhalten, der Erfasser ist der Akteur.
operationId: stelleMieterhoehungFest · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | mieterhoehungId |
| Status | Bedeutung | Body |
|---|
200 | festgestellt — { mieterhoehungId, feststellungId, zustand, wirksam } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Akteur ist ein Agent bzw. ohne Berechtigung (ApiErrorBody, code forbidden) — nichts geschrieben | |
404 | Mieterhöhung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | nicht zugestellt (kein Zustellnachweis) oder bereits festgestellt (ApiErrorBody, code conflict) — nichts geschrieben | |
GET/api/mieterhoehung/{id}/indexerklaerung
Erzeugt die Erklärung einer Indexanpassung nach § 557b Abs. 3 BGB als Text im Standardwortlaut (erzeuge_indexanpassungserklaerung): alter und neuer Index, alte und neue Miete, Rechenweg und Wirksamkeitsmonat (Beginn des übernächsten Monats nach dem Zugang). Indexwerte und geplanter Betrag kommen aus dem gespeicherten Index-Vorgang und werden gegen die Kette nachgerechnet; weicht das Ergebnis ab, gibt es keinen Text. Nur lesend — der Text wird erzeugt, nicht versendet.
operationId: getMieterhoehungIndexerklaerung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | mieterhoehungId eines Index-Vorgangs |
| Status | Bedeutung | Body |
|---|
200 | { text, vorlageVersion, dokumentHash, zugangErfasst } — dokumentHash ist SHA-256 (hex) über den Text; zugangErfasst false = kein Zugangstag erfasst, der Wirksamkeitsmonat ist die Vorschau aus dem geplanten Wirksamkeitstag. | IndexanpassungErklaerungResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vorgang unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | kein Index-Vorgang, sondern z. B. ein § 558-Verlangen (ApiErrorBody, code MIETERHOEHUNG_KEIN_INDEXVORGANG), oder die Nachrechnung weicht vom gespeicherten Vorgang ab (code conflict) — kein Text. | |
POST/api/mieterhoehung/{id}/ruecknahme
Nimmt eine wirksame Mieterhöhung zurück (nimm_mieterhoehung_zurueck): Pflichtbegründung, Zustand `zurueckgenommen`. Die Antwort trägt `alterBetragCents`, den Betrag, der wieder gilt — aus dem Vorgang gelesen.
operationId: nimmMieterhoehungZurueck · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | mieterhoehungId |
| Status | Bedeutung | Body |
|---|
200 | zurückgenommen — { mieterhoehungId, ruecknahmeId, zustand, alterBetragCents, currency } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Akteur ist ein Agent bzw. ohne Berechtigung (ApiErrorBody, code forbidden) — nichts geschrieben | |
404 | Mieterhöhung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Mieterhöhung ist nicht wirksam (ApiErrorBody, code conflict) — nichts geschrieben | |
POST/api/mieterhoehung/{id}/versand
Versendet das freigegebene Mieterhöhungsschreiben nach § 558a BGB (versende_mieterhoehungsschreiben) über das Außenwirkungs-Gate: Zustellnachweis mit Dokument-Hash, Zustand `versendet` (nie `wirksam`). `mail` geht über den Versandkanal des Mandanten, `druck` protokolliert nur die Übergabe. Akteurs-Kette und Step-up bestimmt der Server aus Sitzung und Freigabe — nie aus dem Rumpf. Verlangt eine frische Anmeldung (Step-up) und eine Freigabe durch eine andere Person. Ein Agent darf nicht versenden.
operationId: versendeMieterhoehungsschreiben · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | mieterhoehungId |
| Status | Bedeutung | Body |
|---|
200 | Versuch protokolliert — { mieterhoehungId, versandweg, ausgang: "zugestellt" | "fehlgeschlagen", zustellnachweisId, providerRef, fehlerCode }; bei "fehlgeschlagen" bleibt der Zustand unverändert | |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Gate hat abgewiesen: keine Freigabe, Selbstfreigabe, kein frischer Step-up, kein Ausführungsrecht oder Versender ist ein Agent (ApiErrorBody, code MIETERHOEHUNG_VERSAND_GESPERRT). Nichts versendet. | |
404 | Vorgang unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Schreiben ist schon zugegangen (ApiErrorBody, code MIETERHOEHUNG_BEREITS_VERSENDET) oder die Anmeldung trägt schon eine andere Ausführung (code MIETERHOEHUNG_VERSAND_GESPERRT). Kein zweiter Versand. | |
POST/api/mieterhoehung/{id}/zahlung
Erfasst eine beobachtete Zahlung zum Erhöhungsverlangen (erfasse_mieterhoehungszahlung). Betrag, Währung und Datum liest der Server aus dem Buchungssatz, der eine Zahlung auf dem Mieter-Personenkonto dieses Vertrags sein muss. `unterVorbehalt` ist Pflicht ohne Default: das Merkmal „vorbehaltlos" bestätigt ein Mensch, es wird nie aus dem Bank-Matching abgeleitet. Mit der dritten vorbehaltlosen Zahlung in drei Perioden entsteht genau eine konkludente Feststellung (Zustand `wirksam`); eine Zahlung unter Vorbehalt zählt nicht.
operationId: erfasseMieterhoehungszahlung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | mieterhoehungId |
| Status | Bedeutung | Body |
|---|
200 | erfasst — { mieterhoehungId, zahlungEntryId, neuErfasst, zaehlendePerioden, feststellungId, betragCents, currency, gezahltAm } | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Akteur ist ein Agent bzw. ohne Berechtigung (ApiErrorBody, code forbidden) — nichts geschrieben | |
404 | Mieterhöhung oder Buchungssatz (keine Zahlung dieses Vertrags) unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | nicht zugestellt (kein Zustellnachweis) (ApiErrorBody, code conflict) — nichts geschrieben | |
GET/api/mieterhoehung/faellig
Liest, wer für eine Mieterhöhung fällig ist: je laufendem Wohnraumvertrag der zuständigen Objekte den frühesten § 558-Termin (Jahressperrfrist; gesperrt mit Grund bei Index- oder Staffelvereinbarung), bei Indexmiete den § 557b-Termin mit dem jüngsten VPI-Monat und der neuen Miete als Vorschau (vpi-fehlt oder basisjahr-abweichend statt eines geschätzten oder umgerechneten Werts) und das Ende der Zustimmungsfrist eines versendeten Vorgangs. Nur lesend — kein Vorgang, keine Mail; Gewerbeverträge erscheinen nicht.
operationId: getMieterhoehungFaellig · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
stichtag | query | nein | string(date) | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, zeilen[] } — nur Verträge der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS. | MieterhoehungFaelligResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/mieterhoehung/staffelliste
Liest die Staffelmieterhöhungsliste (UC-LIST-016): je Vertrag mit mindestens einem Kaltmieten-Wechsel die zum Stichtag geltende (aktuelle) und die unmittelbar vorherige Kaltmiete mit Gültigkeitsbeginn und Differenz, die nächste künftige Stufe und die Herkunft des Wechsels (anlage = im Anlage-Kommando des Vertrags entstanden, sonst konditionswechsel). Aktuell heißt: gilt zum Stichtag — nicht die zuletzt erfasste. von/bis grenzen auf Verträge ein, deren aktuelle Stufe in diesem Zeitraum gültig wurde. Nur lesend.
operationId: getStaffelmieteListe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
stichtag | query | nein | string(date) | |
von | query | nein | string(date) | |
bis | query | nein | string(date) | |
objekt | query | nein | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, zeilen[] } — nur Verträge der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS. | StaffelmieteListeResponse |
400 | ungültige Query, z. B. unbekannter Parameter, kein Kalendertag oder von nach bis (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
mieterwechsel
POST/api/mieterwechsel
Mieterwechsel auf einer Einheit: Altvertrag beenden, Neuvertrag anlegen, Zeitscheiben fortschreiben (eine Transaktion).
operationId: executeMieterwechsel · Auth: bearerAuth
Request-Body (Pflicht): application/json → MieterwechselRequest
| Status | Bedeutung | Body |
|---|
201 | Wechsel ausgeführt (MieterwechselResponse). Wiederholter Aufruf mit gleichem Idempotency-Key = Replay des Erst-Ergebnisses. | MieterwechselResponse |
400 | überlappende Belegung, unbestätigter Leerstand, unplausibles Enddatum, objektfremder Altvertrag oder Float auf Geld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Einheit, Altvertrag oder Zahlungs-Komponente unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Altvertrag bereits beendet oder Einheit anderweitig belegt (ApiErrorBody, code conflict) | |
migration
GET/api/migration/{id}/vergleich
Der centgenaue Abweichungsbericht je Fachbereich zu EINEM Import-Vorgang: casa.ai rechnet den importierten Bestand nach und stellt ihn gegen die WinCASA-Vergleichswerte des jüngsten Satzes — mit Konto, Person, Differenz und Erklärung je Abweichung und einem Grund je nicht vergleichbarem Fachbereich. Cent-Beträge als Ganzzahl-Text. Schreibt nichts.
operationId: leseMigrationsvergleich · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Der Bericht (MigrationsvergleichResponse) | MigrationsvergleichResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mitglied des Mandanten der Sitzung (ApiErrorBody, code forbidden) | |
404 | Import-Vorgang unbekannt, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found) — alle drei sehen gleich aus, eine Unterscheidung wäre bereits ein Existenz-Orakel. | |
409 | der Vorgang trägt noch keinen Satz WinCASA-Vergleichswerte (ApiErrorBody, code conflict) — erst im Direktimport die Vergleichswerte erzeugen. | |
503 | Berechtigungsprüfung derzeit nicht möglich (ApiErrorBody, code unavailable) | |
objekt
GET/api/objekt
Listet Objekte (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv).
operationId: listObjekte · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | archiviert | alle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback. |
| Status | Bedeutung | Body |
|---|
200 | Objektliste (ObjektListResponse) | ObjektListResponse |
400 | ungültiger status-Filter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/objekt
Legt ein Objekt an; der 1:1-Buchungskreis entsteht automatisch (F3).
operationId: createObjekt · Auth: bearerAuth
Request-Body (Pflicht): application/json → ObjektCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegtes Objekt inkl. accountingCircleId (Objekt) | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/objekt/{id}
Liest EIN Objekt (auch archiviert) samt Buchungskreis.
operationId: getObjekt · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Objekt | Objekt |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
PATCH/api/objekt/{id}
Ändert Objekt-Stammfelder (nur nicht-archivierte Objekte).
operationId: updateObjekt · Auth: bearerAuth
Request-Body (Pflicht): application/json → ObjektUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geändertes Objekt | |
400 | leerer/ungültiger Patch ODER Objekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/objekt/{id}/abschluss
Liest die Abschluss-Läufe eines Objekts. Ein stornierter Lauf verschwindet NICHT aus dem Bestand (GG4/GoBD) — er trägt `storniert: true` und wird vom Nachfolger über `ersetztLaufId` genannt.
operationId: listObjektAbschlussLaeufe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
jahr | query | nein | integer | Filtert auf EIN Wirtschaftsjahr. Ohne Angabe: alle Jahre — das vermischt nichts, denn jeder Lauf trägt sein Jahr an der Zeile. Ein Jahr ohne Lauf ergibt eine LEERE Liste, keinen Fehler. |
| Status | Bedeutung | Body |
|---|
200 | die Läufe des Objekts, aktive und stornierte (AbschlussLaufListResponse) | AbschlussLaufListResponse |
400 | keine UUID ODER `jahr` ist keine ganze Zahl (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/abschluss/korrektur
Führt die Korrektur-Kette einer Kaskaden-Neuberechnung aus: je betroffenem Jahr ein Storno und ein NEUER Lauf mit Referenz auf den stornierten, in EINER Transaktion. Der Idempotenz-Schlüssel kommt vom Aufrufer — zwei Aufrufe am selben Schlüssel ergeben GENAU EINE Kette.
operationId: fuehreObjektAbschlussKorrekturAus · Auth: bearerAuth
Request-Body (Pflicht): application/json → AbschlussKorrekturRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die geschriebene Kette; bei `bereits_ausgefuehrt` leer (AbschlussKorrekturResponse) | AbschlussKorrekturResponse |
400 | ungültige Eingabe ODER eine Gate-Entscheidung nennt ein Jahr, das in dieser Kaskade keinen neuen Lauf bekommt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | das Objekt führt in KEINEM Jahr der Kaskade einen aktiven Lauf — eine Korrektur hätte nichts zu ersetzen (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/archive
Archiviert Objekt + 1:1-Buchungskreis (archived_at statt DELETE, K5). Kaskadiert abwärts: alle Gebäude + Einheiten des Objekts werden mitarchiviert (#445).
operationId: archiveObjekt · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | archiviert (ObjektArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). Alle Gebäude und Einheiten des Objekts werden in derselben Transaktion mitarchiviert (Kaskade #445, ein Kommando). | |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/objekt/{id}/beschluss
Liest die Beschluss-Sammlung eines Objekts (§ 24 Abs. 7 WEG), optional nach Lebenszyklus-Status gefiltert.
operationId: listObjektBeschluesse · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
status | query | nein | string | kommagetrennte Lebenszyklus-Zustände (angenommen, abgelehnt, angefochten, bestandskraeftig, aufgehoben, nichtig). OHNE Angabe: die VOLLSTÄNDIGE Sammlung — eine stille Vorauswahl gibt es nicht. Ein unbekannter Wert ⇒ 400 (nicht: leere Liste). |
| Status | Bedeutung | Body |
|---|
200 | Beschluss-Sammlung des Objekts (BeschlussListResponse) | BeschlussListResponse |
400 | keine UUID oder unbekannter Status im Filter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/beschluss
Erfasst EINEN Beschluss samt Teil-Gegenständen (auch der WinCASA-Alt-Import läuft hier durch).
operationId: erfasseObjektBeschluss · Auth: bearerAuth
Request-Body (Pflicht): application/json → BeschlussErfasseRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | erfasster Beschluss samt Teil-Gegenstands-Referenzen (BeschlussErfasseResponse) | BeschlussErfasseResponse |
400 | ungültige Eingabe, kein Teil-Gegenstand, kein Verkündungszustand als Anfangsstatus ODER laufende Nummer bereits vergeben (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/beschluss/import
Importiert einen WinCASA-Beschlussbestand (Export der Tabelle VERTHEMEN bzw. VERSAMMLUNG_ERG) in die Sammlung eines Objekts. Multipart-Upload, serverseitig geparst. Teilerfolg ist erlaubt: abgewiesene Zeilen stehen benannt in der Antwort, die übrigen bleiben geschrieben.
operationId: importiereObjektBeschluesse · Auth: bearerAuth
Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
onr | query | ja | string | Objektnummer des ALTBESTANDS, deren Zeilen übernommen werden. Pflicht und ohne Default: eine Export-Datei kann die Zeilen mehrerer Objekte enthalten, und die laufende Nummer der Sammlung wird je Objekt vergeben (§ 24 Abs. 7 WEG). |
| Status | Bedeutung | Body |
|---|
200 | Import-Bericht mit Befunden (BeschlussImportResponse) | BeschlussImportResponse |
400 | keine UUID, fehlende onr ODER die Datei ist kein Beschluss-Export (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
413 | Datei zu groß oder Upload zu langsam (ApiErrorBody, code payload_too_large) | |
GET/api/objekt/{id}/brennstoffkonto
Liest das Brennstoffkonto eines Objekts: das aktive Konto mit Zustand und Zeitpunkt der Wahl, den gemerkten Ausgangszustand (`vorzustand`), den Befund (`brennstoffkonto-verteilt-doppelt`, wenn das Brennstoffkonto trotzdem umlagefähig ist oder einen Schlüssel trägt) und die Konten des Objekts mit Heizkosten-Kostenart als Auswahlhilfe. Nur lesend.
operationId: getBrennstoffkonto · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Brennstoffkonto, Befund und Auswahlhilfe (BrennstoffkontoResponse) | BrennstoffkontoResponse |
400 | ungültige Objekt-Id (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekanntes ODER fremdes Objekt — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/objekt/{id}/brennstoffkonto
Setzt das Brennstoffkonto des Objekts. Das Brennstoffkonto verteilt die Heizkosten über die Heizkostenabrechnung und darf nicht zusätzlich als Betriebskosten umgelegt werden; das Setzen macht das Konto nicht umlagefähig und entfernt den Umlageschlüssel (`bestaetigt: true` ist Pflicht, wenn es das verliert). Das frühere Brennstoffkonto geht auf seinen gespeicherten Ausgangszustand zurück. Ein Konto mit Buchungen wird nicht umgestellt. Der Idempotency-Key kommt vom Aufrufer.
operationId: setzeBrennstoffkonto · Auth: bearerAuth
Request-Body (Pflicht): application/json → BrennstoffkontoSetzenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
201 | Brennstoffkonto gesetzt (BrennstoffkontoGesetztResponse) | BrennstoffkontoGesetztResponse |
400 | ungültige Eingabe oder fehlende Bestätigung (umstellung-braucht-bestaetigung, die Meldung nennt, was verloren geht) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden) | |
404 | unbekanntes Objekt, unbekanntes, archiviertes oder objektfremdes Konto — dieselbe Meldung (ApiErrorBody, code not_found) | |
409 | bereits-brennstoffkonto oder konto-gebucht — Konto mit Buchungen wird nicht umgestellt (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/brennstoffkonto/aufheben
Hebt das Brennstoffkonto des Objekts auf: die Markierung endet, das Konto geht auf seinen gespeicherten Ausgangszustand zurück (`bestaetigt: true` ist Pflicht, wenn es dadurch wieder umlagefähig wird oder einen Schlüssel erhält). Ein inzwischen gebuchtes Konto bleibt wie es ist. Der Idempotency-Key kommt vom Aufrufer.
operationId: hebeBrennstoffkontoAuf · Auth: bearerAuth
Request-Body (Pflicht): application/json → BrennstoffkontoAufhebenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Brennstoffkonto aufgehoben (BrennstoffkontoAufgehobenResponse) | BrennstoffkontoAufgehobenResponse |
400 | ungültige Eingabe oder fehlende Bestätigung (umstellung-braucht-bestaetigung) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden) | |
404 | unbekanntes Objekt oder das Objekt hat kein Brennstoffkonto (ApiErrorBody, code not_found) | |
GET/api/objekt/{id}/buchungsperioden
Liest Stand und Protokoll der festschreibbaren Buchungsperioden eines Objekts: Schalter (eigener und Mandanten-Vorgabe, aktiv), Wirtschaftsjahr-Beginn, je Festschreibung ob sie gilt oder geöffnet ist (bei Öffnung Grund, wer, wann) und die Journalsätze, die zwischen Öffnung und Neu-Festschreiben mit Datum in der Periode gebucht wurden. Mit format=export kommt dieselbe Antwort als deterministische JSON-Datei (content-disposition attachment, gleiche Daten ergeben gleiche Bytes). Nur Journalsätze: offene Posten und Sollstellungen sind nicht gesperrt.
operationId: getObjektBuchungsperioden · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
format | query | nein | export | |
| Status | Bedeutung | Body |
|---|
200 | Stand und Protokoll (BuchungsperiodenResponse); mit format=export als Datei-Download | BuchungsperiodenResponse |
400 | unbekannter Query-Parameter oder format ungleich export (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/buchungsperioden/festschreibung
Schreibt die nächste Buchungsperiode eines Objekts fest (Wirtschaftsjahr des Objekts, lückenlos) oder schreibt eine geöffnete Periode mit genau ihrem Zeitraum neu fest. Nur ein Mensch; das Objekt kommt aus dem Pfad.
operationId: festschreibeObjektBuchungsperiode · Auth: bearerAuth
Request-Body (optional): application/json → BuchungsperiodeFestschreibungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die geschriebene Festschreibung (BuchungsperiodeFestschreibungResponse) | BuchungsperiodeFestschreibungResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht — nur ein Mensch (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found) | |
409 | Schalter aus, Lücke, kein Wirtschaftsjahr-Beginn, Wirtschaftsjahr unklar, Periode noch nicht abgelaufen, paralleler Aufruf oder Periode gesperrt; Code in error.code (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/buchungsperioden/oeffnung
Öffnet eine festgeschriebene Buchungsperiode des Objekts mit Pflichtgrund (auch eine mittlere). Genau eine Öffnungszeile je Festschreibung, unveränderliches Protokoll. Nur ein Mensch; die Festschreibung muss zum Objekt im Pfad gehören.
operationId: oeffneObjektBuchungsperiode · Auth: bearerAuth
Request-Body (Pflicht): application/json → BuchungsperiodeOeffnungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die geschriebene Öffnung (BuchungsperiodeOeffnungResponse) | BuchungsperiodeOeffnungResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht — nur ein Mensch (ApiErrorBody, code forbidden) | |
404 | Objekt oder Festschreibung unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found) | |
409 | Periode ist bereits geöffnet; Code in error.code (ApiErrorBody, code conflict) | |
GET/api/objekt/{id}/check
Plausi-Gate: prüft die Gesundheit/Vollständigkeit eines Objekts (Struktur, Flächen-Pflichtwerte §20 NMV, MEA-Rahmen) und liefert Flächensummen je Gebäude/Objekt als AGGREGAT — ein Soll-Abgleich findet nicht statt, das Schema trägt keine Soll-Fläche.
operationId: checkObjekt · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
asOf | query | nein | string(date) | Stichtag YYYY-MM-DD, gegen den die Attribut-Scheiben gemessen werden (Default: heute UTC). |
| Status | Bedeutung | Body |
|---|
200 | Plausi-Ergebnis (ObjektCheckResponse) | ObjektCheckResponse |
400 | keine UUID ODER ungültiger asOf (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
GET/api/objekt/{id}/eigentum
Liest das Eigentum eines Objekts zum Stichtag, gruppiert je Einheit, mit Anteilssumme und Befund `anteilssumme_ungleich_10000`. Pflicht: Query `stichtag` (YYYY-MM-DD, keine Server-Uhr). Optional `einheit` (nur diese Einheit) und `historie` (1/true: auch abgelaufene und künftige Zeilen; `istGegenwart` markiert die am Stichtag wirksamen). Die Zustellanschrift steht nie in der Antwort, nur das Kennzeichen `hatZustellanweisung`.
operationId: listObjektEigentum · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | ja | string(date) | |
einheit | query | nein | string(uuid) | |
historie | query | nein | 0 | 1 | true | false | |
| Status | Bedeutung | Body |
|---|
200 | das Eigentum je Einheit (EigentumListeResponse) | EigentumListeResponse |
400 | keine UUID, `stichtag` fehlt oder ist kein Kalendertag, `einheit` keine UUID, `historie` unbekannt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Einheit unbekannt, fremder Mandant ODER Einheit gehört nicht zum Objekt (ApiErrorBody, code not_found) — alle Fälle identisch | |
GET/api/objekt/{id}/hausgeld
Liest die gestellten Hausgeld-Sollstellungen eines Objekts für EIN Wirtschaftsjahr (§ 28 Abs. 1 WEG). Vorschuss und quittierte Differenz stehen NEBENEINANDER — die Differenz ersetzt den Vorschuss nicht.
operationId: listObjektHausgeldSoll · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
jahr | query | ja | integer | Das WIRTSCHAFTSJAHR — bei einem Rumpfjahr nicht das Kalenderjahr der Fälligkeit. Pflicht und ohne Default: eine Liste über ALLE Jahre vermischte zwei Wirtschaftspläne, und genau diese Achse trennt sie. Ein Jahr ohne Soll ergibt eine LEERE Liste, keinen Fehler. |
| Status | Bedeutung | Body |
|---|
200 | die gestellten Soll-Zeilen des Objekts im gefragten Wirtschaftsjahr (HausgeldSollListResponse) | HausgeldSollListResponse |
400 | keine UUID ODER `jahr` fehlt/ist keine ganze Zahl (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/hausgeld/differenz
Quittiert rückwirkende Differenz-Vorschläge eines Soll-Laufs — der GEFÜHRTE Schritt. Schuldner und Plan-Version werden vom VORSCHLAG übernommen und nicht neu abgeleitet.
operationId: quittiereObjektHausgeldDifferenz · Auth: bearerAuth
Request-Body (Pflicht): application/json → HausgeldDifferenzRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die gebuchten Differenz-Positionen (HausgeldDifferenzResponse) | HausgeldDifferenzResponse |
400 | ungültige Eingabe, leerer Stapel ODER fehlendes quittiertVon/quittiertAm (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | derselbe Vorschlag ist bereits quittiert (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/hausgeld/soll
Stellt das Hausgeld eines Objekts für ein Wirtschaftsjahr fällig — je Einheit und Monat eine Sollstellung. Rückwirkende Differenzen liefert der Lauf als VORSCHLAG und bucht sie NICHT (Owner-Leitplanke 2026-08-20).
operationId: stelleObjektHausgeldSoll · Auth: bearerAuth
Request-Body (Pflicht): application/json → HausgeldSollRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | der Lauf samt gestellten Positionen und ungebuchten Differenz-Vorschlägen (HausgeldSollResponse) | HausgeldSollResponse |
400 | ungültige Eingabe, unbekannter/fehlender Geldkreis ODER ein Buchungs-Gate der Freigabe hat abgelehnt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | der Geldkreis dieses Laufs ist nicht weg_hausgeld, ODER derselbe Lauf/Monat ist bereits gestellt (ApiErrorBody, code conflict). Ein Miet-Soll läuft über den Sollstellungslauf, nicht hierüber. | |
GET/api/objekt/{id}/hausgeld/zahlung
Verteilt eine Zahlung auf die Hausgeld- und die Rücklagen-Seite EINER gestellten Sollstellung (S12-T05-Policy, Präzedenz Objekt > Tenant > Default). SCHREIBT NICHTS: die Soll-Zeile ist danach zeichengleich.
operationId: ordneObjektHausgeldZahlungZu · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
jahr | query | ja | integer | Die WIRTSCHAFTSJAHR-Achse des Lauf-Scopes. Ausdrücklich KEIN Filter: die sollstellungId ist innerhalb von (Mandant, Objekt) bereits eindeutig, und beide Achsen sind Prädikat der Abfrage. Die gelieferte Position trägt ihre Herkunft (Monat, Plan-Version, Rechtsgrundlage) selbst. |
sollstellungId | query | ja | string(uuid) | Die Zeile aus `hausgeld_sollstellungen`, gegen die verteilt wird. Die Forderung wird GELESEN, nie vom Aufrufer behauptet. |
cents | query | ja | string | Der eingegangene Betrag in ganzen Cents als ZIFFERN-STRING (INV-MONEY-01, nie ein Float). Negativ ist fail-loud. |
| Status | Bedeutung | Body |
|---|
200 | die Aufteilung samt angewandter Regel und der UNVERÄNDERTEN Soll-Position (HausgeldZahlungResponse) | HausgeldZahlungResponse |
400 | keine UUID, fehlender/ungültiger Betrag ODER eine gesetzte, unbekannte Zuordnungs-Einstellung (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt/Sollstellung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/kontenrahmen-schluessel
Zieht für die Konten, die ein Musterkontenrahmen VOR #5553 am Objekt angelegt hat, die fehlenden Umlageschlüssel und deren Verknüpfungen nach (#5638).
operationId: backfillKontenrahmenSchluessel · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | nachgezogen: { propertyId, angelegteSchluessel[] mit { art, allocationKeyId, name }, verknuepfteKonten[] mit { glAccountId, accountNo, art, allocationKeyId } }. Atomar (EIN Kommando) und zustandsidempotent: ein zweiter Aufruf mit frischem Key legt keinen zweiten Schlüssel an und liefert leere Listen, derselbe Header `Idempotency-Key` ist ein Replay des Erst-Ergebnisses; ein vorhandener aktiver, objektweiter Schlüssel derselben Art wird wiederverwendet, Konten mit gepflegtem Schlüssel bleiben unangetastet. Das Einspielen des Rahmens selbst bleibt ein Replay. | |
400 | keine UUID ODER Objekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/reactivate
Nimmt die Archiv-Kaskade eines Objekts zurück (#445): Objekt + 1:1-Buchungskreis werden aktiv, dazu genau die Gebäude/Einheiten/Abrechnungskreise, die DIESELBE Kaskade stillgelegt hat.
operationId: reactivateObjekt · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | reaktiviert (ObjektReactivateResponse). Vorher EINZELN archivierte Kinder bleiben archiviert. Ein bereits aktives Objekt liefert alreadyActive=true ohne Write. Wiederholungssicher nur über denselben Header `Idempotency-Key`. | |
400 | keine UUID ODER Kaskade zu groß (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | eine zurückgeholte Einheit trüge eine Nummer, die im Objekt inzwischen an eine aktive Einheit vergeben ist (ApiErrorBody, code conflict, #5534) — nichts wurde reaktiviert. | |
GET/api/objekt/{id}/ruecklagen
Liest den Katalog der Rücklagen eines Objekts (älteste zuerst) mit Ist-Bestand zum Stichtag und dem Kennzeichen `aufgeloest`. Aufgelöste Rücklagen bleiben im Katalog.
operationId: listObjektRuecklagen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | nein | string(date) | Stichtag (INKLUSIV, YYYY-MM-DD) für den Ist-Bestand. Ohne Angabe ist `istBestand` null — der Server liest keine Uhr. |
| Status | Bedeutung | Body |
|---|
200 | der Katalog des Objekts (RuecklagenKatalogResponse) | RuecklagenKatalogResponse |
400 | keine UUID ODER `stichtag` ist kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) — beide Fälle identisch | |
POST/api/objekt/{id}/ruecklagen
Legt eine Rücklage des Objekts samt Kontenpaar an (passives Rücklagenkonto, aktives Bestandskonto). Die Erhaltungsrücklage gibt es je Objekt genau einmal (§ 19 Abs. 2 Nr. 4 WEG). Der Idempotenz-Schlüssel kommt vom Aufrufer (Header). Ein Änderungs- oder Löschweg existiert bewusst nicht.
operationId: legeObjektRuecklageAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → RuecklageAnlegenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die angelegte Rücklage samt Kontenpaar; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklageAnlegenResponse) | RuecklageAnlegenResponse |
400 | keine UUID, ungültige Eingabe (z. B. Zweckbindung fehlt bei `zweckgebunden`) oder Untergruppe/Konto gehört nicht zum Objekt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | das Objekt führt bereits eine Erhaltungsrücklage, ist kein WEG-Objekt oder ein Konto ist schon einer Rücklage zugeordnet (ApiErrorBody, code conflict) | |
GET/api/objekt/{id}/ruecklagen/abstimmung
Stimmt das aktive Bestandskonto gegen das passive Rücklagenkonto je Rücklage und gesamt zum Stichtag ab (Befunde: fehlende Umbuchung Giro → Festgeld, Konto ohne Gegenstück).
operationId: getObjektRuecklagenAbstimmung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | ja | string(date) | Stichtag (INKLUSIV, YYYY-MM-DD). Pflicht und ohne Default: der Server liest keine Uhr. |
| Status | Bedeutung | Body |
|---|
200 | die Abstimmung des Objekts (RuecklagenAbstimmungResponse) | RuecklagenAbstimmungResponse |
400 | keine UUID ODER `stichtag` fehlt/ist kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | Konto mehreren Rücklagen zugeordnet, Fremdwährung im Konto oder Beschluss ohne lesbaren Status (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/ruecklagen/aufloesung
Löst eine Rücklage auf — nur gegen Aufhebungsbeschluss und nur bei Saldo 0,00 €. Das Konto bleibt, die Rücklage bleibt im Katalog lesbar (`aufgeloest` true); danach wird nichts mehr auf sie gebucht.
operationId: loeseObjektRuecklageAuf · Auth: bearerAuth
Request-Body (Pflicht): application/json → RuecklagenAufloesungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die Auflösung; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenAufloesungResponse) | RuecklagenAufloesungResponse |
400 | keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Aufhebungsbeschluss fehlt | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | Zustandskonflikt (ApiErrorBody, code conflict): der Saldo ist nicht 0,00 € (erst zurückführen oder entnehmen) oder die Rücklage ist bereits aufgelöst | |
POST/api/objekt/{id}/ruecklagen/buchung
Bucht eine Bewegung auf dem passiven Rücklagenkonto: Betrag > 0 ist eine Zuführung, Betrag < 0 eine Entnahme (`betragCents` "-5000" = Entnahme von 50,00 €). Eine Entnahme braucht `zweck`, bauliche_veraenderung und modernisierung zusätzlich `umwidmungsBeschlussRef`. Dieselbe Zuführungs-Periode wird nur EINMAL gebucht: die zweite Antwort trägt `ausgang` bereits_gebucht und erzeugt keinen zweiten Journalsatz. Korrektur = Gegenbewegung mit `korrigiertBewegungId`.
operationId: bucheObjektRuecklagenBewegung · Auth: bearerAuth
Request-Body (Pflicht): application/json → RuecklagenBuchungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die Bewegung, `ausgang` gebucht oder bereits_gebucht (gleiche Periode oder wiederholter Idempotenz-Schlüssel) (RuecklagenBuchungResponse) | RuecklagenBuchungResponse |
400 | keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Betrag 0, Zweck fehlt oder unbekannt, Feld passt nicht zur Richtung, Buchungsdatum ungültig oder in der Zukunft | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | Zustandskonflikt (ApiErrorBody, code conflict): die Rücklage ist aufgelöst, die Entnahme übersteigt den Bestand, der Zweck verlangt einen Umwidmungsbeschluss, das Bestandskonto lautet nicht auf die GdWE oder die Korrektur ist unzulässig | |
POST/api/objekt/{id}/ruecklagen/rueckfuehrung
Führt eine Zwischenfinanzierung in voller Höhe in die Rücklage zurück. Je Zwischenfinanzierung gibt es genau eine Rückführung.
operationId: rueckfuehreObjektRuecklageZwischenfinanzierung · Auth: bearerAuth
Request-Body (Pflicht): application/json → RuecklagenRueckfuehrungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die Rückführung; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenRueckfuehrungResponse) | RuecklagenRueckfuehrungResponse |
400 | keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt, Rücklage oder Zwischenfinanzierung unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — alle Fälle identisch | |
409 | die Zwischenfinanzierung ist bereits zurückgeführt oder die Rücklage ist aufgelöst (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/ruecklagen/soll
Legt eine Soll-Zuführung einer Rücklage fest und bindet sie an einen Beschluss-Teilgegenstand. Betrag in Cent als Ziffern-String (> 0). Eine aufgelöste Rücklage nimmt kein Soll mehr an.
operationId: legeObjektRuecklagenSollFest · Auth: bearerAuth
Request-Body (Pflicht): application/json → RuecklagenSollRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die festgelegte Soll-Zuführung; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenSollResponse) | RuecklagenSollResponse |
400 | keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz fehlt oder Betrag nicht positiv | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | die Rücklage ist aufgelöst (ApiErrorBody, code conflict) | |
GET/api/objekt/{id}/ruecklagen/soll-ist
Liest Soll, Ist und Rückstand der Rücklagen eines Objekts zum Stichtag. Ohne `ruecklageId` alle Rücklagen des Objekts, nach Rücklagen-Id sortiert.
operationId: listObjektRuecklagenSollIst · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | ja | string(date) | Stichtag (INKLUSIV, YYYY-MM-DD). Pflicht und ohne Default: der Server liest keine Uhr. |
ruecklageId | query | nein | string(uuid) | Nur diese Rücklage. Gehört sie nicht zum Objekt (oder ist unbekannt), ist das ein 404 not_found. |
| Status | Bedeutung | Body |
|---|
200 | Soll/Ist je Rücklage (RuecklagenSollIstResponse) | RuecklagenSollIstResponse |
400 | keine UUID ODER `stichtag` fehlt/ist kein Kalendertag ODER `ruecklageId` ist keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant ODER `ruecklageId` unbekannt/fremd (ApiErrorBody, code not_found) — alle Fälle identisch | |
GET/api/objekt/{id}/ruecklagen/wiedervorlagen
Liest die offenen Zwischenfinanzierungen eines Objekts (noch nicht zurückgeführt) mit Fälligkeit, Betrag und Beschluss-Referenz, nach Fälligkeit geordnet. `ueberfaellig` ist eine Auskunft, keine Sperre.
operationId: listObjektRuecklagenWiedervorlagen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
bis | query | ja | string(date) | Bezugstag (YYYY-MM-DD): überfällig ist, was VOR diesem Tag fällig war. Pflicht und ohne Default: der Server liest keine Uhr. |
| Status | Bedeutung | Body |
|---|
200 | die offenen Wiedervorlagen (RuecklagenWiedervorlagenResponse) | RuecklagenWiedervorlagenResponse |
400 | keine UUID ODER `bis` fehlt/ist kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) — beide Fälle identisch | |
POST/api/objekt/{id}/ruecklagen/zins
Erfasst einen Zinsertrag einer Rücklage: brutto wird in Kapitalertragsteuer (25 %), Solidaritätszuschlag (5,5 % auf die Steuer) und netto aufgeteilt und gebucht. Ein negativer Zins (Verwahrentgelt) hat hier keinen Weg. Derselbe Aufruf (Idempotenz-Schlüssel) ergibt `ausgang` bereits_gebucht ohne zweite Bewegung.
operationId: erfasseObjektRuecklagenZins · Auth: bearerAuth
Request-Body (Pflicht): application/json → RuecklagenZinsRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | der Zinsertrag, `ausgang` gebucht oder bereits_gebucht (RuecklagenZinsResponse) | RuecklagenZinsResponse |
400 | keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Bruttozins nicht positiv | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | Zustandskonflikt (ApiErrorBody, code conflict): die Rücklage ist aufgelöst, am Zins-Konto hängt ein Verteilerschlüssel, die Summenprobe schlägt fehl oder der Replay weicht vom gespeicherten Satz ab | |
POST/api/objekt/{id}/ruecklagen/zwischenfinanzierung
Entnimmt der Rücklage kurzfristig Liquidität gegen Beschluss (Zwischenfinanzierung) und legt eine Wiedervorlage an. `beschlussRef` ist Pflicht; die Frist kommt aus der Policy (Objekt vor Mandant vor 3 Monaten) und ist mit `fristMonate` überschreibbar.
operationId: entnimmObjektRuecklageZwischenfinanzierung · Auth: bearerAuth
Request-Body (Pflicht): application/json → RuecklagenZwischenfinanzierungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die Zwischenfinanzierung mit Fälligkeit; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenZwischenfinanzierungResponse) | RuecklagenZwischenfinanzierungResponse |
400 | keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz fehlt oder Frist ungültig | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | Zustandskonflikt (ApiErrorBody, code conflict): die Rücklage ist aufgelöst, der Bestand oder die Deckung des Beschlusses reicht nicht, oder der Beschluss trägt die Entnahme nicht | |
GET/api/objekt/{id}/sev-auszahlung
Vorschlag der Auszahlung des Mietüberschusses je SEV-Mandat des Objekts für einen Monat (Stichtag Monatsletzter): Saldo des Verrechnungskontos, Sockel, Auszahlungsbetrag und Empfänger-IBAN — oder das Mandat als übersprungen mit Grund (Rhythmus, offene Posten, kein Überschuss, bereits ausgezahlt, ohne Auszahlungskonto) — samt vorschlagHash, den ein Mensch mit POST bestätigt. Schreibt nichts.
operationId: getSevAuszahlungVorschlag · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
monat | query | ja | string | Monat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Vorschlag (SevAuszahlungVorschlagResponse). ACHTUNG PII: `auszahlungen[].empfaengerIban` ist eine IBAN (Kategorie bankdaten) — der Empfänger, den der Mensch vor dem Stellen sehen muss. | SevAuszahlungVorschlagResponse |
400 | fehlender oder ungültiger Monat (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/sev-auszahlung
Stellt die Auszahlungen des Mietüberschusses eines Monats nach Bestätigung des gesehenen Vorschlags (vorschlagHash): je Mandat der Entnahme-Satz auf dem Eigentümer-Verrechnungskonto und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des Eigentümers, abgehend vom angegebenen Objekt-Bankkonto. Ausgeführt wird erst nach der bestehenden Zahlungsfreigabe (Vier-Augen). Idempotent je Mandat und Monat.
operationId: stelleSevAuszahlungen · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevAuszahlungStellenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Die gestellten Auszahlungen samt Zahlungsaufträgen und die übersprungenen Mandate (SevAuszahlungStellenResponse) | SevAuszahlungStellenResponse |
400 | ungültige Eingabe (u. a. Zusatzfeld wie propertyId oder ein Betrag) ODER das Bankkonto ist kein Konto dieses Objekts (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Vorschlag geändert (vorschlagHash), gleichzeitiger Lauf derselben Periode ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
GET/api/objekt/{id}/sev-eigentuemerwechsel
Befunde „Eigentümer gewechselt, Mandat läuft weiter" eines Objekts für einen Monat: je SEV-Mandat, dessen Person an mindestens einem Tag, an dem das Mandat wirkt, nicht (mehr) Eigentümerin der Wohnung ist — mit dem ersten solchen Tag und den Eigentümern an diesem Tag. Der Mietgutschrift-Lauf schreibt diesen Monat nicht an den bisherigen Eigentümer gut. Schreibt nichts.
operationId: getSevEigentuemerwechselBefunde · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
monat | query | ja | string | Monat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Die Befunde (SevEigentuemerwechselBefundeResponse) | SevEigentuemerwechselBefundeResponse |
400 | fehlender oder ungültiger Monat (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
GET/api/objekt/{id}/sev-garantie-abstimmliste
Abstimmliste der Garantiemieten eines Objekts über einen Zeitraum: je Wohnung mit Garantie- oder Mindestmiete die garantierte gegen die erzielte Miete, die Differenz, die Gutschrift an den Eigentümer und die Belastung des Garantiegebers, dazu die Summen je Spalte. Gerechnet aus dem Bestand — unabhängig davon, ob die Gutschrift schon vorgelegt oder freigegeben ist. Schreibt nichts.
operationId: ladeSevGarantieAbstimmliste · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
monate | query | ja | string | Der Zeitraum: lückenlose Monate JJJJ-MM, kommagetrennt in Kalenderfolge (z. B. 2025-03,2025-04), höchstens zwölf. Fehlend, formwidrig oder lückenhaft ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Die Abstimmliste (SevGarantieAbstimmlisteResponse) | SevGarantieAbstimmlisteResponse |
400 | fehlender, formwidriger oder lückenhafter Zeitraum ODER Basis kalt ohne getrennt gebuchte Kaltmiete (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found) | |
GET/api/objekt/{id}/sev-hausgeld
Vorschlag der Hausgeldzahlung aus der vereinnahmten Miete für ein Objekt und einen Monat — je SEV-Mandat die offenen Hausgeld-Posten (Rückstände im Mandatszeitraum eingeschlossen, Sonderumlage nur bei Vereinbarung), das Guthaben, die Deckung und jede Unterdeckung als Befund (Einheit, Betrag, Regel), dazu übersprungene Mandate mit Grund, samt vorschlagHash, den ein Mensch mit POST bestätigt. Schreibt nichts.
operationId: getSevHausgeldVorschlag · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
monat | query | ja | string | Monat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Vorschlag (SevHausgeldVorschlagResponse) | SevHausgeldVorschlagResponse |
400 | fehlender oder ungültiger Monat (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/sev-hausgeld
Monatslauf eines Objekts nach der Mietgutschrift in zwei Runden über diese eine Route. Runde 1 (Body mit verguetungen: je Mandat mandatId und vorschlagHash des gesehenen Vergütungsvorschlags) prüft alle Vergütungs-Hashes vor der ersten Buchung, bucht die Vergütungen und antwortet mit hausgeldStatus 'nicht_bestaetigt' und dem Hausgeld-Vorschlag, der nach der Vergütung gilt, samt vorschlagHash. Runde 2 (Body mit diesem vorschlagHash) bezahlt das Hausgeld aus der vereinnahmten Miete: Belastung des Verrechnungskontos (Art hausgeld_an_weg) und Ausgleich der Hausgeld-Sollstellung bzw. Ausgabe an den Kreditor (Festbetrag); danach die Zuführung zur Sonderrücklage. Bei Unterdeckung gilt die Regel des Mandats (einziehen / nicht zahlen / aus der Sonderrücklage). Die Mietgutschrift des Monats muss freigegeben sein. Eine Wiederholung mit demselben Idempotency-Key bucht nichts doppelt.
operationId: zahleSevHausgeld · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevHausgeldZahlenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Laufergebnis (SevHausgeldZahlungResponse) | SevHausgeldZahlungResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt, fremder Tenant ODER ein Mandat in verguetungen gehört nicht zu diesem Objekt (ApiErrorBody, code not_found) | |
409 | Vorschlag geändert (Vergütungs- oder Hausgeld-vorschlagHash, auch: bereits bezahlt), Mietgutschrift des Monats nicht freigegeben, gleichzeitiger Lauf ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/sev-mietgutschrift
Legt die monatliche Mietgutschrift der SEV-Mandate des Objekts für eine Periode als Vorschläge vor — Grundlage je Vereinbarung die eingegangene Miete (Buchungsdatum im Monat), die sollgestellte Miete oder ein Festbetrag; eine Periode aus mehreren Monaten ist die Summe der Einzelmonate. Idempotent je Mandat und Monat: ein zweiter Lauf legt nichts vor, eine nachträgliche Zahlung ergibt eine Nachgutschrift über die Differenz. Mandate ohne Mietinkasso werden übersprungen und ausgewiesen.
operationId: legeSevMietgutschriftenVor · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevMietgutschriftLaufRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Ergebnis des Laufs (SevMietgutschriftLaufResponse) | SevMietgutschriftLaufResponse |
400 | ungültige Eingabe ODER keine lückenlose Monatsfolge (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | nicht zuständig für das Objekt ODER kein Schreibrecht (ApiErrorBody, code forbidden) | |
409 | Reihenfolge-Sperre: die Miet-Sollstellung eines Monats ist für das Objekt nicht abgeschlossen — die Meldung nennt den fehlenden Schritt ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
GET/api/objekt/{id}/sonderumlage
Listet die Sonderumlagen eines Objekts, aufsteigend nach Fälligkeit, mit Zweck, Gesamtbetrag, Zahlweise, Raten-Fälligkeiten, Kennzeichen `gestellt` und der Tatsache `schluesselAbweichung`. Ein Objekt ohne Sonderumlagen ist eine leere Liste.
operationId: listeObjektSonderumlagen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die Sonderumlagen des Objekts (SonderumlageListeResponse) | SonderumlageListeResponse |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
POST/api/objekt/{id}/sonderumlage
Legt eine Sonderumlage mit Beschluss-Teilgegenstand, Zweck, Fälligkeit, Zahlweise (Einmalzahlung oder Ratenplan) und Gesamtbetrag in Cent als Ziffern-String an; das Sonderkonto entsteht mit. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header). Ein Änderungs- oder Löschweg existiert bewusst nicht: eine Korrektur ist ein Zweitbeschluss mit eigener Sonderumlage.
operationId: legeObjektSonderumlageAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → SonderumlageAnlegenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die angelegte Sonderumlage mit Sonderkonto, Raten und Warnungen; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (SonderumlageAnlegenResponse) | SonderumlageAnlegenResponse |
400 | keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz fehlt oder gehört zu keinem Beschluss des Objekts, Zweck oder Fälligkeit fehlt, Betrag nicht positiv, Ratenplan widersprüchlich | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch | |
409 | am Beschluss-Teilgegenstand hängt schon eine Sonderumlage, oder der Schlüsselabgleich ist auf blockierend gestellt (ApiErrorBody, code conflict) | |
GET/api/objekt/{id}/sonderumlage/soll
Liest das gestellte Soll EINER Sonderumlage je Einheit und Rate mit Schuldnern (Eigentümer am Fälligkeitstag, Innenverhältnis in Zehntausendsteln). Pflicht: Query `sonderumlageId`. Solange nicht sollgestellt, ist `einheiten` leer.
operationId: leseObjektSonderumlageSoll · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
sonderumlageId | query | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | das Soll der Sonderumlage (SonderumlageSollResponse) | SonderumlageSollResponse |
400 | keine UUID oder `sonderumlageId` fehlt bzw. ist keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Sonderumlage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — alle Fälle identisch | |
POST/api/objekt/{id}/sonderumlage/soll
Stellt eine Sonderumlage Soll: Verteilung nach Miteigentumsanteil auf die Einheiten, Teilung in Raten, Schuldner je Rate ist der Eigentümer am Fälligkeitstag. Append-only: ein zweiter Aufruf stellt nichts neu und antwortet mit `ausgang` bereits_ausgefuehrt (Erfolg). Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).
operationId: stelleObjektSonderumlageSoll · Auth: bearerAuth
Request-Body (Pflicht): application/json → SonderumlageSollStellenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | das gestellte Soll je Einheit; `ausgang` ausgefuehrt, oder bereits_ausgefuehrt, wenn das Soll schon stand (SonderumlageSollStellenResponse) | SonderumlageSollStellenResponse |
400 | keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz des abweichenden Schlüssels gehört zu keinem Beschluss des Objekts | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Sonderumlage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — alle Fälle identisch | |
409 | Zustandskonflikt (ApiErrorBody, code conflict): Pflichtinhalt des Beschlusses fehlt (Zweck, Fälligkeit oder Ratenplan), der Miteigentumsanteil fehlt an einer Einheit, eine Einheit hat am Fälligkeitstag keinen Eigentümer (Eigentümerlücke), der Lauf-Typ ist nicht verdrahtet oder der Schlüsselabgleich ist blockierend | |
POST/api/objekt/{id}/steuerpflichtige-erloeskonten
Zieht am Objekt die steuerpflichtigen Gegenkonten der Sollstellungs-Erlöskonten und das USt-Konto 1776 nach und hält den Stichtag der Sollversteuerung fest (#5992).
operationId: ensureSteuerpflichtigeErloeskonten · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | nachgezogen: { propertyId, gueltigAb (wirksamer Stichtag oder null), created[], skipped[] } mit { accountNo, name }, unvertraeglich[] mit { accountNo, befund }. Wiederholung ist harmlos: vorhandene Konten bleiben unangetastet, ein Stichtag wandert nie. Ist ein vorhandenes Konto gleicher Nummer nicht exakt das der Werksvorlage (Kontoart, DATEV 8400/1776, USt-Satz), steht es in unvertraeglich und es wird KEIN Stichtag gesetzt. | |
400 | ungültige Eingabe ODER Objekt archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/objekt/{id}/vermoegensbericht
Listet die abgelegten Vermögensberichts-Stände eines Objekts (§ 28 Abs. 4 WEG). Ältere Stände verschwinden NICHT (GoBD) — sie tragen ihre `standNr`, der jüngste Stichtag zuerst.
operationId: listObjektVermoegensberichtStaende · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | nein | string(date) | Grenzt auf EINEN Stichtag ein (`YYYY-MM-DD`). Ohne Angabe erscheinen alle Stichtage; ein Objekt ohne Stand ergibt eine LEERE Liste, keinen Fehler. |
| Status | Bedeutung | Body |
|---|
200 | die abgelegten Stände des Objekts (VermoegensberichtStandListResponse) | VermoegensberichtStandListResponse |
400 | keine UUID ODER `stichtag` ist kein `YYYY-MM-DD` (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/vermoegensbericht
Erzeugt den Vermögensbericht eines Objekts zum Stichtag und legt ihn als NEUEN Stand ab. Der Idempotenz-Schlüssel kommt vom Aufrufer: zwei Aufrufe am selben Schlüssel ergeben GENAU EINEN Stand. Readiness- und Konsistenz-Befunde stehen in der Antwort.
operationId: legeObjektVermoegensberichtAb · Auth: bearerAuth
Request-Body (Pflicht): application/json → VermoegensberichtAblageRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | der abgelegte Stand samt Readiness- und Konsistenz-Befunden (VermoegensberichtAblageResponse) | VermoegensberichtAblageResponse |
400 | ungültige Eingabe ODER eine Fachablehnung des Rechenkerns — etwa eine Zusatzposition ohne Beleg-Referenz (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | zu diesem Idempotenz-Schlüssel ist der Bericht bereits abgelegt — es entsteht KEIN zweiter Stand (ApiErrorBody, code conflict). Der vorhandene Stand ist über die Liste lesbar. | |
GET/api/objekt/{id}/versammlung
Liest die Versammlungen (und Umlaufbeschlüsse) eines Objekts, jüngstes Versammlungsdatum zuerst.
operationId: listObjektVersammlungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Versammlungen des Objekts (VersammlungListResponse) | VersammlungListResponse |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/versammlung
Legt eine Versammlung oder einen Umlaufbeschluss an. Einladungsfrist unter 3 Wochen: Hinweis im Ergebnis und Begründung Pflicht, keine Sperre.
operationId: legeObjektVersammlungAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungAnlegenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
201 | angelegte Versammlung samt Hinweisen zur Einladungsfrist (VersammlungSchreibResponse) | VersammlungSchreibResponse |
400 | ungültige Eingabe, Begründung bei unterschrittener Einladungsfrist fehlt (einladungsfrist-begruendung-fehlt) ODER Umlaufbeschluss mit Einladung/Stimmprinzip (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/objekt/{id}/wirtschaftsplan
Listet die Versionen der Wirtschaftspläne eines Objekts (optional eines Wirtschaftsjahres). Ein Jahr ohne Plan ergibt eine LEERE Liste, keinen Fehler.
operationId: listObjektWirtschaftsplanVersionen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
jahr | query | nein | integer | Nur dieses WIRTSCHAFTSJAHR. |
| Status | Bedeutung | Body |
|---|
200 | die Versionen, Jahr und Version aufsteigend (WirtschaftsplanVersionenResponse) | WirtschaftsplanVersionenResponse |
400 | keine UUID ODER `jahr` ist keine ganze Zahl (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/objekt/{id}/wirtschaftsplan
Legt den Wirtschaftsplan eines Objekts für ein Wirtschaftsjahr als Version 1 an (lege_wirtschaftsplan_an). Geld ist ein Objekt {cents, currency}. Die Objekt-Id kommt ausschliesslich aus dem Pfad.
operationId: legeObjektWirtschaftsplanAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → WirtschaftsplanAnlegenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die angelegte Version 1 im Status entwurf (WirtschaftsplanVersionResponse) | WirtschaftsplanVersionResponse |
400 | ungültige Eingabe, unbekanntes Feld oder unzulässiges Wirtschaftsjahr (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | für Objekt und Jahr gibt es schon einen Plan — Änderungen laufen über den Entwurf als neue Version (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/wirtschaftsplan/beschluss
Beschließt eine Version im Status entwurf (beschliesse_wirtschaftsplan): prüft das Beschluss-Gate, bindet den Plan append-only an den tragenden Teil-Gegenstand und setzt ihn auf beschlossen. Ohne tragenden Beschluss bleibt der Plan Entwurf. Dieselbe Referenz noch einmal ist ein No-op (bereits_beschlossen). Die Objekt-Id kommt ausschliesslich aus dem Pfad.
operationId: beschliesseObjektWirtschaftsplan · Auth: bearerAuth
Request-Body (Pflicht): application/json → WirtschaftsplanBeschliessenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | der beschlossene Plan mit seiner Bindung (WirtschaftsplanBeschliessenResponse) | WirtschaftsplanBeschliessenResponse |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Plan unbekannt ODER fremder Tenant ODER Beschluss unbekannt (ApiErrorBody, code not_found) | |
409 | der Beschluss trägt nicht, der Plan ist kein Entwurf, es gibt eine neuere Version oder er ist schon unter anderer Referenz beschlossen (ApiErrorBody, code conflict) | |
POST/api/objekt/{id}/wirtschaftsplan/entwurf
Bearbeitet den Entwurf: legt eine NEUE Version mit der vollständigen Positionsliste an (bearbeite_wirtschaftsplan_entwurf); die alte Version bleibt unverändert.
operationId: bearbeiteObjektWirtschaftsplanEntwurf · Auth: bearerAuth
Request-Body (Pflicht): application/json → WirtschaftsplanEntwurfRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die neue Version im Status entwurf (WirtschaftsplanVersionResponse) | WirtschaftsplanVersionResponse |
400 | ungültige Eingabe, unbekanntes Feld oder unzulässiges Wirtschaftsjahr (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant ODER für das Jahr gibt es noch keinen Plan (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/wirtschaftsplan/hausgeld-soll
Übernimmt den geltenden beschlossenen Wirtschaftsplan ins Hausgeld-Soll und stellt es fällig (uebernehme_wirtschaftsplan_ins_hausgeld_soll). Ohne Zahlen des Aufrufers: Monatsbetrag = Jahresanteil auf zwölf Monate, Rücklage getrennt, rückwirkende Differenzen nur als Vorschlag. Ohne eigenen Plan im Jahr gilt der letzte beschlossene Plan weiter, wenn der Beschluss die Fortgeltung trägt (quelle fortgeltung).
operationId: uebernehmeObjektWirtschaftsplanInsHausgeldSoll · Auth: bearerAuth
Request-Body (Pflicht): application/json → WirtschaftsplanUebernahmeRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | das gestellte Soll plus Herkunft des Plans (WirtschaftsplanUebernahmeResponse) | WirtschaftsplanUebernahmeResponse |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Plan unbekannt ODER fremder Tenant ODER Beschluss unbekannt (ApiErrorBody, code not_found) | |
409 | kein geltender Plan (plan-fehlt), Fortgeltung bei abweichendem Wirtschaftsjahr oder ein anderer Geldkreis (ApiErrorBody, code conflict) | |
GET/api/objekt/{id}/wirtschaftsplan/stand
Liest EINE Version eines Wirtschaftsplans. Mit `vergleichMit` liefert die Antwort zusätzlich den Diff von dieser Version zur genannten; mit `berechnung=true` Gesamtplan, Einzelpläne mit Monatsbeträgen und Befunde, serverseitig aus Positionen und Stammdaten gerechnet.
operationId: getObjektWirtschaftsplanStand · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
jahr | query | ja | integer | Das WIRTSCHAFTSJAHR. |
version | query | ja | integer | Die Version. |
vergleichMit | query | nein | integer | Eine andere Version desselben Jahres; liefert den Diff. |
berechnung | query | nein | boolean | `true` liefert die Berechnung. |
| Status | Bedeutung | Body |
|---|
200 | der Stand (WirtschaftsplanStandResponse) | WirtschaftsplanStandResponse |
400 | keine UUID ODER `jahr`/`version`/`vergleichMit` fehlt oder ist keine ganze Zahl, `berechnung` weder true noch false (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Version unbekannt ODER fremder Tenant — dieselbe Meldung (ApiErrorBody, code not_found) | |
POST/api/objekt/{id}/wirtschaftsplan/verwerfen
Verwirft eine Version im Status entwurf (verwirf_wirtschaftsplan); ihre Positionen bleiben lesbar. Ein beschlossener oder bereits verworfener Plan bleibt unverändert.
operationId: verwirfObjektWirtschaftsplan · Auth: bearerAuth
Request-Body (Pflicht): application/json → WirtschaftsplanVerwerfenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die verworfene Version (WirtschaftsplanVerwerfenResponse) | WirtschaftsplanVerwerfenResponse |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt oder Version unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | die Version ist kein Entwurf mehr (ApiErrorBody, code conflict) | |
offene-posten
GET/api/offene-posten
Liest die offenen Posten des Mandanten samt der drei getrennten Summen (Rückstand · Guthaben · Saldo).
operationId: listOffenePosten · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
propertyId | query | nein | string(uuid) | Auf EIN Objekt eingrenzen (Filter, keine Autorisierung). |
contractId | query | nein | string(uuid) | Auf EINEN Debitor eingrenzen. |
geldkreis | query | nein | miete | weg_hausgeld | sev | |
menge | query | nein | offen | alle | `offen` (Default) = die Arbeitsliste (offen/teilweise); `alle` zusätzlich die erledigten Posten. |
richtung | query | nein | forderung | guthaben | verbindlichkeit | Weggelassen ⇒ ALLE Richtungen. Kein Default auf `forderung` — sonst verschwänden Guthaben aus der Standardsicht. |
dueFrom | query | nein | string(date) | Untere Grenze der Fälligkeits-Achse (einschließlich). |
dueTo | query | nein | string(date) | Obere Grenze der Fälligkeits-Achse (einschließlich). |
stichtag | query | nein | string(date) | Stichtag der Verzugstage; weggelassen ⇒ heute. |
archiveScope | query | nein | alle | aktiv | archiviert | 3-Wege-Filter auf die Archiv-Kette; Default `aktiv`. Der Read filtert, er verschweigt nichts — `alle` liefert auch archivierte Objekte. |
asOf | query | nein | string(date) | Stichtag der Archiv-Achse. OHNE asOf misst der Read auf `archived_at` (Betriebs-Default), MIT asOf auf dem Verwaltungszeitraum. |
| Status | Bedeutung | Body |
|---|
200 | Posten + Summen aus DERSELBEN Projektion (ADR 0011, INV-OP-01). Alle Cent-Felder sind vorzeichenbehaftete Integer-STRINGS, nie JSON-numbers. Rückstand, Guthaben und Saldo stehen GETRENNT: „Rückstand gesamt" ist rueckstandCents — dort verschwindet kein Mahnfall hinter einem fremden Guthaben. | OffenePostenListResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
option
GET/api/option
Listet Options-Zeilen (optionaler Filter scopeType/scopeId/key).
operationId: listOptions · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
scopeType | query | nein | tenant | objekt | einheit | vertrag | tenant | objekt | einheit | vertrag |
scopeId | query | nein | string(uuid) | Ziel-UUID der Ebene |
key | query | nein | string | |
| Status | Bedeutung | Body |
|---|
200 | Options-Liste (OptionListResponse) | OptionListResponse |
400 | ungültiger Filter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/option
Setzt/überschreibt eine gescopte Option (Upsert je scope+key).
operationId: setOption · Auth: bearerAuth
Request-Body (Pflicht): application/json → OptionSetRequest
| Status | Bedeutung | Body |
|---|
200 | gesetzte Option (OptionSetResponse); created unterscheidet neu vs. überschrieben | |
400 | ungültige Eingabe (unbekannter scope_type, fehlende scope_id, fehlender value …) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/option/effective
Löst den effektiven Wert eines Schlüssels über die Kandidaten-Scopes auf (spezifischster gewinnt).
operationId: resolveOption · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
key | query | ja | string | |
objektId | query | nein | string(uuid) | Objekt-Ebene in die Auflösung einbeziehen |
einheitId | query | nein | string(uuid) | Einheiten-Ebene einbeziehen |
vertragId | query | nein | string(uuid) | Vertrags-Ebene einbeziehen |
| Status | Bedeutung | Body |
|---|
200 | effektiver Wert (OptionResolveResponse); found:false ⇒ nirgends gesetzt | OptionResolveResponse |
400 | fehlender key ODER ungültige Scope-Referenz (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
person
GET/api/person
Listet Personen (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv).
operationId: listPersonen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | archiviert | alle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback. |
| Status | Bedeutung | Body |
|---|
200 | Personenliste (PersonListResponse) | PersonListResponse |
400 | ungültiger status-Filter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/person
Legt eine Person im Adressbuch an.
operationId: createPerson · Auth: bearerAuth
Request-Body (Pflicht): application/json → PersonCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegte Person (Person) | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
GET/api/person/{id}
Liest EINE Person (auch archiviert).
operationId: getPerson · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Person | Person |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
PATCH/api/person/{id}
Ändert Personen-Stammfelder (nur nicht-archivierte Personen).
operationId: updatePerson · Auth: bearerAuth
Request-Body (Pflicht): application/json → PersonUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geänderte Person | |
400 | leerer/ungültiger Patch ODER Person archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/person/{id}/archive
Archiviert eine Person (archived_at statt DELETE, K5). Ihre Rollen bleiben unberührt.
operationId: archivePerson · Auth: bearerAuth
Request-Body (optional): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | archiviert (PersonArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). Schon archiviert ⇒ alreadyArchived: true, der erste Grund bleibt. | |
400 | keine UUID ODER ungültiger Body (kein JSON-Objekt, unbekanntes Feld, ungültiger grund) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
posteingang
GET/api/posteingang
Listet die Freigabe-Inbox (wartende Buchungsvorschläge des aufrufenden Tenants).
operationId: listPosteingang · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | wartende Vorschläge (PosteingangListResponse) | PosteingangListResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
rechte
POST/api/rechte/objekt
Setzt eine Objekt-Zuständigkeit (set_object_responsibility), optional an eine Fähigkeit (Rolle) gebunden.
operationId: setObjektZustaendigkeit · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | gesetzt (userId, propertyId, assignmentId, roleId, roleKey, alreadyAssigned). `roleId`/`roleKey` sind `null`, wenn ohne `roleKey` (bzw. mit `roleKey: null`) gesetzt — gilt dann für alle Fähigkeiten. | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | unbekanntes Objekt ODER fremder Tenant ODER unbekannte Rolle (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/rechte/objekt/entziehen
Entzieht eine Objekt-Zuständigkeit (revoke_object_responsibility, wirkt sofort), optional rollenscharf.
operationId: revokeObjektZustaendigkeit · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | entzogen (userId, propertyId, roleId, roleKey, revoked). `roleId`/`roleKey` sind `null`, wenn ohne `roleKey` entzogen (alle Bindungen) — sonst der adressierte Rollenbezug. Ohne aktive Zuständigkeit sichtbarer No-op (revoked:false). | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/rechte/rolle
Weist einem User eine Rolle zu (assign_role, RLS-tenant-gebunden).
operationId: assignRolle · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | zugewiesen (userId, roleId, roleKey, alreadyAssigned) | |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannte Rolle ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
rolle
GET/api/rolle
Listet Rollen (3-Wege-Gültigkeitsfilter Alle/Aktiv/Beendet, Default aktiv).
operationId: listRollen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | beendet | alle | aktiv | beendet (Default aktiv). Gemessen an der GÜLTIGKEIT, nicht an einem archived_at (das hat party_roles nicht). aktiv ∪ beendet ≠ alle: zukünftige Rollen erscheinen nur unter `alle`. Unbekannter Wert ⇒ 400. |
person | query | nein | string(uuid) | nur Rollen dieser Person (UUID) |
asOf | query | nein | string(date) | Stichtag YYYY-MM-DD, gegen den aktiv/beendet gemessen wird (Default: heute, UTC). |
| Status | Bedeutung | Body |
|---|
200 | Rollenliste (RolleListResponse) | RolleListResponse |
400 | ungültiger status-Filter, person-UUID oder Stichtag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/rolle
Vergibt einer Person eine Rolle an Objekt ODER Einheit (mit Gültigkeit).
operationId: assignRolle · Auth: bearerAuth
Request-Body (Pflicht): application/json → RolleAssignRequest
| Status | Bedeutung | Body |
|---|
201 | vergebene Rolle (Rolle) | |
400 | ungültige Eingabe, kein/zwei Ziele oder unplausible Gültigkeit (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Person ODER Rollen-Ziel unbekannt, archiviert oder fremder Tenant (ApiErrorBody, code not_found). Die Ziel-Prüfung leistet der Tool-Layer — die Ziel-Spalten tragen KEINE Fremdschlüssel. | |
POST/api/rolle/{id}/end
Beendet eine Rolle zum Stichtag (obere valid_range-Grenze statt DELETE, K5).
operationId: endRolle · Auth: bearerAuth
Request-Body (Pflicht): application/json → RolleEndRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | beendet (RolleEndResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses. | |
400 | ungültiges/unplausibles Enddatum (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
schadenfall
GET/api/schadenfall
Liest die Schadenfälle des Mandanten, begrenzt auf die Objekte mit Zuständigkeit des Aufrufers, neueste Schäden zuerst: Nummer, Status, Schadensdatum, Schadenart, Objekt, Schadenssumme (Cent als Integer-STRING) und Zahl der Befunde. Filter propertyId, status (kommagetrennt), versicherungsvertragId, instandhaltungVorgangId, nurOffen (ohne abgeschlossen), limit (Vorgabe 50, höchstens 200) und offset. Nur lesend.
operationId: getSchadenfallListe · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
propertyId | query | nein | string(uuid) | |
status | query | nein | string | |
versicherungsvertragId | query | nein | string(uuid) | |
instandhaltungVorgangId | query | nein | string(uuid) | |
nurOffen | query | nein | true | false | |
limit | query | nein | integer | |
offset | query | nein | integer | |
| Status | Bedeutung | Body |
|---|
200 | { stichtag, zeilen[], gesamt, limit, offset } — leer ohne Schadenfälle; Geld ist ein Integer-STRING in Cent. | SchadenfallListeResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder unbekannter Statuswert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/schadenfall
Erfasst einen Schadenfall (Status erfasst): propertyId, schadensdatum (nicht nach heute), schadenart, beschreibung; optional unitId, versicherungsvertragId und instandhaltungVorgangId (beide desselben Objekts).
operationId: legeSchadenfallAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → SchadenfallAnlegenRequest
| Status | Bedeutung | Body |
|---|
200 | Schadenfall-Id, Nummer, Status, Selbstbehalt und Befunde. | SchadenfallErgebnis |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Objekt, Einheit, Vertrag oder Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
GET/api/schadenfall/{id}
Liest EINEN Schadenfall: Kopf, Versicherungsvertrag, Instandhaltungs-Vorgang, Befunde, Bilanz (Schadenssumme, Selbstbehalt, erwartete und tatsächliche Erstattung, Differenz), Erstattungen mit Buchungsstand (gebucht | vorgeschlagen) und den Honorar-Vorschlag, der nicht automatisch abgerechnet wird. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr). Nur lesend.
operationId: getSchadenfall · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | nein | string(date) | |
| Status | Bedeutung | Body |
|---|
200 | Der Schadenfall mit allen Bestandteilen; Geld ist ein Integer-STRING in Cent. | SchadenfallResponse |
400 | ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/schadenfall/{id}/abschluss
Schließt den Schadenfall ab (optional begruendung); ohne Versicherungsbezug ist eine Begründung Pflicht. Die Schadenfall-Id steht im Pfad.
operationId: schliesseSchadenfall · Auth: bearerAuth
Request-Body (Pflicht): application/json → SchadenfallAbschlussRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Schadenfall-Id, vorheriger Status, Begründung, Bilanz und Befund. | SchadenfallAbschlussResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Der Status des Schadenfalls erlaubt den Abschluss nicht (ApiErrorBody, code conflict) | |
POST/api/schadenfall/{id}/deckung
Erfasst die Deckungsentscheidung des Versicherers: entscheidung (zugesagt | abgelehnt), deckungAm, optional schadenssumme und selbstbehalt als Geld-Objekt {cents, currency}. Die Schadenfall-Id steht im Pfad.
operationId: erfasseSchadenfallDeckung · Auth: bearerAuth
Request-Body (Pflicht): application/json → SchadenfallDeckungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Schadenfall-Id, Nummer, Status, Selbstbehalt, Schadenssumme und Befunde. | SchadenfallDeckungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Der Status des Schadenfalls erlaubt die Entscheidung nicht (ApiErrorBody, code conflict) | |
POST/api/schadenfall/{id}/erstattung
Ordnet einen Bankumsatz als Erstattung zu. Die Buchung entsteht als Vorschlag und wird erst nach der Freigabe gebucht. Der Fall muss auf Deckung zugesagt oder reguliert stehen; ein Umsatz gehört höchstens einem Schadenfall. Die Schadenfall-Id steht im Pfad.
operationId: erfasseSchadenfallErstattung · Auth: bearerAuth
Request-Body (Pflicht): application/json → SchadenfallErstattungRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Erstattung, Bilanz und der Buchungsvorschlag (nicht gebucht). | SchadenfallErstattungResponse |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Bankumsatz schon einem Schadenfall zugeordnet oder der Fall steht nicht auf Deckung zugesagt oder reguliert (ApiErrorBody, code conflict) | |
POST/api/schadenfall/{id}/meldung
Hält die Meldung an den Versicherer fest: gemeldetAm, optional aktenzeichen und versicherungsvertragId. Eine verstrichene Meldefrist ist ein Befund (meldefrist-verstrichen); die Meldung wird trotzdem festgehalten. Die Schadenfall-Id steht im Pfad.
operationId: meldeSchadenfallVersicherer · Auth: bearerAuth
Request-Body (Pflicht): application/json → SchadenfallMeldenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Schadenfall-Id, Nummer, Status gemeldet, Selbstbehalt und Befunde. | SchadenfallErgebnis |
400 | ungültige Nutzlast (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Recht fehlt (ApiErrorBody, code forbidden) | |
404 | Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Schadenfall steht in einem Status, in dem die Meldung nicht möglich ist (ApiErrorBody, code conflict) | |
sev-mandat
POST/api/sev-mandat/{id}/anfangsbestand
Übernimmt den Anfangsbestand des Eigentümer-Verrechnungskontos eines SEV-Mandats aus dem Altbestand — eine Buchung im Geldkreis Sondereigentum (Verrechnungskonto gegen Gegenkonto DESSELBEN Mandats), die in keiner Sicht der offenen Posten erscheint. Der Betrag erscheint als Saldo ab dem Stichtag selbst, der Stichtag zählt inklusiv (GET /api/sev-mandat/{id}/verrechnungskonto). Genau ein aktiver Anfangsbestand je Mandat.
operationId: erfasseSevAnfangsbestand · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevAnfangsbestandRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geschriebene Anfangsbestands-Buchung (SevAnfangsbestandResponse) | SevAnfangsbestandResponse |
400 | ungültige Eingabe, Betrag 0 oder ausserhalb des speicherbaren Bereichs, Stichtag in der Zukunft, Mandat ohne Verrechnungskonto (ohne Mietinkasso) ODER Konto archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | bereits ein aktiver Anfangsbestand erfasst ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
POST/api/sev-mandat/{id}/beenden
Beendet einen SEV-Zeitabschnitt zu einem Datum. Beendet heisst GEKÜRZT, nicht gelöscht: die Historie bleibt stehen, damit eine bereits abgerechnete SEV-Periode erklärbar bleibt. Kürzen nur — ein Ende nach einem bestehenden Ende und ein Ende am Beginntag werden abgewiesen; dasselbe Ende ein zweites Mal ist ein No-op-Erfolg.
operationId: beendeSevMandat · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevMandatBeendenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | beendete Vereinbarung (SevMandatBeendenResponse) | |
400 | ungültiges Datum, Ende am oder vor dem Beginn ODER Ende nach einem bereits gesetzten Ende (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | am oder nach dem Ende liegen noch geltende Angaben des Eigentümers für die Mieterabrechnung — erst aufheben, dann beenden (ApiErrorBody, code conflict) | |
GET/api/sev-mandat/{id}/eigentuemerabrechnung
Jahresabrechnung der Sondereigentumsverwaltung für den Eigentümer über einen Zeitraum: Einnahmen, Ausgaben und Auszahlungen je Buchungsart (Klasse nach Art, nie nach Vorzeichen), Mieteinnahmen mit Soll, Ist, Ausfall und Ertrag je m², Kosten der Wohnung und die Entwicklung des Geldbestands mit Probe gegen den Saldo des Verrechnungskontos, dazu der Empfänger mit Anrede und Anschrift. Schreibt nichts.
operationId: ladeSevEigentuemerabrechnung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
von | query | ja | string(date) | Erster Tag des Zeitraums YYYY-MM-DD (inklusiv, nach Buchungsdatum). Fehlend oder kein Kalendertag ⇒ 400. |
bis | query | ja | string(date) | Letzter Tag des Zeitraums YYYY-MM-DD (inklusiv, nach Buchungsdatum). Fehlend, kein Kalendertag oder vor von ⇒ 400. |
mitAuszahlung | query | nein | true | false | true (Vorgabe) oder false: false blendet die Positionen des Auszahlungsblocks aus — Summe und Geldbestand zählen die Auszahlungen trotzdem. Ein anderer Wert ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Die Abrechnung (SevEigentuemerabrechnungResponse) | SevEigentuemerabrechnungResponse |
400 | fehlender oder ungültiger Zeitraum, von nach bis, ungültiges mitAuszahlung, unbekannter Query-Parameter ODER Mandat ohne Mietinkasso (kein Verrechnungskonto) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt, fremder Tenant ODER Objekt nicht zuständig — dieselbe Antwort (ApiErrorBody, code not_found) | |
422 | Empfänger unvollständig: Name, Anrede oder Anschrift des Eigentümers fehlt — kein Ausdruck mit leerem Adressfeld (ApiErrorBody, code invalid_request) | |
GET/api/sev-mandat/{id}/ertragsumbuchung
Die Ertragsumbuchungen eines SEV-Mandats in beiden Richtungen (Abgang an den neuen, Zugang vom bisherigen Eigentümer) mit Zeitraum und Beleg.
operationId: listSevErtragsumbuchungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Die Umbuchungen (SevErtragsumbuchungListResponse). ACHTUNG PII: `beleg.bezeichnung` ist Freitext des Verwalters (Kategorie freitext). | SevErtragsumbuchungListResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found) | |
POST/api/sev-mandat/{id}/ertragsumbuchung
Bucht Mieterträge eines Zeitraums vom Mandat im Pfad (alter Eigentümer) auf das Mandat `nachMandatId` (neuer Eigentümer derselben Wohnung) um — eigene Buchungsart mit Beleg, auf beiden Verrechnungskonten ausgewiesen, beide Seiten in EINER Transaktion. Höchstens die im Zeitraum gutgeschriebene, noch nicht umgebuchte Miete.
operationId: bucheSevErtragsumbuchung · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevErtragsumbuchungBuchenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Die gebuchte Umbuchung (SevErtragsumbuchungBuchenResponse) | SevErtragsumbuchungBuchenResponse |
400 | ungültige Eingabe (Zeitraum leer, Betrag, Beleg fehlt, Zusatzfeld) ODER die Mandate betreffen verschiedene Wohnungen (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | ein Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | der Betrag übersteigt die im Zeitraum gutgeschriebene, noch nicht umgebuchte Miete ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
POST/api/sev-mandat/{id}/mieter-handwert
Trägt bei SEV OHNE Mietinkasso eine Angabe des Eigentümers für die Mieterabrechnung ein (erfasse_sev_mieter_handwert): eine Vorauszahlung des Mieters oder umlagefähige Kosten der Wohnung, Herkunft „Angabe Eigentümer". Identität einer Angabe ist ihre handwertId, nie ihr Inhalt: ohne handwertId legt jeder Aufruf eine NEUE Angabe an (erfasst, Fassung 1) — auch zwei gleiche am selben Tag; eine Wiederholung schützt allein der Idempotency-Key. Mit handwertId wird genau diese Angabe des Mandats korrigiert (ersetzt, Fassung + 1; Datum, Betrag, Kostenart, Bezeichnung änderbar, die Art nicht); gleicht sie der geltenden Fassung ⇒ unveraendert. Mit aktion aufheben, handwertId und der gesehenen fassung wird die Angabe append-only aufgehoben (aufgehoben, Fassung + 1): sie fällt aus Liste und Abrechnung; endgültig, keine Korrektur danach. Nur durch einen Menschen.
operationId: erfasseSevMieterHandwert · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | erfasst, unverändert, ersetzt oder aufgehoben — { ergebnis, handwertId, mandatId, unitId, art, datum, betragCents, kostenart, bezeichnung, fassung, herkunft (angabe_eigentuemer), currency } | |
400 | ungültige Eingabe, Datum in der Zukunft oder außerhalb des Mandats, Mandat mit Mietinkasso ODER Korrektur mit anderer Art (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt ODER kein Mensch (ApiErrorBody, code forbidden) | |
404 | Mandat unbekannt ODER fremder Tenant ODER handwertId unter diesem Mandat unbekannt — dieselbe Antwort (ApiErrorBody, code not_found) | |
409 | Idempotency-Key an eine andere Eingabe gebunden, Angabe bereits aufgehoben ODER Aufhebung gegen eine veraltete Fassung (ApiErrorBody, code conflict) | |
GET/api/sev-mandat/{id}/rechnung
Die Rechnungen des Sondereigentums eines SEV-Mandats mit Kennzeichen (Kostenart, umlagefähig), Status (bezahlt, nicht_bezahlt, storniert) und Befund einer Unterdeckung.
operationId: listSevRechnungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Rechnungen des Mandats (SevRechnungListResponse) | SevRechnungListResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt, fremder Tenant ODER Objekt nicht zuständig (ApiErrorBody, code not_found) | |
POST/api/sev-mandat/{id}/rechnung
Bezahlt eine Rechnung des Sondereigentums aus der Miete des Eigentümers: Belastung des Verrechnungskontos (Art sonstige_ausgabe) mit Kennzeichen Kostenart + umlagefähig. Bei Unterdeckung entscheidet beiUnterdeckung (einziehen, nicht_zahlen, sonderruecklage) mit Befund. Die Rechnung erscheint in keiner Abrechnung der Gemeinschaft.
operationId: bucheSevRechnung · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevRechnungBuchenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gebucht, nicht bezahlt (mit Befund) oder unverändert (SevRechnungBuchenResponse) | SevRechnungBuchenResponse |
400 | ungültige Eingabe, unbekannte Kostenart, umlagefähig bei nie umlagefähiger Kostenart, Zahlungsdatum in der Zukunft, Unterdeckung ohne Entscheid ODER Mandat ohne Verrechnungskonto (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Mandat oder Beleg unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | dieselbe Rechnung (Kreditor + Rechnungsnummer) mit anderem Inhalt erfasst ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
GET/api/sev-mandat/{id}/schlussauszahlung
Vorschlag der Schlussauszahlung eines BEENDETEN SEV-Mandats (Ende erreicht): der GANZE Saldo des Verrechnungskontos — der Sockel wird nicht mehr einbehalten — an das Privatkonto des bisherigen Eigentümers, gesperrt bei offenen Hausgeld-Posten aus dem Mandatszeitraum, samt vorschlagHash, den ein Mensch mit POST bestätigt. Schreibt nichts.
operationId: getSevSchlussauszahlungVorschlag · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vorschlag (SevSchlussauszahlungVorschlagResponse). ACHTUNG PII: `empfaengerIban` ist eine IBAN (Kategorie bankdaten) — der Empfänger, den der Mensch vor dem Stellen sehen muss. | SevSchlussauszahlungVorschlagResponse |
400 | das Mandat nennt kein bestätigtes Privatkonto des Eigentümers (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found) | |
409 | das Mandat ist nicht beendet oder sein Ende ist noch nicht erreicht (ApiErrorBody, code conflict) | |
POST/api/sev-mandat/{id}/schlussauszahlung
Stellt die Schlussauszahlung nach Bestätigung des gesehenen Vorschlags (vorschlagHash): der Entnahme-Satz über den ganzen Saldo und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des bisherigen Eigentümers, abgehend vom angegebenen Objekt-Bankkonto. Ausgeführt wird erst nach der bestehenden Zahlungsfreigabe (Vier-Augen).
operationId: stelleSevSchlussauszahlung · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevSchlussauszahlungStellenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Die gestellte Schlussauszahlung samt Zahlungsauftrag (SevSchlussauszahlungStellenResponse) | SevSchlussauszahlungStellenResponse |
400 | ungültige Eingabe (u. a. ein Betrag oder eine IBAN im Body), das Bankkonto ist kein Konto des Objekts ODER kein Privatkonto (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Mandat nicht beendet, Vorschlag geändert (vorschlagHash), gesperrt (offene Posten, kein Überschuss) ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
GET/api/sev-mandat/{id}/sonderruecklage
Saldo der Sonderrücklage eines SEV-Mandats zum Stichtag (inklusiv) samt vereinbartem Höchststand — Geld des Eigentümers, getrennt vom Verrechnungskonto ausgewiesen und nicht Teil der Rücklage der Gemeinschaft. Zuführung (Monatslauf) und Entnahme (Unterdeckung) laufen im Tool-Layer.
operationId: getSevSonderruecklageSaldo · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | ja | string(date) | Stichtag YYYY-MM-DD (inklusiv). Pflicht — kein stilles „heute". Fehlend oder ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Saldo zum Stichtag (SevSonderruecklageSaldoResponse) | SevSonderruecklageSaldoResponse |
400 | fehlender oder ungültiger Stichtag ODER Mandat ohne Mietinkasso (dann gibt es keine Sonderrücklage) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt, fremder Tenant ODER Objekt nicht zuständig (ApiErrorBody, code not_found) | |
GET/api/sev-mandat/{id}/verguetung
Vorschlag der Verwaltervergütung eines SEV-Mandats für einen Monat — Fall (vermietet/Leerstand), Bemessungsgrundlage, Netto, USt und Brutto samt vorschlagHash, den ein Mensch mit POST bestätigt. Auf Ist-Basis folgt die Vergütung der Mietgutschrift des Monats.
operationId: getSevVerguetungVorschlag · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
monat | query | ja | string | Monat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Vorschlag (SevVerguetungVorschlagResponse) | SevVerguetungVorschlagResponse |
400 | fehlender oder ungültiger Monat, Monat ausserhalb des Mandatszeitraums ODER Mandat ohne Verrechnungskonto (ohne Mietinkasso) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Reihenfolge-Sperre: Ist-Basis ohne Mietgutschrift des Monats (ApiErrorBody, code conflict) | |
POST/api/sev-mandat/{id}/verguetung
Bucht die Verwaltervergütung eines SEV-Mandats für einen Monat nach Bestätigung des gesehenen Vorschlags (vorschlagHash): Belastung des Eigentümer-Verrechnungskontos (Art Verwaltervergütung) und Ertrag beim Verwalter, die USt getrennt ausgewiesen. Genau einmal je Mandat und Monat. Bis zum SEV-Monatslauf (#5218) ist diese Route der Einstieg.
operationId: bucheSevVerguetung · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevVerguetungBuchenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Ergebnis der Buchung (SevVerguetungBuchungResponse) | SevVerguetungBuchungResponse |
400 | ungültige Eingabe, Monat ausserhalb des Mandatszeitraums, Mandat ohne Verrechnungskonto (ohne Mietinkasso) ODER Konto archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Reihenfolge-Sperre (keine Mietgutschrift des Monats), Vorschlag geändert (vorschlagHash), abweichend gebucht, gleichzeitiger Lauf ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict) | |
GET/api/sev-mandat/{id}/verrechnungskonto
Saldo des Eigentümer-Verrechnungskontos eines SEV-Mandats zum Stichtag (inklusiv) — das Geld, das dem Eigentümer zusteht. Jeder Eigentümer hat sein eigenes Konto; eine Buchung beim einen ändert den Saldo des anderen nicht.
operationId: getSevVerrechnungskontoSaldo · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | ja | string(date) | Stichtag YYYY-MM-DD (inklusiv). Pflicht — kein stilles „heute". Fehlend oder ungültig ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Saldo zum Stichtag (SevVerrechnungskontoSaldoResponse) | SevVerrechnungskontoSaldoResponse |
400 | fehlender oder ungültiger Stichtag ODER Mandat ohne Verrechnungskonto (ohne Mietinkasso) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
sev-mietgutschrift
POST/api/sev-mietgutschrift/{id}/ablehnung
Lehnt einen Mietgutschrift-Vorschlag ab: seine Reservierung wird gelöst, ein Folgelauf legt neu vor. Nur ein Mensch lehnt ab.
operationId: lehneSevMietgutschriftAb · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Die gelösten Monate (SevMietgutschriftAblehnungResponse) | SevMietgutschriftAblehnungResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vorschlag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | bereits entschieden (ApiErrorBody, code conflict) | |
POST/api/sev-mietgutschrift/{id}/freigabe
Gibt einen Mietgutschrift-Vorschlag nach Bestätigung seines inhaltsHash frei: je Monat mit Anteil eine Buchung (Art Mietgutschrift) auf dem Verrechnungskonto des Eigentümers. Nur ein Mensch gibt frei.
operationId: gibSevMietgutschriftFrei · Auth: bearerAuth
Request-Body (Pflicht): application/json → SevMietgutschriftFreigabeRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Die Buchungen (SevMietgutschriftFreigabeResponse) | SevMietgutschriftFreigabeResponse |
400 | ungültige Eingabe ODER Konto archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vorschlag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Vorschlag geändert (inhaltsHash) ODER bereits entschieden (ApiErrorBody, code conflict) | |
sollstellung
POST/api/sollstellung
Startet einen Sollstellungslauf (start_sollstellungslauf) — Ergebnis sind VORSCHLÄGE, gebucht wird erst nach der Freigabe.
operationId: starteSollstellungslauf · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | Lauf gestartet — die Antwort zählt die erzeugten Vorschläge (neu/storno/ersatz) und die übersprungenen Debitoren. | SollstellungslaufStartResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | unbekanntes ODER fremdes Objekt (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | offene Readiness-Befunde ohne Begründung oder bereits ein offener Lauf (ApiErrorBody, code conflict) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
GET/api/sollstellung/{id}/vorschlaege
Liest die Vorschläge EINES Sollstellungslaufs — die `proposalIds`, die POST /api/sollstellung/freigabe erwartet.
operationId: listSollstellungVorschlaege · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | Der Sollstellungslauf. |
art | query | nein | neu | storno | ersatz | Auf EINE Vorschlagsart eingrenzen. Weggelassen ⇒ ALLE. Wer freigibt, will in der Regel alle: die kanonische Ordnung STORNO VOR ERSATZ ist die, in der INV-SOLL-01 zu keinem Zeitpunkt zwei wirksame Forderungen sieht — sie zu zerreissen ist eine bewusste Entscheidung des Aufrufers. |
nurOffene | query | nein | true | false | `true` ⇒ nur Vorschläge OHNE bindende Entscheidung — die Menge, die eine Freigabe noch annimmt. |
| Status | Bedeutung | Body |
|---|
200 | Kopf, Vorschläge und Readiness-Befunde des Laufs. `betragCents` ist ein vorzeichenbehafteter Integer-STRING, nie eine JSON-number. Die `ampel` ist GELESEN (der Lauf hat sie gesetzt), nicht hier gerechnet. `bindetAktuellenStand` unterscheidet „noch nicht entschieden" von „Freigabe durch eine Korrektur ungültig geworden" — zwei Zustände, die in einem einzelnen Boolean verschmelzen würden. Die `befunde` stehen NEBEN den Vorschlägen: „für diesen Vertrag ist nichts entstanden" darf nicht als „Lauf leer" ankommen. | SollstellungVorschlaegeResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel, insbesondere kein 403) | |
POST/api/sollstellung/freigabe
Gibt die Vorschläge eines Sollstellungslaufs in EINEM Zug frei (batch_approve_proposals) — ALL-GREEN, keine Teil-Freigabe.
operationId: gibSollstellungFrei · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
201 | Freigegeben. Je Element reist der contentHash mit — der Beleg, an den die Freigabe bindet (INV-APPROVAL-01). | SollstellungFreigabeResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | fehlende Step-up-Frische oder keine Zuständigkeit (ApiErrorBody, code forbidden — fail-closed) | |
404 | unbekannter ODER fremder Vorschlag (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | bereits entschieden oder nicht durchgehend grün (ApiErrorBody, code conflict) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
sondereigentumsverwaltung
GET/api/sondereigentumsverwaltung/stand
Liest den Monatsstand der Sondereigentumsverwaltung eines Objekts: je SEV-Wohnung die erledigten und offenen Schritte, den Saldo des Eigentümers, Sockel und Sonderrücklage, die Unterdeckungen mit Betrag und den nächsten fälligen Schritt. Werte ohne Quelle stehen auf „nicht verfügbar", nie auf null.
operationId: liesSevMonatsstand · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Das Objekt (UUID) — Pflicht: der Monatsstand ist je Objekt, nicht mandantenweit. |
monat | query | ja | string | Der Monat als `JJJJ-MM` (Monat 01 bis 12). Ohne Monat gäbe es keinen Stand, sondern eine Momentaufnahme, die morgen anders lautet. |
| Status | Bedeutung | Body |
|---|
200 | Der Monatsstand (SevMonatsstandResponse). Beträge reisen als Integer-STRING in Cent, nie als JSON-number — und als `null`, sobald ihr `stand` nicht `bekannt` ist. ACHTUNG PII: `wohnungen[].eigentuemer` ist ein Personenname (Kategorie name); das ist die Auskunft, die bestellt wurde (Abnahme 4: Eigentümer mit Namen). | SevMonatsstandResponse |
400 | fehlendes/ungültiges Objekt oder ungültiger Monat (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
uebernahme
GET/api/uebernahme/abrechnungen
Listet die Abrechnungsläufe eines Objekts mit Herkunft und Kennzeichen „übernommen" (neueste zuerst).
operationId: listUebernahmeAbrechnungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
propertyId | query | ja | string(uuid) | Das Objekt, dessen Läufe gelistet werden. Ein fremdes oder unbekanntes Objekt liefert eine LEERE Liste (kein Existenz-Orakel). |
| Status | Bedeutung | Body |
|---|
200 | Läufe des Objekts, neueste zuerst; uebernommen ist true bei Herkunft `uebernahme`. | UebernahmeAbrechnungenListResponse |
400 | fehlende oder ungültige propertyId (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/uebernahme/abrechnungen
Übernimmt die festgeschriebene Abrechnung EINES früheren Zeitraums eines Objekts als Bestand (uebernehme_abrechnung_bestand).
operationId: uebernehmeAbrechnungBestand · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Status | Bedeutung | Body |
|---|
200 | Nur mit pruefen: true — die Vorschau: Summen, geplante Eröffnungsposten und das Siegel; es wurde nichts geschrieben. | UebernahmeAbrechnungVorschauResponse |
201 | übernommen (auch die Replay-Antwort bei gleichem Idempotency-Key hat diese Form; Eröffnungsposten mit replay true). | UebernahmeAbrechnungUebernommenResponse |
400 | ungültige Eingabe oder ein fachlich abgewiesener Rückstand (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed) | |
404 | Objekt, Vertrag oder Konto unbekannt ODER fremder Mandant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Zeitraum endet nicht vor dem Übernahmestichtag, für Objekt und Zeitraum existiert schon ein Lauf, ein offener Vertrag hat kein Personenkonto, das Ertragskonto ist kein Sachkonto, die Eröffnungsbuchung meldet einen vorhandenen Satz, oder der Idempotency-Key ist anders gebunden (ApiErrorBody, code conflict, Klartext) | |
503 | Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken) | |
umlageschluessel
GET/api/umlageschluessel
Listet die Umlageschlüssel (3-Wege-Archiv-Filter, optional auf Objekt/Abrechnungskreis eingegrenzt).
operationId: listUmlageschluessel · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | string | aktiv | archiviert | alle (Default aktiv) |
propertyId | query | nein | string(uuid) | nur Schlüssel dieses Objekts |
unitGroupId | query | nein | string(uuid) | nur auf diesen Kreis gescopte Schlüssel |
| Status | Bedeutung | Body |
|---|
200 | Schlüssel-Liste (UmlageschluesselListResponse) | UmlageschluesselListResponse |
400 | ungültiger Filter/UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/umlageschluessel
Legt einen Umlageschlüssel an einem aktiven Objekt an (optional schon gescoped).
operationId: createUmlageschluessel · Auth: bearerAuth
Request-Body (Pflicht): application/json → UmlageschluesselCreateRequest
| Status | Bedeutung | Body |
|---|
200 | angelegter Schlüssel (Umlageschluessel) | |
400 | ungültige Eingabe, Objekt archiviert ODER Scope-Kreis fremd-objektlich (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt ODER Scope-Kreis unbekannt/fremder Tenant (ApiErrorBody, code not_found) | |
GET/api/umlageschluessel/{id}
Liest einen Umlageschlüssel.
operationId: getUmlageschluessel · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Schlüssel (Umlageschluessel) | Umlageschluessel |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
PATCH/api/umlageschluessel/{id}
Ändert Stammfelder eines Umlageschlüssels (keyType/name/config). Der Scope wird über /scope gesetzt.
operationId: updateUmlageschluessel · Auth: bearerAuth
Request-Body (Pflicht): application/json → UmlageschluesselUpdateRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geänderter Schlüssel (Umlageschluessel) | |
400 | leerer/ungültiger Patch ODER Schlüssel archiviert (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/umlageschluessel/{id}/archive
Archiviert einen Umlageschlüssel (archived_at statt DELETE).
operationId: archiveUmlageschluessel · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Archiv-Ergebnis (UmlageArchiveResponse) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/umlageschluessel/{id}/messdienst-import
Importiert externe Messdienst-Festbeträge (CSV oder ARGE-D-Satz-Datei, Format serverseitig am Inhalt erkannt) in einen Umlageschlüssel vom Typ „extern". Append-only: jeder Aufruf legt einen neuen Batch an. Die Antwort echot die GESPEICHERTE Periode zurück — der Abrechnungslauf liest nur Batches mit EXAKT passender Periode.
operationId: importMessdienstBetraege · Auth: bearerAuth
Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | Der zu befüllende Umlageschlüssel; er MUSS den Typ „extern" haben (sonst 400). |
propertyId | query | ja | string(uuid) | Objekt, für das importiert wird. |
periodFrom | query | ja | string(date) | Beginn der Abrechnungsperiode (einschließlich). MUSS exakt der Periode des Abrechnungslaufs entsprechen, sonst bleibt der Import wirkungslos. |
periodTo | query | ja | string(date) | Ende der Abrechnungsperiode (einschließlich) — dieselbe Exaktheitsregel wie periodFrom. |
currency | query | ja | string | Währung ALLER Zeilen dieses Aufrufs (z. B. EUR). |
| Status | Bedeutung | Body |
|---|
201 | gespeicherter Batch (MessdienstImportResponse). Zeilen ohne Vertrag/Einheit blockieren den Import nicht, sie erscheinen in unmatchedCount. | MessdienstImportResponse |
400 | fehlende/ungültige Pflicht-Query, kein oder MEHR ALS EIN file-Feld, unlesbare CSV, Schlüssel nicht vom Typ „extern", archivierter Schlüssel/archiviertes Objekt ODER eine Zeile mit unbekannter Vertrags-/Einheits-Referenz (ApiErrorBody, code invalid_request) — kein Teil-Import | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Umlageschlüssel oder Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
413 | Datei überschreitet die zulässige Maximalgröße (ApiErrorBody, code payload_too_large) | |
POST/api/umlageschluessel/{id}/scope
Setzt (unitGroupId) oder löst (null) den Abrechnungskreis-Scope eines Schlüssels. HINWEIS: Der Scope wird gespeichert, aber von der Abrechnung noch NICHT ausgewertet — ein gescopter Schlüssel verteilt heute wie ein objektweiter.
operationId: scopeUmlageschluessel · Auth: bearerAuth
Request-Body (Pflicht): application/json → UmlageschluesselScopeRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | neuer Scope (UmlageschluesselScopeResponse) | |
400 | ungültige Eingabe, Schlüssel archiviert ODER Kreis fremd-objektlich (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Schlüssel ODER Kreis unbekannt/fremder Tenant (ApiErrorBody, code not_found) | |
vermoegensbericht
GET/api/vermoegensbericht/{id}
Liest EINEN abgelegten Stand samt Bericht und Befunden. `onr` ist PFLICHT: der Stand hängt an BEIDEN Achsen, und ein Stand der Nachbargemeinschaft ist über diesen Weg nicht lesbar.
operationId: getVermoegensberichtStand · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
onr | query | ja | string(uuid) | Das Objekt, an dem der Stand hängt. Die Objekt-Achse trägt RLS NICHT — eine Verwaltung führt viele WEG-Objekte desselben Mandanten; ohne sie läse eine Objektsicht den Bestandsausweis der Nachbargemeinschaft. |
| Status | Bedeutung | Body |
|---|
200 | der Stand samt byte-stabilem Serialisat und seinen Befunden (VermoegensberichtStandResponse) | VermoegensberichtStandResponse |
400 | keine UUID ODER `onr` fehlt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Stand unbekannt, fremder Tenant ODER fremdes Objekt (ApiErrorBody, code not_found) — alle drei sehen gleich aus, eine Unterscheidung wäre bereits ein Existenz-Orakel. | |
versammlung
GET/api/versammlung/{id}
Liest EINE Versammlung samt Tagesordnung und Teilnehmern. Die Beschlussfähigkeit wird nicht berechnet, sondern wie gespeichert ausgewiesen.
operationId: leseVersammlung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | die Versammlung samt Tagesordnung und Teilnehmern, Summe der Stimmgewichte und Teilnehmerzahl (VersammlungDetail) | VersammlungDetail |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
PATCH/api/versammlung/{id}
Ändert eine Versammlung (nicht art, nicht propertyId). Status nur entwurf → durchgefuehrt und entwurf|durchgefuehrt → abgesagt.
operationId: aendereVersammlung · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungAendernRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geänderte Versammlung samt Hinweisen zur Einladungsfrist (VersammlungSchreibResponse) | VersammlungSchreibResponse |
400 | ungültige Eingabe, unbekanntes Feld (z. B. art) ODER Begründung bei unterschrittener Einladungsfrist fehlt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Versammlung abgeschlossen (Beschlüsse generiert) ODER Statuswechsel nicht zulässig (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/beschluesse
Übernimmt die verkündeten Beschlüsse der Versammlung in die Beschluss-Sammlung des Objekts, mit laufender Nummer je Objekt (größte Nummer + 1, fortlaufend), genau einmal und alles oder nichts. Voraussetzung: verkündet, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis. Geschäftsordnungs- und Notiz-TOPs werden nicht übernommen und stehen als übersprungen im Ergebnis. Danach ist die Versammlung abgeschlossen und unveränderlich.
operationId: erzeugeBeschluesseAusVersammlung · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungBeschluesseGenerierenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | übernommene Beschlüsse, übersprungene TOPs, Anzahl (VersammlungBeschluesseGenerierenResponse) | VersammlungBeschluesseGenerierenResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | bereits generiert (bereits-generiert), nicht verkündet (nicht-verkuendet), kein Beschluss-TOP (keine-beschluesse) oder Beschluss-TOPs ohne Ergebnis (ergebnis-fehlt, Liste der TOP-Nummern), laufende Nummer vergeben (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/teilnehmer
Setzt einen Teilnehmer mit Stimmrecht (Upsert je Person; erneutes Setzen überschreibt). Kein Entfernen: wer nicht erschienen ist, wird nicht erfasst. Ob die Person Eigentümer ist, prüft casa.ai nicht (Gäste, Vertreter, Verwalter sind Teilnehmer). Stimmgewicht: koepfe nur 1, mea Zehntausendstel, objekt Anzahl der Einheiten.
operationId: erfasseVersammlungTeilnehmer · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungTeilnehmerErfassenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Teilnehmer überschrieben (VersammlungTeilnehmerSchreibResponse, angelegt=false) | VersammlungTeilnehmerSchreibResponse |
201 | Teilnehmer neu erfasst (VersammlungTeilnehmerSchreibResponse, angelegt=true) | VersammlungTeilnehmerSchreibResponse |
400 | ungültige Eingabe, Stimmgewicht passt nicht zum Stimmprinzip ODER Umlaufbeschluss (umlauf-ohne-teilnehmer) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung oder Person unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Versammlung abgeschlossen (versammlung-abgeschlossen) (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/tops
Erfasst einen Tagesordnungspunkt (Beschluss, Geschäftsordnung, Notiz). Die laufende TOP-Nummer vergibt der Server als nächste freie je Versammlung; parallele Anlagen erhalten verschiedene Nummern.
operationId: erfasseVersammlungTop · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungTopErfassenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
201 | erfasster TOP (VersammlungTopSchreibResponse) | VersammlungTopSchreibResponse |
400 | ungültige Eingabe ODER Umlaufbeschluss mit zweitem TOP (umlauf-genau-ein-top) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Versammlung abgeschlossen (versammlung-abgeschlossen) ODER ausdrücklich genannte TOP-Nummer vergeben (ApiErrorBody, code conflict) | |
PATCH/api/versammlung/{id}/tops/{topId}
Ändert Text und Art eines Tagesordnungspunkts. Die laufende Nummer (Reihenfolge) ist nicht änderbar.
operationId: aendereVersammlungTop · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungTopAendernRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
topId | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | geänderter TOP (VersammlungTopSchreibResponse) | VersammlungTopSchreibResponse |
400 | ungültige Eingabe, unbekanntes Feld (z. B. lfdNr) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung oder TOP unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Versammlung abgeschlossen ODER Art-Änderung widerspräche erfasstem Ergebnis/Beschluss (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/tops/{topId}/ergebnis
Erfasst das Abstimmungsergebnis EINES Beschluss-TOP: Feststellung angenommen | abgelehnt und Ja/Nein/Enthaltung in Köpfen und in Anteilen (Zehntausendstel). Erneutes Setzen überschreibt, solange die Versammlung nicht abgeschlossen ist. Das System zählt keine Einzelstimmen und leitet die Feststellung nicht aus den Zahlen ab; ein offensichtlicher Widerspruch kommt als Hinweis ergebnis-widerspricht-zahlen, nie als Fehler.
operationId: erfasseTopErgebnis · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungTopErgebnisRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
topId | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gespeichertes Ergebnis, ggf. mit Hinweis (VersammlungTopErgebnisResponse) | VersammlungTopErgebnisResponse |
400 | ungültige Eingabe (z. B. negative oder nicht ganze Zahl) ODER Geschäftsordnungs-/Notiz-TOP (top-ohne-abstimmung) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung oder TOP unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Versammlung abgeschlossen (versammlung-abgeschlossen) (ApiErrorBody, code conflict) | |
GET/api/versammlung/{id}/umlauf
Liest den Stand des Umlaufs: Vorgang, Rücklaufliste mit Namen und Stimmgewichten, Zählung, fristAbgelaufen und feststellbar. Bis zur Feststellung zählt der Server live (mit dem heutigen Tag), danach gilt die eingefrorene Zählung.
operationId: leseUmlaufStand · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Stand des Umlaufs (UmlaufStandResponse) | UmlaufStandResponse |
400 | ungültige Versammlungs-Id (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | kein Zugriff auf diesen Mandanten (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt, fremder Tenant, nicht zuständig ODER Umlauf nicht eröffnet — dieselbe Meldung (ApiErrorBody, code not_found) | |
POST/api/versammlung/{id}/umlauf
Eröffnet den Umlauf einer Versammlung der Art umlauf (Status entwurf, genau ein Beschluss-TOP). Allstimmigkeit ist der Default (alle Eigentümer in Textform, § 23 Abs. 3 S. 1 WEG); die abgesenkte Mehrheit (mehrheit_abgegebene) braucht einen vorher gefassten, tragenden Beschluss — das System prüft nicht, ob er sich auf diesen Gegenstand bezieht. Legt je Eigentümer-Person eine Rücklaufzeile an. Die Frist ist keine Ausschlussfrist.
operationId: eroeffneUmlaufbeschluss · Auth: bearerAuth
Request-Body (Pflicht): application/json → UmlaufEroeffnenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
201 | Umlauf eröffnet (UmlaufEroeffnetResponse) | UmlaufEroeffnetResponse |
400 | ungültige Eingabe, mehrheit_abgegebene ohne Beschluss (absenkung-braucht-beschluss), Frist vor der Eröffnung, keine Eigentümer, Stimmgewicht fehlt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Umlauf bereits eröffnet (umlauf-bereits-eroeffnet) oder Versammlung nicht mehr im Entwurf (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/umlauf/feststellung
Stellt das Ergebnis des Umlaufs fest (einmalig): friert die Zählung ein, schreibt das Ergebnis in den Beschluss-TOP und setzt die Versammlung auf durchgefuehrt. Ein nicht zustande gekommener Umlauf geht als abgelehnt in die Sammlung. Erst nach der Verkündung entsteht ein Beschluss in der Sammlung.
operationId: stelleUmlaufErgebnisFest · Auth: bearerAuth
Request-Body (Pflicht): application/json → UmlaufFeststellenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | festgestellt (UmlaufFeststellungResponse) | UmlaufFeststellungResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | noch nicht feststellbar (feststellung-noch-nicht-moeglich) oder bereits festgestellt (umlauf-festgestellt) (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/umlauf/ruecklauf
Erfasst die Antwort EINER Person (ja, nein, enthaltung) mit Eingangsdatum, Kanal und Textform-Bestätigung. Zustimmung gilt nur in Textform. Eine spätere Antwort überschreibt die frühere, bis der Umlauf festgestellt ist; eine Antwort nach dem Fristende zählt (Hinweis nach-fristablauf).
operationId: erfasseUmlaufRuecklauf · Auth: bearerAuth
Request-Body (Pflicht): application/json → UmlaufRuecklaufRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Antwort erfasst, mit Zählstand (UmlaufRuecklaufResponse) | UmlaufRuecklaufResponse |
400 | ungültige Eingabe, ja ohne Textform (textform-fehlt), Person steht nicht auf der Rücklaufliste (person-nicht-eigentuemer), Eingang vor Eröffnung oder in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Umlauf bereits festgestellt (umlauf-festgestellt) (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/umlauf/verkuendung
Verkündet den festgestellten Umlauf (einmalig), hält Mitteilungsdatum und -form fest und liefert das berechnete Ende der Anfechtungsfrist (ein Monat ab Verkündung, § 45 WEG). Auch ein nicht zustande gekommener Umlauf wird verkündet. Danach lassen sich die Beschlüsse generieren (POST /api/versammlung/{id}/beschluesse).
operationId: verkuendeUmlaufbeschluss · Auth: bearerAuth
Request-Body (Pflicht): application/json → UmlaufVerkuendenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | verkündet (UmlaufVerkuendungResponse) | UmlaufVerkuendungResponse |
400 | ungültige Eingabe, Datum vor dem Versammlungsdatum oder in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | noch nicht festgestellt (umlauf-nicht-festgestellt) oder bereits verkündet (bereits-verkuendet) (ApiErrorBody, code conflict) | |
POST/api/versammlung/{id}/verkuendung
Verkündet die Versammlung (setzt verkuendet_am EINMAL) und liefert das berechnete Ende der Anfechtungsfrist (ein Monat ab Verkündung, § 45 WEG; Feiertage nicht berücksichtigt). Das Fristende wird nirgends gespeichert. Voraussetzung: Status durchgefuehrt, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis; das Datum liegt nicht vor dem Versammlungsdatum und nicht in der Zukunft.
operationId: verkuendeVersammlung · Auth: bearerAuth
Request-Body (Pflicht): application/json → VersammlungVerkuendenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | verkündet, mit anfechtungsfristEnde (VersammlungVerkuendungResponse) | VersammlungVerkuendungResponse |
400 | ungültige Eingabe, Datum vor dem Versammlungsdatum oder in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder fehlendes Recht (ApiErrorBody, code forbidden) | |
404 | Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | bereits verkündet (bereits-verkuendet), Status nicht durchgefuehrt, kein Beschluss-TOP oder Beschluss-TOPs ohne Ergebnis (Liste der TOP-Nummern), Versammlung abgeschlossen (ApiErrorBody, code conflict) | |
version
GET/api/version
Serverseitig eingebrannte Build-ID (Deploy-Skew-Erkennung).
operationId: getVersion · Auth: keine (öffentlich)
vertrag
GET/api/vertrag
Listet Verträge (3-Wege-Gültigkeitsfilter Alle/Aktiv/Beendet, Default aktiv).
operationId: listVertraege · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
status | query | nein | alle | aktiv | beendet | alle | aktiv | beendet (Default aktiv). Gemessen an end_date, nicht an archived_at. aktiv ∪ beendet ≠ alle: zukünftige Verträge erscheinen nur unter `alle`. Unbekannter Wert ⇒ 400. |
objektId | query | nein | string(uuid) | nur Verträge dieses Objekts (UUID) |
asOf | query | nein | string(date) | Stichtag YYYY-MM-DD, gegen den aktiv/beendet gemessen wird (Default: heute, UTC). |
| Status | Bedeutung | Body |
|---|
200 | Vertragsliste (VertragListResponse) | VertragListResponse |
400 | ungültiger status-Filter, objektId-UUID oder Stichtag (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/vertrag
Legt ein Mietverhältnis samt initialer Zahlungs-Zeitscheibe an.
operationId: createVertrag · Auth: bearerAuth
Request-Body (Pflicht): application/json → VertragCreateRequest
| Status | Bedeutung | Body |
|---|
201 | angelegter Vertrag inkl. Zeitscheiben (Vertrag) | |
400 | ungültige Eingabe (z. B. Float-Betrag, fehlende depositCurrency) (ApiErrorBody, code invalid_request). Eine Kautionsabrede über mehr als drei Nettokaltmieten der initialen Zeitscheibe (§ 551 Abs. 1 BGB) ⇒ ApiErrorBody, code KAUTION_UEBERSTEIGT_OBERGRENZE; die Meldung nennt Kaution, Nettokaltmiete und Grenze; kein Vertrag entsteht. | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objekt ODER eine Zahlungs-Komponente unbekannt, archiviert oder fremder Tenant (ApiErrorBody, code not_found). Die Ziel-Prüfung leistet der Tool-Layer. | |
409 | Kautionsabrede ohne bestimmbare Nettokaltmiete ⇒ ApiErrorBody, code KAUTION_OHNE_NETTOKALTMIETE (fail-closed, kein Vertrag entsteht). | |
GET/api/vertrag/{id}
Liest EINEN Vertrag samt Konditionen-Zeitscheiben und vereinbarten Zahlungen (auch beendet).
operationId: getVertrag · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Vertrag (mit gefülltem terms-Array) | Vertrag |
400 | keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/vertrag/{id}/end
Beendet einen Vertrag zum Stichtag (setzt end_date, schließt offene Zeitscheiben; statt DELETE, K5).
operationId: endVertrag · Auth: bearerAuth
Request-Body (Pflicht): application/json → VertragEndRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | beendet (VertragEndResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses. | |
400 | ungültiges/unplausibles Enddatum (am/vor Beginn oder Scheiben-Beginn) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/vertrag/{id}/indexmiete
Beantragt eine Indexanpassung (beantrage_indexanpassung): neue Miete = bisherige × aktueller Index / Bezugsindex (kaufmännisch gerundet), frühestens zwölf Monate nach der letzten Änderung, wirksam ab dem übernächsten Monat nach Zugang. Eine Erhöhung wird als freigabepflichtiger Vorgang in die Mieterhöhungs-Freigabe gelegt — umgestellt wird erst nach der Freigabe über die Konditionen (kein automatisches Umstellen).
operationId: beantrageIndexanpassung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { art: vorgelegt | zu-frueh | keine-aenderung, … } — bei `vorgelegt` (Erhöhung wie Senkung, beide freigabepflichtig) mit mieterhoehungId, neueKaltmieteCents, vorhaben (die geplante Zeitscheibe) und inhaltHash; bei `zu-frueh` mit fruehesterTermin und ohne Vorgang. | |
400 | ungültige Anfrage oder nicht rechenbar (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | keine Indexmiete-Vereinbarung, Indexmonat nicht in der Reihe, kein offener Zeitscheiben-Stand oder bereits eine andere Erhöhung zum Wirksamkeitstag (ApiErrorBody, code conflict) | |
PUT/api/vertrag/{id}/indexmiete
Hält die Indexmiete-Vereinbarung eines Vertrags fest (setze_indexmietvereinbarung): Basisjahr der VPI-Reihe und Ausgangsindex (Berichtsmonat). `vereinbarung: null` nimmt sie zurück.
operationId: setzeIndexmietvereinbarung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gesetzt — { contractId, vereinbarung, zuvor } | |
400 | ungültige Vereinbarung oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/vertrag/{id}/kaution
Hält die Kautionsabrede eines Vertrags fest (setze_kautionsabrede): Betrag und Währung (Pflicht, wenn der Vertrag noch keine Kaution dokumentiert), Anlageform, Raten nach § 551 Abs. 2 BGB (1…3) und optional die getrennte Anlage. Erst damit wird aus einer dokumentierten Kaution eine sollstellbare Forderung.
operationId: setzeKautionsabrede · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gesetzt — { contractId, vereinbartCents, currency, kautionAnlageform, kautionRaten, kautionAnlagekontoId } | |
400 | ungültige Abrede, z. B. mehr als 3 Raten oder Raten bei Bürgschaft (ApiErrorBody, code invalid_request). Kaution über drei Nettokaltmieten der am Abredetag gültigen Zeitscheibe bei Wohnraum (§ 551 Abs. 1 BGB) ⇒ ApiErrorBody, code KAUTION_UEBERSTEIGT_OBERGRENZE; die Meldung nennt Kaution, Nettokaltmiete und Grenze; nichts geschrieben. | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Vertrag oder Kautionskonto unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | kein Kautionsbetrag vereinbart oder bereits Raten/Eingänge gebucht (ApiErrorBody, code conflict). Wohnraum ohne Nettokaltmiete am Abredetag ⇒ ApiErrorBody, code KAUTION_OHNE_NETTOKALTMIETE (fail-closed, nichts geschrieben). | |
GET/api/vertrag/{id}/kuendigung
Liest die Kündigungslage eines Vertrags: mit zugang + kuendigender den VORSCHLAG des Vertragsendes nach § 573c BGB (ohne Write), dazu die bereits erfasste Kündigung samt Kennzeichnung „abweichend vereinbart".
operationId: getVertragKuendigung · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
zugang | query | nein | string(date) | Tag des Zugangs (nur zusammen mit kuendigender) |
kuendigender | query | nein | mieter | vermieter | Wer kündigt (nur zusammen mit zugang) |
| Status | Bedeutung | Body |
|---|
200 | Kündigungslage (vorschlag null ohne Query; kuendigung null ohne erfasste Kündigung) | VertragKuendigungResponse |
400 | ungültige Query (kein existierender Kalendertag, unbekannter Kündigender, nur einer der beiden Parameter) (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Vertragsende nicht berechenbar: Bundesland des Objekts bzw. (Vermieter) Vertragsbeginn fehlt (ApiErrorBody, code conflict) | |
POST/api/vertrag/{id}/kuendigung
Erfasst die Kündigung (terminate_contract) und beendet den Vertrag zum errechneten Ende nach § 573c BGB — oder zum abweichend vereinbarten Ende (vereinbartesEnde), das dann als „abweichend vereinbart" gekennzeichnet wird. Einmalig: ein bereits beendeter Vertrag antwortet alreadyEnded: true.
operationId: kuendigeVertrag · Auth: bearerAuth
Request-Body (Pflicht): application/json → VertragKuendigenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gekündigt (VertragKuendigenResponse). Wiederholung mit demselben Idempotency-Key = Replay des Erst-Ergebnisses. | VertragKuendigenResponse |
400 | ungültige Eingabe, contractId im Body, oder vereinbartes Ende am/vor dem Beginn (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt des Vertrags (ApiErrorBody, code forbidden) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
409 | Vertragsende nicht berechenbar: Bundesland des Objekts bzw. (Vermieter) Vertragsbeginn fehlt (ApiErrorBody, code conflict) | |
POST/api/vertrag/{id}/mieterhoehung
Legt ein Mieterhöhungsverlangen nach § 558 BGB an (erstelle_mieterhoehung): Vorgang im Zustand `entwurf` und dokumentiertes Schreiben entstehen, der Vorgang erscheint in der Freigabe. Es entsteht KEINE Zeitscheibe — umgestellt wird erst nach der Freigabe über die Konditionen. Die Vertrags-Id steht nur im Pfad; Mandant und Akteur kommen aus der Sitzung (ein Mandant im Rumpf wird ignoriert).
operationId: erstelleMieterhoehung · Auth: bearerAuth
Request-Body (Pflicht): application/json
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
201 | angelegt — { mieterhoehungId, schreibenId, contractId, wirksamAb, zustand: "entwurf", zustimmungsfristBis, alterBetragCents, neuerBetragCents, … } | |
400 | ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | keine Zuständigkeit für das Objekt bzw. keine Berechtigung (ApiErrorBody, code forbidden) | |
404 | Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Kappungsgrenze und/oder Jahressperrfrist verletzt (ApiErrorBody, code MIETERHOEHUNG_UNZULAESSIG) oder zu diesem Wirksamkeitstag besteht schon ein Verlangen (code MIETERHOEHUNG_DOPPELT); Indexmiete-/Staffelmiete-Kollision. Nichts geschrieben. | |
422 | Wucherschwelle überschritten (code MIETERHOEHUNG_WUCHER), Begründung trägt das Verlangen nicht (code MIETERHOEHUNG_SCHREIBEN_UNGUELTIG), Wirksamkeitstag vor Ende der Zustimmungsfrist (code MIETERHOEHUNG_VOR_ZUSTIMMUNGSFRIST) oder in der Vergangenheit (code MIETERHOEHUNG_RUECKWIRKEND). Nichts geschrieben. | |
GET/api/vertrag/{id}/personen
Liest die Kopfzahl-Historie eines Vertrags (alle Zeitscheiben, active zum Stichtag).
operationId: listVertragPersonen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
asOf | query | nein | string(date) | Stichtag YYYY-MM-DD, gegen den `active` gemessen wird (Default: heute UTC). Ungültiges Format ⇒ 400. |
| Status | Bedeutung | Body |
|---|
200 | Kopfzahl-Historie (VertragPersonenListResponse) | VertragPersonenListResponse |
400 | keine UUID oder ungültiger asOf (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vertrag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/vertrag/{id}/personen
Setzt/ändert eine Kopfzahl-Zeitscheibe „ab Datum" (SCD-2; Überschneidungen desselben Vertrags werden abgelehnt).
operationId: setVertragPersonen · Auth: bearerAuth
Request-Body (Pflicht): application/json → VertragPersonenSetRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gesetzte Zeitscheibe (VertragPersonenSetResponse) | |
400 | ungültige Eingabe (negative/gebrochene Kopfzahl, validFrom nach validTo) ODER Überschneidung mit einer bestehenden Scheibe desselben Vertrags (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vertrag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) | |
POST/api/vertrag/{id}/personen/{sliceId}/remove
Entfernt eine Kopfzahl-Zeitscheibe außer der ersten (stillgelegt, K5); die Vorgängerin deckt die Lücke wieder bzw. ist wieder laufend. Kein Body. Wiederholung = Replay.
operationId: removeVertragPersonen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
sliceId | path | ja | string(uuid) | Id der Scheibe (aus GET /api/vertrag/{id}/personen) |
| Status | Bedeutung | Body |
|---|
200 | entfernt (VertragPersonenRemoveResponse) | VertragPersonenRemoveResponse |
400 | id oder sliceId keine UUID (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Vertrag oder Scheibe unbekannt, fremder Tenant, an einem anderen Vertrag oder schon entfernt (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | die erste Scheibe des Vertrags bleibt (P82) — ändern statt entfernen (ApiErrorBody, code conflict) | |
POST/api/vertrag/{id}/zahlung
Konditionswechsel: vereinbarte Zahlungen als Zeitscheibe ändern (schließt die offene Scheibe auf `ab`, öffnet lückenlos eine neue).
operationId: changeVertragZahlung · Auth: bearerAuth
Request-Body (Pflicht): application/json → VertragZahlungChangeRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | gewechselt (VertragZahlungChangeResponse). Wiederholter Aufruf mit gleichem Idempotency-Key = Replay des Erst-Ergebnisses. | |
400 | rückwirkendes/ungültiges ab oder Float auf Geld (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | kein offener Zeitscheiben-Stand oder nebenläufiger Wechsel (ApiErrorBody, code conflict) | |
zaehler
GET/api/zaehler
Zähler des Mandanten (optional je Objekt, Einheit, Zählerart) — mit Einheitsnummer, Art, Maßeinheit und Archivstand.
operationId: listZaehler · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | nein | string(uuid) | Nur Zähler dieses Objekts. |
einheit | query | nein | string(uuid) | Nur Zähler dieser Einheit. |
zaehlerart | query | nein | string | Nur Zähler dieser Art (z. B. `kaltwasser`). |
archiveScope | query | nein | alle | aktiv | archiviert | Archivstand der Zähler: `aktiv` (Default), `archiviert` oder `alle`. |
| Status | Bedeutung | Body |
|---|
200 | Die Zähler. | ZaehlerListeResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/zaehler
Legt einen Zähler an (create_meter). Ohne Nummer: Nummernkreis `KW|WW|HZ|ST-<Turnusjahr>-NNN` als Vorgabe; die Antwort nennt die vergebene Nummer. Objekt und Standort sind danach fest. Derselbe Idempotency-Key legt nur einen Zähler an.
operationId: legeZaehlerAn · Auth: bearerAuth
Request-Body (Pflicht): application/json → ZaehlerAnlegenRequest
| Status | Bedeutung | Body |
|---|
201 | Der angelegte Zähler. | ZaehlerGespeichertResponse |
400 | ungültige Eingabe, unbekanntes Feld, Nummer und Präfix zugleich oder Einheit eines anderen Objekts (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden) | |
404 | unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Objekt oder Einheit ist archiviert (ApiErrorBody, code conflict) | |
PATCH/api/zaehler/{id}
Ändert Zählerart, Zählernummer oder Maßeinheit (update_meter); mindestens ein Feld. Objekt und Standort sind nach der Anlage fest (400).
operationId: aendereZaehler · Auth: bearerAuth
Request-Body (Pflicht): application/json → ZaehlerAendernRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | Der geänderte Zähler. | ZaehlerGespeichertResponse |
400 | leerer Patch, unbekanntes Feld (auch propertyId/unitId) oder ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden) | |
404 | unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | der Zähler ist archiviert (ApiErrorBody, code conflict) | |
GET/api/zaehler/{id}/ablesungen
Ablesungs-Historie EINES Zählers, aufsteigend nach Ablesezeitpunkt; Stände als Dezimal-Strings (Skala 3).
operationId: listZaehlerAblesungen · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
von | query | nein | string(date) | Erster Kalendertag `JJJJ-MM-TT` (inklusiv). |
bis | query | nein | string(date) | Letzter Kalendertag `JJJJ-MM-TT` (inklusiv). |
| Status | Bedeutung | Body |
|---|
200 | Die Ablesungen. | ZaehlerAblesungenResponse |
400 | ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannter ODER fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/zaehler/{id}/ablesungen
Erfasst eine Ablesung (record_meter_reading). Plausibilitäts-Warnungen (Ausreißer, Verbrauch null) und Hinweise (Ablesefenster) stehen in `plausibilitaet`; sie sind KEIN Fehler, der Stand ist dann gespeichert. Die Zwischenablesung am Tag des Mieterwechsels ist Voraussetzung der Verbrauchs-Zuordnung je Vertrag. Derselbe Idempotency-Key erfasst nur eine Ablesung.
operationId: erfasseZaehlerAblesung · Auth: bearerAuth
Request-Body (Pflicht): application/json → ZaehlerAblesenRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
201 | Die gespeicherte Ablesung mit Plausibilitäts-Ergebnis. | ZaehlerAbgelesenResponse |
400 | ungültige Eingabe, unbekanntes Feld (auch die Zähler-Id im Body) oder Stand mit Komma statt Punkt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden) | |
404 | unbekannter ODER fremder Zähler bzw. unbekannte oder fremde Ablesung — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Zähler archiviert, Stand unter dem Vorstand (negativer Verbrauch) oder Zeitpunkt schon belegt (ApiErrorBody, code conflict, Klartext der Maske) | |
POST/api/zaehler/{id}/archiv
Legt einen Zähler still (archive_meter). Ein zweites Archivieren ist 200 mit `bereitsArchiviert: true`. Ein Zähler mit Ablesungen lässt sich erst nach dem Stand zum jüngsten Periodenende stilllegen (409 OFFENE_ABLESUNG).
operationId: archiviereZaehler · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { id, archiviertAm, bereitsArchiviert } | ZaehlerArchiviertResponse |
400 | ungültige Zähler-Id oder ein Feld im Body — der Body ist leer (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden) | |
404 | unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | offene Ablesung: der Stand zum jüngsten Periodenende fehlt (ApiErrorBody, code conflict, Klartext der Maske) | |
POST/api/zaehler/{id}/tausch
Tauscht einen Zähler als EINE Fachhandlung (replace_meter): Endstand des Altzählers, Neuzähler (`replaces_meter_id`), Anfangsstand (Standard 0.000), Altzähler archiviert. Die Antwort nennt die Id des neuen Zählers.
operationId: tauscheZaehler · Auth: bearerAuth
Request-Body (Pflicht): application/json → ZaehlerTauschRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
201 | Alt- und Neuzähler mit beiden Ständen. | ZaehlerGetauschtResponse |
400 | ungültige Eingabe, unbekanntes Feld (auch die Zähler-Id im Body) oder Stand mit Komma statt Punkt (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden) | |
404 | unbekannter ODER fremder Zähler bzw. unbekannte oder fremde Ablesung — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Zähler archiviert, Endstand unter dem Vorstand oder Zeitpunkt belegt (ApiErrorBody, code conflict, Klartext der Maske) | |
GET/api/zaehler/{id}/zwischenstand
Zwischenstand-VORSCHLAG eines Zählers für einen Stichtag (Mieterwechsel): linear nach Kalendertagen zwischen dem letzten Stand davor und dem ersten danach, mit Begründung. Wird NICHT gebucht und ist nie ein Wert des Abrechnungslaufs; übernehmen heißt, die Ablesung selbst zu erfassen (Anlass zwischenablesung, Erhebungsart schaetzung). Nur lesend.
operationId: getZaehlerZwischenstand · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
stichtag | query | ja | string(date) | Stichtag `JJJJ-MM-TT`. |
| Status | Bedeutung | Body |
|---|
200 | Der Vorschlag oder der Grund, warum es keinen gibt (`code`); Stände sind Dezimal-Strings. | ZaehlerZwischenstandResponse |
400 | fehlender oder unlesbarer Stichtag bzw. unbekannter Parameter (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekannter ODER fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
GET/api/zaehler/pflicht
Erfassungspflicht nach HeizkostenV für Objekt und Zählerart (ab 3 Wohneinheiten, mit Ausnahme-Option `zaehler.erfassungspflicht_ausnahme`). Ein HINWEIS, keine Sperre; nur lesend.
operationId: getZaehlerPflicht · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Das zu prüfende Objekt. |
zaehlerart | query | ja | string | Zählerart, z. B. waerme, wasser_warm, wasser_kalt, strom. |
| Status | Bedeutung | Body |
|---|
200 | Die Pflicht (`ja` · `nein` · `ausnahme` · `nicht-heizkostenv`) mit Hinweisen. | ZaehlerPflichtResponse |
400 | fehlende oder ungültige Query (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekanntes ODER fremdes Objekt — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | unbrauchbare Ausnahme-Option `zaehler.erfassungspflicht_ausnahme` am Objekt (ApiErrorBody) — mit Klartext abgelehnt statt geraten | |
POST/api/zaehler/sammelanlage
Legt denselben Zählertyp für mehrere Einheiten EINES Objekts an (create_meters_for_units, höchstens 500 Einheiten). Je Einheit `angelegt` oder `vorhanden`; eine Wiederholung legt nur Fehlendes an.
operationId: legeZaehlerSammelanlage · Auth: bearerAuth
Request-Body (Pflicht): application/json → ZaehlerSammelanlageRequest
| Status | Bedeutung | Body |
|---|
200 | Je Einheit angelegt oder vorhanden. | ZaehlerSammelanlageResponse |
400 | ungültige Eingabe, unbekanntes Feld, doppelte Einheit, Nummer und Nummernkreis zugleich oder Einheit eines anderen Objekts (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden) | |
404 | unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
409 | Objekt oder Einheit ist archiviert (ApiErrorBody, code conflict) | |
GET/api/zaehler/verbrauch
Verbrauch je Zähler und je (Einheit, Zählerart) für einen Zeitraum. Anfangsstand = letzter Stand bis zum Periodenbeginn (auch aus dem Vorjahr). Fehlt eine Grenze, steht `vollstaendig: false` mit `fehlend` — nie interpoliert.
operationId: getZaehlerVerbrauch · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | ja | string(uuid) | Objekt, dessen Zähler abgeleitet werden. |
von | query | ja | string(date) | Erster Kalendertag `JJJJ-MM-TT` (inklusiv). |
bis | query | ja | string(date) | Letzter Kalendertag `JJJJ-MM-TT` (inklusiv). |
| Status | Bedeutung | Body |
|---|
200 | Der Verbrauch; Stände und Verbrauch sind Dezimal-Strings. | ZaehlerVerbrauchResponse |
400 | ungültige Query oder Zeitraum (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | unbekanntes ODER fremdes Objekt — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
zeit
GET/api/zeit
Die EIGENEN Zeiteinträge im Zeitraum (nach Leistungsdatum), neueste zuerst, einschließlich stornierter. Ohne von/bis: der laufende Kalendermonat (Europe/Berlin).
operationId: listZeit · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
objekt | query | nein | string(uuid) | Nur Einträge dieses Objekts. |
von | query | nein | string(date) | Erster Kalendertag `JJJJ-MM-TT` (inklusiv). |
bis | query | nein | string(date) | Letzter Kalendertag `JJJJ-MM-TT` (inklusiv). |
| Status | Bedeutung | Body |
|---|
200 | { eintraege } | ZeiteintraegeResponse |
400 | ungültige Query oder von liegt nach bis (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
404 | Objektfilter: Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel) | |
POST/api/zeit
Trägt Zeit nachträglich ein (erfasse_zeit, Quelle manuell). Objektbezug ist Pflicht. Derselbe Idempotency-Key legt den Eintrag nur einmal an.
operationId: erfasseZeit · Auth: bearerAuth
Request-Body (Pflicht): application/json → ErfasseZeitRequest
| Status | Bedeutung | Body |
|---|
201 | { zeitId, dauerMinuten, leistungsdatum, hinweise } | ZeitErfasstResponse |
400 | ungültige Eingabe, z. B. 0 Minuten oder Datum in der Zukunft (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt oder Bezug unbekannt oder mandantenfremd (ApiErrorBody, code not_found) | |
409 | Objekt ist archiviert (ApiErrorBody, code conflict) | |
PATCH/api/zeit/{id}
Korrigiert einen EIGENEN, beendeten Eintrag (korrigiere_zeit). Ein laufender Timer ist nicht korrigierbar.
operationId: korrigiereZeit · Auth: bearerAuth
Request-Body (Pflicht): application/json → KorrigiereZeitRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { zeitId, dauerMinuten, leistungsdatum, hinweise } | ZeitErfasstResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Eintrag unbekannt, mandantenfremd oder von einem anderen Mitarbeiter (ApiErrorBody, code not_found) | |
409 | der Timer läuft noch, der Eintrag ist storniert oder kein Timer (ApiErrorBody, code conflict) | |
POST/api/zeit/{id}/stopp
Stoppt einen EIGENEN laufenden Timer (stoppe_zeit); die Dauer wird aus Beginn und Ende gerechnet.
operationId: stoppeZeit · Auth: bearerAuth
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { zeitId, ende, dauerMinuten, hinweise } | ZeitGestopptResponse |
400 | ungültige Id (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Eintrag unbekannt, mandantenfremd oder von einem anderen Mitarbeiter (ApiErrorBody, code not_found) | |
409 | der Timer ist bereits gestoppt, storniert oder kein Timer (ApiErrorBody, code conflict) | |
POST/api/zeit/{id}/storno
Storniert einen EIGENEN Eintrag (storniere_zeit); er bleibt auffindbar, zählt aber nirgends mehr. Grund ist Pflicht.
operationId: storniereZeit · Auth: bearerAuth
Request-Body (Pflicht): application/json → StorniereZeitRequest
| Parameter | Ort | Pflicht | Typ | Beschreibung |
|---|
id | path | ja | string(uuid) | |
| Status | Bedeutung | Body |
|---|
200 | { zeitId, storniert: true } | ZeitStorniertResponse |
400 | Grund fehlt oder ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Eintrag unbekannt, mandantenfremd oder von einem anderen Mitarbeiter (ApiErrorBody, code not_found) | |
409 | der Eintrag ist bereits storniert (ApiErrorBody, code conflict) | |
GET/api/zeit/laufend
Die laufenden Timer des Angemeldeten (nicht gestoppt, nicht storniert), ältester zuerst.
operationId: listZeitLaufend · Auth: bearerAuth
| Status | Bedeutung | Body |
|---|
200 | { timer } | ZeitLaufendResponse |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
POST/api/zeit/start
Startet einen Timer (starte_zeit). Mehrere Timer dürfen gleichzeitig laufen; läuft einer an einem anderen Objekt, kommt der Hinweis timer-an-anderem-objekt.
operationId: starteZeit · Auth: bearerAuth
Request-Body (Pflicht): application/json → StarteZeitRequest
| Status | Bedeutung | Body |
|---|
201 | { zeitId, beginn, leistungsdatum, hinweise } | ZeitGestartetResponse |
400 | ungültige Eingabe (ApiErrorBody, code invalid_request) | |
401 | nicht authentifiziert — leerer Body (kein Oracle) | |
403 | Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden) | |
404 | Objekt oder Bezug unbekannt oder mandantenfremd (ApiErrorBody, code not_found) | |
409 | Objekt ist archiviert (ApiErrorBody, code conflict) | |
Schemas
AblesungBerichtigenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
reading | string | ja | Der richtige Zählerstand. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400. |
grund | string | nein | Warum berichtigt wird (Kommando-Log); fehlt er, fehlt er sichtbar. |
AblesungBerichtigtResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
zaehlerId | string(uuid) | ja | |
stand | string | ja | Der neue, kanonische Stand (Skala 3). |
vorherigerStand | string | ja | Der Stand vor der Berichtigung (Skala 3). |
abgelesenAm | string(date-time) | ja | |
anlass | turnus | wechsel | zwischenablesung | ja | |
verbrauchSeitVorablesung | string | null | ja | |
plausibilitaet | ZaehlerPlausibilitaet | ja | |
AbrechnungBerechnetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
status | entwurf | berechnet | ja | |
AbrechnungErgebnisResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
run | AbrechnungErgebnisRun | ja | |
rechenbar | boolean | ja | ABGELEITET: umlage !== null && gegenrechnung !== null. Nie unabhängig gesetzt. |
umlage | unbekannt | ja | |
umlageFehler | string | null | ja | Klartext des fail-closed-Abbruchs oder null (kein leerer String). |
gegenrechnung | unbekannt | ja | |
gegenrechnungFehler | string | null | ja | |
readinessFindings | unbekannt | nein | Readiness-Befunde des Startzeitpunkts — der GRUND eines null-Ergebnisses, ohne einen zweiten Endpunkt zu fragen. |
AbrechnungErgebnisRun
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
unitGroupId | string(uuid) | null | ja | |
periodFrom | string(date) | ja | |
periodTo | string(date) | ja | |
status | entwurf | berechnet | ja | |
bindingContentHash | string | ja | Bindungs-Hash BEIDER Geld-Seiten des Laufs (INV-TIME-01, seit #1812): Umlage-Eingabe UND VZ-Seite (payment_components, contract_term_payments, im Ist-Modus zusätzlich die zugeordneten Zahlungen). Gleicher Hash belegt, dass zwei Lesungen dieselbe Eingabe hatten — auch die der gegenrechnung. EINZIGE Ausnahme: ein vor #1812 gebundener ALT-Lauf trägt keinen vz-Zweig im Snapshot; seine VZ-Seite wird weiterhin live gelesen und ist von diesem Hash nicht gedeckt. |
bindingBoundAt | string(date-time) | ja | |
AbrechnungStartResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
status | entwurf | berechnet | ja | |
propertyId | string(uuid) | ja | |
unitGroupId | string(uuid) | null | ja | |
periodFrom | string(date) | ja | |
periodTo | string(date) | ja | |
bindingContentHash | string | ja | |
bindingBoundAt | string(date-time) | ja | |
AbschlussFreezeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
laufId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
jahr | integer | ja | |
zustand | offen | festgeschrieben | ja | festgeschrieben = bestandskräftiger Beschluss; offen = alles andere. |
beschlussRef | string | ja | Der tragende Beschluss — auch im Zustand `offen` benannt, denn er trägt den Lauf. |
korrekturweg | storno | ja | Der EINZIGE Weg zur Korrektur, unabhängig vom Zustand. |
snapshotGeprueft | boolean | ja | Wurde die ZWEITE Hälfte von F7 gefahren? `true` nur, wenn der Aufrufer mit `snapshotHash` den am AKTUELLEN Stand gebildeten Hash mitgegeben hat. Ohne ihn beantwortet die Route allein die Status-Frage — sie behauptet nicht, den Stand geprüft zu haben. |
AbschlussKettenZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | |
stornierterLaufId | string(uuid) | ja | |
neuerLaufId | string(uuid) | ja | |
AbschlussKorrekturRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ungueltigerBeschlussRef | string | ja | Der rechtskräftig für ungültig erklärte Schlüssel-Beschluss, kanonische Referenz aus S12-T02. |
verrechnungsjahr | integer | ja | Das Jahr, in dessen NEUER Abrechnung die Differenzen verrechnet werden. |
betroffeneJahre | array<integer> | ja | Die Jahre der KASKADE, aus `bildeKorrekturkaskade` (S12-T13a) — Pflichtangabe und nie leer. Sie wird ausdrücklich NICHT aus dem Bestand abgeleitet: „jeder aktive Lauf vor dem Verrechnungsjahr" überschritte die Kaskade, sobald das Objekt Läufe aus Jahren VOR der Wirksamkeit des aufgehobenen Beschlusses führt. |
idempotenzSchluessel | string | ja | Der Schlüssel des GANZEN Dispatches, vom Aufrufer gebildet (`abschlussKorrekturSchluessel`). Zwei Aufrufe am selben Schlüssel ergeben GENAU EINE Kette. |
grund | string | ja | Warum korrigiert wird — nie leer. |
stichtag | string(date) | ja | Der Tag des Stornos, striktes `YYYY-MM-DD` (BP §8). |
entscheidungen | array<unbekannt> | ja | Die Gate-Entscheidungen der neuen Läufe, aus `entscheideAbschlussVerrechnung` (S12-T13a) ÜBERNOMMEN — hier wird nicht gerechnet (INV-ROUND-01). Pflichtfeld, aber die LEERE Liste ist zulässig: sie ist dann eine Aussage („dieser Vorgang hat über keine Einheit entschieden") und kein Versehen. Jede Entscheidung muss zu einem Jahr gehören, das in dieser Kaskade auch einen neuen Lauf bekommt. |
AbschlussKorrekturResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | geschrieben | bereits_ausgefuehrt | ja | |
kette | array<AbschlussKettenZeile> | ja | Je betroffenem Jahr GENAU EIN Paar; bei `bereits_ausgefuehrt` leer. |
AbschlussLauf
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
wirtschaftsjahr | integer | ja | Das Wirtschaftsjahr, dessen Abschluss dieser Lauf trägt. |
art | abschluss | korrektur | ja | abschluss = der erste Lauf eines Jahres; korrektur = der Nachfolger eines stornierten. |
beschlussRef | string | ja | Kanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>` (S12-T02) — die Rechtsgrundlage des Laufs. |
beschlussStatus | angenommen | abgelehnt | angefochten | bestandskraeftig | aufgehoben | nichtig | ja | Der Status, unter dem der Lauf steht; `bestandskraeftig` ⇒ Freeze (§ 28 Abs. 2 WEG). |
snapshotHash | string | null | ja | Der Festschreibungs-Anker (Muster F7), 64 Hex-Zeichen klein. `null`, solange nichts festgeschrieben ist — ein erfundener Anker wäre schlimmer als keiner. |
storniert | boolean | ja | |
storniertAm | string(date) | null | ja | Der Tag des Stornos; `null` ohne Storno. Er kommt vom Aufrufer, nie aus der Uhr des Servers (BP §8). |
stornoGrund | string | null | ja | Warum storniert wurde — ein Storno ohne Begründung ist im Audit wertlos. |
ersetztLaufId | string(uuid) | null | ja | Der Lauf, den DIESER ersetzt; `null` beim ersten Lauf eines Jahres. |
ausgeloestVon | string | null | ja | WER den Korrekturlauf ausgelöst hat; bei `art = abschluss` `null` (ein anonymer Korrekturlauf ist keiner). |
AbschlussLaufListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
jahr | integer | null | ja | Das gefilterte Wirtschaftsjahr (Echo) oder `null` für „alle Jahre". |
laeufe | array<AbschlussLauf> | ja | |
AbschlussStornoRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
grund | string | ja | Warum storniert wird — nie leer; steht später im Audit. |
stichtag | string(date) | ja | Der Tag des Stornos, striktes `YYYY-MM-DD`. INJIZIERT — kein Server liest hier eine Uhr (BP §8). |
AbschlussStornoResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
laufId | string(uuid) | ja | |
storniert | true | ja | Immer `true`: der einzige Ausgang eines erfolgreichen Stornos. Ein zweites Storno endet mit 409. |
stichtag | string(date) | ja | |
AltbestandPosten
| Feld | Typ | Pflicht | Beschreibung |
|---|
quellSchluessel | string | ja | Der Schlüssel der Quellzeile im Altsystem — Herkunftsnachweis UND Dubletten-Anker. |
art | op | mahnung | zahlung | ja | 'op' wurde gebucht; 'mahnung'/'zahlung' bewusst NICHT. |
datum | string(date) | ja | Originalfälligkeit, Mahndatum oder Zahltag — je nach art. |
betragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
contractId | string(uuid) | ja | |
journalEntryId | string(uuid) | null | ja | Die Eröffnungs-Sollstellung, die aus dieser Zeile entstanden ist — null für Mahn- und Zahlhistorie. Genau dieses Feld macht die beiden Sichten unterscheidbar, ohne dass der Leser die Bedeutung von art kennen müsste. |
AltbestandPostenListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
posten | array<AltbestandPosten> | ja | Aufsteigend nach (datum, quellSchluessel) — die Ordnung ist Vertrag: eine Auskunft, deren Reihenfolge zwischen zwei Aufrufen wechselt, ist gegen einen Widerspruch nicht verwendbar. Ein fremder Vertrag liefert eine LEERE Liste wie ein nie existierter (kein Existenz-Orakel). |
AltbestandProvenienzResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
journalEntryId | string(uuid) | ja | |
provenienz | unbekannt | ja | |
ApiErrorBody
| Feld | Typ | Pflicht | Beschreibung |
|---|
error | object | ja | |
Ausnahme
| Feld | Typ | Pflicht | Beschreibung |
|---|
exceptionId | string(uuid) | ja | |
documentId | string(uuid) | ja | |
exceptionClass | string | ja | Ausnahmeklasse (9 Fachklassen + unroutable) — stabiler Code |
reason | string | ja | maschinenlesbarer Grund-Code (nie freier Text) |
createdAt | string(date-time) | ja | |
document | unbekannt | ja | |
history | object | ja | Lebenszyklus-Historie desselben Belegs: bereits erledigte Ausnahmen (Count + letzte) |
AusnahmeDocument
| Feld | Typ | Pflicht | Beschreibung |
|---|
subject | string | null | ja | |
sender | string | null | ja | |
source | string | ja | Eingangskanal des Belegs (mail | upload) — stabiler Code |
filename | string | null | ja | |
AusnahmenListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausnahmen | array<Ausnahme> | ja | |
AuswertungKatalogEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
name | string | ja | |
titel | string | ja | |
beschreibung | string | ja | Wozu der Bericht gut ist, in einem Satz. |
zeitbezug | zeitraum | zeitraum-und-stichtag | ja | Welche Zeitachsen die Auswertung kennt — damit Bedienfläche und Agent die richtigen Felder anbieten. |
waehrung | string | ja | |
spalten | array<AuswertungSpalte> | ja | |
AuswertungKatalogResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
auswertungen | array<AuswertungKatalogEintrag> | ja | |
AuswertungQuelle
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandant | string(uuid) | ja | Mandant, für den die Auswertung gilt — aus der Session, nie aus der Anfrage. |
objektId | string(uuid) | null | ja | Objekt (Buchungskreis); `null` nur bei objektübergreifenden Auswertungen. |
objektNr | string | null | ja | Objekt-Nummer zur Anzeige; `null`, falls nicht auflösbar. |
zeitraumVon | string(date) | null | ja | |
zeitraumBis | string(date) | null | ja | |
stichtag | string(date) | null | ja | Stichtag, falls die Auswertung einen kennt (Verzugstage, Vermögensstand). |
letzteBuchung | string(date) | null | ja | Buchungsdatum der LETZTEN berücksichtigten Buchung; `null`, wenn im Fenster keine liegt. |
letzteBuchungNr | string | null | ja | Lückenlose Buchungsnummer derselben Buchung (Integer-STRING) — macht den Datenstand nennbar und prüfbar. |
buchungen | integer | ja | Zahl der berücksichtigten Buchungssätze. |
abgefragtAm | string(date-time) | ja | Zeitpunkt des Abrufs. Sagt, WANN gefragt wurde — der Datenstand sagt, WORAUF. |
AuswertungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
name | string | ja | Katalog-Name der Auswertung (Pfadsegment). |
titel | string | ja | |
waehrung | string | ja | Währung ALLER Betrags-Zellen (ISO-4217). Eine Tabelle, zwei Währungen gibt es nicht. |
quelle | AuswertungQuelle | ja | |
spalten | array<AuswertungSpalte> | ja | |
zeilen | array<array<string | null>> | ja | Zeilen in Spaltenordnung; jede Zelle ein String oder `null` (leere Zelle). Sorte laut `spalten[i].typ`. |
AuswertungSpalte
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | Stabiler Maschinenname der Spalte; die Überschrift darf sich ändern, dieser Name nicht. |
titel | string | ja | Deutsche Überschrift — sie steht in der CSV-Kopfzeile. |
typ | text | betrag | zahl | datum | ja | Wie die Zellen dieser Spalte zu lesen sind. `betrag` ⇒ vorzeichenbehafteter Integer-Cent-STRING. |
Bank
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
propertyNo | string | null | ja | Objektnummer des Elternobjekts (Anzeige, LEFT JOIN) |
iban | string | ja | IBAN in kanonischer Form (ohne Leerraum, Großbuchstaben), prüfziffernvalidiert |
kind | bank | kasse | ruecklage | kautionskonto | ja | Kontoart; `kautionskonto` = getrennte Anlage der Mietkaution (§ 551 Abs. 3 BGB, #5178) |
glaeubigerId | string | null | ja | SEPA-Gläubiger-Identifikationsnummer (Lastschrift) |
glAccountId | string(uuid) | null | ja | zugeordnetes Bank-Sachkonto (gl_accounts.id, #1859); null ⇒ nicht gepflegt, der Bankabgleich leitet dann über das Objekt ab |
archivedAt | string(date-time) | null | ja | gesetzt ⇒ archiviert (K5: kein DELETE) |
createdAt | string(date-time) | ja | |
BankabgleichVerbuchungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
modus | einzeln | sammel | ja | |
anzahl | integer | ja | |
ergebnisse | array<BankabgleichVerbuchungZeile> | ja | |
BankabgleichVerbuchungZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
bankTransactionId | string(uuid) | ja | |
proposalId | string(uuid) | ja | |
buchungsanspruchId | string(uuid) | ja | GENAU EIN wirksamer Buchungsanspruch je Umsatz (INV-BANK-01). |
allocatedCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
creditBalanceCents | string | ja | Der nicht verrechnete Teil — BERICHTET, nicht als eigene Zeile gebucht. |
BankabgleichVorlageResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
bankTransactionId | string(uuid) | ja | |
proposalId | string(uuid) | ja | |
version | integer | ja | |
contentHash | string | ja | Der Inhalts-Hash, an den die Freigabe bindet (INV-APPROVAL-01). |
ampel | string | ja | |
propertyId | string(uuid) | ja | |
contractId | string(uuid) | ja | |
allocatedCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
allocationCount | integer | ja | |
BankArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | |
alreadyArchived | boolean | ja | true ⇒ die Bankverbindung war bereits archiviert (expliziter No-op). |
BankCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
iban | string | ja | IBAN — wird normalisiert und prüfziffernvalidiert; ungültig ⇒ 400 |
kind | bank | kasse | ruecklage | kautionskonto | ja | |
glaeubigerId | string | null | nein | SEPA-Gläubiger-ID; weglassen ⇒ keine |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
BankListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | archiviert | ja | der wirksame 3-Wege-Filter |
propertyId | string(uuid) | null | nein | die wirksame Objekt-Eingrenzung (null = alle Objekte des Tenants) |
bankverbindungen | array<Bank> | ja | |
BankUmsatz
| Feld | Typ | Pflicht | Beschreibung |
|---|
transaktionId | string(uuid) | ja | GENAU die id, die `POST /api/bankabgleich/vorlegen` als `bankTransactionId` erwartet. |
bankAccountId | string(uuid) | ja | |
quelle | string | ja | Herkunft der Zeile (`camt` · `banksapi` · …). |
providerId | string | null | ja | Die eindeutige Referenz der BANK (bei camt `AcctSvcrRef`) — der Schlüssel, über den ein Auszug wiederfindbar ist. |
betragCents | string | ja | SIGNIERT: > 0 Eingang, < 0 Ausgang. |
currency | string | ja | |
buchungsdatum | string(date) | null | ja | |
wertstellungsdatum | string(date) | null | ja | |
verwendungszweck | string | null | ja | |
buchungstext | string | null | ja | |
gegenkontoIban | string | null | ja | |
gegenkontoInhaber | string | null | ja | |
gvCode | string | null | ja | |
endToEndId | string | null | ja | |
mandateId | string | null | ja | |
correlationId | string | null | ja | Der Import-Lauf, dem sich der Umsatz zuschreibt. |
gebucht | boolean | ja | Zeigt auf den Umsatz ein WIRKSAMER Buchungsanspruch? Dasselbe Prädikat wie Arbeitsliste und Reconciliation. |
importiertAm | string(date-time) | ja | Wann die Zeile ENTSTAND — die Import-Zeit, nicht die Bankzeit. |
BankUmsatzImportResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
importBatchId | string(uuid) | ja | Kennung DIESES Import-Laufs (append-only; jeder Aufruf erzeugt eine neue). |
bankAccountId | string(uuid) | ja | |
format | camt.053 | camt.052 | mt940 | ja | Das aus der DATEI ERKANNTE Format — nicht das per ?format= deklarierte (das wählt nur den Parser). |
total | integer | ja | Quell-Posten der Datei (gebuchte + beim Parsen verworfene). |
imported | integer | ja | in DIESEM Aufruf frisch persistierte Zeilen. |
deduplicated | integer | ja | bereits vorhandene Zeilen (vom Unique-Index verschluckt) — ein Wiederhol-Import ist gefahrlos. |
discarded | integer | ja | nicht gebuchte (Status ≠ BOOK) und nicht dedup-fähige Posten. |
excluded | integer | ja | Posten, die wegen Konto-Ausschluss (#998) NICHT importiert wurden. |
exclusion | object | null | ja | Ausschluss-Zustand der Bankverbindung (wann/warum), sonst null. |
BankUmsatzListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
bankAccountId | string(uuid) | ja | |
iban | string | ja | |
propertyId | string(uuid) | ja | |
stillgelegt | boolean | ja | Auskunft, kein Filter: eine stillgelegte Verbindung liefert ihren Bestand weiter aus. |
importAusgeschlossen | boolean | ja | Ist die Verbindung vom automatisierten Import ausgenommen? |
menge | alle | offen | gebucht | ja | |
umsaetze | array<BankUmsatz> | ja | |
abgeschnitten | boolean | ja | GEMESSEN, nicht geraten: true ⇔ es gibt mehr Zeilen als `limit`. |
BankUpdateRequest
Partieller Patch — mindestens ein Feld muss gesetzt sein. `propertyId` ist nicht patchbar.
| Feld | Typ | Pflicht | Beschreibung |
|---|
iban | string | nein | wird normalisiert und prüfziffernvalidiert |
kind | bank | kasse | ruecklage | kautionskonto | nein | |
glaeubigerId | string | null | nein | null setzt die Gläubiger-ID zurück |
glAccountId | string(uuid) | nein | Bank-Sachkonto dieser Bankverbindung (#1859) — muss ein aktives Konto mit kontotyp=bank DESSELBEN Objekts sein. Nicht nullable: gesetzt oder nicht angefasst. |
Bankzugang
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
connectionId | string(uuid) | ja | BANKSapi-Verbindung, unter der der Zugang hängt (tenant-intern) |
bankAccountId | string(uuid) | null | ja | zugeordnete Bankverbindung (Stammdatum); null, solange keine zugeordnet ist |
providerBankId | string | null | ja | Bank-Kennung beim Anbieter; null, solange der Anbieter keine geliefert hat |
accessKind | xs2a | ebics | ja | Zugangsweg |
status | ausstehend | aktiv | wartet_auf_bank | fehler | getrennt | ja | Lebenszyklus-Status des Zugangs |
consentValidUntil | string(date-time) | null | ja | Ablauf der Einwilligung; null, solange keine vorliegt |
scaRequired | boolean | ja | true ⇒ der Zugang wartet auf eine starke Kundenauthentifizierung |
lastSyncAt | string(date-time) | null | ja | letzter Status-Nachzug beim Anbieter; null bis zum ersten |
lastIssueCodes | array<string> | ja | letzte Anbieter-Meldungscodes (z. B. BA1011, USER_CANCELLED); leer ⇒ keine |
createdAt | string(date-time) | ja | |
BankZugangArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | Zeitpunkt der Archivierung (UI „Löschen" — keine Zeile wird physisch gelöscht) |
objektkonten | array<object> | ja | die mitarchivierten Objektkonten |
BankZugangConfirmRequest
Vier-Augen-Bestätigung: verlangt das Recht `bankverbindung.bestaetigen`. Wer den Stand erfasst hat (Anlage, IBAN-Wechsel, Objekt hinzugefügt), bestätigt ihn bei aktivem Vier-Augen-Prinzip und mindestens zwei Berechtigten nicht selbst.
| Feld | Typ | Pflicht | Beschreibung |
|---|
gesehenIban | string | ja | die IBAN, die die bestätigende Person gesehen hat (beliebige Schreibweise, kanonisch verglichen). Weicht sie vom aktuellen Stand ab ⇒ abgewiesen. |
gesehenObjektIds | array<string(uuid)> | ja | die Objekte, die die bestätigende Person gesehen hat — als MENGE verglichen. Weicht sie vom aktuellen Stand ab ⇒ abgewiesen. |
BankZugangConfirmResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | der bestätigte Zugang (bank_zugaenge.id) |
bestaetigtVon | string | ja | Kennung der bestätigenden Person (der Aufrufer) |
bestaetigtAm | string(date-time) | ja | Zeitpunkt der Bestätigung |
ohneVierAugen | boolean | ja | true ⇒ die erfassende Person hat selbst bestätigt (Schalter aus oder höchstens eine berechtigte Person) — Audit-Spur |
BankZugangCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
bezeichnung | string | ja | frei vergebene Bezeichnung; leer ⇒ „Bitte eine Bezeichnung erfassen." |
bank | string | ja | Name der kontoführenden Bank; leer ⇒ „Bitte die Bank erfassen." |
iban | string | ja | IBAN — wird normalisiert und geprüft (alle SEPA-Länder, mod-97); ungültig ⇒ 400. Schon verbunden ⇒ „Diese IBAN ist bereits als Bankkonto verbunden." |
anbindung | api | datei | ja | `api` (Bankanbindung) oder `datei` (Kontoauszug-Import) |
objektIds | array<string(uuid)> | nein | Objekte des Zugangs — je Objekt entsteht ein Objektkonto derselben IBAN. Weglassen ⇒ Zugang ohne Objekt. |
BankZugangCreateResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | der angelegte Zugang (bank_zugaenge.id) |
status | wartet | ja | ein neuer Zugang wartet immer auf Bestätigung |
objektkonten | array<object> | ja | die Objektkonten in der Reihenfolge von `objektIds` |
BankZugangDisconnectResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
getrenntAm | string(date-time) | ja | Zeitpunkt der Trennung; die Bestätigung gilt damit nicht mehr |
bankfreigabeGetrennt | boolean | ja | true ⇒ in derselben Aktion wurde eine verknüpfte Bankfreigabe getrennt (Anbindung `api`) |
BankZugangHauptkontoRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | das Objekt, dessen Hauptkonto das Objektkonto dieses Zugangs wird; ohne Objektkonto dort ⇒ „Dieses Bankkonto ist nicht mit dem Objekt verknüpft." |
BankzugangListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
bankzugaenge | array<Bankzugang> | ja | |
BankZugangObjekteRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektIds | array<string(uuid)> | ja | die ZIELMENGE der Objekte. Hinzugefügt ⇒ neues Objektkonto (der Zugang wartet wieder); entfernt ⇒ Objektkonto archiviert — nur wenn unbenutzt, sonst „Objekt {Nr} verwendet dieses Konto noch ({Gründe})." |
BankZugangObjekteResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
hinzugefuegt | array<object> | ja | neu angelegte Objektkonten |
entfernt | array<object> | ja | archivierte Objektkonten (keine Zeile wird gelöscht) |
BankZugangRecheckResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
zuletztGeprueftAm | string(date-time) | ja | Zeitpunkt der Prüfung; der Zugang wartet danach auf eine neue Bestätigung |
BankZugangUpdateRequest
Das ganze Formular: Bezeichnung, Bank und IBAN immer, BIC optional.
| Feld | Typ | Pflicht | Beschreibung |
|---|
bezeichnung | string | ja | |
bank | string | ja | |
iban | string | ja | wird normalisiert und geprüft. Ein Wechsel schreibt die neue IBAN in alle Objektkonten und lässt die Bestätigung verfallen (Status `wartet`). Gehört sie einem anderen Zugang ⇒ „Diese IBAN gehört bereits zu einem anderen Bankkonto." |
bic | string | null | nein | null oder leer ⇒ keine BIC; weglassen ⇒ unverändert |
BankZugangUpdateResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
ibanGeaendert | boolean | ja | true ⇒ die IBAN hat gewechselt; der Zugang wartet wieder auf Bestätigung |
BauabzugAnmeldungMonat
| Feld | Typ | Pflicht | Beschreibung |
|---|
anmeldemonat | string | ja | JJJJ-MM |
faelligAm | string(date) | ja | 10. des Folgemonats |
summeCents | string | ja | Summe der Einbehalte des Monats |
currency | string | ja | |
anzahl | integer | ja | |
BauabzugAnmeldungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | |
monate | array<BauabzugAnmeldungMonat> | ja | aufsteigend nach Monat; Monate ohne Einbehalt erscheinen nicht |
BauabzugBescheinigungsBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | gueltig | fehlt | abgelaufen | anderer-auftrag | ja | |
nummer | string | null | ja | |
gueltigBis | string(date) | null | ja | |
auftragsbezug | string | null | ja | |
BauabzugPruefung
| Feld | Typ | Pflicht | Beschreibung |
|---|
paymentOrderId | string(uuid) | ja | |
openItemId | string | ja | |
kreditorPersonId | string(uuid) | ja | |
grund | vermieter-hoechstens-zwei-wohnungen | bescheinigung-gueltig | unter-bagatellgrenze | volle-zahlung-begruendet | einbehalt | ja | |
rechnungsbetragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
auszahlungCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
einbehaltCents | string | ja | bei grund einbehalt die Verbindlichkeit gegenüber dem Finanzamt |
currency | string | ja | |
zahlungstag | string(date) | ja | |
faelligAm | string(date) | null | ja | |
anmeldemonat | string | null | ja | |
bescheinigung | BauabzugBescheinigungsBefund | ja | |
volleZahlungBegruendung | string | null | ja | |
volleZahlungErlaubtVon | string | null | ja | |
BauabzugPruefungenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
pruefungen | array<BauabzugPruefung> | ja | nach Zahlungstag und Posten geordnet |
BelegUploadResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
documentId | string(uuid) | ja | |
outcome | received | duplicate | quarantined | ja | |
quarantineReason | malware | unsupported-type | oversize | scan-unavailable | null | ja | grober Quarantäne-Grund (nur bei outcome=quarantined gesetzt, sonst null). scan-unavailable = Sicherheitsprüfung war nicht verfügbar (Beleg ungeprüft, NICHT beanstandet — unterscheidbar von malware). |
dispatchEnqueued | boolean | ja | Ob der Dispatch-Job (Router-Naht #350) eingereiht werden konnte. Der Ingest ist bei false trotzdem committet (Beleg sichtbar in „Empfangen"); ein Enqueue-Ausfall ist damit SICHTBAR und wird nicht als Erfolg maskiert (PR #525, Finding 2). |
Beschluss
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
lfdNr | integer | ja | Ordnungszahl der Sammlung JE OBJEKT (§ 24 Abs. 7 WEG), ab 1 |
top | string | null | ja | Tagesordnungspunkt (`2.3`); null beim Umlaufbeschluss |
thema | string | ja | |
wortlaut | string | null | ja | null ⇒ im Altbestand nicht überliefert (nicht: leerer Wortlaut) |
kategorie | string | null | ja | Kompetenzgrundlage — FREITEXT, konfigurierbarer Default, kein geschlossenes Vokabular |
quelle | string | ja | etv | umlauf | alt_import |
beschlussDatum | string(date) | null | ja | |
status | string | ja | angenommen | abgelehnt | angefochten | bestandskraeftig | aufgehoben | nichtig |
statusSeit | string(date-time) | ja | |
stimmenJa | string | null | ja | Kopfzahl als Dezimalstring; null ⇒ nicht überliefert (≠ 0) |
stimmenNein | string | null | ja | |
stimmenEnthaltung | string | null | ja | |
anteileJa | string | null | ja | Anteilssumme in Zehntausendsteln als Dezimalstring; null ⇒ nicht überliefert |
anteileNein | string | null | ja | |
anteileEnthaltung | string | null | ja | |
importVermerk | string | null | ja | was der Alt-Import an dieser Zeile entschieden hat |
gegenstaende | array<BeschlussGegenstand> | ja | |
versammlungId | string(uuid) | null | ja | Herkunft: die Versammlung, aus der der Beschluss übernommen wurde; null ⇒ ohne Versammlung (Alt-Import, erfasse_beschluss) |
versammlungDatum | string(date) | null | ja | Datum der Herkunfts-Versammlung; null ⇒ ohne Versammlung |
verkuendetAm | string(date) | null | ja | Verkündungsdatum der Versammlung; null ⇒ ohne Versammlung oder noch nicht verkündet |
anfechtungsfristEnde | string(date) | null | ja | Ende der Anfechtungsfrist (§ 45 WEG, ein Monat ab Verkündung, Wochenende verschoben; Feiertage nicht berücksichtigt); aus dem Fachkern berechnet, nicht gespeichert |
BeschlussErfasseRequest
Erfasst EINEN Beschluss samt Teil-Gegenständen. Ein Änderungsweg existiert bewusst nicht — Korrektur ist ein Zweitbeschluss.
| Feld | Typ | Pflicht | Beschreibung |
|---|
lfdNr | integer | ja | Ordnungszahl der Sammlung, ab 1 — je Objekt eindeutig |
top | string | nein | |
thema | string | ja | |
wortlaut | string | null | nein | |
kategorie | string | nein | |
quelle | string | ja | etv | umlauf | alt_import |
beschlussDatum | string(date) | nein | |
status | string | nein | Anfangsstatus — NUR ein Verkündungszustand (angenommen | abgelehnt); Default angenommen |
stimmenJa | integer | nein | |
stimmenNein | integer | nein | |
stimmenEnthaltung | integer | nein | |
anteileJa | integer | nein | Anteilssumme in Zehntausendsteln |
anteileNein | integer | nein | |
anteileEnthaltung | integer | nein | |
importVermerk | string | nein | |
gegenstaende | array<object> | ja | mindestens EIN Teil-Gegenstand — sonst kann keine Teilanfechtung darauf zeigen |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
BeschlussErfasseResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
lfdNr | integer | ja | |
status | string | ja | |
statusEventId | string(uuid) | ja | das Anlage-Ereignis im append-only-Verlauf |
gegenstaende | array<object> | ja | |
BeschlussGegenstand
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
beschlussId | string(uuid) | ja | |
lfdNr | integer | ja | laufende Nummer INNERHALB des Beschlusses, ab 1 |
bezeichnung | string | ja | |
wortlaut | string | null | ja | null ⇒ nicht gesondert überliefert (nicht: leer) |
bezugArt | string | null | ja | worauf sich der Teil bezieht (ruecklage | wirtschaftsplan | …); null ⇒ kein Bezug |
bezugRef | string(uuid) | null | ja | |
wpGegenstaende | array<vorschuesse | ruecklagenzufuehrung | wirtschaftsplan_als_ganzes> | ja | getragene Wirtschaftsplan-Teil-Gegenstände; leer ⇒ trägt keinen Plan |
wpFortgeltung | boolean | ja | Fortgeltung beschlossen (nur an einem Teil mit vorschuesse) |
ref | string | ja | kanonische Referenzform `beschluss-gegenstand:<uuid>` |
BeschlussImportBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | string | ja | status_geraten | status_nicht_uebernommen | datum_fehlt | wortlaut_fehlt | stimmen_widerspruch |
quellRef | string | ja | |
text | string | ja | |
BeschlussImportFehlschlag
| Feld | Typ | Pflicht | Beschreibung |
|---|
quellRef | string | ja | |
lfdNr | integer | ja | |
grund | string | ja | |
BeschlussImportResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
onr | string | ja | die übernommene Objektnummer des Altbestands |
importiert | integer | ja | Anzahl wirklich geschriebener Beschlüsse |
uebersprungen | array<BeschlussImportUebersprungen> | ja | Tagesordnungspunkte ohne Abstimmung — kein Beschluss |
befunde | array<BeschlussImportBefund> | ja | |
fehlgeschlagen | array<BeschlussImportFehlschlag> | ja | |
BeschlussImportUebersprungen
| Feld | Typ | Pflicht | Beschreibung |
|---|
quellRef | string | ja | Rückverweis in den Altbestand: `ONR/VERNR/ID` |
thema | string | ja | |
grund | string | ja | |
BeschlussListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
status | array<string> | ja | der angewandte Status-Filter; LEER ⇒ die vollständige Sammlung |
beschluesse | array<Beschluss> | ja | |
BeschlussStatusRequest
Schreibt einen Statuswechsel fort: neue Zeile im append-only-Verlauf plus Projektion, in EINER Transaktion.
| Feld | Typ | Pflicht | Beschreibung |
|---|
nachStatus | string | ja | der ZIEL-Zustand; der Ist-Zustand wird gelesen, nie mitgegeben |
grund | string | nein | |
wirksamAb | string(date) | nein | Wirksamkeitsdatum, falls es vom Erfassungszeitpunkt abweicht (Fristablauf liegt in der Vergangenheit) |
uebergangsOptionen | object | nein | Einstellungen der KONFIGURIERBAREN Kanten (Instanzrechtsprechung/Praxis). Harte Nichtigkeits-/BGH-Riegel lassen sich hierüber NICHT öffnen. |
BeschlussStatusResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
beschlussId | string(uuid) | ja | |
vonStatus | string | ja | |
nachStatus | string | ja | |
statusEventId | string(uuid) | ja | |
BrennstoffkontoAktiv
| Feld | Typ | Pflicht | Beschreibung |
|---|
glAccountId | string(uuid) | ja | |
accountNo | string | ja | Kontonummer |
name | string | ja | |
zustand | unbekannt | ja | |
gesetztAm | string(date-time) | ja | |
BrennstoffkontoAufgehobenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
glAccountId | string(uuid) | ja | |
zustand | unbekannt | ja | |
hinweise | array<BrennstoffkontoHinweis> | ja | |
BrennstoffkontoAufhebenRequest
Hebt das Brennstoffkonto des Objekts auf (die Objekt-Id steht im Pfad); das Konto geht auf seinen Ausgangszustand zurück.
| Feld | Typ | Pflicht | Beschreibung |
|---|
bestaetigt | boolean | ja | Pflichtfeld ohne Default (true oder false). true ist nötig, wenn der Ausgangszustand das Konto wieder in die Umlage bringt. Fehlt das Feld, wird abgelehnt (400); es gilt nie still false. |
BrennstoffkontoBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | brennstoffkonto-verteilt-doppelt | ja | |
glAccountId | string(uuid) | ja | |
verlust | BrennstoffkontoVerlust | ja | |
text | string | ja | Klartext: die Heizkosten würden doppelt verteilt. |
BrennstoffkontoGesetztResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
glAccountId | string(uuid) | ja | |
vorzustand | unbekannt | ja | |
abgeloestGlAccountId | string(uuid) | null | ja | Das frühere Brennstoffkonto, falls eines abgelöst wurde. |
verlust | unbekannt | ja | |
hinweise | array<BrennstoffkontoHinweis> | ja | |
BrennstoffkontoHeizkostenKonto
| Feld | Typ | Pflicht | Beschreibung |
|---|
glAccountId | string(uuid) | ja | |
accountNo | string | ja | |
name | string | ja | |
zustand | BrennstoffkontoZustand | ja | |
istBrennstoffkonto | boolean | ja | Ist dies das aktive Brennstoffkonto des Objekts? |
BrennstoffkontoHinweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | vorgaenger-gebucht-nicht-zurueckgesetzt | ja | |
glAccountId | string(uuid) | ja | |
text | string | ja | |
BrennstoffkontoResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
aktiv | unbekannt | ja | |
vorzustand | unbekannt | ja | |
befunde | array<BrennstoffkontoBefund> | ja | Leer, solange kein aktives Brennstoffkonto umlagefähig ist oder einen Schlüssel trägt. |
heizkostenKonten | array<BrennstoffkontoHeizkostenKonto> | ja | Die Konten des Objekts, deren Kostenart (Schlüssel oder BetrKV-Katalog-Schlüssel) eine Heizkostenart ist. |
BrennstoffkontoSetzenRequest
Setzt das Brennstoffkonto des Objekts (die Objekt-Id steht im Pfad). Das Brennstoffkonto verteilt die Heizkosten über die Heizkostenabrechnung und darf nicht zusätzlich als Betriebskosten umgelegt werden. Ein bisheriges Brennstoffkonto geht auf seinen gespeicherten Ausgangszustand zurück.
| Feld | Typ | Pflicht | Beschreibung |
|---|
glAccountId | string(uuid) | ja | Das Konto des Objekts, das Brennstoffkonto werden soll. |
bestaetigt | boolean | ja | Pflichtfeld ohne Default (true oder false). true ist nötig, wenn das Konto umlagefähig ist oder einen Umlageschlüssel trägt: das Setzen macht es nicht umlagefähig und entfernt den Schlüssel. Fehlt das Feld, wird abgelehnt (400); es gilt nie still false. |
BrennstoffkontoVerlust
| Feld | Typ | Pflicht | Beschreibung |
|---|
umlagefaehig | boolean | ja | Das Konto war umlagefähig. |
schluessel | boolean | ja | Das Konto trug einen Umlageschlüssel. |
BrennstoffkontoZustand
| Feld | Typ | Pflicht | Beschreibung |
|---|
isUmlagefaehig | boolean | null | ja | Umlagefähig? null = nie gesetzt (gilt als nicht umlagefähig). |
allocationKeyId | string(uuid) | null | ja | Umlageschlüssel des Kontos; null = ohne Schlüssel. |
BuchungsperiodeFestschreibungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
von | string(date) | nein | Beginn der Periode; Pflicht nur bei der ersten Festschreibung, ein Wirtschaftsjahr-Beginn |
BuchungsperiodeFestschreibungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
festschreibungId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
von | string(date) | ja | |
bis | string(date) | ja | |
neuFestgeschrieben | boolean | ja | true ⇒ eine geöffnete Periode wurde mit genau ihrem Zeitraum neu festgeschrieben |
BuchungsperiodenFestschreibung
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
von | string(date) | ja | erster Tag der Periode, eingeschlossen |
bis | string(date) | ja | letzter Tag der Periode, eingeschlossen |
festgeschriebenAm | string(date-time) | ja | |
festgeschriebenVon | string(uuid) | ja | opake Auth-Id dessen, der festgeschrieben hat |
status | geltend | geoeffnet | ja | geltend = gesperrt (keine Öffnung); geoeffnet = hat eine Öffnung |
oeffnung | unbekannt | ja | |
BuchungsperiodenOeffnung
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
grund | string | ja | Pflichtgrund der Öffnung (Freitext, personenbezogen möglich). |
geoeffnetVon | string(uuid) | ja | opake Auth-Id dessen, der geöffnet hat |
geoeffnetAm | string(date-time) | ja | |
BuchungsperiodenProtokollEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
festschreibungId | string(uuid) | ja | |
oeffnungId | string(uuid) | ja | |
neuFestgeschriebenAm | string(date-time) | null | ja | Zeitpunkt der Neu-Festschreibung derselben Periode; null = noch offen |
saetze | array<BuchungsperiodenProtokollSatz> | ja | nur Journalsätze mit Buchungs- oder Abgrenzungsdatum in der Periode, in der Öffnungszeit; sortiert nach Buchungsnummer |
BuchungsperiodenProtokollSatz
| Feld | Typ | Pflicht | Beschreibung |
|---|
journalEntryId | string(uuid) | ja | |
entryNo | string | ja | Buchungsnummer je Objekt (Integer-STRING) |
entryType | string | ja | |
bookingDate | string(date) | ja | |
accrualDate | string(date) | ja | |
reversesEntryId | string(uuid) | null | ja | gesetzt bei einem Storno-Satz: der stornierte Satz |
erfasstAm | string(date-time) | ja | |
BuchungsperiodenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
aktiv | boolean | ja | Schalter des Objekts, sonst Mandanten-Vorgabe, sonst false; sperrt nichts Bestehendes |
schalterObjekt | boolean | null | ja | eigene Einstellung des Objekts; null = keine |
schalterMandant | boolean | null | ja | Mandanten-Vorgabe; null = keine |
wirtschaftsjahrBeginn | string | ja | `kalenderjahr`, `abweichend_MM-DD` oder `unklar` |
festschreibungen | array<BuchungsperiodenFestschreibung> | ja | alle Festschreibungen des Objekts, nach Beginn sortiert |
protokoll | array<BuchungsperiodenProtokollEintrag> | ja | je Öffnung die Journalsätze; nur Journalsätze, keine offenen Posten |
BuchungsperiodeOeffnungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
festschreibungId | string(uuid) | ja | die zu öffnende Festschreibung DIESES Objekts |
grund | string | ja | Pflichtgrund, getrimmt nicht leer (Freitext) |
BuchungsperiodeOeffnungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
oeffnungId | string(uuid) | ja | |
festschreibungId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
von | string(date) | ja | |
bis | string(date) | ja | |
CliLoginStartRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
state | string | ja | Zufälliger Bindungsnachweis dieser Anmelderunde, URL-sicher, 32–256 Zeichen. KEIN Secret im Token-Sinn — er darf in der Browser-URL stehen. Ein fehlender, fremder oder wiedereingespielter state liefert fail-closed keinen Token; serverseitig ist eine Runde genau einmal bestätigbar und zehn Minuten gültig. |
redirectUri | string | ja | Rückruf-Adresse des kurzlebigen Servers, den die CLI auf der Loopback-Schnittstelle geöffnet hat. Zulässig ist ausschließlich ein Loopback-Name mit Schema http und explizitem Port; alles andere wird fail-closed abgewiesen. |
frisch | boolean | nein | Verlangt eine FRISCHE Browser-Anmeldung (Admin-Step-up, #7110). Ist die Browser-Sitzung älter als 900 Sekunden, schickt die Freigabe-Seite zuerst auf die Sicherheits-Rückfrage (`/login?stepUp=1`); erst eine frische Sitzung bekommt „Freigeben", und nur dann merkt sich der Server die Browser-Freigabe an dieser Sitzung. Fehlt das Feld, gilt `false` (bisheriges Verhalten). Ein Wert, der kein Boolean ist, ergibt 400 `invalid_request`. |
ContractOffset
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
gewerblich | boolean | ja | |
ustRatePercent | string | null | ja | Integer-STRING oder null (kein Gewerbe). |
kostenNetto | ErgebnisMoney | ja | |
kostenUst | unbekannt | ja | |
kostenBrutto | ErgebnisMoney | ja | |
sollVzBk | ErgebnisMoney | ja | |
sollVzHk | ErgebnisMoney | ja | |
sollVz | ErgebnisMoney | ja | |
sollVzBkNetto | unbekannt | ja | |
sollVzHkNetto | unbekannt | ja | |
sollVzNetto | unbekannt | ja | |
istVzBk | unbekannt | ja | |
istVzHk | unbekannt | ja | |
istVz | unbekannt | ja | |
istVzBkNetto | unbekannt | ja | |
istVzHkNetto | unbekannt | ja | |
istVzNetto | unbekannt | ja | |
offeneVz | unbekannt | ja | |
saldo | unbekannt | ja | |
art | nachforderung | guthaben | ausgeglichen | ja | |
DatevBelegpaketDatei
| Feld | Typ | Pflicht | Beschreibung |
|---|
dateiname | string | ja | |
sha256 | string | ja | |
groesseBytes | integer | ja | |
belege | integer | ja | Anzahl der Belege (Belegdateien) im Paket |
inhaltBase64 | string | ja | |
DatevBelegpaketRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
objekte | array<string(uuid)> | ja | die Objekte des Stapels, mindestens eines ("alle" ist eine Wahl, kein Vorgabewert) |
jahr | integer | ja | Kalenderjahr: Zeitraum ist JJJJ-01-01 bis JJJJ-12-31, mit abweichendem wirtschaftsjahrBeginn nur der Teil des Jahres, der im Wirtschaftsjahr liegt (Schnitt leer ⇒ 400) |
beraternummer | string | ja | 1 bis 7 Ziffern, ohne führende Null |
mandantennummer | string | ja | 1 bis 5 Ziffern, ohne führende Null |
sachkontenlaenge | integer | ja | 4 bis 8 |
kontenrahmen | skr03 | skr04 | ja | |
festschreibung | 0 | 1 | ja | Festschreibekennzeichen im Kopfsatz (GoBD-Angabe an DATEV), Pflicht, kein Vorgabewert; der Export löst KEINE Festschreibung in casa.ai aus |
wirtschaftsjahrBeginn | string(date) | nein | Beginn des Wirtschaftsjahres; Vorgabe JJJJ-01-01 des Jahres. Ein abweichender Beginn grenzt den Zeitraum auf Wirtschaftsjahr und Kalenderjahr ein: zwei Stapel (zwei Aufrufe) |
ustDarstellung | automatikkonto | ust_schluessel | nein | |
DatevBelegpaketResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stapel | unbekannt | ja | |
belegpaket | unbekannt | ja | |
ohneBeleg | array<DatevBuchungOhneBeleg> | ja | alle Buchungszeilen ohne Beleg im Paket, aufsteigend nach zeilenNr |
hinweis | string | null | ja | Klartext genau dann, wenn belegpaket null ist |
DatevBuchungOhneBeleg
| Feld | Typ | Pflicht | Beschreibung |
|---|
zeilenNr | integer | ja | 1-basierte Nummer der Buchungszeile im Stapel (ohne Kopf- und Spaltenzeile) |
grund | kein_beleg | quarantaene | original_fehlt | original_beschaedigt | dateityp_nicht_uebertragbar | ja | |
DatevBuchungsstapelDatei
| Feld | Typ | Pflicht | Beschreibung |
|---|
dateiname | string | ja | |
sha256 | string | ja | |
groesseBytes | integer | ja | |
inhaltBase64 | string | ja | |
DatevBuchungsstapelRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
objekte | array<string(uuid)> | ja | die Objekte des Stapels, mindestens eines ("alle" ist eine Wahl, kein Vorgabewert) |
jahr | integer | ja | Kalenderjahr: Zeitraum ist JJJJ-01-01 bis JJJJ-12-31, mit abweichendem wirtschaftsjahrBeginn nur der Teil des Jahres, der im Wirtschaftsjahr liegt (Schnitt leer ⇒ 400) |
beraternummer | string | ja | 1 bis 7 Ziffern, ohne führende Null |
mandantennummer | string | ja | 1 bis 5 Ziffern, ohne führende Null |
sachkontenlaenge | integer | ja | 4 bis 8 |
kontenrahmen | skr03 | skr04 | ja | |
festschreibung | 0 | 1 | ja | Festschreibekennzeichen im Kopfsatz (GoBD-Angabe an DATEV), Pflicht, kein Vorgabewert; der Export löst KEINE Festschreibung in casa.ai aus |
wirtschaftsjahrBeginn | string(date) | nein | Beginn des Wirtschaftsjahres; Vorgabe JJJJ-01-01 des Jahres. Ein abweichender Beginn grenzt den Zeitraum auf Wirtschaftsjahr und Kalenderjahr ein: zwei Stapel (zwei Aufrufe) |
ustDarstellung | automatikkonto | ust_schluessel | nein | |
DatevBuchungsstapelResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
laufId | string(uuid) | null | ja | Zeile in der Export-Historie |
dateiname | string | ja | |
sha256 | string | ja | |
buchungszeilen | integer | ja | |
buchungssaetze | integer | ja | |
summeCents | string | ja | Integer-String in Cent |
exportiertAm | string(date-time) | ja | |
hinweise | array<string> | ja | Hinweise auf nicht festgeschriebene Perioden; leer = vollständig festgeschrieben. Hinweis, kein Abweis. |
datei | DatevBuchungsstapelDatei | ja | |
DatevDebKredRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
objekte | array<string(uuid)> | ja | die Objekte des Stapels, mindestens eines ("alle" ist eine Wahl, kein Vorgabewert) |
jahr | integer | ja | Kalenderjahr: Zeitraum ist JJJJ-01-01 bis JJJJ-12-31, mit abweichendem wirtschaftsjahrBeginn nur der Teil des Jahres, der im Wirtschaftsjahr liegt (Schnitt leer ⇒ 400) |
beraternummer | string | ja | 1 bis 7 Ziffern, ohne führende Null |
mandantennummer | string | ja | 1 bis 5 Ziffern, ohne führende Null |
sachkontenlaenge | integer | ja | 4 bis 8 |
kontenrahmen | skr03 | skr04 | ja | |
festschreibung | 0 | 1 | ja | Festschreibekennzeichen im Kopfsatz (GoBD-Angabe an DATEV), Pflicht, kein Vorgabewert; der Export löst KEINE Festschreibung in casa.ai aus |
wirtschaftsjahrBeginn | string(date) | nein | Beginn des Wirtschaftsjahres; Vorgabe JJJJ-01-01 des Jahres. Ein abweichender Beginn grenzt den Zeitraum auf Wirtschaftsjahr und Kalenderjahr ein: zwei Stapel (zwei Aufrufe) |
ustDarstellung | automatikkonto | ust_schluessel | nein | |
umfang | buchungsstapel | alle-aktiven | ja | Pflicht, kein Vorgabewert: "buchungsstapel" = genau die Personenkonten des Stapels desselben Zeitraums; "alle-aktiven" = zusätzlich jedes nicht archivierte Personenkonto der Objekte (plus alle Kreditoren des Mandanten) |
DatevDebKredResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
dateiname | string | ja | |
sha256 | string | ja | |
personenkonten | integer | ja | |
mitBankverbindung | integer | ja | Anzahl der Personenkonten mit bestätigter Bankverbindung (eine Zahl, keine IBAN) |
exportiertAm | string(date-time) | ja | |
hinweise | array<string> | ja | u. a. "nicht in der Historie abgelegt, Datei jetzt sichern": die Datei ist nicht erneut abrufbar |
datei | DatevBuchungsstapelDatei | ja | |
DatevHistorieDateiResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
laufId | string(uuid) | ja | |
datei | DatevBuchungsstapelDatei | ja | |
DatevHistorieEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
laufId | string(uuid) | ja | |
zeitraumVon | string(date) | ja | |
zeitraumBis | string(date) | ja | |
objekte | array<string(uuid)> | ja | Alle Objekte des Laufs (ein Lauf über A und B steht in der Liste jedes der beiden Objekte) |
dateiname | string | ja | |
sha256 | string | ja | |
buchungszeilen | integer | ja | |
summeCents | string | ja | Integer-String in Cent |
erzeugtAm | string(date-time) | ja | |
erzeugtVon | string | ja | Opake Id der erzeugenden Person |
erzeugtVonArt | string | ja | user | agent | system |
DatevHistorieListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
eintraege | array<DatevHistorieEintrag> | ja | |
weiter | string | null | ja | Opaker Cursor für die nächste Seite (Query weiter); null = Historie zu Ende |
EigentuemerwechselAbgehendRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ownershipId | string(uuid) | ja | |
EigentuemerwechselAbgehendZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
ownershipId | string(uuid) | ja | |
personId | string(uuid) | ja | |
anteil | string | ja | |
endeExklusiv | string(date) | ja | |
EigentuemerwechselErfassenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
grundbuchEintragungAm | string(date) | ja | Stichtag des Wechsels ist die Eintragung im Grundbuch, Abteilung I — nicht der Notartermin. |
abgehend | array<EigentuemerwechselAbgehendRequest> | ja | 1 bis 50 abgehende Eigentumszeilen der Einheit. |
neu | array<EigentuemerwechselNeuRequest> | ja | 1 bis 50 neue Eigentumszeilen; ihre Anteilssumme muss der der abgehenden gleichen. |
verwalterzustimmungAm | string(date) | null | nein | |
verwalterzustimmungDokumentRef | string(uuid) | null | nein | |
EigentuemerwechselErfassenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
wechselId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
grundbuchEintragungAm | string(date) | ja | |
verwalterzustimmungAm | string(date) | null | ja | |
verwalterzustimmungDokumentRef | string(uuid) | null | ja | |
abgehend | array<EigentuemerwechselAbgehendZeile> | ja | |
neu | array<EigentuemerwechselNeuZeile> | ja | |
sevMandateOffen | array<EigentuemerwechselSevMandatOffen> | ja | Laufende SEV-Mandate abgehender Eigentümer; sie werden NICHT automatisch beendet. |
EigentuemerwechselListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
wechsel | array<EigentuemerwechselVorgang> | ja | |
EigentuemerwechselNeuRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
anteil | string | ja | Miteigentumsanteil in Zehntausendsteln als Integer-String, > 0. |
anschreibenEmpfaenger | boolean | nein | |
zustellanweisung | EigentumZustellanweisung | nein | |
bevollmaechtigung | EigentumBevollmaechtigungRequest | nein | |
ustOption | boolean | null | nein | |
EigentuemerwechselNeuZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
ownershipId | string(uuid) | ja | |
personId | string(uuid) | ja | |
anteil | string | ja | |
von | string(date) | ja | |
EigentuemerwechselSevMandatOffen
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
personId | string(uuid) | ja | |
ohneEigentumAb | string(date) | ja | |
EigentuemerwechselVorgang
| Feld | Typ | Pflicht | Beschreibung |
|---|
wechselId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
grundbuchEintragungAm | string(date) | ja | |
verwalterzustimmungAm | string(date) | null | ja | |
verwalterzustimmungDokumentRef | string(uuid) | null | ja | |
abgehendeOwnershipIds | array<string(uuid)> | ja | |
neueOwnershipIds | array<string(uuid)> | ja | |
EigentumAnteilssummeBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | anteilssumme | ja | |
stichtag | string(date) | ja | |
summe | string | ja | |
soll | string | ja | |
EigentumBeendenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
endeExklusiv | string(date) | ja | Erster Tag OHNE Eigentum: „zum 30.06. beendet" ⇒ 2025-07-01. |
EigentumBeendenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ownershipId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
personId | string(uuid) | ja | |
von | string(date) | ja | |
bisExklusiv | string(date) | ja | |
beendet | boolean | ja | false = dasselbe Ende lag schon vor (Erfolg ohne Änderung). |
EigentumBevollmaechtigungAntwort
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
von | string(date) | ja | |
bisExklusiv | string(date) | null | ja | |
vollmachtDokumentRef | string(uuid) | null | ja | |
EigentumBevollmaechtigungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
fenster | EigentumVollmachtFenster | ja | |
vollmachtDokumentRef | string(uuid) | null | nein | |
EigentumEinheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
anteilssumme | string | null | ja | Summe der am Stichtag wirksamen Anteile in Zehntausendsteln als Integer-String. |
befunde | array<anteilssumme_ungleich_10000> | ja | Tatsachen, keine Fehler: die Anteile ergeben am Stichtag nicht 10000. |
zeilen | array<EigentumZeile> | ja | |
EigentumErfassenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
anteil | string | ja | Miteigentumsanteil in Zehntausendsteln als Integer-String, > 0. |
von | string(date) | ja | |
bisExklusiv | string(date) | null | nein | Erster Tag OHNE Eigentum; fehlt ⇒ unbefristet. |
anschreibenEmpfaenger | boolean | nein | Fehlt ⇒ Vorbelegung nach der Zustell-Regel. |
zustellanweisung | EigentumZustellanweisung | nein | |
bevollmaechtigung | EigentumBevollmaechtigungRequest | nein | |
ustOption | boolean | null | nein | |
EigentumErfassenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ownershipId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
personId | string(uuid) | ja | |
anteil | string | ja | |
von | string(date) | ja | |
bisExklusiv | string(date) | null | ja | |
anschreibenEmpfaenger | boolean | ja | |
hatZustellanweisung | boolean | ja | |
bevollmaechtigung | unbekannt | ja | |
ustOption | boolean | null | ja | |
befunde | array<EigentumAnteilssummeBefund> | ja | |
EigentumListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
stichtag | string(date) | ja | |
historie | boolean | ja | true ⇒ auch abgelaufene und künftige Zeilen (`istGegenwart` markiert die wirksamen). |
einheiten | array<EigentumEinheit> | ja | |
EigentumVollmachtFenster
| Feld | Typ | Pflicht | Beschreibung |
|---|
von | string(date) | ja | |
bisExklusiv | string(date) | null | nein | |
EigentumZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
ownershipId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
personId | string(uuid) | ja | |
anteil | string | ja | Miteigentumsanteil in Zehntausendsteln als Integer-String (10000 = 100 %). |
von | string(date) | null | ja | |
endeExklusiv | string(date) | null | ja | Erster Tag OHNE Eigentum; `null` = unbefristet. |
anschreibenEmpfaenger | boolean | ja | |
bevollmaechtigterPersonId | string(uuid) | null | ja | |
bevollmaechtigungVon | string(date) | null | ja | |
bevollmaechtigungEndeExklusiv | string(date) | null | ja | |
ustOption | boolean | null | ja | `null` = nicht erfasst (nie still `false`). |
hatZustellanweisung | boolean | ja | Kennzeichen, dass eine abweichende Zustellanschrift hinterlegt ist; die Anschrift selbst verlässt das Haus nicht. |
istGegenwart | boolean | ja | true, wenn die Zeile am Stichtag wirksam ist. |
EigentumZustellanweisung
| Feld | Typ | Pflicht | Beschreibung |
|---|
empfaengerName | string | null | nein | |
adresse | string | ja | Zustellanschrift als Freitext (1 bis 500 Zeichen). |
Einheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
buildingId | string(uuid) | ja | das Gebäude; nach der Anlage unveränderlich |
propertyId | string(uuid) | null | ja | das Objekt über das Gebäude (LEFT JOIN) |
propertyNo | string | null | ja | Objektnummer (LEFT JOIN) |
unitNo | string | ja | Einheitennummer (Freitext) — eindeutig je Objekt unter den aktiven Einheiten (#5534); eine archivierte Nummer ist wieder frei. Identität ist `id`. |
unitKind | string | ja | wohnung | gewerbe | stellplatz | sonstige — OFFENES Vokabular (kein CHECK) |
bezeichnung | string | null | ja | Bezeichnung der Einheit (#5534, ≤ 200 Zeichen); `null` ⇒ Bestandseinheit ohne Bezeichnung. |
archivedAt | string(date-time) | null | ja | gesetzt ⇒ archiviert (K5: kein DELETE) |
createdAt | string(date-time) | ja | |
EinheitArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | |
alreadyArchived | boolean | ja | true ⇒ die Einheit war bereits archiviert (expliziter No-op). |
EinheitAttribut
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitId | string(uuid) | ja | |
attributeKey | string | ja | Attribut-Schlüssel (OFFENES Vokabular): flaeche | personenzahl | mea | festbetrag | … |
attributeValue | object | ja | Strukturierter JSON-Wert der Scheibe (z. B. Fläche als Dezimal-String). |
validFrom | string(date) | null | ja | Beginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit. |
validTo | string(date) | null | ja | Ende EXKLUSIV; null ⇒ laufend. |
validRange | string | ja | Rohes daterange-Literal, z. B. [2026-01-01,). |
active | boolean | ja | Ist die Scheibe am Stichtag (asOf) wirksam (valid_range @> asOf)? |
createdAt | string(date-time) | ja | |
EinheitAttributListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
asOf | string(date) | ja | der wirksame Stichtag, gegen den `active` je Scheibe gemessen wurde |
attribute | array<EinheitAttribut> | ja | |
EinheitAttributSetRequest
Setzt/ändert eine Attribut-Zeitscheibe „ab validFrom" (SCD-2); Überschneidungen ⇒ 400.
| Feld | Typ | Pflicht | Beschreibung |
|---|
attributeKey | string | ja | flaeche | personenzahl | mea | festbetrag | … (offenes Vokabular) |
attributeValue | object | ja | strukturierter JSON-Wert (leeres Objekt zulässig) |
validFrom | string(date) | ja | Beginn der Gültigkeit (INKLUSIV) — das „ab" der Änderung |
validTo | string(date) | nein | optionales Ende (EXKLUSIV); ohne Angabe laufend |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
EinheitAttributSetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitId | string(uuid) | ja | |
attributeKey | string | ja | |
attributeValue | object | ja | |
validFrom | string(date) | ja | |
validTo | string(date) | null | ja | |
validRange | string | ja | |
supersededPriorSlice | boolean | ja | true ⇒ eine zuvor offene Scheibe wurde an validFrom abgeschlossen (SCD-2). |
EinheitBelegungBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | belegung_fehlt | personenzahl_fehlt | zustand_widerspricht_vertragslage | drittnutzer_fehlt | ja | |
ampel | gruen | gelb | rot | ja | |
hinweis | string | ja | |
EinheitBelegungHistorieResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
stichtag | string(date) | ja | der Stichtag, gegen den `active` je Scheibe gemessen wurde |
scheiben | array<EinheitBelegungScheibe> | ja | |
EinheitBelegungPartei
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | mietpartei | eigentuemer | drittnutzer | leerstand | ja | |
personId | string(uuid) | null | ja | null ausschliesslich bei art=leerstand — dort gibt es keine Person, wohl aber eine Identität. |
name | string | ja | Anzeigename; bei art=leerstand die stabile Platzhalter-Identität (nie leer). |
contractId | string(uuid) | null | ja | Der casa-Mietvertrag; null ausserhalb von art=mietpartei. |
EinheitBelegungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
stichtag | string(date) | ja | der wirksame Stichtag, gegen den aufgelöst wurde |
verwaltungsart | miet | weg | pro | null | ja | Verwaltungsart des Objekts; null, wenn die Kette Einheit→Gebäude→Objekt reisst. |
quelle | abgeleitet | gepflegt | ja | abgeleitet = aus der Vertragslage (casa führt den Mietvertrag) · gepflegt = aus der erfassten Zeitscheibe (fremdverwaltete WEG-Einheit). |
zustand | selbstgenutzt | vermietet | leerstand | unbekannt | ja | selbstgenutzt | vermietet | leerstand | unbekannt. "unbekannt" ist NICHT speicherbar — es heisst „auf der gepflegten Achse ist am Stichtag nichts erfasst" und ausdrücklich nicht „hier wohnt niemand". |
personenzahl | integer | null | ja | Kopfzahl am Stichtag; null = nicht erfasst. |
parteien | array<EinheitBelegungPartei> | ja | Mehrere sind der Normalfall (Miteigentum, zwei Mietparteien); bei Leerstand genau eine. |
zeitscheibe | unbekannt | ja | |
befunde | array<EinheitBelegungBefund> | ja | |
ampel | gruen | gelb | rot | ja | Die riskanteste Einzel-Ampel aller Befunde; ohne Befund gruen. |
EinheitBelegungScheibe
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitId | string(uuid) | ja | |
zustand | selbstgenutzt | vermietet | leerstand | ja | selbstgenutzt | vermietet | leerstand (geschlossen). |
personenzahl | integer | null | ja | Kopfzahl der Scheibe; null = NICHT ERFASST (Befund personenzahl_fehlt). |
drittnutzerPersonId | string(uuid) | null | ja | Der „Mieter des Eigentümers" als persons.id — reiner Kontakt, kein Vertrag, kein Debitor. |
validFrom | string(date) | null | ja | Beginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit. |
validTo | string(date) | null | ja | Ende EXKLUSIV; null ⇒ laufend. |
validRange | string | ja | Rohes daterange-Literal, z. B. [2026-01-01,). |
active | boolean | ja | Ist die Scheibe am Stichtag wirksam (valid_range @> stichtag)? |
createdAt | string(date-time) | ja | |
EinheitBelegungSetRequest
Setzt/ändert die GEPFLEGTE Belegungs-Zeitscheibe „ab validFrom" (SCD-2); Überschneidungen ⇒ 400.
| Feld | Typ | Pflicht | Beschreibung |
|---|
zustand | selbstgenutzt | vermietet | leerstand | ja | |
personenzahl | integer | null | nein | Kopfzahl; weggelassen/null = nicht erfasst. Bei zustand=leerstand ist 0 NICHT wählbar (BGH VIII ZR 159/05). |
drittnutzerPersonId | string(uuid) | null | nein | Nur bei zustand=vermietet zulässig; die Person muss existieren und aktiv sein. |
validFrom | string(date) | ja | Beginn der Gültigkeit (INKLUSIV) — das „ab" der Änderung |
validTo | string(date) | nein | optionales Ende (EXKLUSIV); ohne Angabe laufend |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
EinheitBelegungSetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitId | string(uuid) | ja | |
zustand | selbstgenutzt | vermietet | leerstand | ja | |
personenzahl | integer | null | ja | |
drittnutzerPersonId | string(uuid) | null | ja | |
validFrom | string(date) | ja | |
validTo | string(date) | null | ja | |
validRange | string | ja | |
supersededPriorSlice | boolean | ja | true ⇒ eine zuvor offene Scheibe wurde an validFrom abgeschlossen (SCD-2). |
EinheitCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
buildingId | string(uuid) | ja | Das Gebäude, an dem die Einheit hängt. MUSS aktiv sein (sonst 400). |
unitNo | string | ja | Einheitennummer (Freitext) — eindeutig je Objekt unter den aktiven Einheiten (#5534); vergeben ⇒ 409 „Diese Einheitennummer ist bereits vergeben." |
unitKind | string | ja | wohnung | gewerbe | stellplatz | sonstige (offenes Vokabular) |
bezeichnung | string | ja | Bezeichnung der Einheit — PFLICHT (#5534), 1…200 Zeichen. |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
EinheitEinnahmeartResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
einnahmeart | wohnung | andere_raeume | angehoerige | nicht_steuerpflichtig | null | ja | |
geschoss | string | null | ja | |
EinheitEinnahmeartSetRequest
Setzt die Einnahmeart (und optional das Geschoss) einer Einheit für die Gliederung der Mieteinnahmen.
| Feld | Typ | Pflicht | Beschreibung |
|---|
einnahmeart | wohnung | andere_raeume | angehoerige | nicht_steuerpflichtig | null | ja | wohnung | andere_raeume | angehoerige | nicht_steuerpflichtig; null = Einnahmeart entfernen. PFLICHT im Körper — kein Default, keine Ableitung aus der Einheitenart. |
geschoss | string | null | nein | Geschoss als Freitext (getrimmt 1…50 Zeichen); weggelassen = unverändert, null = entfernen. |
Einheitengruppe
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
name | string | ja | |
groupKind | string | ja | Art (OFFENES Vokabular): untergemeinschaft | wirtschaftseinheit | liegenschaft | … — die Spalte hat keinen CHECK. |
archivedAt | string(date-time) | null | ja | null ⇒ aktiv |
createdAt | string(date-time) | ja | |
EinheitengruppeCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
name | string | ja | |
groupKind | string | ja | untergemeinschaft | wirtschaftseinheit | liegenschaft | … (offenes Vokabular) |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
EinheitengruppeDetailResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
einheitengruppe | Einheitengruppe | ja | |
asOf | string(date) | ja | der wirksame Stichtag, gegen den `active` je Mitgliedschaft gemessen wurde |
mitglied | array<EinheitengruppeMitglied> | ja | |
EinheitengruppeListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
einheitengruppe | array<Einheitengruppe> | ja | |
EinheitengruppeMitglied
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitGroupId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
unitNo | string | null | ja | Einheitennummer (LEFT JOIN); null, wenn die Kette reißt |
validFrom | string(date) | null | ja | Beginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit |
validTo | string(date) | null | ja | Ende EXKLUSIV; null ⇒ laufend |
validRange | string | ja | Rohes daterange-Literal, z. B. [2026-01-01,) |
active | boolean | ja | Ist die Mitgliedschaft am Stichtag (asOf) wirksam? |
createdAt | string(date-time) | ja | |
EinheitengruppeMitgliedAddRequest
Nimmt eine Einheit „ab validFrom" in den Kreis auf (SCD-2 je (Kreis, Einheit)). Eine offene Vorgänger-Scheibe derselben Einheit wird an validFrom abgeschlossen; Überschneidungen derselben Einheit IM SELBEN Kreis werden abgelehnt (400).
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
validFrom | string(date) | ja | Beginn INKLUSIV — das „ab" der Aufnahme |
validTo | string(date) | nein | optionales Ende (EXKLUSIV); ohne Angabe laufend |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
EinheitengruppeMitgliedAddResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitGroupId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
validFrom | string(date) | ja | |
validTo | string(date) | null | ja | |
validRange | string | ja | |
supersededPriorSlice | boolean | ja | true ⇒ eine zuvor offene Scheibe derselben Einheit wurde an validFrom abgeschlossen. |
EinheitengruppeMitgliedEndRequest
Beendet die offene Mitgliedschaft einer Einheit zum Stichtag (obere Bereichsgrenze setzen).
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
endDate | string(date) | ja | Tag, ab dem die Mitgliedschaft NICHT mehr gilt (EXKLUSIV) |
EinheitengruppeMitgliedEndResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitGroupId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
endDate | string(date) | ja | |
validRange | string | ja | |
alreadyEnded | boolean | ja | true ⇒ war bereits beendet; endDate trägt das URSPRÜNGLICHE Ende. |
EinheitengruppeUpdateRequest
Mindestens ein Feld muss gesetzt sein (leerer Patch ⇒ 400).
| Feld | Typ | Pflicht | Beschreibung |
|---|
name | string | nein | |
groupKind | string | nein | |
EinheitListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | archiviert | ja | der wirksame 3-Wege-Filter (wirkt NUR auf units.archived_at) |
einheiten | array<Einheit> | ja | |
EinheitReactivateResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
reactivatedAt | string(date-time) | ja | |
alreadyActive | boolean | ja | |
EinheitUpdateRequest
Partieller Patch. `buildingId` ist BEWUSST nicht patchbar (potenzieller Rechnungskreis-Wechsel).
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitNo | string | nein | Neue Einheitennummer — eindeutig je Objekt (#5534), sonst 409. |
unitKind | string | nein | |
bezeichnung | string | nein | Neue Bezeichnung (#5534), 1…200 Zeichen. |
EinnahmenAusgabenGegenkontoSumme
| Feld | Typ | Pflicht | Beschreibung |
|---|
gegenkonto | string | ja | |
zufluss | EinnahmenAusgabenSumme | ja | |
abfluss | EinnahmenAusgabenSumme | ja | |
EinnahmenAusgabenPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
buchungId | string(uuid) | ja | Der Buchungssatz, aus dem diese Zeile stammt (`journal_entries.id`). |
datum | string(date) | ja | Buchungsdatum — die Zeitachse des Geldflusses. |
geldkonten | array<string> | ja | Die Geldkonten, über die diese Zeile gelaufen ist — in der Regel GENAU EINES. Mehrere nur bei mehreren Bankzeilen im Satz; dort wäre die Benennung EINES Kontos eine Erfindung. Nie leer: bei `verrechnet` steht hier das Konto, gegen das verrechnet wurde. |
verrechnet | boolean | ja | true = die Zeile stand der Geldkonto-Seite nicht unmittelbar gegenüber, sondern wurde INNERHALB des Satzes gegen sie verrechnet (Einbehalt, Abzug). Der Betrag ist über die genannten Geldkonten gelaufen, nur saldiert mit der Gegenzeile desselben Satzes — er zählt deshalb voll als Einnahme bzw. Ausgabe (§ 4 Abs. 3 EStG kennt keine Netto-Einnahme). |
gegenkonto | string | ja | Das Gegenkonto der Zeile (Erlös-, Kosten- oder Personenkonto). |
richtung | zufluss | abfluss | ja | zufluss = Einnahme (Geld kam herein), abfluss = Ausgabe. |
bruttoCents | string | ja | Betrag der Gegenzeile, vorzeichenlos — Brutto (mit USt). |
ustCents | string | ja | USt-Anteil; "0", wenn die Zeile keinen nennt. |
nettoCents | string | ja | brutto − ust. |
ustSatz | string | null | ja | USt-Satz der Zeile als Dezimalstring (`19.00`); `null` = keiner erfasst. |
ustHerkunft | gebucht | abgeleitet | ohne | ja | GG7, feldweise Provenienz: `gebucht` = der Betrag stand an der Buchungszeile, `abgeleitet` = aus dem Satz gerechnet (kaufmännisch auf den Cent), `ohne` = weder Betrag noch Satz. |
belegnummer | string | null | ja | Belegnummer des Satzes; `null` = keine erfasst. |
belegId | string(uuid) | null | ja | Das verknüpfte Belegdokument (`documents.id`); `null` = die Beleg-Kette löst nicht auf. |
EinnahmenAusgabenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
von | string(date) | ja | Erster Tag des Zeitraums (Echo, inklusive). |
bis | string(date) | ja | Letzter Tag des Zeitraums (Echo, inklusive). |
gegenkonto | string | null | ja | Das angefragte EINE Gegenkonto (Echo) oder `null` für „alle Gegenkonten". |
positionen | array<EinnahmenAusgabenPosition> | ja | |
jeGegenkonto | array<EinnahmenAusgabenGegenkontoSumme> | ja | Summen je Gegenkonto, nach Kontonummer geordnet. |
einnahmen | EinnahmenAusgabenSumme | ja | |
ausgaben | EinnahmenAusgabenSumme | ja | |
umbuchungen | array<EinnahmenAusgabenUmbuchung> | ja | |
eroeffnungen | array<EinnahmenAusgabenPosition> | ja | BESTANDSVORTRÄGE des Zeitraums (`entry_type = eroeffnung`) in derselben Form wie eine Position — ausdrücklich NICHT in `einnahmen`, `ausgaben` oder `jeGegenkonto`: ein Anfangsbestand sieht aus wie eine Einnahme und ist keine, das Geld war schon da. Sie stehen hier, damit die Geldkonten-Entwicklung (Anfangsbestand + Einnahmen − Ausgaben = Endbestand) aufgeht, ohne den Anfangsbestand aus der Differenz zu erraten. `richtung` sagt, auf welcher Seite der Vortrag stand — nicht, dass Geld geflossen wäre. |
ohneGeldkontoSeite | integer | ja | Sätze des Zeitraums OHNE jede Geldkonto-Zeile (Sollstellung, Bestandsvortrag ohne Bank) — die ehrliche Differenz zum Buchungsjournal, nicht verschwiegen. |
EinnahmenAusgabenSumme
| Feld | Typ | Pflicht | Beschreibung |
|---|
bruttoCents | string | ja | Σ Brutto (mit USt), vorzeichenlos. |
ustCents | string | ja | Σ USt-Anteil. |
nettoCents | string | ja | Σ Brutto − Σ USt. |
anzahl | integer | ja | Anzahl der Positionen in dieser Summe (eine Summe ohne Zähler ist nicht prüfbar). |
EinnahmenAusgabenUmbuchung
| Feld | Typ | Pflicht | Beschreibung |
|---|
buchungId | string(uuid) | ja | |
datum | string(date) | ja | |
vonGeldkonten | array<string> | ja | Geldkonten im HABEN des Satzes (Abgang). |
nachGeldkonten | array<string> | ja | Geldkonten im SOLL des Satzes (Zugang). |
betragCents | string | ja | Übertragener Betrag = min(Σ Soll, Σ Haben) der Geldzeilen. |
ErfasseZeitRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
leistungsdatum | string(date) | ja | Tag der Leistung, nicht in der Zukunft. |
dauerMinuten | integer | ja | Ganze Minuten, 1 bis 1440. |
taetigkeitsart | telefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstiges | ja | |
bezugArt | objekt | anliegen | sonderleistung | nein | |
bezugId | string(uuid) | null | nein | Genau bei bezugArt anliegen oder sonderleistung. |
notiz | string | null | nein | |
ErgebnisMoney
| Feld | Typ | Pflicht | Beschreibung |
|---|
cents | string | ja | Betrag in Cent als Dezimal-Integer-STRING (nie number, nie gerundet, nie mit Dezimalpunkt). |
currency | EUR | ja | |
ErgebnisRecipient
Leerstand gehört dem EIGENTÜMER und wird EXPLIZIT ausgewiesen: ohne diese Unterscheidung wäre „Σ Mieteranteile ≠ Gesamtbetrag" nicht erklärbar. Bei art = mieter ist contractId PFLICHT; bei art = eigentuemer_leerstand gibt es keinen.
Typ: object | object
EroeffnungsProvenienz
| Feld | Typ | Pflicht | Beschreibung |
|---|
journalEntryId | string(uuid) | ja | |
contractId | string(uuid) | ja | |
quellSchluessel | string | ja | Die einzelne Quellzeile — ohne sie wäre in einem 2.778-Zeilen-Lauf nur die Datei bekannt. |
uebernahmestichtag | string(date) | ja | Der EINGEGEBENE Übernahmestichtag, unverändert. |
quellsystem | string | ja | Das Altsystem, z. B. 'win-casa'. |
exportiertAm | string(date-time) | ja | Der EXPORT aus dem Altsystem, nicht der Import. |
dateiHash | string | ja | SHA-256 der Sicherungsdatei, 64 Hex, kleingeschrieben. |
FestschreibungSchalterRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | null | ja | das Objekt; null = Mandanten-Vorgabe |
aktiv | boolean | ja | |
FestschreibungSchalterResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | null | ja | |
aktiv | boolean | ja | |
FinanzstatusResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
stichtag | string(date) | ja | Der Stichtag der Vermögensübersicht: der angefragte `stichtag` oder — im Zeitraum-Modus — `bis`. |
entwicklung | unbekannt | ja | |
vermoegen | Vermoegensuebersicht | ja | |
Freistellungsbescheinigung
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
kreditorPersonId | string(uuid) | ja | |
nummer | string | ja | |
gueltigBis | string(date) | ja | |
umfang | allgemein | auftragsbezogen | ja | |
auftragsbezug | string | null | ja | |
finanzamt | string | ja | |
FreistellungsbescheinigungenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
kreditorPersonId | string(uuid) | ja | |
bescheinigungen | array<Freistellungsbescheinigung> | ja | absteigend nach Gültigkeit |
FremdvertragAnlegenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | Pflicht: das Objekt |
art | versicherung | wartung | dienstleistung | versorgung | ja | Pflicht: versicherung | wartung | dienstleistung | versorgung |
partnerPersonId | string(uuid) | ja | Pflicht: Person mit gültiger Rolle Kreditor oder Dienstleister |
bezeichnung | string | ja | Pflicht: 1 bis 140 Zeichen |
vertragsnummer | string | nein | optional: 1 bis 80 Zeichen |
beginn | string(date) | ja | |
laufzeitEnde | string(date) | nein | |
kuendigungsfristMonate | integer | ja | Pflicht: 0 bis 60 |
verlaengerungStillschweigend | boolean | nein | ohne Angabe: Vorgabe der Mandanten-Einstellung, sonst ja |
verlaengerungMonate | integer | nein | ohne Angabe bei stillschweigender Verlängerung: Vorgabe der Einstellung, sonst 12 |
beitrag | unbekannt | nein | |
beitragIntervall | monatlich | zweimonatlich | quartalsweise | halbjaehrlich | jaehrlich | nein | |
selbstbehalt | unbekannt | nein | |
bemerkung | string | nein | optional: 1 bis 2000 Zeichen |
FremdvertragAnlegenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragId | string(uuid) | ja | |
konditionen | FremdvertragKonditionenErgebnis | ja | |
FremdvertragBeendigungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
beendetAm | string(date) | ja | |
grund | string | nein | optional: 1 bis 200 Zeichen |
FremdvertragBeendigungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragId | string(uuid) | ja | |
ereignisId | string(uuid) | ja | |
beendetAm | string(date) | ja | |
FremdvertragBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | laufzeit-fehlt | kuendigungsfrist-verpasst | beitrag-weicht-von-dauerzahlung-ab | ja | |
bezugEnde | string(date) | null | ja | |
spaetesterZugang | string(date) | null | ja | |
FremdvertragDauerzahlung
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
gueltigAb | string(date) | ja | |
betrag | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
rhythmus | string | ja | |
jahresbetrag | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
FremdvertragDauerzahlungAbgleich
| Feld | Typ | Pflicht | Beschreibung |
|---|
verknuepft | boolean | ja | |
dauerzahlung | unbekannt | ja | |
befund | unbekannt | ja | |
FremdvertragDauerzahlungBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | beitrag-weicht-von-dauerzahlung-ab | ja | |
beitragJahr | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
dauerzahlungJahr | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
differenz | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
FremdvertragDauerzahlungBefundTransport
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | beitrag-weicht-von-dauerzahlung-ab | ja | |
beitragJahr | FremdvertragGeld | ja | |
dauerzahlungJahr | FremdvertragGeld | ja | |
differenz | unbekannt | ja | |
FremdvertragDauerzahlungLoesenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
FremdvertragDauerzahlungLoesenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragId | string(uuid) | ja | |
dauerzahlungId | string(uuid) | ja | |
FremdvertragDauerzahlungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
dauerzahlungId | string(uuid) | ja | Pflicht: Dauerzahlung am selben Objekt, noch an keinem anderen Vertrag |
FremdvertragDauerzahlungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragId | string(uuid) | ja | |
dauerzahlungId | string(uuid) | ja | |
befund | unbekannt | ja | |
FremdvertragEinstellungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorlaufTage | integer | ja | |
verlaengerungStillschweigendVorgabe | boolean | ja | |
verlaengerungMonateVorgabe | integer | ja | |
schadenMeldefristTage | integer | ja | |
schadenhonorarProzentBp | integer | ja | Schadenhonorar in Basispunkten (800 = 8,00 %) |
schadenhonorarProzentText | string | ja | |
schadenhonorarAktiv | boolean | ja | |
herkunft | vorgabe | mandant | ja | |
FremdvertragEinstellungSetzenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorlaufTage | integer | ja | 1 bis 365 |
verlaengerungStillschweigendVorgabe | boolean | ja | |
verlaengerungMonateVorgabe | integer | ja | 1 bis 60 |
schadenMeldefristTage | integer | ja | 1 bis 60 |
schadenhonorarProzentBp | integer | ja | Basispunkte, 0 bis 10000 (800 = 8,00 %) |
schadenhonorarAktiv | boolean | ja | |
FremdvertragEinstellungSetzenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
einstellung | FremdvertragEinstellungWerte | ja | |
vorher | FremdvertragEinstellungWerte | ja | |
geaendert | boolean | ja | |
geaendertVon | string | ja | |
geaendertAm | string(date-time) | ja | |
FremdvertragEinstellungWerte
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorlaufTage | integer | ja | |
verlaengerungStillschweigendVorgabe | boolean | ja | |
verlaengerungMonateVorgabe | integer | ja | |
schadenMeldefristTage | integer | ja | |
schadenhonorarProzentBp | integer | ja | |
schadenhonorarAktiv | boolean | ja | |
FremdvertragEreignis
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
art | string | ja | |
bezugEnde | string(date) | null | ja | |
entscheidung | string | null | ja | |
wirksamZum | string(date) | null | ja | |
grundVorhanden | boolean | ja | |
am | string(date-time) | ja | |
FremdvertragFristenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | der verwendete Stichtag (Berliner Tag der Server-Uhr) |
zeilen | array<FremdvertragFristZeile> | ja | leer ohne Fristen |
FremdvertragFristenStand
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | ohne-laufzeit | laeuft | gekuendigt | beendet | ausgelaufen | ja | |
naechstesEnde | string(date) | null | ja | |
spaetesterZugang | string(date) | null | ja | Letzter Tag, an dem die Kündigung dem Vertragspartner zugehen muss |
aufgabeAb | string(date) | null | ja | Ab diesem Tag steht die Aufgabe offen (Zugangstermin minus Vorlauf) |
aufgabeOffen | boolean | ja | |
verpasstesEnde | string(date) | null | ja | |
verpasstOffen | boolean | ja | |
befunde | array<FremdvertragBefund> | ja | |
FremdvertragFristEntscheidRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
bezugEnde | string(date) | ja | das Vertragsende, auf das sich die Entscheidung bezieht |
entscheidung | verlaengern | kuendigen | neu_ausschreiben | ja | |
grund | string | nein | optional: 1 bis 200 Zeichen |
FremdvertragFristEntscheidResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragId | string(uuid) | ja | |
bezugEnde | string(date) | ja | |
entscheidung | verlaengern | kuendigen | neu_ausschreiben | ja | |
ereignisId | string(uuid) | ja | |
kuendigungAngelegt | false | ja | |
hinweis | string | ja | |
FremdvertragFristZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
kategorie | kuendigungsfrist | frist-verpasst | ohne-laufzeit | ja | |
schluessel | string | ja | |
titel | string | ja | |
objektId | string(uuid) | ja | |
art | versicherung | wartung | dienstleistung | versorgung | ja | |
partner | string | null | ja | |
vertragsende | string(date) | null | ja | |
spaetesterZugang | string(date) | null | ja | |
aufgabeAb | string(date) | null | ja | |
tageBisFrist | integer | null | ja | Tage vom Stichtag bis zum Zugangstermin; negativ, wenn er verstrichen ist |
ampel | gruen | gelb | rot | ja | |
frist | string(date) | null | ja | |
refId | string(uuid) | ja | der Vertrag |
offen | boolean | ja | |
FremdvertragGeld
| Feld | Typ | Pflicht | Beschreibung |
|---|
cents | string | ja | Cent als Integer-STRING, nie eine JSON-Zahl |
currency | EUR | ja | |
FremdvertragKonditionen
| Feld | Typ | Pflicht | Beschreibung |
|---|
version | integer | ja | |
gueltigAb | string(date) | ja | |
laufzeitEnde | string(date) | null | ja | |
kuendigungsfristMonate | integer | ja | |
verlaengerungStillschweigend | boolean | ja | |
verlaengerungMonate | integer | null | ja | |
beitrag | string | null | ja | Beitrag je Intervall in Cent als Integer-STRING |
beitragIntervall | string | null | ja | |
jahresbeitrag | string | null | ja | Jahresbeitrag in Cent als Integer-STRING |
selbstbehalt | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
bemerkungVorhanden | boolean | ja | Der Freitext selbst wird nie ausgegeben, nur das Kennzeichen. |
FremdvertragKonditionenErgebnis
| Feld | Typ | Pflicht | Beschreibung |
|---|
version | integer | ja | |
gueltigAb | string(date) | ja | |
verlaengerungStillschweigend | boolean | ja | |
verlaengerungMonate | integer | null | ja | |
FremdvertragKonditionenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
gueltigAb | string(date) | ja | muss nach dem gueltigAb der letzten Version liegen |
laufzeitEnde | string(date) | null | ja | |
kuendigungsfristMonate | integer | ja | 0 bis 60 |
verlaengerungStillschweigend | boolean | ja | |
verlaengerungMonate | integer | null | ja | bei stillschweigender Verlängerung Pflicht, sonst null |
beitrag | unbekannt | ja | |
beitragIntervall | monatlich | zweimonatlich | quartalsweise | halbjaehrlich | jaehrlich | null | ja | |
selbstbehalt | unbekannt | ja | |
bemerkung | string | null | ja | |
FremdvertragKonditionenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragId | string(uuid) | ja | |
konditionen | FremdvertragKonditionenErgebnis | ja | |
FremdvertragKuendigungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
wirksamZum | string(date) | ja | nicht vor heute |
grund | string | nein | optional: 1 bis 200 Zeichen |
FremdvertragKuendigungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragId | string(uuid) | ja | |
ereignisId | string(uuid) | ja | |
wirksamZum | string(date) | ja | |
fruehestesEnde | string(date) | null | ja | nächstes Vertragsende, zu dem die Kündigung nach Frist wirkt; null ohne Laufzeitende |
spaetesterZugang | string(date) | null | ja | spätester Kündigungszugang zu fruehestesEnde |
FremdvertragListenZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
art | versicherung | wartung | dienstleistung | versorgung | ja | |
bezeichnung | string | ja | |
vertragsnummerVorhanden | boolean | ja | |
propertyId | string(uuid) | ja | |
partner | FremdvertragPartner | ja | |
beginn | string(date) | ja | |
konditionen | unbekannt | ja | |
fristen | unbekannt | ja | |
beendet | boolean | ja | |
dauerzahlungVerknuepft | boolean | ja | |
anzahlSchadenfaelle | integer | ja | |
FremdvertragListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | der verwendete Stichtag (Berliner Tag der Server-Uhr) |
zeilen | array<FremdvertragListenZeile> | ja | nur Verträge der Objekte, für die der Aufrufer zuständig ist; leer ohne Verträge |
gesamt | integer | ja | |
limit | integer | ja | |
offset | integer | ja | |
FremdvertragPartner
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
anzeigename | string | null | ja | |
FremdvertragResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | |
vertrag | FremdvertragStamm | ja | |
beendet | boolean | ja | |
konditionen | unbekannt | ja | |
historie | array<FremdvertragKonditionen> | ja | |
ereignisse | array<FremdvertragEreignis> | ja | |
fristen | unbekannt | ja | |
dauerzahlungAbgleich | FremdvertragDauerzahlungAbgleich | ja | |
schadenfaelle | array<FremdvertragSchadenfallKurz> | ja | |
FremdvertragSchadenfallKurz
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
nummer | string | ja | |
status | erfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossen | ja | |
schadensdatum | string(date) | ja | |
FremdvertragStamm
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
art | versicherung | wartung | dienstleistung | versorgung | ja | |
bezeichnung | string | ja | |
vertragsnummerVorhanden | boolean | ja | |
propertyId | string(uuid) | ja | |
objekt | string | null | ja | |
partner | FremdvertragPartner | ja | |
beginn | string(date) | ja | |
dauerzahlungId | string(uuid) | null | ja | |
Gebaeude
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | das Objekt; nach der Anlage unveränderlich |
propertyNo | string | null | ja | Objektnummer des Elternobjekts (LEFT JOIN) |
address | object | ja | freies Adress-JSON — KEIN erzwungenes Adressmodell |
archivedAt | string(date-time) | null | ja | gesetzt ⇒ archiviert (K5: kein DELETE) |
createdAt | string(date-time) | ja | |
GebaeudeArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | |
alreadyArchived | boolean | ja | true ⇒ das Gebäude war bereits archiviert (expliziter No-op). |
GebaeudeCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | Das Objekt, an dem das Gebäude hängt. MUSS aktiv sein (sonst 400). |
address | object | nein | freies Adress-JSON; ohne Angabe {} |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
GebaeudeListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | archiviert | ja | der wirksame 3-Wege-Filter |
gebaeude | array<Gebaeude> | ja | |
GebaeudeReactivateResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
reactivatedAt | string(date-time) | ja | |
alreadyActive | boolean | ja | |
reactivatedUnits | integer | ja | |
GebaeudeUpdateRequest
Partieller Patch. `propertyId` ist BEWUSST nicht patchbar (Umstrukturierung mit eigenem Pfad).
| Feld | Typ | Pflicht | Beschreibung |
|---|
address | object | nein | |
GeldkontenEntwicklung
| Feld | Typ | Pflicht | Beschreibung |
|---|
zeitraum | SaldenlisteZeitraum | ja | |
konten | array<GeldkontoEntwicklung> | ja | Ein Block je Geldkonto (`gl_accounts.kontotyp = bank`), nach Kontonummer geordnet — auch unbebuchte. |
anfangsbestandCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
zugaengeCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
abgaengeCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
endbestandCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
stimmt | boolean | ja | `stimmt` gilt für JEDES Konto. |
GeldkontoBewegung
| Feld | Typ | Pflicht | Beschreibung |
|---|
entryId | string(uuid) | ja | Der Buchungssatz, aus dem diese Bewegung kommt — der Provenienz-Anker der Zeile. |
entryNo | string | ja | Lückenlose Buchungsnummer je Objekt als Integer-STRING (bigint in der DB). |
lineNo | integer | ja | 1-basierte Position im Satz. |
buchungsdatum | string(date) | ja | Die AUSWAHL-Achse: nur Sätze mit Buchungsdatum im Zeitraum sind Bewegungen. |
wertstellung | string(date) | ja | Die ORDNUNGS-Achse: die Liste steht in aufsteigender Wertstellung (`accrual_date`). |
belegnummer | string | null | ja | |
zugangCents | string | ja | SOLL auf dem Geldkonto, vorzeichenlos. Genau eines von zugang/abgang ist > 0. |
abgangCents | string | ja | HABEN auf dem Geldkonto, vorzeichenlos. |
laufenderSaldoCents | string | ja | Der Saldo NACH dieser Bewegung, signiert (Soll − Haben) und beim Anfangsbestand beginnend. Der LETZTE ist der Endbestand. |
gegenkonten | array<string> | ja | Die übrigen Kontonummern des Satzes, ohne Dubletten — woher das Geld kam bzw. wohin es ging. Leer nur bei einer Umbuchung innerhalb desselben Geldkontos. |
GeldkontoEntwicklung
| Feld | Typ | Pflicht | Beschreibung |
|---|
glAccountNo | string | ja | Kontonummer am Objekt — nur JE OBJEKT eindeutig. |
name | string | ja | |
anfangsbestandCents | string | ja | Saldo aller Sätze VOR `von`, signiert. |
anfangsbestandSeite | S | H | ja | |
zugaengeCents | string | ja | Σ SOLL im Zeitraum (vorzeichenlos). |
abgaengeCents | string | ja | Σ HABEN im Zeitraum (vorzeichenlos). |
endbestandCents | string | ja | Saldo aller Sätze bis `bis`, signiert = Anfangsbestand + Zugänge − Abgänge. |
endbestandSeite | S | H | ja | |
bewegungen | array<GeldkontoBewegung> | ja | |
stimmt | boolean | ja | Anfangsbestand + Zugänge − Abgänge = Endbestand für DIESES Konto. Wird AUSGEWIESEN statt erzwungen — eine Schieflage soll sichtbar sein, nicht die Antwort verhindern. |
HausgeldBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
regel | string | ja | |
fundort | string | ja | WO der Befund sitzt, maschinenlesbar, z. B. `einzelplan:ENR1`. |
meldung | string | ja | Der Satz für den Menschen — nennt die verletzte Zusage, nie einen Fremdwert roh (BP §4). |
HausgeldDifferenzRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | |
wirtschaftsplanId | string(uuid) | ja | |
beschlussRef | string | ja | |
vorschlaege | array<unbekannt> | ja | Die zu buchenden Vorschläge, wie der Lauf sie geliefert hat. MINDESTENS EINER — ein leerer Stapel hätte nichts freizugeben. |
quittiertVon | string | ja | WER quittiert. Ein anonymer Freigabeschritt ist keiner (GoBD). |
quittiertAm | string(date) | ja | WANN, striktes `YYYY-MM-DD`. INJIZIERT — kein Server liest hier eine Uhr (BP §8). |
HausgeldDifferenzResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | ausgefuehrt | bereits_ausgefuehrt | ja | |
schluessel | string | ja | |
positionen | array<HausgeldSollPosition> | ja | Die gebuchten Positionen — Art `differenz`. |
HausgeldDifferenzVorschlag
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
monat | string | ja | Der betroffene Fachkern-Monat `YYYY-MM`. |
bisherCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
neuCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
differenzCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
hausgeldAnteilCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
ruecklagenAnteilCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
schuldner | array<HausgeldSchuldner> | ja | |
planVersion | integer | ja | |
quittungsSchluessel | string | ja | Der Idempotenz-Schlüssel, unter dem GENAU DIESER Vorschlag quittiert wird. |
HausgeldSchuldner
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
ownershipId | string(uuid) | ja | |
anteil | string | ja | Anteil am Innenverhältnis (§ 426 BGB) in ZEHNTAUSENDSTELN als Integer-STRING — KEIN Geld, INV-MONEY-01 ist nicht berührt. |
HausgeldSollListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
jahr | integer | ja | Das abgefragte WIRTSCHAFTSJAHR (Echo) — bei einem Rumpfjahr nicht das Kalenderjahr. |
zeilen | array<HausgeldSollZeile> | ja | |
HausgeldSollPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
monat | string | ja | Der Fachkern-Monat `YYYY-MM` — nie der Monatserste `YYYY-MM-01`, nie ein Zeitstempel. |
art | vorschuss | differenz | ja | vorschuss = der laufende Monat aus dem Plan; differenz = eine QUITTIERTE Rückwirkung. |
betragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
hausgeldAnteilCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
ruecklagenAnteilCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
schuldner | array<HausgeldSchuldner> | ja | Die Eigentümer DER PERIODE, gesamtschuldnerisch (§ 421 BGB), deterministisch nach ownershipId sortiert. |
kontenkreis | string | ja | Träger der Geldkreis-Trennung (S2-T21) — endet auf `:weg_hausgeld`. |
beschlussRef | string | ja | Kanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>` (S12-T02). |
planVersion | integer | ja | |
HausgeldSollRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | Das WIRTSCHAFTSJAHR des Plans. |
geldkreis | string | ja | Bewusst freier Text: `resolveAbrechnungslaufScope` (S2-T21) ist die eine Instanz, die über Geldkreise urteilt. |
wirtschaftsplanId | string(uuid) | ja | |
planVersion | integer | ja | Die Plan-Version, aus der die Zellen stammen; > 0. |
beschlussRef | string | ja | Kanonische Beschluss-Teilgegenstands-Referenz (S12-T02). |
wirtschaftsjahr | object | ja | Das geprüfte Wirtschaftsjahr aus S12-T08 — Form: Fachkern. |
zellen | array<unbekannt> | ja | Die Monatszellen je Einzelplan, aus S12-T08 ÜBERNOMMEN — hier wird nicht gerechnet. |
episoden | array<unbekannt> | ja | Die Abrechnungs-Episoden je Einheit (S12-T01) — der Schuldner DER PERIODE. |
stand | object | ja | Der zu buchende Plan-Stand; geht UNVERÄNDERT an das Buchungs-Gate aus S12-T09. |
HausgeldSollResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | ausgefuehrt | bereits_ausgefuehrt | ja | |
schluessel | string | ja | Der Idempotenz-Schlüssel des Laufs, wie der Fachkern ihn gebildet hat. |
geldkreis | string | ja | |
kontenkreis | string | ja | |
beschlussRef | string | ja | Die Rechtsgrundlage, wie die FREIGABE sie gemeldet hat — nie aus der Eingabe. |
beschlussStatus | string | ja | |
positionen | array<HausgeldSollPosition> | ja | Die GESTELLTEN Positionen, Art `vorschuss`. |
differenzVorschlaege | array<HausgeldDifferenzVorschlag> | ja | Die rückwirkenden Differenzen als VORSCHLAG — NICHT gebucht; leer statt fehlend. |
warnungen | array<HausgeldBefund> | ja | |
HausgeldSollZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
monat | string | ja | Der Fachkern-Monat `YYYY-MM`. |
art | vorschuss | differenz | ja | |
betragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
ruecklagenAnteilCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
HausgeldZahlungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
sollstellungId | string(uuid) | ja | |
zuordnung | nachrangig | quotal | ja | Die ANGEWANDTE Regel (Präzedenz Objekt > Tenant > Default) — immer mitgeliefert, damit ein Beleg entsteht. |
hausgeldCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
ruecklageCents | string | ja | Der TATSÄCHLICH vereinnahmte Rücklagenanteil — nur er wird später zugeführt. |
unverteiltCents | string | ja | Überzahlung, die keiner der beiden Forderungen zufällt. |
position | HausgeldSollPosition | ja | |
HealthResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | healthy | unhealthy | ja | |
checks | array<object> | ja | |
HonorarAnpassungenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
anpassungen | array<HonorarAnpassungZeile> | ja | |
HonorarAnpassungHinweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | string | ja | |
text | string | ja | |
HonorarAnpassungPauschale
| Feld | Typ | Pflicht | Beschreibung |
|---|
einheitentyp | string | ja | |
alt | object | null | ja | |
neu | object | null | ja | |
aenderungBasispunkte | string | null | ja | Kaufmännisch gerundete Änderung in Basispunkten als Integer-STRING; null ohne tragfähige Basis. |
HonorarAnpassungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
anpassungId | string(uuid) | ja | |
neueScheibe | HonorarvereinbarungScheibe | ja | |
geschlosseneScheibe | unbekannt | ja | |
vergleich | HonorarAnpassungVergleich | ja | |
hinweise | array<HonorarAnpassungHinweis> | ja | |
HonorarAnpassungVergleich
| Feld | Typ | Pflicht | Beschreibung |
|---|
berechnungsartAlt | string | ja | |
berechnungsartNeu | string | ja | |
pauschalen | array<HonorarAnpassungPauschale> | ja | |
satzBasispunkte | object | ja | |
HonorarAnpassungZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
wirksamAb | string(date) | ja | |
grundlage | beschluss | zustimmung | klausel | ja | |
beschlussId | string(uuid) | null | ja | |
zustimmungAm | string(date) | null | ja | |
begruendung | string | ja | |
scheibeAlt | HonorarvereinbarungScheibe | ja | |
scheibeNeu | HonorarvereinbarungScheibe | ja | |
createdAt | string(date-time) | ja | |
HonorarBasiswerte
| Feld | Typ | Pflicht | Beschreibung |
|---|
sollmieteCents | string | ja | Mietforderungen (Sollstellungen) mit fachlicher Periode im Monat (accrual_date) abzüglich Storno und Gutschrift; ohne Kosten, Zinsen und sonstige Geldkreise. |
istmieteCents | string | ja | Wirksam einer Mietforderung zugeordnete Bankeingänge mit Zahlungsdatum im Monat (Zahlungszuordnungen ohne Zuordnungsstornos; ohne stornierte Zahlungen). Zahlungen auf Kosten, Hausgeld oder ohne Zuordnung zählen nicht. |
currency | string | ja | |
HonorarEinheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
einheitId | string(uuid) | ja | |
bezeichnung | string | ja | Einheitennummer (`units.unit_no`). |
einheitentyp | string | ja | `unit_kind` — offenes Vokabular (wohnung, gewerbe, stellplatz, …). |
belegt | boolean | ja | Am Monatsletzten durch einen laufenden Vertrag belegt. `false` ⇒ Leerstandsregel greift. |
HonorarPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | grundverguetung | leerstand | mindestbetrag | hoechstbetrag | zuschlag | ja | grundverguetung | leerstand | mindestbetrag | hoechstbetrag | zuschlag — Deckel sind eigene Zeilen, keine stille Korrektur. |
bezeichnung | string | ja | |
einheitId | string(uuid) | null | ja | null ⇒ objektweite Zeile (Prozentbetrag, Deckel). |
einheitentyp | string | null | ja | |
anzahl | integer | ja | Wie oft der Einzelbetrag zählt (Zuschlag: Zahl der Ereignisse). |
nettoCents | string | ja | NEGATIV bei `hoechstbetrag` (Kürzung) — die Aufstellung bleibt addierbar. |
currency | string | ja | |
HonorarSonderleistungPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
sonderleistungId | string(uuid) | ja | |
leistungsdatum | string(date) | ja | Tag der Leistung — bestimmt den Honorarmonat; eine Leistung gehört genau EINEM Monat. |
schluessel | string | ja | Schlüssel der Leistung im Katalog des Objekts (`mahnbescheid`, `bescheinigung_35a`, …). |
bezeichnung | string | ja | Anzeigetext aus dem Katalog zum Erfassungszeitpunkt. |
preisart | fest | je_stunde | je_einheit | ja | fest | je_stunde | je_einheit. |
menge | string | ja | Dezimal-STRING mit Punkt (`"1"`, `"1.25"`), nie eine JSON-number. |
einheitId | string(uuid) | null | ja | Bezug auf eine Einheit des Objekts; null ⇒ objektweite Leistung. |
einzelpreisCents | string | ja | Netto-Preis je Vorgang/Stunde/Einheit aus dem Katalog zum Erfassungszeitpunkt. |
nettoCents | string | ja | Einzelpreis × Menge, kaufmännisch auf den Cent gerundet. |
umsatzsteuersatzProzent | string | ja | Ganze Prozent als Integer-STRING aus dem Katalogeintrag. |
umsatzsteuerCents | string | ja | USt dieser Position, je Position gerundet. |
bruttoCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
HonorarvereinbarungScheibe
| Feld | Typ | Pflicht | Beschreibung |
|---|
gueltigAb | string(date) | ja | |
gueltigBis | string(date) | null | ja | Letzter Tag der Scheibe (einschließlich); null ⇒ läuft weiter. |
berechnungsart | string | ja | |
pauschaleJeEinheitentyp | object | ja | Pauschale je Einheitentyp als { cents, currency }. |
satzBasispunkte | string | null | ja | Prozentsatz in Basispunkten als Integer-STRING; null bei Pauschalen. |
mindestbetrag | object | null | ja | |
hoechstbetrag | object | null | ja | |
leerstandMindestbetrag | object | null | ja | |
zuschlaege | array<object> | ja | |
umsatzsteuersatzProzent | string | ja | Ganze Prozent als Integer-STRING. |
HonorarVorschauResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monat | string | ja | Abrechnungsmonat `JJJJ-MM` (Echo der Anfrage). |
von | string(date) | ja | |
bis | string(date) | ja | |
gueltigAb | string(date) | ja | Beginn der Zeitscheibe, die gerechnet hat — der Nachweis bei einem Satzwechsel. |
gueltigBis | string(date) | null | ja | Letzter Tag der Zeitscheibe (EINSCHLIESSLICH); null ⇒ läuft weiter. |
berechnungsart | pauschal_je_einheit | prozent_sollmiete | prozent_istmiete | ja | |
basiswerte | HonorarBasiswerte | ja | |
einheiten | array<HonorarEinheit> | ja | |
positionen | array<HonorarPosition> | ja | In Rechenreihenfolge: Grundvergütung → Leerstand → Deckel → Zuschläge. |
grundverguetungCents | string | ja | Nach Mindest-/Höchstbetrag, VOR Zuschlägen. |
zuschlaegeCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
sonderleistungen | array<HonorarSonderleistungPosition> | ja | Die nicht stornierten Sonderleistungen des Monats (#5189), je Erfassung eine Position mit eigener USt, nach Leistungsdatum. |
sonderleistungenNettoCents | string | ja | Σ Netto der Sonderleistungen. |
sonderleistungenUmsatzsteuerCents | string | ja | Σ USt der Sonderleistungen (je Position gerundet). |
nettoCents | string | ja | Σ aller Positionen einschließlich der Sonderleistungen. |
umsatzsteuersatzProzent | string | ja | Ganze Prozent als Integer-STRING ("19"). 0 ist eine Vereinbarung (§ 19 UStG), keine fehlende Angabe. |
umsatzsteuerCents | string | ja | USt der Grundvergütung (Satz der Vereinbarung) plus USt der Sonderleistungen (Satz je Position). |
bruttoCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
mindestbetragGegriffen | boolean | ja | |
hoechstbetragGegriffen | boolean | ja | |
IndexanpassungErklaerungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
text | string | ja | der vollständige Erklärungstext im Standardwortlaut (§ 557b Abs. 3 BGB); nie ein Teiltext |
vorlageVersion | string | ja | Version des Standardwortlauts |
dokumentHash | string | ja | SHA-256 (hex) über den UTF-8-Text |
zugangErfasst | boolean | ja | false ⇒ kein Zugangstag erfasst; der Wirksamkeitsmonat ist die Vorschau auf Basis des geplanten Wirksamkeitstags des Vorgangs |
InkassoAufstellung
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | |
schuldner | string | ja | |
objekt | string | ja | |
vertragsnummer | string | ja | |
zinssatzBasispunkte | integer | null | ja | |
currency | string | ja | |
zeilen | array<InkassoAufstellungZeile> | ja | |
summeHauptforderungCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
summeGebuehrenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
summeVerzugszinsenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
gesamtCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
tageszinsCents | string | null | ja | laufender Tageszins ab Stichtag; null ohne Zinssatz |
hinweise | array<InkassoAufstellungHinweis> | ja | |
InkassoAufstellungDateiResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
datei | InkassoDatei | ja | |
aufstellungHash | string | ja | Hash der kanonischen Aufstellung, wie am Kopf |
InkassoAufstellungGebuehr
| Feld | Typ | Pflicht | Beschreibung |
|---|
stufe | string | ja | 0, 1, 2, 3 oder anwalt |
betragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
gebuchtAm | string(date) | ja | |
InkassoAufstellungHinweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | mahnstufe-unter-3 | kein-zinsansatz | ja | |
postenId | string(uuid) | null | ja | nur bei mahnstufe-unter-3 |
InkassoAufstellungZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
postenId | string(uuid) | ja | |
bezeichnung | string | ja | |
faelligAm | string(date) | ja | |
hauptforderungCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
mahnstufe | string | ja | 0, 1, 2, 3 oder anwalt |
gebuehren | array<InkassoAufstellungGebuehr> | ja | |
summeGebuehrenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
verzugszinsenCents | string | ja | bis zum Stichtag aufgelaufen |
summeCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
InkassoDatei
| Feld | Typ | Pflicht | Beschreibung |
|---|
dateiname | string | ja | `forderungsaufstellung-<erste 8 Zeichen der Übergabe-Id>-<Stichtag>.csv` — ohne Personenangaben |
sha256 | string | ja | SHA-256 der Datei-Bytes (Hex, 64 Zeichen) |
groesseBytes | integer | ja | |
inhaltBase64 | string | ja | die Datei-Bytes, Base64 (CSV, Semikolon, UTF-8 mit BOM, Dezimalkomma) |
InkassoUebergabe
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
personId | string(uuid) | ja | der Schuldner |
contractId | string(uuid) | null | ja | |
weg | inkasso | gerichtliches-mahnverfahren | klage | ja | |
status | entwurf | uebergeben | zurueckgenommen | abgeschlossen | ja | |
stichtag | string(date) | ja | |
zinssatzBasispunkte | integer | null | ja | Verzugszinssatz in Basispunkten; null = kein Zinsansatz |
aufstellungHash | string | ja | SHA-256 der kanonischen Forderungsaufstellung (Hex) |
gesamtCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
empfaenger | string | null | ja | Inkassounternehmen oder Kanzlei (Freitext) |
begruendungMahnstufe | string | null | ja | Pflicht für Posten unter Mahnstufe 3 (Freitext) |
uebergebenAm | string(date) | null | ja | |
uebergebenVon | string | null | ja | |
zurueckgenommenAm | string(date-time) | null | ja | |
zuruecknahmeGrund | string | null | ja | |
abgeschlossenAm | string(date-time) | null | ja | |
abschlussArt | bezahlt | vergleich | uneinbringlich | sonstiges | null | ja | |
abschlussNotiz | string | null | ja | |
createdAt | string(date-time) | ja | |
InkassoUebergabeAbschlussResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
uebergabeId | string(uuid) | ja | |
status | abgeschlossen | ja | |
art | bezahlt | vergleich | uneinbringlich | sonstiges | ja | |
freigegebenePosten | integer | ja | |
InkassoUebergabeDetailResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
personId | string(uuid) | ja | der Schuldner |
contractId | string(uuid) | null | ja | |
weg | inkasso | gerichtliches-mahnverfahren | klage | ja | |
status | entwurf | uebergeben | zurueckgenommen | abgeschlossen | ja | |
stichtag | string(date) | ja | |
zinssatzBasispunkte | integer | null | ja | Verzugszinssatz in Basispunkten; null = kein Zinsansatz |
aufstellungHash | string | ja | SHA-256 der kanonischen Forderungsaufstellung (Hex) |
gesamtCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
empfaenger | string | null | ja | Inkassounternehmen oder Kanzlei (Freitext) |
begruendungMahnstufe | string | null | ja | Pflicht für Posten unter Mahnstufe 3 (Freitext) |
uebergebenAm | string(date) | null | ja | |
uebergebenVon | string | null | ja | |
zurueckgenommenAm | string(date-time) | null | ja | |
zuruecknahmeGrund | string | null | ja | |
abgeschlossenAm | string(date-time) | null | ja | |
abschlussArt | bezahlt | vergleich | uneinbringlich | sonstiges | null | ja | |
abschlussNotiz | string | null | ja | |
createdAt | string(date-time) | ja | |
aufstellung | InkassoAufstellung | ja | |
posten | array<InkassoUebergabePosten> | ja | |
InkassoUebergabeListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
uebergaben | array<InkassoUebergabe> | ja | neueste zuerst |
InkassoUebergabePosten
| Feld | Typ | Pflicht | Beschreibung |
|---|
offenerPostenId | string(uuid) | ja | |
aktiv | boolean | ja | false ⇔ die Übergabe ist zurückgenommen oder abgeschlossen, der Posten frei |
InkassoUebergabeUebergebenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
uebergabeId | string(uuid) | ja | |
status | uebergeben | ja | |
uebergebenAm | string(date) | ja | |
posten | array<InkassoUebergebenPosten> | ja | |
InkassoUebergabeZuruecknahmeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
uebergabeId | string(uuid) | ja | |
status | zurueckgenommen | ja | |
vorherigerStatus | entwurf | uebergeben | zurueckgenommen | abgeschlossen | ja | |
freigegebenePosten | integer | ja | |
InkassoUebergebenPosten
| Feld | Typ | Pflicht | Beschreibung |
|---|
offenerPostenId | string(uuid) | ja | |
geaendert | boolean | ja | false ⇔ der Mahnstatus stand schon auf anwalt |
InstandhaltungAblehnung
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | zu-teuer | angebot-unklar | beschluss-fehlt | sonstiges | ja | |
note | string | nein | höchstens 500 Zeichen |
InstandhaltungAbschlussRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
begruendung | string | nein | optional: 1 bis 300 Zeichen |
InstandhaltungAbschlussResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
vonStatus | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | ja | |
status | abgeschlossen | storniert | ja | |
ereignisId | string(uuid) | ja | |
begruendung | string | null | ja | Begründung bzw. Grund, wie gespeichert; null, wenn keine angegeben wurde |
InstandhaltungAngebot
| Feld | Typ | Pflicht | Beschreibung |
|---|
angebotId | string(uuid) | ja | |
dienstleister | InstandhaltungPersonVerweis | ja | |
status | angefragt | vorliegend | gewaehlt | verworfen | ja | |
betragCents | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
gueltigBis | string(date) | null | ja | |
realisierungAb | string(date) | null | ja | |
dokumentId | string(uuid) | null | ja | |
angefragtAm | string(date-time) | ja | |
InstandhaltungAngebotErgebnis
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
vorgangId | string(uuid) | ja | |
dienstleisterPersonId | string(uuid) | ja | |
status | string | ja | |
betrag | unbekannt | ja | |
gueltigBis | string(date) | null | ja | |
realisierungAb | string(date) | null | ja | |
dokumentId | string(uuid) | null | ja | |
angefragtAm | string(date-time) | ja | |
InstandhaltungAngebotRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
dienstleisterPersonId | string(uuid) | ja | |
betrag | unbekannt | ja | |
gueltigBis | string(date) | nein | |
realisierungAb | string(date) | nein | |
dokumentId | string(uuid) | nein | |
InstandhaltungAngebotResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
angebot | InstandhaltungAngebotErgebnis | ja | |
InstandhaltungAngebotVerwerfenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
angebotId | string(uuid) | ja | |
grund | string | ja | Pflicht: 1 bis 200 Zeichen |
InstandhaltungAngebotWaehlenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
angebotId | string(uuid) | ja | |
InstandhaltungAngebotWaehlenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
angebot | InstandhaltungAngebotErgebnis | ja | |
anzahlAngebote | integer | ja | Angebote im Status vorliegend oder gewaehlt |
befund | unbekannt | ja | |
InstandhaltungAufgabe
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | |
aufgabeArt | sofort-unbearbeitet | angebot-ausstehend | freigabe-wartet | rechnung-fehlt | ja | |
ampel | gruen | gelb | rot | null | ja | |
titel | string | ja | |
objektId | string(uuid) | ja | |
objektNr | string | null | ja | |
frist | string(date) | ja | |
vorgangId | string(uuid) | ja | |
InstandhaltungAufgabenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | der verwendete Stichtag (Berliner Tag der Server-Uhr) |
zeilen | array<InstandhaltungAufgabe> | ja | |
InstandhaltungAuftrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | ja | |
version | integer | ja | |
status | zur_freigabe | freigegeben | abgelehnt | erteilt | ausgefuehrt | storniert | ja | |
lebend | boolean | ja | |
angebotId | string(uuid) | null | ja | |
dienstleister | InstandhaltungPersonVerweis | ja | |
betragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
kostenobergrenzeCents | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
costCategoryId | string(uuid) | null | ja | |
auftragsnummer | string | null | ja | |
erteiltAm | string(date-time) | null | ja | |
ausgefuehrtAm | string(date-time) | null | ja | |
InstandhaltungAuftragAusfuehrungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | nein | optional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found` |
ausgefuehrtAm | string(date) | ja | |
notiz | string | nein | 1 bis 500 Zeichen |
InstandhaltungAuftragAusfuehrungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | ja | |
ausgefuehrtAm | string(date) | ja | |
InstandhaltungAuftragErteilenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | nein | optional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found` |
InstandhaltungAuftragErteilenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | ja | |
auftragsnummer | string | ja | |
erteiltAm | string(date) | ja | |
befunde | array<InstandhaltungBefund> | ja | |
InstandhaltungAuftragStornierenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | nein | optional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found` |
grund | string | ja | Pflicht: 1 bis 200 Zeichen |
InstandhaltungAuftragStornierenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | ja | |
vorgangStatus | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | ja | |
InstandhaltungBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | weniger-als-mindestangebote | gestattungsbeschluss-fehlt | kostenobergrenze-ohne-angebot | freistellung-fehlt | freistellung-abgelaufen | freistellung-anderer-auftrag | rechnung-ueber-auftrag | rechnung-kreditor-abweichend | ja | |
schwere | hinweis | warnung | ja | |
text | string | ja | |
InstandhaltungDienstleisterRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
dienstleisterPersonId | string(uuid) | ja | Pflicht: die Person mit gültiger Rolle `dienstleister` |
InstandhaltungDienstleisterResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
vorgangStatus | string | ja | |
angebot | InstandhaltungAngebotErgebnis | ja | |
InstandhaltungEinheitVerweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
einheitNr | string | ja | |
InstandhaltungEinstellungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zweitfreigabeAbCents | string | null | ja | Auftragswert in Cent, ab dem eine Zweitfreigabe nötig ist; null ⇒ nie |
vergleichsangeboteAbCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
mindestangebote | integer | ja | |
herkunft | vorgabe | mandant | ja | |
geaendertVon | string | null | ja | |
geaendertAm | string(date-time) | null | ja | |
InstandhaltungEinstellungSetzenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
zweitfreigabeAbCents | string | null | ja | Auftragswert in Cent (Integer-String), ab dem eine Zweitfreigabe nötig ist; null ⇒ nie |
vergleichsangeboteAbCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
mindestangebote | integer | ja | |
InstandhaltungEinstellungSetzenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zweitfreigabeAbCents | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
vergleichsangeboteAbCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
mindestangebote | integer | ja | |
vorher | InstandhaltungEinstellungWerte | ja | |
geaendert | boolean | ja | |
geaendertVon | string | null | ja | |
geaendertAm | string(date-time) | null | ja | |
InstandhaltungEinstellungWerte
| Feld | Typ | Pflicht | Beschreibung |
|---|
zweitfreigabeAbCents | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
vergleichsangeboteAbCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
mindestangebote | integer | ja | |
InstandhaltungEreignis
| Feld | Typ | Pflicht | Beschreibung |
|---|
ereignisId | string(uuid) | ja | |
vonStatus | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | null | ja | |
nachStatus | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | ja | |
grund | string | null | ja | |
akteurArt | string | ja | |
am | string(date-time) | ja | |
InstandhaltungFreigabeBeantragenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
angebotId | string(uuid) | nein | das gewählte Angebot; ohne Angebot nur bei Typen mit `ohneAngebotErlaubt` |
kostenobergrenze | unbekannt | nein | |
dienstleisterPersonId | string(uuid) | nein | |
costCategoryId | string(uuid) | nein | |
InstandhaltungFreigabeBeantragenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | ja | |
version | integer | ja | |
betrag | InstandhaltungGeld | ja | |
stufen | array<verwalter | zweit> | ja | |
zweitstufeNichtWirksam | boolean | ja | |
befunde | array<InstandhaltungBefund> | ja | |
InstandhaltungFreigabeEntscheidenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
stufe | verwalter | zweit | ja | |
decision | approved | rejected | ja | |
rejectReason | unbekannt | nein | |
InstandhaltungFreigabeEntscheidenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
entschieden | approved | rejected | ja | |
auftragStatus | string | ja | |
vorgangStatus | string | ja | |
offeneStufen | array<verwalter | zweit> | ja | |
ohneVierAugen | boolean | ja | true, wenn der abgeschaltete Vier-Augen-Schalter die Selbstfreigabe getragen hat |
InstandhaltungFreigabeStand
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | ja | |
version | integer | ja | |
erforderlicheStufen | array<verwalter | zweit> | ja | |
zweitstufeNichtWirksam | boolean | ja | |
stufen | array<InstandhaltungStufenStand> | ja | |
offeneStufen | array<verwalter | zweit> | ja | |
abgelehnteStufen | array<verwalter | zweit> | ja | |
vollstaendig | boolean | ja | alle erforderlichen Stufen stehen auf approved (zum aktuellen Inhalts-Hash) |
InstandhaltungGeld
| Feld | Typ | Pflicht | Beschreibung |
|---|
cents | string | ja | Cent als Integer-STRING, nie eine JSON-Zahl |
currency | EUR | ja | |
InstandhaltungKatalogResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
typen | array<InstandhaltungKatalogTyp> | ja | nur aktive Typen; mit auchInaktive=true alle |
InstandhaltungKatalogSetzenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | |
bezeichnung | string | ja | |
ohneAngebotErlaubt | boolean | ja | |
aktiv | boolean | ja | |
InstandhaltungKatalogSetzenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | |
bezeichnung | string | ja | |
ohneAngebotErlaubt | boolean | ja | |
aktiv | boolean | ja | |
geaendert | boolean | ja | |
geaendertVon | string | ja | |
geaendertAm | string(date-time) | ja | |
InstandhaltungKatalogTyp
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | |
bezeichnung | string | ja | |
ohneAngebotErlaubt | boolean | ja | |
aktiv | boolean | ja | |
vorgabe | boolean | ja | |
InstandhaltungListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | der verwendete Stichtag (Berliner Tag der Server-Uhr) |
limit | integer | ja | |
offset | integer | ja | |
zeilen | array<InstandhaltungVorgangListenZeile> | ja | nur Vorgänge der Objekte, für die der Aufrufer zuständig ist; leer ohne Vorgänge |
InstandhaltungMeldenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | Pflicht: das Objekt |
unitId | string(uuid) | nein | |
typSchluessel | string | ja | Pflicht: Schlüssel eines aktiven Vorgangstyps (Katalog) |
titel | string | ja | Pflicht: 1 bis 140 Zeichen |
beschreibung | string | ja | Pflicht: 10 bis 5000 Zeichen |
dringlichkeit | sofort | kurzfristig | langfristig | ja | |
melderPersonId | string(uuid) | nein | |
beginnAm | string(date) | nein | |
haeufigkeit | string | nein | Häufigkeit in Worten, höchstens 200 Zeichen |
baulichVeraendernd | boolean | nein | Vorgabe false |
InstandhaltungMeldungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
nummer | string | ja | |
status | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | ja | |
naechsteSchritte | array<gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert> | ja | |
befunde | array<InstandhaltungBefund> | ja | |
InstandhaltungObjektVerweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
name | string | ja | |
InstandhaltungPersonVerweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
anzeigename | string | null | ja | |
InstandhaltungQualifizierenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
typSchluessel | string | nein | |
dringlichkeit | sofort | kurzfristig | langfristig | nein | |
baulichVeraendernd | boolean | nein | |
gestattungsBeschlussGegenstandId | string(uuid) | nein | |
beginnAm | string(date) | nein | |
haeufigkeit | string | nein | Häufigkeit in Worten, höchstens 200 Zeichen |
beginnUnbekannt | boolean | nein | ausdrücklich „Beginn nicht bekannt" |
InstandhaltungQualifizierenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
nummer | string | ja | |
status | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | ja | |
naechsteSchritte | array<gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert> | ja | |
befunde | array<InstandhaltungBefund> | ja | |
uebergang | boolean | ja | true, wenn dieser Aufruf `gemeldet` nach `in_klaerung` gesetzt hat |
InstandhaltungRechnung
| Feld | Typ | Pflicht | Beschreibung |
|---|
rechnungId | string(uuid) | ja | |
auftragId | string(uuid) | ja | |
documentId | string(uuid) | ja | |
bookingProposalId | string(uuid) | null | ja | |
rechnungsdatum | string(date) | ja | |
betragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
auftragswertCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
abweichungCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
befunde | array<weniger-als-mindestangebote | gestattungsbeschluss-fehlt | kostenobergrenze-ohne-angebot | freistellung-fehlt | freistellung-abgelaufen | freistellung-anderer-auftrag | rechnung-ueber-auftrag | rechnung-kreditor-abweichend> | ja | beim Verknüpfen gespeicherte Befund-Codes |
zahlungsstand | InstandhaltungZahlungsstand | ja | |
InstandhaltungRechnungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
auftragId | string(uuid) | nein | optional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found` |
documentId | string(uuid) | ja | Pflicht: der Rechnungsbeleg mit Buchungsvorschlag |
rechnungsdatum | string(date) | ja | |
InstandhaltungRechnungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
rechnungId | string(uuid) | ja | |
betrag | InstandhaltungGeld | ja | |
auftragswert | InstandhaltungGeld | ja | |
abweichung | unbekannt | ja | |
summeRechnungen | InstandhaltungGeld | ja | |
bauleistung | ja | nein | unbekannt | ja | |
befunde | array<InstandhaltungBefund> | ja | Code, Schwere und Klartext; sie sperren die Verknüpfung nicht |
InstandhaltungStufenStand
| Feld | Typ | Pflicht | Beschreibung |
|---|
stufe | verwalter | zweit | ja | |
entscheidung | approved | rejected | offen | ja | |
InstandhaltungVorgangListenZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
nummer | string | ja | |
titel | string | ja | |
typSchluessel | string | ja | |
dringlichkeit | sofort | kurzfristig | langfristig | ja | |
status | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | ja | |
statusSeit | string(date-time) | ja | |
objekt | InstandhaltungObjektVerweis | ja | |
einheit | unbekannt | ja | |
auftragswert | string | null | ja | Auftragswert des lebenden Auftrags in Cent als Integer-STRING; null ohne lebenden Auftrag |
auftragsnummer | string | null | ja | |
offeneBefunde | integer | ja | Zahl der aktuellen Befunde des Vorgangs plus gespeicherter Befunde seiner Rechnungen |
InstandhaltungVorgangResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
nummer | string | ja | |
titel | string | ja | |
beschreibung | string | null | ja | |
typSchluessel | string | ja | |
dringlichkeit | sofort | kurzfristig | langfristig | ja | |
status | gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | ja | |
statusSeit | string(date-time) | ja | |
objekt | InstandhaltungObjektVerweis | ja | |
einheit | unbekannt | ja | |
melder | unbekannt | ja | |
baulichVeraendernd | boolean | ja | |
abschlussBegruendung | string | null | ja | |
verlauf | array<InstandhaltungEreignis> | ja | |
angebote | array<InstandhaltungAngebot> | ja | |
auftraege | array<InstandhaltungAuftrag> | ja | |
freigabe | unbekannt | ja | |
rechnungen | array<InstandhaltungRechnung> | ja | |
befunde | array<InstandhaltungBefund> | ja | |
naechsteSchritte | array<gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert> | ja | Status, in die der Vorgang als Nächstes wechseln darf |
InstandhaltungVorgangStornierenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
grund | string | ja | Pflicht: 1 bis 200 Zeichen |
InstandhaltungZahlungsstand
| Feld | Typ | Pflicht | Beschreibung |
|---|
stand | nicht-gebucht | nicht-ermittelbar | offen | ausgeglichen | ja | |
restbetragCents | string | null | ja | offener Restbetrag in Cent; nur bei stand offen, sonst null |
KautionEinstellungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
rueckbehaltFristMonate | integer | ja | Frist des Rückbehalts in Monaten (beginnt mit dem Abrechnungsdatum der Kautionsabrechnung) |
istVorgabe | boolean | ja | true ⇒ keine eigene Einstellung, es gilt die Vorgabe (6 Monate) |
KautionRueckbehaltFrist
| Feld | Typ | Pflicht | Beschreibung |
|---|
kautionsabrechnungId | string(uuid) | ja | |
contractId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
abrechnungsdatum | string(date) | ja | Abrechnungsdatum der Kautionsabrechnung — Beginn der Frist |
rueckbehaltStatus | gehalten | teilfreigegeben | ja | |
rueckbehaltCents | string | ja | gesamter Rückbehalt in Cent |
restCents | string | ja | noch gehaltener Rest in Cent (bei teilfreigegeben kleiner als der Rückbehalt) |
fristEnde | string(date) | ja | beim Buchen gespeicherter Termin (Wiedervorlage am): Abrechnungsdatum + Frist des Mandanten zum Buchungszeitpunkt, kalendermonatsgenau mit Monatsende-Kappung; eine spätere Änderung der Frist wirkt nur auf neue Abrechnungen |
ueberfaellig | boolean | ja | true ⇒ fristEnde liegt vor dem Stichtag |
tageUeberfaellig | integer | ja | Tage seit dem Fristende; 0, solange nicht überfällig |
KautionRueckbehaltFristenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | der verwendete Stichtag (Vorgabe: heute, Server-Uhr) |
fristMonate | integer | ja | die für den Mandanten geltende Frist in Monaten |
zeilen | array<KautionRueckbehaltFrist> | ja | nur Rückbehalte der Objekte, für die der Aufrufer zuständig ist; aufsteigend nach Fristende |
KautionsabrechnungStandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
kautionsabrechnungId | string(uuid) | ja | |
contractId | string(uuid) | ja | |
stichtag | string(date) | ja | Abrechnungsstichtag |
guthabenCents | string | ja | Kaution + Zinsen |
verrechnetCents | string | ja | mit offenen Posten verrechneter Teil |
auszahlungCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
restforderungCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
rueckbehaltCents | string | ja | "0" bei Rückbehalt-Status `keiner` |
rueckbehaltBegruendung | string | null | ja | Freitext eines Menschen (PERSONENBEZOGEN); null ohne Rückbehalt |
rueckbehaltStatus | keiner | gehalten | teilfreigegeben | freigegeben | ja | |
paymentOrderId | string(uuid) | null | ja | Zahlungsauftrag der Auszahlung; null bei Auszahlung 0 |
rueckbehaltPaymentOrderId | string(uuid) | null | ja | Auftrag aus der Rückbehalt-Freigabe (bei Teilfreigaben: der des letzten Schritts); null solange nicht (oder ohne Auszahlung) freigegeben |
rueckbehaltRestCents | string | ja | noch gehaltener Rest des Rückbehalts (#6900): Rückbehalt − Σ Teilfreigaben; "0" bei `keiner` und `freigegeben` |
rueckbehaltTeilfreigaben | array<object> | ja | die Teilfreigaben des Rückbehalts (#6900) in Freigabe-Reihenfolge; leer ohne Teilfreigabe (auch bei einer ganz in einem Schritt freigegebenen Abrechnung) |
rueckbehalte | array<object> | ja | die Rückbehalt-Zeilen mit Grundart (#7134) in der Reihenfolge der Erfassung; `rueckbehaltCents` ist ihre Summe. Leer ohne Rückbehalt (und bei einer vor #7134 abgerechneten Abrechnung ohne Rückbehalt). |
KautionslisteResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | Stichtag, auf den `erhalten` gemessen wurde |
propertyId | string(uuid) | null | ja | die wirksame Objekt-Eingrenzung (null = alle Objekte des Mandanten) |
zeilen | array<KautionslisteZeile> | ja | |
summen | KautionslisteSummen | ja | |
summenFremdwaehrung | array<KautionslisteSummen> | ja | Summen der Zeilen in ANDEREN Währungen als EUR, je Währung eine Summenzeile (z. B. ein dokumentarisch übernommener CHF-Bestand). Nie in `summen` addiert; leer im Normalfall. |
anlagenOhneSachkonto | array<string> | ja | IBANs von Kautionskonten OHNE zugeordnetes Bank-Sachkonto — ihre Eingänge konnten NICHT mitgezählt werden. Leer heisst: alles gezählt. |
KautionslisteSummen
| Feld | Typ | Pflicht | Beschreibung |
|---|
vereinbartCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
erhaltenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
offenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
mahnbarerRestCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
anzahlVertraege | integer | ja | |
KautionslisteZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
contractNo | string | ja | |
propertyId | string(uuid) | ja | |
propertyNo | string | null | ja | Objektnummer (LEFT JOIN); null, wenn die Kette unerwartet reisst |
mietpartei | string | ja | Mietpartei(en) für Anzeige und Sortierung; ohne erfasste `mieter`-Rolle die Vertragsnummer. PERSONENBEZOGEN. |
vereinbartCents | string | null | ja | vereinbarte Kaution; null ⇒ keine vereinbart |
currency | string | null | ja | |
erhaltenCents | string | ja | Σ der bis zum Stichtag auf der getrennten Anlage EINGEGANGENEN Beträge abzüglich stornierter Eingänge; Auszahlungen mindern erhalten NICHT |
offenCents | string | ja | vereinbart − erhalten; POSITIV = Rückstand, NEGATIV = Überzahlung |
status | keine | eingang-unbekannt | offen | teilweise-erhalten | vollstaendig-erhalten | ja | Eingangsstatus. `eingang-unbekannt` = dokumentarisch übernommen, Eingang in casa.ai nicht bekannt — dieser Rest wird NICHT gemahnt (§ 551, Bestandsübernahme). |
mahnbarerRestCents | string | ja | der Teil von offenCents, der gemahnt werden darf; "0" beim übernommenen Bestand |
anlageform | barkaution | buergschaft | verpfaendung | ja | Anlageform der Sicherheit; null ⇒ im Bestand nicht erfasst |
anlagekontoId | string(uuid) | null | ja | Bankverbindung der getrennten Anlage (Kontoart kautionskonto); null ⇒ keine am Objekt |
anlagekontoIban | string | null | ja | IBAN der getrennten Anlage; null ⇒ keine |
abrechnung | object | null | ja | Abrechnungsstand (#6897): die NICHT stornierte Kautionsabrechnung; null ⇒ nicht abgerechnet (auch nach dem Storno, und immer bei einer Sicherheit ohne Geldfluss — Bürgschaft, Verpfändung). |
KautionszinsenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
gutschriften | array<KautionszinsGutschrift> | ja | aufsteigend nach Zeitraum; stornierte Gutschriften erscheinen nicht |
KautionszinsGutschrift
| Feld | Typ | Pflicht | Beschreibung |
|---|
von | string(date) | ja | erster Tag des Zinszeitraums (einschliesslich) |
bis | string(date) | ja | letzter Tag des Zinszeitraums (einschliesslich) |
bankTransactionId | string(uuid) | null | ja | die Zinsgutschrift der Bank auf dem Kautions-Anlagekonto; null beim Jahreszinslauf (31.12., ohne Bankumsatz) |
betragCents | string | ja | Zinsanteil dieser Kaution |
currency | string | ja | |
entryIds | array<string(uuid)> | ja | die Buchungssätze dieser Gutschrift |
KautionZinssaetzeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
bankAccountId | string(uuid) | ja | Bankverbindung der Kontoart kautionskonto |
saetze | array<KautionZinssatz> | ja | Satzhistorie aufsteigend nach gueltigAb; leer für ein fremdes, unbekanntes oder nicht zuständiges Konto |
KautionZinssatz
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
gueltigAb | string(date) | ja | erster Tag, an dem der Satz gilt (inklusiv) |
basispunkte | integer | ja | Satz in Basispunkten (150 = 1,50 %) |
erfasstVon | string | ja | opake Akteurs-Id; migration für die Bestandsübernahme |
erfasstAm | string(date-time) | ja | Zeitpunkt der Erfassung |
KautionZinsstandKonto
| Feld | Typ | Pflicht | Beschreibung |
|---|
anlagekontoId | string(uuid) | ja | Bankverbindung der Kontoart kautionskonto |
propertyId | string(uuid) | ja | |
von | string(date) | null | ja | Beginn des zuletzt verzinsten Zeitraums; null ohne gebuchten Zinslauf |
bis | string(date) | null | ja | Ende des zuletzt verzinsten Zeitraums (einschliesslich); null ohne gebuchten Zinslauf |
anzahlBarkautionen | integer | ja | Zahl der Barkautionen auf diesem Konto |
festzinsBasispunkte | integer | null | ja | der am Stichtag (Vorgabe: heute) gültige Satz der Satzhistorie in Basispunkten (150 = 1,50 %); null = an diesem Tag gilt kein Satz. Nur Anzeige. |
unverteilteUmsaetze | array<KautionZinsstandUmsatz> | ja | unbeanspruchte Haben-Umsätze, aufsteigend nach Wertstellung — Kandidaten, nicht festgestellte Zinsen |
gebuchteJahre | array<integer> | ja | Kalenderjahre mit wirksam gebuchtem Zinslauf, aufsteigend (Jahreszinslauf und alter Bankumsatz-Lauf) |
naechstesOffenesJahr | integer | null | ja | das nächste zu buchende Zinsjahr (höchstes gebuchtes + 1, ohne gebuchtes Jahr das Jahr des ersten Kautionseingangs) — die Eingabe jahr des Zinslauf-Vorschlags (POST /api/kaution/zinsen/vorschlag); null ohne Kautionseingang |
KautionZinsstandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
konten | array<KautionZinsstandKonto> | ja | nur Anlagekonten der Objekte, für die der Aufrufer zuständig ist |
KautionZinsstandUmsatz
| Feld | Typ | Pflicht | Beschreibung |
|---|
bankTransactionId | string(uuid) | ja | der Bankumsatz — die Bankgutschrift wird später gegen die Zinsforderung zugeordnet (der Jahreszinslauf liest keinen Umsatz) |
betragCents | string | ja | Haben-Betrag, streng positiv |
currency | string | ja | |
wertstellung | string(date) | null | ja | Wertstellungstag; null, wenn die Bank keinen lieferte |
Kontenrahmen
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string | ja | |
name | string | ja | |
version | string | ja | Inhaltsversion — geht in den Idempotency Key des Einspielens ein |
description | string | ja | |
accountCount | integer | ja | |
KontenrahmenApplyRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | das Objekt, dessen Kontenplan bestückt wird |
KontenrahmenApplyResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
kontenrahmenId | string | ja | |
kontenrahmenVersion | string | ja | |
created | array<object> | ja | die NEU angelegten Konten (Vorlagen-Reihenfolge) |
skipped | array<object> | ja | Konten, die es am Objekt schon gab — unangetastet (DO NOTHING) |
unresolvedCostCategoryKeys | array<string> | ja | Kategorie-Schlüssel der Vorlage, die es im Tenant nicht gibt (sichtbar gemeldet) |
KontenrahmenListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
kontenrahmen | array<Kontenrahmen> | ja | |
Konto
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | null | ja | Objektbindung des Kontos; null ausschließlich beim mandantenweiten Kreditorkonto (#1487) |
accountNo | string | ja | Kontonummer — je Objekt eindeutig (DB-UNIQUE, keine bloße Konvention) |
name | string | ja | |
costCategoryId | string(uuid) | null | ja | |
costCategoryKey | string | null | ja | Schlüssel der Betriebskosten-Kategorie (cost_categories.key) |
costCategoryName | string | null | ja | |
ustRate | string | null | ja | USt-Satz als exakter Dezimalstring (numeric), z. B. "19.00" — nie als Gleitkommazahl |
isUmlagefaehig | boolean | null | ja | |
datevAccountNo | string | null | ja | DATEV-Zielkonto des Kontos (SKR03/SKR04-Export-Mapping, #2990) — 4–8 Ziffern ohne führende Null; null = nicht zugeordnet (das Konto fällt dann aus dem DATEV-Export) |
allocationKeyId | string(uuid) | null | ja | zugeordneter Umlageschlüssel (allocation_keys.id); null ⇒ keiner. Bei umlagefähigem Konto ⇒ Readiness-Fund schluessel_fehlt. |
lockedAfterFirstBooking | boolean | ja | true ⇒ nach Erstbuchung fix: nur name bleibt änderbar. HEUTE setzt noch kein Produktionspfad dieses Flag. |
archivedAt | string(date-time) | null | ja | gesetzt ⇒ archiviert (K5: kein DELETE) |
createdAt | string(date-time) | ja | |
kontoart | ausgabe | einnahme | null | ja | Kontoart des Sachkontos (#5551): ausgabe | einnahme; null an Geld- und Personenkonten und im noch nicht klassifizierten Bestand (DB-CHECK: nur am Sachkonto) |
KontoArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | |
alreadyArchived | boolean | ja | true ⇒ das Konto war bereits archiviert (expliziter No-op). |
KontoCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
accountNo | string | ja | |
name | string | ja | |
costCategoryKey | string | null | nein | unbekannter Schlüssel ⇒ 400 (fail-loud, nie stilles NULL) |
ustRate | string | null | nein | Dezimalstring wie "19.00" |
isUmlagefaehig | boolean | nein | |
datevAccountNo | string | null | nein | DATEV-Zielkonto (#2990) — 4–8 Ziffern ohne führende Null; null = nicht zugeordnet |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
KontoListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | archiviert | ja | der wirksame 3-Wege-Filter |
propertyId | string(uuid) | null | nein | die wirksame Objekt-Eingrenzung (null = alle Objekte des Tenants) |
konten | array<Konto> | ja | |
KontoUmlageschluesselRequest
Setzt/hebt die Konto→Umlageschlüssel-Zuordnung. Der Schlüssel muss demselben Objekt wie das Konto gehören (fremdes Objekt/Tenant ⇒ Fehler, kein stiller No-op).
| Feld | Typ | Pflicht | Beschreibung |
|---|
allocationKeyId | string(uuid) | null | ja | Ziel-Umlageschlüssel; null hebt die Zuordnung auf. |
KontoUpdateRequest
Partieller Patch — mindestens ein Feld muss gesetzt sein. Nach Erstbuchung sind nur `name` und `datevAccountNo` änderbar.
| Feld | Typ | Pflicht | Beschreibung |
|---|
accountNo | string | nein | |
name | string | nein | |
costCategoryKey | string | null | nein | |
ustRate | string | null | nein | |
isUmlagefaehig | boolean | nein | |
datevAccountNo | string | null | nein | DATEV-Zielkonto (#2990); null hebt die Zuordnung auf. NICHT buchungsrelevant — auch nach der Erstbuchung änderbar. |
KorrigiereZeitRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
dauerMinuten | integer | nein | Ganze Minuten, 1 bis 1440. |
leistungsdatum | string(date) | nein | |
taetigkeitsart | telefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstiges | nein | |
notiz | string | null | nein | |
MahnlaufAusfuehrenMarkierung
| Feld | Typ | Pflicht | Beschreibung |
|---|
mahnschreibenId | string(uuid) | ja | |
schluessel | string | ja | |
ampel | string | ja | gruen, gelb oder rot (rot ist nicht freigebbar) |
merkmale | array<string> | ja | Abweichungs-Merkmale der Heuristik (z. B. erststufe, hoher-betrag) |
MahnlaufAusfuehrenPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | Positionsschlüssel (`mahn:vertrag:<id>`) |
objektId | string(uuid) | null | ja | |
einheitId | string(uuid) | null | ja | |
vertragId | string(uuid) | null | ja | |
personId | string(uuid) | null | ja | |
betragCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
status | string | ja | gebucht, ausgeschlossen, ausnahme oder fehlgeschlagen |
grund | string | null | ja | Klartext-Grund; null bei gebucht |
versandstatus | string | null | ja | versendet, download_bereit, heruntergeladen, fehlgeschlagen oder zugestellt; null ohne Schreiben |
MahnlaufAusfuehrenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
erstAusfuehrung | boolean | ja | false ⇔ der Vorgang war schon ausgeführt, das Erst-Ergebnis kommt zurück |
zeitpunkt | string(date-time) | ja | |
gebucht | integer | ja | erzeugte Schreiben |
ausgeschlossen | integer | ja | |
ausnahmen | integer | ja | |
fehlgeschlagen | integer | ja | |
summeCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
positionen | array<MahnlaufAusfuehrenPosition> | ja | |
freigegeben | array<string(uuid)> | ja | in DIESEM Aufruf freigegebene Schreiben; leer beim Erst-Ergebnis |
markiert | array<MahnlaufAusfuehrenMarkierung> | ja | einzeln freizugebende Schreiben; leer beim Erst-Ergebnis |
MahnlaufAusschlussAufhebenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
positionsSchluessel | string | ja | |
zurueckgeholt | boolean | ja | false ⇔ es gab keinen Ausschluss, nichts gelöscht |
MahnlaufAusschlussResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
positionsSchluessel | string | ja | |
neu | boolean | ja | false ⇔ die Position war schon ausgeschlossen (der jüngere Grund gilt) |
MahnlaufBearbeiter
| Feld | Typ | Pflicht | Beschreibung |
|---|
name | string | null | ja | Anzeigename; null, wenn nicht auflösbar (nie die Kennung) |
ichSelbst | boolean | ja | true ⇔ der Aufrufer selbst |
MahnlaufErgebnis
| Feld | Typ | Pflicht | Beschreibung |
|---|
zeitpunkt | string(date-time) | ja | |
text | string | ja | |
schreiben | array<MahnlaufErgebnisSchreiben> | ja | |
fehlgeschlagen | array<MahnlaufErgebnisSchreiben> | ja | |
nichtGemahnt | array<MahnlaufNichtGemahnt> | ja | |
MahnlaufErgebnisSchreiben
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | |
mahnschreibenId | string(uuid) | ja | |
objektId | string(uuid) | ja | |
objektName | string | ja | |
einheitId | string(uuid) | null | ja | |
vertragId | string(uuid) | ja | |
personId | string(uuid) | null | ja | |
anzeige | string | ja | „Einheit · Person" |
betragCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
stufe | integer | null | ja | |
versandstatus | string | ja | |
MahnlaufErneutResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
mahnschreibenId | string(uuid) | ja | |
ausgang | versandt | fehlgeschlagen | ja | |
zustellnachweisId | string(uuid) | ja | |
versandstatus | string | ja | versendet oder fehlgeschlagen |
MahnlaufFremdInArbeit
| Feld | Typ | Pflicht | Beschreibung |
|---|
name | string | null | ja | |
schritt | integer | ja | gespeicherter Schritt + 1 (1…4) |
anzahlSchritte | integer | ja | |
text | string | ja | Klartext „… bearbeitet diesen Mahnlauf (Schritt n von 4)" |
MahnlaufFruehererEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
stichtag | string(date) | ja | |
bezeichnung | string | ja | |
objektNamen | array<string> | ja | |
ausgefuehrtAm | string(date-time) | ja | |
ausgefuehrtVon | string | null | ja | Name der ausführenden Person; null, wenn nicht auflösbar |
ergebnisText | string | ja | |
gebucht | integer | ja | |
summeCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
MahnlaufNichtGemahnt
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | |
status | ausnahme | ausgeschlossen | ja | |
anzeige | string | ja | |
grund | string | ja | |
betragCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
MahnlaufObjektBlockiert
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
name | string | null | ja | Name der bearbeitenden Person; null, wenn niemand oder nicht auflösbar |
MahnlaufOffenerEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
stichtag | string(date) | ja | |
bezeichnung | string | ja | |
status | faellig | in_arbeit | ja | |
schritt | integer | ja | 0…3 |
automatisch | boolean | ja | |
objektNamen | array<string> | ja | |
inArbeitBei | unbekannt | ja | |
fremdInArbeit | unbekannt | ja | |
MahnlaufSchreibenDatei
| Feld | Typ | Pflicht | Beschreibung |
|---|
dateiname | string | ja | `Mahnschreiben-<Nachname>-<JJJJ-MM-TT>.pdf` |
sha256 | string | ja | SHA-256 der Datei-Bytes (Hex, 64 Zeichen) |
groesseBytes | integer | ja | |
inhaltBase64 | string | ja | die Datei-Bytes, Base64 |
MahnlaufSchreibenDateiResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
datei | MahnlaufSchreibenDatei | ja | |
MahnlaufSchreibenFreigabeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
mahnschreibenId | string(uuid) | ja | |
entscheidung | freigeben | zurueckweisen | ja | |
ampel | string | ja | Ampel der Abweichungs-Heuristik zum Zeitpunkt der Entscheidung |
versand | unbekannt | ja | |
MahnlaufStartResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
stichtag | string(date) | ja | |
status | faellig | in_arbeit | ausgefuehrt | ja | |
schritt | integer | ja | |
automatisch | boolean | ja | |
umfangObjektIds | array<string(uuid)> | ja | |
abgewaehlteEinheitIds | array<string(uuid)> | ja | |
neu | boolean | ja | false ⇔ der eigene vorbereitete Vorgang wurde geöffnet, es entstand keiner |
MahnlaufUebersichtResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
offene | array<MahnlaufOffenerEintrag> | ja | offene sichtbare Vorgänge, Stichtag aufsteigend; ausgeführte nie |
gewaehlt | object | null | ja | der Vorgang, den das Register öffnet (Query `lauf` ⇒ deep-link); null, wenn keiner |
fruehere | array<MahnlaufFruehererEintrag> | ja | |
zuMahnendeDebitoren | integer | null | ja | nur ohne offenen Vorgang: Zahl der zu mahnenden Debitoren, sonst null |
MahnlaufUmfangEinheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
einheitId | string(uuid) | ja | |
lage | string | ja | |
imUmfang | boolean | ja | false ⇔ abgewählt |
MahnlaufUmfangObjekt
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
name | string | ja | |
imUmfang | boolean | ja | |
einheiten | array<MahnlaufUmfangEinheit> | ja | |
laeuftBereitsBei | unbekannt | ja | |
summeCent | string | ja | Gruppensumme der buchbaren Schreiben des Objekts, Cent-String |
MahnlaufVersandErgebnis
| Feld | Typ | Pflicht | Beschreibung |
|---|
versandt | integer | ja | |
fehlgeschlagen | integer | ja | |
uebersprungen | integer | ja | |
positionen | array<MahnlaufVersandPosition> | ja | |
MahnlaufVersandPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
mahnschreibenId | string(uuid) | ja | |
ausgang | versandt | fehlgeschlagen | uebersprungen | download_bereit | ja | |
fehlerCode | string | null | ja | Fehler-Code des Versandwegs bei fehlgeschlagen, sonst null (nie Provider-Rohtext) |
mahnereignisId | string(uuid) | null | ja | wirksam gewordene Stufe; nur bei versandt |
gebuehrCent | string | null | ja | gebuchte Mahngebühr; null ohne Ansatz |
zinsenCent | string | null | ja | gebuchter Zins-Zuwachs; null ohne Ansatz |
MahnlaufVersandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
versandweg | mail | druck | ja | |
ergebnis | MahnlaufVersandErgebnis | ja | |
MahnlaufVorbereitetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
stichtag | string(date) | ja | |
status | faellig | in_arbeit | ausgefuehrt | ja | |
schritt | integer | ja | |
automatisch | boolean | ja | |
umfangObjektIds | array<string(uuid)> | ja | |
abgewaehlteEinheitIds | array<string(uuid)> | ja | |
geaendert | boolean | ja | false ⇔ der Wert war schon so gesetzt, nichts geschrieben |
MahnlaufVorgangKopf
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
stichtag | string(date) | ja | |
bezeichnung | string | ja | |
status | faellig | in_arbeit | ausgefuehrt | ja | |
schritt | integer | ja | |
automatisch | boolean | ja | |
objektNamen | array<string> | ja | |
schreiben | integer | ja | buchbare Schreiben (offen: Ableitung; ausgeführt: Ergebnis) |
summeCent | string | ja | Σ Betrag der buchbaren Schreiben, Cent-String |
ausnahmen | integer | ja | |
ausgeschlossen | integer | ja | |
inArbeitBei | unbekannt | ja | |
fremdInArbeit | unbekannt | ja | |
ausgefuehrtAm | string(date-time) | null | ja | |
ausgefuehrtVon | string | null | ja | |
MahnlaufVorgangPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
schluessel | string | ja | Positionsschlüssel (`mahn:vertrag:<id>`), Eingabe für ausschluss und aufheben |
status | string | ja | Status der Position in der Ableitung (z. B. buchbar, ausnahme, ausgeschlossen) |
objektId | string(uuid) | ja | |
objektName | string | ja | |
einheitId | string(uuid) | null | ja | |
einheitLage | string | null | ja | |
vertragId | string(uuid) | null | ja | |
personId | string(uuid) | null | ja | |
personName | string | null | ja | |
opIds | array<string(uuid)> | ja | |
stufe | integer | ja | höchste Mahnstufe vor dem Lauf |
stufeNachLauf | integer | ja | |
offenerBetragCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
guthabenVerrechnetCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
betragCent | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
grund | string | null | ja | |
reparatur | string | null | ja | |
versandstatus | string | null | ja | |
hinweise | array<string> | ja | |
kanal | string | null | ja | Vorbelegter Versandkanal der Person (email oder brief, wie die Kanal-Auswahl); null ohne Person |
zahlungsziel | string(date) | null | ja | |
MahnlaufVorgangResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
kopf | MahnlaufVorgangKopf | ja | |
umfang | array<MahnlaufUmfangObjekt> | ja | Objekte der Zuständigkeit des Aufrufers; Objekte außerhalb erscheinen nie |
positionen | array<MahnlaufVorgangPosition> | ja | offen: Positionen der Ableitung; ausgeführt: leer |
karenzTage | integer | null | ja | |
mahnwesenAktiv | boolean | ja | |
ergebnis | unbekannt | ja | |
MahnlaufZustellungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgangId | string(uuid) | ja | |
mahnschreibenId | string(uuid) | ja | |
zustellnachweisId | string(uuid) | ja | |
kanal | brief | einschreiben | persoenliche_uebergabe | ja | |
zugestelltAm | string(date) | ja | |
versandstatus | string | ja | immer zugestellt |
mahnereignisIds | array<string(uuid)> | ja | |
Mandat
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
contractId | string(uuid) | null | ja | |
contractNo | string | null | ja | Vertragsnummer des zugehörigen Vertrags (LEFT JOIN) |
personId | string(uuid) | null | ja | |
personName | string | null | ja | Name des Zahlungspflichtigen (LEFT JOIN) |
mandateRef | string | ja | Mandatsreferenz (UMR), je Tenant eindeutig |
glaeubigerId | string | null | ja | |
mandateType | core | b2b | null | ja | core = Basis-Lastschrift, b2b = Firmen-Lastschrift |
status | pending | active | revoked | expired | ja | |
signedAt | string(date-time) | null | ja | |
lastUsedAt | string(date-time) | null | ja | |
restrictedToCategories | array<string> | null | ja | Kategorie-Scope; null ⇒ kein Scope |
archivedAt | string(date-time) | null | ja | |
createdAt | string(date-time) | ja | |
MandatCreateRequest
Legt ein SEPA-Mandat zu einem AKTIVEN Vertrag an (Status pending). Übergänge laufen über den Status-Endpunkt.
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | der Vertrag; MUSS aktiv sein (sonst 404) |
personId | string(uuid) | null | nein | Zahlungspflichtiger (optional; wird geprüft, wenn gesetzt) |
mandateRef | string | ja | Mandatsreferenz (UMR), je Tenant eindeutig (Dublette ⇒ 400) |
glaeubigerId | string | null | nein | |
mandateType | core | b2b | null | nein | |
signedAt | string(date-time) | null | nein | Unterzeichnungszeitpunkt (ISO 8601) |
restrictedToCategories | array<string> | null | nein | |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
MandatListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | pending | active | revoked | expired | ja | der wirksame Status-Filter (alle ODER genau ein Status). Unbekannter Wert ⇒ 400. |
mandate | array<Mandat> | ja | |
MandatStatusRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | active | revoked | expired | ja | Ziel-Status. pending ist rein initial und kein gültiges Ziel. Ungültiger Übergang ⇒ 400. |
MandatStatusResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
status | pending | active | revoked | expired | ja | der jetzt wirksame Status |
previousStatus | pending | active | revoked | expired | ja | der Status vor diesem Aufruf |
changed | boolean | ja | true ⇒ dieser Aufruf hat den Status geändert (sonst No-op/Replay). |
MeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
tenantId | string(uuid) | ja | |
user | object | ja | |
authenticatedAt | number | nein | |
stepUp | object | ja | |
MessdienstCo2Energiemix
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | string | ja | Energieträger-Schlüssel (01 Braunkohle … 06 Erneuerbare, 99 Sonstige). |
prozent | string | ja | Prozentanteil als Ziffern-String mit (2,1) impliziten Stellen — „035" bedeutet 3,5 %. |
faktor | string | ja | CO2-Emissionsfaktor kg/kWh als Ziffern-String mit (6,3) impliziten Stellen. |
MessdienstCo2Position
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | null | ja | Die GESPEICHERTE Ausweis-Zeile (#1602); null, falls dieser Ausweis nicht persistiert wurde. |
kostenartSchluessel | string | ja | Schlüssel der Kostenart des tragenden K-Satzes. |
kostenbezeichnung | string | ja | |
emissionsart | string | null | ja | 01 = kg/kWh, 02 = t/MWh, 03 = kg gesamt; null, wenn die Datei nichts ausweist. |
emission | string | null | ja | CO2-Emission als Ziffern-String mit (6,3) impliziten Stellen. |
menge | string | null | ja | CO2-Emissionsmenge in kg als Ziffern-String mit (6,3) impliziten Stellen (ab Standard 3.10). |
kostenBruttoCents | string | null | ja | CO2-Kosten brutto in ganzen Cents als ZIFFERN-STRING (nie eine JSON-Zahl). |
kostenNettoCents | string | null | ja | CO2-Kosten netto in ganzen Cents als ZIFFERN-STRING (nie eine JSON-Zahl). |
energiemix | array<MessdienstCo2Energiemix> | ja | |
MessdienstImportResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
importBatchId | string(uuid) | ja | Kennung DIESES Batches — append-only, jeder Aufruf legt einen neuen an (Korrektur = Re-Import, K5). |
propertyId | string(uuid) | ja | |
allocationKeyId | string(uuid) | ja | Der befüllte Umlageschlüssel; er MUSS vom Typ „extern" sein. |
period | object | ja | Die GESPEICHERTE Abrechnungsperiode (beide Grenzen einschließlich) — gegen die eigene Abrechnungsperiode halten. |
rowCount | integer | ja | |
unmatchedCount | integer | ja | Zeilen ohne aufgelösten Vertrag/Einheit (bewusst unaufgelöst, kein Fehler). |
emissionCount | integer | ja | Anzahl GESPEICHERTER CO2-Ausweis-Zeilen (#1602) — nicht Teil von rowCount: ein Ausweis ist kein Festbetrag eines Mieters. |
rows | array<MessdienstImportZeile> | ja | |
co2 | array<MessdienstCo2Position> | ja | Die CO2-Angaben, die die ARGE-Datei AUSGEWIESEN hat (W1 übernimmt den Messdienst-Ausweis, keine Eigenberechnung). Seit #1602 werden sie GESPEICHERT; je Position steht die id der gespeicherten Zeile dabei. Beim CSV-Import immer leer. |
MessdienstImportZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
externalRef | string | ja | Roh-Kennung der Messdienst-Quellzeile (Nutzer-/Objektnummer), für die Rückverfolgung. |
contractId | string(uuid) | null | ja | |
unitId | string(uuid) | null | ja | |
amountCents | string | ja | Festbetrag in ganzen Cents als ZIFFERN-STRING (bigint-Cents, GG3/INV-MONEY-01) — nie eine JSON-Zahl. |
matched | boolean | ja | false ⇒ die Zeile ist bewusst unaufgelöst (kein Vertrag/keine Einheit). |
MieterhoehungFaelligParagraph557b
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | vorschau | keine-aenderung | vpi-fehlt | basisjahr-abweichend | nicht-berechenbar | ja | vpi-fehlt: kein VPI-Monat zum Bezug; basisjahr-abweichend: der aktuelle VPI stammt aus einer anderen Reihe — beides ohne Betrag |
basisjahr | integer | ja | Basisjahr der vereinbarten VPI-Reihe |
fruehesterTermin | string(date) | null | ja | frühester Anpassungstermin (letzte Änderung + 12 Monate); null, solange nicht gerechnet |
faellig | boolean | null | ja | true ⇒ eine Erklärung zum Stichtag wäre nicht zu früh; null, solange nicht gerechnet |
juengsterVpiMonat | string | null | ja | jüngster zum Stichtag veröffentlichter VPI-Monat (YYYY-MM) |
neueKaltmieteCents | string | null | ja | neue Kaltmiete der Vorschau in Cent; nur bei vorschau / keine-aenderung |
wirksamAb | string(date) | null | ja | Wirksamkeitstag der Vorschau |
grund | string | null | ja | nur bei nicht-berechenbar: Grund-Code der Fachschicht |
MieterhoehungFaelligParagraph558
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | faellig | noch-nicht-faellig | gesperrt | ja | |
fruehesterTermin | string(date) | null | ja | frühester zulässiger Wirksamkeitstag (letzte Erhöhung + 12 Monate); null ohne Sperrfrist oder bei gesperrt |
grund | kollision-indexmiete | kollision-staffelmiete | null | ja | nur bei gesperrt: welche Vereinbarung das Verfahren ausschließt |
MieterhoehungFaelligResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | der verwendete Stichtag (Vorgabe: heute, Server-Uhr) |
zeilen | array<MieterhoehungFaelligZeile> | ja | nur laufende Wohnraumverträge der Objekte, für die der Aufrufer zuständig ist |
MieterhoehungFaelligVorgang
| Feld | Typ | Pflicht | Beschreibung |
|---|
mieterhoehungId | string(uuid) | ja | |
zugangAm | string(date) | ja | |
zustimmungsfristEnde | string(date) | ja | Zugang + 3 Kalendermonate (§ 558b Abs. 2), nie gespeichert |
MieterhoehungFaelligZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
kaltmieteCents | string | ja | heute geschuldete Kaltmiete in Cent |
letzteErhoehungAm | string(date) | null | ja | Wirksamkeitstag der letzten Erhöhung bzw. Vertragsbeginn; null = seit jeher |
paragraph558 | MieterhoehungFaelligParagraph558 | ja | |
paragraph557b | unbekannt | ja | |
offenerVorgang | unbekannt | ja | |
MieterwechselAltVertrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
endDate | string(date) | ja | erster Tag ohne den Altmieter (exklusive obere Grenze) |
endReason | string | null | ja | |
closedTermIds | array<string(uuid)> | ja | |
closedUnitLinkId | string(uuid) | null | ja | die geschlossene Belegungs-Zeitscheibe; null, wenn der Altvertrag auf dieser Einheit keine offene hatte |
MieterwechselMietpartei
die Mietpartei, die MIT dem Neuvertrag entstanden ist (#1910) — in derselben Transaktion geschrieben
| Feld | Typ | Pflicht | Beschreibung |
|---|
partyRoleId | string(uuid) | ja | Id der party_roles-Zeile |
personId | string(uuid) | ja | die Person, die den Neuvertrag als Mietpartei trägt |
role | string | ja | immer "mieter" — ein Mieterwechsel erzeugt genau diese Rolle |
validRange | string | ja | daterange der Rolle, z. B. [2026-07-01,) — untere Grenze = Beginn des Neuvertrags |
MieterwechselNeuerVertrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
contractNo | string | ja | |
startDate | string(date) | ja | erster Tag mit dem Neumieter (inklusive untere Grenze) |
termId | string(uuid) | ja | |
kaltmieteCents | string | ja | Kaltmiete in Cents als Ziffern-String (nie bigint/number an der Grenze, GG3) |
currency | string | ja | |
termValidRange | string | ja | daterange der initialen Konditions-Scheibe, z. B. [2026-07-01,) |
unitLinkId | string(uuid) | ja | |
unitValidRange | string | ja | daterange der neuen Belegung, z. B. [2026-07-01,) |
payments | array<VertragZahlungChangeResultPayment> | ja | |
mietpartei | MieterwechselMietpartei | ja | |
MieterwechselPayment
| Feld | Typ | Pflicht | Beschreibung |
|---|
componentId | string(uuid) | ja | muss existieren und aktiv sein (Prüfung im Tool-Layer) |
amountCents | integer | string | ja | Betrag in Cents, GANZZAHLIG (kein Float): ganze Zahl ODER Ziffern-String |
currency | string | ja | |
MieterwechselRequest
Mieterwechsel auf EINER Einheit als EIN Kommando: Altvertrag beenden, Neuvertrag anlegen, Konditions- und Belegungs-Zeitscheiben fortschreiben — alles in EINER Transaktion.
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | die Einheit, auf der gewechselt wird; das Objekt folgt aus ihr (kein eigenes Feld) |
altVertragId | string(uuid) | ja | der noch LAUFENDE Altvertrag (bereits beendet ⇒ 409) |
endDate | string(date) | ja | erster Tag OHNE den Altmieter (EXKLUSIVE obere Grenze seiner Zeitscheiben). Kündigung zum 30.06. ⇒ 2026-07-01. Gleiche Bedeutung wie endDate in POST /api/vertrag/{id}/end. |
endReason | string | null | nein | Grund der Beendigung (optional) |
startDate | string(date) | nein | erster Tag MIT dem Neumieter (INKLUSIVE untere Grenze). Ohne Angabe = endDate, also nahtlos. Kleiner als endDate ⇒ Überlappung (400). Größer ⇒ Leerstand, nur mit leerstandAkzeptiert. |
leerstandAkzeptiert | boolean | nein | bestätigt einen GEWOLLTEN Leerstand zwischen Alt- und Neuvertrag (sonst 400) |
contractNo | string | ja | Vertragsnummer des Neuvertrags (Ordnungsnummer ohne erzwungene Eindeutigkeit, #416) |
mieterPersonId | string(uuid) | ja | die MIETPARTEI des Neuvertrags — PFLICHT seit #1910. Muss eine aktive Person dieses Mandanten sein (unbekannt, mandantenfremd oder archiviert ⇒ 404, ununterscheidbar). Die party_roles-Zeile entsteht in DERSELBEN Transaktion wie der Neuvertrag. |
kaltmieteCents | integer | string | ja | Kaltmiete des Neuvertrags in Cents, GANZZAHLIG (GG3/K4) |
currency | string | ja | |
ustOption | boolean | nein | |
ustRate | integer | nein | USt-Satz in ganzen Prozent, nur bei ustOption true; ohne Angabe bei Option 19. Angeboten wird heute nur 19 (#5988). |
dueRule | monatserster | monatsdritter-werktag | quartalsbeginn | fester-tag | nein | Fälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay). |
dueDay | integer | nein | Fälligkeitstag 1–31 der Regel fester-tag (in kürzeren Monaten der Monatsletzte). Gesetzt GENAU bei dueRule = fester-tag — fester-tag ohne Tag und ein Tag an einer anderen Regel werden abgewiesen. |
paymentMethod | string | nein | |
mahnsperre | boolean | nein | |
depositCents | integer | string | nein | Kaution in Cents (dokumentarisch); depositCurrency dann Pflicht |
depositCurrency | string | nein | |
payments | array<MieterwechselPayment> | nein | |
rentShare | string | nein | Miet-Anteil der Einheit am Neuvertrag als Dezimal-STRING (kein number — numeric-Spalte) |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
MieterwechselResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
propertyId | string(uuid) | ja | das Objekt, das aus der Einheit folgt |
altVertrag | MieterwechselAltVertrag | ja | |
neuerVertrag | MieterwechselNeuerVertrag | ja | |
vacancy | MieterwechselVacancy | ja | |
sepa | MieterwechselSepa | ja | |
MieterwechselSepa
rein informativ — dieser Vorgang ändert KEINEN Mandatsstatus
| Feld | Typ | Pflicht | Beschreibung |
|---|
altMandateIds | array<string(uuid)> | ja | noch gültige (pending/active) Mandate des Altvertrags |
neuerVertragHatMandat | boolean | ja | |
hinweis | string | ja | |
MieterwechselVacancy
die Naht zwischen Alt und Neu
| Feld | Typ | Pflicht | Beschreibung |
|---|
days | integer | ja | Tage ohne Belegung (0 ⇒ nahtlos) |
akzeptiert | boolean | ja | wurde eine Lücke ausdrücklich bestätigt? (false bei days = 0) |
MigrationsvergleichAbweichung
| Feld | Typ | Pflicht | Beschreibung |
|---|
fachbereich | salden | offene-posten | nk-abrechnung | hausgeldabrechnung | vermoegensbericht | ruecklagen | mahnliste | ja | |
procedure | string | ja | |
onr | integer | ja | WinCASA-Objektnummer (ONR) = properties.property_no |
jahr | integer | ja | |
schluessel | string | ja | die Identität der Position innerhalb von Auswertung, Objekt und Jahr (z. B. knr=200100) |
feld | string | ja | |
konto | string | null | ja | das Konto (WinCASA-KNR als Text); null, wenn die Position an keinem Konto hängt |
person | object | null | ja | Inhaber, wenn konto ein Personenkonto des casa.ai-Bestands ist; sonst null |
erwartetCents | string | null | ja | WinCASA-Wert in Cent als Ganzzahl-Text; null ⇔ die Position fehlt auf der WinCASA-Seite |
istCents | string | null | ja | casa.ai-Wert in Cent als Ganzzahl-Text; null ⇔ die Position fehlt auf der casa.ai-Seite |
differenzCents | string | null | ja | ist − erwartet in Cent als Ganzzahl-Text; null, wenn eine Seite fehlt |
erklaerung | string | null | ja | Begründung aus dem Erklärungs-Register; null ⇔ unerklärt |
korpusfall | MigrationsvergleichKorpusfall | ja | |
MigrationsvergleichFachbereich
| Feld | Typ | Pflicht | Beschreibung |
|---|
fachbereich | salden | offene-posten | nk-abrechnung | hausgeldabrechnung | vermoegensbericht | ruecklagen | mahnliste | ja | |
status | gleich | abweichend | nicht-vergleichbar | ja | gleich ⇔ Positionen > 0 ohne Abweichung; abweichend ⇔ mindestens eine Abweichung; nicht-vergleichbar ⇔ keine Position (dann grund + grundText) |
positionen | integer | ja | verglichene Positionen (Vereinigung beider Seiten, nur zugeordnete Objekte) |
gleich | integer | ja | davon centgenau gleich |
abweichungen | array<MigrationsvergleichAbweichung> | ja | |
unerklaert | integer | ja | Zahl der Abweichungen ohne Erklärung |
nichtZugeordnet | array<integer> | ja | ONRs mit WinCASA-Werten, die keinem casa.ai-Objekt zugeordnet sind |
grund | keine-vergleichswerte | auswertung-fehlt | zuordnung-fehlt | null | ja | |
grundText | string | null | ja | |
MigrationsvergleichKorpusfall
| Feld | Typ | Pflicht | Beschreibung |
|---|
format | casa-migrationsvergleich-korpusfall/v1 | ja | |
fachbereich | salden | offene-posten | nk-abrechnung | hausgeldabrechnung | vermoegensbericht | ruecklagen | mahnliste | ja | |
procedure | string | ja | die WinCASA-Auswertung (gespeicherte Prozedur), aus der der Wert stammt |
params | object | ja | die Parameter des Aufrufs, anonymisiert: Zahlen, Daten und J/N-Schalter wie im Satz, jeder andere Text ersetzt |
onr | integer | ja | |
jahr | integer | ja | |
schluessel | string | ja | |
feld | string | ja | |
konto | string | null | ja | |
erwartetCents | string | null | ja | WinCASA-Wert in Cent als Ganzzahl-Text; null, wenn die Position dort fehlt |
istCents | string | null | ja | casa.ai-Wert in Cent als Ganzzahl-Text; null, wenn die Position dort fehlt |
differenzCents | string | null | ja | ist − erwartet in Cent als Ganzzahl-Text; null, wenn eine Seite fehlt |
zeilen | array<object> | ja | die WinCASA-Zeilen dieses Aufrufs, ANONYMISIERT (jede Textzelle, die weder Zahl noch Datum ist, ist ersetzt) |
MigrationsvergleichResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
importId | string(uuid) | ja | der Import-Vorgang (Kanal direktimport) |
satzId | string(uuid) | ja | der verglichene (jüngste) Satz WinCASA-Vergleichswerte |
satzVersion | integer | ja | |
objekte | array<object> | ja | jede ONR des Satzes, aufsteigend, mit ihrer Zuordnung |
fachbereiche | array<MigrationsvergleichFachbereich> | ja | alle sieben Fachbereiche in fester Reihenfolge |
abgenommen | boolean | ja | „Alt = Neu maschinell belegt": jedes Objekt des Satzes zugeordnet, keine unerklärte Abweichung und jeder Paritäts-Fachbereich gleich oder erklärt abweichend |
Objekt
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyNo | string | ja | |
name | string | ja | |
adresse | string | null | ja | Kurzanschrift zur BESCHRIFTUNG des Objekts („Schloßallee 21, München", #2483) — abgeleitet aus dem ÄLTESTEN AKTIVEN Gebäude, ohne PLZ. null ⇒ kein aktives Gebäude oder keine brauchbare Anschrift hinterlegt. Reine Anzeige und NICHT pflegbar; die pflegbare Anschrift ist `Gebaeude.address`. |
verwaltungsart | miet | weg | pro | ja | Verwaltungsart des Objekts (geschlossenes Vokabular): miet = Mietverwaltung, weg = Verwaltung der Eigentümergemeinschaft, pro = WEG mit Mietverwaltung (PRO). |
verwaltungsverhaeltnis | eigen | fremd | ja | Verwaltungsverhältnis des Objekts (geschlossenes Vokabular, orthogonal zur Verwaltungsart): eigen = Eigenverwaltung/Eigenbestand (der Verwalter verwaltet eigenes Eigentum), fremd = Fremdverwaltung (fremdes Eigentum im Auftrag; Regelfall/Default). |
bundesland | bb | be | bw | by | hb | he | hh | mv | ni | nw | rp | sh | sl | sn | st | th | null | ja | Bundesland des Objekts (#947); null ⇒ nicht erfasst. |
bankentscheid | verbunden | ohne_bankanbindung | null | ja | Der Bankentscheid am Objekt (#3297): `verbunden` = an eine Bankverbindung angebunden, `ohne_bankanbindung` = bewusst ohne. null ⇒ NICHT ENTSCHIEDEN — der Zustand jedes vor #3297 entstandenen Objekts. Er wird über die eigene Fachhandlung `set_property_bank_decision` gesetzt und geändert, NICHT über `update_property`. |
anteilNachkommastellen | integer | null | ja | Nachkommastellen der Anteile (#2066); null ⇒ nicht erfasst. |
grundkostenAchsen | object | null | ja | Die vier Grundkosten-Achsen (#2304); null ⇒ das Objekt rechnet keinen § 7-Split (reine Verbrauchsverteilung). |
billingPeriod | string | null | ja | |
istSollVersteuerung | string | null | ja | |
ustSettings | object | ja | |
accountingCircleId | string(uuid) | null | ja | |
accountingCircleName | string | null | ja | |
managementStartDate | string(date) | null | ja | Verwaltungsbeginn — ERSTER betreuter Tag (inklusiv); null ⇒ nicht erfasst / offener Beginn. |
managementEndDate | string(date) | null | ja | Verwaltungsende — LETZTER betreuter Tag (inklusiv); null ⇒ das Mandat läuft weiter. |
archivedAt | string(date-time) | null | ja | gesetzt ⇒ archiviert (K5: kein DELETE) |
createdAt | string(date-time) | ja | |
ObjektArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | |
accountingCircleId | string(uuid) | null | ja | |
alreadyArchived | boolean | ja | true ⇒ das Objekt war bereits archiviert (expliziter No-op). |
hinweise | array<object> | ja | Hinweise zum erfolgreichen Archivieren; leeres Array ⇒ kein Befund. Ein `verwaltungsende_fehlt` meldet fehlendes Verwaltungsende. |
ObjektCheckBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | string | ja | Maschinenlesbarer Befund-Code. Struktur: objekt_ohne_gebaeude | objekt_ohne_einheiten | gebaeude_ohne_einheiten. Fläche (§20 NMV): flaeche_fehlt | flaeche_unplausibel | flaeche_mehrdeutig. Miteigentumsanteil: mea_fehlt | mea_summe_abweichung | mea_nenner_uneinheitlich | mea_unplausibel. Die Flächenpflicht ist fail-closed (DENYLIST): pflichtig ist jede Einheiten-Art, die nicht nachweislich befreit ist (Stellplatz/Garage/„sonstige") — unit_kind ist offenes Vokabular ohne CHECK. |
ampel | gruen | gelb | rot | ja | Ampel dieses Befunds (zentrale Definition, GG6/BP #13). |
scope | objekt | gebaeude | einheit | ja | Bezugsebene des Befunds. |
refId | string(uuid) | null | ja | ID der betroffenen Einheit/des Gebäudes; null bei Objekt-Ebene. |
message | string | ja | Deutsche Klartext-Meldung (Anzeige; die Wahrheit ist code). |
ObjektCheckGebaeudeFlaeche
| Feld | Typ | Pflicht | Beschreibung |
|---|
buildingId | string(uuid) | ja | |
summeQm | string | null | ja | Summe der lesbaren Einheiten-Flächen als m²-Dezimalstring; null ⇒ keine. |
einheiten | integer | ja | Anzahl aktiver Einheiten des Gebäudes am Stichtag. |
ObjektCheckResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
asOf | string(date) | ja | Wirksamer Stichtag, gegen den die Attribut-Scheiben gemessen wurden. |
ampel | gruen | gelb | rot | ja | Objekt-Ampel = riskanteste Einzel-Ampel aller Befunde; ohne Befund gruen. |
einheitenGesamt | integer | ja | Anzahl aktiver Einheiten des Objekts am Stichtag. |
gesamtflaecheQm | string | null | ja | Summe der lesbaren Einheiten-Flächen des Objekts als m²-Dezimalstring; null ⇒ keine. |
flaecheJeGebaeude | array<ObjektCheckGebaeudeFlaeche> | ja | |
befunde | array<ObjektCheckBefund> | ja | |
ObjektCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyNo | string | ja | Objektnummer — fachliche Ordnungsnummer, KEINE erzwungene Eindeutigkeit (kein Unique-Index; s. #416). Die Identität eines Objekts ist `id`. |
verwaltungsart | miet | weg | pro | ja | Verwaltungsart des Objekts (geschlossenes Vokabular): miet = Mietverwaltung, weg = Verwaltung der Eigentümergemeinschaft, pro = WEG mit Mietverwaltung (PRO). |
verwaltungsverhaeltnis | eigen | fremd | nein | Eigen-/Fremdverwaltung; ohne Angabe gilt der Default fremd (#590). |
bundesland | bb | be | bw | by | hb | he | hh | mv | ni | nw | rp | sh | sl | sn | st | th | null | nein | Bundesland des Objekts (#947); ohne Angabe/null nicht erfasst. |
anteilNachkommastellen | integer | null | nein | Nachkommastellen der Anteile (#2066); ohne Angabe/null nicht erfasst. |
grundkostenAchsen | object | null | nein | Die vier Grundkosten-Achsen (#2304); ohne Angabe/null rechnet das Objekt keinen § 7-Split. |
name | string | nein | Anzeigename; ohne Angabe gilt die Objektnummer |
billingPeriod | string | null | nein | |
istSollVersteuerung | string | null | nein | |
ustSettings | object | nein | |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
ObjektListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | archiviert | ja | der wirksame 3-Wege-Filter |
objekte | array<Objekt> | ja | |
ObjektReactivateResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
reactivatedAt | string(date-time) | ja | |
accountingCircleId | string(uuid) | null | ja | |
alreadyActive | boolean | ja | true ⇒ das Objekt war bereits aktiv (expliziter No-op, kein Write). |
reactivatedBuildings | integer | ja | Anzahl der von DIESER Kaskade zurückgeholten Gebäude. |
reactivatedUnits | integer | ja | Anzahl der von DIESER Kaskade zurückgeholten Einheiten. |
ObjektUpdateRequest
Partieller Patch — mindestens ein Feld muss gesetzt sein.
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyNo | string | nein | |
verwaltungsart | miet | weg | pro | nein | Verwaltungsart des Objekts (geschlossenes Vokabular): miet = Mietverwaltung, weg = Verwaltung der Eigentümergemeinschaft, pro = WEG mit Mietverwaltung (PRO). |
verwaltungsverhaeltnis | eigen | fremd | nein | Verwaltungsverhältnis des Objekts (geschlossenes Vokabular, orthogonal zur Verwaltungsart): eigen = Eigenverwaltung/Eigenbestand (der Verwalter verwaltet eigenes Eigentum), fremd = Fremdverwaltung (fremdes Eigentum im Auftrag; Regelfall/Default). |
bundesland | bb | be | bw | by | hb | he | hh | mv | ni | nw | rp | sh | sl | sn | st | th | null | nein | Bundesland des Objekts (#947); null setzt zurück auf nicht erfasst. |
anteilNachkommastellen | integer | null | nein | Nachkommastellen der Anteile (#2066); null setzt zurück auf nicht erfasst. |
grundkostenAchsen | object | null | nein | Die vier Grundkosten-Achsen (#2304) — immer GEMEINSAM; null setzt alle vier zurueck auf kein § 7-Split. |
name | string | nein | |
billingPeriod | string | null | nein | |
istSollVersteuerung | string | null | nein | |
ustSettings | object | nein | |
OffenePostenListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
posten | array<OffenerPosten> | ja | |
summen | OffenePostenSummen | ja | |
OffenePostenSummen
| Feld | Typ | Pflicht | Beschreibung |
|---|
rueckstandCents | string | ja | Σ Restbetrag der FORDERUNGEN, vorzeichenlos. |
guthabenCents | string | ja | Σ |Restbetrag| der GUTHABEN, vorzeichenlos. |
verbindlichkeitenCents | string | null | ja | Σ |Restbetrag| der VERBINDLICHKEITEN; null, wenn der Read sie nicht ausweist. |
saldoCents | string | ja | rueckstand − guthaben, signiert — die EINZIGE gegenrechnende Zahl. |
nominalForderungenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
nominalGuthabenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
nominalVerbindlichkeitenCents | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
anzahlForderungen | integer | ja | |
anzahlGuthaben | integer | ja | |
anzahlVerbindlichkeiten | integer | null | ja | |
OffenerPosten
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | journal_entries.id der Sollstellung — bei einer freien Zahlung die der Zahlung. |
quelle | sollstellung | freie-zahlung | ja | |
propertyId | string(uuid) | ja | |
propertyNo | string | null | ja | Objekt-Nummer zur Anzeige; null, falls nicht auflösbar. |
contractId | string(uuid) | null | ja | Debitor-Dimension; null bei objektbezogenen Posten ohne Vertrag. |
forderungsart | kosten | zinsen | hauptforderung | ja | |
geldkreis | miete | weg_hausgeld | sev | ja | |
faelligAm | string(date) | ja | |
nominalbetragCents | string | ja | WAS GESTELLT WURDE (signiert). |
zugeordnetCents | string | ja | Summe der wirksamen Zuordnungen, im Vorzeichen des Nominalbetrags. |
restbetragCents | string | ja | WAS NOCH OFFEN IST (signiert) — nie mit nominalbetragCents verwechseln. |
currency | string | ja | |
status | offen | teilweise | erledigt | ja | |
richtung | forderung | guthaben | verbindlichkeit | ja | |
tageUeberfaellig | integer | ja | Tage seit Fälligkeit am Stichtag; <= 0, solange nicht fällig. |
Option
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
scopeType | tenant | objekt | einheit | vertrag | ja | Scope-Ebene (Spezifitäts-Leiter) |
scopeId | string(uuid) | null | ja | Ziel-UUID der Ebene; NULL beim tenant-globalen Default |
key | string | ja | |
value | unbekannt | nein | beliebiges JSON (jsonb) |
valueType | string | null | ja | optionaler Typ-Hinweis (z. B. boolean/string) |
createdAt | string(date-time) | ja | |
OptionListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
filter | object | ja | der WIRKSAME Filter (die Antwort sagt, was sie zeigt) |
options | array<Option> | ja | |
OptionResolveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
key | string | ja | |
found | boolean | ja | false ⇒ auf keiner berücksichtigten Ebene gesetzt |
value | unbekannt | nein | effektiver Wert (beliebiges JSON) oder null, wenn nicht gefunden |
valueType | string | null | ja | |
scopeType | tenant | objekt | einheit | vertrag | null | ja | der GEWINNENDE (spezifischste vorhandene) Scope; null ⇒ nicht gefunden |
scopeId | string(uuid) | null | ja | |
OptionSetRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
scopeType | tenant | objekt | einheit | vertrag | ja | |
scopeId | string(uuid) | null | nein | Pflicht für objekt/einheit/vertrag; beim tenant-Scope weglassen. |
key | string | ja | |
value | unbekannt | nein | beliebiges NICHT-NULL JSON. null UND fehlend ⇒ 400; false/0/""/{}/[] sind erlaubt. |
valueType | string | null | nein | |
OptionSetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
scopeType | tenant | objekt | einheit | vertrag | ja | |
scopeId | string(uuid) | null | ja | |
key | string | ja | |
value | unbekannt | nein | der wirksam gewordene Wert (beliebiges JSON) |
valueType | string | null | ja | |
created | boolean | ja | true ⇒ neu angelegt; false ⇒ bestehender Wert überschrieben |
PasseHonorarvereinbarungAnRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
wirksamAb | string(date) | ja | Monatserster, ab dem die neue Scheibe gilt. |
neueVereinbarung | object | ja | Die neue Vereinbarung ohne gueltigAb/gueltigBis; Beträge als { cents: Integer-STRING, currency: "EUR" }, Sätze als Integer-STRINGS. |
grundlage | beschluss | zustimmung | klausel | ja | |
beschlussId | string(uuid) | null | nein | Genau bei grundlage = beschluss. |
zustimmungAm | string(date) | null | nein | |
begruendung | string | ja | |
Person
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
personType | string | ja | natuerlich | juristisch (Doc 20 §5) — nicht schema-seitig geschlossen |
name | string | ja | Anzeigename — KEINE erzwungene Eindeutigkeit. Die Identität einer Person ist `id`. |
contact | PersonContact | ja | |
archivedAt | string(date-time) | null | ja | gesetzt ⇒ archiviert (K5: kein DELETE) |
createdAt | string(date-time) | ja | |
kreditorKategorie | handwerker | dienstleister | behoerde | versicherung | amt | null | ja | Kategorie eines Kreditors — geschlossenes Vokabular (`KREDITOR_KATEGORIEN`, `@casaai/domain`); `null` ⇒ keine |
archiveReason | string | null | ja | Grund der Archivierung (Freitext, personenbezogen); nur gesetzt, wenn `archivedAt` gesetzt ist |
PersonArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | |
alreadyArchived | boolean | ja | true ⇒ die Person war bereits archiviert (expliziter No-op). Rollen werden NICHT mitbeendet. |
Kontaktangaben (personenbezogen — nie in Logs/URLs). Benannte Felder sind typisiert; UNBEKANNTE Zusatzschlüssel bleiben erhalten (kein Datenverlust beim Round-Trip).
| Feld | Typ | Pflicht | Beschreibung |
|---|
email | string(email) | nein | E-Mail — einziges formatgeprüftes Feld (Anker der Portal-Identität) |
telefon | string | nein | Telefon privat/allgemein — der im Bestand vorhandene Schlüssel |
mobil | string | nein | Mobilnummer |
telefonGeschaeftlich | string | nein | Telefon geschäftlich |
adresse | object | nein | Postanschrift |
anrede | herr | frau | divers | familie | firma | nein | Anrede — geschlossenes Vokabular (`ANREDEN`, `@casaai/domain`) |
titel | string | nein | Titel, z. B. „Dr.“ — freier Text |
briefanrede | string | nein | Briefanrede, z. B. „Sehr geehrter Herr Dr. Kellner,“ — Vorschlag `briefanredeVorschlag` (`@casaai/domain`), überschreibbar |
kommunikation | object | nein | Kommunikationspräferenzen |
PersonCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
personType | string | ja | |
name | string | ja | |
contact | PersonContact | nein | |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
PersonListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | archiviert | ja | der wirksame 3-Wege-Filter |
personen | array<Person> | ja | |
PersonUpdateRequest
Partieller Patch — mindestens ein Feld muss gesetzt sein. `contact` ersetzt das GANZE Kontakt-Objekt (kein Merge): wer nur ein Feld ändert, schickt die übrigen Schlüssel mit, sonst gehen sie verloren.
| Feld | Typ | Pflicht | Beschreibung |
|---|
personType | string | nein | |
name | string | nein | |
contact | PersonContact | nein | |
PosteingangListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorschlaege | array<PosteingangVorschlag> | ja | |
PosteingangVorschlag
| Feld | Typ | Pflicht | Beschreibung |
|---|
documentId | string(uuid) | ja | |
proposalId | string(uuid) | ja | |
proposalVersion | integer | ja | monoton steigende Version des Vorschlags (P12.6) |
ampel | gruen | gelb | rot | ja | P12.3-Ampel (Review-Aufwand) — die UI gruppiert hiernach |
kreditorId | string | null | ja | |
konto | string | null | ja | |
betragCents | string | null | ja | Brutto in Cents als Ziffern-String (GG3: nie Float/number) |
betragCurrency | string | null | ja | |
provenanceCounts | object | ja | Anzahl entscheidungsrelevanter Felder je Herkunft (origin), z. B. { regel: 1, struktur: 1, modell: 1 } |
createdAt | string(date-time) | ja | |
RentabilitaetMonat
| Feld | Typ | Pflicht | Beschreibung |
|---|
monat | string | ja | Monat `JJJJ-MM`. |
ertragNettoCents | string | null | ja | Honorar netto des Monats (Sonderleistungen mit); null, wenn der Monat kein Honorar trägt. |
grund | vereinbarung-fehlt | eigenbestand | ausserhalb-verwaltungszeitraum | null | ja | |
gueltigAb | string(date) | null | ja | Beginn der Zeitscheibe, die gerechnet hat; null ohne Honorar. |
RentabilitaetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
von | string | ja | Erster Monat `JJJJ-MM` (Echo). |
bis | string | ja | Letzter Monat `JJJJ-MM` (Echo). |
urteil | wirtschaftlich | unwirtschaftlich | nicht-beurteilbar | ja | |
gruende | array<keine-zeit-erfasst | kein-honorar> | ja | |
ertragNetto | string | null | ja | Σ Honorar netto in Cent; null ohne jedes Honorar im Zeitraum. |
aufwand | string | ja | Erfasste Zeit mal Kalkulationssatz in Cent. |
deckungsbeitrag | string | ja | Ertrag minus Aufwand in Cent, vorzeichenbehaftet. |
margeBasispunkte | string | null | ja | Deckungsbeitrag je Ertrag in Basispunkten (kaufmännisch gerundet); null ohne Ertrag. |
minuten | string | ja | Erfasste Minuten als Integer-STRING. |
kapazitaetsanteilBasispunkte | string | ja | Anteil der produktiven Zeit in Basispunkten. |
currency | string | ja | |
monate | array<RentabilitaetMonat> | ja | |
kalkulation | object | ja | |
Rolle
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
personId | string(uuid) | ja | |
personName | string | ja | |
role | string | ja | mieter | eigentuemer | dienstleister | beirat … — nicht schema-seitig geschlossen |
targetKind | objekt | einheit | vertrag | mehrdeutig | null | ja | abgeleitet; `mehrdeutig` = mehrere Ziel-Spalten gesetzt (Datendefekt, sichtbar gemacht) |
targetId | string(uuid) | null | ja | null bei `mehrdeutig` und ohne Ziel |
validFrom | string(date) | null | ja | inklusiv; null ⇒ unbegrenzt in die Vergangenheit |
validTo | string(date) | null | ja | EXKLUSIV; null ⇒ laufend |
validRange | string | ja | das rohe Postgres-daterange-Literal, z. B. `[2026-01-01,)` |
createdAt | string(date-time) | ja | |
RolleAssignRequest
Genau EIN Ziel angeben: propertyId (Objekt) ODER unitId (Einheit). Beides oder keines ⇒ 400.
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
role | string | ja | |
propertyId | string(uuid) | nein | |
unitId | string(uuid) | nein | |
validFrom | string(date) | nein | inklusiv (YYYY-MM-DD); ohne Angabe unbegrenzt |
validTo | string(date) | nein | EXKLUSIV (YYYY-MM-DD); ohne Angabe laufend |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
RolleEndRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
endDate | string(date) | ja | Tag, ab dem die Rolle NICHT mehr gilt (exklusive obere Grenze) |
RolleEndResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
endDate | string(date) | ja | |
validRange | string | ja | |
alreadyEnded | boolean | ja | true ⇒ die Rolle war bereits beendet; `endDate` trägt dann das URSPRÜNGLICHE Ende. |
RolleListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | beendet | ja | der wirksame 3-Wege-GÜLTIGKEITS-Filter. ACHTUNG: aktiv ∪ beendet ≠ alle (zukünftige Rollen nur unter `alle`). |
asOf | string(date) | ja | der wirksame Stichtag, gegen den aktiv/beendet gemessen wurde |
rollen | array<Rolle> | ja | |
RuecklageAnlegenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | erhaltung | zweckgebunden | ja | erhaltung = die Erhaltungsrücklage (je Objekt genau eine) · zweckgebunden = Rücklage mit Zweckbindung. |
bezeichnung | string | ja | |
zweckbindung | string | null | nein | Pflicht bei `zweckgebunden`, verboten bei `erhaltung`. |
verteilerschluessel | string | nein | Vorgabe: Miteigentumsanteil. |
unitGroupId | string(uuid) | null | nein | optionale Untergruppe desselben Objekts |
kontoinhaberArt | gdwe | verwalter | dritter | ja | |
kontoinhaberName | string | ja | |
aktivKontoId | string(uuid) | null | nein | ein bestehendes Bestandskonto (Bank) des Objekts; ohne Angabe wird eines angelegt. |
RuecklageAnlegenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | angelegt | bereits_ausgefuehrt | ja | bereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; das gespeicherte Erstergebnis, nichts neu angelegt. |
ruecklageId | string(uuid) | ja | |
art | erhaltung | zweckgebunden | ja | |
aktivKontoId | string(uuid) | ja | |
aktivKontoNummer | string | null | ja | null, wenn ein bestehendes aktives Konto genannt war (dann wurde keines angelegt). |
passivKontoId | string(uuid) | ja | |
passivKontoNummer | string | ja | |
verteilerschluessel | string | ja | |
kontoinhaberArt | gdwe | verwalter | dritter | ja | |
RuecklagenAbstimmungBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
klasse | umbuchung_giro_festgeld_fehlt | konto_ohne_gegenstueck | ja | |
betroffeneRuecklagen | array<string(uuid)> | ja | |
betrag | RuecklagenGeld | ja | |
RuecklagenAbstimmungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
stichtag | string(date) | ja | Stichtag (INKLUSIV), zu dem abgestimmt wurde. |
abgestimmt | boolean | ja | |
aktivBestand | RuecklagenGeld | ja | |
passivBestand | RuecklagenGeld | ja | |
differenz | RuecklagenGeld | ja | |
jeRuecklage | array<RuecklagenAbstimmungZeile> | ja | |
befunde | array<RuecklagenAbstimmungBefund> | ja | |
RuecklagenAbstimmungZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
aktiv | RuecklagenGeld | ja | |
passiv | RuecklagenGeld | ja | |
differenz | RuecklagenGeld | ja | |
RuecklagenAufloesungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
aufhebungsBeschlussRef | string | ja | Aufhebungsbeschluss (Teilgegenstands-Referenz); ohne ihn 400. |
aufgeloestAm | string(date) | ja | |
RuecklagenAufloesungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | aufgeloest | bereits_ausgefuehrt | ja | bereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Auflösung. |
aufloesungId | string(uuid) | ja | |
ruecklageId | string(uuid) | ja | |
aufgeloestAm | string(date) | ja | |
RuecklagenBuchungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
betragCents | string | ja | Vorzeichenbehaftet in Cent als Ziffern-String: "5000" = Zuführung von 50,00 €, "-5000" = Entnahme von 50,00 €. |
buchungsdatum | string(date) | ja | Buchungstag; der Server liest keine Uhr für ein fehlendes Datum. |
gegenkontoId | string(uuid) | ja | Gegenkonto (gl_accounts.id) am Objekt; nicht Teil des Rücklagenpaars. |
periode | string | null | nein | Nur Zuführung, Format YYYY-MM: dieselbe Periode wird nur EINMAL gebucht (zweite Antwort `bereits_gebucht`). |
zweck | wartung | inspektion | instandsetzung | modernisierende_instandsetzung | bauliche_veraenderung | modernisierung | null | nein | Pflicht bei einer Entnahme, verboten bei Zuführung und Korrektur. |
beschlussGegenstandRef | string | null | nein | Nur Entnahme: tragender Beschluss-Teilgegenstand. |
umwidmungsBeschlussRef | string | null | nein | Nur Entnahme: Pflicht, sobald der Zweck bauliche_veraenderung oder modernisierung ist. |
korrigiertBewegungId | string(uuid) | null | nein | Gesetzt ⇒ diese Bewegung ist die Gegenbewegung zu der genannten. |
RuecklagenBuchungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | gebucht | bereits_gebucht | ja | bereits_gebucht = die Periode war schon gebucht oder derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; es entstand KEIN zweiter Journalsatz. |
bewegungId | string(uuid) | ja | |
kategorie | string | ja | zufuehrung · entnahme · korrektur |
journalEntryId | string(uuid) | ja | |
RuecklagenGeld
| Feld | Typ | Pflicht | Beschreibung |
|---|
cents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | EUR | ja | |
RuecklagenKatalogEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
art | erhaltung | zweckgebunden | ja | erhaltung = Erhaltungsrücklage · zweckgebunden = Rücklage mit Zweckbindung. |
bezeichnung | string | ja | |
zweckbindung | string | null | ja | |
aktivKontoId | string(uuid) | ja | das aktive Bestandskonto (gl_accounts.id) |
passivKontoId | string(uuid) | ja | das passive Rücklagenkonto (gl_accounts.id) |
verteilerschluessel | string | ja | |
unitGroupId | string(uuid) | null | ja | |
kontoinhaberArt | gdwe | verwalter | dritter | ja | |
kontoinhaberName | string | ja | |
istBestand | RuecklagenGeld | null | ja | Ist-Bestand (Summe der Bewegungen bis einschließlich Stichtag); null, wenn kein `stichtag` angefragt wurde — der Server rät keinen. |
aufgeloest | boolean | ja | true, sobald die Rücklage aufgelöst wurde; sie bleibt im Katalog. |
RuecklagenKatalogResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
stichtag | string(date) | null | ja | Echo des angefragten Stichtags (INKLUSIV); null, wenn keiner angefragt wurde. |
ruecklagen | array<RuecklagenKatalogEintrag> | ja | |
RuecklagenRueckfuehrungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
zwischenfinanzierungBewegungId | string(uuid) | ja | |
buchungsdatum | string(date) | ja | |
gegenkontoId | string(uuid) | ja | |
RuecklagenRueckfuehrungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | zurueckgefuehrt | bereits_ausgefuehrt | ja | bereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Bewegung. |
bewegungId | string(uuid) | ja | |
journalEntryId | string(uuid) | ja | |
betrag | RuecklagenGeld | ja | |
RuecklagenSollIstResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
stichtag | string(date) | ja | Echo des Stichtags (INKLUSIV). |
ruecklagen | array<RuecklagenSollIstZeile> | ja | Alle Rücklagen des Objekts, oder genau die angefragte; eine unbekannte oder fremde `ruecklageId` ist ein 404. |
RuecklagenSollIstZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
soll | RuecklagenGeld | ja | |
ist | RuecklagenGeld | ja | |
istVereinnahmt | RuecklagenGeld | ja | |
istKorrekturen | RuecklagenGeld | ja | |
rueckstand | RuecklagenGeld | ja | |
RuecklagenSollRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
beschlussGegenstandRef | string | ja | Kanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>`; ohne sie 400. |
betragCents | string | ja | Soll-Zuführung in Cent als Ziffern-String, > 0 (z. B. "120000" = 1.200,00 €). |
faelligZum | string(date) | ja | |
RuecklagenSollResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | festgelegt | bereits_ausgefuehrt | ja | bereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; das gespeicherte Erstergebnis, nichts neu festgelegt. |
sollZufuehrungId | string(uuid) | ja | |
ruecklageId | string(uuid) | ja | |
beschlussGegenstandRef | string | ja | |
betrag | RuecklagenGeld | ja | |
faelligZum | string(date) | ja | |
RuecklagenWiedervorlage
| Feld | Typ | Pflicht | Beschreibung |
|---|
bewegungId | string(uuid) | ja | |
ruecklageId | string(uuid) | ja | |
faelligAm | string(date) | ja | |
fristMonate | integer | ja | |
betrag | RuecklagenGeld | ja | |
beschlussRef | string | null | ja | Kanonische Beschluss-Referenz; null bei Altbestand ohne Beschluss. |
ueberfaellig | boolean | ja | true, wenn die Fälligkeit VOR `bis` liegt. Auskunft, keine Sperre. |
RuecklagenWiedervorlagenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
bis | string(date) | ja | Echo des Bezugstags für `ueberfaellig`. |
wiedervorlagen | array<RuecklagenWiedervorlage> | ja | |
RuecklagenZinsRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
bruttoCents | string | ja | Bruttozins in Cent als Ziffern-String, > 0; Steuer, Soli und netto werden aufgeteilt. |
buchungsdatum | string(date) | ja | |
zinsKontoId | string(uuid) | ja | Zins-Sachkonto des Objekts, ohne Verteilerschlüssel |
steuerKontoId | string(uuid) | ja | Sachkonto für Kapitalertragsteuer und Solidaritätszuschlag |
RuecklagenZinsResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | gebucht | bereits_gebucht | ja | bereits_gebucht = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Bewegung. |
ruecklageId | string(uuid) | ja | |
journalEntryId | string(uuid) | ja | |
bewegungId | string(uuid) | ja | |
brutto | RuecklagenGeld | ja | |
kapitalertragsteuer | RuecklagenGeld | ja | |
solidaritaetszuschlag | RuecklagenGeld | ja | |
netto | RuecklagenGeld | ja | |
RuecklagenZwischenfinanzierungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
ruecklageId | string(uuid) | ja | |
betragCents | string | ja | Entnommener Betrag in Cent als POSITIVER Ziffern-String. |
entnahmeDatum | string(date) | ja | |
beschlussRef | string | ja | Tragender Beschluss-Teilgegenstand; ohne ihn 400. |
fristMonate | integer | nein | überschreibt die Policy-Frist (Objekt vor Mandant vor 3 Monaten); ganze Zahl ≥ 1 |
gegenkontoId | string(uuid) | null | nein | ohne Angabe geht die Gegenbuchung auf das Bestandskonto der Rücklage |
RuecklagenZwischenfinanzierungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | entnommen | bereits_ausgefuehrt | ja | bereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Bewegung. |
bewegungId | string(uuid) | ja | |
journalEntryId | string(uuid) | ja | |
faelligAm | string(date) | ja | |
fristMonate | integer | ja | |
beschlussRef | string | ja | |
S35aBescheinigung
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
contractNo | string | ja | Vertragsnummer zur Anzeige. |
unitIds | array<string(uuid)> | ja | Einheiten des Vertrags im Lauf, aufsteigend, ohne Dubletten. |
zeitraum | object | ja | Nutzungszeitraum im Abrechnungszeitraum (beide Grenzen einschließlich). |
kategorien | array<S35aBescheinigungKategorie> | ja | Je Kategorie mit Betrag > 0 eine Zeile; Mehrfachbuchungen sind summiert. |
summe | ErgebnisMoney | ja | |
S35aBescheinigungenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
laufId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
period | object | ja | |
bescheinigungen | array<S35aBescheinigung> | ja | |
nichtBescheinigt | array<S35aNichtBescheinigt> | ja | |
summeS35aKosten | ErgebnisMoney | ja | |
summeBescheinigungen | ErgebnisMoney | ja | |
summeNichtBescheinigt | ErgebnisMoney | ja | |
S35aBescheinigungKategorie
| Feld | Typ | Pflicht | Beschreibung |
|---|
kategorie | beschaeftigungsverhaeltnis | haushaltsnah | handwerker | ja | |
betrag | ErgebnisMoney | ja | |
S35aNichtBescheinigt
| Feld | Typ | Pflicht | Beschreibung |
|---|
costItemId | string(uuid) | ja | |
kategorie | beschaeftigungsverhaeltnis | haushaltsnah | handwerker | ja | |
betrag | ErgebnisMoney | ja | |
grund | gesamtausweis | ohne_wohnraum_verteilbasis | ja | |
SaldenlisteKlasse
| Feld | Typ | Pflicht | Beschreibung |
|---|
kontenklasse | string | ja | |
bezeichnung | string | ja | Überschrift der Klasse in der Liste. |
zeilen | array<SaldenlisteZeile> | ja | |
summe | SaldenlisteSumme | ja | |
SaldenlisteResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
zeitraum | SaldenlisteZeitraum | ja | |
klassen | array<SaldenlisteKlasse> | ja | |
summe | SaldenlisteSumme | ja | |
ausgeglichen | boolean | ja | KONTROLLSUMME der Doppik: Σ Soll = Σ Haben. Wird AUSGEWIESEN statt erzwungen — eine Schieflage soll sichtbar sein, nicht die Antwort verhindern. |
nurBewegteKonten | boolean | ja | |
gefilterteKonten | integer | ja | Zahl der wegen fehlender Bewegung NICHT ausgewiesenen Konten — damit die Liste sagen kann, was sie verschweigt. |
SaldenlisteSumme
| Feld | Typ | Pflicht | Beschreibung |
|---|
vortragCents | string | ja | Σ der vorzeichenbehafteten Anfangsbestände. |
sollCents | string | ja | Σ SOLL des Zeitraums (vorzeichenlos). |
habenCents | string | ja | Σ HABEN des Zeitraums (vorzeichenlos). |
saldoCents | string | ja | Σ der vorzeichenbehafteten Endsalden. |
currency | string | ja | |
SaldenlisteZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
glAccountNo | string | ja | Kontonummer am Objekt — nur JE OBJEKT eindeutig. |
name | string | ja | |
kontenklasse | string | ja | Gruppierungsschlüssel (`gl_accounts.kontotyp`, ADR 0014). |
vortragCents | string | ja | ANFANGSBESTAND: Saldo aller Sätze VOR `von`. |
vortragSeite | S | H | ja | |
sollCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
habenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
saldoCents | string | ja | ENDSALDO = Vortrag + Soll − Haben. |
saldoSeite | S | H | ja | |
currency | string | ja | |
bewegungen | integer | ja | Buchungszeilen auf diesem Konto IM Zeitraum. 0 ⇒ keine Bewegung (und genau diese Zeilen entfernt `nurBewegt`). |
SaldenlisteZeitraum
| Feld | Typ | Pflicht | Beschreibung |
|---|
von | string(date) | ja | |
bis | string(date) | ja | |
SchadenfallAbschlussRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
begruendung | string | nein | optional: 1 bis 300 Zeichen |
SchadenfallAbschlussResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
schadenfallId | string(uuid) | ja | |
vonStatus | erfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossen | ja | |
status | abgeschlossen | ja | |
begruendung | string | null | ja | |
bilanz | SchadenfallBilanz | ja | |
befund | unbekannt | ja | |
SchadenfallAnlegenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | Pflicht: das Objekt |
unitId | string(uuid) | nein | |
versicherungsvertragId | string(uuid) | nein | optional: Versicherungsvertrag desselben Objekts |
instandhaltungVorgangId | string(uuid) | nein | optional: Instandhaltungs-Vorgang desselben Objekts |
schadensdatum | string(date) | ja | nicht nach heute |
schadenart | string | ja | Pflicht: 1 bis 60 Zeichen |
beschreibung | string | ja | Pflicht: 10 bis 5000 Zeichen |
SchadenfallBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | meldefrist-verstrichen | schaden-ausserhalb-laufzeit | versicherung-fehlt | erstattung-weicht-ab | ja | |
text | string | ja | |
SchadenfallBilanz
| Feld | Typ | Pflicht | Beschreibung |
|---|
schadenssumme | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
selbstbehaltAnteil | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
erwarteteErstattung | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
erstattet | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
differenz | string | null | ja | erwartet minus erstattet; negativ = mehr erstattet als erwartet |
befund | unbekannt | ja | |
SchadenfallDeckungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
entscheidung | zugesagt | abgelehnt | ja | |
deckungAm | string(date) | ja | nicht nach heute, nicht vor der Meldung |
schadenssumme | SchadenfallGeld | nein | |
selbstbehalt | SchadenfallGeld | nein | |
SchadenfallDeckungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
schadenfallId | string(uuid) | ja | |
nummer | string | ja | |
status | erfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossen | ja | |
selbstbehalt | unbekannt | ja | |
befunde | array<SchadenfallBefund> | ja | |
uebergang | boolean | ja | true, wenn der Status gewechselt hat |
schadenssumme | unbekannt | ja | |
SchadenfallErgebnis
| Feld | Typ | Pflicht | Beschreibung |
|---|
schadenfallId | string(uuid) | ja | |
nummer | string | ja | |
status | erfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossen | ja | |
selbstbehalt | unbekannt | ja | |
befunde | array<SchadenfallBefund> | ja | |
SchadenfallErstattung
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
betrag | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
eingangAm | string(date) | ja | |
buchungsstand | gebucht | vorgeschlagen | ja | |
SchadenfallErstattungRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
bankAccountId | string(uuid) | ja | |
bankTransactionId | string(uuid) | ja | der Eingang der Erstattung; ein Umsatz gehört höchstens einem Schadenfall |
asOf | string(date) | ja | |
bankGlAccountNo | string | ja | |
sachkontoNo | string | ja | |
buchungstext | string | ja | 1 bis 140 Zeichen |
SchadenfallErstattungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
schadenfallId | string(uuid) | ja | |
status | erfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossen | ja | |
erstattung | object | ja | |
bilanz | SchadenfallBilanz | ja | |
vorschlag | object | ja | |
SchadenfallGeld
| Feld | Typ | Pflicht | Beschreibung |
|---|
cents | string | ja | Cent als Integer-STRING, nie eine JSON-Zahl |
currency | EUR | ja | |
SchadenfallHonorar
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorschlag | unbekannt | ja | |
grund | aus | schadenssumme-unbekannt | noch-nicht-reguliert | null | ja | |
automatischAbgerechnet | false | ja | |
hinweis | string | ja | |
SchadenfallHonorarVorschlag
| Feld | Typ | Pflicht | Beschreibung |
|---|
nettoCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
prozentBp | integer | ja | |
grundlage | schadenssumme | ja | |
SchadenfallListenZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
nummer | string | ja | |
status | erfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossen | ja | |
schadensdatum | string(date) | ja | |
schadenart | string | ja | |
propertyId | string(uuid) | ja | |
objekt | string | null | ja | |
schadenssumme | string | null | ja | Schadenssumme in Cent als Integer-STRING; null, wenn unbekannt |
anzahlBefunde | integer | ja | |
SchadenfallListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | |
zeilen | array<SchadenfallListenZeile> | ja | nur Schadenfälle der Objekte, für die der Aufrufer zuständig ist; leer ohne Fälle |
gesamt | integer | ja | |
limit | integer | ja | |
offset | integer | ja | |
SchadenfallMeldenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
gemeldetAm | string(date) | ja | nicht nach heute, nicht vor dem Schadensdatum |
aktenzeichen | string | nein | optional: 1 bis 60 Zeichen |
versicherungsvertragId | string(uuid) | nein | optional: nur, wenn dem Fall noch keine Versicherung zugeordnet ist |
SchadenfallResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | |
schadenfall | SchadenfallStamm | ja | |
versicherungsvertrag | unbekannt | ja | |
instandhaltungVorgang | unbekannt | ja | |
befunde | array<SchadenfallBefund> | ja | |
bilanz | SchadenfallBilanz | ja | |
erstattungen | array<SchadenfallErstattung> | ja | |
honorar | SchadenfallHonorar | ja | |
SchadenfallStamm
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
nummer | string | ja | |
status | erfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossen | ja | |
statusSeit | string(date-time) | ja | |
propertyId | string(uuid) | ja | |
objekt | string | null | ja | |
unitId | string(uuid) | null | ja | |
schadensdatum | string(date) | ja | |
schadenart | string | ja | |
beschreibungVorhanden | boolean | ja | |
gemeldetAm | string(date) | null | ja | |
versichererAktenzeichenVorhanden | boolean | ja | |
deckungAm | string(date) | null | ja | |
selbstbehalt | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
schadenssumme | string | null | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
abschlussBegruendungVorhanden | boolean | ja | |
SchadenfallVersicherungsvertrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
bezeichnung | string | ja | |
partner | FremdvertragPartner | ja | |
SchadenfallVorgangVerweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
nummer | string | ja | |
status | string | ja | |
SevAnfangsbestandRequest
Übernimmt den Saldo des Eigentümer-Verrechnungskontos aus dem Altbestand — GENAU EINE Buchung im Geldkreis Sondereigentum je Mandat. Ein zweiter aktiver Anfangsbestand ⇒ 409; Korrektur über Storno und neue Erfassung.
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | Übernahmestichtag YYYY-MM-DD — wird das Buchungsdatum der Anfangsbestands-Buchung. Ein Tag in der Zukunft ⇒ 400. |
betragCents | string | ja | Der übernommene Saldo aus Sicht des EIGENTÜMERS in ganzen Cents als vorzeichenbehafteter Ziffern-String (nie eine JSON-number): positiv = Guthaben des Eigentümers, negativ = der Eigentümer schuldet. "0" ⇒ 400. |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
SevAnfangsbestandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
entryId | string(uuid) | ja | der geschriebene Buchungssatz (journal_entries.id) |
mandatId | string(uuid) | ja | |
glAccountId | string(uuid) | ja | das Verrechnungskonto (gl_accounts.id) |
art | anfangsbestand | ja | die SEV-Buchungsart des Satzes |
buchungsdatum | string(date) | ja | |
betragCents | string | ja | der Bestand aus Sicht des Eigentümers, vorzeichenbehafteter Cent-String |
currency | EUR | ja | |
SevAuszahlungStellenRequest
Stellt die Auszahlungen des Monats: je Mandat der Entnahme-Satz auf dem Verrechnungskonto und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des Eigentümers. Idempotent je Mandat und Monat. Betrag und Empfänger kommen nie aus der Eingabe.
| Feld | Typ | Pflicht | Beschreibung |
|---|
monat | string | ja | der Auszahlungsmonat im Format JJJJ-MM |
vorschlagHash | string | ja | der `vorschlagHash` des GESEHENEN Vorschlags (GET); weicht die frische Rechnung ab ⇒ 409, nichts geschrieben |
objektBankkontoId | string(uuid) | ja | das abgehende Bankkonto des Objekts (bank_accounts.id) |
requestedExecutionDate | string(date) | ja | Ausführungstag der Zahlungsaufträge — explizit, nie implizit „heute" |
SevAuszahlungStellenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monat | string | ja | der Auszahlungsmonat im Format JJJJ-MM |
auszahlungen | array<object> | ja | |
uebersprungen | array<object> | ja | |
SevAuszahlungVorschlagResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monat | string | ja | der Auszahlungsmonat im Format JJJJ-MM |
stichtag | string(date) | ja | der Monatsletzte |
vorschlagHash | string | ja | sha256-Hex über genau diesen Inhalt; POST bestätigt ihn |
auszahlungen | array<object> | ja | |
uebersprungen | array<object> | ja | |
SevBetrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
stand | bekannt | offen | nicht-verfuegbar | ja | bekannt = es gibt einen Betrag; offen = die Quelle steht, hat für diesen Monat aber noch keinen Wert; nicht-verfuegbar = die Quelle ist noch nicht gebaut. |
cents | string | null | ja | Betrag in Cent als Integer-STRING — und `null`, sobald `stand` nicht `bekannt` ist. Ausdrücklich NIE `"0"` für einen unbekannten Wert: eine Geldanzeige, die „nicht gemessen" und „null Euro" zusammenfallen lässt, meldet einen ausgeglichenen Eigentümer, wo niemand nachgesehen hat. |
text | string | ja | Anzeigetext — „1.234,56 €", „nicht verfügbar" oder „noch nicht gelaufen". |
grund | string | null | ja | Warum kein Betrag dasteht; `null`, wenn einer dasteht. |
SevEigentuemerabrechnungBlock
Ein Block der Abrechnung (Einnahmen, Ausgaben oder Auszahlungen).
| Feld | Typ | Pflicht | Beschreibung |
|---|
positionen | array<SevEigentuemerabrechnungPosition> | null | ja | je Buchungsart mit mindestens einer Buchung im Zeitraum eine Position, in der Ordnung des Buchungsvokabulars; null NUR beim ausgeblendeten Auszahlungsblock (mitAuszahlung=false) |
summeCents | string | ja | Σ der Positionen in ganzen Cents, exakt — steht auch bei ausgeblendeten Positionen |
SevEigentuemerabrechnungEmpfaenger
Der Empfänger der Abrechnung — der Eigentümer mit der Zustellanweisung seiner Eigentümerzeile.
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | der Eigentümer des Mandats (persons.id) |
anrede | string | ja | die Briefanrede (persons.contact.briefanrede, sonst der Vorschlag aus Anrede und Name); nie leer |
name | string | ja | der Personenname des Eigentümers — die Zustellanweisung ersetzt den Briefkasten, nie den Empfänger; nie leer |
anschrift | array<string> | ja | die Anschriftzeilen: mit Zustellanweisung die abweichende Adresse (samt Empfängername), sonst Straße Hausnummer, PLZ Ort, Land aus persons.contact; nie leer |
SevEigentuemerabrechnungPosition
EINE Position eines Blocks — alle Buchungen EINER Art im Zeitraum.
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | mietgutschrift | mehrerloes_garantiemiete | mietzuschuss | garantiegeber | sonstige_einnahme | verwalterverguetung | hausgeld_an_weg | zufuehrung_sonderruecklage | entnahme_an_eigentuemer | sonstige_ausgabe | entnahme_sonderruecklage | ertragsumbuchung_abgang | ertragsumbuchung_zugang | ja | die SEV-Buchungsart der Position (jede außer anfangsbestand — der steht im Geldbestand); ertragsumbuchung_abgang/_zugang = Umbuchung von Mieterträgen zwischen altem und neuem Eigentümer (#5228) |
gruppe | miete | umlagen | sonstige_einnahmen | umlagefaehige_kosten | instandhaltung | verwaltung | sonstige_werbungskosten | kaution | durchlaufend | ruecklage | eigentuemer | ja | die Kostengruppe der Art — dieselbe Gruppierung wie die Einnahmen-Überschuss-Aufstellung |
betragCents | string | ja | Betrag in der Richtung des Blocks in ganzen Cents (Einnahme = Σ Saldowirkung, Ausgabe/Auszahlung = −Σ Saldowirkung); ein Storno mindert ihn |
anzahlBuchungen | integer | ja | Anzahl der Buchungen dieser Art im Zeitraum (Stornos zählen mit) |
SevEigentuemerabrechnungResponse
Jahresabrechnung der Sondereigentumsverwaltung für den Eigentümer über einen Zeitraum: Einnahmen, Ausgaben und Auszahlungen je Buchungsart, Mieteinnahmen (Soll, Ist, Ausfall, Ertrag je m²), Kosten der Wohnung und die Entwicklung des Geldbestands mit Probe gegen das Verrechnungskonto.
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
zeitraum | object | ja | der abgerechnete Zeitraum nach Buchungsdatum, beide Grenzen inklusiv |
mitAuszahlung | boolean | ja | false = die Positionen des Auszahlungsblocks sind ausgeblendet (Summe und Geldbestand zählen sie trotzdem) |
currency | EUR | ja | |
empfaenger | SevEigentuemerabrechnungEmpfaenger | ja | |
einnahmen | SevEigentuemerabrechnungBlock | ja | |
ausgaben | SevEigentuemerabrechnungBlock | ja | |
auszahlungen | SevEigentuemerabrechnungBlock | ja | |
miete | object | ja | Mieteinnahmen: Soll, Ist, Ausfall und Mietertrag je m² |
kosten | object | ja | Kosten der Wohnung: Hausgeld und Verwaltervergütung, aufgeteilt in „auf den Mieter umlegbar" und „bleibt beim Eigentümer" |
geldbestand | object | ja | die Entwicklung des Geldbestands — die Probe als Felder |
sonderruecklage | object | nein | der Block „Sonderrücklage des Eigentümers": Anfangsbestand, Zuführungen, Entnahmen je Anlass und Endbestand mit eigener Probe gegen den Saldo der Rücklage — Geld des Eigentümers, nie die Erhaltungsrücklage der Gemeinschaft. Fehlt, wenn das Mandat keine Sonderrücklage-Regel hat und die Rücklage im oder vor dem Zeitraum keine Bewegung hatte. |
SevEigentuemerwechselBefundeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monat | string | ja | der geprüfte Monat im Format JJJJ-MM |
befunde | array<object> | ja | |
SevErtragsumbuchungBuchenRequest
Bucht Mieterträge eines Zeitraums vom Mandat im Pfad (alter Eigentümer) auf das Mandat `nachMandatId` (neuer Eigentümer) um — als eigene Buchungsart mit Beleg, beide Seiten in EINER Transaktion.
| Feld | Typ | Pflicht | Beschreibung |
|---|
nachMandatId | string(uuid) | ja | das EMPFANGENDE Mandat (neuer Eigentümer derselben Wohnung); das abgebende steht im Pfad |
zeitraum | object | ja | |
betragCents | string | ja | Betrag in ganzen Cents als Ganzzahl-String > 0 — höchstens die im Zeitraum gutgeschriebene, noch nicht umgebuchte Miete |
beleg | object | ja | |
SevErtragsumbuchungBuchenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
umbuchungId | string(uuid) | ja | |
vonMandatId | string(uuid) | ja | |
nachMandatId | string(uuid) | ja | |
abgangEntryId | string(uuid) | ja | der Satz ertragsumbuchung_abgang auf dem Verrechnungskonto des abgebenden Mandats |
zugangEntryId | string(uuid) | ja | der Satz ertragsumbuchung_zugang auf dem Verrechnungskonto des empfangenden Mandats |
betragCents | string | ja | der umgebuchte Betrag in ganzen Cents |
zeitraum | object | ja | |
beleg | object | ja | |
SevErtragsumbuchungListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
umbuchungen | array<object> | ja | |
SevGarantieAbstimmlisteResponse
Abstimmliste der Garantiemieten eines Objekts: garantierte gegen erzielte Miete je Wohnung, die Differenz, die Gutschrift an den Eigentümer und die Belastung des Garantiegebers — gerechnet aus dem Bestand, unabhängig davon, ob die Gutschrift schon vorgelegt oder freigegeben ist.
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monate | array<string> | ja | der abgefragte Zeitraum: lückenlose Monatsfolge in Kalenderfolge |
zeilen | array<SevGarantieAbstimmZeile> | ja | je Mandat MIT Garantie, das im Zeitraum wirkt, eine Zeile — aufsteigend nach unitNo |
summen | object | ja | Σ der Zeilen je Spalte, centgenau |
nichtBemessbar | array<object> | ja | Garantiemandate, die im Zeitraum nicht bemessen werden konnten, mit Grund — nicht in zeilen und nicht in den Summen; aufsteigend nach unitNo |
SevGarantieAbstimmZeile
EIN Mandat (eine Wohnung) mit Garantie über den Zeitraum — nur die Monate, in denen das Mandat wirkt.
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
unitNo | string | ja | die Wohnungsbezeichnung (units.unit_no) |
art | garantiemiete | mindestmiete | ja | garantiemiete = Gutschrift ist der Garantiebetrag; mindestmiete = Gutschrift ist max(erzielte Miete, Mindestbetrag) |
basis | kalt | warm | ja | kalt oder warm — welche erzielte Miete dem Betrag gegenübersteht |
garantiegeberPersonId | string(uuid) | ja | der Garantiegeber (persons.id) |
garantiertCents | string | ja | Σ der zugesicherten Beträge (Garantie- bzw. Mindestbetrag je Monat) in ganzen Cents |
erzieltCents | string | ja | Σ der erzielten Miete (Ist, nach Buchungsperiode, auf der Basis der Garantie) in ganzen Cents |
differenzCents | string | ja | erzielt − garantiert in ganzen Cents (vorzeichenbehaftet) |
gutschriftCents | string | ja | Σ dessen, was dem Eigentümer zusteht, in ganzen Cents |
belastungGarantiegeberCents | string | ja | gutschrift − erzielt in ganzen Cents — positiv: der Garantiegeber zahlt; negativ: er erhält den Mehrerlös |
SevHausgeldBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
hausgeldCents | string | ja | Summe der zu zahlenden Posten in ganzen Cents |
guthabenCents | string | ja | Saldo des Verrechnungskontos in ganzen Cents (darf negativ sein) |
fehlbetragCents | string | ja | Hausgeld − max(Guthaben, 0) in ganzen Cents |
regel | einziehen | nicht_zahlen | aus_sonderruecklage | ja | Regel bei Unterdeckung: einziehen (Forderung an den Eigentümer), nicht_zahlen (OP bleibt offen) oder aus_sonderruecklage |
entnahmeSonderruecklageCents | string | ja | aus der Sonderrücklage entnommen (nur aus_sonderruecklage), sonst "0" |
restFehlbetragCents | string | ja | was beim Eigentümer offen bleibt |
SevHausgeldPosten
| Feld | Typ | Pflicht | Beschreibung |
|---|
sollstellungId | string(uuid) | null | ja | die Hausgeld-Sollstellung (hausgeld_sollstellungen.id); null bei Hausgeld-Quelle festbetrag |
monat | string | ja | JJJJ-MM |
art | hausgeld | sonderumlage | ja | hausgeld oder sonderumlage |
offenCents | string | ja | der offene Betrag in ganzen Cents (Ziffern-String) |
grund | sonderumlage_nicht_vereinbart | nein | nur an einem AUSGESCHLOSSENEN Posten: Sonderumlage ohne Vereinbarung mit_sonderumlage |
SevHausgeldUebersprungen
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
grund | kein_mietinkasso | hausgeld_selbstzahler | verguetung_ausstehend | ja | kein_mietinkasso · hausgeld_selbstzahler (Hausgeld-Quelle keine) · verguetung_ausstehend (erst die Vergütung des Monats buchen) |
SevHausgeldVorschlagResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monat | string | ja | der Monat im Format JJJJ-MM |
zeilen | array<SevHausgeldZeile> | ja | je betrachtetem, nicht übersprungenem Mandat eine Zeile, nach Einheit sortiert |
befunde | array<SevHausgeldBefund> | ja | jede Unterdeckung (Einheit, Betrag, Regel) |
uebersprungen | array<SevHausgeldUebersprungen> | ja | |
vorschlagHash | string | ja | sha256-Hex über genau diesen Inhalt; POST bestätigt ihn |
currency | EUR | ja | |
SevHausgeldZahlenRequest
Der Monatslauf eines Objekts nach der Mietgutschrift in zwei Runden über diese eine Route: Runde 1 bestätigt die Vergütungen (`verguetungen`) und liefert den Hausgeld-Vorschlag NACH der Vergütung; Runde 2 bestätigt dessen Hash (`vorschlagHash`), zahlt das Hausgeld (Belastung des Verrechnungskontos, Art hausgeld_an_weg; Ausgleich der Hausgeld-Sollstellung bzw. Ausgabe an den Kreditor) und führt danach der Sonderrücklage zu. Mindestens eines der beiden Felder ist Pflicht (sonst 400).
| Feld | Typ | Pflicht | Beschreibung |
|---|
monat | string | ja | der Monat im Format JJJJ-MM |
vorschlagHash | string | nein | Runde 2: der `vorschlagHash` des GESEHENEN Hausgeld-Vorschlags (GET bzw. `hausgeldVorschlag` aus Runde 1); weicht die frische Rechnung ab ⇒ 409, nichts bezahlt |
verguetungen | array<SevMonatslaufVerguetungBestaetigung> | nein | Runde 1: die gesehenen Vergütungsvorschläge, höchstens ein Eintrag je Mandat — eindeutig ist das Feld `mandatId` (`x-unique-by`), nicht das ganze Objekt: zwei Einträge mit derselben mandatId (auch mit verschiedenen Hashes) ⇒ 400; alle Hashes werden vor der ersten Buchung geprüft |
SevHausgeldZahlung
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
zahlungsweg | op_ausgleich | kreditor | ja | |
belastungCents | string | ja | |
entryId | string(uuid) | ja | der Belastungssatz (journal_entries.id, Art hausgeld_an_weg) |
entnahmeEntryId | string(uuid) | null | ja | der Entnahme-Satz aus der Sonderrücklage — oder null |
ausgeglichen | array<string(uuid)> | ja | die ausgeglichenen Sollstellungen (bei kreditor leer) |
SevHausgeldZahlungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monat | string | ja | der Monat im Format JJJJ-MM |
zahlungen | array<SevHausgeldZahlung> | ja | je Mandat mit Belastung > 0 genau eine Zahlung; leer, solange das Hausgeld nicht bezahlt ist |
befunde | array<SevHausgeldBefund> | ja | |
uebersprungen | array<SevHausgeldUebersprungen> | ja | |
hausgeldStatus | bezahlt | nicht_bestaetigt | neu_zu_bestaetigen | ja | bezahlt = Runde 2 hat gezahlt; nicht_bestaetigt = Runde 1 ohne Hausgeld-Hash — `hausgeldVorschlag` ist zu bestätigen |
hausgeldVorschlag | SevHausgeldVorschlagResponse | null | ja | der Hausgeld-Vorschlag NACH der Vergütung samt `vorschlagHash` (ihn bestätigt Runde 2); null nach der Zahlung |
verguetungen | array<SevVerguetungBuchungResponse> | ja | je in diesem Aufruf bestätigtem Mandat das Ergebnis der Vergütungsbuchung (Netto, USt, Brutto als Ganzzahl-Strings), nach Mandat sortiert |
sonderruecklage | array<SevMonatslaufSonderruecklage> | ja | je Mandat, dem nach dem Hausgeld zugeführt wurde, das Ergebnis; nach Mandat sortiert |
sonderruecklageBefunde | array<SevMonatslaufZufuehrungAusgesetzt> | ja | je Mandat ohne Zuführung ein Befund `zufuehrung_ausgesetzt` mit Grund — nie still |
currency | EUR | ja | |
SevHausgeldZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
quelle | weg_soll | festbetrag | ja | |
zahlungsweg | op_ausgleich | kreditor | ja | op_ausgleich = Ausgleich der Hausgeld-Sollstellung · kreditor = Ausgabe an die fremd verwaltete WEG |
posten | array<SevHausgeldPosten> | ja | die zu zahlenden Posten |
ausgeschlossen | array<SevHausgeldPosten> | ja | offen, aber nicht zu zahlen (Sonderumlage ohne Vereinbarung) — mit grund |
fall | nichts_offen | gedeckt | unterdeckung | ja | |
hausgeldCents | string | ja | |
guthabenCents | string | ja | |
belastungCents | string | ja | was dem Verrechnungskonto belastet würde |
regel | einziehen | nicht_zahlen | aus_sonderruecklage | ja | Regel bei Unterdeckung: einziehen (Forderung an den Eigentümer), nicht_zahlen (OP bleibt offen) oder aus_sonderruecklage |
befund | unbekannt | ja | |
SevMandat
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitId | string(uuid) | ja | |
personId | string(uuid) | ja | Die auftraggebende Eigentümerperson (persons.id). |
validFrom | string(date) | null | ja | Beginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit. |
validTo | string(date) | null | ja | Ende EXKLUSIV; null ⇒ laufend. „Zum 30.06. beendet" steht hier als 2025-07-01. |
validRange | string | ja | Rohes daterange-Literal, z. B. [2025-01-01,). |
active | boolean | ja | Ist das Mandat am Stichtag wirksam (valid_range @> stichtag)? |
mitMietinkasso | boolean | ja | UMFANG: zieht der Verwalter auch die Miete ein? false ⇒ Betreuung/Vermietung ja, Mieteinzug nein (dann ist mietgutschriftBasis zwingend "keine"). |
mietgutschriftBasis | ist | soll | festbetrag | keine | ja | ist = vereinnahmte Miete · soll = geschuldete Miete · festbetrag = Garantiemiete/Pauschale · keine = keine Mietgutschrift (Umfang ohne Mietinkasso). |
mietgutschriftFestbetragCents | string | null | ja | |
verguetungVermietet | SevVerguetungsregel | ja | |
verguetungLeerstand | SevVerguetungsregel | ja | |
hausgeldQuelle | weg_soll | festbetrag | keine | ja | weg_soll = aus der Hausgeld-Sollstellung dieser Einheit · festbetrag = vereinbarter Betrag (nötig, wenn casa die WEG-Seite nicht führt) · keine = der Eigentümer zahlt selbst. |
hausgeldFestbetragCents | string | null | ja | |
sonderruecklageRegel | prozent_mietgutschrift | festbetrag | keine | ja | |
sonderruecklageProzentSkaliert | string | null | ja | |
sonderruecklageBetragCents | string | null | ja | |
auszahlungRhythmus | monatlich | quartalsweise | halbjaehrlich | jaehrlich | auf_abruf | ja | |
sockelbetragCents | string | ja | Untergrenze, die auf dem Eigentümer-Konto stehen bleibt statt ausgezahlt zu werden, in ganzen Cents als Ziffern-String. "0" = kein Sockel (eine getroffene Entscheidung). |
currency | EUR | ja | Währung ALLER Beträge dieses Mandats — geschlossen auf EUR (Geldkern). |
eigentuemerBankkontoId | string(uuid) | null | ja | Privatkonto des Eigentümers als person_bank_accounts.id — bewusst eine REFERENZ und keine IBAN: dort hängt das Vier-Augen-Gate der Bankverbindung. null = keins hinterlegt. |
garantieArt | keine | garantiemiete | mindestmiete | ja | Mietgarantie: keine (auch jedes Mandat von vor der Garantie), garantiemiete (Gutschrift = Garantiebetrag) oder mindestmiete (Gutschrift = max(erzielte Miete, Mindestbetrag)). |
garantieBetragCents | string | null | ja | Garantie- bzw. Mindestbetrag JE MONAT als Ziffern-String in ganzen Cents; null bei garantieArt keine. |
garantieBasis | kalt | warm | null | ja | kalt oder warm — welche erzielte Miete dem Betrag gegenübersteht; null bei garantieArt keine. |
garantiegeberPersonId | string(uuid) | null | ja | Der Garantiegeber (persons.id); null bei garantieArt keine. |
SevMandatAnlegenRequest
Legt die Sondereigentumsverwaltung als Zeitabschnitt an. Nur in einem Objekt der Verwaltungsart "pro" möglich; Überschneidungen mit einem bestehenden Mandat DERSELBEN Wohnung ⇒ 400.
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | Die auftraggebende Eigentümerperson. Sie muss im GESAMTEN Mandatszeitraum Eigentümerin der Einheit sein (unit_ownerships). |
validFrom | string(date) | ja | Beginn der Gültigkeit (INKLUSIV) — das „ab" der Vereinbarung. |
validTo | string(date) | nein | optionales Ende (EXKLUSIV); ohne Angabe laufend |
mitMietinkasso | boolean | ja | UMFANG — Pflicht, kein Default. Nachträglich NICHT änderbar: der Wechsel ist ein NEUER Zeitabschnitt (beenden + neu anlegen). |
mietgutschriftBasis | ist | soll | festbetrag | keine | ja | |
mietgutschriftFestbetragCents | string | null | nein | |
verguetungVermietet | SevVerguetungsregelInput | ja | |
verguetungLeerstand | SevVerguetungsregelInput | ja | |
hausgeldQuelle | weg_soll | festbetrag | keine | ja | |
hausgeldFestbetragCents | string | null | nein | |
sonderruecklageRegel | prozent_mietgutschrift | festbetrag | keine | ja | |
sonderruecklageProzentSkaliert | string | null | nein | |
sonderruecklageBetragCents | string | null | nein | |
sonderruecklageHoechstbetragCents | string | null | nein | Höchststand der Sonderrücklage in ganzen Cents (Ziffern-String): steht ihr Saldo darauf, wird nichts mehr zugeführt. Ohne Angabe/null = ohne Höchststand. Nur bei sonderruecklageRegel ≠ keine. |
auszahlungRhythmus | monatlich | quartalsweise | halbjaehrlich | jaehrlich | auf_abruf | ja | |
sockelbetragCents | string | ja | Ziffern-String in ganzen Cents; "0" = kein Sockel. |
eigentuemerBankkontoId | string(uuid) | null | nein | Pflicht, sobald es eine Mietgutschrift gibt (mietgutschriftBasis ≠ keine); muss DER auftraggebenden Person gehören. |
currency | EUR | nein | Ohne Angabe EUR; andere Währungen kennt der Geldkern nicht. |
hausgeldUnterdeckung | einziehen | nicht_zahlen | aus_sonderruecklage | nein | Regel bei Unterdeckung des Hausgelds: einziehen, nicht_zahlen (Vorgabe) oder aus_sonderruecklage. |
hausgeldSonderumlage | ohne_sonderumlage | mit_sonderumlage | nein | Sonderumlagen aus der Miete nur bei mit_sonderumlage; Vorgabe ohne_sonderumlage (Known Issue 258695). |
garantieArt | keine | garantiemiete | mindestmiete | nein | Mietgarantie: keine (Vorgabe), garantiemiete (Gutschrift = Garantiebetrag) oder mindestmiete (Gutschrift = max(erzielte Miete, Mindestbetrag)). Nur mit Mietinkasso und mietgutschriftBasis ist. |
garantieBetragCents | string | null | nein | Garantie- bzw. Mindestbetrag JE MONAT als Ziffern-String in ganzen Cents (> 0); nur bei garantieArt ≠ keine. |
garantieBasis | kalt | warm | null | nein | kalt oder warm — welche erzielte Miete dem Betrag gegenübersteht; nur bei garantieArt ≠ keine. |
garantiegeberPersonId | string(uuid) | null | nein | Der Garantiegeber (eine Person DIESES Mandanten, nicht der Eigentümer); nur bei garantieArt ≠ keine. Unbekannt oder fremder Mandant ⇒ 404. |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
SevMandatAnlegenResponse
Identität und Zeitabschnitt der angelegten Vereinbarung. Die vollständigen Vertragswerte liest GET /api/einheit/{id}/sev-mandat.
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitId | string(uuid) | ja | |
personId | string(uuid) | ja | |
validFrom | string(date) | ja | |
validTo | string(date) | null | ja | |
validRange | string | ja | |
mitMietinkasso | boolean | ja | |
SevMandatBeendenRequest
Beendet den Zeitabschnitt durch KÜRZUNG (nicht durch Löschen — eine abgerechnete Periode bleibt erklärbar). Beenden kürzt nur: ein Ende nach einem bestehenden Ende ⇒ 400, ein Ende am Beginntag ⇒ 400.
| Feld | Typ | Pflicht | Beschreibung |
|---|
endeExklusiv | string(date) | ja | Der erste Tag OHNE Sondereigentumsverwaltung (EXKLUSIVE obere Grenze). „Zum 30.06. beendet" ⇒ 2025-07-01. |
SevMandatBeendenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
unitId | string(uuid) | ja | |
personId | string(uuid) | ja | |
validFrom | string(date) | null | ja | |
validTo | string(date) | ja | das gesetzte Ende (EXKLUSIV) |
validRange | string | ja | |
beendet | boolean | ja | false ⇒ das Mandat endete bereits GENAU an diesem Tag; es wurde nichts geändert (No-op-Erfolg statt Fehler). |
SevMandatHistorieResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
stichtag | string(date) | ja | der Stichtag, gegen den `active` je Mandat gemessen wurde |
mandate | array<SevMandat> | ja | Alle Zeitabschnitte, nach Beginn geordnet. Aufeinanderfolgende Abschnitte sind der Weg „mit Mietinkasso → ohne". |
SevMandatResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
stichtag | string(date) | ja | der wirksame Stichtag, gegen den aufgelöst wurde |
mandat | unbekannt | ja | |
SevMieterKostenposition
| Feld | Typ | Pflicht | Beschreibung |
|---|
sevRechnungId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
rechnungsdatum | string(date) | ja | |
kreditor | string | ja | |
rechnungsnummer | string | ja | |
kostenart | string | ja | |
betragCents | string | ja | Rechnungsbetrag, Cents |
currency | EUR | ja | |
SevMieterKostenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
von | string(date) | ja | Beginn des Zeitraums (inklusiv) |
bis | string(date) | ja | Ende des Zeitraums (inklusiv) |
positionen | array<SevMieterKostenposition> | ja | |
SevMietgutschriftAblehnungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorlageId | string(uuid) | ja | |
mandatId | string(uuid) | ja | |
monate | array<string> | ja | die Monate, deren Reservierung gelöst wurde |
SevMietgutschriftFreigabeRequest
Gibt einen Mietgutschrift-Vorschlag frei: je Monat mit Anteil eine Buchung (Art Mietgutschrift) auf dem Verrechnungskonto.
| Feld | Typ | Pflicht | Beschreibung |
|---|
inhaltsHash | string | ja | der `inhaltsHash` des GESEHENEN Vorschlags; weicht er ab ⇒ 409, nichts gebucht |
SevMietgutschriftFreigabeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorlageId | string(uuid) | ja | |
mandatId | string(uuid) | ja | |
betragCents | string | ja | der gebuchte Betrag in ganzen Cents |
buchungen | array<object> | ja | |
SevMietgutschriftLaufRequest
Legt die Mietgutschriften der SEV-Mandate des Objekts für die Periode als Vorschläge vor — Σ der Einzelmonate, idempotent je Mandat und Monat. Verweigert sich mit dem fehlenden Schritt, solange die Miet-Sollstellung eines Monats nicht abgeschlossen ist.
| Feld | Typ | Pflicht | Beschreibung |
|---|
monate | array<string> | ja | die Periode: ein Monat (monatlich) oder mehrere lückenlose Monate (z. B. ein Quartal), höchstens zwölf |
SevMietgutschriftLaufResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
monate | array<string> | ja | |
text | string | ja | der Buchungstext der Periode, z. B. „Mietgutschrift März 2025" |
gutschriften | array<object> | ja | |
uebersprungen | array<object> | ja | |
rueckbelastungen | array<object> | ja | |
SevMonatslaufSonderruecklage
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
status | gebucht | keine_zufuehrung | replay | ja | gebucht = dieser Lauf hat zugeführt; keine_zufuehrung = die Regel ergibt nichts; replay = der Monat lief bereits |
grund | zugefuehrt | keine_regel | hoechststand_erreicht | betrag_null | ja | |
zugefuehrtCents | string | ja | der zugeführte Betrag in Cent als Ganzzahl-String ("0" ohne Zuführung) |
SevMonatslaufVerguetungBestaetigung
eine bestätigte Vergütung: das Mandat und der Hash des gesehenen Vergütungsvorschlags
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
vorschlagHash | string | ja | der `vorschlagHash` des GESEHENEN Vergütungsvorschlags (`GET /api/sev-mandat/{id}/verguetung`); weicht er ab ⇒ 409, keine Vergütung gebucht |
SevMonatslaufZufuehrungAusgesetzt
| Feld | Typ | Pflicht | Beschreibung |
|---|
befund | zufuehrung_ausgesetzt | ja | |
mandatId | string(uuid) | ja | |
grund | hausgeld_nicht_bezahlt | hausgeld_unterdeckung | verguetung_ausstehend | mietgutschrift_fehlt | deckung_fehlt | ja | |
SevMonatsstandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objekt | string | ja | Anzeigename des Objekts — keine Kennung (die UUID kennt der Aufrufer, er hat sie gefragt). |
monat | string | ja | Der angefragte Monat als `JJJJ-MM` (Echo). |
monatText | string | ja | Derselbe Monat als Anzeigetext („Oktober 2026"). |
wohnungen | array<SevWohnungStand> | ja | Je SEV-Mandat eine Zeile, in der Ordnung der Quelle. LEER, solange die SEV-Kette (#5216–#5223) nicht gebaut ist — dann steht der Grund in `hinweise` und `vollstaendig` ist `false`. Eine leere Liste ist hier NIE die Aussage „dieses Objekt hat keine Sondereigentumsverwaltung". |
hinweise | array<string> | ja | Grundsätzliche, kundentaugliche Hinweise zum ganzen Objekt. |
vollstaendig | boolean | ja | `false`, sobald IRGENDEIN Wert oder Schritt nicht verfügbar ist — die eine Angabe, an der ein Aufrufer erkennt, dass die Auskunft unvollständig ist. |
SevNaechsterSchritt
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | schritt | nicht-ermittelbar | keiner | ja | schritt = dieser Schritt ist als Nächstes fällig; nicht-ermittelbar = die Pflicht-Reihenfolge stösst auf einen Schritt, dessen Quelle fehlt (weder er noch der danach darf genannt werden); keiner = der Monat ist durch. |
schritt | mietgutschrift | verguetung | hausgeld | sonderruecklage | auszahlung | null | ja | Der Schritt; `null` bei `nicht-ermittelbar` und `keiner`. |
bezeichnung | string | null | ja | Seine kundentaugliche Bezeichnung; `null` wie oben. |
text | string | ja | Der Satz, der dem Verwalter angezeigt wird. |
SevRechnung
| Feld | Typ | Pflicht | Beschreibung |
|---|
sevRechnungId | string(uuid) | ja | |
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
rechnungsdatum | string(date) | ja | |
kreditor | string | ja | |
rechnungsnummer | string | ja | |
betragCents | string | ja | Rechnungsbetrag, Cents |
kostenart | string | ja | |
umlagefaehig | boolean | ja | |
status | bezahlt | nicht_bezahlt | storniert | ja | |
entryId | string(uuid) | null | ja | |
documentId | string(uuid) | null | ja | |
befund | unbekannt | ja | |
currency | EUR | ja | |
SevRechnungBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
massnahme | einziehen | nicht_zahlen | sonderruecklage | ja | |
fehlbetragCents | string | ja | Fehlbetrag in Cents (Betrag − Guthaben). |
entnahmeSonderruecklageCents | string | ja | aus der Sonderrücklage entnommen, Cents |
restFehlbetragCents | string | ja | beim Eigentümer offen, Cents |
SevRechnungBuchenRequest
Gibt eine Rechnung des Sondereigentums zur Zahlung aus der Miete des Eigentümers frei: Belastung des Verrechnungskontos, Kennzeichen Kostenart + umlagefähig. Nie in der Abrechnung der Gemeinschaft.
| Feld | Typ | Pflicht | Beschreibung |
|---|
rechnungsdatum | string(date) | ja | Rechnungsdatum YYYY-MM-DD — Stichtag der Mieterabrechnung. |
zahlungsdatum | string(date) | nein | Buchungsdatum der Belastung; Vorgabe: das Rechnungsdatum. Zukunft ⇒ 400. |
betragCents | string | ja | Rechnungsbetrag brutto in ganzen Cents als positiver Ziffern-String (nie eine JSON-number). |
kreditor | string | ja | Der Rechnungssteller (Handwerker, Dienstleister). |
rechnungsnummer | string | ja | Rechnungsnummer des Kreditors — mit dem Kreditor der Schlüssel der Rechnung je Mandat. |
kostenart | string | ja | Kostenart-Schlüssel (BetrKV-Katalog oder Sonderschlüssel). |
umlagefaehig | boolean | ja | Auf den Mieter der Wohnung umlagefähig? |
beiUnterdeckung | einziehen | nicht_zahlen | sonderruecklage | nein | Entscheid bei fehlender Deckung; ohne ihn ⇒ 400. |
documentId | string(uuid) | null | nein | Optionaler Bezug auf die Eingangsrechnung im Posteingang (documents.id). |
SevRechnungBuchenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ergebnis | gebucht | nicht_bezahlt | unveraendert | ja | |
sevRechnungId | string(uuid) | ja | |
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | die Einheit des Mandats (der Kostenträger) |
entryId | string(uuid) | null | ja | der Satz auf dem Verrechnungskonto; null bei nicht_bezahlt |
betragCents | string | ja | Rechnungsbetrag, Cents |
belastetCents | string | ja | dem Verrechnungskonto belastet, Cents ("0" bei nicht_bezahlt) |
kostenart | string | ja | |
umlagefaehig | boolean | ja | |
befund | unbekannt | ja | |
currency | EUR | ja | |
SevRechnungListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
rechnungen | array<SevRechnung> | ja | |
SevSchlussauszahlungStellenRequest
Stellt die Schlussauszahlung nach dem Mandatsende: der Entnahme-Satz über den GANZEN Saldo (ohne Sockel) und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des bisherigen Eigentümers. Betrag und Empfänger kommen nie aus der Eingabe.
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorschlagHash | string | ja | der `vorschlagHash` des GESEHENEN Vorschlags (GET); weicht die frische Rechnung ab ⇒ 409, nichts geschrieben |
objektBankkontoId | string(uuid) | ja | das abgehende Bankkonto des Objekts (bank_accounts.id) |
requestedExecutionDate | string(date) | ja | Ausführungstag des Zahlungsauftrags — explizit, nie implizit „heute" |
SevSchlussauszahlungStellenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
betragCents | string | ja | der ausgezahlte Betrag (der ganze Saldo) in ganzen Cents |
entryId | string(uuid) | ja | der Entnahme-Satz auf dem Verrechnungskonto (journal_entries.id) |
paymentOrderId | string(uuid) | ja | der Zahlungsauftrag (awaiting-approval) — Freigabe über die bestehende Zahlungsfreigabe |
paymentOrderContentHash | string | ja | Inhalts-Hash des Zahlungsauftrags; die Freigabe bestätigt ihn |
SevSchlussauszahlungVorschlagResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
unitId | string(uuid) | ja | |
personId | string(uuid) | ja | der bisherige Eigentümer (Person des Mandats), der das Geld bekommt |
endeExklusiv | string(date) | ja | Ende des Mandats (exklusiv) |
stichtag | string(date) | ja | der letzte Tag des Mandats — Stichtag der offenen Posten |
saldoCents | string | ja | Saldo des Verrechnungskontos über alle Buchungen in ganzen Cents |
sockelCents | string | ja | der vereinbarte Sockelbetrag — nur ausgewiesen, er wird beim Mandatsende NICHT einbehalten |
betragCents | string | ja | was hinausgeht: der ganze Saldo, oder "0" wenn gesperrt |
auszahlbar | boolean | ja | |
grund | offene_posten | kein_ueberschuss | null | ja | offene_posten = ein Hausgeld-Posten aus dem Mandatszeitraum ist offen; kein_ueberschuss = der Saldo ist ≤ 0; null = auszahlbar |
offenePosten | array<object> | ja | bei offene_posten die sperrenden Posten, ältester zuerst; sonst leer |
empfaengerIban | string | ja | die IBAN des Privatkontos des bisherigen Eigentümers aus dem Mandat — der Empfänger des Zahlungsauftrags |
vorschlagHash | string | ja | sha256-Hex über genau diesen Inhalt; POST bestätigt ihn |
SevSchritt
| Feld | Typ | Pflicht | Beschreibung |
|---|
schritt | mietgutschrift | verguetung | hausgeld | sonderruecklage | auszahlung | ja | Der Schritt — in der PFLICHT-REIHENFOLGE aus UC-SEV-001. |
bezeichnung | string | ja | Kundentaugliche Bezeichnung des Schritts (keine interne Kennung). |
stand | erledigt | offen | nicht-verfuegbar | ja | erledigt | offen | nicht-verfuegbar. `nicht-verfuegbar` heisst: die Quelle dieses Schritts ist noch nicht gebaut — ausdrücklich NICHT „erledigt". |
text | string | ja | Der Satz, der dem Verwalter angezeigt wird. |
hinweis | string | null | ja | Zusatz zum Schritt; `null`, wenn keiner vorliegt. |
SevSonderruecklageSaldoResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
stichtag | string(date) | ja | der Stichtag (INKLUSIV), zu dem summiert wurde |
saldoCents | string | ja | Bestand der Sonderrücklage des Eigentümers als Cent-String ("0" ohne Bewegungen), nie negativ. Geld des Eigentümers, aber NICHT Teil des Saldos des Verrechnungskontos und nicht der Rücklage der Gemeinschaft. |
hoechstbetragCents | string | null | ja | vereinbarter Höchststand als Cent-String; null = ohne Höchststand (nicht 0 — 0 hiesse „nie zuführen"). |
currency | EUR | ja | |
SevUnterdeckung
| Feld | Typ | Pflicht | Beschreibung |
|---|
bezeichnung | string | ja | Wofür die Deckung fehlt, kundentauglich (z. B. „Hausgeld Oktober"). |
wohnung | string | ja | Die Wohnung, zu der die Unterdeckung gehört — an JEDER Zeile, damit sie aus dem Zusammenhang gerissen (Export, Mail) noch stimmt. |
betragCents | string | ja | Der fehlende Betrag in Cent als Integer-STRING. |
betragText | string | ja | Derselbe Betrag als deutscher Anzeigetext („245,00 €"). |
text | string | ja | Der vollständige Satz: Betrag, Anlass und Wohnung. |
SevVerguetungBuchenRequest
Bucht die Verwaltervergütung eines Monats: Belastung des Verrechnungskontos (Art Verwaltervergütung), Ertrag beim Verwalter, USt getrennt. Genau einmal je Mandat und Monat.
| Feld | Typ | Pflicht | Beschreibung |
|---|
monat | string | ja | der Monat im Format JJJJ-MM |
vorschlagHash | string | ja | der `vorschlagHash` des GESEHENEN Vorschlags (GET); weicht die frische Rechnung ab ⇒ 409, nichts gebucht |
SevVerguetungBuchungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ergebnis | gebucht | unveraendert | keine_verguetung | ja | gebucht = neuer Satz; unveraendert = derselbe Satz war schon gebucht; keine_verguetung = Netto 0, nichts gebucht |
mandatId | string(uuid) | ja | |
monat | string | ja | der Monat im Format JJJJ-MM |
entryId | string(uuid) | null | ja | der Vergütungssatz (journal_entries.id); null bei keine_verguetung |
glAccountId | string(uuid) | ja | das belastete Verrechnungskonto (gl_accounts.id) |
ertragGlAccountId | string(uuid) | null | ja | das Ertragskonto des Verwalters; null bei keine_verguetung |
nettoCents | string | ja | |
ustSatzProzent | string | ja | |
umsatzsteuerCents | string | ja | |
bruttoCents | string | ja | |
buchungsdatum | string(date) | null | ja | der Monatsletzte; null bei keine_verguetung |
currency | EUR | ja | |
SevVerguetungsregel
Art + GENAU EINE Angabe dazu. Der Leerstand hat seine eigene Regel: dort gibt es keine Miete, auf die ein Prozentsatz anwendbar wäre.
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | prozent | festbetrag | keine | ja | prozent | festbetrag | keine (geschlossen). "keine" heisst NICHT VEREINBART — wer 0 € vereinbart hat, wählt festbetrag mit 0. |
prozentSkaliert | string | null | ja | Prozentsatz in SEV_PROZENT_SKALA als ZIFFERN-STRING (1 % = "10000"); null ausserhalb von art=prozent. |
betragCents | string | null | ja | Monats-Festbetrag in ganzen Cents als ZIFFERN-STRING; null ausserhalb von art=festbetrag. |
Vergütungsregel; genau eine Angabe je Art (die Kopplung prüft der Tool-Layer und der DB-CHECK).
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | prozent | festbetrag | keine | ja | |
prozentSkaliert | string | null | nein | Pflicht bei art=prozent, sonst verboten. Ziffern-String in SEV_PROZENT_SKALA. |
betragCents | string | null | nein | Pflicht bei art=festbetrag, sonst verboten. Ziffern-String in ganzen Cents. |
SevVerguetungVorschlagResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
monat | string | ja | der Monat im Format JJJJ-MM |
fall | vermietet | leerstand | ja | vermietet = die Einheit ist am Monatsletzten belegt; sonst gilt die Leerstandsregel |
art | prozent | festbetrag | keine | ja | die Art der angewandten Regel (prozent | festbetrag | keine) |
bemessung | ist | soll | ja | ist = Mietgutschrift des Monats, soll = Soll-Miete der Einheit im Monat |
basisMieteCents | string | ja | die verwendete Bemessungsgrundlage in ganzen Cents (Ziffern-String) |
nettoCents | string | ja | Vergütung netto in ganzen Cents (nach Mindest-/Höchstbetrag) |
ustSatzProzent | string | ja | USt-Satz in ganzen Prozent ("0" = ohne USt) |
umsatzsteuerCents | string | ja | die getrennt ausgewiesene Umsatzsteuer in ganzen Cents |
bruttoCents | string | ja | die Belastung des Verrechnungskontos in ganzen Cents (netto + USt) |
mindestbetragGegriffen | boolean | ja | |
hoechstbetragGegriffen | boolean | ja | |
bereitsGebucht | object | null | ja | der für den Monat bereits gebuchte, nicht stornierte Vergütungssatz — oder null |
vorschlagHash | string | ja | sha256-Hex über genau diesen Inhalt; POST bestätigt ihn |
currency | EUR | ja | |
SevVerrechnungskontoSaldoResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
mandatId | string(uuid) | ja | |
glAccountId | string(uuid) | ja | das Verrechnungskonto (gl_accounts.id) |
stichtag | string(date) | ja | der Stichtag (INKLUSIV), zu dem summiert wurde |
saldoCents | string | ja | Saldo aus Sicht des Eigentümers als vorzeichenbehafteter Cent-String ("0" ohne Buchungen): positiv = Guthaben des Eigentümers. |
currency | EUR | ja | |
SevWohnungStand
| Feld | Typ | Pflicht | Beschreibung |
|---|
wohnung | string | ja | Bezeichnung der Wohnung — keine UUID, keine interne Kennung (Abnahme 4 von #5229). |
eigentuemer | string | ja | Name des Eigentümers — keine UUID, keine interne Kennung. |
schritte | array<SevSchritt> | ja | ALLE Schritte in der Pflicht-Reihenfolge, nie gefiltert — eine Liste ohne einen Schritt sähe aus wie eine Kette ohne ihn. |
saldo | unbekannt | ja | |
sockel | unbekannt | ja | |
sonderruecklage | unbekannt | ja | |
unterdeckungenStand | bekannt | offen | nicht-verfuegbar | ja | `bekannt` mit LEERER Liste heisst „geprüft, keine" — eine andere Aussage als „nicht nachgesehen" und deshalb ein eigener Stand. |
unterdeckungen | array<SevUnterdeckung> | ja | |
unterdeckungenText | string | ja | Zusammenfassung der Unterdeckungen als Anzeigetext. |
naechsterSchritt | SevNaechsterSchritt | ja | |
SollstellungBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
klasse | string | ja | |
contractId | string(uuid) | ja | |
contractNo | string | null | ja | |
periodeVon | string(date) | null | ja | |
periodeBis | string(date) | null | ja | |
meldung | string | ja | |
SollstellungFreigabeEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
approvalId | string(uuid) | ja | |
proposalId | string(uuid) | ja | |
version | integer | ja | |
contentHash | string | ja | |
SollstellungFreigabeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
decision | approved | ja | |
count | integer | ja | |
approvals | array<SollstellungFreigabeEintrag> | ja | |
SollstellungslaufStartResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
sollstellungslaufId | string(uuid) | ja | |
status | geplant | ja | |
vorschlaege | object | ja | |
uebersprungen | integer | ja | |
uebergangen | boolean | ja | true, wenn offene Readiness-Befunde MIT Begründung übergangen wurden (auditiert). |
SollstellungVorschlaegeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
sollstellungslaufId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
stichtag | string(date) | ja | |
status | string | ja | |
uebergangen | boolean | ja | true, wenn der Start nur durch ein auditiertes Übergehen zustande kam. |
vorschlaege | array<SollstellungVorschlag> | ja | |
befunde | array<SollstellungBefund> | ja | |
SollstellungVorschlag
| Feld | Typ | Pflicht | Beschreibung |
|---|
proposalId | string(uuid) | ja | GENAU die id, die `POST /api/sollstellung/freigabe` in `proposalIds` erwartet. |
version | integer | ja | Fassung des Vorschlags — nach einer Korrektur die NEUE (die Kette ist aufgelöst). |
bindungId | string(uuid) | ja | Die Planungs-Bindung dahinter — der Gegenstand einer Herausnahme aus dem Lauf. |
art | neu | storno | ersatz | ja | |
contractId | string(uuid) | ja | |
contractNo | string | null | ja | Vertragsnummer zur Anzeige; null, falls nicht auflösbar. |
periodeVon | string(date) | ja | |
periodeBis | string(date) | ja | |
faelligAm | string(date) | ja | |
betragCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | string | ja | |
ampel | string | ja | Aus dem Lauf gelesen, hier nie gerechnet. ALL-GREEN: ein nicht-grüner Vorschlag lässt die Freigabe scheitern. |
entschieden | boolean | ja | Liegt bereits eine Entscheidung (Freigabe/Ablehnung) vor? Sagt NICHT, ob sie den aktuellen Stand noch bindet. |
bindetAktuellenStand | boolean | ja | true ⇔ die Entscheidung hängt an der AKTUELLEN Fassung. false bei „noch offen" UND bei „durch Korrektur ungültig". |
SonderumlageAnlegenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
beschlussGegenstandRef | string | ja | Kanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>`; ohne sie 400. |
zweck | string | ja | Zweck laut Beschluss (Pflichtinhalt). |
faelligkeit | string(date) | ja | Fälligkeit; bei Raten der Termin der ersten Rate. |
zahlweise | einmalzahlung | raten | ja | |
ratenFaelligkeiten | array<string(date)> | nein | Pflicht bei `raten`, verboten bei `einmalzahlung`. |
betragCents | string | ja | Gesamtbetrag in Cent als Ziffern-String, > 0 (z. B. "1200000" = 12.000,00 €). |
zufuehrungsSchluessel | string | nein | Vorgabe: mea (Miteigentumsanteil). |
entnahmeSchluessel | string | null | nein | |
abweichungsBeschlussRef | string | null | nein | Beschluss, der einen abweichenden Entnahmeschlüssel trägt. |
SonderumlageAnlegenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | angelegt | bereits_ausgefuehrt | ja | bereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; das gespeicherte Erstergebnis, nichts neu angelegt. |
sonderumlageId | string(uuid) | ja | |
sonderkontoId | string(uuid) | ja | |
sonderkontoNummer | string | ja | |
beschlussGegenstandRef | string | ja | |
betrag | RuecklagenGeld | ja | |
raten | array<SonderumlageRate> | ja | |
warnungen | array<SonderumlageGapWarnung> | ja | |
SonderumlageGapWarnung
| Feld | Typ | Pflicht | Beschreibung |
|---|
klasse | zufuehrung_entnahme_schluessel_weichen_ab | ja | |
zufuehrungsSchluessel | string | ja | |
entnahmeSchluessel | string | ja | |
beschlussRefFehlt | boolean | ja | |
meldung | string | ja | |
SonderumlageListenEintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
sonderumlageId | string(uuid) | ja | |
zweck | string | ja | |
betrag | RuecklagenGeld | ja | |
zahlweise | einmalzahlung | raten | ja | |
faelligkeit | string(date) | ja | Bei Raten die Fälligkeit der ersten Rate. |
faelligkeiten | array<string(date)> | ja | Alle Raten-Fälligkeiten aufsteigend; leer ohne Raten. |
gestellt | boolean | ja | true, sobald das Soll gestellt ist (Lauf vorhanden). |
zufuehrungsSchluessel | string | ja | |
entnahmeSchluessel | string | null | ja | |
schluesselAbweichung | boolean | ja | Tatsache, keine Warnung: beide Schlüssel gesetzt und verschieden. |
SonderumlageListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
sonderumlagen | array<SonderumlageListenEintrag> | ja | |
SonderumlageRate
| Feld | Typ | Pflicht | Beschreibung |
|---|
nr | integer | ja | |
faelligkeit | string(date) | ja | |
SonderumlageSollEinheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
gesamtanteil | RuecklagenGeld | ja | |
summe | RuecklagenGeld | ja | |
zeilen | array<SonderumlageSollZeile> | ja | |
SonderumlageSollResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
sonderumlageId | string(uuid) | ja | |
gesamtsumme | RuecklagenGeld | ja | |
einheiten | array<SonderumlageSollEinheit> | ja | |
SonderumlageSollSchuldner
| Feld | Typ | Pflicht | Beschreibung |
|---|
ownershipId | string(uuid) | ja | |
personId | string(uuid) | ja | |
anteil | string | ja | Innenverhältnis in Zehntausendsteln als Ziffern-String — KEIN Geld. |
SonderumlageSollStellenEinheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitId | string(uuid) | ja | |
gesamtanteil | RuecklagenGeld | ja | |
raten | array<SonderumlageSollStellenRate> | ja | |
SonderumlageSollStellenRate
| Feld | Typ | Pflicht | Beschreibung |
|---|
nr | integer | ja | |
faelligkeit | string(date) | ja | |
betrag | RuecklagenGeld | ja | |
SonderumlageSollStellenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
sonderumlageId | string(uuid) | ja | |
laufTyp | sonderzufuehrung | umbuchung_abrechnungsspitze | nein | Vorgabe sonderzufuehrung; umbuchung_abrechnungsspitze ist (noch) nicht verdrahtet und ergibt 409. |
abweichungsBeschlussRef | string | null | nein | |
SonderumlageSollStellenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | ausgefuehrt | bereits_ausgefuehrt | ja | bereits_ausgefuehrt = das Soll stand schon (oder derselbe Idempotenz-Schlüssel wurde wiederholt); es wurde nichts neu gestellt. |
laufId | string(uuid) | ja | |
schluessel | string | ja | |
warnungen | array<SonderumlageGapWarnung> | ja | |
einheiten | array<SonderumlageSollStellenEinheit> | ja | |
SonderumlageSollZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
sollstellungId | string(uuid) | ja | |
rateNr | integer | ja | |
faelligkeit | string(date) | ja | |
betrag | RuecklagenGeld | ja | |
schuldner | array<SonderumlageSollSchuldner> | ja | |
StaffelmieteListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | der verwendete Stichtag (Vorgabe: heute, Server-Uhr) |
zeilen | array<StaffelmieteListeZeile> | ja | nur Verträge der Objekte, für die der Aufrufer zuständig ist; aufsteigend nach Objekt und Vertragsnummer |
StaffelmieteListeZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
contractNo | string | ja | |
propertyId | string(uuid) | ja | |
currency | string | null | ja | |
aktuell | unbekannt | ja | |
vorher | unbekannt | ja | |
differenzCents | string | null | ja | aktuell − vorher in Cent (vorzeichenbehaftet); null ohne Vorgänger oder bei Währungswechsel |
naechste | unbekannt | ja | |
herkunft | anlage | konditionswechsel | ja | anlage ⇒ die aktuelle Stufe entstand im Anlage-Kommando des Vertrags; sonst konditionswechsel |
StaffelmieteStufe
| Feld | Typ | Pflicht | Beschreibung |
|---|
kaltmieteCents | string | ja | Kaltmiete der Stufe in Cent |
currency | string | null | ja | Währung dieser Stufe (je Stufe geführt; Wechsel der Währung ist ein Stufenwechsel) |
gueltigAb | string(date) | null | ja | Gültigkeitsbeginn der Stufe; null ⇒ ohne untere Grenze (von Anfang an) |
StarteZeitRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
taetigkeitsart | telefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstiges | ja | |
bezugArt | objekt | anliegen | sonderleistung | nein | |
bezugId | string(uuid) | null | nein | |
notiz | string | null | nein | |
StorniereZeitRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
grund | string | ja | |
UebernahmeAbrechnungenListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
laeufe | array<UebernahmeAbrechnungLauf> | ja | Neueste zuerst. Ein fremdes oder unbekanntes Objekt liefert eine LEERE Liste (kein Existenz-Orakel). |
UebernahmeAbrechnungEroeffnungsbuchung
| Feld | Typ | Pflicht | Beschreibung |
|---|
sourceKey | string | ja | Quellschlüssel der Zeile (`bk-bestand:<Lauf-Id>:<Vertrags-Id>`), Grundlage der Wiederholungssicherheit. |
journalEntryId | string(uuid) | ja | |
accrualDate | string(date) | ja | |
bruttoCents | string | ja | Integer-STRING in Cent, signiert. |
replay | boolean | ja | true ⇔ der Posten existierte schon (Wiederholung), es wurde nichts neu gebucht. |
UebernahmeAbrechnungLauf
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
periodFrom | string(date) | ja | |
periodTo | string(date) | ja | |
status | string | ja | Status des Laufs; ein übernommener Lauf ist `festgeschrieben`. |
herkunft | string | null | ja | `uebernahme` = als Bestand übernommen (nicht gerechnet); `null` = eigener, in casa.ai gerechneter Lauf. |
uebernommen | boolean | ja | true ⇔ herkunft = `uebernahme`. Ein übernommener Lauf kennt keine § 35a-Bescheinigung und keinen Einwand (409). |
createdAt | string(date-time) | ja | |
UebernahmeAbrechnungUebernommenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
laufId | string(uuid) | ja | |
periodFrom | string(date) | ja | |
periodTo | string(date) | ja | |
status | festgeschrieben | ja | |
herkunft | uebernahme | ja | |
uebernahmestichtag | string(date) | ja | |
bindingContentHash | string | ja | SHA-256 (hex) über den Snapshot aller übergebenen Werte (das Siegel). |
anzahlVertraege | integer | ja | |
anzahlEroeffnungsposten | integer | ja | |
eroeffnung | object | null | ja | null, wenn kein Vertrag als „offen" gekennzeichnet war (nichts über die Migrationsnaht gebucht). |
UebernahmeAbrechnungVorschauPosten
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
art | sollstellung | gutschrift | ja | |
nominalCents | string | ja | Integer-STRING in Cent, signiert. |
originalFaelligkeit | string(date) | ja | |
UebernahmeAbrechnungVorschauResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
pruefung | true | ja | |
geschrieben | false | ja | |
propertyId | string(uuid) | ja | |
periodFrom | string(date) | ja | |
periodTo | string(date) | ja | |
uebernahmestichtag | string(date) | ja | |
bindingContentHash | string | ja | SHA-256 (hex) über den Snapshot aller übergebenen Werte — derselbe, den die Übernahme siegelt. |
anzahlVertraege | integer | ja | |
summeNachzahlungCents | string | ja | Integer-STRING in Cent; Summe der Ergebnisse > 0. |
summeGuthabenCents | string | ja | Integer-STRING in Cent (negativ); Summe der Ergebnisse < 0. |
eroeffnungsposten | array<UebernahmeAbrechnungVorschauPosten> | ja | |
UmlageArchiveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archivedAt | string(date-time) | ja | |
alreadyArchived | boolean | ja | |
UmlageResult
| Feld | Typ | Pflicht | Beschreibung |
|---|
lines | array<UmlageResultLine> | ja | |
totalUmlagefaehig | ErgebnisMoney | ja | |
totalVerteiltNetto | ErgebnisMoney | ja | |
skippedNichtUmlagefaehig | array<string> | ja | ids der NICHT verteilten Positionen — ohne sie wäre „Σ verteilt < Σ gebucht" nicht erklärbar. |
UmlageResultLine
| Feld | Typ | Pflicht | Beschreibung |
|---|
costItemId | string(uuid) | ja | |
recipient | ErgebnisRecipient | ja | |
from | string(date) | ja | |
to | string(date) | ja | |
netto | ErgebnisMoney | ja | |
ustRatePercent | string | null | ja | USt-Satz in ganzen Prozent als Integer-STRING oder null (Wohnraum hat KEINEN Satz — das ist etwas anderes als 0 %). |
ustAmount | unbekannt | ja | |
brutto | ErgebnisMoney | ja | |
Umlageschluessel
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
unitGroupId | string(uuid) | null | ja | Abrechnungskreis-Scope; null ⇒ objektweit |
keyType | string | ja | Grundtyp (OFFENES Vokabular): festbetrag | flaeche | personen_zeit | verbrauch | extern | … |
name | string | ja | |
config | object | ja | strukturierter JSON-Wert (leeres Objekt zulässig) |
archivedAt | string(date-time) | null | ja | null ⇒ aktiv |
createdAt | string(date-time) | ja | |
keyNo | integer | null | ja | Nummer des Schlüssels im Objekt (#5551, allocation_keys.key_no) — je Objekt eindeutig (DB-UNIQUE); null ⇒ noch nicht vergeben |
UmlageschluesselCreateRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
keyType | string | ja | festbetrag | flaeche | personen_zeit | verbrauch | extern | … (offenes Vokabular) |
name | string | ja | |
config | object | nein | strukturierter JSON-Wert (leer zulässig) |
unitGroupId | string(uuid) | nein | optionaler Abrechnungskreis-Scope schon bei der Anlage (muss zum selben Objekt gehören) |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
UmlageschluesselListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
umlageschluessel | array<Umlageschluessel> | ja | |
UmlageschluesselScopeRequest
Setzt (unitGroupId) oder löst (null) den Abrechnungskreis-Scope. Der Kreis muss zum selben Objekt wie der Schlüssel gehören.
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitGroupId | string(uuid) | null | ja | Ziel-Abrechnungskreis oder null (objektweit) |
UmlageschluesselScopeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
unitGroupId | string(uuid) | null | ja | |
UmlageschluesselUpdateRequest
Mindestens ein Feld muss gesetzt sein (leerer Patch ⇒ 400). Der Scope wird NICHT hier gesetzt (⇒ /scope).
| Feld | Typ | Pflicht | Beschreibung |
|---|
keyType | string | nein | |
name | string | nein | |
config | object | nein | |
UmlaufEroeffnenRequest
Eröffnet den Umlauf einer Versammlung der Art umlauf (Status entwurf, genau ein Beschluss-TOP): legt je Eigentümer-Person eine Rücklaufzeile an. Allstimmigkeit ist der Default. versammlungId steht im Pfad, im Body ist es ein Fehler.
| Feld | Typ | Pflicht | Beschreibung |
|---|
fristEnde | string(date) | ja | Ende der Antwortfrist; nicht vor dem Eröffnungstag. Keine Ausschlussfrist: Antworten bis zur Feststellung zählen. |
mehrheitsregel | allstimmig | mehrheit_abgegebene | nein | allstimmig (Default: alle Eigentümer in Textform, § 23 Abs. 3 S. 1 WEG) | mehrheit_abgegebene (§ 23 Abs. 3 S. 2 WEG) |
absenkungBeschlussId | string(uuid) | nein | Pflicht bei mehrheit_abgegebene: der vorher gefasste, tragende Beschluss (angenommen oder bestandskraeftig); ob er sich auf diesen Gegenstand bezieht, prüft das System nicht |
stimmgewichte | array<object> | nein | Eingegebenes Stimmgewicht je Eigentümer-Person (Köpfe: 1, mea: Zehntausendstel, objekt: Zahl der Einheiten) |
UmlaufEroeffnetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
versammlungId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
mehrheitsregel | string | ja | allstimmig | mehrheit_abgegebene |
fristEnde | string(date) | ja | |
eroeffnetAm | string(date) | ja | |
absenkungBeschlussId | string(uuid) | null | ja | |
stimmprinzip | string | ja | koepfe | mea | objekt — das Stimmprinzip der Versammlung |
anzahlRuecklaeufe | integer | ja | Zahl der angelegten Rücklaufzeilen (eine je Eigentümer-Person) |
hinweise | array<VersammlungHinweis> | ja | frist-kurz | gegenstandsbezug-nicht-geprueft |
UmlaufFeststellenRequest
Stellt das Ergebnis des Umlaufs fest (einmalig): friert die Zählung ein und schreibt das Ergebnis in den TOP. Leerer Body {}. Feststellbar, sobald alle geantwortet haben (Allstimmigkeit: auch bei einem Nein) oder das Fristende vorbei ist; ein nicht zustande gekommener Umlauf geht als abgelehnt in die Sammlung.
| Feld | Typ | Pflicht | Beschreibung |
|---|
UmlaufFeststellungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
versammlungId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
feststellung | string | ja | angenommen | abgelehnt | nicht_zustande_gekommen |
festgestelltAm | string(date-time) | ja | |
topErgebnis | string | ja | angenommen | abgelehnt — wie im Beschluss-TOP (nicht zustande gekommen ⇒ abgelehnt) |
topId | string(uuid) | ja | |
versammlungsdatum | string(date) | ja | Datum der Beschlussfassung |
zaehlung | UmlaufZaehlung | ja | |
hinweise | array<VersammlungHinweis> | ja | |
UmlaufRuecklaufRequest
Erfasst die Antwort EINER Person; eine spätere Antwort überschreibt die frühere, solange nicht festgestellt ist. Eine Antwort nach dem Fristende wird gespeichert (Hinweis nach-fristablauf). versammlungId steht im Pfad.
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | Die Eigentümer-Person auf der Rücklaufliste |
antwort | ja | nein | enthaltung | ja | |
eingegangenAm | string(date) | ja | Eingangsdatum der Antwort; nicht vor der Eröffnung, nicht in der Zukunft |
eingangskanal | portal | email | post | sonstiges | ja | |
textformBestaetigt | boolean | nein | Zustimmung (ja) gilt nur in Textform; Vorgabe false |
notiz | string | nein | Freitext der Verwaltung |
UmlaufRuecklaufResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
versammlungId | string(uuid) | ja | |
personId | string(uuid) | ja | |
antwort | string | ja | ja | nein | enthaltung |
eingegangenAm | string(date) | ja | |
eingangskanal | string | ja | portal | email | post | sonstiges |
textformBestaetigt | boolean | ja | |
vorherigeAntwort | string | null | ja | die überschriebene Antwort; null bei der ersten Antwort |
hinweise | array<VersammlungHinweis> | ja | nach-fristablauf: die Frist ist keine Ausschlussfrist |
zaehlung | UmlaufZwischenstand | ja | |
UmlaufRuecklaufZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
name | string | ja | Anzeigename der Eigentümer-Person |
stimmgewicht | string | ja | Stimmgewicht als Integer-String |
antwort | string | null | ja | ja | nein | enthaltung; null ⇒ noch keine Antwort |
eingegangenAm | string(date) | null | ja | |
eingangskanal | string | null | ja | portal | email | post | sonstiges |
textformBestaetigt | boolean | ja | |
notiz | string | null | ja | Freitext der Erfassung; null ⇒ keine Notiz |
UmlaufStandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
vorgang | UmlaufVorgang | ja | |
ruecklauf | array<UmlaufRuecklaufZeile> | ja | nach Name |
zaehlung | UmlaufZaehlung | ja | |
fristAbgelaufen | boolean | ja | |
feststellbar | boolean | ja | wahr, wenn die Feststellung jetzt möglich ist |
ausstehend | array<string(uuid)> | ja | Personen ohne Antwort |
UmlaufVerkuendenRequest
Verkündet den festgestellten Umlauf (einmalig) und hält Mitteilungsdatum und -form fest. Ohne Verkündung gibt es keinen Beschluss in der Sammlung. Auch ein nicht zustande gekommener Umlauf wird verkündet.
| Feld | Typ | Pflicht | Beschreibung |
|---|
verkuendetAm | string(date) | ja | Datum der Verkündung; nicht vor dem Versammlungsdatum, nicht in der Zukunft |
mitteilungForm | textform | brief | ja | Form der Mitteilung an die Eigentümer |
UmlaufVerkuendungResponse
Typ: unbekannt
UmlaufVorgang
| Feld | Typ | Pflicht | Beschreibung |
|---|
versammlungId | string(uuid) | ja | |
mehrheitsregel | string | ja | allstimmig | mehrheit_abgegebene |
fristEnde | string(date) | ja | |
absenkungBeschlussId | string(uuid) | null | ja | |
eroeffnetAm | string(date) | ja | |
festgestelltAm | string(date-time) | null | ja | |
feststellung | string | null | ja | angenommen | abgelehnt | nicht_zustande_gekommen; null ⇒ noch nicht festgestellt |
mitteilungAm | string(date) | null | ja | |
mitteilungForm | string | null | ja | textform | brief |
UmlaufZaehlung
Typ: unbekannt
UmlaufZwischenstand
| Feld | Typ | Pflicht | Beschreibung |
|---|
stimmenJa | integer | ja | |
stimmenNein | integer | ja | |
stimmenEnthaltung | integer | ja | |
anteileJa | string | ja | Summe der Stimmgewichte als Integer-String |
anteileNein | string | ja | Summe der Stimmgewichte als Integer-String |
anteileEnthaltung | string | ja | Summe der Stimmgewichte als Integer-String |
ausstehend | array<string(uuid)> | ja | Personen ohne Antwort |
fristAbgelaufen | boolean | ja | |
feststellbar | boolean | ja | |
UstListeBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | steuerschluessel_fehlt | satz_weicht_vom_konto_ab | ja | |
kontoNr | string | ja | |
kontoBezeichnung | string | ja | |
seite | ausgang | eingang | ja | |
satzProzent | string | null | ja | Gebuchter Satz; null bei fehlendem Steuerschlüssel. |
kontoSatzProzent | string | null | ja | Satz am Konto (Stammdatum); null, wenn dort nicht gepflegt. |
bruttoCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
zeilen | array<string> | ja | Kennungen der betroffenen Buchungszeilen. |
hinweis | string | ja | |
UstListeKontoSeite
| Feld | Typ | Pflicht | Beschreibung |
|---|
kontoNr | string | ja | |
kontoBezeichnung | string | ja | |
seite | ausgang | eingang | ja | |
herkunft | vorgabe | deklariert | abgeleitet | ja | |
UstListePeriode
| Feld | Typ | Pflicht | Beschreibung |
|---|
von | string(date) | ja | |
bis | string(date) | ja | |
label | string | ja | Beschriftung: "2024-03" (Monat), "2024-Q1" (Quartal), "2024" (Jahr). |
umsatzsteuerCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
vorsteuerCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
zahllastCents | string | ja | umsatzsteuer − vorsteuer; negativ = Erstattungsanspruch. |
saetze | array<UstListeSatzSumme> | ja | |
UstListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
von | string(date) | ja | |
bis | string(date) | ja | |
rhythmus | monat | quartal | jahr | ja | |
umsatzsteuerpflichtig | boolean | ja | false ⇒ leere Liste; `hinweis` sagt warum. |
hinweis | string | null | ja | "keine umsatzsteuerpflichtigen Umsätze" bei leerer Liste, sonst null. |
umsatzsteuerCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
vorsteuerCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
zahllastCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
perioden | array<UstListePeriode> | ja | |
befunde | array<UstListeBefund> | ja | |
zeilen | array<UstListeZeile> | null | ja | Detail je Konto und Satz — null, wenn nicht angefordert (`jeKonto`); [] = angefordert und leer. |
kontoSeiten | array<UstListeKontoSeite> | ja | Wie die Seite jedes beteiligten Kontos aufgelöst wurde. |
UstListeSatzSumme
| Feld | Typ | Pflicht | Beschreibung |
|---|
seite | ausgang | eingang | ja | |
satzProzent | string | ja | USt-Satz in ganzen Prozent als String, z. B. "19". |
nettoCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
ustCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
bruttoCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
UstListeZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
kontoNr | string | ja | |
kontoBezeichnung | string | ja | |
seite | ausgang | eingang | ja | |
satzProzent | string | ja | USt-Satz in ganzen Prozent als String, z. B. "19". |
sollBruttoCents | string | ja | Σ SOLL der Zeilen dieser Zelle, vorzeichenlos. |
habenBruttoCents | string | ja | Σ HABEN der Zeilen dieser Zelle, vorzeichenlos. |
bruttoCents | string | ja | Seitenrichtiges Brutto (ausgang: Haben−Soll, eingang: Soll−Haben) — kann negativ sein. |
nettoCents | string | ja | Bemessungsgrundlage (Entgelt). |
ustCents | string | ja | brutto − netto: Umsatzsteuer (ausgang) bzw. abziehbare Vorsteuer (eingang). |
buchungen | integer | ja | Anzahl der eingeflossenen Buchungszeilen. |
VermoegensberichtAblageRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | Der Stichtag des Berichts, `YYYY-MM-DD`. |
idempotenzSchluessel | string | ja | Der Ausschluss gegen den Doppel-Dispatch. Kommt vom AUFRUFER (BP §8), nie aus einer Uhr — sonst wäre ein Retry ein zweiter Stand. |
auftrag | object | ja | Die Bestände, aus denen der Rechenkern den Bericht bildet — Form: Fachkern. OHNE `scope`. |
VermoegensberichtAblageResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
standId | string(uuid) | ja | |
standNr | integer | ja | |
schluessel | string | ja | |
stichtag | string(date) | ja | |
konsistent | boolean | ja | ABGELEITET aus den Befunden des Kerns, nie neu entschieden. |
readinessBefunde | array<VermoegensberichtReadinessBefund> | ja | |
konsistenzBefunde | array<VermoegensberichtKonsistenzBefund> | ja | |
VermoegensberichtKonsistenzBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
regel | string | ja | ruecklage_bericht_gegen_konto · ruecklage_aktiv_gegen_passiv · forderung_/verbindlichkeit_gegen_jahresabrechnung. |
position | string | ja | DIE BENANNTE Position, z. B. `ruecklage:RL-998` — „inkonsistent" ohne Fundort ist keine Aussage. |
differenz | unbekannt | ja | |
VermoegensberichtReadinessBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
regel | string | ja | geldkonto_ohne_iban · geldkonto_ohne_bic · fremdsystem_kollision. |
fundort | string | ja | WO der Befund sitzt, maschinenlesbar, z. B. `konto:K-giro`. |
hinweis | string | ja | Der Satz für den Menschen — nennt den Mangel, nie einen Rohwert (BP §4). |
VermoegensberichtStandListeneintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
standId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
stichtag | string(date) | ja | Der Tag, zu dem der Bestand ausgewiesen ist. |
standNr | integer | ja | Die VERSION je Objekt und Stichtag, `1`-basiert. Ältere Stände verschwinden nicht (GoBD). |
schluessel | string | ja | Die Adresse aus `vermoegensberichtSchluessel` (Mandant × Objekt × Stichtag). |
erstelltAm | string(date-time) | ja | Der Ausführungszeitpunkt der Ablage — NICHT Teil des Berichts. |
konsistent | boolean | ja | Die AUSKUNFT des Checks, wie sie abgelegt wurde — hier nicht neu abgeleitet. |
readinessBefunde | array<VermoegensberichtReadinessBefund> | ja | |
konsistenzBefunde | array<VermoegensberichtKonsistenzBefund> | ja | |
VermoegensberichtStandListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
stichtag | string(date) | null | ja | Echo des `?stichtag`-Filters; `null` heisst „alle Stichtage". |
staende | array<VermoegensberichtStandListeneintrag> | ja | Jüngster Stichtag zuerst, innerhalb dessen der aktuelle Stand vor seinen Vorgängern. |
VermoegensberichtStandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
standId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
stichtag | string(date) | ja | Der Tag, zu dem der Bestand ausgewiesen ist. |
standNr | integer | ja | Die VERSION je Objekt und Stichtag, `1`-basiert. Ältere Stände verschwinden nicht (GoBD). |
schluessel | string | ja | Die Adresse aus `vermoegensberichtSchluessel` (Mandant × Objekt × Stichtag). |
erstelltAm | string(date-time) | ja | Der Ausführungszeitpunkt der Ablage — NICHT Teil des Berichts. |
konsistent | boolean | ja | Die AUSKUNFT des Checks, wie sie abgelegt wurde — hier nicht neu abgeleitet. |
readinessBefunde | array<VermoegensberichtReadinessBefund> | ja | |
konsistenzBefunde | array<VermoegensberichtKonsistenzBefund> | ja | |
serialisat | string | ja | Der Bericht als byte-stabiler JSON-TEXT (#3006). Cent-Beträge stehen darin als Dezimaltext, nie als JSON-number. |
Vermoegensuebersicht
| Feld | Typ | Pflicht | Beschreibung |
|---|
stichtag | string(date) | ja | Der Tag, ZU DEM diese Aussage gilt — EINSCHLIESSLICH. |
positionen | array<VermoegensuebersichtPosition> | ja | Geordnet: Seite (aktiva zuerst), Art, Kontonummer. Geldkonten stehen auch mit Saldo 0 darin, Personenkonten nur mit Saldo ≠ 0. |
geldkontenCents | string | ja | Σ der SIGNIERTEN Geldkonto-Salden (eine Überziehung mindert sie). |
forderungenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
verbindlichkeitenCents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
guthabenCents | string | ja | Was wir Mietern/Eigentümern schulden — getrennt ausgewiesen, weil es verrechnet und nicht bezahlt wird. |
reinvermoegenCents | string | ja | Geldkonten + offene Forderungen − offene Verbindlichkeiten. Die offenen Verbindlichkeiten sind beide Habenseiten der Personenkonten, einzeln ausgewiesen als `verbindlichkeitenCents` (Lieferanten) und `guthabenCents` (Mieter/Eigentümer). |
sachkontenSaldoCents | string | ja | Σ der SIGNIERTEN Sachkonten-Salden — die Gegenseite, die keine Position ist. Sie steht hier, weil sie die Rechnung überprüfbar macht. |
currency | string | ja | |
bilanzgleichgewicht | boolean | ja | Reinvermögen + Σ Sachkonten = 0 (Doppik). Wird AUSGEWIESEN statt erzwungen — eine Schieflage soll sichtbar sein, nicht die Antwort verhindern. |
VermoegensuebersichtPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
glAccountNo | string | ja | |
name | string | ja | |
kontotyp | bank | debitor | kreditor | ja | Sachkonten sind KEINE Positionen — sie sind die Gegenseite (s. `sachkontenSaldoCents`). |
art | geldkonto | forderung | verbindlichkeit | guthaben | ja | Bei Personenkonten die zum Stichtag ABGELEITETE Ausweisrichtung (ADR 0014, § 266 HGB) — ein Kreditorkonto im Soll ist ein DEBITORISCHER KREDITOR und damit `forderung`, nicht eine negative Verbindlichkeit. |
seite | aktiva | passiva | ja | |
saldoCents | string | ja | Der signierte Kontosaldo zum Stichtag (Soll − Haben). |
saldoSeite | S | H | ja | |
betragCents | string | ja | Der vorzeichenlose Betrag, mit dem die Position in ihre Seite eingeht (`|saldo|`). |
Versammlung
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
art | string | ja | ordentlich | ausserordentlich | umlauf |
status | string | ja | entwurf | durchgefuehrt | abgeschlossen | abgesagt |
versammlungsdatum | string(date) | ja | bei Art umlauf: das Datum der Beschlussfassung |
einladungsdatum | string(date) | null | ja | null beim Umlaufbeschluss und wenn nicht erfasst |
einladungsfristBegruendung | string | null | ja | |
stimmprinzip | string | null | ja | koepfe | mea | objekt; null beim Umlaufbeschluss (wird dort nicht geführt) |
beschlussfaehig | boolean | null | ja | null beim Umlaufbeschluss (wird dort nicht geführt) |
beschlussfaehigkeitNotiz | string | null | ja | |
verkuendetAm | string(date) | null | ja | |
anfechtungsfristEnde | string(date) | null | ja | nur mit verkuendetAm (Anfechtungsfrist § 45 WEG); sonst null |
anfechtungsfristEndeRechnerisch | string(date) | null | ja | rechnerisches Fristende nach § 188 Abs. 2 BGB, vor der Verschiebung auf einen Werktag; nur mit verkuendetAm, sonst null |
anfechtungsfristHinweis | string | null | ja | Hinweis zur Fristberechnung (Feiertage nicht berücksichtigt); nur mit verkuendetAm, sonst null |
beschluesseGeneriertAm | string(date-time) | null | ja | gesetzt ⇒ die Versammlung ist abgeschlossen und unveränderlich |
createdAt | string(date-time) | ja | |
VersammlungAendernRequest
Ändert eine Versammlung. art und propertyId sind nicht änderbar; ab beschluesse_generiert_am ist sie unveränderlich (409).
| Feld | Typ | Pflicht | Beschreibung |
|---|
versammlungsdatum | string(date) | nein | |
einladungsdatum | string(date) | null | nein | |
einladungsfristBegruendung | string | null | nein | |
stimmprinzip | string | nein | |
beschlussfaehig | boolean | nein | |
beschlussfaehigkeitNotiz | string | null | nein | |
status | string | nein | nur entwurf → durchgefuehrt und entwurf|durchgefuehrt → abgesagt; abgeschlossen setzt allein „Beschlüsse generieren“ |
VersammlungAnlegenRequest
Legt eine Versammlung an. Unter 3 Wochen Einladungsfrist: Warnung (Hinweis) und Begründung Pflicht, aber keine Sperre. Der Umlaufbeschluss ist nur eine Art; die Abstimmung läuft nicht über casa.ai.
| Feld | Typ | Pflicht | Beschreibung |
|---|
art | string | ja | ordentlich | ausserordentlich | umlauf |
versammlungsdatum | string(date) | ja | |
einladungsdatum | string(date) | nein | nicht beim Umlaufbeschluss; ohne Angabe ⇒ Hinweis einladung-nicht-erfasst |
einladungsfristBegruendung | string | nein | Pflicht, wenn die Einladung weniger als 3 Wochen vor der Versammlung liegt |
stimmprinzip | string | nein | koepfe (Default) | mea | objekt; nicht beim Umlaufbeschluss |
beschlussfaehig | boolean | nein | Default true; nicht beim Umlaufbeschluss |
beschlussfaehigkeitNotiz | string | nein | |
VersammlungBeschluesseGenerierenRequest
Übernimmt die verkündeten Beschluss-TOPs in die Beschluss-Sammlung des Objekts (genau einmal). Leerer Body `{}`. Voraussetzung: verkündet, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis. Geschäftsordnungs- und Notiz-TOPs werden nicht übernommen.
| Feld | Typ | Pflicht | Beschreibung |
|---|
VersammlungBeschluesseGenerierenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
versammlungId | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
beschluesse | array<object> | ja | übernommene Beschlüsse in TOP-Reihenfolge |
uebersprungen | array<object> | ja | nicht übernommene TOPs (Geschäftsordnung, Notiz) mit Grund |
anzahl | integer | ja | Anzahl übernommener Beschlüsse |
VersammlungDetail
Die Beschlussfähigkeit wird nicht berechnet: `beschlussfaehig` bleibt wie gespeichert (Änderung über PATCH /api/versammlung/{id}).
Typ: unbekannt
VersammlungHinweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | string | ja | einladungsfrist-unterschritten | einladung-nicht-erfasst |
text | string | ja | |
istTage | integer | nein | Ist-Tage zwischen Einladung und Versammlung (nur bei Unterschreitung) |
VersammlungListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
versammlungen | array<Versammlung> | ja | |
VersammlungSchreibResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
art | string | ja | |
status | string | ja | |
versammlungsdatum | string(date) | ja | |
einladungsdatum | string(date) | null | ja | |
hinweise | array<VersammlungHinweis> | ja | |
VersammlungTeilnehmer
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
personId | string(uuid) | ja | |
personName | string | ja | Anzeigename aus dem Personenstamm (personenbezogen) |
personType | string | ja | Personenart aus dem Personenstamm |
anwesenheit | string | ja | praesent | online | vertreten |
stimmgewicht | integer | ja | koepfe: 1; mea: Zehntausendstel; objekt: Anzahl der Einheiten |
vertretenDurch | string | null | ja | Freitext (personenbezogen) |
VersammlungTeilnehmerErfassenRequest
Setzt den Teilnehmer (Upsert je Person: erneutes Setzen überschreibt). Ein Entfernen gibt es nicht; wer nicht erschienen ist, wird nicht erfasst. Ob die Person Eigentümer ist, prüft casa.ai nicht (Gäste, Vertreter, Verwalter sind Teilnehmer). Umlaufbeschluss ⇒ umlauf-ohne-teilnehmer.
| Feld | Typ | Pflicht | Beschreibung |
|---|
personId | string(uuid) | ja | |
anwesenheit | string | ja | praesent | online | vertreten |
stimmgewicht | integer | nein | koepfe: nur 1 (Default); mea: Zehntausendstel (> 0, Pflicht); objekt: Anzahl der Einheiten (> 0, Pflicht) |
vertretenDurch | string | nein | |
VersammlungTeilnehmerSchreibResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
versammlungId | string(uuid) | ja | |
personId | string(uuid) | ja | |
anwesenheit | string | ja | |
stimmgewicht | integer | ja | |
angelegt | boolean | ja | true: neu erfasst; false: die bestehende Zeile dieser Person wurde überschrieben |
VersammlungTop
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
lfdNr | integer | ja | laufende TOP-Nummer ab 1, je Versammlung eindeutig; die Reihenfolge ändert sich nie |
bezeichnung | string | ja | |
topArt | string | ja | beschluss | geschaeftsordnung | notiz |
beschlusstext | string | null | ja | |
kategorie | string | null | ja | |
ergebnis | string | null | ja | angenommen | abgelehnt; null = noch nicht erfasst (und bei Nicht-Beschluss-TOPs immer) |
stimmenJa | integer | null | ja | Köpfe; null = nicht genannt |
stimmenNein | integer | null | ja | |
stimmenEnthaltung | integer | null | ja | |
anteileJa | integer | null | ja | Anteile in Zehntausendsteln; null = nicht genannt |
anteileNein | integer | null | ja | |
anteileEnthaltung | integer | null | ja | |
VersammlungTopAendernRequest
Ändert Text und Art eines TOP; die laufende Nummer (Reihenfolge) ist nicht änderbar.
| Feld | Typ | Pflicht | Beschreibung |
|---|
bezeichnung | string | nein | |
topArt | string | nein | |
beschlusstext | string | null | nein | |
kategorie | string | null | nein | |
VersammlungTopErfassenRequest
Erfasst einen TOP. Beim Umlaufbeschluss genau ein TOP (umlauf-genau-ein-top). Abgeschlossene Versammlung ⇒ 409.
| Feld | Typ | Pflicht | Beschreibung |
|---|
bezeichnung | string | ja | |
topArt | string | nein | beschluss (Default) | geschaeftsordnung | notiz |
beschlusstext | string | nein | |
kategorie | string | nein | |
lfdNr | integer | nein | nur wenn ausdrücklich gewünscht; ohne Angabe vergibt der Server die nächste freie Nummer. Vergeben ⇒ 409 |
VersammlungTopErgebnisRequest
Setzt Feststellung und Zahlen EINES Beschluss-TOP; erneutes Setzen überschreibt (nicht genannte Zahlen werden null), solange die Versammlung nicht abgeschlossen ist. Geschäftsordnungs- und Notiz-TOPs ⇒ top-ohne-abstimmung. Beim Umlaufbeschluss sind die Zahlen optional, die Feststellung ist Pflicht.
| Feld | Typ | Pflicht | Beschreibung |
|---|
ergebnis | string | ja | angenommen | abgelehnt — die Feststellung; sie wird nie aus den Zahlen abgeleitet |
stimmenJa | integer | nein | Köpfe, ganze Zahl >= 0; nicht genannt ⇒ null |
stimmenNein | integer | nein | |
stimmenEnthaltung | integer | nein | |
anteileJa | integer | nein | Anteile in Zehntausendsteln, ganze Zahl >= 0; nicht genannt ⇒ null |
anteileNein | integer | nein | |
anteileEnthaltung | integer | nein | |
VersammlungTopErgebnisResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
versammlungId | string(uuid) | ja | |
lfdNr | integer | ja | |
ergebnis | string | ja | |
stimmenJa | integer | null | ja | |
stimmenNein | integer | null | ja | |
stimmenEnthaltung | integer | null | ja | |
anteileJa | integer | null | ja | |
anteileNein | integer | null | ja | |
anteileEnthaltung | integer | null | ja | |
hinweise | array<VersammlungHinweis> | ja | ergebnis-widerspricht-zahlen: angenommen bei mehr Nein- als Ja-Stimmen — gespeichert wird trotzdem wie festgestellt |
VersammlungTopSchreibResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
versammlungId | string(uuid) | ja | |
lfdNr | integer | ja | |
bezeichnung | string | ja | |
topArt | string | ja | |
VersammlungVerkuendenRequest
Verkündet die Versammlung (setzt verkuendet_am EINMAL). Voraussetzung: Status durchgefuehrt, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis. Zweites Verkünden ⇒ 409 bereits-verkuendet.
| Feld | Typ | Pflicht | Beschreibung |
|---|
verkuendetAm | string(date) | ja | Datum der Verkündung; nicht vor dem Versammlungsdatum, nicht in der Zukunft |
VersammlungVerkuendungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
art | string | ja | |
status | string | ja | |
versammlungsdatum | string(date) | ja | |
verkuendetAm | string(date) | ja | |
anfechtungsfristEnde | string(date) | ja | Ende der Anfechtungsfrist: ein Monat ab Verkündung (§ 45 WEG), auf einen Werktag verschoben; berechnet, nicht gespeichert |
anfechtungsfristEndeRechnerisch | string(date) | ja | rechnerisches Fristende nach § 188 Abs. 2 BGB, vor der Verschiebung |
anfechtungsfristHinweis | string | ja | Feiertage sind nicht berücksichtigt |
VersionResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
buildId | string | ja | |
Vertrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
propertyNo | string | null | ja | Objektnummer des Elternobjekts (LEFT JOIN) |
contractNo | string | ja | Ordnungsnummer ohne erzwungene Eindeutigkeit (s. #416); Identität ist id |
startDate | string(date) | null | ja | Beginn (inklusiv); null ⇒ unbegrenzt in die Vergangenheit |
endDate | string(date) | null | ja | Ende (exklusiv); null ⇒ laufend |
endReason | string | null | ja | |
depositCents | string | null | ja | Kaution in Cents als Ziffern-String (dokumentarisch in 1.0, GG3) |
depositCurrency | string | null | ja | |
archivedAt | string(date-time) | null | ja | ANDERE Achse als endDate (K5) |
createdAt | string(date-time) | ja | |
terms | array<VertragTerm> | ja | nur im Detail (GET /{id}) gefüllt; in der Liste leer |
VertragCreatePayment
| Feld | Typ | Pflicht | Beschreibung |
|---|
componentId | string(uuid) | ja | muss existieren und aktiv sein (Prüfung im Tool-Layer) |
amountCents | integer | string | ja | Betrag in Cents, GANZZAHLIG (kein Float): ganze Zahl ODER Ziffern-String |
currency | string | ja | |
VertragCreateRequest
Legt ein Mietverhältnis samt initialer Konditionen-Zeitscheibe (Kaltmiete) + optionalen Zahlungen an. Objekt muss aktiv sein.
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | das Objekt; MUSS aktiv sein (sonst 404) |
contractNo | string | ja | |
startDate | string(date) | nein | Vertragsbeginn = untere Grenze der initialen Zeitscheibe; ohne Angabe unbegrenzt |
mieterPersonId | string(uuid) | ja | die MIETPARTEI des Vertrags — PFLICHT seit #1965 (wortgleich zu MieterwechselRequest, dieselbe Fachregel). Muss eine aktive Person dieses Mandanten sein (unbekannt, mandantenfremd oder archiviert ⇒ 404, ununterscheidbar). Die party_roles-Zeile entsteht in DERSELBEN Transaktion wie der Vertrag. |
kaltmieteCents | integer | string | ja | Kaltmiete in Cents, GANZZAHLIG (GG3/K4) |
currency | string | ja | |
ustOption | boolean | nein | |
ustRate | integer | nein | USt-Satz in ganzen Prozent, nur bei ustOption true; ohne Angabe bei Option 19. Angeboten wird heute nur 19 (#5988). |
dueRule | monatserster | monatsdritter-werktag | quartalsbeginn | fester-tag | nein | Fälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay). |
dueDay | integer | nein | Fälligkeitstag 1–31 der Regel fester-tag (in kürzeren Monaten der Monatsletzte). Gesetzt GENAU bei dueRule = fester-tag — fester-tag ohne Tag und ein Tag an einer anderen Regel werden abgewiesen. |
paymentMethod | string | nein | |
mahnsperre | boolean | nein | |
depositCents | integer | string | nein | vereinbarte Kaution in Cents; depositCurrency dann Pflicht. Ohne Kautionsabrede dokumentarisch (nie sollgestellt) |
depositCurrency | string | nein | |
kautionAnlageform | barkaution | buergschaft | verpfaendung | nein | Kautionsabrede (#5178): Anlageform der Sicherheit; setzt depositCents voraus |
kautionRaten | integer | nein | Raten nach § 551 Abs. 2 BGB (1…3) — Pflicht bei barkaution, sonst verboten (400) |
kautionAnlagekontoId | string(uuid) | nein | getrennte Anlage: Bankverbindung der Kontoart kautionskonto am Objekt (nur barkaution; unbekannt/fremd ⇒ 404) |
payments | array<VertragCreatePayment> | nein | |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
VertragEndRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
endDate | string(date) | ja | Tag, ab dem der Vertrag NICHT mehr gilt (exklusive obere Grenze der Zeitscheiben) |
endReason | string | null | nein | Grund der Beendigung (optional) |
VertragEndResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
endDate | string(date) | ja | |
endReason | string | null | ja | |
closedTermIds | array<string(uuid)> | ja | die IDs der durch diesen Aufruf geschlossenen Konditionen-Zeitscheiben |
alreadyEnded | boolean | ja | true ⇒ der Vertrag war bereits beendet; `endDate` = URSPRÜNGLICHES Ende. |
VertragKuendigenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
zugang | string(date) | ja | Tag des Zugangs der Kündigung |
kuendigender | mieter | vermieter | ja | Wer kündigt (mieter | vermieter). |
vereinbartesEnde | string(date) | nein | abweichend vereinbartes Vertragsende (LETZTER Tag, einschliesslich), z. B. aus einem Aufhebungsvertrag; fehlt es, gilt der Vorschlag |
VertragKuendigenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
zugang | string(date) | ja | |
kuendigender | mieter | vermieter | ja | Wer kündigt (mieter | vermieter). |
vorschlag | VertragKuendigenVorschlag | ja | |
vertragsende | string(date) | ja | das WIRKSAME Vertragsende (letzter Tag, einschliesslich) |
endDate | string(date) | ja | vertragsende + 1 Tag — das exklusive Ende am Vertrag (wie endDate bei /end) |
abweichendVereinbart | boolean | ja | true ⇒ vereinbartesEnde war gesetzt UND weicht vom Vorschlag ab |
alreadyEnded | boolean | ja | true ⇒ der Vertrag war bereits beendet; nichts geschrieben, vertragsende/endDate = BESTEHENDES Ende |
VertragKuendigenVorschlag
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragsende | string(date) | null | ja | errechnetes Vertragsende nach § 573c BGB — LETZTER Tag (einschliesslich), immer ein Monatsletzter; null ⇒ nicht berechnet (nur im No-op eines anders beendeten Vertrags ohne § 573c-Stammdaten) |
fristMonate | integer | null | ja | angewandte Frist in Monaten (Mieter 3; Vermieter 3/6/9 nach 0/5/8 Jahren Überlassung); null ⇒ nicht berechnet |
karenzGewahrt | boolean | null | ja | true ⇒ Zugang spätestens am dritten Werktag des Monats (Samstag zählt mit, BGH VIII ZR 206/04; fällt der dritte Werktag auf einen Samstag, endet die Karenz am nächsten Werktag, § 193 BGB; Sonn- und Landesfeiertage zählen nicht); null ⇒ nicht berechnet |
VertragKuendigungErfasst
| Feld | Typ | Pflicht | Beschreibung |
|---|
zugang | string(date) | ja | Tag des Zugangs der Kündigung |
kuendigender | mieter | vermieter | ja | Wer kündigt (mieter | vermieter). |
vorgeschlagenesEnde | string(date) | ja | der bei der Erfassung errechnete Vorschlag (letzter Tag, einschliesslich) |
vertragsende | string(date) | ja | das WIRKSAME Vertragsende (letzter Tag, einschliesslich) |
abweichendVereinbart | boolean | ja | true ⇒ das wirksame Ende weicht vom Vorschlag ab („abweichend vereinbart", z. B. Aufhebungsvertrag) |
VertragKuendigungResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
vorschlag | unbekannt | ja | |
kuendigung | unbekannt | ja | |
VertragKuendigungsVorschlag
| Feld | Typ | Pflicht | Beschreibung |
|---|
vertragsende | string(date) | ja | errechnetes Vertragsende nach § 573c BGB — LETZTER Tag (einschliesslich), immer ein Monatsletzter |
fristMonate | integer | ja | angewandte Frist in Monaten (Mieter 3; Vermieter 3/6/9 nach 0/5/8 Jahren Überlassung) |
karenzGewahrt | boolean | ja | true ⇒ Zugang spätestens am dritten Werktag des Monats (Samstag zählt mit, BGH VIII ZR 206/04; fällt der dritte Werktag auf einen Samstag, endet die Karenz am nächsten Werktag, § 193 BGB; Sonn- und Landesfeiertage zählen nicht) |
VertragListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | alle | aktiv | beendet | ja | der wirksame 3-Wege-GÜLTIGKEITS-Filter (gemessen an end_date). ACHTUNG: aktiv ∪ beendet ≠ alle. |
asOf | string(date) | ja | der wirksame Stichtag, gegen den aktiv/beendet gemessen wurde |
vertraege | array<Vertrag> | ja | |
VertragPersonen
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
contractId | string(uuid) | ja | |
personCount | integer | ja | Kopfzahl der Bewohner (Kinder wie Erwachsene), ganzzahlig ≥ 0. 0 = erfasster Leerstand. |
validFrom | string(date) | null | ja | Beginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit. |
validTo | string(date) | null | ja | Ende EXKLUSIV (rohe daterange-Grenze); null ⇒ laufend. |
validRange | string | ja | Rohes daterange-Literal, z. B. [2025-01-01,). |
active | boolean | ja | Ist die Scheibe am Stichtag (asOf) wirksam (valid_range @> asOf)? |
createdAt | string(date-time) | ja | |
VertragPersonenListResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
contractId | string(uuid) | ja | |
asOf | string(date) | ja | der wirksame Stichtag, gegen den `active` je Scheibe gemessen wurde |
personen | array<VertragPersonen> | ja | |
VertragPersonenRemoveResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | Id der entfernten (stillgelegten, K5) Scheibe |
contractId | string(uuid) | ja | |
predecessorId | string(uuid) | ja | Id der Vorgänger-Scheibe, die die Lücke wieder deckt |
predecessorValidTo | string(date) | null | ja | letzter Gültigkeitstag der Vorgängerin nach dem Entfernen (EINSCHLIESSLICH) oder null (wieder laufend — die entfernte Scheibe war die letzte) |
VertragPersonenSetRequest
Setzt/ändert eine Kopfzahl-Zeitscheibe „ab validFrom" (SCD-2: eine offene Vorgänger-Scheibe wird abgeschlossen). Beide Grenzen sind EINSCHLIESSLICH; Überschneidungen ⇒ 400.
| Feld | Typ | Pflicht | Beschreibung |
|---|
personCount | integer | ja | Kopfzahl, ganzzahlig ≥ 0 (0 ist eine ERFASSTE Aussage, nicht „unbekannt") |
validFrom | string(date) | ja | erster Tag, an dem die Kopfzahl gilt (EINSCHLIESSLICH) — das „ab" der Änderung |
validTo | string(date) | nein | letzter Tag, an dem sie gilt (EINSCHLIESSLICH); ohne Angabe laufend |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
VertragPersonenSetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
contractId | string(uuid) | ja | |
personCount | integer | ja | |
validFrom | string(date) | ja | erster Gültigkeitstag (EINSCHLIESSLICH) |
validTo | string(date) | null | ja | letzter Gültigkeitstag (EINSCHLIESSLICH) oder null (laufend) |
supersededPriorSlice | boolean | ja | true ⇒ eine zuvor offene Scheibe wurde an validFrom abgeschlossen (SCD-2). |
VertragTerm
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
kaltmieteCents | string | null | ja | Kaltmiete in Cents als Ziffern-String (GG3) |
currency | string | null | ja | |
ustOption | boolean | null | ja | |
ustRate | string | null | ja | USt-Satz der Scheibe in Prozent, Spaltenform mit zwei Nachkommastellen (z. B. `19.00`); null ohne USt-Option (#5988) |
dueRule | monatserster | monatsdritter-werktag | quartalsbeginn | fester-tag | null | ja | Fälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay). |
dueDay | integer | null | ja | Fälligkeitstag 1–31 der Regel fester-tag; null bei jeder anderen Regel |
paymentMethod | string | null | ja | |
mahnsperre | boolean | null | ja | |
validFrom | string(date) | null | ja | inklusiv; null ⇒ unbegrenzt in die Vergangenheit |
validTo | string(date) | null | ja | EXKLUSIV; null ⇒ offen (laufend) |
validRange | string | ja | das rohe Postgres-daterange-Literal, z. B. `[2026-01-01,)` |
archivedAt | string(date-time) | null | ja | |
payments | array<VertragTermPayment> | ja | |
VertragTermPayment
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
componentId | string(uuid) | ja | |
componentName | string | null | ja | Name der Komponente (LEFT JOIN); null, wenn die Kette reißt |
amountCents | string | null | ja | Betrag in Cents als Ziffern-String (GG3: nie Float/number) |
currency | string | null | ja | |
VertragZahlungChangePayment
| Feld | Typ | Pflicht | Beschreibung |
|---|
componentId | string(uuid) | ja | muss existieren und aktiv sein (Prüfung im Tool-Layer) |
amountCents | integer | string | ja | Betrag in Cents, GANZZAHLIG (kein Float): ganze Zahl ODER Ziffern-String |
currency | string | ja | |
VertragZahlungChangeRequest
Konditionswechsel als Zeitscheibe (SCD-2). `ab` MUSS echt nach dem Beginn der offenen Scheibe liegen (sonst 400).
| Feld | Typ | Pflicht | Beschreibung |
|---|
ab | string(date) | ja | Wirksamkeitstag: untere Grenze der neuen, exklusive obere Grenze der alten Scheibe |
kaltmieteCents | integer | string | ja | neue Kaltmiete in Cents, GANZZAHLIG (GG3/K4) |
currency | string | ja | |
ustOption | boolean | nein | |
ustRate | integer | nein | USt-Satz in ganzen Prozent, nur bei ustOption true; ohne Angabe bei Option 19. Angeboten wird heute nur 19 (#5988). |
dueRule | monatserster | monatsdritter-werktag | quartalsbeginn | fester-tag | nein | Fälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay). |
dueDay | integer | nein | Fälligkeitstag 1–31 der Regel fester-tag (in kürzeren Monaten der Monatsletzte). Gesetzt GENAU bei dueRule = fester-tag — fester-tag ohne Tag und ein Tag an einer anderen Regel werden abgewiesen. |
paymentMethod | string | nein | |
mahnsperre | boolean | nein | |
payments | array<VertragZahlungChangePayment> | nein | |
sourceSystem | string | null | nein | |
sourceRef | string | null | nein | |
VertragZahlungChangeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | der gewechselte Vertrag |
ab | string(date) | ja | |
closedTermId | string(uuid) | ja | die alte, nun auf `ab` geschlossene Scheibe |
closedValidRange | string | ja | daterange der geschlossenen Scheibe |
newTermId | string(uuid) | ja | die neu geöffnete Scheibe |
newValidRange | string | ja | daterange der neuen (offenen) Scheibe |
kaltmieteCents | string | ja | neue Kaltmiete in Cents als Ziffern-String (nie bigint an der Grenze, GG3) |
currency | string | ja | |
payments | array<VertragZahlungChangeResultPayment> | ja | die vereinbarten Zahlungen der neuen Scheibe |
VertragZahlungChangeResultPayment
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
componentId | string(uuid) | ja | |
amountCents | string | ja | Betrag in Cents als Ziffern-String (GG3: nie Float/number/bigint) |
currency | string | ja | |
VzGegenrechnungResult
| Feld | Typ | Pflicht | Beschreibung |
|---|
vzModus | soll | ist | ja | Gegen WELCHE Vorauszahlungen gerechnet wurde: soll = sollgestellt (Default), ist = geleistet. Der Modus ist eine Option DES LAUFS, kein globaler Zustand. |
vertraege | array<ContractOffset> | ja | |
totalKostenBrutto | ErgebnisMoney | ja | |
totalSollVz | ErgebnisMoney | ja | |
totalIstVz | unbekannt | ja | |
totalOffeneVz | unbekannt | ja | |
totalNachforderung | ErgebnisMoney | ja | |
totalGuthaben | ErgebnisMoney | ja | |
istStichtag | string(date) | null | ja | Bis zu welchem WERTSTELLUNGSDATUM eine Zahlung als geleistet gilt; null im Modus soll. |
WechselzeitraumBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
ungeprueftKennung | string | nein | Zeilen-Id der Basiszeile, deren Beginn unbekannt ist (nur bei beginn-unbekannt). |
konfliktKennung | string | nein | Zeilen-Id der überlappten bestehenden Zeile (nur bei ueberlappt). |
lueckeVon | string(date) | nein | Erster freier Tag der Lücke zum nächsten bestehenden Zeitraum (inklusive). |
lueckeBis | string(date) | nein | Letzter freier Tag der Lücke (inklusive). |
WechselzeitraumResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | ok | ueberlappt | zeitraum-verdreht | beginn-unbekannt | kein-personenkonto | ja | |
befund | WechselzeitraumBefund | ja | |
art | bewohner | eigentuemer | ja | |
basisBeginn | string(date) | null | ja | Beginn der Basis (Eigentums- bzw. Vertrags-/Belegungsbeginn), inklusive; null = unbekannt. |
anzahlZeilen | integer | ja | Anzahl der gelesenen Bestandszeilen der Einheit. |
WirtschaftsplanAnlegenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | Das WIRTSCHAFTSJAHR des Plans. |
positionen | array<WirtschaftsplanPosition> | ja | Mindestens eine Position. |
beginn | string | nein | Nur bei einem Objekt mit GO-Vereinbarung (dann Pflicht): erster Tag, `YYYY-MM-DD`. |
ende | string | nein | Nur bei einem Objekt mit GO-Vereinbarung (dann Pflicht): letzter Tag, `YYYY-MM-DD`. |
WirtschaftsplanBefund
| Feld | Typ | Pflicht | Beschreibung |
|---|
regel | string | ja | |
fundort | string | ja | |
meldung | string | ja | |
WirtschaftsplanBerechnung
| Feld | Typ | Pflicht | Beschreibung |
|---|
gesamtplan | WirtschaftsplanGesamt | ja | |
einzelplaene | array<WirtschaftsplanEinzelplan> | ja | |
befunde | array<WirtschaftsplanBefund> | ja | |
WirtschaftsplanBeschliessenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | |
version | integer | ja | Die zu beschließende Version; nur die höchste Version des Jahres, nur im Status entwurf. |
beschlussRef | string | ja | Referenz `beschluss-gegenstand:<uuid>` aus `casa objekt beschluss list`; der Beschluss muss tragend sein. |
WirtschaftsplanBeschliessenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
jahr | integer | ja | |
version | integer | ja | |
status | beschlossen | ja | |
ausgang | beschlossen | bereits_beschlossen | ja | |
beschlussRef | string | ja | |
beschlussStatus | string | ja | |
abweichungsStufe | string | null | ja | `null` bei `bereits_beschlossen`: nichts wurde neu geprüft. |
befunde | array<WirtschaftsplanBefund> | null | ja | |
warnungen | array<WirtschaftsplanBefund> | null | ja | |
fortgeltung | boolean | ja | Wert von `wp_fortgeltung` am Teil-Gegenstand. |
WirtschaftsplanDiff
| Feld | Typ | Pflicht | Beschreibung |
|---|
vonVersion | integer | ja | |
nachVersion | integer | ja | |
zeilen | array<WirtschaftsplanDiffZeile> | ja | |
WirtschaftsplanDiffZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
kostenart | string | ja | |
art | kosten | einnahme | ruecklagenzufuehrung | ja | Positionsart; das Vorzeichen trägt die Art, der Betrag ist immer > 0. |
vorher | unbekannt | ja | |
nachher | unbekannt | ja | |
WirtschaftsplanEinzelplan
| Feld | Typ | Pflicht | Beschreibung |
|---|
unitIds | array<string(uuid)> | ja | |
eigentuemerId | string | ja | |
positionen | array<WirtschaftsplanEinzelposition> | ja | |
jahresSoll | WirtschaftsplanGeld | ja | |
monatsHausgeld | array<WirtschaftsplanGeld> | ja | Ein Betrag je Monat des Wirtschaftsjahres. |
WirtschaftsplanEinzelposition
| Feld | Typ | Pflicht | Beschreibung |
|---|
kostenart | string | ja | |
art | kosten | einnahme | ruecklagenzufuehrung | ja | Positionsart; das Vorzeichen trägt die Art, der Betrag ist immer > 0. |
betrag | WirtschaftsplanGeld | ja | |
WirtschaftsplanEntwurfRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | |
positionen | array<WirtschaftsplanPosition> | ja | VOLLSTÄNDIGE Positionsliste der neuen Version — kein Teil-Patch. |
WirtschaftsplanGeld
| Feld | Typ | Pflicht | Beschreibung |
|---|
cents | string | ja | Minor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number. |
currency | EUR | ja | |
WirtschaftsplanGesamt
| Feld | Typ | Pflicht | Beschreibung |
|---|
kosten | WirtschaftsplanGeld | ja | |
einnahmen | WirtschaftsplanGeld | ja | |
ruecklagenzufuehrung | WirtschaftsplanGeld | ja | |
jahresSoll | WirtschaftsplanGeld | ja | |
WirtschaftsplanPosition
| Feld | Typ | Pflicht | Beschreibung |
|---|
kostenart | string | ja | |
art | kosten | einnahme | ruecklagenzufuehrung | ja | Positionsart; das Vorzeichen trägt die Art, der Betrag ist immer > 0. |
betrag | WirtschaftsplanGeld | ja | |
verteilerschluessel | string | null | nein | Bei `kosten`/`einnahme` Pflicht, bei `ruecklagenzufuehrung` verboten. |
ruecklageId | string(uuid) | null | nein | Bei `ruecklagenzufuehrung` Pflicht, sonst verboten. |
WirtschaftsplanStandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
jahr | integer | ja | |
version | integer | ja | |
status | entwurf | beschlossen | verworfen | ja | |
beginn | string | ja | |
ende | string | ja | |
goReferenz | string | null | ja | |
positionen | array<WirtschaftsplanPosition> | ja | |
diff | unbekannt | ja | |
berechnung | unbekannt | ja | |
beschlussRef | string | null | ja | Referenz `beschluss-gegenstand:<uuid>` des tragenden Beschlusses; `null`, solange die Version nicht beschlossen ist. |
beschlussStatus | string | null | ja | Status, unter dem das Gate freigegeben hat; `null` ohne Bindung. |
fortgeltung | boolean | null | ja | Wert von `wp_fortgeltung` am Teil-Gegenstand: gilt der Plan für Folgejahre weiter? `null` ohne Bindung. |
WirtschaftsplanUebernahmeRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | Das Wirtschaftsjahr, für das fällig gestellt wird (bei Fortgeltung das Folgejahr des Plans). |
geldkreis | string | ja | Bewusst freier Text; der Fachkern urteilt über Geldkreise (hier: `weg_hausgeld`). |
WirtschaftsplanUebernahmeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
ausgang | ausgefuehrt | bereits_ausgefuehrt | ja | |
schluessel | string | ja | Der Idempotenz-Schlüssel des Laufs, wie der Fachkern ihn gebildet hat. |
geldkreis | string | ja | |
kontenkreis | string | ja | |
beschlussRef | string | ja | Die Rechtsgrundlage, wie die FREIGABE sie gemeldet hat — nie aus der Eingabe. |
beschlussStatus | string | ja | |
positionen | array<HausgeldSollPosition> | ja | Die GESTELLTEN Positionen, Art `vorschuss`. |
differenzVorschlaege | array<HausgeldDifferenzVorschlag> | ja | Die rückwirkenden Differenzen als VORSCHLAG — NICHT gebucht; leer statt fehlend. |
warnungen | array<HausgeldBefund> | ja | |
quelle | eigener_plan | fortgeltung | ja | Woher der Plan kam: eigener beschlossener Plan des Jahres oder Fortgeltung eines früheren. |
quelleJahr | integer | ja | Das Wirtschaftsjahr des Plans, aus dem die Positionen stammen. |
WirtschaftsplanVersionenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
jahr | integer | null | ja | Echo des Filters `jahr`; `null` ohne Filter. |
versionen | array<WirtschaftsplanVersionZeile> | ja | |
WirtschaftsplanVersionResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
jahr | integer | ja | |
version | integer | ja | |
status | entwurf | ja | |
positionen | integer | ja | Anzahl der gespeicherten Positionen. |
WirtschaftsplanVersionZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | |
version | integer | ja | |
status | entwurf | beschlossen | verworfen | ja | |
beginn | string | ja | Erster Tag des Plan-Zeitraums, `YYYY-MM-DD`. |
ende | string | ja | Letzter Tag des Plan-Zeitraums (inklusiv), `YYYY-MM-DD`. |
goReferenz | string | null | ja | |
positionen | integer | ja | |
jahresSoll | unbekannt | ja | |
angelegtAm | string(date-time) | ja | |
beschlussRef | string | null | ja | Referenz `beschluss-gegenstand:<uuid>` des tragenden Beschlusses; `null`, solange die Version nicht beschlossen ist. |
beschlussStatus | string | null | ja | Status, unter dem das Gate freigegeben hat; `null` ohne Bindung. |
fortgeltung | boolean | null | ja | Wert von `wp_fortgeltung` am Teil-Gegenstand: gilt der Plan für Folgejahre weiter? `null` ohne Bindung. |
WirtschaftsplanVerwerfenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
jahr | integer | ja | |
version | integer | ja | Die zu verwerfende Version; nur ein Entwurf lässt sich verwerfen. |
WirtschaftsplanVerwerfenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
jahr | integer | ja | |
version | integer | ja | |
status | verworfen | ja | |
ZaehlerAbgelesenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
zaehlerId | string(uuid) | ja | |
zaehlerstand | string | ja | Kanonischer Stand, Skala 3. |
abgelesenAm | string(date-time) | ja | |
anlass | turnus | wechsel | zwischenablesung | ja | |
verbrauchSeitVorablesung | string | null | ja | Verbrauch seit dem zeitlichen Vorgänger; `null` bei der Erst-Ablesung. |
plausibilitaet | ZaehlerPlausibilitaet | ja | |
ZaehlerAblesenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
reading | string | ja | Zählerstand. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400. |
readAt | string | ja | Ablesezeitpunkt, ISO-8601-Datum oder -Zeitpunkt; ein Kalendertag zählt als 00:00 UTC. |
occasion | turnus | wechsel | zwischenablesung | ja | Anlass (geschlossen). Die Zwischenablesung am Tag des Mieterwechsels ist Voraussetzung der Verbrauchs-Zuordnung je Vertrag. |
source | string | nein | Erhebungsart (`ablesung` · `schaetzung` · `portal`); Standard `ablesung`. |
sourceSystem | string | null | nein | Quellsystem eines Imports; systemseitige Werte sind verboten. |
sourceRef | string | null | nein | Referenz im Quellsystem. |
ZaehlerAblesung
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
zaehlerId | string(uuid) | ja | |
zaehlerstand | string | null | ja | null bei defektem Bestand. |
abgelesenAm | string(date-time) | null | ja | |
quelle | string | null | ja | |
anlass | string | null | ja | |
plausibilitaet | string | null | ja | |
erfasstAm | string(date-time) | ja | |
ZaehlerAblesungenResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zaehlerId | string(uuid) | ja | |
ablesungen | array<ZaehlerAblesung> | ja | |
ZaehlerAendernRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
meterType | string | nein | |
meterNo | string | nein | |
unitOfMeasure | string | nein | |
ZaehlerAnlegenRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | Das Objekt; nach der Anlage fest. |
unitId | string(uuid) | nein | Die Einheit (Standort); ohne Angabe ein Allgemein-Zähler. Nach der Anlage fest. |
meterType | string | ja | Zählerart, z. B. `wasser_kalt`, `wasser_warm`, `waerme`, `strom`. |
meterNo | string | nein | Feste Zählernummer. Entweder eine feste Nummer ODER ein Nummernkreis (Präfix/Turnusjahr), nie beides (400). Ohne beides und ohne Turnusjahr bleibt die Nummer leer. |
meterNoPrefix | string | nein | Präfix des Nummernkreises (Nummer = Präfix + dreistellig laufend). Entweder eine feste Nummer ODER ein Nummernkreis (Präfix/Turnusjahr), nie beides (400). Ohne beides und ohne Turnusjahr bleibt die Nummer leer. |
turnusjahr | integer | nein | Turnusjahr des Vorgabe-Präfixes `KW|WW|HZ|ST-<Turnusjahr>-` (nur ohne Nummer und Präfix). |
unitOfMeasure | string | nein | Maßeinheit, z. B. `m3`, `kwh`. |
sourceSystem | string | null | nein | Quellsystem eines Imports (z. B. `win-casa`); systemseitige Werte sind verboten. |
sourceRef | string | null | nein | Referenz im Quellsystem. |
ZaehlerArchiviertResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
archiviertAm | string(date-time) | ja | |
bereitsArchiviert | boolean | ja | true ⇒ der Zähler war schon archiviert; nichts wurde geschrieben. |
ZaehlerGespeichertResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
objektId | string(uuid) | ja | |
einheitId | string(uuid) | null | ja | |
zaehlerart | string | ja | |
zaehlernummer | string | null | ja | Die vergebene Nummer, auch wenn sie aus dem Nummernkreis stammt. |
masseinheit | string | null | ja | |
ersetztZaehlerId | string(uuid) | null | ja | |
ZaehlerGetauschtResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
altZaehlerId | string(uuid) | ja | |
neuZaehlerId | string(uuid) | ja | |
endstandAblesungId | string(uuid) | ja | |
anfangsstandAblesungId | string(uuid) | ja | |
endstand | string | ja | |
anfangsstand | string | ja | |
abgelesenAm | string(date-time) | ja | |
altArchiviertAm | string(date-time) | ja | |
ZaehlerListeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zaehler | array<ZaehlerZeile> | ja | |
ZaehlerPflichtResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
zaehlerart | string | ja | |
anzahlWohneinheiten | integer | ja | Aktive Einheiten der Art wohnung; Gewerbe zählt nicht mit. |
pflicht | ja | nein | ausnahme | nicht-heizkostenv | ja | |
ausnahmeGrund | unwirtschaftlich | pauschal-wechselnd-belegt | null | ja | Grund der Objekt-Option `zaehler.erfassungspflicht_ausnahme`; die Begründung bleibt im Objekt. |
hinweise | array<unter-schwelle | kaltwasser-nicht-zwingend | ausnahme-begruendungspflicht | gewerbe-nicht-gezaehlt> | ja | |
blockiert | false | ja | Immer false: die Prüfung ist ein Hinweis und sperrt nichts. |
ZaehlerPlausibilitaet
| Feld | Typ | Pflicht | Beschreibung |
|---|
status | ok | warnung | ja | |
warnungen | array<ZaehlerPlausibilitaetMeldung> | ja | |
hinweise | array<ZaehlerPlausibilitaetMeldung> | ja | |
ZaehlerPlausibilitaetMeldung
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | VERBRAUCH_NULL | AUSREISSER | ABLESEFENSTER | ja | |
message | string | ja | |
basis | vorjahr | letzter_stand | nein | Nur AUSREISSER: Grundlage des Urteils. |
ZaehlerSammelanlageEinheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
einheitId | string(uuid) | ja | |
zaehlerId | string(uuid) | ja | |
status | angelegt | vorhanden | ja | `vorhanden`: die Einheit hatte schon einen aktiven Zähler dieser Art. |
zaehlernummer | string | null | ja | |
ZaehlerSammelanlageRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
propertyId | string(uuid) | ja | |
meterType | string | ja | |
unitOfMeasure | string | nein | |
meterNoPrefix | string | nein | |
turnusjahr | integer | nein | |
sourceSystem | string | null | nein | Quellsystem eines Imports (z. B. `win-casa`); systemseitige Werte sind verboten. |
sourceRef | string | null | nein | Referenz im Quellsystem. |
einheiten | array<object> | ja | Höchstens 500 Einheiten, jede nur einmal; je Einheit optional eine eigene Nummer (nie zusammen mit einem Nummernkreis). |
ZaehlerSammelanlageResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
zaehlerart | string | ja | |
angelegt | integer | ja | |
vorhanden | integer | ja | |
einheiten | array<ZaehlerSammelanlageEinheit> | ja | |
ZaehlerTauschRequest
| Feld | Typ | Pflicht | Beschreibung |
|---|
readAt | string | ja | Zeitpunkt des Tauschs, ISO-8601-Datum oder -Zeitpunkt (Kalendertag = 00:00 UTC). |
endReading | string | ja | Endstand des Altzählers. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400. |
startReading | string | nein | Anfangsstand des Neuzählers; Standard `0.000`. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400. |
newMeterNo | string | nein | Zählernummer des Neugeräts. |
meterType | string | nein | Art des Neugeräts; Standard die des Altzählers. |
unitOfMeasure | string | nein | Maßeinheit des Neugeräts; Standard die des Altzählers. |
sourceSystem | string | null | nein | Quellsystem eines Imports; systemseitige Werte sind verboten. |
sourceRef | string | null | nein | Referenz im Quellsystem. |
ZaehlerVerbrauchEinheit
| Feld | Typ | Pflicht | Beschreibung |
|---|
einheitId | string(uuid) | null | ja | |
einheitNr | string | null | ja | |
zaehlerart | string | ja | |
masseinheit | string | null | ja | |
verbrauch | string | null | ja | Summe der vollständigen Segmente; null, wenn kein Segment vollständig ist. |
vollstaendig | boolean | ja | true NUR, wenn JEDES beteiligte Segment vollständig ist. |
zaehlerIds | array<string(uuid)> | ja | |
ZaehlerVerbrauchResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
objektId | string(uuid) | ja | |
von | string(date) | ja | |
bis | string(date) | ja | |
vollstaendig | boolean | ja | false, sobald irgendein Segment eine Grenze nicht hat (siehe `fehlend` je Zähler). |
zaehler | array<ZaehlerVerbrauchZaehler> | ja | |
einheiten | array<ZaehlerVerbrauchEinheit> | ja | |
ZaehlerVerbrauchZaehler
| Feld | Typ | Pflicht | Beschreibung |
|---|
zaehlerId | string(uuid) | ja | |
einheitId | string(uuid) | null | ja | |
einheitNr | string | null | ja | |
zaehlerart | string | ja | |
zaehlernummer | string | null | ja | |
masseinheit | string | null | ja | |
ersetztZaehlerId | string(uuid) | null | ja | |
anfangsstand | object | null | ja | |
endstand | object | null | ja | |
verbrauch | string | null | ja | null, solange eine Grenze fehlt. |
vollstaendig | boolean | ja | |
fehlend | array<anfangsstand | endstand> | ja | Ehrlicher Fehlbestand — nie interpoliert. |
ZaehlerZeile
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
objektId | string(uuid) | ja | |
einheitId | string(uuid) | null | ja | null ⇒ Allgemein-Zähler des Objekts. |
einheitNr | string | null | ja | Einheitsnummer; null bei Allgemein-Zählern. |
zaehlerart | string | ja | |
zaehlernummer | string | null | ja | |
masseinheit | string | null | ja | |
ersetztZaehlerId | string(uuid) | null | ja | Vorgänger bei Zählertausch; null ⇒ kein Tausch. |
archiviertAm | string(date-time) | null | ja | null ⇒ aktiv. |
angelegtAm | string(date-time) | ja | |
ZaehlerZwischenstandResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zaehlerId | string(uuid) | ja | |
stichtag | string(date) | ja | |
art | vorschlag | kein-vorschlag | ja | |
zaehlerstand | string | null | ja | Der vorgeschlagene Stand; null bei `kein-vorschlag`. Ein VORSCHLAG, nie ein gebuchter Wert. |
vorher | unbekannt | ja | |
nachher | unbekannt | ja | |
tage | unbekannt | ja | |
code | stand-vorhanden | kein-vorher-wert | kein-nachher-wert | stand-faellt | luecke-zu-lang | null | ja | Warum es keinen Vorschlag gibt; null bei `vorschlag`. |
begruendung | string | ja | Klartext: wie der Vorschlag entstand bzw. warum keiner entsteht. |
gebucht | false | ja | Immer false: der Vorschlag wird nicht gebucht und ist nie ein Wert des Abrechnungslaufs. |
ZaehlerZwischenstandStand
| Feld | Typ | Pflicht | Beschreibung |
|---|
abgelesenAm | string(date) | ja | |
zaehlerstand | string | ja | Dezimal-STRING mit Punkt, Skala 3 (z. B. "161.700"). Nie eine JSON-number. |
ZaehlerZwischenstandTage
| Feld | Typ | Pflicht | Beschreibung |
|---|
luecke | integer | ja | Kalendertage zwischen dem Stand davor und dem Stand danach. |
bisStichtag | integer | ja | Kalendertage zwischen dem Stand davor und dem Stichtag. |
ZeiteintraegeResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
eintraege | array<Zeiteintrag> | ja | |
Zeiteintrag
| Feld | Typ | Pflicht | Beschreibung |
|---|
id | string(uuid) | ja | |
propertyId | string(uuid) | ja | |
bezugArt | objekt | anliegen | sonderleistung | ja | |
bezugId | string(uuid) | null | ja | |
taetigkeitsart | telefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstiges | ja | |
quelle | timer | manuell | ja | |
leistungsdatum | string(date) | ja | |
beginn | string(date-time) | null | ja | Nur Timer. |
ende | string(date-time) | null | ja | null ⇒ der Timer läuft noch (oder manueller Eintrag). |
dauerMinuten | integer | null | ja | null ⇒ der Timer läuft noch. |
notiz | string | null | ja | |
storniertAm | string(date-time) | null | ja | |
stornoGrund | string | null | ja | |
createdAt | string(date-time) | ja | |
ZeitErfasstResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zeitId | string(uuid) | ja | |
dauerMinuten | integer | ja | |
leistungsdatum | string(date) | ja | |
hinweise | array<ZeitHinweis> | ja | |
ZeitGestartetResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zeitId | string(uuid) | ja | |
beginn | string(date-time) | ja | |
leistungsdatum | string(date) | ja | |
hinweise | array<ZeitHinweis> | ja | |
ZeitGestopptResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zeitId | string(uuid) | ja | |
ende | string(date-time) | ja | |
dauerMinuten | integer | ja | |
hinweise | array<ZeitHinweis> | ja | |
ZeitHinweis
| Feld | Typ | Pflicht | Beschreibung |
|---|
code | string | ja | |
timerIds | array<string(uuid)> | nein | Nur bei `timer-an-anderem-objekt`: die laufenden Timer an anderen Objekten. |
ZeitLaufendResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
timer | array<Zeiteintrag> | ja | |
ZeitStorniertResponse
| Feld | Typ | Pflicht | Beschreibung |
|---|
zeitId | string(uuid) | ja | |
storniert | true | ja | |