Zum Hauptinhalt springen

Buchhaltungskonten (TransactionAccount)

Zweck

TransactionAccount repraesentiert ein Buchhaltungskonto im Sinne des Kontenrahmens (z. B. SKR03). Konten sind hierarchisch organisiert (parentTransactionAccountId), koennen mit einer externen Quelle verknuepft sein (isExternal, parentType polymorph zu BankAccount, PayPalAccount o. ae.) und tragen einen Lebenszyklus-Status (active, inactive, pending).

Die FE-Route [/transaction-accounts](/transaction-accounts) (Komponente `TransactionAccountListPage`) existiert für die Verwaltung. Massen-Anlage erfolgt typischerweise über die Ersteinrichtung ([Setup-Wizard Schritt 4](/setup-wizard) — „Standards (DE) laden" importiert ~250 SKR03-Konten). Manuelle Pflege einzelner Konten geschieht direkt in der Routen-Seite.

Modell

FeldTypBedeutung
idUUIDPrimary Key
displayNameStringAnzeigename („1200 Bank", „4400 Erloese")
currencyStringDefault EUR
statusAuswahlactive, inactive, pending
parentTransactionAccountIdUUIDEltern-Konto für die Hierarchie (self-referential)
parentId + parentTypepolymorphexterne Quelle (z. B. BankAccount) — null bei manuellen Konten
isExternalBooleanKonto wird automatisch synchronisiert
lastSyncAtDateTimeLetzter Sync-Zeitpunkt (read-only)
externalIdStringID des externen Datensatzes

Hierarchie

Konten sind in einem Baum organisiert. Beispiel SKR03:

Aktiva
├── Anlagevermoegen
│ └── 0500 Geschaeftsausstattung
└── Umlaufvermoegen
├── 1200 Bank
└── 1400 Forderungen

GET /api/transaction-accounts ruft im Backend einen Tree-aware Listing-Handler auf (listWithHierarchy), der über Root-Konten paginiert (parentTransactionAccountId IS NULL) und die Children komplett mitlaedt. Bei aktivem Filter oder Suche faellt der Handler auf flache Pagination zurück.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewTransactionAccountListe/Detail lesenAPP_SPEAMCORE_VIEW_TRANSACTION_ACCOUNT
create/update/deleteTransactionAccountKonto pflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_TRANSACTION_ACCOUNT

In der Praxis bekommen nur Buchhaltungs- und Admin-Rollen update:TransactionAccount. Das Importieren des SKR03-Standards über den Setup-Wizard erzeugt die Konten technisch — Endanwender sehen sie als Auswahl in Konten-Selects (expenseAccountId, revenueAccountId, accountId) auf Belegen und Produkten.

Verknuepfungen

Wo das Subject als FK auftauchtBedeutung
Product.accountId / Product.expenseAccountIdErloes-/Aufwandskonto eines Produkts
SalesDocument.revenueAccountIdErloeskonto je Beleg
PurchaseDocument.expenseAccountIdAufwandskonto je Beleg
Branch.primaryTransactionAccountId / Branch.secondaryTransactionAccountIdNiederlassungs-Bankkonten
BankAccountTransactionAccountexterne Quelle (Sync)

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/transaction-accountsListe mit Tree-Pagination (listWithHierarchy)view TransactionAccount
GET/api/transaction-accounts/:idDetailview TransactionAccount
POST/api/transaction-accountsManuell anlegencreate TransactionAccount
PATCH/api/transaction-accounts/:idÄndernupdate TransactionAccount
DELETE/api/transaction-accounts/:idSoft-Deletedelete TransactionAccount

Drift-Risiken

  1. Keine FE-Seite — Endanwender koennen Konten nur indirekt sehen. Wer einen falsch importierten Kontenrahmen korrigieren will, muss API oder DB nutzen.
  2. Zirkulaere Referenzen in parentTransactionAccountId werden nicht geprüft.
  3. isExternal und parentType muessen konsistent gesetzt sein — wenn isExternal = true und parentId null, gibt es keine Sync-Quelle.

Stand der Doku (nach Welle 17): Eine eigene FE-Seite /transaction-accounts ist live mit Tree-Aware-Pagination — der Punkt aus dem TODO ist erledigt. Verwaltung erfolgt nicht mehr ausschliesslich über den Setup-Wizard.

Verknuepfungen

Versionshinweise

  • 2026-04-29: Initiale Veroeffentlichung.