Overblog Alle Blogs
Folge diesem Blog Administration + Create my blog
MENU
Werbung
SAPManDoo - SAP Resource

fi

Workflowbasierte Bearbeitung und Freigabe des Zahlungsvorschlags

12. Februar 2019 , Geschrieben von sapmandoo Veröffentlicht in #FI, #workflow

In neueren Releases (S/4 bzw. ab SAP_FIN 617) gibt es die Funktion "Workflow-basierte Freigabe des Zahlungsvorschlags". Hiermit lassen sich (arbeitsteilige) Abarbeitungs- bzw. Fertigmeldungsszenarien für den Zahllauf (F110 bzw. F111) implementieren. 

Relevante Hinweise

  • 2441770 - FI-Zahlprogramm: Workflow-basierte Freigabe des Zahlungsvorschlags

Installation:

  • 2418713 - F110 F111: Workflow-basierte Freigabe des Zahlungsvorschlags (Prozess-Integration zu Hinweis 2441805)
  • 2441804 - F110 F111: Workflow-basierte Freigabe des Zahlungsvorschlags (Installation zu Hinweis 2441805)
  • 2441805 - F110 F111: Workflow-basierte Freigabe des Zahlungsvorschlags

 

Mithilfe der Customizing-Transaktion F110WFR bzw. IMG: Finanzwesen - Debitoren- und Kreditorenbuchhaltung - Geschäftsvorfälle - Zahlungsausgang - Zahlungsausgang automatisch - Zahlungsvorschlagsbearbeitung - Workflow für die Zahlungsvorschlagsbearbeitung einrichten lässt sich der Workflow aktivieren und die Bearbeiterfindung ausprägen. Für dieses Beispiel richten wir eine arbeitsteilige Bearbeitung des Zahlvorschlags (nach Sachbearbeiter-Kürzeln) ein.

Workflow aktivieren

Workflow aktivieren

Aktivieren Sie den Workflow im entsprechenden zahlenden Buchungskreis und geben Sie die Zahlwege vor, für die der Workflow greifen soll.

Workflow-Bearbeiterfindung

Workflow-Bearbeiterfindung

Im Rahmen dieser Aktivität bietet das System einen einfachen Regel-Editor, mit dem in Abhängigkeit von gewissen Feldinhalten der Zahlvorschlag paketiert und entsprechende Bearbeiter (z.B. SAP-User) zugeordnet werden können.

Im vorliegenden Fall wird der Zahlvorschlag nach Sachbearbeiter-Kürzeln (01, 02) am Kreditoren- bzw. Debitorenstammsatz aufgeteilt und die Arbeitspakete werden den zuständigen Zahlvorschlagsbearbeitern zugeordnet. 

Als letzter Eintrag ohne Regel ist ein Default-User eingerichtet, der den schwarzen Peter bekommt, wenn durch Anwendung der vorherigen Regeln bis dorthin kein Bearbeiter gefunden werden konnte. 

Ein komplexeres Regelwerk zur Bearbeiterfindung lässt sich über die Ausgestaltung eines BAdIs implementieren. Details hierzu und weitere Informationen zu diesem Themenkreis finden sich in der Dokumentation zur IMG-Aktivität. 

Über die Methode GET_WF_PACKAGE_ACTORS liessen sich bspw. die zuständigen Bearbeiter aus der Tabelle T001S (Sachbearbeiterkürzel) nachlesen und dynamisch den Arbeitspaketen zuteilen.

Der ausgelieferte Workflow (WS23200018) besteht aus folgenden Aufgaben/Schritten:

Workflow Zahlungsvorschlagsbearbeitung Teil 1

Workflow Zahlungsvorschlagsbearbeitung Teil 1

Nach dem Startereignis (Zahlungsvorschlag wurde in der F110 erstellt) werden die Arbeitspakete erstellt und an die zugeteilten Bearbeiter weitergeleitet. Die Bearbeiter haben nun entsprechende ausführbare Workpackages in ihrem SAP Business Workplace. Der weitere Ablauf kann nun wie folgt variieren:

  • Der Vorschlag wird gelöscht
  • Die Arbeitspakete werden von den jeweiligen Bearbeitern abgearbeitet, bis die Anzahl der offenen Pakete 0 ist, also alles bestätigt wurde

Den Status der Abarbeitung kann jederzeit in der F110 eingesehen werden über "Zahlvorschlag anzeigen"

Status Zahlvorschlagsbearbeitung in der F110

Status Zahlvorschlagsbearbeitung in der F110

Sofern der Zahlvorschlag vor Beginn der Abarbeitung gelöscht wurde, ist der Workflow beendet. Wurden alle Arbeitspakete durch die jeweiligen Bearbeiter bestätigt, wird der Zahlvorschlag vom System gesperrt und die Abschlußarbeiten nach Workflow eingeleitet. In der Standardauslieferung wird hierbei der Zahllauf inkl. Zahlungsträgererstellung und Druck angestossen.

Workflow Zahlungsvorschlagsbearbeitung Teil 2

Workflow Zahlungsvorschlagsbearbeitung Teil 2

Die einzelnen Schritte und deren konkrete Ausgestaltung sind in einem Default-BadI (FI_PAYMENT_PROPOSAL_WF) implementiert, welches von SAP ausgeliefert wird. Nachfolgend ein kurzer Überblick über die ausgelieferten Funktionalitäten:

 
Methode Ausgelieferte Funktionalität
CHECK_WF_ACTIVE Es wird geprüft, ob der Workflow im Cust. für den entsprechenden zahlenden Buchungskreis und Zahlweg aktiviert ist.
DELETE_WF_PACKAGES Wird der Zahlungsvorschlag gelöscht, werden alle erstellten Arbeitspakete mitgelöscht.
GET_WF_PACKAGE_1 Paketierung des Zahlungsvorschlages gemäß Regeleditor im Customizing, wenn die regelnden Felder im Zahlungskopf enthalten sind (REGUH)
GET_WF_PACKAGE_2 Paketierung des Zahlungsvorschlages gemäß Regeleditor im Customizing, wenn die regelnden Felder in der Zahlungsposition enthalten sind (REGUP)
GET_WF_PACKAGE_ACTORS Zuteilung des Bearbeiters zum jeweiligen Arbeitspaket anhand der Zuordnung im Customizing (s.o.)
GET_WF_PACKAGE_DESCRIPTION Generischer Aufbau der Arbeitspaketbeschreibung anhand der techn. Beschreibung des Feldnamens aus der Regel und der vorgegebenen Werte, z.B.: BUSAB = 01 wird zu "Buchhaltungs-Sachbearbeiter 01"
START_WF_POSTPROCESSING Abschlußarbeiten, wenn alle Arbeitspakete bestätigt wurden: Starten des Zahllaufs inkl. Zahlungsträgererstellung und Druck 

 

Durch eine eigene BadI-Implementierung lassen sich alle oder einzelne Funktionen durch kundeneigenes Coding übersteuern.

Weiterlesen
Werbung

Upload-Tool für Hauptbuchbelege (SAPGUI)

4. Februar 2019 , Geschrieben von sapmandoo Veröffentlicht in #S4, #FI, #SAP Reports

Update 13.04.26: Damit das Programm "fiorisiert" werden kann, muss der Zugriff auf die Excel-Datei von OLE auf einen alternativen Zugriff umgestellt werden. OLE ist nur im Kontext der SAP-GUI unterstützt, das Programm in seiner ursprünglich geposteten Form wäre als fiorisierte GUI-App nicht lauffähig. Deshalb wurde der komplette Upload auf die sog. XCO API umgestellt. Das Tool ist nun auch in der FIORI-Welt ausführbar.

Eine viel nachgefragte Funktion im FI ist die Möglichkeit, Belege in Excel aufzubereiten und unter SAP hochzuladen, z.B. für Sachkonten-Umbuchungen im Rahmen von Abschlusstätigkeiten. Unter S/4 (ab Rel. 1511) gibt es hierfür eine Fiori-App zum Upload von Hauptbuchbelegen via Excel-Template, ab Release 1809 gibt es diese auch für kreditorische Belege... 

Bis dahin hilft meines Wissens tatsächlich nur eine selbstgebaute Upload-Funktion oder ggf. ein 3rd Party-Produkt.

Ein einfaches Programm inkl. Testlauf-/Prüffunktion findet sich in diesem Artikel. Hinweise zur Installation und zum Format der Quell-Datei finden sich am Ende des Codings...

*&---------------------------------------------------------------------*
*& Report ZFI_UPL_DOCUMENTS
*----------------------------------------------------------------------*
* Function       : Upload documents from Excel                         *
*----------------------------------------------------------------------*
* Description    : Upload & posting of documents via Excel             *
* Author         : S.Rohde Consenso Consulting                         *
* Date/Version   : 23.01.2023 1.0
*----------------------------------------------------------------------*
* SRO190723 Enable postings in foreign currency
* SRO030226 Upgrade to S/4 & new Excel Interface
* SRO300326 Ignore negative values in Excel file, sign is determined
*           by posting key only

REPORT zfi_upl_documents.

***********************************************************************
******************** GLOBAL DATA **************************************
***********************************************************************

CONSTANTS: gc_delimiter(1) TYPE c VALUE '~'.

SET EXTENDED CHECK OFF.
INCLUDE:
  sbal_constants,
  <icon>.
SET EXTENDED CHECK ON.

TYPES: gty_currency_amount TYPE TABLE OF bapiaccr09.

DATA:
  g_s_log             TYPE bal_s_log,
  g_log_handle        TYPE balloghndl,
  g_t_log_handle      TYPE bal_t_logh,
  g_s_display_profile TYPE bal_s_prof.

DATA: g_dummy         TYPE c.

DATA: data_tab TYPE TABLE OF string.

TYPES: BEGIN OF gty_xl_sheet,
         col_a TYPE string,
         col_b TYPE string,
         col_c TYPE string,
         col_d TYPE string,
         col_e TYPE string,
         col_f TYPE string,
         col_g TYPE string,
         col_h TYPE string,
         col_i TYPE string,
         col_j TYPE string,
         col_k TYPE string,
         col_l TYPE string,
         col_m TYPE string,
         col_n TYPE string,
         col_o TYPE string,
         col_p TYPE string,
         col_q TYPE string,
         col_r TYPE string,
         col_s TYPE string,
         col_t TYPE string,
         col_u TYPE string,
         col_v TYPE string,
         col_w TYPE string,
         col_x TYPE string,
         col_y TYPE string,
         col_z TYPE string,
       END OF gty_xl_sheet.

TYPES: gtt_it_xl TYPE STANDARD TABLE OF gty_xl_sheet WITH DEFAULT KEY.

TYPES: BEGIN OF tax_item,
         mwskz      TYPE mwskz,
         direct_tax TYPE abap_bool,
         basis      TYPE fwbas,
         bashw      TYPE hwbas,
         steuer     TYPE fwste,
         steuhw     TYPE hwste,
       END OF tax_item.

DATA: git_taxitems TYPE TABLE OF tax_item,
      gs_taxitem   TYPE tax_item.

TYPES: BEGIN OF gty_doc,
         doc(20)   TYPE c,
         bschl     TYPE bschl,
         umskz     TYPE umskz,
         bukrs     TYPE bukrs,
         newko     TYPE rf05a-newko,
         mwskz     TYPE mwskz,
         wrbtr(15) TYPE c,
         waers     TYPE waers,
         netto     TYPE c,
         dmbtr(15) TYPE c,
         kostl     TYPE kostl,
         sgtxt     TYPE sgtxt,
         blart     TYPE blart,
         bldat(10) TYPE c,
         budat(10) TYPE c,
         xblnr     TYPE xblnr,
         bumon     TYPE bumon,
         bktxt     TYPE bktxt,
         zuonr     TYPE dzuonr,
         netdt(10) TYPE c,
         bewar     TYPE bseg-bewar,
         aufnr     TYPE aufnr,
         prctr     TYPE prctr,
         kidno     TYPE bseg-kidno,
         zterm     TYPE bseg-zterm,
       END OF gty_doc.

DATA: git_docs TYPE TABLE OF gty_doc,
      gs_doc   TYPE gty_doc.

DATA: gs_t001 TYPE t001,
      g_rc    TYPE sy-subrc.

DATA: g_tabix TYPE sytabix.

* Interface data for BAPI
DATA:
* Returnparameters of BAPIs
  g_obj_type         TYPE bapiache09-obj_type,  "Object type
* Object key will be populated with Document number
* NNNNNNNNNNYYYYBBBB  N = Doc Number, Y = Fiscal Year, B = Company code
  g_obj_key          TYPE bapiache09-obj_key,   "Object key
  g_obj_sys          TYPE bapiache09-obj_sys,   "log. System

* Document header
  gs_documentheader  TYPE bapiache09,

* G/L account item
  git_accountgl      TYPE TABLE OF bapiacgl09,
  gs_accountgl       TYPE bapiacgl09,

* AR item
  git_accountrec     TYPE TABLE OF bapiacar09,
  gs_accountrec      TYPE bapiacar09,

* AP items
  git_accountpay     TYPE TABLE OF bapiacap09,
  gs_accountpay      TYPE bapiacap09,

* Tax items
  git_accounttax     TYPE TABLE OF bapiactx09,
  gs_accounttax      TYPE bapiactx09,

* Amount information
  git_currencyamount TYPE TABLE OF bapiaccr09,
  gs_currencyamount  TYPE bapiaccr09,

* BAPI mesages
  git_return         TYPE TABLE OF bapiret2,
  gs_return          TYPE bapiret2.

