Zum Hauptinhalt springen

Ausgaben (Expenses)

Zweck

Expense modelliert Ausgaben mit unterschiedlicher Lebensdauer. Pro Datensatz wird über expenseType der Charakter festgelegt:

expenseTypeBedeutungTypische Beispiele
onceEinmal-Ausgabe an einem DatumBuero-Moebel-Kauf, Software-Lizenz auf Dauer
recurringWiederkehrende AusgabeMiete, Strom, Cloud-Abo
contractLaufzeit-Vertrag mit KuendigungsfristTelekommunikations-Vertrag, Wartungs-Vertrag
creditDarlehen/Kredit mit Tilgungs-ComputationAnnuitaeten-Darlehen, KfW, Kontokorrent-Linie

Pro Typ werden dynamische Felder in typeConfig (JSON) gepflegt: SEPA-Mandat, Bankverbindung, Kreditparameter, Vertragsdetails. Computed Fields wie remainingPrincipal und remainingDebtTotal werden bei Krediten berechnet.

Voraussetzungen

- Berechtigung `view:Expense` und `create:Expense`. - Für SEPA-/Kredit-Bank-Auswahl: `view:Bank`. - Für Kostenstellen-Sub-Liste: `view:CostCenter`. - Für Item-Aufteilung: `view:ExpenseItem`.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_Expense, ExpenseListe/Detail aufrufbar
create/update/deleteExpensePflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_EXPENSE
viewBankBank-Selectors für SEPA/KreditAPP_SPEAMCORE_VIEW_BANK
viewCostCenterKostenstellen-Sub-ListeAPP_SPEAMCORE_VIEW_COST_CENTER
viewExpenseItemItem-Aufteilung-Sub-ListeAPP_SPEAMCORE_VIEW_EXPENSE_ITEM
viewDocumentAnhänge-Sub-ListeAPP_SPEAMCORE_VIEW_DOCUMENT

Schritt-für-Schritt-Anleitung

Einmal-Ausgabe

  1. Ausgaben (/expenses) → + Neu.
  2. expenseType = once (nicht editierbar nach Anlage).
  3. name, startDate (Buchungsdatum), amount über Item-Aufteilung pflegen.

Wiederkehrende Ausgabe (z. B. Miete)

  1. expenseType = recurring.
  2. startDate setzen — optional endDate, sonst laufend.
  3. SEPA-Mandat aktivieren, falls Lastschrift verwendet wird → Bank wählen.
  4. Item-Aufteilung pflegen (z. B. Miete + Nebenkosten als zwei Items).

Vertrag mit Kuendigung

  1. expenseType = contract.
  2. Pflichtbereich: cancellationNoticeInMonths, autoExtend, depositAmount.
  3. SEPA-Block analog wie bei Recurring.

Kredit anlegen

  1. expenseType = credit.
  2. Grunddaten: creditType (annuity, bullet, kfw, overdraft, shareholder), loanNumber.
  3. Kredit-Bank über loanBankId wählen.
  4. Lender / Borrower als Texte erfassen.
  5. Darlehenssumme: loanAmount, disbursementDate.
  6. Zinsen: nominalInterestRate und fixedInterestYears.
  7. Sondertilgung: entweder specialRepaymentPercent oder specialRepaymentYearly (sich gegenseitig ausschliessend).
  8. Computed-Fields wie paidMonths, remainingPrincipal, remainingDebtTotal werden read-only vom Backend gepflegt.

Kostenstellen-Verteilung

Sub-Route /expenses/:id/cost-centers — die Ausgabe wird auf Kostenstellen prozentual verteilt.

Item-Aufteilung

