Veränderung der Buchungslogik im elektronischen Kontoauszug
Mithilfe des BadIs FEB_BADI kann bei Bedarf umfänglich Einfluss auf die Buchungslogik des elektronischen Kontoauszugs genommen werden. Der BadI wird nach Interpretation vor der Verbuchung gerufen. Dabei werden die von der Standardverarbeitung generierten Buchungssätze in Tabellenform (Struktur FTPOST) bereitgestellt. Der Aufbau der Buchungstabelle ist dabei wie folgt:
|
STYPE Satztyp K = Belegkopf P = Belegposition |
COUNT Zähler für Belegkopf bzw. Belegzeile (Buchungsschnittstelle) |
FNAM Feldname Batch-Input |
FVAL Feldwert Batch-Input (Beispielwert) |
|
K |
1 |
BKPF-BUDAT (Buchungsdatum) |
01.03.2014 |
|
K |
1 |
BKPF-BLDAT (Belegdatum) |
01.03.2014 |
|
K |
1 |
BKPF-BUKRS (Buchungskreis) |
0001 |
|
K |
1 |
… |
… |
|
P |
1 |
BSEG-BSCHL (Buchungsschlüssel) |
40 |
|
P |
1 |
BSEG-HKONT (Sachkonto) |
471100 |
|
P |
1 |
BSEG-WRBTR (Betrag in Belegwährung) |
100,00 |
|
P |
1 |
BSEG-ZUONR (Zuordnung) |
123456789 |
|
P |
1 |
BSEG-SGTXT |
Belegposition 1 |
|
P |
1 |
… |
… |
|
P |
2 |
BSEG-BSCHL (Buchungsschlüssel) |
50 |
|
P |
2 |
BSEG-HKONT (Sachkonto) |
471200 |
|
P |
2 |
BSEG-WRBTR (Betrag in Belegwährung) |
100,00 |
|
P |
2 |
BSEG-ZUONR (Zuordnung) |
123456789 |
|
P |
2 |
BSEG-SGTXT |
Belegposition 2 |
|
P |
2 |
… |
… |
Der BadI-Aufruf erfolgt zudem getrennt nach Buchungsbereich (Import-Parameter I_POSTING_AREA, 1 = Bankbuchhaltung, 2 = Nebenbuch).
Das Verfahren soll an folgendem Beispiel erläutert werden:
Im Kontoauszug werden Gutschriften von einem Zahlungskartenprovider gesendet. Der hierbei ausgewiesene Betrag ist bereits um die Transaktionsgebühr reduziert (Zahlung des Kunden über 100,--, gutgeschrieben wird der Betrag abzüglich 3% Provision, also 97,--). Das Unternehmen möchte den Gebührenanteil auf ein separates Gebühren-Konto mit Ausweis der Vorsteuer buchen. In der Standard-Eingangsverarbeitung ist der Geschäftsvorfall entsprechend gecustomized worden, dass im Buchungsbereich 1 (Bankbuchhaltung) folgender Buchungssatz erzeugt wird:
Per Bank (97,--) an Zahlungskartenverrechnungskonto (97,--)
Mithilfe des vorliegenden BadIs soll die Buchung nun so umgestaltet werden, dass folgender Buchungssatz herauskommt:
Per Bank (97,--)
Gebühr (2,70) -> KST 4711
VSt (--,30) an Zahlungskartenverrechnungskonto (100,--)
Hierzu sind demnach folgende Manipulationen an der Buchungstabelle notwendig:
- Anpassen des Betrages in der Belegposition „Zahlungskartenverrechnungskonto“
- Hinzufügen der Gebührenposition unter Angabe des entsprechenden Steuerkennzeichens und der Kostenstelle
- Aktivieren der Funktion „Steuer rechnen“ im Belegkopf
Dazu wird mithilfe der Transaktion SE19 eine Implementierung des BadIs FEB_BADI angelegt und geeignetes Coding zur Methode CHANGE_POSTING_DATA eingefügt:
METHOD if_ex_feb_badi~change_posting_data.
DATA: ls_ftpost TYPE ftpost,
l_string TYPE string,
ls_febre TYPE febre,
l_fees TYPE string,
l_brutto TYPE p DECIMALS 2,
l_len TYPE sy-index,
l_count TYPE count_pi.
CONSTANTS: lc_feeaccount TYPE bseg-hkont VALUE '0000456701',
lc_taxfees TYPE bseg-mwskz VALUE 'XY'.
CHECK i_febko-anwnd = '0001'. "nur Elko
CHECK NOT t_ftpost[] IS INITIAL. "Buchungen?
* Auf hinreichend scharfe Abgrenzung des Geschäftsvorfalls achten!!!! IF i_febko-absnd(8) = 'XYZ-BANK' AND "nur XYZ-Bank
i_febko-bukrs = 'XYZ' AND "nur Bk XYZ
i_febep-vgint = '0016' AND "nur Zahlungskarten
i_ikofi-ktos2 = 'ZKVERR' AND "Buchung auf ZK-Verr. kto
i_posting_area = '1'. "nur Buchungsber. 1
**********************************************************************
*
* Standard-Buchung:
* Bank an Zahlungskarten-Verrechnungskonto 100,--
*
* Buchung NACH folgendem Eingriff in die Buchungslogik
* (g sei der Gebührenanteil von 100,-)
*
* Bank 100,--
* Gebühren g an ZK-Verrechnungskonto 100,-- + g
*
* Die Gebühren werden dabei mit Steuer (Kz. XY) gebucht
**********************************************************************
* Höchsten Positions-Index holen und nächsthöheren ermitteln
DESCRIBE TABLE t_ftpost.
READ TABLE t_ftpost INDEX sy-tfill INTO ls_ftpost.
IF sy-subrc = 0.
l_count = ls_ftpost-count + 1.
ENDIF.
CHECK l_count GT 0.
* Gebühr aus Verwendungszweck rausklamüsern
LOOP AT t_febre INTO ls_febre.
CONCATENATE l_string ls_febre-vwezw INTO l_string.
ENDLOOP.
* Gebühren stehen (in diesem Fall) ganz am Ende des Verwendungszwecks
l_len = strlen( l_string ) - 7.
l_fees = l_string+l_len(7).
* Säubern...
TRANSLATE l_fees USING ',.- / '.
CONDENSE l_fees NO-GAPS.
* Bruttobetrag = gutgeschriebener Betrag + Gebühren
l_brutto = i_febep-kwbtr + l_fees.
* Buchungstabelle modifizieren
* 1. Betrag der Pos. ZK-Verr. Konto auf brutto anpassen
LOOP AT t_ftpost INTO ls_ftpost.
CHECK ls_ftpost-count = '002'
AND ls_ftpost-fnam = 'BSEG-WRBTR'.
* Bruttobetrag auf ZK-Verr.konto buchen
WRITE l_brutto TO ls_ftpost-fval LEFT-JUSTIFIED.
MODIFY t_ftpost FROM ls_ftpost.
ENDLOOP.
* 2. Flag "Steuer rechnen" zum Belegkopf hinzufügen
ls_ftpost-stype = 'K'.
ls_ftpost-count = '001'.
ls_ftpost-fnam = 'BKPF-XMWST'.
ls_ftpost-fval = 'X'.
INSERT ls_ftpost INTO t_ftpost INDEX 1.
* 3. Separate Buchungszeile hinzufügen: Gebühr auf Gebührenkonto
ls_ftpost-stype = 'P'.
ls_ftpost-count = l_count.
ls_ftpost-fnam = 'BSEG-BSCHL'.
ls_ftpost-fval = '40'.
APPEND ls_ftpost TO t_ftpost.
ls_ftpost-fnam = 'BSEG-HKONT'.
ls_ftpost-fval = lc_feeaccount. "Gebührenkonto
APPEND ls_ftpost TO t_ftpost.
ls_ftpost-fnam = 'BSEG-WRBTR'.
ls_ftpost-fval = l_fees.
APPEND ls_ftpost TO t_ftpost.
ls_ftpost-fnam = 'BSEG-ZUONR'.
ls_ftpost-fval = i_febep-zuonr.
APPEND ls_ftpost TO t_ftpost.
ls_ftpost-fnam = 'BSEG-MWSKZ'.
ls_ftpost-fval = lc_taxfees. "Steuer-Kz.
APPEND ls_ftpost TO t_ftpost.
ls_ftpost-fnam = 'BSEG-SGTXT'.
ls_ftpost-fval = text-001. "Buchungstext
APPEND ls_ftpost TO t_ftpost.
ls_ftpost-fnam = 'COBL-KOSTL'.
ls_ftpost-fval = <my_kostl>. “Kostenstelle
APPEND ls_ftpost TO t_ftpost.
ENDIF.
ENDMETHOD.
Valutadatum 30.Feb. im elektronischen Kontoauszug MT940
Aus aktuellem Anlass wurde ich daran erinnert, dass einige Banken in ihren elektronischen Kontoauszügen (MT940-Format) "technische" Valutadaten liefern, da die Banken ja zuweilen so ihren eigenen Kalender verwenden, wo jeder Monat 30 Tage hat. Dabei kommt z.T. so was skurriles zustande wie bspw. der 30. Februar. Der (Bank-) Fachmann lächelt, die Eingangsverarbeitung des elektronischen Kontoauszugs hat hier leider keinen Humor und quittiert dererlei Auszüge mit der Fehlermeldung FB080 - ungültiges Datum...
Schuld daran sind wie gesagt die "technischen" Valuta-Daten, die in den MT940-Dateien (Satzart :61:) vorhanden sind:
Bsp.:
:20:DEUTDEFFXXXX
:25:67070010/….
:28C:00072/001
:60F:C070412EUR0,00
:61:070230C1604,35NCHKNONREF//1804480992
Das Problem betrifft natürlich nur den Februar, da die übrigen Monate ja mindestens 30 Tage haben.
Entweder man editiert die Dateien manuell vor der Verarbeitung mit einem geeigneten Editor oder löst das Problem mithilfe der SMOD-Erweiterung FEB00004:
Funktionsexit: EXIT_RFEKA400_001
Include: ZXF01U06
Coding:
* Prüfen, ob wieder 30. Februar von der Bank geliefert wurde... Dreckspack!
DATA: check_datum(6) TYPE c.
DATA: ls_raw_data LIKE LINE OF t_raw_data.
LOOP AT t_raw_data INTO ls_raw_data.
CASE ls_raw_data-line+0(4).
WHEN ':61:'.
check_datum = ls_raw_data-line+4(6).
IF check_datum+2(2) = '02' AND check_datum+4(2) >= '30'. "FUUUUUUUUUUU.....
check_datum+4(2) = '28'. "Schaltjahr? ham wa nich'
ENDIF.
ls_raw_data-line+4(6) = check_datum.
MODIFY t_raw_data FROM ls_raw_data TRANSPORTING line.
ENDCASE.
ENDLOOP.
/image%2F1473637%2F20170207%2Fob_adae32_profilbild.png)