Zum Hauptinhalt springen

Match-Vorschläge (TransactionMatchProposals)

Zweck

TransactionMatchProposal modelliert den OP-Matching-Workflow: pro Transaktion werden ein oder mehrere Vorschläge erzeugt, die die Transaktion einem Offenen Posten (Debitor / Kreditor) zuordnen — also Forderungen oder Verbindlichkeiten ausgleichen. Jeder Vorschlag hat einen confidence-Score (0–100) und matchReasons mit Detail-Begründungen.

Die Liste ist die globale Verwaltungssicht; das fokussierte Tagesgeschäft läuft im /transaction-cockpit. Hier hingegen können Vorschläge per Bulk freigegeben, ein neuer Matching-Lauf gestartet und Vorschläge endgültig gelöscht werden.

**TransactionMatchProposal ≠ TransactionAllocation.** Beide Workflows leben nebeneinander, decken aber unterschiedliche Aufgaben ab:
TransactionMatchProposalTransactionAllocation
ZweckOP-Matching gegen Debitor/KreditorSKR-Kontierung + Booking
ZielOffener Posten (Forderung/Verbindlichkeit)Konto, Steuer, Auftrag, Beleg, Auslage
EngineRegel-basiert (Betrag, IBAN, Referenz-Match)Score-Engine (Expense / KI / Account-Default)
Ergebnis bei ApproveOP gilt als ausgeglichenAllocation gebucht, AccountEntries erzeugt
matchingStatus der Txmanually_matched / auto_matchedmanually_matched / auto_matched (gleich)
API-Stamm/transaction-match-proposals/transaction-allocations, /transactions/:id/allocation-proposal

In der Praxis: Erst Match-Proposals abarbeiten (OP ausgleichen), dann ggf. die Allocation-Engine für die SKR-Buchung anschauen. Beim Cockpit-Workflow „Bestätigen & Buchen" wird die Allocation erzeugt; OP-Matches sind ein paralleler Schritt für Belege, die als Forderung/Verbindlichkeit erfasst wurden.

Voraussetzungen

- Berechtigung `view:TransactionMatchProposal`. - Für Bulk-Approve und Reject: `update:TransactionMatchProposal`. - Für den Matching-Lauf: Custom-Action `do:RunTransactionMatching`. - Buchungsdaten in [Transaktionen](/transactions) und [Offenen Posten](/customer-open-items) muessen vorhanden sein.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_TransactionMatchProposal, TransactionMatchProposalListe/Detail aufrufbar
updateTransactionMatchProposalFreigeben/Ablehnen, Bulk-ApproveAPP_SPEAMCORE_UPDATE_TRANSACTION_MATCH_PROPOSAL
deleteTransactionMatchProposalVorschlag entfernenAPP_SPEAMCORE_DELETE_TRANSACTION_MATCH_PROPOSAL
doRunTransactionMatchingMatching-Lauf manuell anstossenAPP_SPEAMCORE_DO_RUN_TRANSACTION_MATCHING

Schritt-für-Schritt-Anleitung

Matching-Lauf starten

  1. Match-Vorschläge (/transaction-match-proposals) öffnen.
  2. Matching ausführen klicken — POST /api/transaction-match-proposals/run-matching.
  3. Backend-Service vergleicht alle offenen Transaktionen mit offenen Posten und Belegen, scort und schreibt neue Vorschläge in die Tabelle.
  4. Liste aktualisiert sich automatisch (TanStack-Query-Invalidation).

Einzel-Vorschlag freigeben oder ablehnen

In der Listen-Zeile stehen drei Aktionen zur Verfuegung:

  • FreigebenPOST /api/transaction-match-proposals/:id/approve. Status wird approved, Allokation entsteht, Transaktion wird manually_matched.
  • AblehnenPOST /api/transaction-match-proposals/:id/reject. Status wird rejected, kein Effekt auf Transaktion.
  • LöschenDELETE /api/transaction-match-proposals/:id. Vorschlag wird permanent entfernt.

Bulk-Approve

Mehrere Vorschläge markieren → Bulk-FreigebenPOST /api/transaction-match-proposals/bulk-approve mit IDs im Body.

Listenansicht — transaction-match-proposals

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)

UI-Elemente

Confidence-Farbcodes

ConfidenceZeilen-HintergrundBedeutung
95 – 100gruenHohe Wahrscheinlichkeit, oft Auto-Apply
50 – 94gelbPrüfen empfohlen
0 – 49rotWahrscheinlich Fehl-Match
Status approved / auto_appliedhellgruenBereits zugeordnet
Status rejectedgrauVerworfen

Button: „Matching ausführen"

Sichtbar nur bei do:RunTransactionMatching-Berechtigung. Loest synchronen Backend-Lauf aus, der pro offene Transaktion bis zu N Vorschläge erzeugt.

Felder und Eingaben (lesend)

FeldnameDatentypBedeutung
transactionIdUUIDVerweis auf Transaktion.
openItemIdUUID (nullable)Verweis auf Offenen Posten. null bei Cross-Source-Match.
documentId + documentTypeUUID + ENUM (SalesDocument, PurchaseDocument)Polymorph-Verweis auf Beleg.
linkedTransactionIdUUID (nullable)Cross-Source-Verweis (z. B. Bank-Buchung gegen Pleo-Buchung).
confidenceInteger (0–100)Score.
matchReasonsJSON-ArrayListe mit type, score, detail.
statusENUMpending, approved, rejected, auto_applied.

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

Häufige Fehler und Lösungen

FehlerLösung
Matching-Lauf ohne WirkungKeine offenen Transaktionen oder keine offenen Posten. Status der Transaktionen prüfen.
Vorschlag mit confidence = 0Match-Reasons prüfen — meist liegt nur eine schwache Korrelation vor (z. B. nur Betrag).
Auto-Apply trotz hoher Confidence nicht erfolgtAuto-Apply-Schwelle ist konfigurierbar (Default confidence ≥ 95). Bei manuell konfigurierten Schwellen prüfen.
Bulk-Approve schlaegt fehlEine der Transaktionen ist bereits gematcht — Vorschläge für bereits gematchte Transaktionen werden serverseitig abgelehnt.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/transaction-match-proposalsListe (mit include=transaction,openItem)view TransactionMatchProposal
GET/api/transaction-match-proposals/:idDetailview TransactionMatchProposal
POST/api/transaction-match-proposals/:id/approveFreigebenupdate TransactionMatchProposal
POST/api/transaction-match-proposals/:id/rejectAblehnenupdate TransactionMatchProposal
POST/api/transaction-match-proposals/bulk-approveBulk-Freigebenupdate TransactionMatchProposal
POST/api/transaction-match-proposals/run-matchingMatching-Laufdo RunTransactionMatching
DELETE/api/transaction-match-proposals/:idLöschendelete TransactionMatchProposal

Versionshinweise

  • 2026-05-16 (Welle 129): Abgrenzung zu TransactionAllocation ergänzt — beide Modelle koexistieren, decken unterschiedliche Aufgaben ab (OP-Matching vs. SKR-Kontierung). Keine inhaltlichen Änderungen am Match-Workflow selbst.

Frühere Versionen

  • 2026-04-30: Initiale Veroeffentlichung.