Zum Hauptinhalt springen

Offene Posten — Verarbeitung (OpenItems)

Zweck

Die Seite /open-items ist die zentrale Verarbeitungsoberflaeche für offene Posten — sowohl Forderungen (receivable) als auch Verbindlichkeiten (payable). Anders als die fokussierten Sichten /customer-open-items und /supplier-open-items zeigt diese Seite alle offenen Posten parallel und gruppiert sie nach Counterparty (Kunde oder Lieferant). Pro Counterparty werden alle zugehörigen offenen Posten aufgelistet, KPIs aggregiert und der Verarbeitungs-Workflow über das Transaction-Modal angeboten.

OpenItem ist polymorph: parentType ist SalesDocument oder PurchaseDocument, parentId der Beleg-Verweis. Jeder offene Posten gehört genau einem Beleg an.

Voraussetzungen

- Berechtigung `view:OpenItem`. - Für Zahlung erfassen: `view:Transaction`, `create:Transaction`, `view:TransactionAllocation`. - Mindestens ein Verkaufs- oder Bestellbeleg, der einen offenen Posten erzeugt hat.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_OpenItem, OpenItemListe/Detail aufrufbar
updateOpenItemManuell Settlement-Status korrigierenAPP_SPEAMCORE_UPDATE_OPEN_ITEM
view/createTransactionZahlung erfassenAPP_SPEAMCORE_VIEW/CREATE_TRANSACTION
viewTransactionAllocationAllokationen anzeigenAPP_SPEAMCORE_VIEW_TRANSACTION_ALLOCATION
viewSalesDocument, PurchaseDocumentBeleg-Daten in Liste/DetailAPP_SPEAMCORE_VIEW_SALES_DOCUMENT, PURCHASE_DOCUMENT
viewCustomer, SupplierCounterparty-SpalteAPP_SPEAMCORE_VIEW_CUSTOMER, SUPPLIER

Schritt-für-Schritt-Anleitung

Posten verarbeiten

  1. Offene Posten (/open-items) öffnen.
  2. KPI-Karte wählen — z. B. „Faellig" oder „Bezahlt (30 Tage)".
  3. Counterparty-Grid links wählen — listet Kunden und Lieferanten mit summierten offenen Betraegen.
  4. Detail-Panel rechts zeigt alle offenen Posten der gewählten Counterparty.
  5. Posten markieren → Zahlung erfassenOpenItemTransactionModal öffnet sich mit Vorbefuellung.
  6. Transaktion erfassen — zugehörige TransactionAllocation wird angelegt, Settlement-Status des Posten aktualisiert.

Settlement-Filter

Multi-Select für Status:

  • open — komplett offen.
  • partial — teilweise bezahlt.
  • settled — komplett ausgeglichen (standardmaessig ausgeblendet, für Historie sichtbar).
  • overpaid — ueberzahlt (Erstattung erforderlich).

Storno-Modus

Modal kann zwischen payment und reversal geschaltet werden — ein Reversal storniert eine bestehende Allokation.

Brutto-/Netto-Toggle

showNet-Switch wechselt zwischen Brutto- und Netto-Anzeige (Steuer separat ausgewiesen).

Listenansicht — open-items

UI-Elemente

Komponente: KpiSummaryCards

Karten mit aggregierten Counts/Summen pro KPI-Filter (all, open, due, paid30, overpaid).

Komponente: CounterpartyGrid

Liste der Kunden + Lieferanten mit aggregiertem offenem Betrag. Klick selektiert Counterparty und filtert das Detail-Panel.

Komponente: OpenItemDetailPanel

Posten-Liste der gewählten Counterparty. DataGridPremium mit Spalten: Beleg-Nummer, Datum, Brutto/Netto, Offen, Faellig-Datum, Status.

Komponente: OpenItemTransactionModal

Modal zum Erfassen einer Zahlung oder Stornierung. Vorbefuellt mit Posten-Daten und Restbetrag.

Felder und Eingaben (lesend pro OpenItem)

FeldnameDatentypBedeutung
parentTypeENUM (SalesDocument, PurchaseDocument)Beleg-Typ.
parentIdUUIDVerweis auf Beleg.
directionENUM (receivable, payable)Forderung oder Verbindlichkeit.
amountDecimalBrutto-Originalbetrag des Postens.
outstandingAmountDecimal (berechnet)Noch offener Betrag = amount − Summe aller Allokationen.
dueDateDateFaelligkeit. Wird aus Beleg-paymentTarget abgeleitet.
settlementStatusENUM (open, partial, settled, overpaid, partiallyPaid)Berechneter Status.

Welche Belege einen offenen Posten erzeugen

