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.