DATA:
  g_itemno           TYPE posnr_acc.           "Line item number

*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.
  PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY.
  " PARAMETERS: pa_shtyp TYPE zde_shtyp DEFAULT '2' NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK b01.

SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-b02.
  PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b02.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_fnam.
  PERFORM f4_filename.
*-----------------------------------------------------------------------
START-OF-SELECTION.
*-----------------------------------------------------------------------

  CLEAR git_return[].
  PERFORM init_protocol.
  PERFORM upload_data.
  PERFORM precheck_data CHANGING g_rc.
  IF g_rc = 0.
    PERFORM process_data.
  ENDIF.
  PERFORM add_msg_to_prot.
  PERFORM log_display.

*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
*& F4 Help Excel-file
*&---------------------------------------------------------------------*
FORM f4_filename .

  CALL FUNCTION 'FAA_FILE_F4'
    EXPORTING
      i_default_extension = 'XLS'
    IMPORTING
      e_filename          = pa_fnam
    EXCEPTIONS
      interface_error     = 1
      OTHERS              = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    PERFORM msg_add USING probclass_high.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Upload Excel spreadsheet & structurize data
*&---------------------------------------------------------------------*
FORM upload_data .

  DATA: lt_bin_data TYPE w3mimetabtype.
  DATA: lt_sheet_data TYPE gtt_it_xl.
  DATA: l_fnam TYPE string.

  l_fnam = pa_fnam.
  CALL METHOD cl_gui_frontend_services=>gui_upload
    EXPORTING
      filename = l_fnam
      filetype = 'BIN'
    CHANGING
      data_tab = lt_bin_data.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*   solix -> xstring
  DATA(lv_xsts_xlsx) = cl_bcs_convert=>solix_to_xstring( it_solix = lt_bin_data ).

*   Excel-Dokument
  DATA(o_xl) = xco_cp_xlsx=>document->for_file_content( lv_xsts_xlsx )->read_access( ).

*   1. Sheet
  DATA(o_sheet) = o_xl->get_workbook( )->worksheet->at_position( 1 ).
  IF abap_true = o_sheet->exists( ).
    DATA(o_sel_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

    CLEAR lt_sheet_data[].
    DATA(o_result) = o_sheet->select( o_sel_pattern
                                          )->row_stream(
                                          )->operation->write_to( REF #( lt_sheet_data )
                                          )->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
                                          )->if_xco_xlsx_ra_operation~execute( ).
    IF abap_true = o_result->succeeded.
      LOOP AT lt_sheet_data ASSIGNING FIELD-SYMBOL(<ls_sheet>).
        CHECK sy-tabix > 1.
        gs_doc-doc   = <ls_sheet>-col_a.
        gs_doc-bschl = <ls_sheet>-col_b.
        gs_doc-umskz = <ls_sheet>-col_c.
        gs_doc-bukrs = <ls_sheet>-col_d.
        gs_doc-newko = <ls_sheet>-col_e.
        gs_doc-mwskz = <ls_sheet>-col_f.
        gs_doc-wrbtr = <ls_sheet>-col_g.
        gs_doc-waers = <ls_sheet>-col_h.
        gs_doc-netto = <ls_sheet>-col_i.
        gs_doc-dmbtr = <ls_sheet>-col_j.
        gs_doc-kostl = <ls_sheet>-col_k.
        gs_doc-sgtxt = <ls_sheet>-col_l.
        gs_doc-blart = <ls_sheet>-col_m.
        gs_doc-bldat = <ls_sheet>-col_n.
        gs_doc-budat = <ls_sheet>-col_o.
        gs_doc-xblnr = <ls_sheet>-col_p.
        gs_doc-bumon = <ls_sheet>-col_q.
        gs_doc-bktxt = <ls_sheet>-col_r.
        gs_doc-zuonr = <ls_sheet>-col_s.
        gs_doc-netdt = <ls_sheet>-col_t.
        gs_doc-bewar = <ls_sheet>-col_u.
        gs_doc-aufnr = <ls_sheet>-col_v.
        gs_doc-prctr = <ls_sheet>-col_w.
        gs_doc-kidno = <ls_sheet>-col_x.
        gs_doc-zterm = <ls_sheet>-col_y.
        APPEND gs_doc TO git_docs.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_PROTOCOL
*&---------------------------------------------------------------------*
*& Initialize application protocol
*&---------------------------------------------------------------------*
FORM init_protocol .

* create a log
  g_s_log-extnumber = 'Document-Upload'(ext).
  CALL FUNCTION 'BAL_LOG_CREATE'
    EXPORTING
      i_s_log      = g_s_log
    IMPORTING
      e_log_handle = g_log_handle
    EXCEPTIONS
      OTHERS       = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*--------------------------------------------------------------------
* FORM ADD_MSG_TO_PROT
*--------------------------------------------------------------------
FORM add_msg_to_prot.

  DATA:
    l_s_msg   TYPE bal_s_msg,
    l_context TYPE bal_s_ex01.

  DATA:
    l_s_return  LIKE LINE OF git_return.

  LOOP AT git_return INTO l_s_return.

*   define data of message for Application Log
    l_s_msg-msgty           = l_s_return-type.
    l_s_msg-msgid           = l_s_return-id.
    l_s_msg-msgno           = l_s_return-number.
    l_s_msg-msgv1           = l_s_return-message_v1.
    l_s_msg-msgv2           = l_s_return-message_v2.
    l_s_msg-msgv3           = l_s_return-message_v3.
    l_s_msg-msgv4           = l_s_return-message_v4.

* add this message to log file
    CALL FUNCTION 'BAL_LOG_MSG_ADD'
      EXPORTING
*       I_LOG_HANDLE  =
        i_s_msg       = l_s_msg
      EXCEPTIONS
        log_not_found = 0
        OTHERS        = 1.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDLOOP.

ENDFORM.

FORM log_display.
  DATA:
    l_s_display_profile TYPE bal_s_prof,
    l_s_fcat            TYPE bal_s_fcat.

* get standard display profile
  CALL FUNCTION 'BAL_DSP_PROFILE_SINGLE_LOG_GET'
    IMPORTING
      e_s_display_profile = l_s_display_profile
    EXCEPTIONS
      OTHERS              = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* for display variants add report id
  l_s_display_profile-disvariant-report = sy-repid.
* when you use also other ALV lists in your report,
* please specify a handle to distinguish between the display
* variants of these different lists, e.g:
  l_s_display_profile-disvariant-handle = 'LOG'.

* show log file with modified output profile
* - we specify the display profile since we created our own
* - we do not specify any filter (like I_S_LOG_FILTER, ...,
*   I_T_MSG_HANDLE) since we want to display all messages available
  CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
    EXPORTING
*     I_S_LOG_FILTER      =
*     I_T_LOG_CONTEXT_FILTER =
*     I_S_MSG_FILTER      =
*     I_T_MSG_CONTEXT_FILTER =
*     I_T_LOG_HANDLE      =
*     I_T_MSG_HANDLE      =
      i_s_display_profile = l_s_display_profile
    EXCEPTIONS
      OTHERS              = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*--------------------------------------------------------------------
* FORM MSG_ADD_FREE_TEXT
*--------------------------------------------------------------------
FORM msg_add_free_text USING VALUE(i_text) TYPE c.

* add this message to log file
  CALL FUNCTION 'BAL_LOG_MSG_ADD_FREE_TEXT'
    EXPORTING
*     I_LOG_HANDLE  =
      i_msgty       = 'S'
      i_text        = i_text
    EXCEPTIONS
      log_not_found = 0
      OTHERS        = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT
*&---------------------------------------------------------------------*
*& Initialization
*&---------------------------------------------------------------------*
FORM init .
  CLEAR: git_accountgl[],
         git_accountpay[],
         git_accountrec[],
         git_accounttax[],
         git_currencyamount[],
         git_taxitems[].

  CLEAR: g_itemno, gs_documentheader.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form POST_DOCUMENT
*&---------------------------------------------------------------------*
*& Post document
*&---------------------------------------------------------------------*
FORM post_document .

  DATA: l_error TYPE abap_bool VALUE abap_false.
  DATA: lit_return TYPE TABLE OF bapiret2.

*-----------------------------------------------------------------------
* BAPI-Call
*-----------------------------------------------------------------------
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'     "#EC CI_USAGE_OK[2628704]
    EXPORTING
      documentheader    = gs_documentheader  "#EC CI_USAGE_OK[2438131]
    IMPORTING
      obj_type          = g_obj_type
      obj_key           = g_obj_key
      obj_sys           = g_obj_sys
    TABLES
      accountgl         = git_accountgl
      accountreceivable = git_accountrec
      accountpayable    = git_accountpay
      accounttax        = git_accounttax
      currencyamount    = git_currencyamount
      return            = lit_return.

  LOOP AT lit_return TRANSPORTING NO FIELDS
          WHERE type = 'A' OR type = 'E'.
    l_error = abap_true.
  ENDLOOP.
  IF l_error = abap_false.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.

  APPEND LINES OF lit_return TO git_return.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DOCUMENT
*&---------------------------------------------------------------------*
*& check document (Test mode)
*&---------------------------------------------------------------------*
FORM check_document .

  DATA: lit_return TYPE TABLE OF bapiret2.

  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'    "#EC CI_USAGE_OK[2438131]
    EXPORTING
      documentheader    = gs_documentheader  "#EC CI_USAGE_OK[2628704]
    TABLES
      accountgl         = git_accountgl
      accountreceivable = git_accountrec
      accountpayable    = git_accountpay
      accounttax        = git_accounttax
      currencyamount    = git_currencyamount
      return            = lit_return.

  APPEND LINES OF lit_return TO git_return.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*&---------------------------------------------------------------------*
*& map excel data to BAPI structure & post / check documents
*&---------------------------------------------------------------------*
FORM process_data .

  DATA: l_netto  TYPE wrbtr,
        l_nethw  TYPE dmbtr,
        l_brutto TYPE wrbtr,
        l_bruthw TYPE dmbtr,
        l_steuer TYPE fwste,
        l_steuhw TYPE hwste,
        l_basis  TYPE fwbas,
        l_bashw  TYPE hwbas.

  DATA: l_mwskz TYPE skb1-mwskz,
        ls_bsl  TYPE tbsl.

*-----------------------------------------------------------------------
* Items
*-----------------------------------------------------------------------
  LOOP AT git_docs INTO gs_doc.

    AT NEW doc.
      PERFORM init.
*-----------------------------------------------------------------------
* document header
*-----------------------------------------------------------------------
      READ TABLE git_docs INDEX sy-tabix INTO DATA(ls_doc).
      CLEAR gs_documentheader.
      gs_documentheader-bus_act    = 'RFBU'.
      gs_documentheader-username   = sy-uname.
      gs_documentheader-comp_code  = ls_doc-bukrs.
      PERFORM _convert_date_xlsx USING ls_doc-bldat.
      gs_documentheader-doc_date   = ls_doc-bldat.
      PERFORM _convert_date_xlsx USING ls_doc-budat.
      gs_documentheader-pstng_date = ls_doc-budat.
      IF gs_doc-bumon IS NOT INITIAL AND ls_doc-bumon NE space.
        gs_documentheader-fis_period = ls_doc-bumon.
      ENDIF.
      gs_documentheader-ref_doc_no = ls_doc-xblnr.
      gs_documentheader-header_txt = ls_doc-bktxt.
      gs_documentheader-doc_type   = ls_doc-blart.
      SELECT SINGLE * FROM t001 INTO gs_t001 WHERE bukrs = ls_doc-bukrs.
    ENDAT.

    g_tabix = sy-tabix.
    ADD 1 TO g_itemno.

    "begin of insertion SRO300326
    gs_doc-wrbtr = abs( gs_doc-wrbtr ).
    gs_doc-dmbtr = abs( gs_doc-dmbtr ).
    "end of insertion SRO300326

    SELECT SINGLE * FROM tbsl INTO ls_bsl WHERE bschl = gs_doc-bschl.
    IF sy-subrc NE 0.
      MESSAGE e034(f5) WITH gs_doc-bschl INTO g_dummy.
      PERFORM msg_add USING probclass_high.
      CONTINUE.
    ENDIF.

    CASE ls_bsl-koart.

      WHEN 'S'.

        CLEAR: gs_accountgl, gs_currencyamount.
        CLEAR: l_brutto, l_bruthw.

        gs_accountgl-itemno_acc      = g_itemno.
        PERFORM _convert USING gs_doc-newko gs_accountgl-gl_account 'HKONT'.
        gs_accountgl-item_text       = gs_doc-sgtxt.
        IF gs_doc-kostl IS NOT INITIAL.
          PERFORM _convert USING gs_doc-kostl gs_accountgl-costcenter 'KOSTL'.
        ENDIF.
        IF gs_doc-prctr IS NOT INITIAL.
          PERFORM _convert USING gs_doc-prctr gs_accountgl-profit_ctr 'PRCTR'.
        ENDIF.
        IF gs_doc-aufnr IS NOT INITIAL.
          PERFORM _convert USING gs_doc-aufnr gs_accountgl-orderid 'AUFNR'.
        ENDIF.
        gs_accountgl-alloc_nmbr      = gs_doc-zuonr.
        gs_accountgl-tax_code        = gs_doc-mwskz.
        gs_accountgl-cshdis_ind      = abap_true.

        IF gs_doc-wrbtr IS NOT INITIAL.
          PERFORM _convert USING gs_doc-wrbtr l_brutto 'WRBTR'.
        ENDIF.
        IF gs_doc-dmbtr IS NOT INITIAL AND gs_doc-waers NE gs_t001-waers.
          PERFORM _convert USING gs_doc-dmbtr l_bruthw 'DMBTR'.
        ENDIF.

        "Net amounts provided? --> Calculate gross-amounts
        IF gs_doc-netto = abap_true.
          PERFORM calculate_grossamounts USING    gs_documentheader-comp_code gs_doc-waers gs_doc-mwskz
                                         CHANGING l_brutto l_bruthw.
        ENDIF.

        IF ls_bsl-shkzg = 'H'.
          MULTIPLY l_brutto BY -1.
          MULTIPLY l_bruthw BY -1.
        ENDIF.