Sub-Route /expenses/:id/expenses — eine Ausgabe kann in mehrere Items aufgeteilt werden (z. B. „Buero-Miete" 1.000 EUR aufgeteilt in „Miete" 800 + „Nebenkosten" 200).

Anhänge

Sub-Route /expenses/:id/documents — Verträge, Rechnungen, Tilgungsplaene als Dokumente.

Listenansicht — expenses

Felder und Eingaben (Hauptfelder)

FeldnamePflichtDatentypWirkung beim AusfuellenVoraussetzung
expenseTypeja (read-only nach Anlage)ENUM (once, recurring, contract, credit)Bestimmt die dynamischen Felder.
nameneinStringAnzeigename in Liste und Reports.
amountnein (read-only)DecimalSummen-Anzeige aus Item-Aufteilung.
startDateneinDateBei once: Buchungsdatum. Bei recurring/contract/credit: Beginn.
endDateneinDateBei recurring/contract/credit: Ende.
cronJobIdneinUUIDVerweist auf Cron-Job für wiederkehrende Erzeugung.
parentType/parentIdneinPolymorphOptionale Verknuepfung mit Beleg/Vertrag.
originExpenseIdneinUUIDBei wiederkehrenden Ausgaben: Verweis auf Original-Datensatz.
typeConfigneinJSONDynamische Felder je expenseType.

typeConfig-Felder (Auszug)

BereichFeldBedeutung
SEPAhasSepaMandate, sepaBankIdLastschrift-Bank.
VertragcancellationNoticeInMonths, autoExtend, depositAmountVertrags-Konditionen.
Kredit GrunddatencreditType, loanNumber, loanBankId, lender, borrowerIdentifikation.
Kredit SummeloanAmount, disbursementDateAuszahlung.
Kredit ZinsennominalInterestRate, fixedInterestYearsKonditionen.
Kredit TilgungspecialRepaymentPercent ODER specialRepaymentYearly, repaymentAdjustableSondertilgungen.
Kredit ComputedpaidMonths, remainingPrincipal, remainingDebtTotalBerechnet, read-only.

Toolbar (Detail-Seite)

Schlanke Toolbar oben rechts:

IconAktion (aria-label)CASLWirkung
ZurückgehenZurück zur Liste.
🏠Zur Startseite gehenSpringt auf das Dashboard / /.
⏮/◀/▶/⏭PaginationNavigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung.

Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:

  • KAL. (Mini-Kalender)
  • ZEIT (Persoenliche Wochen-Arbeitszeit)
  • ARBEIT (Eigene bevorstehende Aufträge)

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

  • Cron-Jobs — wiederkehrende Erzeugung neuer Buchungen aus recurring/contract/credit-Ausgaben.
  • Kostenstellen — prozentuale Verteilung pro Ausgabe.
  • Document-Center — Verträge, Rechnungen, Tilgungsplaene.
  • Lieferanten — typischer Counterparty einer Ausgabe (über polymorph parent).

Häufige Fehler und Lösungen

FehlerLösung
Felder erscheinen/verschwinden ohne ErklaerungForm ist expenseType-getriggert. Felder mit invisible: values.expenseType !== "credit" werden ein-/ausgeblendet.
Sondertilgung-Felder beide gegraytEines der beiden Felder ist gesetzt — das andere wird automatisch deaktiviert (Exklusion).
Bank-Selector leerview:Bank-Berechtigung fehlt — Selectors haben requiredAbility: ["view", "Bank"].
Kredit-Computed-Fields zeigen NullBackend-Service hat noch keinen Zinslauf durchgeführt — typischerweise nach erstem disbursementDate-Cron.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/expensesListeview Expense
POST/api/expensesAnlegencreate Expense
GET/api/expenses/:idDetailview Expense
PATCH/api/expenses/:idÄndernupdate Expense
DELETE/api/expenses/:idSoft-Deletedelete Expense
GET/api/expense-cost-centers?filter[expenseId]Kostenstellen-Verteilungview ExpenseCostCenter
GET/api/expense-items?filter[expenseId]Items-Aufteilungview ExpenseItem
GET/api/documents?filter[parentType=Expense]Anhängeview Document

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung mit FE-Tiefe (alle 4 expenseType-Varianten dokumentiert).