Dokumentation der Logik zur Erstellung Lastschriftpositionen und Aufträgen.

Grund der Überarbeitung

Aktuell können lediglich Abschlagsforderungen sowie Forderungen aus Rechnungen eingezogen werden. Die Lastschriftaufträge werden derzeit innerhalb des Sollstellungslaufs und des Rechnungslaufs erstellt. Dies hat einige Nachteile

  • Es ist kein Lastschrifteinzug für Rechnungen möglich, wenn der Rechnungslauf ausgeplant werden soll
  • Die Erstellung der Lastschriftaufträge erfolgt durch uneinheitlichen Code, was den Wartungsaufwand erhöht
  • Der Lastschrifteinzug für Rechnungen ist inperformant
  • Bei Problemen innerhalb des Lastschrifteinzugs ist ebenfalls die Rechnungstellung bzw. Abschlagsollstellung blockiert

Ziel ist es daher, das Datenmodell und den Prozess so umzugestalten, dass in der finalen Auslieferung

  • Forderungen per Lastschrift eingezogen werden können, unabhängig vom Typ
  • die Nachvollziehbarkeit für erstellte Lastschriftpositionen gewährleistet ist
  • Der Lastschrifteinzug in einem unabhängigen Prozess erfolgt
  • Der Lastschrifteinzug performant, fehlertolerant und wartbar erfolgt

Datenmodell und Persistenz

Das neue Objekt Lastschriftpositionen dient dazu, Forderungen für den Lastschrifteinzug vorzumerken. Der tatsächliche Einzug erfolgt abhängig von der GlobalProperty DIRECT_DEBIT_POSITION_EXECUTION_OFFSET im Zusammenhang mit der Fälligkeit der Forderung. In der Ansicht Lastschriftpositionen werden diese angezeigt.

Zur Persistierung der Daten werden folgende Tabellen verwendet:

  • FL_DirectDebitPosition
  • FL_DirectDebitPositionState
  • FL_DirectDebitPositionEntryMapping