*       GL account taxable?
        CLEAR l_mwskz.
        SELECT SINGLE mwskz FROM skb1 INTO l_mwskz
                WHERE saknr = gs_accountgl-gl_account
                  AND bukrs = gs_documentheader-comp_code. "#EC CI_DB_OPERATION_OK[2431747]
        IF sy-subrc = 0 AND l_mwskz IS INITIAL.
          "no tax allowed? --> clear tax code (same behaviour as FIORI app)
          CLEAR: gs_doc-mwskz, gs_accountgl-tax_code.
        ENDIF.

        CLEAR: l_steuer, l_netto, l_basis, l_steuhw, l_nethw, l_bashw.
*       with tax?
        IF gs_doc-mwskz IS NOT INITIAL.
          IF l_mwskz = '>' OR l_mwskz = '<'.  "Direct Tax
            CALL FUNCTION 'RE_CALCULATE_BASE_AMOUNT'
              EXPORTING
                i_taxam = l_brutto
                i_mwskz = gs_doc-mwskz
                i_waers = gs_doc-waers
                i_bukrs = gs_documentheader-comp_code
              IMPORTING
                e_fwbas = l_basis.
            l_steuer = l_netto = l_brutto.
            IF gs_doc-waers NE gs_t001-waers.
              CALL FUNCTION 'RE_CALCULATE_BASE_AMOUNT'
                EXPORTING
                  i_taxam = l_bruthw
                  i_mwskz = gs_doc-mwskz
                  i_waers = gs_t001-waers
                  i_bukrs = gs_documentheader-comp_code
                IMPORTING
                  e_fwbas = l_bashw.
              l_steuhw = l_nethw = l_bruthw.
            ENDIF.
          ELSE.
            CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
              EXPORTING
                i_bukrs = gs_documentheader-comp_code
                i_mwskz = gs_doc-mwskz
                i_waers = gs_doc-waers
                i_wrbtr = l_brutto
              IMPORTING
                e_fwste = l_steuer
              EXCEPTIONS
                OTHERS  = 16.

            IF sy-subrc <> 0.
              MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO g_dummy.
              PERFORM msg_add USING probclass_high.
            ENDIF.
            l_netto = l_brutto - l_steuer.
            l_basis = l_netto.

            IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
              CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
                EXPORTING
                  i_bukrs = gs_documentheader-comp_code
                  i_mwskz = gs_doc-mwskz
                  i_waers = gs_t001-waers
                  i_wrbtr = l_bruthw
                IMPORTING
                  e_fwste = l_steuhw
                EXCEPTIONS
                  OTHERS  = 16.

              IF sy-subrc <> 0.
                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO g_dummy.
                PERFORM msg_add USING probclass_high.
              ENDIF.
              l_nethw = l_bruthw - l_steuhw.
              l_bashw = l_nethw.
            ENDIF.

          ENDIF.

*-----------------------------------------------------------------------
*         collect corresponding tax line for each taxable GL account
*-----------------------------------------------------------------------
          CLEAR gs_taxitem.
          gs_taxitem-mwskz  = gs_doc-mwskz.
          gs_taxitem-steuer = l_steuer.
          gs_taxitem-steuhw = l_steuhw.
          gs_taxitem-basis  = l_basis.
          gs_taxitem-bashw  = l_bashw.
          IF l_mwskz = '>' OR l_mwskz = '<'.  "Direct Tax
            gs_taxitem-direct_tax = abap_true.
          ELSE.
            gs_taxitem-direct_tax = abap_false.
          ENDIF.
          COLLECT gs_taxitem INTO git_taxitems.

        ELSE.
          l_netto = l_brutto.
          l_nethw = l_bruthw.
        ENDIF.

        IF NOT ( l_mwskz = '>' OR l_mwskz = '<' ).  "Direct Tax
          IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
            gs_currencyamount-curr_type = '00'.  "transaction (foreign) currency
          ENDIF.
          gs_currencyamount-itemno_acc = gs_accountgl-itemno_acc.
          gs_currencyamount-currency   = gs_doc-waers.
          gs_currencyamount-amt_doccur = l_netto. "#EC CI_FLDEXT_OK[2610650]

          APPEND: gs_accountgl      TO git_accountgl,
                  gs_currencyamount TO git_currencyamount.

          IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
            gs_currencyamount-curr_type = '10'.  "local currency
            gs_currencyamount-itemno_acc = gs_accountgl-itemno_acc.
            gs_currencyamount-currency   = gs_t001-waers.
            gs_currencyamount-amt_doccur = l_nethw. "#EC CI_FLDEXT_OK[2610650]

            APPEND: gs_currencyamount TO git_currencyamount.
          ENDIF.

        ENDIF.

      WHEN 'D'.

        CLEAR: gs_accountrec, gs_currencyamount.
        gs_accountrec-itemno_acc     = g_itemno.   "Positionsidentifier
        PERFORM _convert USING gs_doc-newko gs_accountrec-customer 'KUNNR'.
        gs_accountrec-item_text      = gs_doc-sgtxt.      "Belegtext
        gs_accountrec-alloc_nmbr     = gs_doc-zuonr.      "Zuordnung
        gs_accountrec-sp_gl_ind      = gs_doc-umskz.      "SHB-KZ
        gs_accountrec-paymt_ref      = gs_doc-kidno.      "Zahlungsreferenz
        IF gs_doc-netdt IS NOT INITIAL.
          PERFORM _convert_date_xlsx USING gs_doc-netdt.
          gs_accountrec-bline_date = gs_doc-netdt.
        ENDIF.
        IF gs_doc-zterm IS NOT INITIAL.
          gs_accountrec-pmnttrms = gs_doc-zterm.
        ELSE.
          SELECT SINGLE zterm FROM knb1 INTO gs_accountrec-pmnttrms
                 WHERE kunnr = gs_accountrec-customer
                   AND bukrs = gs_doc-bukrs.
        ENDIF.

        IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
          gs_currencyamount-curr_type = '00'.  "transaction (foreign) currency
        ENDIF.
        gs_currencyamount-itemno_acc = gs_accountrec-itemno_acc.
        gs_currencyamount-currency   = gs_doc-waers.

        IF gs_doc-wrbtr IS NOT INITIAL.
          PERFORM _convert USING gs_doc-wrbtr l_brutto 'WRBTR'.
          IF ls_bsl-shkzg = 'H'.
            MULTIPLY l_brutto BY -1.
          ENDIF.
        ENDIF.
        gs_currencyamount-amt_doccur = l_brutto. "#EC CI_FLDEXT_OK[2610650]

        APPEND: gs_accountrec     TO git_accountrec,
                gs_currencyamount TO git_currencyamount.

        IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
          gs_currencyamount-curr_type = '10'.  "local currency
          gs_currencyamount-itemno_acc = gs_accountrec-itemno_acc.
          gs_currencyamount-currency   = gs_t001-waers.

          IF gs_doc-dmbtr IS NOT INITIAL.
            PERFORM _convert USING gs_doc-dmbtr l_bruthw 'DMBTR'.
            IF ls_bsl-shkzg = 'H'.
              MULTIPLY l_bruthw BY -1.
            ENDIF.
          ENDIF.
          gs_currencyamount-amt_doccur = l_bruthw. "#EC CI_FLDEXT_OK[2610650]

          APPEND gs_currencyamount TO git_currencyamount.
        ENDIF.

      WHEN 'K'.

        CLEAR: gs_accountpay, gs_currencyamount.
        gs_accountpay-itemno_acc     = g_itemno.   "Positionsidentifier
        PERFORM _convert USING gs_doc-newko gs_accountpay-vendor_no 'LIFNR'.
        gs_accountpay-item_text      = gs_doc-sgtxt.      "Belegtext
        gs_accountpay-alloc_nmbr     = gs_doc-zuonr.      "Zuordnung
        gs_accountpay-sp_gl_ind      = gs_doc-umskz.      "SHB-KZ
        gs_accountpay-paymt_ref      = gs_doc-kidno.      "Zahlungsreferenz
        IF gs_doc-netdt IS NOT INITIAL.
          PERFORM _convert_date_xlsx USING gs_doc-netdt.
          gs_accountpay-bline_date = gs_doc-netdt.
        ENDIF.
        IF gs_doc-zterm IS NOT INITIAL.
          gs_accountpay-pmnttrms = gs_doc-zterm.
        ELSE.
          SELECT SINGLE zterm FROM lfb1 INTO gs_accountpay-pmnttrms
                 WHERE lifnr = gs_accountpay-vendor_no
                   AND bukrs = gs_doc-bukrs.
        ENDIF.

        IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
          gs_currencyamount-curr_type = '00'.  "transaction (foreign) currency
        ENDIF.
        gs_currencyamount-itemno_acc = gs_accountpay-itemno_acc.
        gs_currencyamount-currency   = gs_doc-waers.

        IF gs_doc-wrbtr IS NOT INITIAL.
          PERFORM _convert USING gs_doc-wrbtr l_brutto 'WRBTR'.
          IF ls_bsl-shkzg = 'H'.
            MULTIPLY l_brutto BY -1.
          ENDIF.
        ENDIF.
        gs_currencyamount-amt_doccur = l_brutto. "#EC CI_FLDEXT_OK[2610650]

        APPEND: gs_accountpay     TO git_accountpay,
                gs_currencyamount TO git_currencyamount.

        IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
          gs_currencyamount-curr_type = '10'.  "local currency
          gs_currencyamount-itemno_acc = gs_accountpay-itemno_acc.
          gs_currencyamount-currency   = gs_t001-waers.

          IF gs_doc-dmbtr IS NOT INITIAL.
            PERFORM _convert USING gs_doc-dmbtr l_bruthw 'DMBTR'.
            IF ls_bsl-shkzg = 'H'.
              MULTIPLY l_bruthw BY -1.
            ENDIF.
          ENDIF.
          gs_currencyamount-amt_doccur = l_bruthw. "#EC CI_FLDEXT_OK[2610650]

          APPEND gs_currencyamount TO git_currencyamount.
        ENDIF.
    ENDCASE.

    AT END OF doc.
      READ TABLE git_docs INDEX g_tabix INTO ls_doc.
*-----------------------------------------------------------------------
*     Prepare collected tax lines & attach to current document
*-----------------------------------------------------------------------
      LOOP AT git_taxitems INTO gs_taxitem.
        ADD 1 TO g_itemno.
        CLEAR: gs_accounttax, gs_currencyamount.

        gs_accounttax-itemno_acc     = g_itemno.
        gs_accounttax-tax_code       = gs_taxitem-mwskz.
        gs_accounttax-direct_tax     = gs_taxitem-direct_tax.
        IF ls_doc-waers NE gs_t001-waers AND ls_doc-dmbtr IS NOT INITIAL.
          gs_currencyamount-curr_type = '00'.
        ENDIF.
        gs_currencyamount-itemno_acc = gs_accounttax-itemno_acc.
        gs_currencyamount-currency   = ls_doc-waers.
        gs_currencyamount-amt_doccur = gs_taxitem-steuer. "#EC CI_FLDEXT_OK[2610650]
        gs_currencyamount-amt_base   = gs_taxitem-basis. "#EC CI_FLDEXT_OK[2610650]

        APPEND: gs_accounttax     TO git_accounttax,
                gs_currencyamount TO git_currencyamount.

        IF ls_doc-waers NE gs_t001-waers AND ls_doc-dmbtr IS NOT INITIAL.
          gs_currencyamount-curr_type = '10'.
          gs_currencyamount-itemno_acc = gs_accounttax-itemno_acc.
          gs_currencyamount-currency   = gs_t001-waers.
          gs_currencyamount-amt_doccur = gs_taxitem-steuhw. "#EC CI_FLDEXT_OK[2610650]
          gs_currencyamount-amt_base   = gs_taxitem-bashw. "#EC CI_FLDEXT_OK[2610650]
          APPEND: gs_currencyamount TO git_currencyamount.
        ENDIF.

      ENDLOOP.

      PERFORM round_amounts USING g_itemno CHANGING git_currencyamount.

*-----------------------------------------------------------------------
* Post / Check document
*-----------------------------------------------------------------------
      IF pa_test IS INITIAL.
        PERFORM post_document.
      ELSE.
        PERFORM check_document.
      ENDIF.
    ENDAT.

  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form _CONVERT
*&---------------------------------------------------------------------*
*& Convert excel data to SAP format
*&---------------------------------------------------------------------*
*&      --> in/out input / output
*&      --> Dtel   data element that determines the conversion
*&---------------------------------------------------------------------*
FORM _convert  USING    in out VALUE(dtel).

  DATA: l_btr TYPE wrbtr.

  IF dtel = 'WRBTR' OR dtel = 'DMBTR' AND in CO '0123456789 .'.
    l_btr = in.                              "#EC CI_FLDEXT_OK[2610650]
    out = l_btr.                             "#EC CI_FLDEXT_OK[2610650]
    EXIT.
  ENDIF.

  CALL FUNCTION 'RS_CONV_EX_2_IN_DTEL'
    EXPORTING
      input_external  = in    "#EC CI_FLDEXT_OK[2610650]
      dtel            = dtel
    IMPORTING
      output_internal = out.  "#EC CI_FLDEXT_OK[2610650]

  IF sy-subrc <> 0.
    MESSAGE a600(fr) WITH 'ERROR'(f03) sy-subrc 'at conversion'(f04) dtel.
  ENDIF.

