> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trassets.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# v1 Accounting Datenmodell: Buchungskopf, -positionen und Budgets

> Feldreferenz für die v1-Accounting-Tabellen booking_header, booking_positions und budgets, umgeformt mit period-, amount- und amount_per_sqm-Objekten.

Die v1-Accounting-Domäne umfasst aktuell drei Tabellen: `booking_header`,
`booking_positions` und `budgets`. `booking_header` und `booking_positions` folgen den
[Response-Shape-Konventionen](/de/v1/response-shape-conventions) — verschachtelte
`period`-/`amount`-Objekte und stabile Join-Keys; `budgets` trägt noch ein offenes Artefakt,
siehe unten.

## booking\_header

`GET /v1/accounting/booking_header` — Hauptbuch-Buchungsköpfe. Kein `period`- oder
`amount`-Objekt: Die Tabelle hat nur ein einzelnes `booking_date`-Feld und ein einzelnes
`booking_value`-Feld, die beiden Konventionen greifen hier strukturell nicht.

<ResponseField name="property_id" type="string" required>
  Eindeutige Objekt-ID.
</ResponseField>

<ResponseField name="booking_header_id" type="integer" required>
  Eindeutige ID des Buchungskopfs. `booking_positions` referenziert dies als
  `booking_header_id`.
</ResponseField>

<ResponseField name="booking_nr" type="integer">
  Buchungsnummer.
</ResponseField>

<ResponseField name="creditor_id" type="string">
  Mit der Buchung verknüpfter Kreditor. Referenziert `Stakeholder.creditor`.
</ResponseField>

<ResponseField name="person_id" type="string">
  Mit der Buchung verknüpfter Mieter oder Ansprechpartner, mit lokaler, objektbezogener
  Nummerierung. Nicht mit demselben ID-Raum wie `person_id` auf
  `Operations.notifications` verwechseln — dort ist es eine eigenständige
  `bigint`-Sequenz aus einem anderen Subsystem.
</ResponseField>

<ResponseField name="booking_date" type="date">
  Datum der Buchung.
</ResponseField>

<ResponseField name="booking_value" type="number">
  Gesamtwert des Buchungskopfs.
</ResponseField>

<ResponseField name="m2" type="number">
  Mit der Buchung verbundene Fläche in Quadratmetern, falls zutreffend.
</ResponseField>

<ResponseField name="booking_text" type="string">
  Freitextbeschreibung der Buchung.
</ResponseField>

<ResponseField name="initial_booking_text" type="string">
  Ursprünglicher Buchungstext, vor einer eventuellen späteren Korrektur.
</ResponseField>

<ResponseField name="booking_barcode" type="string">
  Barcode-Referenz auf das Buchungsdokument, falls gescannt.
</ResponseField>

<ResponseField name="dms_link" type="string">
  Link zum Buchungsdokument im Dokumentenmanagementsystem, falls vorhanden.
</ResponseField>

<ResponseField name="cost_center_id_name_concat" type="string">
  Kombinierte Kostenstellen-ID und -name — die einzige Quelle dieses Labels; es gibt kein
  separates ID/Name-Paar, gegen das sich stattdessen verknüpfen ließe.
</ResponseField>

<ResponseField name="ledger_id_name_concat" type="string">
  Kombinierte Konto-ID und -name, aus demselben Grund wie `cost_center_id_name_concat`.
</ResponseField>

<ResponseField name="person_name_concat" type="string">
  Kombinierte Personen-ID und -name, aus demselben Grund wie `cost_center_id_name_concat`.
</ResponseField>

<ResponseField name="property_structure_account_id" type="string">
  Fremdschlüssel auf `Property.property_structure`, entspricht
  `property_structure.account_id`.
</ResponseField>

## booking\_positions

`GET /v1/accounting/booking_positions` — einzelne Buchungspositionen, über
`booking_header_id` mit einem Kopf verknüpft.

<ResponseField name="property_id" type="integer" required>
  Eindeutige Objekt-ID.
</ResponseField>

<ResponseField name="booking_position_id" type="integer" required>
  Eindeutige ID der Position.
</ResponseField>

<ResponseField name="booking_header_id" type="integer" required>
  ID des übergeordneten Buchungskopfs. Verknüpft sich mit
  `booking_header.booking_header_id`.
</ResponseField>

<ResponseField name="account_id" type="integer" required>
  Konto, auf das die Position gebucht wird. Es gibt noch keinen `/v1/`-Accounts-Endpunkt —
  verknüpfe für Kontostammdaten mit dem unversionierten `Accounting.accounts`.
</ResponseField>