Ein offener Posten entsteht nur für buchhalterisch relevante Belege. Angebote, Auftragsbestätigungen und Lieferscheine bekommen keinen offenen Posten — ein etwaiger Altlast-Eintrag wird beim Sperren automatisch entfernt.

QuelleBelegtypen mit offenem Posten
Verkauf (SalesDocument)invoice, interimInvoice, finalInvoice, creditNote, correctionInvoice, depositInvoice
Einkauf (PurchaseDocument)incomingInvoice

Dieser Billable-Guard (isBillableDocument) greift beim Anlegen (createOpenItemForDocument). Da der Eindeutigkeits-Index auch soft-gelöschte Zeilen abdeckt, wird beim erneuten Sperren ein zuvor soft-gelöschter Posten wiederbelebt statt doppelt angelegt (siehe Hinweis weiter unten).

Beleg-gegen-Beleg-Ausgleich (OpenItemSettlement)

Zwei offene Posten können sich ohne Bankzahlung gegeneinander ausgleichen — typischerweise eine Storno-Gutschrift gegen die Original-Rechnung beim Korrigieren. Dafür gibt es das Modell OpenItemSettlement:

FeldBedeutung
invoiceDocumentId / invoiceDocumentTypeRechnungsseite — der positive offene Posten, der abgebaut wird
creditDocumentId / creditDocumentTypeGutschrift-/Storno-Seite — der negative offene Posten, der verbraucht wird
amountverrechneter Betrag
reasonGrund (Default correction)
createdByEmployeeIdauslösender Mitarbeiter

computeOpenItemState rechnet diese Verrechnungen in den bezahlten Betrag (paidAmount) ein. Beispiel: Original-Rechnung 100 € und Storno-Gutschrift −100 € gleichen sich aus → beide offenen Posten gehen auf settled, ohne dass sich am Hauptbuch (GL) etwas bewegt.

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

Häufige Fehler und Lösungen

FehlerLösung
Counterparty fehlt im GridKein offener Posten oder alle bereits settled und Filter blendet sie aus.
outstandingAmount weicht vom Erwarteten abAllokation prüfen — z. B. fehlerhafte Doppel-Zahlung.
Modal vorbefuellt mit falschem KontotransactionPrefill haelt Voreinstellungen — bei wiederholter Nutzung Cache leeren oder neue Auswahl treffen.
Settlement-Status stimmt nichtAllokationen laufen über Transaction-Service. Status wird beim Speichern neu berechnet.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/open-itemsListe (mit include=salesDocument,purchaseDocument,...)view OpenItem
GET/api/open-items/:idDetailview OpenItem
PATCH/api/open-items/:idSettlement-Status manuell korrigierenupdate OpenItem
POST/api/open-items/regenerateOffene(n) Posten zu einem Beleg neu erzeugenview OpenItem
POST/api/open-items/reconcile-tivappOP-Export aus TIVApp (Excel) gegen SpeamCore abgleichenview OpenItem
POST/api/transactionsZahlung erfassen (loest Allokation aus)create Transaction
GET/api/transaction-allocations?filter[openItemId]Allokationen pro Postenview TransactionAllocation
Fehlt zu einem gesperrten/finalisierten Beleg der offene Posten (z. B. weil er vor einem Fix gebucht wurde), lässt er sich über `POST /open-items/regenerate` **neu erzeugen**. Außerdem wird beim erneuten Sperren eines Belegs ein zuvor soft-gelöschter `OpenItem` **wiederbelebt** (statt doppelt angelegt), und es gibt einen Backfill für Altbestände.

Versionshinweise

  • 2026-06-22: Billable-Guard dokumentiert (offene Posten nur für Rechnungs-/Gutschrift- bzw. Eingangsrechnungs-Typen; Altlasten werden bereinigt) und Beleg-gegen-Beleg-Ausgleich (OpenItemSettlement) — Storno-Gutschrift gegen Original ohne GL-Bewegung. Verifiziert an openItem.service.ts (BILLABLE_SALES_TYPES, isBillableDocument, computeOpenItemState) und openItemSettlement.model.ts.
  • 2026-06-09: Endpoint POST /open-items/regenerate (offenen Posten pro Beleg neu erzeugen) ergänzt; Hinweis zu Wiederbelebung soft-gelöschter OpenItems beim Relock + Backfill. Verifiziert an openItem.router.ts (regenerateOpenItem).
  • 2026-06-09 (Nachmittag): TIVApp-OP-Abgleich (POST /open-items/reconcile-tivapp, Excel-Upload, view:OpenItem) — gleicht einen offenen-Posten-Export aus dem Drittsystem TIVApp gegen SpeamCore ab. Verifiziert an tivAppReconciliation.service.ts.
  • 2026-04-30: Initiale Veroeffentlichung.