ENDFORM.

*--------------------------------------------------------------------
* FORM MSG_ADD
*--------------------------------------------------------------------
FORM msg_add USING VALUE(i_probclass) TYPE bal_s_msg-probclass.
  DATA:
    l_s_msg TYPE bal_s_msg.

* define data of message for Application Log
  l_s_msg-msgty     = sy-msgty.
  l_s_msg-msgid     = sy-msgid.
  l_s_msg-msgno     = sy-msgno.
  l_s_msg-msgv1     = sy-msgv1.
  l_s_msg-msgv2     = sy-msgv2.
  l_s_msg-msgv3     = sy-msgv3.
  l_s_msg-msgv4     = sy-msgv4.
  l_s_msg-probclass = i_probclass.

* add this message to log file
  CALL FUNCTION 'BAL_LOG_MSG_ADD'
    EXPORTING
*     I_LOG_HANDLE  =
      i_s_msg       = l_s_msg
    EXCEPTIONS
      log_not_found = 0
      OTHERS        = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PRECHECK_DATA
*&---------------------------------------------------------------------*
*       Precheck Data, whether local currency is consistently provided
*----------------------------------------------------------------------*
FORM precheck_data CHANGING p_rc.

  DATA: l_mix(2) TYPE c.

  LOOP AT git_docs INTO gs_doc.
    AT NEW doc.
      READ TABLE git_docs INDEX sy-tabix INTO DATA(ls_doc).
      SELECT SINGLE * FROM t001 INTO gs_t001 WHERE bukrs = ls_doc-bukrs.
      CLEAR l_mix.
    ENDAT.
    "Doc is given in foreign currency
    IF gs_doc-waers NE gs_t001-waers.
      IF gs_doc-dmbtr IS NOT INITIAL OR gs_doc-dmbtr CO '0,. '.
        l_mix(1) = 'X'.
      ELSE.
        l_mix+1(1) = 'X'.
      ENDIF.
    ENDIF.

    IF l_mix = 'XX'.
      "sometimes amount in LC is provided and sometimes not within same document
      "--> ERROR
      p_rc = 4.
      MESSAGE e800(f5) INTO g_dummy.
      PERFORM msg_add USING probclass_high.
      EXIT.
    ELSE.
      p_rc = 0.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form _convert_date_xlsx
*&---------------------------------------------------------------------*
*& Datumsformat Excel in anständiges Datum umwandeln.
*&---------------------------------------------------------------------*
FORM _convert_date_xlsx CHANGING p_date TYPE char10.

  DATA: lv_days TYPE i,
        lv_date TYPE datum.

  CHECK p_date IS NOT INITIAL.
  CHECK p_date CO ' 0123456789.'.
  lv_days  = trunc( p_date ) - 2.
  lv_date = '19000101'.
  ADD lv_days TO lv_date.
  p_date  = lv_date.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form calculate_grossamounts
*&---------------------------------------------------------------------*
*& Calculate gross amounts from net amounts
*&---------------------------------------------------------------------*
*&      --> p_bukrs
*&      --> p_WAERS
*&      --> p_MWSKZ
*&      <-- p_BRUTTO
*&      <-- p_BRUTHW
*&---------------------------------------------------------------------*
FORM calculate_grossamounts  USING    p_bukrs TYPE bukrs
                                      p_waers TYPE waers
                                      p_mwskz TYPE mwskz
                             CHANGING p_netto TYPE wrbtr
                                      p_nethw TYPE dmbtr.

  DATA: lt_mwdat TYPE TABLE OF rtax1u15,
        l_fwste  TYPE bset-fwste.

* transaction currency
  CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
    EXPORTING
      i_bukrs = p_bukrs
      i_mwskz = p_mwskz
      i_waers = p_waers
      i_wrbtr = p_netto
    IMPORTING
      e_fwste = l_fwste
    TABLES
      t_mwdat = lt_mwdat
    EXCEPTIONS
      OTHERS  = 15.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    ADD l_fwste TO p_netto.
  ENDIF.

  CHECK p_nethw NE 0.

* company code currency
  CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
    EXPORTING
      i_bukrs = p_bukrs
      i_mwskz = p_mwskz
      i_waers = p_waers
      i_wrbtr = p_nethw
    IMPORTING
      e_fwste = l_fwste
    TABLES
      t_mwdat = lt_mwdat
    EXCEPTIONS
      OTHERS  = 15.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    ADD l_fwste TO p_nethw.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form round_amounts
*&---------------------------------------------------------------------*
*& elimnate rounding differences
*&---------------------------------------------------------------------*
*&      --> p_ITEMNO
*&      <-- p_CURRENCY_AMOUNT
*&---------------------------------------------------------------------*
FORM round_amounts  USING    p_itemno TYPE posnr_acc
                    CHANGING p_currencyamount TYPE gty_currency_amount.

  DATA: diff_00 TYPE bapidoccur,
        diff_10 TYPE bapidoccur,
        diff    TYPE bapidoccur.

  DATA: tabix_00 LIKE sy-tabix,
        tabix_10 LIKE sy-tabix,
        tabix    LIKE sy-tabix.

  LOOP AT p_currencyamount INTO DATA(ls_curr) WHERE curr_type = '00'.
    ADD ls_curr-amt_doccur TO diff_00.
  ENDLOOP.
  LOOP AT p_currencyamount INTO ls_curr WHERE curr_type = '10'.
    ADD ls_curr-amt_doccur TO diff_10.
  ENDLOOP.
  LOOP AT p_currencyamount INTO ls_curr WHERE curr_type = '  '.
    ADD ls_curr-amt_doccur TO diff.
  ENDLOOP.

  CHECK diff <> 0 OR diff_00 <> 0 OR diff_10 <> 0.

  READ TABLE p_currencyamount TRANSPORTING NO FIELDS WITH KEY itemno_acc = p_itemno
                                                              curr_type  = '00'.
  IF sy-subrc = 0.
    tabix_00 = sy-tabix.
  ENDIF.
  READ TABLE p_currencyamount TRANSPORTING NO FIELDS WITH KEY itemno_acc = p_itemno
                                                              curr_type  = '10'.
  IF sy-subrc = 0.
    tabix_10 = sy-tabix.
  ENDIF.
  READ TABLE p_currencyamount TRANSPORTING NO FIELDS WITH KEY itemno_acc = p_itemno
                                                              curr_type  = '  '.
  IF sy-subrc = 0.
    tabix = sy-tabix.
  ENDIF.

  IF diff_00 <> 0.
    p_currencyamount[ tabix_00 ]-amt_doccur = p_currencyamount[ tabix_00 ]-amt_doccur - diff_00.
  ENDIF.
  IF diff_10 <> 0.
    p_currencyamount[ tabix_10 ]-amt_doccur = p_currencyamount[ tabix_10 ]-amt_doccur - diff_10.
  ENDIF.
  IF diff <> 0.
    p_currencyamount[ tabix ]-amt_doccur = p_currencyamount[ tabix ]-amt_doccur - diff.
  ENDIF.

ENDFORM.

Hinweise zur Installation:

Textelemente:

001    Verarbeitung der Datei
B01    Excel-Datei auswählen
B02    Testlauf ohne Buchen

Selektionstexte:

PA_FNAM    Name der Datei
PA_TEST    Testlauf - nur prüfen

 

Link zur Excel-Vorlage, die mit dem oben stehenden Programm verarbeitet werden kann.

https://drive.google.com/open?id=13XQEsF9yEa1wv6DE6SPn5zPNm8D9p9n-

Hinweis: die Vorlage ist an das Template für die S/4-FIORI-App "Hauptbuchbelege hochladen" angepasst. Es versteht sich wohl von selbst, dass Anpassungen am Programm gemacht werden müssen, wenn das Template abgeändert wird.

Excel-Template

Excel-Template

Weiterlesen

Konfiguration Umsatzsteuermeldung DE

26. September 2018 , Geschrieben von sapmandoo Veröffentlicht in #FI

Ich habe aktuell im Netz nur wenig brauchbare Konfigurationsvorschläge für die elektronische Umsatzsteuermeldung gefunden. Dies umfasst einerseits die verwendeten Steuerkennzeichen und zum anderen die Zuordnung zur entsprechenden Gruppennummer im Formular.

Deshalb nachfolgend ein Konfigurationsvorschlag für die USTVA Stand 2018...

 

Steuerkennzeichen definieren (FTXP)

St.Kz.TextSt.ArtEG-Kennz.
A0Kein SteuervorgangA 
A1Ausgangssteuer 19%A 
A2Ausgangssteuer Inland  7%A 
A6Ausgangssteuer 0% EG-WarenlieferungA1
A8Ausgangssteuer Inland steuerbar steuerfreiA 
A9Ausgangssteuer Ausland steuerbar steuerfr.A 
ABNicht steuerbare sonstige LeistungA1
ACÜbrige nicht steuerbare UmsätzeA 
ADAusgangssteuer innergemein. DreiecksgeschäftA1
ARÜbrige steuerpflichtige Umsätze nach $13b USt A. 5A 
B9Steuerfreie Umsätze neue Fahrzeuge an AbnehmerA 
E1Erwerbssteuer 19% EG-WarenlieferungV9
E2Erwerbssteuer  7% EG-WarenlieferungV9
E3Erwerbssteuer 19% EG-LohnveredelungV9
F1Reverse Charge §13b, Abs. 1 UStGV5
F2Reverse Charge §13b, Abs. 2, Nr. 1+5 UStGV5
F3Reverse Charge §13b, Abs. 2, Nr. 2+3 UStGV5
F4Reverse Charge §13b, Abs. 2, Nr. 4, 6ff. UStGV5
U1Einfuhrumsatzsteuer 19 %V 
V0Kein SteuervorgangV 
V1Vorsteuer Inland 19%V 
V2Vorsteuer Inland  7%V 
V9Vorsteuer Ausland steuerbar steuerfreiV 

Die blau markieren Einträge sind selbst definierte Steuerkennzeichen, wohingegen die übrigen der SAP-Auslieferung entnommen sind.

Die Zuordnung der Steuerkennzeichen zu den einzelnen Zeilen des USTVA-Formulars stellt sich wie folgt dar:

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 1)

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 1)

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 2)

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 2)

Nachfolgend werden die entsprechenden Einstellungen im Customizing skizziert, welche oben stehende Zuordnung abbilden.

Zunächst muss eine Steuergruppenversion zum entsprechenden Gültigkeitsdatum angelegt werden.

IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuergruppenversion zeitabhängig zuordnen...

 

Steuergruppenversionen
LandGültig abSteuergruppenversion
DE1.1.2018EDCL

In bestehenden Systemen wird die Version EDCL bereits vorhanden sein. In diesem Fall ist eine neue Version anzulegen.

Steuerbasissaldengruppierung

IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuerbasissalden gruppieren...

 

 

LndVersionStVorSaldoGrpNr
DEEDCLA1MWS 81
DEEDCLA2MWS 86
DEEDCLA3MWS 36
DEEDCLA6MWS 41
DEEDCLA8MWS 48
DEEDCLA9MWS 43
DEEDCLABMWS 21
DEEDCLACMWS 45
DEEDCLADMWS 42
DEEDCLARMWS 60
DEEDCLB9MWS 44
DEEDCLE1ESA 89
DEEDCLE2ESA 93
DEEDCLE3MWS 46
DEEDCLF2ESA 67
DEEDCLF2ESA 73
DEEDCLF3ESA 67
DEEDCLF4ESA 84
DEEDCLU1MWS 62

Steuersalden gruppieren

IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuersalden gruppieren...

 

LndVersionStVorSaldoGrpNr
DEEDCLE1ESE 67
DEEDCLE2ESE 67
DEEDCLV1VST 66
DEEDCLV2VST 66
DEEDCLV3VST 66

Hinweis für den Druck der USTVA

In einigen Fällen besteht die Anforderung, die Steuer- und Steuerbasisbeträge zu drucken. Hierfür wird zuweilen der Report RFUVDE00 verwendet (Details zur Konfiguration des Drucks s. Report-Doku). Bitte beachtet dabei, dass dieser Report die Zuordnung von Steuerkennzeichen zu Gruppennummern immer mit der Steuergruppenversion initial nachliest, d.h. hier ist ggf. das Customizing entsprechend anzugleichen. 

Weiterlesen

S/4 HANA F4 Werthilfe u.a. für Debitoren und Kreditoren braucht ewig zum öffnen

18. September 2018 , Geschrieben von sapmandoo Veröffentlicht in #Basis-Entwicklung allg., #FI, #CO, #MM, #S4

Symptom:

Beim Öffnen der Werthilfe (z.B. für Kreditoren in der FB60) hängt das System und erst Minuten später wird einem der Werthilfe-Dialog angezeigt.

Abhilfe schafft hier der Hinweis 2571623 - S/4HANA - F4 Search Help is very slow