Lastschriftpositionen können einen der folgenden Status annehmen:

  • OPEN (Offen)
    Dieser Status beschreibt im Normalfall eine neue Position, die über eine bestimmte Quelle (z.B. Aktivierung einer Rechnung mit Forderungsbetrag) in die Relation FL_DirectDebitPosition aufgenommen wurde. Diese Position steht zur Verarbeitung durch den DebitOrderCreation-Prozess bereit.
  • CANCELLED (Abgebrochen)
    Solange eine Lastschriftposition noch nicht ausgeführt wurde (d.h. die Position wurde noch nicht in einem Lastschriftauftrag verarbeitet, kann diese abgebrochen werden. Dies kann manuell über die Ansicht Lastschriftpositionen erfolgen. Das Abbrechen einer Lastschriftposition wird aber auch in einigen Fällen automatisch durchgeführt.
  • EXECUTED (Ausgeführt)
    Gemäß ihres Fälligkeitsdatums vom DebitOrderCreation-Prozess selektiert und in einem Lastschriftauftrag verarbeitet. Nur Positionen, die zuvor im Status OFFEN oder ERROR waren, können diesen Status erreichen.
  • REVERTED (Storniert)
    Wurde eine Position bereits in einem Lastschriftauftrag verarbeitet, kann die Position in den Status REVERTED übergehen. Dies ist der Fall, wenn der Lastschriftauftrag storniert wird oder eine Rücklastschrift erfolgt.
  • ERROR (Fehler)
    Kommt es innerhalb des Lastschriftlaufs zu einem technischen oder fachlichen Fehler (siehe Validierung im Lastschrifteinzug), so dass die Position nicht in einem Lastschriftauftrag verarbeitet werden kann, wird die Position auf ERROR gesetzt. Zusätzlich wird ein Fehler-Log geschrieben, welches ebenfalls in der Ansicht Lastschriftpositionen einsehbar ist. Die Verarbeitung der Position wird im nächsten Lauf erneut versucht.

Statuswechsel von Lastschriftpositionen

Statuswechsel von Lastschriftpositionen
Abbildung:Statuswechsel von Lastschriftpositionen

Lastschriftauftrag stornieren

Wird ein Lastschriftauftrag storniert, werden wie oben beschrieben, die in dem Lastschriftauftrag verarbeiteten Lastschriftpositionen in den Status REVERTED gesetzt. Damit die Forderungen erneut eingezogen werden können, wird eine Kopie der Lastschriftpositionen im Status OPEN angelegt. Dies kann selbstverständlich nur für Lastschriftaufträge erfolgen, die bereits auf Basis von Lastschriftpositionen erzeugt wurden. Wird ein Lastschriftauftrag nach dem Releasewechsel auf MBS 141.0 storniert, der vor dem Releasewechsel auf 141.0 erstellt wurde, ist es technisch nicht möglich automatisiert Lastschriftpositionen für die entsprechenden Forderungen zu erstellen. Die Lastschriftpositionen können jedoch manuell über die UI erstellt werden.

Buchung einziehen

Auf dem Debitorenkonto gibt es eine Möglichkeit Buchungen manuell einzuziehen. Dies ist zum Beispiel erforderlich, wenn eine Lastschriftposition abgebrochen wurde. Ein möglicher Use-Case wäre, dass die Forderung mit einem vorhandenen Guthaben teilgedeckt wird (Hierzu muss die Ausgleichsperre aufgehoben werden, wodurch die Lastschriftposition abgebrochen wird). Soll dann die restliche Forderung eingezogen werden, kann dies über den Ribbon-Button Buchung einziehen auf dem Debitorenkonto erfolgen.

Prozessdiagramm DirectDebitPositionExecutionProcess
Abbildung:Debitorenkonto, Buchung einziehen

Rücklastschriften

Erfolgt eine Rücklastschrift, so wird die Lastschriftposition, auf die der zugehörige Lastschrifteinzug basiert, in den Status REVERTED überführt. Das System kann mittels der GlobalProperty BACK_DEBIT_CHANGE_PAYMENT_METHOD konfiguriert werden, ob der Zahlweg auf Überweisung umgestellt werden oder ob ein erneuter Lastschrifteinzug stattfinden soll. Im Falle, dass der Zahlweg bestehen bleibt (BACK_DEBIT_CHANGE_PAYMENT_METHOD = false), wird eine Kopie der stornierten Lastschriftposition mit dem Status OFFEN erzeugt, so dass ein erneuter Einzug stattfinden kann.

Zusammenhang zwischen Ausgleichssperre und Lastschriftposition

Forderungen, die mittels einer Lastschriftposition vorgemerkt sind, werden im Debitorenkonto weiterhin als offen angezeigt. Damit keine automatischen oder manuellen Deckungen oder anderweitige Verrechnungen erfolgen werden solche Positionen mit einer Ausgleichssperre versehen. Die Ausgleichssperre wird mit dem Sperrgrund Lastschriftposition erzeugt. Dies hat besondere Auswirkungen auf die Sperre.

Anlegen von Lastschriftpoitionen

Beim Anlegen von Lastschriftpositionen erfolgt keinerlei Validierung. Es wird beispielsweise nicht geprüft, ob ein aktuell gültiges Sepa-Mandat oder ein gültiges Auszahlungskonto vorhanden ist oder eine Einzugssperre vorliegt. Diese Validierungen werden erst im eigentlichen Lauf durchgeführt, da zwischen Erstellung der Lastschriftposition und das Ausführen der Lastschriftposition sich der Datenbestand jederzeit ändern kann. Für das Anlegen einer Lastschriftposition ist lediglich relevant, ob die Zahlweise des Kunden auf Lastschrift oder Überweisung steht.

Prozess zur Erstellung von Lastschriftaufträgen

Damit sollen (perspektivisch) alle Einzelprozesse (InvoiceOrderCreation, DebitOrderCreation), die aktuell existieren, abgelöst werden. Alle Lastschriftpositionen unabhängig der Quelle (Rechnung, Abschlag, Gebühren…) sollen über diesen Prozess abgedeckt werden. Eine Unterteilung von Lastschriftdateien erfolgt nur noch anhand der Sparte d.h. die bisherige Trennung zwischen Sollstellungen und Rechnungen ist im finalen Prozess nicht mehr gegeben.

Der Name des neuen Prozesses wurde mit DirectDebitPositionExecutionProcess definiert. Der Job wird automatisch jeden Tag um 5 Uhr morgens ausgeführt, kann jedoch bei Bedarf auch manuell über die Ansicht Lastschriftpositionen gestartet werden. Das “Ausführen” einer Position ist die Erstellung einer Lastschriftdatei (DirectDebitMessage).

Prozessdiagramm DirectDebitPositionExecutionProcess
Abbildung:Prozessdiagramm DirectDebitPositionExecutionProcess

Validierungen

Innerhalb des Lastschriftlaufs werden Validierungen durchgeführt. Schlägt eine Validierung fehl, so wird die Lastschriftposition nicht in dem Lastschriftauftrag verarbeitet. Stattdessen wird die Lastschriftposition in den Status ERROR überführt und mit sprechendem Fehler-Log (Das entspricht dem Feld exceptionLog_ in der Tabelle FL_DIRECTDEBITPOSITION) versehen. Dies ist in der Ansicht Lastschriftpositionen einsehbar und ersetzt die Erzeugung einer Aufgabe. Folgende Validierungen wurden umgesetzt:

  • Validiere BankAccount (vgl. InvoiceOrderCreation → BankAccountValidatorDelegate → BankAccountValidator)
  • Validiere Vertrag hat Zahlungsweg “Lastschrift”
  • Aktuelles SEPA-Mandat vorhanden
  • Es gibt keine aktuelle Einzugssperre auf Beleg-Ebene der Position, des Vertrags oder des Geschäftspartners
  • Betrag der Position entspricht weiterhin der Summe der Forderung