<ResponseField name="contra_account_id" type="integer">
  Gegenkonto für die Buchung.
</ResponseField>

<ResponseField name="contra_account_name" type="string">
  Name des Gegenkontos. Nicht über eine Verknüpfung von `contra_account_id` mit `accounts`
  ableitbar — die beiden entsprechen sich nicht.
</ResponseField>

<ResponseField name="creditor_id" type="integer">
  Mit der Position verknüpfter Kreditor. Referenziert `Stakeholder.creditor`.
</ResponseField>

<ResponseField name="person_id" type="integer">
  Mit der Position verknüpfter Mieter oder Ansprechpartner.
</ResponseField>

<ResponseField name="property_id_person_id" type="integer">
  Zusammengesetzter Schlüssel, der den Mieter identifiziert, auf den sich diese Position
  bezieht. Ähnelt einer Verkettung von `property_id` und `person_id`, ist aber nicht immer
  exakt das — nutze das Feld wie geliefert, statt es selbst abzuleiten.
</ResponseField>

<ResponseField name="period" type="object">
  Buchungszeitraum — `{start, end}` (Datumsstrings).
</ResponseField>

<ResponseField name="amount" type="object">
  Buchungsbetrag — `{net, tax, gross}`.
</ResponseField>

<ResponseField name="amount_per_sqm" type="object">
  Buchungsbetrag, pro Quadratmeter normalisiert — `{net, tax, gross}`.
</ResponseField>

<ResponseField name="account_group" type="string">
  Kontogruppenzuordnung.
</ResponseField>

<ResponseField name="booking_date" type="date">
  Datum der Buchung.
</ResponseField>

<ResponseField name="booking_nr" type="integer">
  Buchungsnummer.
</ResponseField>

<ResponseField name="booking_Lfd_nr" type="integer">
  Laufende Positionsnummer innerhalb der Buchung.
</ResponseField>

<ResponseField name="booking_type" type="integer">
  Buchungstyp-Code.
</ResponseField>

<ResponseField name="booking_position_text" type="string">
  Freitextbeschreibung der Position.
</ResponseField>

<ResponseField name="sh" type="string">
  Soll/Haben-Kennzeichen (`S`/`H`). Nicht aus dem Vorzeichen von `amount.net` ableiten —
  rund 3,55 % der Zeilen (Storno-/Korrekturbuchungen) haben ein Vorzeichen, das diesem
  Kennzeichen widerspricht.
</ResponseField>

<ResponseField name="HNDL" type="number">
  Fachliche Bedeutung noch nicht mit dem Quellsystem geklärt. Rund 99,2 % der Zeilen sind
  `0.0`; wo ungleich null, liegt der Wert oft nahe an `amount.net` und konzentriert sich auf
  bestimmte Buchungstypen im Umfeld umlagefähiger Betriebskosten — passt zu einem
  Korrekturfeld, ist aber nicht bestätigt. Nicht selbst umbenennen oder umdeuten.
</ResponseField>

<ResponseField name="property_structure_account_id" type="string">
  Fremdschlüssel auf `Property.property_structure`, entspricht
  `property_structure.account_id` — derselbe Join-Key wie bei `booking_header`.
</ResponseField>

## budgets

`GET /v1/accounting/budgets` — Budgetbeträge, eine Zeile pro Objekt, Konto und Monat.

<ResponseField name="property_id" type="integer" required>
  Eindeutige Objekt-ID.
</ResponseField>

<ResponseField name="account_id" type="integer" required>
  Konto, für das das Budget gilt. Umbenannt aus dem unversionierten `account_hdr_id` —
  verknüpft sich mit dem unversionierten `Accounting.accounts.account_hdr_id` (es gibt noch
  keinen `/v1/`-Accounts-Endpunkt).
</ResponseField>

<ResponseField name="account_number" type="integer">
  Kontonummer. Hier ein Integer, während die unversionierte Entsprechung
  (`accounts.account_id`) ein String ist.
</ResponseField>

<ResponseField name="date" type="date" required>
  Monat, für den die Budgetzeile gilt.
</ResponseField>

<ResponseField name="budget" type="number" required>
  Budgetbetrag für den jeweiligen Monat und das jeweilige Konto.
</ResponseField>

<ResponseField name="property_id_account_number" type="integer">
  Sync-Pipeline-Artefakt, noch nicht aufgelöst. Die
  [Response-Shape-Konventionen](/de/v1/response-shape-conventions) sehen vor, unverifizierbare
  Artefakte wie dieses zu entfernen — nicht darauf aufbauen, es kann in einer künftigen
  Revision entfernt werden.
</ResponseField>