In diesem wird als eine Möglichkeit zur Behebung des Problems aufgeführt, die Enterprise Search auf die Initialkonfiguration zurückzusetzen. Hierzu dient die Aufgabenliste SAP_ESH_RESET, die mithilfe der Transaktion STC01 ausgeführt werden kann. Allerdings ist die Transaktion nicht gerade ein Ausbund an Benutzerfreundlichkeit, zumindest habe ich einen Moment gebraucht, um mit dem Ding zurechtzukommen.

STC01

STC01

Zunächst muss über das Icon (1.) der Parameter "Zurücksetzen des Mandanten bestätigen" gesetzt werden. Anschließend wird der so geänderte Parameter in eine Variante gespeichert (2.) und zum Schluss die Ausführung der Aufgabenliste als Job eingeplant (3.). Eine Ausführung im Dialog schließt das System aus.

Der Job läuft nicht lange und danach ist die Performance der Werthilfe wieder wie gewohnt.

 

 

 

Weiterlesen
Werbung

Integration von Zahlungsmitteldienstleistern in die SAP Finanzbuchhaltung

3. Juli 2018 , Geschrieben von sapmandoo Veröffentlicht in #Basis-Entwicklung allg., #FI

In den Workshops zur Bankbuchhaltung kommt bei den meisten Kunden (zumindest im Handels-Sektor) irgendwann die Frage nach der Integration von Zahlungsmitteldienstleistern ("Payment Service Provider", kurz PSP) wie PayPal oder Amazon Payments auf.

Mit "Integration" ist dabei üblicherweise das Einlesen und Verbuchen der Avise der verschiedenen PSPs gemeint. Die Antwort darauf lautete bis dato meist: Individualentwicklung.

Mit der Komponente Web Channel Experience Management hat SAP nun ein entsprechendes Framework zur Verfügung gestellt, um neben vielen anderen Funktionen auch diese lästige, aber oft nachgefragte Aufgabe zu bewerkstelligen.

Wer nun aber denkt, dass die Integration wenigstens der gängigsten PSPs per Customizing eingestellt werden kann, wird ähnlich enttäuscht sein, wie über das Abschneiden der deutschen Elf bei den beiden zurückliegenden Weltmeisterschaften. Immerhin für PayPal habe ich mir die Mühe gemacht, dass entsprechende Prozedere genau aufzuschreiben, so dass es Ihnen erspart bleibt.

Es handelt sich dabei um einen Lösungsansatz, der die Funktionen des elektronischen Kontoauszugs (ELKO) verwendet. Im Kern wird so getan, als ob die jeweiligen PSPs (Haus-)Banken sind, die Kontoauszüge anliefern. Der Ablauf des Verfahrens ist dabei wie folgt:

  1. Einlesen der Avis-Datei des PSPs
  2. Mapping der eingelesenen Daten auf eine an den ELKO angelehnte SAP Zwischenstruktur
  3. Abspeichern der Zwischenstrukturen als elektronische Kontoauszüge
  4. Aufruf der Buchungsfunktion des ELKO

Die oben beschriebenen Punkte werden durch die Transaktion FEBPS (Report RFEBKAPSP) initiiert. Hört sich alles im Grunde nicht schlecht an, bis man merkt, dass die (natürlich aufwändigsten) Punkte 1. und 2. komplett selber in Form einer BADI-Implementierung zu entwickeln sind, zu der es auch keinerlei Standard-Implementierung gibt...

Aber nun ja - hilft ja nix, also zunächst sind folgende Business Functions zu aktivieren:

  • LOG_SD_SIMP_02 Vereinfachte Verkaufsprozesse im Vertrieb 2
  • LOG_SD_CI_02 Sales & Distribution 2
  • ERP_WEB_CHANNEL_1 SAP Web Channel Experience Management für SAP ERP
  • ERP_WEB_CHANNEL_2 SAP Web Channel Experience Management 2.0
  • ERP_WEB_CHANNEL_3 SAP Web Channel Experience Management 3.0

Ich habe keinerlei unerwünschte Seiteneffekte der o.g. BF feststellen können, die Aktivierung kann also m.E. bedenkenlos durchgeführt werden.

Customizing

U.a. wird dadurch der folgende Customizing-Pfad eingeblendet: IMG - Vertrieb - SAP Web Channel Experience Management...

Im Abschnitt Zahlungsdienstleister können nun die benötigten PSPs dem System bekannt gemacht werden. Unter Business Add-Ins (BAdIs) - BAdI: Import der Abrechnungsdatei pro Zahlungsdienstleister erfolgt die Implementierung der weiter oben genannten Teilfunktionen 1. & 2. (Mustercoding s.u.).

Alles weitere Customizing ist das kleine Einmaleins des elektronischen Kontoauszugs. Im Customizing des ELKO werden nun für jeden PSP ein Vorgangstyp, die entsprechenden externen Vorgangscodes (Details siehe Abschnitt "Mapping") nebst Zuweisung der Buchungsregeln und abschließend die Zuordnung der Pseudobank des PSP zum entsprechenden Vorgangstyp hinterlegt. Diese Pseudobank muss auch als Hausbank mit Zuordnung zum entsprechenden Verrechnungskonto angelegt werden.

Ich habe zur Definition der Pseudobank einfach den Namen des PSP als Bankschlüssel und die Vertragsnummer als Kontonummer verwendet. Für die Anlage solcher Pseudo- bzw. internen Banken gibt es die Transaktion FIPS, mit der die länderspezifischen Prüfungen der BLZ ignoriert werden. Auf diese Weise lässt sich also bspw. auch ein nicht-numerischer Bankschlüssel anlegen.

Nachfolgend ist ein Beispiel-Customizing für den Zahlungsdienstleister PayPal aufgeführt:

Legen Sie zunächst mithilfe der Transaktion FIPS die Pseudo-Hausbank des PSP an:

Geben Sie unbedingt den Bankschlüssel auch unter SWIFT/BIC an, sonst findet die Eingangsverarbeitung des Kontoauszuges die Pseudobank nicht.

Prägen Sie in der FI12 die Pseudobank als Hausbank aus und legen Sie ein entsprechendes Hausbankkonto dazu an. Im vorliegenden Beispiel wurde die Vertragskontonummer als Kontonummer verwendet.

Die Hinterlegung einer IBAN ist natürlich nicht zwingend. Geben Sie das zu verwendende Hauptbuchkonto an. Denken Sie daran, auch ein entsprechendes Bankunterkonto anzulegen, welches später im Customizing des elektronischen Kontoauszugs zu hinterlegen ist.

Hinterlegen Sie im Customizing (OBXK) ein Konto für die Bankspesen, auf das die PayPal Gebühren zu buchen sind. Sofern es sich dabei um eine Kostenart handelt, muss ggf. eine CO Vorschlagskontierung (OKB9) zur Kostenart gepflegt werden.

 

Definieren und aktiveren Sie dann in der Komponente Web Channel Experience Management, die benötigen Zahlungsdienstleister
(IMG: Vertrieb - SAP Web Channel Experience Management - Zahlungsdienstleister - Zahlungsdienstleister definieren / Zahlungsdienstleister aktivieren (mandantenabhängig))

 

Fügen Sie abschließend das Customizing für den elektronischen Kontoauszug hinzu. Legen Sie zunächst die benötigten Kontosymbole an und ordnen Sie die entsprechenden Konten zu. Im vorliegenden Beispiel genügt die Angabe des Bankkontos sowie des korrespondierenden Bankunterkontos:

 

 

Legen Sie die Buchungsregeln und deren konkrete Ausgestaltung an. Im vorliegenden Fall sind es die Buchungsregeln für die Geschäftsvorfälle "Zahlungseingang" und "Rückerstattung":

Die Buchungsregeln buchen im Hauptbuch (Buchungsbereich 1) PayPal-Bank an PayPal Unterkonto bzw. umgekehrt und versuchen im Nebenbuch einen debitorischen Ausgleich gegen das PayPal Unterkonto:

 

Legen Sie einen Vorgangstyp namens PAYPAL an und weisen Sie die die externen Vorgangsschlüssel T0006  (Zahlungseingänge) und T1107 (Rückerstattungen) mit ihren korrespondierenden Buchungsregeln und einem passenden Interpretationsalgorithmus zu.

Ordnen Sie abschließend das Pseudo-Hausbankkonto dem Vorgangstyp zu.

Buchungslogik

Für die Ausgestaltung des Customizings des elektr. Kontoauszugs ist natürlich die gewünschte Buchungslogik maßgeblich. Eine mögliche Ausprägung könnte wie folgt aussehen:

Überblick Buchungslogik im Prozess "Direktverkauf mit Bezahlung per Zahlkarte"

Überblick Buchungslogik im Prozess "Direktverkauf mit Bezahlung per Zahlkarte"

Im obenstehenden Beispiel wird ein Filialverkauf mit direkter Bezahlung bei Mitnahme des Artikels per Kreditkarte dargestellt.

Aus der Filiale wird der Verkauf mit Angabe des verwendeten Zahlungsmittels an die Finanzbuchhaltung gemeldet.

In regelmäßigen Abständen sendet der Zahlungsmittelprovider Avise über abgerechnete Zahlungen an den Händler üblicherweise unter Angabe sämtlicher Transaktionsdaten und der angefallenen Gebühren. Diese Avise werden über die FEBPS eingelesen und verbucht. Für diese Verbuchung sind die entsprechenden Buchungsregeln auszuprägen und ggf. Suchmuster oder Userexits zu verwenden, um bspw. der Gebührenposition das passende Steuerkennzeichen und ggf. eine Kostenstelle zuzuführen (vgl. hier).

Der tatsächliche Zahlungseingang wird dann über den "echten" Kontoauszug desjenigen Bankkontos verbucht, auf welches der PSP reguliert hat.

Mapping

Elementarer Bestandteil des Prozesses ist natürlich, das Mapping der externen Daten des PSP auf die internen Kontoauszugsstrukturen herzustellen. Die internen Strukturen haben den Typ

FPS_HEADER - Auszugskopf

FPS_ITEM - Umsätze

Für das Mapping habe ich mir eine Excel-Tabelle angelegt, in der in einfacher Form Quelle, Ziel und Verarbeitungshinweise aufgeführt sind.

 

Mapping Auszugskopf

Mapping Auszugskopf

Mapping Umsatzdaten

Mapping Umsatzdaten

In das Feld GCODE der Umsatztabelle ist also der externe Vorgangscode abzufüllen, zu dem im Customizing d. elektr. Kontoauszugs auch die entsprechenden Buchungsregeln hinterlegt werden.

Nach dem Mapping kann dann die BadI-Implementierung erfolgen. Eine mögliche Ausprägung des Codings könnte so aussehen:

**************************************************************************
*   Upload und Mapping der Datei vom PSP in SAP-Strukturen
**************************************************************************
*   Bsp: PAYPAL
**************************************************************************
  METHOD if_ex_fps_import_paysp_file~read_paysp_settlement_file.

    DATA: lt_paypal TYPE ltt_paypal,
          lt_buf    TYPE TABLE OF string.

     CASE i_flt_vl.
      WHEN 'ZPP'.   "PayPal
        CHECK i_pfname IS NOT INITIAL.

        lt_buf = upload_data( i_pfname ).
        structurize_data_paypal( EXPORTING it_buf = lt_buf
                                 IMPORTING et_paypal = lt_paypal ).

        map_data_paypal( EXPORTING i_bank    = i_bank
                                   i_account = i_account
                                   it_paypal = lt_paypal
                         IMPORTING et_header = et_header
                                   et_items  = et_items
                         CHANGING  ct_return = et_return ).

    ENDCASE.

  ENDMETHOD.

 

Im ersten Schritt wird die Datei vom Zahlungsdienstleister in eine Puffer-Tabelle geladen (in diesem Fall CSV-Format) und anschließend strukturiert in eine interne Arbeitstabelle (hier vom Typ ltt_paypal, Satzbett PayPal-Umsätze) abgelegt (Methode STRUCTURIZE_DATA_<psp>). Dieser Abschnitt ist natürlich wesentlich vom Format und Inhalt der PSP-Datei abhängig.

Die entscheidende Verarbeitung erfolgt jedoch in der Methode MAP_DATA_<psp>, in der die zuvor strukturiert abgelegte Datei des PSP in die internen SAP Tabellen ET_HEADER und ET_ITEMS überführt werden.

Nachfolgend das komplette Mustercoding für den Upload der Avise des PSP PayPal:

Datendeklaration PayPal-Satzbett

PROTECTED SECTION.

  TYPES:
    BEGIN OF lty_paypal,
      section(2)          TYPE c,
      transaction         TYPE string,
      invoice(14)         TYPE c,
      reference(16)       TYPE c,
      type(3)             TYPE c,
      code(5)             TYPE c,
      start_date(25)      TYPE c,
      end_date(25)        TYPE c,
      debit_credit(2)     TYPE c,
      amount              TYPE string,
      currency(3)         TYPE c,
      com_debit_credit(2) TYPE c,
      amount_com          TYPE string,
      com_currency(3)     TYPE c,
      no_use(2)           TYPE c,
      id(13)              TYPE c,
      follow_up_nb        TYPE string,
      shop                TYPE string,
      bank_id             TYPE string,
    END OF lty_paypal.

  TYPES: ltt_paypal TYPE STANDARD TABLE OF lty_paypal.

Methode upload_data:

Importing I_PFNAME           TYPE STRING     Dateiname
Returning value( RT_BUF )    TYPE STR_TAB    String Tabelle

 

 METHOD upload_data.
    CALL METHOD cl_gui_frontend_services=>gui_upload
      EXPORTING
        filename = i_pfname
        filetype = 'ASC'
      CHANGING
        data_tab = rt_buf[].
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDMETHOD.

Methode structurize_data_paypal

Importing IT_BUF       TYPE STR_TAB     String Tabelle
Exporting ET_PAYPAL    TYPE LTT_PAYPAL  Satzbett PayPal  



  METHOD STRUCTURIZE_DATA_PAYPAL.
    DATA: ls_paypal TYPE lty_paypal,
          lv_rec    TYPE string.

    LOOP AT it_buf INTO lv_rec.
      CLEAR ls_paypal.
      TRANSLATE lv_rec USING '" '.  
      CONDENSE lv_rec NO-GAPS.
      SPLIT lv_rec AT ',' INTO
          ls_paypal-section
          ls_paypal-transaction
          ls_paypal-invoice
          ls_paypal-reference
          ls_paypal-type
          ls_paypal-code
          ls_paypal-start_date
          ls_paypal-end_date
          ls_paypal-debit_credit
          ls_paypal-amount
          ls_paypal-currency
          ls_paypal-com_debit_credit
          ls_paypal-amount_com
          ls_paypal-com_currency
          ls_paypal-no_use
          ls_paypal-id
          ls_paypal-follow_up_nb
          ls_paypal-shop
          ls_paypal-bank_id.
      APPEND ls_paypal TO et_paypal.
    ENDLOOP.

  ENDMETHOD.

Methode map_data_paypal

Importing I_BANK       TYPE BANKK         Bank
Importing I_ACCOUNT    TYPE BANKN         Konto
Importing IT_PAYPAL    TYPE LTT_PAYPAL    Paypal Records
Exporting ET_HEADER    TYPE FPS_T_HEADER  Auszug
Exporting ET_ITEMS     TYPE FPS_T_ITEMS   Umsatz
Changing  CT_RETURN    TYPE BAPIRET2_T    Returntabelle

 

  METHOD map_data_paypal.
*--------------------------------------------------------------------
*   PayPal-Daten in SAP Kontoauszugsdaten mappen
*--------------------------------------------------------------------

    DATA: ls_paypal    TYPE lty_paypal,
          ls_header    LIKE LINE OF et_header,
          ls_item      LIKE LINE OF et_items,
          ls_return    LIKE LINE OF ct_return,
          ls_t028b     TYPE t028b,
          lv_t028b_key TYPE absnd_eb.

*--------------------------------------------------------------------
*   HEADER
*--------------------------------------------------------------------
    CLEAR ls_header.

*   Bankdaten
    IF i_bank IS NOT INITIAL.
      ls_header-bank = i_bank.
    ENDIF.
    IF i_account IS NOT INITIAL.
      ls_header-ktonr = i_account.
    ENDIF.
    IF ls_header-bank IS INITIAL OR ls_header-ktonr IS INITIAL.
      "Pseuobank/Konto des PSP ermitteln
      SELECT * FROM t028b UP TO 1 ROWS INTO ls_t028b WHERE vgtyp = 'PAYPAL'.
      ENDSELECT.
      IF sy-subrc = 0.
        ls_header-bank  = ls_t028b-bankl.
        ls_header-ktonr = ls_t028b-ktonr.
      ELSE.
        "Fehler: keine Pseudo-Bank ermittelbar
        ls_return-type       = 'E'.
        ls_return-id         = 'ZFIC_PSP'.
        ls_return-number     = '001'.
        ls_return-message_v1 = 'PAYPAL'.
        APPEND ls_return TO ct_return.
      ENDIF.
    ENDIF.

*   Auszugsnummer
    CONCATENATE ls_header-bank '%' ls_header-ktonr '%' INTO lv_t028b_key.
    SELECT aznum FROM febko INTO ls_header-aznum UP TO 1 ROWS
           WHERE absnd LIKE lv_t028b_key
           ORDER BY aznum DESCENDING.
    ENDSELECT.
    IF sy-subrc = 0.
      ADD 1 TO ls_header-aznum.
    ELSE.
      ls_header-aznum = 1.
    ENDIF.

*   Auszugsdatum
    READ TABLE it_paypal INTO ls_paypal
         WITH KEY section = 'RH'.
    IF sy-subrc = 0.
      ls_header-azdat(4)   = ls_paypal-transaction(4).
      ls_header-azdat+4(2) = ls_paypal-transaction+5(2).
      ls_header-azdat+6(2) = ls_paypal-transaction+8(2).
    ELSE.
      ls_header-azdat = sy-datum.
    ENDIF.

*   Auszugs-Währung
    ls_header-waers = 'EUR'.

*   Start-Saldo
    "n/a

*   End-Saldo
    "n/a

*--------------------------------------------------------------------
*   ITEMS
*--------------------------------------------------------------------
    LOOP AT it_paypal INTO ls_paypal WHERE section = 'SB'.    "Die Einzelpos. tragen Satzart SB

      CHECK ls_paypal-code NE 'T0400'.        "GVC 'interne Umbuchungen' ignorieren

*     Bankdaten
      ls_item-bank  = ls_header-bank.
      ls_item-ktonr = ls_header-ktonr.
      ls_item-aznum = ls_header-aznum.

*     Valutadatum & Zeit
      ls_item-valut(4)   = ls_paypal-end_date(4).
      ls_item-valut+4(2) = ls_paypal-end_date+5(2).
      ls_item-valut+6(2) = ls_paypal-end_date+8(2).
      ls_item-uzeit(2)   = ls_paypal-end_date+10(2).
      ls_item-uzeit+2(2) = ls_paypal-end_date+13(2).
      ls_item-uzeit+4(2) = ls_paypal-end_date+16(2).
      ls_item-bvdat      = ls_item-valut.

*     Beträge
      ls_item-waers = ls_paypal-currency.
      _convert( EXPORTING in  = ls_paypal-amount
                IMPORTING out = ls_item-wrbtr ).
      DIVIDE ls_item-wrbtr BY 100.
      IF ls_paypal-debit_credit = 'DR'.
        MULTIPLY ls_item-wrbtr BY -1.
      ENDIF.

      "Gebühren
      _convert( EXPORTING in  = ls_paypal-amount_com
                IMPORTING out = ls_item-spesk ).
      DIVIDE ls_item-spesk BY 100.
      IF ls_paypal-debit_credit = 'DR'.
        MULTIPLY ls_item-spesk BY -1.
      ENDIF.

*     Verwendungszweck & Buchungstexte
      ls_item-vwz01 = ls_paypal-invoice.

*     GVC extern
      ls_item-gcode = ls_paypal-code.
      TRANSLATE ls_item-gcode TO UPPER CASE.

*     Header-Infos aktualisieren
      ADD 1 TO ls_header-anzum.

      IF ls_paypal-debit_credit = 'CR'.
        ADD ls_item-wrbtr TO ls_header-sumso.
      ENDIF.
      IF ls_paypal-debit_credit = 'DR'.
        ADD ls_item-wrbtr TO ls_header-sumha.
      ENDIF.

      APPEND ls_item TO et_items.

    ENDLOOP.

    APPEND ls_header TO et_header.

  ENDMETHOD.

Methode _convert

Hilfsmethode zum Konvertieren von Werten in Strings in CURR-Felder:

Importing IN  TYPE STRING

Exporting out TYPE KWBTR_EB.

  METHOD _convert.
    DATA(hlpin.
    out 0.
    IF hlp CO '0123456789,. '.
      TRANSLATE hlp USING ',.'.
      CONDENSE hlp NO-GAPS.
      out hlp.
    ENDIF.
  ENDMETHOD. 

 

Zunächst werden im Auszugskopf Bank und Kontonummer mit der Pseudobank des PSP gefüllt, sowie Auszugsnummer, -Datum und Währung gesetzt.

Bei den Umsätzen werden Betrag und Gebühr gefüllt sowie das Valutadatum und Verwendungszweckinformationen eingesetzt. Als externen GVC setze ich hier den in der PSP-Datei enthaltenen Vorgangscode in diesem Fall 'T0006' (Zahlung) bzw. 'T1107' (Rückerstattung). Im Customizing des ELKO muss dann zu diesen GVCs eine geeignete Buchungsregel hinterlegt werden.

Nach Durchlauf des BadI erzeugt der Standardreport RFEBKAPSP aus den so gemappten Tabellen einen Kontoauszug (Tab. FEBKO, FEBEP, FEBRE) und übergibt diesen an die Standard-Kontoauszugsverarbeitung (RFEBBU01).

Der Report RFEBKAPSP wird mithilfe der Transaktion FEBPS gestartet. Das Selektionsbild ähnelt dabei stark der Starttransaktion des elektronischen Kontoauszuges FF_5.

 

Verbuchung von Gebühren (Rückerstattungsfall)

Für die Verbuchung der Gebühren ist ggf. noch eine weitere BadI-Implementierung notwendig. Im Falle von Rückerstattungen kann es vorkommen, dass der Gebührenanteil negativ wird. In diesen Fällen steigt die Standard-Kontoauszugsverbuchung mit der Fehlermeldung aus, dass das Feld BSEG-WRBTR einen Formatfehler aufweist. Wer schonmal eine FI-Buchung manuell durchgeführt hat, weiß, dass Beträge nur positiv eingegeben werden können und das Vorzeichen durch den Buchungsschlüssel bestimmt wird.

Für diese Fälle empfiehlt es sich in einer Implementierung zur BadI-Definition FEB_BADI die Kontoauszugsbuchung zu beeinflussen bzw. in diesem Fall zu korrigieren:

FEB_BADI, Methode CHANGE_POSTING_DATA:

 

METHOD if_ex_feb_badi~change_posting_data.
  FIELD-SYMBOLS: <lf_ftpost> TYPE ftpost.

  CHECK i_febko-anwnd = '0001'.                    "nur Elko
  CHECK NOT t_ftpost[] IS INITIAL.                 "Buchungen?

* S.Rohde Consenso 01/2024
* PayPal Gebühren richtig kontieren
  IF i_febko-hbkid  = 'PAYP'  AND  "Pseusobank Paypal
     i_febko-hktid  = 'PAYP1' AND  "Pseudokonto PayPal
     i_posting_area = '2'     AND  "Nebenbuch
     i_febep-vgint  = 'APP2'. "<<< hier die Buchungsregel für Rückerstattung angeben

    LOOP AT t_ftpost ASSIGNING <lf_ftpost>.
      CHECK <lf_ftpost>-count = '002' AND <lf_ftpost>-stype = 'P'.
      CASE <lf_ftpost>-fnam.
        WHEN 'BSEG-WRBTR'.  "Minuszeichen rausschmeissen
          IF <lf_ftpost>-fval CA '-'.
            TRANSLATE <lf_ftpost>-fval USING '- '.
            CONDENSE <lf_ftpost>-fval.
          ENDIF.
        WHEN 'BSEG-BSCHL'.  "Buchungsschlüssel drehen
          IF <lf_ftpost>-fval = '40'.
            <lf_ftpost>-fval = '50'.
          ENDIF.
      ENDCASE.
    ENDLOOP.
  ENDIF.

ENDMETHOD.
Weiterlesen

Zusammenfassende Infos zum Mailversand von FI-Korrespondenzen, Avisen & Mahnungen

27. April 2018 , Geschrieben von sapmandoo Veröffentlicht in #FI, #Basis-Entwicklung allg.

Eine heutzutage praktisch bei jedem Projekt aufkommende Anforderung ist, die aus FI entstehenden Schriftstücke wie Zahlungsavise, Mahnungen, Saldenbestätigungen und sonstige Korrespondenzen per Mail versenden zu können. 

Anders als bei der MM- bzw. SD-Nachrichtenfindung ist diese Funktionalität im FI leider nicht nativ vorhanden, d.h. es muss immer etwas zusätzliches Coding in Form von sog. Business Transaction Events (BTE) verbaut werden. 

Somit ist etwas Konzeption und ein wenig ABAP Programmierung notwendig. Die Konzeption besteht im wesentlichen daraus, festzulegen, unter welchen Voraussetzungen ein Geschäftspartner ein Dokument per Mail erhält und woher ggf. die eMail-Adresse gezogen werden soll. Das kann u.U. dann knifflig werden, wenn der GP auch andere Nachrichten per Mail erhält wie bspw. Bestellungen oder Rechnungen und diese Nachrichten an unterschiedliche Mail-Adressen versendet werden sollen.

Üblicherweise wird für FI-Korrespondenzen das Feld "Internet Sachbearbeiter" aus der Buchungskreissicht des Debitors bzw. Kreditors herangezogen (KNB1- bzw. LFB1-INTAD).

Nachfolgend sind die wichtigsten Korrespondenzen und die jeweiligen für den Mailversand zuständigen BTEs aufgeführt:

FI Korrespondenzen und BTEs
Korrespondenz BTE Weitere Informationen
Zahlungsavis 2040 Prozess-Schnittstelle s. Artikel hier
Mahnungen 1040 Prozess-Schnittstelle s. Artikel hier + Hinweis 2838984
Saldenbestätigungen 2410 Prozess-Schnittstelle s. Hinweis 563112
Sonstige Korrespondenzen 2310 Prozess-Schnittstelle s. Hinweis 549119, Pkt 5.

 

In den nachfolgend aufgeführten Hinweisen wird behandelt, wie erweiterte Mailoptionen gesetzt werden können, z.B. einen einleitenden Text in der Mail, CC/BCC-Empfänger, Priorität und so weiter...

Erweiterte Mail-Optionen
KorrespondenzInformationen zu erweiterten Mail-Optionen
Zahlungsaviss. Hinweis 1033893
Mahnungens. Hinweis 1042992
Saldenbestätigungens. Hinweis 1377820
Sonstige Korrespondenzens. Hinweis 1360070

 

Bei vielen FI-Korrespondenzarten wird mittlerweile die Verwendung von PDF-Formularen unterstützt. Nachfolgend einige Hinweise zum Thema PDF-Formulare & Mail-Versand:

  • 1251408 - Avis mit Adobe: Keine optische Archivierung bei Mail / Fax
  • 1460038 - Mahnbriefe im PDF-Format per Mail oder FAX verschicken
  • 1345695 - Faxen von Avisen mit Adobe / PDF
  • tbc

Solltet Ihr in diesem Kontext noch über Hinweise oder Erkenntnisse stolpern, bitte seid so nett und lasst es mich in den Kommentaren wissen...

  

 

 

Weiterlesen

Kostenartentexte und Sachkontentexte in andere Sprache kopieren

4. Dezember 2017 , Geschrieben von sapmandoo Veröffentlicht in #SAP Reports, #FI, #CO, #Basis-Entwicklung allg.

Das hat vermutlich jeder schon mal erlebt: man meldet sich in einer Sprache <> DE im System an und bei der Anzeige von Sachkonten und/oder Kostenarten fehlen die Texte, weil bei der Anlage von neuen Konten das Übersetzen vergessen bzw. unterlassen wurde.

Anbei zwei Reports, die Kostenarten- und Sachkontentexte von einer Quellsprache in eine Zielsprache kopieren. Ein Anwendungsfall könnte bspw. sein, dass die englischen Texte in andere (Fremd-) Sprachen kopiert werden sollen, damit die ausländischen Kollegen in ihren Reports wenigstens die englischen Kontenbezeichnungen sehen...

 

Kopieren von Sachkontentexten

 

REPORT z_copy_sako_texts
       NO STANDARD PAGE HEADING LINE-SIZE 255.

*******************************************************************
* Rohde 01/2010
*******************************************************************
* Kopieren(!) von Sachkonten-Texten (Kurz und Langtext) von einer
* Sprache in eine andere. So lassen sich z.B. die englischen
* Sachkontenbezeichnungen auch in andere Sprachen kopieren, damit
* man bspw. bei Anmeldung in Spanisch keine leeren Sachkontentexte
* vorfindet. Die Betonung liegt auf KOPIEREN, nicht übersetzen,
* so schlau ist das Programm leider noch nicht!!!!
* Die Änderungen werden per Batch-Input durchgeführt. Bestehende
* Texte in der Zielsprache werden NICHT überschrieben.
*******************************************************************
TABLES: skat, ska1, t001.

INCLUDE bdcrecx1.

SELECTION-SCREEN ULINE.
SELECT-OPTIONS: so_saknr FOR skat-saknr.          "Sachkonten
* Achtung: die Angabe Buchungskreis wird nur zur Ermitlung des
* Kontenplans benötigt. Das Programm muss nicht pro Buchungskreis
* laufen, da die Texte buchungskreisunabhängig sind!!!!
PARAMETERS: pa_bukrs LIKE t001-bukrs OBLIGATORY.  "Buchungskreis
PARAMETERS: pa_qlang LIKE sy-langu OBLIGATORY.    "Quell-Sprache
PARAMETERS: pa_zlang LIKE sy-langu OBLIGATORY.    "Ziel-Sprache
PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'.      "Testlauf

DATA: i_skat TYPE TABLE OF skat.
DATA: wa_skat TYPE skat.

START-OF-SELECTION.

  IF pa_test IS INITIAL.
    PERFORM open_group.
  ENDIF.
* Buchungskreisdaten inkl. Kontenplan holen
  SELECT SINGLE * FROM t001 WHERE bukrs = pa_bukrs.
  CHECK sy-subrc = 0.
  SELECT * FROM  skat   INTO TABLE i_skat
         WHERE  spras  = pa_qlang
         AND    ktopl  = t001-ktopl
         AND    saknr IN so_saknr.
  LOOP AT i_skat INTO wa_skat.
    SELECT SINGLE COUNT(*) FROM  skat
           WHERE  spras  = pa_zlang
           AND    ktopl  = wa_skat-ktopl
           AND    saknr  = wa_skat-saknr.
    IF sy-subrc = 0.
      WRITE: / 'Konto', wa_skat-saknr,
               'Text in Sprache', pa_zlang, 'schon vorhanden'.
    ELSE.
      PERFORM protokoll.
      IF pa_test IS INITIAL.
        PERFORM fs00.
      ENDIF.
    ENDIF.
  ENDLOOP.
  IF pa_test IS INITIAL.
    PERFORM close_group.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  fs00
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fs00.

  PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=TAB04'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'GLACCOUNT_SCREEN_KEY-SAKNR'.
  PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-SAKNR'
                                wa_skat-saknr.
  PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-BUKRS'
                                pa_bukrs.
  PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=ACC_MOD'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'GLACCOUNT_SCREEN_KEY-SAKNR'.
  PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-SAKNR'
                                wa_skat-saknr.
  PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-BUKRS'
                                pa_bukrs.
  PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=2105_P++'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'GLACCOUNT_SCREEN_COA-LANGU_KW(01)'.
  PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=SAVE'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'GLACCOUNT_SCREEN_COA-TXT50_TX(01)'.
  PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-LANGU_TX(01)'
                                pa_zlang.
  PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-TXT20_TX(01)'
                                wa_skat-txt20.
  PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-TXT50_TX(01)'
                                wa_skat-txt50.
  PERFORM bdc_transaction USING 'FS00'.

ENDFORM.                    "fs00
*&---------------------------------------------------------------------*
*&      Form  PROTOKOLL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM protokoll .
  WRITE: / wa_skat-saknr,
           pa_zlang,
           wa_skat-txt20,
           wa_skat-txt50.

ENDFORM.                    " PROTOKOLL

Kopieren von Kostenartentexten

REPORT  z_copy_kstar_texts.

*******************************************************************
* Rohde 01/2010
*******************************************************************
* Kopieren(!) von Kostenarten-Texten (Kurz und Langtext) von einer
* Sprache in eine andere. So lassen sich z.B. die englischen
* Kostenartenbezeichnungen auch in andere Sprachen kopieren, damit
* man bspw. bei Anmeldung in Spanisch keine leeren Kostenartentexte
* vorfindet. Die Betonung liegt auf KOPIEREN, nicht übersetzen,
* so schlau ist das Programm leider noch nicht!!!!
* Die Änderungen werden per BAPI durchgeführt. Bestehende
* Texte in der Zielsprache werden NICHT überschrieben.
*******************************************************************

TABLES: csku, tka01.

DATA: git_csku TYPE TABLE OF csku,
      gs_csku  TYPE csku.
DATA: git_textmdco  TYPE TABLE OF textmdco,
      gs_textmdco    TYPE textmdco.

*******************************************************************
PARAMETERS: pa_kokrs LIKE tka01-kokrs OBLIGATORY.  "Kostenrech.kreis
SELECT-OPTIONS: so_kstar FOR csku-kstar.           "Kostenart
PARAMETERS: pa_qlang LIKE csku-spras OBLIGATORY,   "Quell-Sprache
            pa_zlang LIKE csku-spras OBLIGATORY.   "Ziel-Sprache
PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'.       "Testlauf
*******************************************************************

*******************************************************************
START-OF-SELECTION.
*******************************************************************

  SELECT SINGLE * FROM tka01 WHERE kokrs = pa_kokrs.
  IF sy-subrc NE 0.
    MESSAGE e600(fr) WITH 'Kostenrechungskreis' pa_kokrs
                          'ungültig'.
  ENDIF.

  SELECT * FROM  csku INTO TABLE git_csku
         WHERE  spras  = pa_qlang
         AND    ktopl  = tka01-ktopl
         AND    kstar IN so_kstar.

  LOOP AT git_csku INTO gs_csku.
    SELECT SINGLE * FROM  csku
           WHERE  spras  = pa_zlang
           AND    ktopl  = gs_csku-ktopl
           AND    kstar  = gs_csku-kstar.
    IF sy-subrc = 0.
      SUMMARY.
      WRITE: / 'Text zu Kostenart',
             gs_csku-kstar,
             'in Sprache', pa_zlang,
             'schon vorhanden'.
    ELSE.
      REFRESH git_textmdco.
      CLEAR   gs_textmdco.
      gs_textmdco-spras = pa_zlang.
      gs_textmdco-ktext = gs_csku-ktext.
      gs_textmdco-ltext = gs_csku-ltext.
      APPEND gs_textmdco TO git_textmdco.
      IF pa_test = space.
        PERFORM update_kstar_texts.
      ELSE.
        DETAIL.
        WRITE: / gs_csku-ktopl,
                 gs_csku-kstar,
                 gs_textmdco-spras,
                 gs_textmdco-ktext,
                 gs_textmdco-ltext.
      ENDIF.
    ENDIF.
  ENDLOOP.


*&---------------------------------------------------------------------*
*&      Form  update_kstar_texts
*&---------------------------------------------------------------------*
*       BAPI-Aufruf Ändern Kostenartentext
*----------------------------------------------------------------------*
FORM update_kstar_texts.

  CALL FUNCTION 'K_COSTELEMENT_CHANGE_TEXT'
    EXPORTING
      ktopl        = gs_csku-ktopl
      kstar        = gs_csku-kstar
    TABLES
      texttable    = git_textmdco
    EXCEPTIONS
      not_found    = 1
      foreign_lock = 2
      OTHERS       = 3.
  IF sy-subrc <> 0.
    SUMMARY.
    WRITE: 'Fehler', sy-subrc, 'beim Update Kostenart', gs_csku-kstar.
  ELSE.
    DETAIL.
    WRITE: 'Kostenart', gs_csku-kstar, 'aktualisiert'.
  ENDIF.

ENDFORM.                    "update_kstar_texts
Weiterlesen

Mahnliste RFMAHN21 erweitern

26. August 2017 , Geschrieben von sapmandoo Veröffentlicht in #FI

Im Hinweis 590421 ist eine Möglichkeit beschrieben, die Mahnliste RFMAHN21 um eigene Felder zu erweitern. Bei der im Hinweis genannten Lösung handelt es sich jedoch um eine Modifikation, die vermutlich nicht in jedem System verbaut werden kann/soll. Alternativ lässt sich das Ganze auch mit einem impliziten Enhancement bewerkstelligen, was dann im technischen Sinne eben keine Modifikation mehr darstellt...

Hierzu wird einfach an das Ende der Routine APPEND_MHND_EXT2 im RFMAHN21 ein implizites Enhancement eingefügt, welches dann den Beispielcode aus dem o.g. Hinweis beherbergt (in leicht abgewandelter Form). 

Siehe auch hier

Weiterlesen
Werbung

IDoc ACC_DOCUMENT - Beispiele

20. Februar 2017 , Geschrieben von sapmandoo Veröffentlicht in #FI, #Basis-Entwicklung allg.

Will man FI-Belege aus externen Quellen ins System buchen, bietet sich die Verwendung von IDocs des Typs ACC_DOCUMENT an. In den nachfolgenden Abschnitten wird die ordnungsgemäße Befüllung des IDoc-Inhalts beschrieben. 

Eigenschaften der IDocs des Typ ACC_DOCUMENT

Nachrichtentyp: ACC_DOCUMENT

Basistyp: ACC_DOCUMENT04

 

Struktur

Die relevanten Segmente des IDocs sind:

 

  • E1BPACHE09 : Kopfzeile

Status : Optional , min. Anzahl : 1 , max. Anzahl : 1

  • E1BPACGL09 : Sachkontenzeile

Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999

  • E1BPACAR09 : Debitorzeile

Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999

  • E1BPACAP09 : Kreditorzeile

Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999

  • E1BPACTX09 : Steuerzeile

Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999

  • E1BPACCR09 : Währungspositionen

Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999

 

Der generelle Aufbau ist wie folgt: Ein valides IDoc besteht aus genau einem Kopfsegment E1BPACHE09 und mindestens 2 Positionen. Die Positionen setzen sich jeweils aus einem Segment der Typen E1BPACGL09, E1BPACAP09 oder E1BPACAR09 mit jeweils einem korrespondierenden Betragssegment E1BPACCR09 zusammen. Die Verknüpfung zwischen den Belegpositionen und den Betragssegmenten erfolgt über das Feld ITEMNO_ACC (Positionsnummer).

Minimal-Beleg:

Belegkopf E1BPACHE09

Position 000001

Sachkontenzeile E1BPACGL09 oder

Kreditorenzeile E1BPACAP09 oder

Debitorenzeile E1BPACAR09

Position 000002

Sachkontenzeile E1BPACGL09 oder

Kreditorenzeile E1BPACAP09 oder

Debitorenzeile E1BPACAR09

Position 000001 Betragssegment E1BPACCR09

Position 000002 Betragssegment E1BPACCR09

 

Die Positionsnummern können im Prinzip beliebig vergeben werden, es empfiehlt sich jedoch, eine aufsteigende nummerische Positionsnummernvergabe vorzusehen.

 

Befüllung

Der oben beschriebene Minimalbeleg benötigt mindestens folgende Feldversorgungen:

E1BPACHE09

BUS_ACT             RFBU (Vorgang fix)

USERNAME        USERXYZ

HEADER_TXT      KOPFTEXT (Belegkopftext, optional, sofern Belegart keine Eingabe erfordert)

COMP_CODE     1000 (Buchungskreis)

DOC_DATE         20150227 (Belegdatum)

PSTNG_DATE     20150227 (Buchungsdatum)

DOC_TYPE          SA (Belegart)

REF_DOC_NO    REFERENZ-NR (Referenznummer, optional, sofern Belegart keine Eingabe erfordert)

 

E1BPACGL09  (1. Position, Sachkontenposition)

ITEMNO_ACC    000010  (Positionsnummer)

GL_ACCOUNT    0000160000 (Sachkonto)

ITEM_TEXT         BUCHUNGSTEXT (optional)

ALLOC_NMBR   ZUORDNUNG (optional, ansonsten wird Zuordnung systemseitig gemäß Einstellung im Sachkontenstamm befüllt)

 

E1BPACGL09  (2. Position, Sachkontenposition)

ITEMNO_ACC    000020  (Positionsnummer)

GL_ACCOUNT    0000151000 (Sachkonto)

ITEM_TEXT         BUCHUNGSTEXT (optional)

ALLOC_NMBR   ZUORDNUNG (optional, ansonsten wird Zuordnung systemseitig gemäß Einstellung im Sachkontenstamm befüllt)

 

E1BPACCR09 (zu Position 1)

ITEMNO_ACC    000010

CURRENCY         EUR (Belegwährung)

AMT_DOCCUR  10.00  (Betrag in Belegwährung)

 

E1BPACCR09 (zu Position 2)

ITEMNO_ACC    000020

CURRENCY         EUR

 AMT_DOCCUR   10.00-   

(Achtung: Soll und Haben wird durch positiven bzw. negatives Vorzeichen                          unterschieden, - = Haben, + = Soll)

IDoc-Befüllung WE19

IDoc-Befüllung WE19

Erzeugter Beleg

Erzeugter Beleg

Besonderheit bei Buchung mit Umsatzsteuer

Im Gegensatz zum Batch-Input-Verfahren ist es mit dem Nachrichtentyp ACC_DOCUMENT (bzw. im Endeffekt mit dem dahinterliegenden BAPI_ACC_DOCUMENT_POST) nicht möglich, den Steueranteil einer Buchung vom System generieren zu lassen. D.h., die Steuerinformationen müssen dem IDoc auf folgende Weise mitgegeben werden:

Bei der Position, die die Steuer beinhaltet (i.d.R. die Sachkontenposition) wird der Betrag netto mitgegeben. Zusätzlich wird eine Steuerzeile des Segmenttyps E1BPACTX09 nebst Betragssegment (E1BPACCR09) mit folgenden Informationen benötigt:

 

E1BPACTX09

ITEMNO_ACC 000030

TAX_CODE V1 (Steuerkennzeichen)

 

E1BPACCR09

ITEMNO_ACC 000030

CURRENCY EUR

AMT_DOCCUR 1.60 (Steuerbetrag)

AMT_BASE 8.40 (Steuerbasis)

 

 

Beispiel:

Kreditorische Buchung

per Stromkosten 632500 8,40,-- an Kreditor 100003 10,--

Vorsteuer (V1) 1,60,--

 

 

Belegkopf E1BPACHE09:

BUS_ACT: RFBU

USERNAME: USERXYZ

HEADER_TXT: KOPFTEXT

COMP_CODE: 1000

DOC_DATE: 20150227

PSTNG_DATE: 20150227

DOC_TYPE: KR

REF_DOC_NO: 378455676

 

Kreditorenposition E1BPACAP09:

ITEMNO_ACC 000010

VENDOR_NO 0000100003 (Kreditorennummer)

 

Betragsposition zur Kreditorenposition E1BPACCR09

ITEMNO_ACC 000010

CURRENCY EUR

AMT_DOCCUR 10-

 

Sachkontenposition E1BPACGL09

ITEMNO_ACC 000020

GL_ACCOUNT 0000632500

ITEM_TEXT TESTBUCHUNG MIT STEUER

TAX_CODE V1 (Steuerkennzeichen!)

COSTCENTER 0000001000 (Kostenstelle, Konto 632500 ist Kostenart!)

 

Betragsposition zur Sachkontenposition E1BPACCR09

ITEMNO_ACC 000020

CURRENCY EUR

AMT_DOCCUR 8.40 (netto!)

 

Steuerzeile E1BPACTX09

ITEMNO_ACC 000030

TAX_CODE V1

 

Betragsposition zur Steuerzeile E1BPACCR09

ITEMNO_ACC 000030

CURRENCY EUR

AMT_DOCCUR 1.60 (Steuerbetrag)

AMT_BASE 8.40 (Steuerbasis)

IDoc-Befüllung (WE19)

IDoc-Befüllung (WE19)

Erzeugter Beleg inkl. Steuer

Erzeugter Beleg inkl. Steuer

Weiterlesen

Gegenkonto - das unbekannte Wesen...

19. Januar 2017 , Geschrieben von sapmandoo Veröffentlicht in #FI, #S4

Relevante SAP-Hinweise:

  • 112312 - Einzelposten: Anzeige von Gegenkontoinformationen
  • 1034354 - FAGLL03: Anzeige von Gegenkontoinformationen
  • 1504612 - Einzelposten: Gegenkontoinformationen(BADI FI_ITEMS_CH_DATA)

Grundlagen

Öfter werde ich von Kunden oder auch Kollegen gefragt, wie denn die Gegenkontoinformationen in den Einzelpostenlisten (FBLxN, FAGLL03 usw.) ermittelt werden und wie man dies ggf. nachvollziehen oder gar beeinflussen kann:

 

Gegenkonto - das unbekannte Wesen...

Sofern die Hinweise 112312 bzw. 1034354/1504612 eingebaut wurden, lassen sich in den einschlägigen Einzelpostenanzeigen Gegenkontoinformationen einblenden, bestehend aus Gegenkontoart (S = Sachkonto, K = Kreditor, D = Debitor) und der Nummer des Gegenkontos.

Bei zweizeiligen Belegen ist die Auswahl des Gegenkontos ja eindeutig, d.h. bei einer Buchung

            Aufwand 100,--    an   Kreditor 100,--

ist die Gegenbuchung natürlich die jeweils andere Belegposition.

Bei drei- und mehrzeiligen Belegen muss ggf. eine Auswahl des Gegenkontos (nach Signifikanz) erfolgen:

Aufwand1 100,--

            Aufwand2 200,--

Aufwand3 300,--

Vorsteuer 60,--     an    Kreditor 660,--

 

Für die Ermittlung des Gegenkontos steht in der SAP Standardauslieferung der Funktionsbaustein GET_GKONT zur Verfügung. In diesem sind drei verschiedene Verfahren zur Bestimmung des signifikanten Gegenkontos implementiert - die Auswahl des Verfahrens erfolgt durch den Import-Parameter GKNKZ.

GKNKZ

Beschreibung

Ermitteltes Gegenkonto im o.g. Beispielbeleg (aus Sicht des kreditorischen Postens)

1

Es wird nur dann ein Gegenkonto zurückgeliefert, wenn es eindeutig ermittelt werden kann. Automatisch erzeugte Belegzeilen (wie bspw. Steuerzeilen) werden dabei ignoriert.

./.

2

Das betragsmäßig höchste Gegenkonto ohne Berücksichtigung automatisch generierter Belegzeilen wird zurückgeliefert.

Aufwand3

3

Das betragsmäßig höchste Gegenkonto mit Berücksichtigung automatisch generierter Belegzeilen wird zurückgeliefert.

Aufwand3

 

Werden zur Gegenkontoermittlung die weiter oben genannten Hinweise ohne Abwandlung implementiert, greift das Verfahren 3.

Erweiterung der bestehenden Verfahren

Kundenspezifische Ermittlungslogik

In vielen Fällen reicht die oben genannte Logik zur Gegenkontoermittlung aus. Im Einzelfall kann jedoch die Anforderung bestehen, den oben beschrieben Verfahren eigene, ausgefeiltere Methoden hinzuzufügen. Hierzu kann dann der Funktionsbaustein GET_GKONT in den Kundennamensraum kopiert (z.B. als Z_GET_GKONT) und anstelle des Standard-Bausteins an den entsprechenden Coding-Stellen in den Hinweisen 112312 bzw. 1034354 und 1504612 gerufen werden. Hierzu sind natürlich gewisse ABAP-Kenntnisse nötig.

Eine mögliche Anforderung könnte z.B. sein, dass als Gegenkonto von Sachkontenpositionen Kontokorrentpositionen grundsätzlich Vorrang haben sollen, auch wenn sie betragsmäßig kleiner sind als andersartige Gegenpositionen.

 

Beispiel:

Aufwand1 100,--

            Aufwand2 200,--

Aufwand3 300,--    an Kreditor 220,--

Vorsteuer 60,--            Kasse 440,--

 

Die Standard-Gegenkontoermittlung würde bei Abfrage des Gegenkontos aus Sicht eines der Aufwandskonten das Kassenkonto zurückliefern, weil es betragsmäßig signifikanter ist als die kreditorische Gegenposition. Genau hier soll aber ein „Override“ eingebaut werden, dass die Kontokorrentposition trotzdem Vorrang erhält. Das Verfahren erhält in unserem Beispiel die Kennzeichnung ‚4‘.

Hierzu passen wir die Form-Routine GKONT_ERMITTELN in unserer kundeneigenen Funktionsgruppe geeignet an:

*---- NEUES VERFAHREN 4 (wie 3, aber Vorfahrt für Kontokorrente)
WHEN '4'.
  IF BSEG-SHKZG = 'S'.
*   nur dann neu setzen, wenn Betrag höher ODER ein Kontokorrent daherkommt
*   UND nicht schon bereits ein Kontokorrent als Gegenkonto gesetzt ist
   IF BSEG-DMBTR > GKSUM_S OR BSEG-KOART CA 'DK' AND KOART_S CN 'DK'.

(Haben-Seite analog)

Das Beispielcoding aus den weiter oben genannten Hinweisen ist dann entsprechend anzupassen.

Beispiel-Coding aus Hinweis 1504612:

DATA: wa_items TYPE rfposxext.

LOOP AT ct_items INTO wa_items.

CALL FUNCTION 'Z_GET_GKONT'
  EXPORTING
     belnr = wa_items-belnr
     bukrs = wa_items-bukrs
     buzei = wa_items-buzei
     gjahr = wa_items-gjahr
     gknkz = '4'
  IMPORTING
     gkont = wa_items-gkont
     koart = wa_items-gkart
  EXCEPTIONS
     belnr_not_found = 1
     buzei_not_found = 2
     gknkz_not_found = 3
     OTHERS = 4.

IF sy-subrc = 0.
  MODIFY ct_items FROM wa_items.
ENDIF.

ENDLOOP.
Zusätzliche Gegenkontoinformationen

Eine immer wiederkehrende Anforderung in dem Themenkreis „Gegenkonto“ ist, dass zusätzlich zur Art und Nummer des Gegenkontos auch die entsprechende Bezeichnung anzeigbar gemacht werden soll. Hierzu lässt sich der Feldvorrat der Einzelpostenlisten um das Feld „Bez. Gegenkonto“ erweitern. Details dazu siehe hier, Abschnitt "Hinzufügen eigener Felder".

Es ist nun ein leichtes, nach erfolgreicher Gegenkontoermittlung anhand der Kontoart und der Nummer aus den entsprechenden Stammsatztabellen die Bezeichnung zu lesen und bereitzustellen.

Das obenstehende Beispielcoding kann dazu bspw. wie folgt erweitert werden:

CALL FUNCTION 'Z_GET_GKONT'
  EXPORTING
     belnr = wa_items-belnr
     bukrs = wa_items-bukrs
     buzei = wa_items-buzei
     gjahr = wa_items-gjahr
     gknkz = '4'

  IMPORTING
     gkont = wa_items-gkont
     koart = wa_items-gkart
  EXCEPTIONS
     belnr_not_found = 1
     buzei_not_found = 2
     gknkz_not_found = 3
     OTHERS = 4.

CASE wa_items_gkart. "das neue Feld heisse zzgkbez.

  WHEN ‚S‘.

    SELECT SINGLE txt50 INTO wa_items-zzgkbez FROM SKAT

      WHERE KTOPL = <Kontenplan>

       AND SAKNR = wa_items-gkont

       AND SPRAS = sy-langu.

  WHEN ‘K’.

    SELECT SINGLE name1 INTO wa_items-zzgkbez FROM LFA1

      WHERE LIFNR = wa_items-gkont.

  WHEN ‘D’.

    SELECT SINGLE name1 INTO wa_items-zzgkbez FROM KNA1

     WHERE KUNNR = wa_items-gkont.

ENDCASE.

 

Neuerungen zu S/4:

Im S/4 werden die Gegenkontoinformationen automatisch im Zuge der Buchung in die entsprechenden Felder der ACDOCA abgefüllt, so dass eine Anreicherung der Gegenkontoinformationen wie oben beschrieben nicht nötig ist. Hierzu wird im Customizing unter Finanzwesen - Hauptbuchhaltung - Informationssystem - Gegenkontoermittlungsart definieren die gewünschte Gegenkontoermittlung aktiviert (1, 2 oder 3, s.o.)  

In den neuen Einzelpostenbrowsern

FBL1H Kreditoreneinzelposten
FBL5H Debitoreneinzelposten
FAGLL03H Sachkonteneinzelposten

sind im Feldvorrat zudem bereits zahlreiche Texte u.a. zu Stammdatenobjekten verfügbar, z.B. die Bezeichnung des Gegenkontos, Kostenstellentexte und so weiter. 

 

 

Weiterlesen
<< < 1 2 3 4 > >>