寄售和管道结算

REPORT ZRMVKON00  MESSAGE-ID M8  NO  STANDARD  PAGE HEADING .
*ENHANCEMENT-POINT RMVKON00_G4 SPOTS ES_RMVKON00 STATIC.
*ENHANCEMENT-POINT RMVKON00_G5 SPOTS ES_RMVKON00.
*ENHANCEMENT-POINT RMVKON00_G6 SPOTS ES_RMVKON00 STATIC.
*ENHANCEMENT-POINT RMVKON00_G7 SPOTS ES_RMVKON00.

*---------------------------------------------------------------------*
*   Historie
*---------------------------------------------------------------------*
* - zu Release 2.x: erste Version, nur Anzeige möglich
* - zu Release 3.0a: Abrechnen im Dialog möglich
* - zu Release 4.0a: Umstellung von BSEG auf RKWA, Anschluß an NaSt,
*                    Abrechnen im batch
* - zu Release 4.5a: Abrechnen mit nicht abzugsfähigen Steuern möglich
* - zu Release 4.6C: Liste mit ALV
* - Beleg wird direkt über RWIN gebucht AC_DOCUMENT_CREATE und _POST
*---------------------------------------------------------------------*
*   tables                                                            *
*---------------------------------------------------------------------*

TABLES :
* benutzt für SELECT
  RKWA ,

* benutzt bei externem Perform
  BKPF ,
  BSEG ,
  BSET ,
  ITXDAT ,
  T001W .

TYPE-POOLS MRM SHLP .

INCLUDE MRM_CONST_COMMON ,              "allgemeine Konstanten
         MRM_CONST_NAST ,                " Nachrichten
         MRM_CONST_MRM ,
         MRM_CONST_ME ,                  "aus dem Einkauf
         MRM_CONST_MB ,                  "aus der Bestandsführung
         MRM_CONST_FI .                  "aus dem FI

*---------------------------------------------------------------------*
*   Typen (TYP_*)
*---------------------------------------------------------------------*

* Meldung
TYPES BEGIN  OF TYP_MSG ,
         MSGID  LIKE SY -MSGID ,
         MSGTY  LIKE SY -MSGTY ,
         MSGNO  LIKE SY -MSGNO ,
         MSGV1  LIKE SY -MSGV1 ,
         MSGV2  LIKE SY -MSGV2 ,
         MSGV3  LIKE SY -MSGV3 ,
         MSGV4  LIKE SY -MSGV4 ,
        END  OF TYP_MSG .

* Block von Warenentnahmen (zu Buchungskreis/Lieferant)
TYPES BEGIN  OF TYP_BLOCK ,
         BUKRS    LIKE RKWA -BUKRS ,                            "key
         LIFNR    LIKE RKWA -LIFNR ,                            "key
         BWAER    LIKE RKWA -BWAER ,                            "key
         IT_RKWA  LIKE RKWA     OCCURS  1 "Warenentnahmen
         BSTAT    TYPE  C ,                "Status -> C_BSTAT_*
         BELNR    LIKE RKWA -BELNR ,       "Rechnungsbeleg
         GJAHR    LIKE RKWA -GJAHR ,       "Rechnungsbeleg
         MSGID    LIKE SY -MSGID ,
         MSGTY    LIKE SY -MSGTY ,
         MSGNO    LIKE SY -MSGNO ,
         MSGV1    LIKE SY -MSGV1 ,
         MSGV2    LIKE SY -MSGV2 ,
         MSGV3    LIKE SY -MSGV3 ,
         MSGV4    LIKE SY -MSGV4 ,
        END  OF TYP_BLOCK .

* zum Berechnen der Steuern
TYPES BEGIN  OF TYP_BSET ,
         WRBTR  LIKE BSEG -WRBTR ,         "CURR statt CHAR (Vorzeichen!)
         FWSTE  LIKE BSET -FWSTE ,         "CURR statt CHAR (Vorzeichen!)
         MWSKZ  LIKE RBSET -MWSKZ ,
         TXJCD  LIKE T001W -TXJCD ,
        END  OF TYP_BSET .

* Puffer für MWSKZ/TXJCD Abhängigkeit von Material, Lieferant und Werk
TYPES BEGIN  OF TYP_TAX ,
         MATNR  LIKE BSEG -MATNR ,                              "key
         WERKS  LIKE T001W -WERKS ,                             "key
         LIFNR  LIKE VF_KRED -LIFNR ,                           "key
         MWSKZ  LIKE RBSET -MWSKZ ,
         TXJCD  LIKE T001W -TXJCD ,
        END  OF TYP_TAX .

* Tabellentypen (TYP_TAB_*)
TYPES TYP_TAB_BKPF   LIKE BKPF       OCCURS  1 ,
       TYP_TAB_BSEG   LIKE BSEG       OCCURS  1 ,
       TYP_TAB_BSET   LIKE BSET       OCCURS  1 ,
       TYP_TAB_RKWA   LIKE RKWA       OCCURS  1 ,
       TYP_TAB_BLOCK  TYPE TYP_BLOCK  OCCURS  1 ,
       TYP_TAB_TAX    TYPE TYP_TAX    OCCURS  1 ,
       TYP_TAB_RBWS   LIKE RBWS       OCCURS  1 .

DATA S_VARIANT  LIKE  DISVARIANT ,
      S_VAR_USR  LIKE  DISVARIANT .

*---------------------------------------------------------------------*
*   Konstanten (C_*)                                                  *
*---------------------------------------------------------------------*

CONSTANTS :

  C_SAVE ( 1 )       TYPE   C                VALUE   'A' ,
  C_REPID         TYPE  SY -REPID         VALUE   'ZRMVKON00' ,
  C_TOP_OF_LIST   TYPE  SLIS_FORMNAME    VALUE   'TOP_OF_LIST' ,
  C_DOKCLASS_NA   TYPE  DSYSH -DOKCLASS   VALUE   'NA' ,

* Transaktionscodes
  C_TCODE_MRKO    LIKE SY -TCODE  VALUE  'MRKO' ,

* RKWA-Status
  C_STATUS_NINV   LIKE RKWA -STATUS  VALUE  '00' ,    "nicht abgerechnet
  C_STATUS_INV    LIKE RKWA -STATUS  VALUE  '01' ,     "abgerechnet

* Block-Abrechnungs-Status
  C_BSTAT_NULL    TYPE  VALUE SPACE ,    "nicht verarbeitet
  C_BSTAT_OK      TYPE  VALUE  '1' ,      "abgerechnet
  C_BSTAT_FEHLER  TYPE  VALUE  '2' ,      "Fehler bei Abrechnung

* Sonstiges
  C_STYPE_N       LIKE BBKPF -STYPE  VALUE  'N' "batch-input: no



*---------------------------------------------------------------------*
*   globale Felder (G_*, GT_*)
*---------------------------------------------------------------------*

* GT_BLOCK enthält alle Blöcke, GT_BLOCK selber ist sortiert nach
* Buchungskreis und Lieferant.
* Ein Block enthält alle Warenentnahmen zu einem Buch.kreis/Lieferanten.
* Die WE in einem Block sind sortiert nach Matbelegnr und -Position.
DATA GT_BLOCK  TYPE TYP_BLOCK  OCCURS  1 .

*---------------------------------------------------------------------*
*   globale Felder, lokal genutzt (L_*, LT_*)
*---------------------------------------------------------------------*
TYPES BEGIN  OF TY_CON_ALV .
         INCLUDE  STRUCTURE RKWA .
TYPES :   BOX      TYPE  C ,
         COLINFO  TYPE SLIS_T_SPECIALCOL_ALV ,
         MSGTY    LIKE MESG -MSGTY ,
          TEXT     LIKE MESG - TEXT ,
         ARBGB    LIKE MESG -ARBGB ,
         TXTNR    LIKE MESG -TXTNR ,
         MSGV1    LIKE MESG -MSGV1 ,
         MSGV2    LIKE MESG -MSGV2 ,
         MSGV3    LIKE MESG -MSGV3 ,
         MSGV4    LIKE MESG -MSGV4 ,
          END  OF TY_CON_ALV .
* alle selektierten Warenentnahmen (temporär benutzt)
DATA LT_RKWA     LIKE RKWA  OCCURS  1 ,
      T_ALV_LIST  TYPE  TABLE  OF TY_CON_ALV " ALV-Ausgabeliste

*---------------------------------------------------------------------*
*  Ranges
*---------------------------------------------------------------------*

RANGES R_STATUS  FOR RKWA -STATUS  OCCURS  1 ,
        R_SOBKZ   FOR RKWA -SOBKZ   OCCURS  1 .

*---------------------------------------------------------------------*
*   Select-options & Parameter
*---------------------------------------------------------------------*

* Rahmen "Auswahl"
SELECTION-SCREEN  BEGIN  OF  BLOCK AUSWAHL  WITH  FRAME
                                         TITLE  TEXT - 001 .
SELECT-OPTIONS :
  SO_BUKRS  FOR RKWA -BUKRS OBLIGATORY  MEMORY  ID BUK ,
  SO_LIFNR  FOR RKWA -LIFNR  MATCHCODE OBJECT KRED ,
  SO_WERKS  FOR RKWA -WERKS ,
  SO_MATNR  FOR RKWA -MATNR  MATCHCODE OBJECT MAT1 ,
  SO_BLDAT  FOR RKWA -BLDAT ,
  SO_BUDAT  FOR RKWA -BUDAT ,
  SO_MBLNR  FOR RKWA -MBLNR .

SELECTION-SCREEN  SKIP .

PARAMETERS :
  PA_XKONS  LIKE RM08REP0 -KONS_XKONS  DEFAULT  'X' ,
  PA_XPIPE  LIKE RM08REP0 -KONS_XPIPE  DEFAULT  'X' .
SELECTION-SCREEN  END  OF  BLOCK AUSWAHL .

* Rahmen "Verarbeitung"
* SELECTION-SCREEN SKIP.
SELECTION-SCREEN  BEGIN  OF  BLOCK VERARBEITUNG  WITH  FRAME
                                              TITLE  TEXT - 002 .
SELECTION-SCREEN  BEGIN  OF  LINE .
PARAMETERS PA_XANZ  LIKE RM08REP0 -KONS_XANZ
             RADIOBUTTON  GROUP  MOD  DEFAULT  'X'  USER-COMMAND KLICK .
SELECTION-SCREEN  COMMENT  3 ( 20 TEXT - 005  FOR  FIELD PA_XANZ .
SELECTION-SCREEN  END  OF  LINE .

SELECTION-SCREEN  BEGIN  OF  LINE .
PARAMETERS PA_XABR  LIKE RM08REP0 -KONS_XABR
             RADIOBUTTON  GROUP  MOD .
SELECTION-SCREEN  COMMENT  3 ( 20 TEXT - 006  FOR  FIELD PA_XABR .

SELECTION-SCREEN  END  OF  LINE .
PARAMETERS :
  P_BUDAT  LIKE BKPF -BUDAT  DEFAULT SY -DATLO OBLIGATORY ,
  P_BLDAT  LIKE BKPF -BLDAT  DEFAULT SY -DATLO OBLIGATORY ,
  P_XBLNR  LIKE BKPF -XBLNR .
SELECTION-SCREEN  END  OF  BLOCK VERARBEITUNG .

* Rahmen "Anzeigen"
* SELECTION-SCREEN SKIP.
SELECTION-SCREEN  BEGIN  OF  BLOCK ANZEIGEN  WITH  FRAME
                                          TITLE  TEXT - 003 .
PARAMETERS :
  PA_XNINV  LIKE RM08REP0 -KONS_XNINV  DEFAULT  'X' MODIF  ID K ,
  PA_XINV   LIKE RM08REP0 -KONS_XINV   DEFAULT SPACE MODIF  ID K .
SELECT-OPTIONS :
  SO_BELNR  FOR RKWA -BELNR MODIF  ID K .
* Protokoll der Nachrichtenfindung
PARAMETERS :
* Anzeigevariante
  PA_VARIA  LIKE DISVARIANT -VARIANT MODIF  ID K .
SELECTION-SCREEN  END  OF  BLOCK ANZEIGEN .

*---------------------------------------------------------------------**
* Initialization.
*---------------------------------------------------------------------**
INITIALIZATION .

* Schalter Varianten benutzerspezifisch/allgemein speicherbar setzen
   PERFORM VARIANT_INIT .
* Get default variant
  S_VAR_USR  S_VARIANT .
   CALL  FUNCTION  'REUSE_ALV_VARIANT_DEFAULT_GET'
     EXPORTING
      I_SAVE      C_SAVE
     CHANGING
      CS_VARIANT  S_VAR_USR
     EXCEPTIONS
      NOT_FOUND   2 .
   IF SY -SUBRC  0 .
    PA_VARIA  =  S_VAR_USR -VARIANT .
   ENDIF .


************************************************************************
*   Ereignis AT SELECTION-SCREEN
***********************************************************************
AT  SELECTION-SCREEN  ON  VALUE-REQUEST  FOR PA_VARIA .
   PERFORM F4_VARIA  CHANGING PA_VARIA .

AT  SELECTION-SCREEN .

* Selektion unsinnig?
   IF  PA_XKONS  SPACE  AND
        PA_XPIPE  SPACE  )
   OR  PA_XINV   SPACE  AND
        NOT SO_BELNR  IS  INITIAL  )
   OR  PA_XANZ  AND
        PA_XINV  IS  INITIAL  AND  PA_XNINV  IS  INITIAL  ) .
     MESSAGE W736 .
   ENDIF .

   IF  NOT PA_VARIA  IS  INITIAL .
     MOVE S_VARIANT  TO S_VAR_USR .
     MOVE PA_VARIA  TO S_VAR_USR -VARIANT .
     CALL  FUNCTION  'REUSE_ALV_VARIANT_EXISTENCE'
       EXPORTING
        I_SAVE      C_SAVE
       CHANGING
        CS_VARIANT  S_VAR_USR .
    S_VARIANT  S_VAR_USR .
   ELSE .
     PERFORM VARIANT_INIT .
   ENDIF .

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

* R_STATUS füllen
   CLEAR R_STATUS[] .
   IF  PA_XNINV  ) .                  "nicht abgerechnete
    R_STATUS - SIGN    'I' .
    R_STATUS -OPTION  'EQ' .
    R_STATUS -LOW     C_STATUS_NINV .
    R_STATUS -HIGH    SPACE .
     APPEND R_STATUS .
   ENDIF .

   IF  PA_XINV  ) .                   "abgerechnete
    R_STATUS - SIGN    'I' .
    R_STATUS -OPTION  'EQ' .
    R_STATUS -LOW     C_STATUS_INV .
    R_STATUS -HIGH    SPACE .
     APPEND R_STATUS .
   ENDIF .

* R_SOBKZ füllen
   CLEAR R_SOBKZ[] .
   IF  PA_XKONS  ) .
    R_SOBKZ - SIGN    'I' .
    R_SOBKZ -OPTION  'EQ' .
    R_SOBKZ -LOW     C_SOBKZ_KONS .                           "K
    R_SOBKZ -HIGH    SPACE .
     APPEND R_SOBKZ .
   ENDIF .

   IF  PA_XPIPE  ) .
    R_SOBKZ - SIGN    'I' .
    R_SOBKZ -OPTION  'EQ' .
    R_SOBKZ -LOW     C_SOBKZ_PIPE .                           "P
    R_SOBKZ -HIGH    SPACE .
     APPEND R_SOBKZ .
   ENDIF .

* SELECT von RKWA
   CLEAR LT_RKWA .
   IF  PA_XANZ  ) .
     SELECT FROM RKWA  INTO  TABLE LT_RKWA
              WHERE BUKRS   IN SO_BUKRS
                AND LIFNR   IN SO_LIFNR
                AND WERKS   IN SO_WERKS
                AND MATNR   IN SO_MATNR
                AND BLDAT   IN SO_BLDAT
                AND BUDAT   IN SO_BUDAT
                AND MBLNR   IN SO_MBLNR
                AND SOBKZ   IN R_SOBKZ
                AND STATUS  IN R_STATUS   "Anzeigeoption
                AND BELNR   IN SO_BELNR "Anzeigeoption
   ELSE .
     SELECT FROM RKWA  INTO  TABLE LT_RKWA
              WHERE BUKRS   IN SO_BUKRS
                AND LIFNR   IN SO_LIFNR
                AND WERKS   IN SO_WERKS
                AND MATNR   IN SO_MATNR
                AND BLDAT   IN SO_BLDAT
                AND BUDAT   IN SO_BUDAT
                AND MBLNR   IN SO_MBLNR
                AND SOBKZ   IN R_SOBKZ
                AND STATUS  C_STATUS_NINV .   "nur nicht abgerechnete!
   ENDIF .

   PERFORM RKWA_PARTITIONIEREN  TABLES   LT_RKWA     "--->
                                       GT_BLOCK .   "<---
   CLEAR LT_RKWA .



***********************************************************************
*   Ereignis END-OF-SELECTION
***********************************************************************
END-OF-SELECTION .

* keine Warenentnahme selektiert?
   IF  GT_BLOCK  IS  INITIAL  ) .
     MESSAGE S702 .                     "es wurden keine Belege selektiert
     IF  SY -BATCH  ) .
       LEAVE  PROGRAM .                    "LEAVE TO TA ist nicht erlaubt
     ELSE .
       EXIT .
     ENDIF .
   ENDIF .

   IF  PA_XANZ  ) .
     PERFORM ALV_LIST_PREPARE  TABLES GT_BLOCK T_ALV_LIST .
     PERFORM ALV_LIST  TABLES T_ALV_LIST .
   ELSE .                                 " pa_xabr = x
     PERFORM ABRECHNEN  TABLES GT_BLOCK .
     PERFORM ALV_LIST_PREPARE  TABLES GT_BLOCK T_ALV_LIST .
     PERFORM ALV_LIST  TABLES T_ALV_LIST .
   ENDIF .


***********************************************************************
*    allgemeine Form-Routinen
***********************************************************************
*---------------------------------------------------------------------*
*       FORM ALV_LIST_PREPARE
*---------------------------------------------------------------------*
* Ausgabeliste für ALV aus der Tabelle GT_BLOCK bilden                *
*---------------------------------------------------------------------*
FORM ALV_LIST_PREPARE  TABLES PTI_BLOCK      TYPE TYP_TAB_BLOCK
                             PTX_ALV_LIST   LIKE T_ALV_LIST .

   DATA S_BLOCK  TYPE TYP_BLOCK .
   DATA S_RKWA  LIKE RKWA .

   CLEAR :   PTX_ALV_LIST S_BLOCK S_RKWA .
   REFRESH PTX_ALV_LIST .

   LOOP  AT PTI_BLOCK  INTO S_BLOCK .
     CLEAR S_RKWA .
     LOOP  AT S_BLOCK -IT_RKWA  INTO S_RKWA .
       MOVE-CORRESPONDING S_BLOCK  TO PTX_ALV_LIST .
       MOVE-CORRESPONDING S_RKWA  TO PTX_ALV_LIST .
      PTX_ALV_LIST -ARBGB  S_BLOCK -MSGID .
      PTX_ALV_LIST -TXTNR  S_BLOCK -MSGNO .
       IF PA_XANZ  'X' .
         IF S_RKWA -STATUS  C_STATUS_INV .
          PTX_ALV_LIST - TEXT  TEXT - 010 .
         ELSEIF S_RKWA -STATUS  C_STATUS_NINV .
          PTX_ALV_LIST - TEXT  TEXT - 012 .
         ENDIF .
       ENDIF .
       APPEND PTX_ALV_LIST .
       CLEAR S_RKWA .
     ENDLOOP .
     CLEAR S_BLOCK .
   ENDLOOP .

ENDFORM .                     "alv_list_prepare
*eject
*---------------------------------------------------------------------*
*       FORM EVENTTAB_BUILD                                           *
*---------------------------------------------------------------------*
* Dem ALV-Baustein bekannt geben, daß es zwei Routinen für die        *
* Ausgabe der Listüberschriften:                                      *
* TOP_OF_LIST Überschrift wird einmal am Anfang der Liste ausgegeben  *
*---------------------------------------------------------------------*
FORM EVENTTAB_BUILD  USING IT_EVENTS  TYPE SLIS_T_EVENT .

   DATA L_EVENT  TYPE SLIS_ALV_EVENT .

   CALL  FUNCTION  'REUSE_ALV_EVENTS_GET'
     EXPORTING
      I_LIST_TYPE  0
     IMPORTING
      ET_EVENTS    IT_EVENTS .

   READ  TABLE IT_EVENTS  WITH  KEY NAME  =  SLIS_EV_TOP_OF_LIST
                            INTO L_EVENT .
   IF SY -SUBRC  0 .
     MOVE C_TOP_OF_LIST  TO L_EVENT - FORM .
     APPEND L_EVENT  TO IT_EVENTS .
   ENDIF .
ENDFORM .                     "eventtab_build
*eject
*---------------------------------------------------------------------*
*       FORM MSG_FUELLEN_SYSVAR                                       *
*---------------------------------------------------------------------*
* <---  S_MSG                                                         *
*---------------------------------------------------------------------*
FORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG  TYPE TYP_MSG .

   CLEAR S_MSG .
  S_MSG -MSGID  SY -MSGID .
  S_MSG -MSGTY  SY -MSGTY .
  S_MSG -MSGNO  SY -MSGNO .
  S_MSG -MSGV1  SY -MSGV1 .
  S_MSG -MSGV2  SY -MSGV2 .
  S_MSG -MSGV3  SY -MSGV3 .
  S_MSG -MSGV4  SY -MSGV4 .

ENDFORM .                     "msg_fuellen_sysvar
*---------------------------------------------------------------------*
*      Form RKWA_PARTITIONIEREN
*---------------------------------------------------------------------*
*      Teilt die alle Warenentnahmen in IT_RKWA auf.
*      Die Blöcke werden in IT_BLOCK abgelegt.
* ---> IT_RKWA
* <--- IT_BLOCK
*---------------------------------------------------------------------*
FORM RKWA_PARTITIONIEREN  TABLES IT_RKWA   TYPE TYP_TAB_RKWA
                                IT_BLOCK  TYPE TYP_TAB_BLOCK .

   DATA S_BLOCK  TYPE TYP_BLOCK ,
        S_RKWA   LIKE RKWA ,
        IDX      LIKE SY -TABIX ,
        WRBTR    LIKE RKWA -WRBTR ,
        S_MSG    TYPE TYP_MSG .
   DATA F_WAERS   TYPE WAERS ,
        F_OBJECT  TYPE OBJECT_CURRO .
   DATA F_KURSF  LIKE BKPF -KURSF .
  F_OBJECT  'BKPF' .

* baue IT_BLOCK auf (sortiert nach BUKRS/LIFNR)
   CLEAR IT_BLOCK .

* Currency expired --> S_RKWA contains new currency (e.g. EUR) -------*
   LOOP  AT IT_RKWA  INTO S_RKWA .
     CALL  FUNCTION  'CURRENCY_EXPIRATION_CHECK'
       EXPORTING
         CURRENCY       S_RKWA -BWAER
         DATE           SY -DATLO
        OBJECT         F_OBJECT
        BUKRS          S_RKWA -BUKRS
       IMPORTING
        CURRENCY_NEW   F_WAERS
       EXCEPTIONS
        ERROR_MESSAGE  4 .
     IF SY -SUBRC  0 .
      F_WAERS  S_RKWA -BWAER .
     ELSEIF F_WAERS  IS  INITIAL .
       MESSAGE E607  WITH  'RKWA_PARTITIONIEREN' .
     ENDIF .
     IF S_RKWA -BWAER  NE F_WAERS .
       CLEAR F_KURSF .
       CALL  FUNCTION  'READ_EXCHANGE_RATE'
         EXPORTING
           DATE              SY -DATLO
          FOREIGN_CURRENCY  S_RKWA -BWAER
          LOCAL_CURRENCY    F_WAERS
         IMPORTING
          EXCHANGE_RATE     F_KURSF
         EXCEPTIONS
          ERROR_MESSAGE     1 .

       IF  SY -SUBRC <>  ) .
         MESSAGE  ID SY -MSGID  TYPE  'E'
         NUMBER SY -MSGNO  WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
       ENDIF .

       CALL  FUNCTION  'CONVERT_TO_LOCAL_CURRENCY'
         EXPORTING
          FOREIGN_CURRENCY  S_RKWA -BWAER
          LOCAL_CURRENCY    F_WAERS
          FOREIGN_AMOUNT    S_RKWA -WRBTR
          RATE              F_KURSF
           DATE              SY -DATLO
         IMPORTING
          LOCAL_AMOUNT      S_RKWA -WRBTR
         EXCEPTIONS
          ERROR_MESSAGE     1 .

       IF  SY -SUBRC <>  ) .
         MESSAGE  ID SY -MSGID  TYPE  'E'
         NUMBER SY -MSGNO  WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
       ENDIF .

       IF  NOT S_RKWA -NAVNW  IS  INITIAL .
         CALL  FUNCTION  'CONVERT_TO_LOCAL_CURRENCY'
           EXPORTING
            FOREIGN_CURRENCY  S_RKWA -BWAER
            LOCAL_CURRENCY    F_WAERS
            FOREIGN_AMOUNT    S_RKWA -NAVNW
            RATE              F_KURSF
             DATE              SY -DATLO
           IMPORTING
            LOCAL_AMOUNT      S_RKWA -NAVNW
           EXCEPTIONS
            ERROR_MESSAGE     1 .

         IF  SY -SUBRC <>  ) .
           MESSAGE  ID SY -MSGID  TYPE  'E'
           NUMBER SY -MSGNO  WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
         ENDIF .
       ENDIF .
     ENDIF .
    S_RKWA -BWAER  F_WAERS .

     READ  TABLE IT_BLOCK  INTO S_BLOCK
                         WITH  KEY BUKRS  S_RKWA -BUKRS
                                 LIFNR  S_RKWA -LIFNR
                                 BWAER  S_RKWA -BWAER
                         BINARY  SEARCH .
    IDX  SY -TABIX .
     IF  SY -SUBRC <>  ) .               "Block noch nicht vorhanden
       CLEAR S_BLOCK .
      S_BLOCK -BSTAT  C_BSTAT_NULL .
      S_BLOCK -BUKRS  S_RKWA -BUKRS .
      S_BLOCK -LIFNR  S_RKWA -LIFNR .
      S_BLOCK -BWAER  S_RKWA -BWAER .
       APPEND S_RKWA  TO S_BLOCK -IT_RKWA .
       INSERT S_BLOCK  INTO IT_BLOCK  INDEX IDX .   "Tab. bleibt sortiert!
     ELSE .                               "Block bereits vorhanden
       APPEND S_RKWA  TO S_BLOCK -IT_RKWA .
       MODIFY IT_BLOCK  FROM S_BLOCK  INDEX IDX .
     ENDIF .
   ENDLOOP .

* rkwa_pruefen
   LOOP  AT IT_BLOCK  INTO S_BLOCK .
     CLEAR S_RKWA .
     LOOP  AT S_BLOCK -IT_RKWA  INTO S_RKWA .
       IF  S_RKWA -SOBKZ <> C_SOBKZ_KONS  AND
      S_RKWA -SOBKZ <> C_SOBKZ_PIPE  ) .
         CLEAR S_MSG .
        S_MSG -MSGID  C_MSGID_M8 .
        S_MSG -MSGTY  C_MSGTY_ERROR .
        S_MSG -MSGNO  '008' .
        S_MSG -MSGV1  'RKWA_PARTITIONIEREN' .
         EXIT .
       ENDIF .
     ENDLOOP .
     MOVE-CORRESPONDING S_MSG  TO S_BLOCK .
     MODIFY IT_BLOCK  FROM S_BLOCK .
   ENDLOOP .

* Partitionen sortieren
   LOOP  AT IT_BLOCK  INTO S_BLOCK .
     SORT S_BLOCK -IT_RKWA  BY MJAHR MBLNR ZEILE .
     MODIFY IT_BLOCK  FROM S_BLOCK .
   ENDLOOP .

ENDFORM .                     "rkwa_partitionieren
*eject
*---------------------------------------------------------------------*
*       FORM LONG_MESSAGE_SHOW                                        *
*---------------------------------------------------------------------*
*   Langtext der Meldungen in der Ausgabeliste anzeigen               *
*---------------------------------------------------------------------*
FORM LONG_TEXT_MESSAGE_SHOW  USING I_ALV_LIST  TYPE MRM_CON_ALV .

   DATA :    T_DUMMY  LIKE TLINE  OCCURS  1 ,
           DOKNAME  LIKE DOKIL -OBJECT ,                        "CHAR60
            TITLE    LIKE DSYST -DOKTITLE ,
           DYNNR    LIKE HELP_INFO - DYNPRO ,
           PFKEY    LIKE HELP_INFO -PFKEY .

* System-Felder kopieren/konvertieren
   TITLE  SY - TITLE .
  DYNNR  SY -DYNNR .
  PFKEY  SY -PFKEY .

* Dokumentname konstuieren
   CALL  FUNCTION  'DOCU_OBJECT_NAME_CONCATENATE'
     EXPORTING
      DOCU_ID   C_DOKCLASS_NA
      ELEMENT   I_ALV_LIST -ARBGB
      ADDITION  I_ALV_LIST -TXTNR
     IMPORTING
      OBJECT    DOKNAME .

* Aufruf Popup mit dem Langtext der Meldung
   CALL  FUNCTION  'HELP_OBJECT_SHOW'
     EXPORTING
      DOKCLASS           C_DOKCLASS_NA
      DOKNAME            DOKNAME
      DOKTITLE           TITLE
      CALLED_BY_PROGRAM  C_REPID
      CALLED_BY_DYNP     DYNNR
      MSG_VAR_1          I_ALV_LIST -MSGV1
      MSG_VAR_2          I_ALV_LIST -MSGV2
      MSG_VAR_3          I_ALV_LIST -MSGV3
      MSG_VAR_4          I_ALV_LIST -MSGV4
      CALLED_BY_CUAPROG  C_REPID
      CALLED_BY_CUASTAT  PFKEY
     TABLES
      LINKS              T_DUMMY .

ENDFORM .                     "long_text_message_show

*---------------------------------------------------------------------*
*       FORM LONG_TEXT_MESSAGE_PREPARE                                *
*---------------------------------------------------------------------*
*  ermittelt den Text zu einer von einem Funktionsbaustein zurückge-  *
*  lieferten Fehlermeldung                                            *
*---------------------------------------------------------------------*
* Parameter:                                                          *
* <-> px_mesg: Struktur MESG; enthält die aufzubereitende Fehlermel-  *
*              dung; im Fehlerfall wird eine Default-Meldung abgelegt *
*---------------------------------------------------------------------*
FORM LONG_TEXT_MESSAGE_PREPARE  CHANGING I_MESG  STRUCTURE MESG .

   DATA H_MTEXT  LIKE SY -LISEL ,
        H_MSGNO  LIKE SY -MSGNO .

   MOVE I_MESG -TXTNR  TO H_MSGNO .

   CALL  FUNCTION  'RPY_MESSAGE_COMPOSE'
     EXPORTING
      MESSAGE_ID         I_MESG -ARBGB
      MESSAGE_NUMBER     H_MSGNO
      MESSAGE_VAR1       I_MESG -MSGV1
      MESSAGE_VAR2       I_MESG -MSGV2
      MESSAGE_VAR3       I_MESG -MSGV3
      MESSAGE_VAR4       I_MESG -MSGV4
     IMPORTING
      MESSAGE_TEXT       H_MTEXT
     EXCEPTIONS
      MESSAGE_NOT_FOUND  1
       OTHERS             2 .

   IF SY -SUBRC  0 .
     MOVE H_MTEXT ( 73 TO I_MESG - TEXT .
   ELSE .
     CALL  FUNCTION  'RPY_MESSAGE_COMPOSE'
       EXPORTING
        MESSAGE_ID         SY -MSGID
        MESSAGE_NUMBER     SY -MSGNO
        MESSAGE_VAR1       SY -MSGV1
        MESSAGE_VAR2       SY -MSGV2
        MESSAGE_VAR3       SY -MSGV3
        MESSAGE_VAR4       SY -MSGV4
       IMPORTING
        MESSAGE_TEXT       H_MTEXT
       EXCEPTIONS
        MESSAGE_NOT_FOUND  1
         OTHERS             2 .
     IF SY -SUBRC  EQ  0 .
      I_MESG - TEXT  H_MTEXT ( 73 ) .
     ELSE .
* Ooops, no text!.
*   message x062 with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ?
       CLEAR I_MESG - TEXT  .
     ENDIF .
   ENDIF .

ENDFORM .                                "LONG_TEXT_MESSAGE_PREPARE
***********************************************************************
*    Form-Routinen zur Ausgabe
***********************************************************************

*---------------------------------------------------------------------*
*       FORM ALV_LIST                                                 *
*---------------------------------------------------------------------*
* Protokoll in Form von ALV-Liste ausgeben                            *
*---------------------------------------------------------------------*
* Parameter:                                                          *
* <-> T_ALV_LIST                                                    *
*---------------------------------------------------------------------*
FORM ALV_LIST  TABLES T_ALV_LIST  LIKE T_ALV_LIST .

   DATA TAB_FIELDCAT  TYPE  SLIS_T_FIELDCAT_ALV ,      " Feldkatalog
        TAB_SORT      TYPE  SLIS_T_SORTINFO_ALV ,
        S_LAYOUT      TYPE  SLIS_LAYOUT_ALV ,
        TAB_EVENTS    TYPE  SLIS_T_EVENT ,
        S_MESG        LIKE  MESG .

   CONSTANTS :
    C_PF_STATUS_SET  TYPE SLIS_FORMNAME  VALUE  'PF_STATUS_SET' ,
    C_USER_COMMAND   TYPE SLIS_FORMNAME  VALUE  'USER_COMMAND' .

  S_LAYOUT -COLWIDTH_OPTIMIZE  'X' .
  S_LAYOUT -ZEBRA              'X' .
  S_LAYOUT -BOX_FIELDNAME      'BOX' .
  S_LAYOUT -GROUP_CHANGE_EDIT  'X' .
  S_LAYOUT -F2CODE             'DISPLAY' .

   PERFORM FIELD_CATALOG_BUILD  TABLES TAB_FIELDCAT .
   PERFORM EVENTTAB_BUILD  USING TAB_EVENTS .

*-- Meldungstexte in Segtab-text aufbauen -----*
   LOOP  AT T_ALV_LIST  WHERE  TEXT  IS  INITIAL .
     MOVE-CORRESPONDING T_ALV_LIST  TO S_MESG .
     PERFORM LONG_TEXT_MESSAGE_PREPARE  CHANGING S_MESG .
    T_ALV_LIST - TEXT  S_MESG - TEXT .
     MODIFY T_ALV_LIST .
   ENDLOOP .

*-- Bei Gutschrift Menge und Betrag mit Vorzeichen darstellen --*
   LOOP  AT T_ALV_LIST  WHERE SHKZG  C_SHKZG_SOLL .
    T_ALV_LIST -WRBTR  T_ALV_LIST -WRBTR .
    T_ALV_LIST -BSTMG  T_ALV_LIST -BSTMG .
     MODIFY T_ALV_LIST .
   ENDLOOP .

   CALL  FUNCTION  'REUSE_ALV_GRID_DISPLAY'
     EXPORTING
      I_BUFFER_ACTIVE           SPACE
      I_CALLBACK_PROGRAM        C_REPID
      I_CALLBACK_PF_STATUS_SET  C_PF_STATUS_SET
      I_CALLBACK_USER_COMMAND   C_USER_COMMAND
      I_STRUCTURE_NAME          'T_ALV_LIST'
      IT_FIELDCAT               TAB_FIELDCAT[]
      IT_SORT                   TAB_SORT[]
      IS_LAYOUT                 S_LAYOUT
      I_SAVE                    C_SAVE
      IS_VARIANT                S_VARIANT
      IT_EVENTS                 TAB_EVENTS[]
     TABLES
      T_OUTTAB                  T_ALV_LIST .

ENDFORM .                                "ALV_LIST
*eject

***********************************************************************
*    Form-Routinen zum ABRECHNEN
***********************************************************************


*---------------------------------------------------------------------*
*      Form ABRECHNEN
*---------------------------------------------------------------------*
*      Rechnet alle selektierten Warenentnahmen ab.
* ---> IT_BLOCK
*---------------------------------------------------------------------*
FORM ABRECHNEN  TABLES IT_BLOCK  TYPE TYP_TAB_BLOCK .

   DATA S_BLOCK   TYPE TYP_BLOCK ,
        S_MSG     TYPE TYP_MSG ,
        BLART     LIKE T169F -BLART ,
        X_FEHLER  TYPE  C .

   PERFORM BELEGART_BESTIMMEN  CHANGING BLART
                                      S_MSG
                                      X_FEHLER .

   IF X_FEHLER  X .
     LOOP  AT IT_BLOCK  INTO S_BLOCK .
       MOVE-CORRESPONDING S_MSG  TO S_BLOCK .
       MODIFY IT_BLOCK  FROM S_BLOCK .
     ENDLOOP .
     EXIT .
   ENDIF .

   LOOP  AT IT_BLOCK  INTO S_BLOCK .
     PERFORM BLOCK_ABRECHNEN  TABLES S_BLOCK -IT_RKWA    "--->
                              USING S_BLOCK -BUKRS      "--->
                                   S_BLOCK -BWAER      "--->
                           CHANGING S_MSG
                                   X_FEHLER           "<---
                                   BLART
                                   S_BLOCK -LIFNR
                                   S_BLOCK -BELNR      "<---
                                   S_BLOCK -GJAHR .     "<---
*   Block-Status setzen
     IF  X_FEHLER  ) .
      S_BLOCK -BSTAT  C_BSTAT_FEHLER .
       CLEAR S_BLOCK -BELNR S_BLOCK -GJAHR .
       MOVE-CORRESPONDING S_MSG  TO S_BLOCK .
       ROLLBACK  WORK .
     ELSE .
       CLEAR S_MSG .
      S_BLOCK -MSGID  C_MSGID_M8 .
      S_BLOCK -MSGTY  C_MSGTY_SUCCESS .
      S_BLOCK -MSGNO  '327' .
      S_BLOCK -BSTAT  C_BSTAT_OK .
       COMMIT  WORK .
     ENDIF .

     MODIFY IT_BLOCK  FROM S_BLOCK .
   ENDLOOP .

ENDFORM .                     "abrechnen

*---------------------------------------------------------------------*
*       FORM BELEGART_BESTIMMEN                                       *
*---------------------------------------------------------------------*
*       bestimmt Belegart des Rechnungsbeleges anhand der Transaktion *
*---------------------------------------------------------------------*
*  <--- BLART Belegart
*---------------------------------------------------------------------*
FORM BELEGART_BESTIMMEN  CHANGING BLART     LIKE T169F -BLART
                                 S_MSG     TYPE TYP_MSG
                                 X_FEHLER  TYPE  C .
   DATA S_T169F  LIKE T169F .

* lese Belegart aus T169F
   CALL  FUNCTION  'MRM_DBTAB_T169F_READ'
     EXPORTING
      I_TCODE        C_TCODE_MRKO
     IMPORTING
      E_T169F        S_T169F
     EXCEPTIONS
      ERROR_MESSAGE  1 .

   IF  SY -SUBRC <>  ) .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .
  BLART  S_T169F -BLART .

ENDFORM .                     "belegart_bestimmen

*---------------------------------------------------------------------*
*      Form BLOCK_ABRECHNEN
*---------------------------------------------------------------------*
*      Bucht für einen 'Block' von Warenentnahmen genau eine
*      Rechnung. Alle WEs befinden sich in IT_RKWA.
*      Alle WEs sind demselben Buchungskreis/Kreditor BUKRS/LIFNR
*      zugeordnet.
*      Auf die RKWA wird ein DB-Update durchgeführt (-> MR01)
* ---> BUKRS, LIFNR, BWAER: Block
*      BLART:        Belegart
* <--> IT_RKWA:      Warenentnahmen (es werden BELNR und BUZEI gefüllt)
* <--- IT_MSG:       Meldungen
*      BELNR, GJAHR: Rechnungsbeleg
*---------------------------------------------------------------------*
FORM BLOCK_ABRECHNEN  TABLES IT_RKWA   TYPE TYP_TAB_RKWA   "<-->
                       USING BUKRS     LIKE RKWA -BUKRS     "--->
                            BWAER     LIKE RKWA -BWAER     "--->
                    CHANGING S_MSG     TYPE TYP_MSG
                            X_FEHLER  TYPE  C
                            BLART     LIKE T169F -BLART
                            LIFNR     LIKE RKWA -LIFNR
                            BELNR     LIKE RKWA -BELNR     "<---
                            GJAHR     LIKE RKWA -GJAHR .    "<---

   DATA TAB_BKPF       TYPE TYP_TAB_BKPF ,
        TAB_BSEG       TYPE TYP_TAB_BSEG ,
        TAB_BSET       TYPE TYP_TAB_BSET ,
        IT_TAX         TYPE TYP_TAB_TAX ,
        TAB_RBWS       TYPE TYP_TAB_RBWS ,
        S_BKPF         LIKE BKPF ,
        S_BSEG         LIKE BSEG ,
        S_RKWA         LIKE RKWA ,
        S_TAX          TYPE TYP_TAX ,
        S_T001         LIKE T001 ,
        GSBER          LIKE BSEG -GSBER ,
        SGTXT          LIKE RBSEG -SGTXT ,
        WRBTR_TMP      LIKE BSEG -WRBTR "temporär benutzter Betrag
        X_UEBERNEHMEN  TYPE  C ,
        F_MONAT        LIKE BKPF -MONAT ,
        S_T003         LIKE T003 ,
        LIFNR_RKWA     LIKE RKWA -LIFNR .

*----- Vorbereitungen -------------------------------------------------

   PERFORM LOCK_RKWA  TABLES    IT_RKWA
                     CHANGING  X_FEHLER
                              S_MSG .

   IF X_FEHLER  EQ  'X' .
     EXIT .
   ENDIF .

* re-read RKWA after the lock was set
* Is the RKWA entry still not settled?
   LOOP  AT IT_RKWA  INTO S_RKWA .
     SELECT  SINGLE FROM RKWA
       WHERE MBLNR  S_RKWA -MBLNR
         AND MJAHR  S_RKWA -MJAHR
         AND ZEILE  S_RKWA -ZEILE
         AND STATUS  C_STATUS_NINV "not settled
     IF SY -SUBRC  NE  0 .
       IF  2 .
         MESSAGE E863 (M8 ) .
*       The material document is already settled.
       ENDIF .
       CLEAR S_MSG .
      S_MSG -MSGID  C_MSGID_M8 .
      S_MSG -MSGTY  C_MSGTY_ERROR .
      S_MSG -MSGNO  '863' .
      S_MSG -MSGV1  S_RKWA -MBLNR .
      S_MSG -MSGV2  S_RKWA -MJAHR .
      X_FEHLER  X .
       EXIT .
     ENDIF .
   ENDLOOP .

   IF X_FEHLER  EQ  'X' .
     EXIT .
   ENDIF .

* bestimme Währungsschlüssel aus T001
   CALL  FUNCTION  'FI_COMPANY_CODE_DATA'
     EXPORTING
      I_BUKRS  BUKRS
     IMPORTING
      E_T001   S_T001
     EXCEPTIONS
       OTHERS   1 .
   IF  SY -SUBRC <>  ) .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .                               "---------->
   ENDIF .

* table IT_TAX fill
   PERFORM MWSKZ_TXJCD_PREFETCH  TABLES IT_RKWA    "--->
                                      IT_TAX     "<---
                                 USING LIFNR      "--->
                              CHANGING X_FEHLER   "<---
                                      S_MSG .     "<---
   IF  X_FEHLER  ) .
     EXIT .                               "---------->
   ENDIF .


*----- Rechnungsdaten füllen -------------------------------------------

   CLEAR TAB_BKPF ,
         TAB_BSEG ,
         TAB_BSET ,
         TAB_RBWS ,
         S_T003 ,
         LIFNR_RKWA .

  LIFNR_RKWA  LIFNR .                   " for update in table RKWA

* in user-exit change document type and vendor
   PERFORM BADI_HEADERDATA_MODIFY  TABLES IT_RKWA
                                  USING BUKRS
                               CHANGING BLART
                                       LIFNR
                                       X_FEHLER
                                       S_MSG .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .


*--- check Document type
   PERFORM DOCUMENT_TYPE_CHECK  USING BLART
                            CHANGING S_T003
                                    X_FEHLER
                                    S_MSG .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

* header data
   PERFORM HEADER_DATA_FILL  TABLES TAB_BKPF
                             USING BLART
                                  BUKRS
                                  BWAER
                                  S_T001
                          CHANGING GJAHR
                                  F_MONAT .

* item data
   PERFORM ITEM_DATA_FILL  TABLES TAB_BKPF
                                TAB_BSEG
                                TAB_BSET
                                IT_RKWA
                                IT_TAX
                                TAB_RBWS
                           USING BUKRS
                                GJAHR
                                LIFNR_RKWA
                                BWAER
                                S_T001
                                S_T003
                        CHANGING X_FEHLER
                                S_MSG
                                LIFNR " Zentrale als Rechnungssteller

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

* per user-exit Daten verändern
   PERFORM USER_EXIT001_AUFRUFEN  TABLES TAB_BKPF     "<-->
                                       TAB_BSEG     "<-->
                                       TAB_BSET     "<-->
                                       IT_RKWA      "--->
                                  USING BUKRS        "--->
                                       LIFNR        "--->
                               CHANGING X_FEHLER
                                       S_MSG
                                       GJAHR
                                       F_MONAT .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

*----- buche Rechnung --------------------------------------------------

* per user-exit das Customer-Include der RKWA füllen
   PERFORM USER_EXIT002_AUFRUFEN  TABLES  IT_RKWA
                                 CHANGING X_FEHLER
                                         S_MSG .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

   PERFORM VENDOR_TAXNUM_CHECK  TABLES IT_RKWA
                                USING S_T001
                                     LIFNR
                             CHANGING X_FEHLER
                                     S_MSG .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

   PERFORM NULL_LINES_CHECK  TABLES TAB_BSEG
                          CHANGING X_FEHLER
                                  S_MSG .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

   PERFORM INVOICE_POST  TABLES TAB_BKPF
                              TAB_BSEG
                              TAB_BSET
                              IT_RKWA
                              IT_TAX
                              TAB_RBWS
                         USING BLART
                              GJAHR
                              F_MONAT
                              BUKRS
                              LIFNR_RKWA
                              S_T003
                      CHANGING BELNR
                              X_FEHLER
                              S_MSG .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

ENDFORM .                     "block_abrechnen


*---------------------------------------------------------------------*
*       FORM EKORG_BESTIMMEN                                          *
*---------------------------------------------------------------------*
*  -->  LIFNR, WERKS, MATNR, SOBKZ (Sonderbestandskennzeichen)
*  <--  EKORG: ermittelte Einkaufsorganisation,
*              wurde keines ermittelt, so ist es SPACE
*---------------------------------------------------------------------*
FORM EKORG_BESTIMMEN  USING WERKS  LIKE RKWA -WERKS
                           SOBKZ  LIKE RKWA -SOBKZ
                   CHANGING EKORG  LIKE EINE -EKORG .

   DATA X_KONSI  TYPE  C ,                 "->ME_PRICING_TAX_INDICATOR
        X_PIPEL  TYPE  C .                 "dito

   IF  SOBKZ  C_SOBKZ_KONS  ) .
    X_KONSI  X .
    X_PIPEL  SPACE .
   ELSE .
    X_KONSI  SPACE .
    X_PIPEL  X .
   ENDIF .

* berechne EKORG
   CALL  FUNCTION  'ME_SELECT_EKORG_FOR_PLANT'
     EXPORTING
      I_WERKS           WERKS
      I_PIPEL           X_PIPEL
      I_KONSI           X_KONSI
     IMPORTING
      E_EKORG           EKORG
     EXCEPTIONS
      NO_ENTRY_FOUND    1
      NO_DEFAULT_FOUND  2 .

   IF  SY -SUBRC <>  ) .
     CLEAR EKORG .
   ENDIF .

ENDFORM .                     "ekorg_bestimmen
*eject
*---------------------------------------------------------------------*
*       FORM FIELD_CATALOG_BUILD                                      *
*---------------------------------------------------------------------*
*   FELDKATALOG FÜR AUSGABE DER LISTE AUFBAUEN                        *
*   HIER WIRD DEM ALV-BAUSTEIN BEKANNT GEGEBEN WIE DIE SPALTEN DER    *
*   LISTE AUSSEHEN SOLLEN                                             *
*---------------------------------------------------------------------*
FORM FIELD_CATALOG_BUILD  TABLES
                            T_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV .

*-- Fieldcatalog create automatically --------------------------------*

   CALL  FUNCTION  'REUSE_ALV_FIELDCATALOG_MERGE'
     EXPORTING
      I_PROGRAM_NAME      C_REPID
      I_INTERNAL_TABNAME  'RKWA'
      I_STRUCTURE_NAME    'ZCONALV'
     CHANGING
      CT_FIELDCAT         T_FIELDCAT[] .

   LOOP  AT T_FIELDCAT .
     CASE T_FIELDCAT -FIELDNAME .

       WHEN  'BSTME' .
        T_FIELDCAT -SELTEXT_L  TEXT - 116 .
        T_FIELDCAT -SELTEXT_M  TEXT - 116 .
        T_FIELDCAT -SELTEXT_S  TEXT - 116 .
        T_FIELDCAT -REPTEXT_DDIC  TEXT - 116 .

       WHEN  'BSTMG' .
        T_FIELDCAT -SELTEXT_L  TEXT - 115 .
        T_FIELDCAT -SELTEXT_M  TEXT - 115 .
        T_FIELDCAT -SELTEXT_S  TEXT - 115 .
        T_FIELDCAT -REPTEXT_DDIC  TEXT - 115 .

       WHEN  'BUKRS' .                     " Kopffeld andere Farbe
        T_FIELDCAT -EMPHASIZE  'X' .

       WHEN  'LIFNR' .                     " Kopffeld andere Farbe
        T_FIELDCAT -EMPHASIZE  'X' .

       WHEN  'TEXT' .

        T_FIELDCAT -SELTEXT_L  TEXT - 007 "Informationstext
        T_FIELDCAT -SELTEXT_M  TEXT - 008 "Infotext
        T_FIELDCAT -SELTEXT_S  TEXT - 008 .
        T_FIELDCAT -REPTEXT_DDIC  TEXT - 008 .

       WHEN  'WRBTR' .

        T_FIELDCAT -SELTEXT_L  TEXT - 117 .
        T_FIELDCAT -SELTEXT_M  TEXT - 117 .
        T_FIELDCAT -SELTEXT_S  TEXT - 117 .
        T_FIELDCAT -REPTEXT_DDIC  TEXT - 117 .
       WHEN  'ZZJSJE' .
        T_FIELDCAT - EDIT  'X' .

       WHEN  'BELNR' .

        T_FIELDCAT - HOTSPOT  'X' .

       WHEN  'MBLNR' .

        T_FIELDCAT - HOTSPOT  'X' .

     ENDCASE .
     MODIFY T_FIELDCAT .

   ENDLOOP .

ENDFORM .                     "field_catalog_build
*eject
*---------------------------------------------------------------------*
*       FORM MWSKZ_BESTIMMEN                                          *
*---------------------------------------------------------------------*
*       Bestimmt das Steuerkennzeichen über den Einkaufsinfosatz      *
*---------------------------------------------------------------------*
*  -->  LIFNR, WERKS, MATNR, SOBKZ (Sonderbestandskennzeichen)
*  <--  MWSKZ: ermitteltes SteuerKz, wurde keines ermittelt, so ist
*              es SPACE
*---------------------------------------------------------------------*
FORM MWSKZ_BESTIMMEN  USING LIFNR  LIKE RKWA -LIFNR
                           WERKS  LIKE RKWA -WERKS
                           MATNR  LIKE RKWA -MATNR
                           SOBKZ  LIKE RKWA -SOBKZ
                           EKORG  LIKE EINE -EKORG
                   CHANGING MWSKZ  LIKE EINE -MWSKZ .

   DATA S_MEICO  LIKE MEICO ,
        S_EINE   LIKE EINE ,
        ESOKZ    LIKE EINE -ESOKZ .        "Typ des Infosatzes

   IF  SOBKZ  C_SOBKZ_KONS  ) .
    ESOKZ  C_ESOKZ_KONS .
   ELSE .
    ESOKZ  C_ESOKZ_PIPE .
   ENDIF .

* Konsi-/Pipeline-Infosatz lesen
   CLEAR S_MEICO .
  S_MEICO -ESOKZ  ESOKZ .
  S_MEICO -EKORG  EKORG .
  S_MEICO -WERKS  WERKS .
  S_MEICO -LIFNR  LIFNR .
  S_MEICO -MATNR  MATNR .
  S_MEICO -ONLYE  SPACE .                "sonst geht's nicht!

*{   INSERT
*Note 663537: Variants don't have info records! Look for generic article
   PERFORM WRF_READ_INFORECORD_SA_PREPARE  CHANGING S_MEICO .
*}   INSERT

   CALL  FUNCTION  'ME_READ_INFORECORD'
     EXPORTING
      INCOM          S_MEICO
     IMPORTING
      EINEDATEN      S_EINE
     EXCEPTIONS
      ERROR_MESSAGE  1           "nicht auswerten!
       OTHERS         2 .

   IF  SY -SUBRC  ) .
    MWSKZ  S_EINE -MWSKZ .
   ELSE .
     CLEAR MWSKZ .
   ENDIF .

ENDFORM .                     "mwskz_bestimmen


*---------------------------------------------------------------------*
*   Form MWSKZ_TXJCD_PREFETCH
*---------------------------------------------------------------------*
*   berechne vorsorglich SteuerKz & Tax Jurisdiction Code für alle
*   vorkommenden Kombinationen von Material, Werk & Lieferant.
*   Die StKz werden in IT_tax abgelegt
*   ---> BUKRS, LIFNR, IT_RKWA: Block
*   <--- IT_TAX:   Steuerkennzeichen
*        X_FEHLER: Fehler aufgetreten?
*        S_MSG:    Meldung
*---------------------------------------------------------------------*
FORM MWSKZ_TXJCD_PREFETCH  TABLES IT_RKWA   TYPE TYP_TAB_RKWA
                                 IT_TAX    TYPE TYP_TAB_TAX
                            USING LIFNR     LIKE BSEG -LIFNR
                         CHANGING X_FEHLER  TYPE  C
                                 S_MSG     TYPE TYP_MSG .

   DATA S_T001W  LIKE T001W ,
        S_RKWA   LIKE RKWA ,
        S_TAX    TYPE TYP_TAX ,
        EKORG    LIKE EINE -EKORG .

  X_FEHLER  SPACE .
   CLEAR IT_TAX .

* für alle RKWA-Einträge: bestimme StKz + TaxJcd
   LOOP  AT IT_RKWA  INTO S_RKWA .

     CLEAR S_TAX .
    S_TAX -MATNR  S_RKWA -MATNR .
    S_TAX -WERKS  S_RKWA -WERKS .
    S_TAX -LIFNR  LIFNR .

*   bestimme Tax Jurisdiction Code über das Werk
     CALL  FUNCTION  'LOCATION_SELECT_PLANT'
       EXPORTING
        I_WERKS        S_RKWA -WERKS
       IMPORTING
        O_T001W        S_T001W
       EXCEPTIONS
        ERROR_MESSAGE  1
         OTHERS         2 .

     IF  SY -SUBRC <>  ) .
       PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
      X_FEHLER  X .
       EXIT .                             "---------->
     ENDIF .
    S_TAX -TXJCD  S_T001W -TXJCD .

*   bestimme Steuerkennzeichen ...
     IF S_RKWA -MWSKZ  IS  INITIAL .         "vor 4.5A nicht in der RKWA
*   ... über Infosatz
       PERFORM EKORG_BESTIMMEN  USING S_RKWA -WERKS
                                    S_RKWA -SOBKZ
                            CHANGING EKORG .

       IF  EKORG  SPACE  ) .
        S_TAX -MWSKZ  SPACE .
       ELSE .
         PERFORM MWSKZ_BESTIMMEN  USING LIFNR
                                      S_RKWA -WERKS
                                      S_RKWA -MATNR
                                      S_RKWA -SOBKZ
                                      EKORG
                              CHANGING S_TAX -MWSKZ .
       ENDIF .

       IF  S_TAX -MWSKZ  SPACE  ) .       "kein StKz bestimmt
         CLEAR S_MSG .
        S_MSG -MSGID  C_MSGID_M8 .
        S_MSG -MSGTY  C_MSGTY_ERROR .
        S_MSG -MSGNO  '732' .
        S_MSG -MSGV1  LIFNR .
        S_MSG -MSGV2  S_RKWA -MATNR .
        S_MSG -MSGV3  S_RKWA -WERKS .
        S_MSG -MSGV4  EKORG .
        X_FEHLER  X .
         EXIT .                           "---------->
       ENDIF .
      S_RKWA -MWSKZ  S_TAX -MWSKZ .
       MODIFY IT_RKWA  FROM S_RKWA  TRANSPORTING MWSKZ .
     ELSE .
*   ... über Eintrag in der RKWA
      S_TAX -MWSKZ  S_RKWA -MWSKZ .       "ab 4.5A in der RKWA
     ENDIF .

     COLLECT S_TAX  INTO IT_TAX .
   ENDLOOP .                              "at it_rkwa

ENDFORM .                     "mwskz_txjcd_prefetch
*---------------------------------------------------------------------*
*       FORM PF_STATUS_SET                                            *
*---------------------------------------------------------------------*
*  Status der Liste setzen                                            *
*---------------------------------------------------------------------*
FORM PF_STATUS_SET  USING RT_EXTAB  TYPE SLIS_T_EXTAB .

   CLEAR RT_EXTAB .

   SET  PF-STATUS  '0001'  EXCLUDING RT_EXTAB .

ENDFORM .                     "pf_status_set
*eject
*---------------------------------------------------------------------*
*       Form  USER_COMMAND                                            *
*---------------------------------------------------------------------*
*   Reaktion auf Funktionscodes:                                      *
*    Bestellung anzeigen                                              *
*    Rechnungsbeleg anzeigen                                          *
*    Zeilen aus dem ERS ausschließen                                  *
*    Langtext der Meldungen anzeigen                                  *
*---------------------------------------------------------------------*
FORM USER_COMMAND  USING F_UCOMM  LIKE SY -UCOMM
                  I_SELFIELD  TYPE SLIS_SELFIELD .             "#EC CALLED

   DATA F_ANSWER ,
        F_EKORG     LIKE EINE -EKORG ,
        F_ESOKZ     LIKE EINE -ESOKZ ,
        S_ALV_LIST  TYPE MRM_CON_ALV .

   CLEAR S_ALV_LIST .

   READ  TABLE T_ALV_LIST  INDEX I_SELFIELD -TABINDEX  INTO S_ALV_LIST .

   CASE F_UCOMM .

     WHEN  'FB03' .                        " Buchhaltungsbeleg anzeigen
       CHECK  NOT S_ALV_LIST -BELNR  IS  INITIAL .
       SET  PARAMETER  ID  'BLN'  FIELD S_ALV_LIST -BELNR .
       SET  PARAMETER  ID  'GJR'  FIELD S_ALV_LIST -GJAHR .
       SET  PARAMETER  ID  'BUK'  FIELD S_ALV_LIST -BUKRS .
       CALL  TRANSACTION  'FB03'  AND  SKIP  FIRST  SCREEN .

     WHEN  'MB03' .
       SET  PARAMETER  ID  'MBN'  FIELD S_ALV_LIST -MBLNR .
       SET  PARAMETER  ID  'MJA'  FIELD S_ALV_LIST -MJAHR .
       CALL  FUNCTION  'MIGO_DIALOG'
         EXPORTING
          I_ACTION             'A04'
          I_REFDOC             'R02'
          I_NOTREE             'X'
          I_SKIP_FIRST_SCREEN  'X'
          I_DEADEND            'X'
          I_MBLNR              S_ALV_LIST -MBLNR
          I_MJAHR              S_ALV_LIST -MJAHR .

     WHEN  'ME13' .                        " Infosatz anzeigen

       PERFORM EKORG_BESTIMMEN  USING S_ALV_LIST -WERKS
                                    S_ALV_LIST -SOBKZ
                            CHANGING F_EKORG .

       IF S_ALV_LIST -SOBKZ  C_SOBKZ_KONS .
        F_ESOKZ  C_ESOKZ_KONS .
       ELSE .
        F_ESOKZ  C_ESOKZ_PIPE .
       ENDIF .

       SET  PARAMETER  ID  'ESO'  FIELD F_ESOKZ .
       SET  PARAMETER  ID  'LIF'  FIELD S_ALV_LIST -LIFNR .
       SET  PARAMETER  ID  'MAT'  FIELD S_ALV_LIST -MATNR .
       SET  PARAMETER  ID  'EKO'  FIELD F_EKORG .
       SET  PARAMETER  ID  'WRK'  FIELD S_ALV_LIST -WERKS .
       CALL  TRANSACTION  'ME13'  AND  SKIP  FIRST  SCREEN .

     WHEN  'MELD' .                        " Langtext der Meldung anzeigen
       PERFORM LONG_TEXT_MESSAGE_SHOW  USING S_ALV_LIST .

     WHEN  'MM03' .                        " Materialstammsatz anzeigen
       SET  PARAMETER  ID  'MAT'  FIELD S_ALV_LIST -MATNR .
       SET  PARAMETER  ID  'WRK'  FIELD S_ALV_LIST -WERKS .
       CALL  TRANSACTION  'MM03' .          "AND SKIP FIRST SCREEN.

     WHEN  'MK03' .                        " Kreditor anzeigen
       SET  PARAMETER  ID  'LIF'  FIELD S_ALV_LIST -LIFNR .
       SET  PARAMETER  ID  'KDY'  FIELD  '/110' .
       CALL  TRANSACTION  'MK03'  AND  SKIP  FIRST  SCREEN .

     WHEN  'MR91' .                        " Nachrichten anzeigen
       SET  PARAMETER  ID  'NAC'  FIELD C_KSCHL_KONS .
       SET  PARAMETER  ID  'BLN'  FIELD S_ALV_LIST -BELNR .
       CALL  TRANSACTION  'MR91' .          "AND SKIP FIRST SCREEN.

     WHEN  'DISPLAY' .                     " Auf Doppelklick reagierien
       CASE I_SELFIELD -SEL_TAB_FIELD .
         WHEN  'RKWA-MBLNR' .
           SET  PARAMETER  ID  'MBN'  FIELD S_ALV_LIST -MBLNR .
           SET  PARAMETER  ID  'MJA'  FIELD S_ALV_LIST -MJAHR .
           CALL  FUNCTION  'MIGO_DIALOG'
             EXPORTING
              I_ACTION             'A04'
              I_REFDOC             'R02'
              I_NOTREE             'X'
              I_SKIP_FIRST_SCREEN  'X'
              I_DEADEND            'X'
              I_MBLNR              S_ALV_LIST -MBLNR
              I_MJAHR              S_ALV_LIST -MJAHR .

         WHEN  'RKWA-MATNR' .
           SET  PARAMETER  ID  'MAT'  FIELD S_ALV_LIST -MATNR .
           SET  PARAMETER  ID  'WRK'  FIELD S_ALV_LIST -WERKS .
           CALL  TRANSACTION  'MM03' .      "AND SKIP FIRST SCREEN.

         WHEN  'RKWA-LIFNR' .
           SET  PARAMETER  ID  'LIF'  FIELD S_ALV_LIST -LIFNR .
           SET  PARAMETER  ID  'KDY'  FIELD  '/110' .
           CALL  TRANSACTION  'MK03'  AND  SKIP  FIRST  SCREEN .

         WHEN  'RKWA-BELNR' .
           CHECK  NOT S_ALV_LIST -BELNR  IS  INITIAL .
           SET  PARAMETER  ID  'BLN'  FIELD S_ALV_LIST -BELNR .
           SET  PARAMETER  ID  'GJR'  FIELD S_ALV_LIST -GJAHR .
           SET  PARAMETER  ID  'BUK'  FIELD S_ALV_LIST -BUKRS .
           CALL  TRANSACTION  'FB03'  AND  SKIP  FIRST  SCREEN .

         WHEN  'RKWA-TEXT' .
           PERFORM LONG_TEXT_MESSAGE_SHOW  USING S_ALV_LIST .

       ENDCASE .
   ENDCASE .
ENDFORM .                                "USER_COMMAND
*eject

*---------------------------------------------------------------------*
*   Form USER_EXIT001_AUFRUFEN
*---------------------------------------------------------------------*
*   Der Kunde kann einige Daten vor Aufruf der RW-Schnittstelle       *
*   noch abändern.
*   ---> ...
*   <--- X_FEHLER: Fehler aufgetreten?
*        SMSG: Meldung bei Fehler
*---------------------------------------------------------------------*
FORM USER_EXIT001_AUFRUFEN  TABLES IT_BKPF  TYPE TYP_TAB_BKPF
                                  IT_BSEG  TYPE TYP_TAB_BSEG
                                  IT_BSET  TYPE TYP_TAB_BSET
                                  IT_RKWA  TYPE TYP_TAB_RKWA
                             USING BUKRS     LIKE BKPF -BUKRS
                                  LIFNR     LIKE BSEG -LIFNR
                          CHANGING X_FEHLER  TYPE  C
                                  S_MSG     TYPE TYP_MSG
                                  E_GJAHR   TYPE GJAHR
                                  E_MONAT   TYPE MONAT .

   DATA TAB_BSET  TYPE TYP_TAB_BSET ,
        TAB_RKWA  TYPE TYP_TAB_RKWA .
   DATA F_GJAHR  TYPE GJAHR ,
        F_MONAT  TYPE MONAT .

   DATA S_BSEG  TYPE BSEG S_BKPF  TYPE BKPF .

   CLEAR X_FEHLER ,
         TAB_BSET ,
         TAB_RKWA .

  TAB_BSET[]  IT_BSET[] .
  TAB_RKWA[]  IT_RKWA[] .
   DATA S_BSET  TYPE BSET .
   DATA F_BSET_GJAHR  TYPE BSET -GJAHR .
   IF  NOT IT_BSET[]  IS  INITIAL .
     READ  TABLE IT_BSET  INDEX  INTO S_BSET .
    F_BSET_GJAHR  S_BSET -GJAHR .
   ENDIF .

  SY -SUBRC  0 .
   CALL  CUSTOMER-FUNCTION  '001'
     EXPORTING
      I_BUKRS  BUKRS
      I_LIFNR  LIFNR
     TABLES
      T_BKPF   IT_BKPF
      T_BSEG   IT_BSEG
      T_BSET   TAB_BSET
      T_RKWA   TAB_RKWA
     EXCEPTIONS
      ERROR    1 .

   IF  SY -SUBRC <>  ) .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .                               "---------->
   ENDIF .

   READ  TABLE IT_BKPF  INTO S_BKPF  INDEX  1 .
   IF SY -SUBRC  0 .
     IF  NOT S_BKPF -BUKRS  IS  INITIAL .
       CALL  FUNCTION  'FI_PERIOD_DETERMINE'
         EXPORTING
          I_BUDAT  S_BKPF -BUDAT
          I_BUKRS  S_BKPF -BUKRS
          I_MONAT  S_BKPF -MONAT
         IMPORTING
          E_GJAHR  F_GJAHR
          E_MONAT  F_MONAT .
       IF F_GJAHR  S_BKPF -GJAHR  AND F_MONAT  S_BKPF -MONAT .
        E_GJAHR  F_GJAHR .
        E_MONAT  F_MONAT .
       ELSE .
         CLEAR S_MSG .
        S_MSG -MSGID  C_MSGID_M8 .
        S_MSG -MSGTY  C_MSGTY_ERROR .
        S_MSG -MSGNO  '008' .
        S_MSG -MSGV1  'user_exit001_aufrufen' .
        X_FEHLER  X .
         EXIT .                             "---------->
       ENDIF .

       LOOP  AT IT_BSEG  INTO S_BSEG  WHERE GJAHR <> S_BKPF -GJAHR .
       ENDLOOP .
       IF SY -SUBRC  0 .
         CLEAR S_MSG .
        S_MSG -MSGID  C_MSGID_M8 .
        S_MSG -MSGTY  C_MSGTY_ERROR .
        S_MSG -MSGNO  '008' .
        S_MSG -MSGV1  'user_exit001_aufrufen' .
        X_FEHLER  X .
         EXIT .
       ENDIF .
     ENDIF .
   ELSE .
     CLEAR S_MSG .
    S_MSG -MSGID  C_MSGID_M8 .
    S_MSG -MSGTY  C_MSGTY_ERROR .
    S_MSG -MSGNO  '008' .
    S_MSG -MSGV1  'user_exit001_aufrufen' .
    X_FEHLER  X .
     EXIT .
   ENDIF .
   IF  NOT IT_BSET[]  IS  INITIAL .
     IF S_BKPF -GJAHR <> F_BSET_GJAHR .
       LOOP  AT IT_BSET  INTO S_BSET .
        S_BSET -GJAHR  S_BKPF -GJAHR .
         MODIFY IT_BSET  FROM S_BSET .
       ENDLOOP .
     ENDIF .
   ENDIF .

ENDFORM .                     "user_exit001_aufrufen


*---------------------------------------------------------------------*
*   Form USER_EXIT002_AUFRUFEN
*---------------------------------------------------------------------*
*   Der Kunde kann vor dem Update auf die RKWA das Customer-Include   *
*   CI_RKWA füllen.
*   ---> IT_RKWA
*   <--- X_FEHLER: Fehler aufgetreten?
*        S_MSG:   Meldung bei Fehler
*---------------------------------------------------------------------*
FORM USER_EXIT002_AUFRUFEN  TABLES IT_RKWA   TYPE TYP_TAB_RKWA
                          CHANGING X_FEHLER  TYPE  C
                                  S_MSG     TYPE TYP_MSG .

   DATA S_RKWA_IN    LIKE RKWA ,
        S_RKWA_OUT   LIKE RKWA ,
        S_RKWA_KEY   LIKE RKWA_KEY ,
        S_RKWA_DATA  LIKE RKWA_DATA ,
        X_CHECK      TYPE  C .

   CLEAR X_FEHLER .

   LOOP  AT IT_RKWA  INTO S_RKWA_IN .
*   SAP-Daten merken
     MOVE-CORRESPONDING S_RKWA_IN  TO S_RKWA_KEY .
     MOVE-CORRESPONDING S_RKWA_IN  TO S_RKWA_DATA .

*   Aufruf User-Exit
    SY -SUBRC  0 .
    X_CHECK  SPACE .
     CALL  CUSTOMER-FUNCTION  '002'
       EXPORTING
        I_RKWA         S_RKWA_IN
       IMPORTING
        E_CHECK        X_CHECK
        E_RKWA         S_RKWA_OUT
       EXCEPTIONS
        ERROR          1
        ERROR_MESSAGE  1 .

     IF  SY -SUBRC  ) .
       IF  X_CHECK  ) .               "Erweiterung wird genutzt
*       Kundenänderungen an SAP-Daten rückgängig machen
         MOVE-CORRESPONDING S_RKWA_KEY   TO S_RKWA_OUT .
         MOVE-CORRESPONDING S_RKWA_DATA  TO S_RKWA_OUT .

         MODIFY IT_RKWA  FROM S_RKWA_OUT .
       ENDIF .

     ELSE .    "in Erweiterung wurde Fehlermeldung ausgegeben
       PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
      X_FEHLER  X .
       EXIT .                             "---------->
     ENDIF .
   ENDLOOP .

ENDFORM .                     "user_exit002_aufrufen

*---------------------------------------------------------------------*
*       FORM TOP_OF_LIST                                              *
*---------------------------------------------------------------------*
* Listüberschriften am Anfang der Gesamtliste                         *
*---------------------------------------------------------------------*
FORM TOP_OF_LIST .

   DATA TAB_LIST_OF_LIST  TYPE SLIS_T_LISTHEADER "Überschriftstabelle
        S_LINE            TYPE SLIS_LISTHEADER .

   CLEAR TAB_LIST_OF_LIST S_LINE .
   REFRESH TAB_LIST_OF_LIST .

  S_LINE -TYP   'S' .
  S_LINE -INFO  TEXT - 009 .               " Protokoll
   APPEND S_LINE  TO TAB_LIST_OF_LIST .
   CALL  FUNCTION  'REUSE_ALV_COMMENTARY_WRITE'
     EXPORTING
      IT_LIST_COMMENTARY  TAB_LIST_OF_LIST .
ENDFORM .                     "top_of_list

*&---------------------------------------------------------------------*
*&      Form  INVOICE_POST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM INVOICE_POST  TABLES    TI_BKPF   TYPE TYP_TAB_BKPF
                            TI_BSEG   TYPE TYP_TAB_BSEG
                            TI_BSET   TYPE TYP_TAB_BSET
                            TI_RKWA   TYPE TYP_TAB_RKWA
                            TI_TAX    TYPE TYP_TAB_TAX
                            TI_RBWS  TYPE TYP_TAB_RBWS
                    USING    I_BLART   LIKE T169F -BLART
                            I_GJAHR   LIKE RKWA -GJAHR
                            I_MONAT   LIKE BKPF -MONAT
                            I_BUKRS   LIKE RKWA -BUKRS
                            I_LIFNR_RKWA   LIKE RKWA -LIFNR
                            S_T003    LIKE T003
                    CHANGING E_BELNR   LIKE RKWA -BELNR
                            X_FEHLER  TYPE  C
                            S_MSG     TYPE TYP_MSG .

   DATA TAB_ACCHD        LIKE ACCHD  OCCURS  WITH  HEADER  LINE ,
        TAB_ACCIT        LIKE ACCIT  OCCURS  WITH  HEADER  LINE ,
        TAB_ACCCR        LIKE ACCCR  OCCURS  WITH  HEADER  LINE ,
        TAB_ACCBSET      LIKE ACCBSET  OCCURS  WITH  HEADER  LINE ,
        TAB_ACCIT_WT     LIKE ACCIT_WT  OCCURS  WITH  HEADER  LINE ,
        S_BSET           LIKE BSET ,
        S_ACCBSET        LIKE ACCBSET ,
        LS_RKWA_KEY      TYPE RKWA_KEY ,                       "1731546
        LS_RKWA_KEY_OLD  TYPE RKWA_KEY ,                       "1731546
        F_ZEILE          TYPE ACCTIT -ZEILE ,                   "1731546
        F_LENGTH         TYPE  I ,                              "1731546
        F_AWTYP          LIKE ACCHD -AWTYP ,
        F_AWREF          LIKE ACCHD -AWREF ,
        F_AWORG          LIKE ACCHD -AWORG ,
        F_AWSYS          LIKE ACCHD -AWSYS ,
        F_HWAE1          LIKE BOOLE ,
        F_VENDOR_LINE    TYPE  C .
*ENHANCEMENT-POINT RMVKON00_02 SPOTS ES_RMVKON00.

* convert document into accounting structure
* hier werden nur Zeilen mit Curtp = 00 Belegwährung erzeugt *
* die restlichen Währungszeilen wie Hauswärhung werden durch *
* ac_doc_create erzeugt
   CALL  FUNCTION  'FI_DOC_TO_ACC_TRANSFORM'
     EXPORTING
      X_HWAE1       F_HWAE1
     TABLES
      T_BKPF        TI_BKPF
      T_BSEG        TI_BSEG
      T_BSET        TI_BSET                                     "2054048
      T_ACCHD       TAB_ACCHD
      T_ACCIT       TAB_ACCIT
      T_ACCCR       TAB_ACCCR
     EXCEPTIONS
      SYSTEM_ERROR  1 .

   IF SY -SUBRC <>  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

* Fill ZEILE in TAB_ACCIT in order to enable the FI document split in
* subroutine DOCUMENT_SPLIT_INVOICE_RECEIPT (include LFACIFSP).
* The document split is performed for the following account types:
* material (M), G/L accounts (S) and Assets (A).
   LOOP  AT TAB_ACCIT  WHERE KOART  CA  'MSA'                     "1731546
                     AND   ZUONR  IS  NOT  INITIAL               "1731546
                     AND   SGTXT  IS  NOT  INITIAL .              "1731546

    LS_RKWA_KEY -MBLNR  TAB_ACCIT -ZUONR ( 10 ) .                 "1731546
    LS_RKWA_KEY -MJAHR  TAB_ACCIT -ZUONR+10 ( 4 ) .               "1731546

*   Last 4 character of SGTXT contain RKWA-ZEILE
    F_LENGTH  STRLEN TAB_ACCIT -SGTXT  4 .                "1731546
    LS_RKWA_KEY -ZEILE  TAB_ACCIT -SGTXT+F_LENGTH ( 4 ) .         "1731546

*   Check whether the material document reference is valid      "1731546
     READ  TABLE TI_RKWA  WITH  KEY MJAHR  LS_RKWA_KEY -MJAHR    "1818133
                                MBLNR  LS_RKWA_KEY -MBLNR    "1818133
                                ZEILE  LS_RKWA_KEY -ZEILE    "1731546
                                 BINARY  SEARCH                "1731546
                        TRANSPORTING  NO  FIELDS .               "1731546
     IF SY -SUBRC  0 .                                         "1731546
       IF LS_RKWA_KEY  NE LS_RKWA_KEY_OLD .                     "1731546
        LS_RKWA_KEY_OLD  LS_RKWA_KEY .                       "1731546
        F_ZEILE  F_ZEILE +  1 .                               "1731546
       ENDIF .                                                 "1731546
      TAB_ACCIT -ZEILE  TAB_ACCIT -URZEILE  F_ZEILE .         "1731546
       MODIFY TAB_ACCIT  TRANSPORTING ZEILE URZEILE .           "1731546
     ENDIF .                                                   "1731546
   ENDLOOP .                                                   "1731546

* convert tax data into accounting structure
   LOOP  AT TI_BSET  INTO S_BSET .
     MOVE-CORRESPONDING S_BSET  TO S_ACCBSET .
    S_ACCBSET -MONAT  I_MONAT .
    S_ACCBSET -BLART  I_BLART .
     CLEAR S_ACCBSET -HWBAS ,
           S_ACCBSET -HWSTE .
     APPEND S_ACCBSET  TO TAB_ACCBSET .
   ENDLOOP .

   LOOP  AT TAB_ACCIT  WHERE POSNR  1 .
*-- withholding tax flag in table accit
     IF  NOT TI_RBWS[]  IS  INITIAL .
      TAB_ACCIT -WT_KEY  '000001' .
     ENDIF .

     MODIFY TAB_ACCIT .
   ENDLOOP .

   PERFORM WITHHOLDING_TAX_CREATE  TABLES TAB_ACCIT_WT
                                        TI_RBWS .

* alle Information aus den Sachkonten, Stammsätzen, Customizingseins
* tellungen werden hier abgeleitet, wir brauchen es nicht zu machen

   CALL  FUNCTION  'AC_DOCUMENT_CREATE'
     TABLES
      T_ACCHD        TAB_ACCHD
      T_ACCIT        TAB_ACCIT
      T_ACCCR        TAB_ACCCR
      T_ACCTX        TAB_ACCBSET
      T_ACCWT        TAB_ACCIT_WT
     EXCEPTIONS
      ERROR_MESSAGE  1 .

   IF SY -SUBRC <>  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

   PERFORM DOCUMENT_NUMBER_GET  USING I_BLART
                                    I_BUKRS
                                    I_GJAHR
                                    S_T003
                            CHANGING E_BELNR
                                    X_FEHLER
                                    S_MSG .

   CALL  FUNCTION  'FI_REFERENCE_CREATE'
     EXPORTING
      I_AWTYP  'BKPFF'
      I_BUKRS  I_BUKRS
      I_GJAHR  I_GJAHR
      I_BELNR  E_BELNR
     IMPORTING
      E_AWTYP  F_AWTYP
      E_AWREF  F_AWREF
      E_AWORG  F_AWORG
      E_AWSYS  F_AWSYS .


   CALL  FUNCTION  'AC_DOCUMENT_POST'
     EXPORTING
      I_AWTYP        F_AWTYP
      I_AWREF        F_AWREF
      I_AWORG        F_AWORG
      I_AWSYS        F_AWSYS
     EXCEPTIONS
      ERROR_MESSAGE  1 .

   IF SY -SUBRC <>  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

   READ  TABLE TI_BSEG  WITH  KEY KOART  C_KOART_KRED .
   IF TI_BSEG -WRBTR >  0 .
    F_VENDOR_LINE  X .
   ELSE .
     CLEAR F_VENDOR_LINE .
   ENDIF .

   PERFORM RKWA_UPDATE  TABLES    TI_RKWA
                                TI_TAX
                        USING    E_BELNR
                                I_GJAHR
                                I_LIFNR_RKWA
                                F_VENDOR_LINE
                        CHANGING X_FEHLER
                                S_MSG .

   IF X_FEHLER  X .
     EXIT .
   ENDIF .

   PERFORM HEAD_MESSAGE_CREATE  TABLES TI_BKPF
                                     TI_BSEG
                             USING    I_BLART
                                     E_BELNR
                                     I_BUKRS
                             CHANGING X_FEHLER
                                     S_MSG .

   IF X_FEHLER  X .
     EXIT .
   ENDIF .

ENDFORM .                                " INVOICE_POST

*&---------------------------------------------------------------------*
*&      Form  DOCUMENT_NUMBER_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM DOCUMENT_NUMBER_GET  USING I_BLART   LIKE T169F -BLART
                               I_BUKRS   LIKE RKWA -BUKRS
                               I_GJAHR   LIKE RKWA -GJAHR
                               S_T003    LIKE T003
                       CHANGING E_BELNR   LIKE RKWA -BELNR
                               X_FEHLER  TYPE  C
                               S_MSG     TYPE TYP_MSG .


   CALL  FUNCTION  'RF_GET_DOCUMENT_NUMBER'
     EXPORTING
      COMPANY          I_BUKRS
      RANGE            S_T003 -NUMKR
      YEAR             I_GJAHR
     IMPORTING
      DOCUMENT_NUMBER  E_BELNR .

   IF SY -DBSYS  NE  'ORACLE' .
     CALL  FUNCTION  'ENQUEUE_EFBKPF'
       EXPORTING
        BELNR           E_BELNR
        BUKRS           I_BUKRS
        GJAHR           I_GJAHR
       EXCEPTIONS
        FOREIGN_LOCK    1
        SYSTEM_FAILURE  2 .
     CASE SY -SUBRC .

*------- Beleg von anderem Benutzer gesperrt ---------------------------
       WHEN  1 .
*        MESSAGE A127 WITH E_BELNR I_BUKRS.
         PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
        X_FEHLER  X .
         EXIT .

*------- Systemfehler --------------------------------------------------
       WHEN  2 .
*        MESSAGE A128 WITH E_BELNR I_BUKRS.
         PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
        X_FEHLER  X .
         EXIT .
     ENDCASE .
   ENDIF .

ENDFORM .                                " DOCUMENT_NUMBER_GET
*&---------------------------------------------------------------------*
*&      Form  HEADER_DATA_FILL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM HEADER_DATA_FILL  TABLES TI_BKPF   TYPE TYP_TAB_BKPF
                        USING I_BLART   LIKE T169F -BLART
                             I_BUKRS   LIKE RKWA -BUKRS
                             I_BWAER   LIKE RKWA -BWAER
                             S_T001    LIKE T001
                     CHANGING E_GJAHR   LIKE RKWA -GJAHR
                             E_MONAT   LIKE BKPF -MONAT .


   DATA S_BKPF  LIKE BKPF .

   CLEAR S_BKPF .
  S_BKPF -MANDT  SY -MANDT .
  S_BKPF -BLART  I_BLART .
  S_BKPF -BUKRS  I_BUKRS .
  S_BKPF -TCODE  TCODE_MRKO .
  S_BKPF -WAERS  I_BWAER .
  S_BKPF -HWAER  S_T001 -WAERS .
  S_BKPF -XMWST  'X' .                   "Steuer rechnen
  S_BKPF -BLDAT  P_BLDAT .              "lokales Datum
  S_BKPF -BUDAT  P_BUDAT .              "lokales Datum
  S_BKPF -WWERT  P_BUDAT .              "lokales Datum
  S_BKPF -XBLNR  P_XBLNR .
  S_BKPF -AWTYP  C_AWTYP_BKPFF .
  S_BKPF -GLVOR  C_AWTYP_RMRP .
  S_BKPF -USNAM  SY -UNAME .
  S_BKPF -XSNET  'X' .

* month, year get
   IF  NOT S_BKPF -BUKRS  IS  INITIAL .

     CALL  FUNCTION  'FI_PERIOD_DETERMINE'
       EXPORTING
        I_BUDAT  S_BKPF -BUDAT
        I_BUKRS  S_BKPF -BUKRS
        I_MONAT  S_BKPF -MONAT
       IMPORTING
        E_GJAHR  S_BKPF -GJAHR
        E_MONAT  S_BKPF -MONAT .

   ENDIF .

  E_GJAHR  S_BKPF -GJAHR .
  E_MONAT  S_BKPF -MONAT .

*-------- Steuerkurs -------------------------------------------------*
   CALL  FUNCTION  'FI_TAX_GET_TXKRS'
     EXPORTING
      I_BUKRS       I_BUKRS
      I_CURR_FORGN  I_BWAER
      I_CURR_LOCAL  S_T001 -WAERS
      I_BLDAT       SY -DATLO
      I_BUDAT       SY -DATLO
*     i_vatdate    = ????                                   "N1023317
     IMPORTING
      E_TXKRS       S_BKPF -TXKRS .

   APPEND S_BKPF  TO TI_BKPF .

ENDFORM .                                " HEADER_DATA_FILL

*&---------------------------------------------------------------------*
*&      Form  ITEM_DATA_FILL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM ITEM_DATA_FILL  TABLES TI_BKPF  TYPE TYP_TAB_BKPF
                           TI_BSEG  TYPE TYP_TAB_BSEG
                           TI_BSET  TYPE TYP_TAB_BSET
                           TI_RKWA  TYPE TYP_TAB_RKWA
                           TI_TAX   TYPE TYP_TAB_TAX
                           TE_RBWS  TYPE TYP_TAB_RBWS
                      USING I_BUKRS  LIKE RKWA -BUKRS
                           I_GJAHR  LIKE RKWA -GJAHR
                           I_LIFNR_RKWA  LIKE RKWA -LIFNR
                           I_BWAER  LIKE RKWA -BWAER
                           S_T001  LIKE T001
                           S_T003  LIKE T003
                   CHANGING X_FEHLER  TYPE  C
                           S_MSG   TYPE TYP_MSG
                           E_LIFNR  LIKE RKWA -LIFNR .

   DATA T_BSEGT            LIKE BSEGT  OCCURS  0 ,
        S_BSEGT            LIKE BSEGT ,
        S_BSEG             LIKE BSEG ,
        S_BSET             LIKE BSET ,
        S_RKWA             LIKE RKWA ,
        S_TAX              TYPE TYP_TAX ,
        S_BKPF             LIKE BKPF ,
        S_T169             LIKE T169 ,
        H_SGTXT            LIKE BSEG -SGTXT ,
        H_GSBER            LIKE RKWA -GSBER ,
        F_BUZEI            LIKE BSEG -BUZEI ,
        F_FWSTE            LIKE ITXDAT -FWSTE ,
        F_WRBTR            LIKE RKWA -WRBTR ,
        F_ISPS_NOT_ACTIVE  LIKE FMISPS -PS_ACTIVE .
  F_BUZEI  1 .

   CONSTANTS C_T169 ( 4 )     VALUE  'T169' .

   CLEAR X_FEHLER .
   CLEAR S_MSG .

* selections
   SELECT  SINGLE FROM T169  INTO S_T169
                   WHERE TCODE  C_TCODE_MRKO .
   IF SY -SUBRC  NE  0 .
     MESSAGE E100  WITH C_T169 C_TCODE_MRKO .
   ENDIF .

* check if IS-PS active
   CALL  FUNCTION  'FM00_CHECK_ISPS'
     IMPORTING
      E_FLG_ISPS_NOT_ACTIVE  F_ISPS_NOT_ACTIVE .

* header data
   READ  TABLE TI_BKPF  INDEX  INTO S_BKPF .

* bseg fill vendor line
   CLEAR S_BSEG S_RKWA F_WRBTR .
   LOOP  AT TI_RKWA  INTO S_RKWA .
     IF S_RKWA -SHKZG  C_SHKZG_HABEN .
      F_WRBTR  F_WRBTR +  S_RKWA -WRBTR  S_RKWA -NAVNW  ) .
     ELSE .
      F_WRBTR  F_WRBTR  S_RKWA -WRBTR  S_RKWA -NAVNW  ) .
     ENDIF .
   ENDLOOP .

  S_BSEG -MANDT  SY -MANDT .
  S_BSEG -BUKRS  I_BUKRS .
  S_BSEG -GJAHR  S_BKPF -GJAHR .
  S_BSEG -BUZEI  C_BUZEI_KRED .
  S_BSEG -LIFNR  E_LIFNR .
  S_BSEG -ZFBDT  SY -DATLO .
  S_BSEG -WRBTR  ABS F_WRBTR  ) .

* posting key
   IF F_WRBTR >=  0 .
    S_BSEG -BSCHL  C_BSLKH .
   ELSE .
    S_BSEG -BSCHL  C_BSLKS .
   ENDIF .
   PERFORM POSTING_KEY_DATA_GET  USING    S_T003
                                        S_BSEG -BSCHL
                                CHANGING S_BSEG -SHKZG
                                        S_BSEG -KOART
                                        X_FEHLER
                                        S_MSG .
   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

   PERFORM VENDOR_DATA_GET  USING    I_BUKRS
                                   E_LIFNR
                           CHANGING X_FEHLER
                                   S_MSG
                                   S_BSEG -LIFNR
                                   S_BSEG -FILKD
                                   S_BSEG -ZTERM
                                   S_BSEG -QSSKZ .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .
  E_LIFNR  S_BSEG -LIFNR .
   PERFORM BUZID_GET  USING    S_T169 -VGART
                             S_BSEG -KOART
                     CHANGING S_BSEG -BUZID
                             S_BSEG -BUSTW .

   PERFORM KTOSL_GET  USING    S_BSEG -BUSTW
                     CHANGING S_BSEG -KTOSL .

   PERFORM PAYMENT_CONDITIONS_GET  USING    S_BSEG -ZTERM
                                          S_BKPF -BLDAT
                                          S_BKPF -BUDAT
                                  CHANGING S_BSEG -ZFBDT
                                          S_BSEG -ZLSPR
                                          S_BSEG -ZLSCH
                                          S_BSEG -ZBD1T
                                          S_BSEG -ZBD1P
                                          S_BSEG -ZBD2T
                                          S_BSEG -ZBD2P
                                          S_BSEG -ZBD3T
                                          X_FEHLER
                                          S_MSG .
   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

   APPEND S_BSEG  TO TI_BSEG .

*   withholding tax initialization
   IF TE_RBWS[]  IS  INITIAL .
     CALL  FUNCTION  'FI_WT_ERS_INITIALIZATION'
       EXPORTING
        I_BUKRS  S_BKPF -BUKRS
        I_GJAHR  S_BKPF -GJAHR
        I_BLDAT  S_BKPF -BLDAT
        I_BUDAT  S_BKPF -BUDAT
        I_WWERT  S_BKPF -WWERT
        I_WAERS  S_BKPF -WAERS
        I_KURSF  S_BKPF -KURSF
        I_SHKZG  S_BSEG -SHKZG
        I_LIFNR  S_BSEG -LIFNR
       TABLES
        I_RBWS   TE_RBWS .
   ENDIF .

* bseg fill (goods extract)
   LOOP  AT TI_RKWA  INTO S_RKWA .
    F_BUZEI  F_BUZEI +  1 .
     READ  TABLE TI_TAX  INTO S_TAX
                       WITH  KEY MATNR  S_RKWA -MATNR
                               WERKS  S_RKWA -WERKS
                               MWSKZ  S_RKWA -MWSKZ
                               LIFNR  I_LIFNR_RKWA .
     IF  SY -SUBRC <>  ) .
      S_MSG -MSGID  'XX' .
      S_MSG -MSGTY  =  C_MSGTY_ERROR .
      S_MSG -MSGNO  '300' .              "Verbuchungsabbruch
      S_MSG -MSGV1  TEXT - 300 .
      X_FEHLER  X .
       EXIT .
     ENDIF .

     CLEAR S_BSEG .
    S_BSEG -MANDT  SY -MANDT .
    S_BSEG -BUKRS  I_BUKRS .
    S_BSEG -GJAHR  S_BKPF -GJAHR .
    S_BSEG -BUZEI  F_BUZEI .
    S_BSEG -VORGN  C_AWTYP_RMRP .
    S_BSEG -BUZID  C_BUZID_SACH .
    S_BSEG -MWSKZ  S_TAX -MWSKZ .
    S_BSEG -TXJCD  S_TAX -TXJCD .
    S_BSEG -SAKNR  S_RKWA -HKONT .
    S_BSEG -HKONT  S_RKWA -HKONT .
    S_BSEG -GSBER  S_RKWA -GSBER .
    S_BSEG -PRCTR  S_RKWA -PRCTR .        "ab 4.5A Eintrag in der RKWA
    S_BSEG -MENGE  S_RKWA -BSTMG .
    S_BSEG -MEINS  S_RKWA -BSTME .
    S_BSEG -MATNR  S_RKWA -MATNR .    " matnr and werks are important for
    S_BSEG -WERKS  S_RKWA -WERKS .        " external tax system

* posting key in
     IF S_RKWA -SHKZG  C_SHKZG_HABEN .
      S_BSEG -BSCHL  C_BSLSS .
     ELSEIF S_RKWA -SHKZG  C_SHKZG_SOLL .
      S_BSEG -BSCHL  C_BSLSH .
     ENDIF .

     PERFORM POSTING_KEY_DATA_GET  USING    S_T003
                                          S_BSEG -BSCHL
                                  CHANGING S_BSEG -SHKZG
                                          S_BSEG -KOART
                                          X_FEHLER
                                          S_MSG .
     IF  X_FEHLER  ) .
       EXIT .
     ENDIF .

     PERFORM BUZID_GET  USING    S_T169 -VGART
                               S_BSEG -KOART
                       CHANGING S_BSEG -BUZID
                               S_BSEG -BUSTW .

     PERFORM KTOSL_GET  USING    S_BSEG -BUSTW
                       CHANGING S_BSEG -KTOSL .

*   ZuordnungsNr: aus MaterialBelegnr + Jahr zusammenbauen
     CONCATENATE S_RKWA -MBLNR S_RKWA -MJAHR  INTO S_BSEG -ZUONR .
*ENHANCEMENT-POINT RMVKON00_01 SPOTS ES_RMVKON00.
*   Fill XREF3 if IS-PS is active
     IF F_ISPS_NOT_ACTIVE  IS  INITIAL .
       MOVE S_BSEG -ZUONR  TO S_BSEG -XREF3 .
     ENDIF .
*   Positionstext: 'Abrechnung zu Materialbeleg &1 &2'
    H_SGTXT  TEXT - 011 .
     REPLACE  '&1'  WITH S_RKWA -MBLNR  INTO H_SGTXT .
     REPLACE  '&2'  WITH S_RKWA -ZEILE  INTO H_SGTXT .
    S_BSEG -SGTXT  H_SGTXT .

*   Steuerbetrag ist Null
    S_BSEG -WMWST  0 .
*   Rechnungsbetrag
    S_BSEG -WRBTR  S_RKWA -WRBTR  S_RKWA -NAVNW .
    S_BSEG -TXBFW  S_BSEG -WRBTR .
    S_BSEG -REWWR  S_BSEG -WRBTR .
    S_BSEG -NAVFW  S_RKWA -NAVNW .

* if EA-PS is active take over account assignments
     PERFORM FM_ACCOUNT_ASSIGNMENT_GET  USING S_RKWA
                                    CHANGING S_BSEG
                                            X_FEHLER
                                            S_MSG .
     IF  X_FEHLER  ) .
       EXIT .
     ENDIF .

     APPEND S_BSEG  TO TI_BSEG .
     CLEAR S_RKWA .
   ENDLOOP .


* tax data
   PERFORM BSET_FILL  TABLES   TI_BKPF
                             TI_BSEG
                             TI_BSET
                     USING    I_BUKRS
                     CHANGING S_MSG
                             X_FEHLER .

   IF  X_FEHLER  ) .
     EXIT .
   ENDIF .

* bseg fill (tax line)
   CALL  FUNCTION  'CREATE_TAX_ITEM'
     TABLES
      T_BSEGT  T_BSEGT .

   LOOP  AT T_BSEGT  INTO S_BSEGT .
    S_BSEGT -HWBAS  ABS S_BSEGT -HWBAS  ) .
    S_BSEGT -FWBAS  ABS S_BSEGT -FWBAS  ) .

     CLEAR S_BSEG .
     MOVE-CORRESPONDING S_BSEGT  TO S_BSEG .
    S_BSEG -VORGN  C_AWTYP_RMRP .
    S_BSEG -BUZID  C_BUZID_TAX .
    S_BSEG -KOART  'S' .

     APPEND S_BSEG  TO TI_BSEG .
   ENDLOOP .

   PERFORM NAV_VERTEILEN  TABLES TI_BSEG .

   PERFORM BSEG_LINES_NUMBERING  CHANGING TI_BSEG[] .

ENDFORM .                                " ITEM_DATA_FILL

*&---------------------------------------------------------------------*
*&      Form  POSTING_KEY_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM POSTING_KEY_DATA_GET  USING    S_T003   LIKE T003
                                   E_BSCHL   LIKE BSEG -BSCHL
                           CHANGING E_SHKZG   LIKE BSEG -SHKZG
                                   E_KOART   LIKE BSEG -KOART
                                   X_FEHLER  TYPE  C
                                   S_MSG   TYPE TYP_MSG .

   DATA S_TBSL   LIKE TBSL ,
        S_TBSLT  LIKE TBSLT .

   CALL  FUNCTION  'FI_POSTING_KEY_DATA'
     EXPORTING
      I_BSCHL  E_BSCHL
     IMPORTING
      E_TBSL   S_TBSL
      E_TBSLT  S_TBSLT .

   IF S_T003 -KOARS  NA S_TBSL -KOART .
     CLEAR S_MSG .
    S_MSG -MSGID  C_MSGID_M8 .
    S_MSG -MSGTY  C_MSGTY_ERROR .
    S_MSG -MSGNO  '161' .
    X_FEHLER  X .
     EXIT .
   ELSE .
    E_SHKZG  S_TBSL -SHKZG .
    E_KOART  S_TBSL -KOART .
   ENDIF .

ENDFORM .                                " POSTING_KEY_DATA_GET

*&---------------------------------------------------------------------*
*&      Form  VENDOR_DATA_GET
*&---------------------------------------------------------------------*
FORM VENDOR_DATA_GET  USING    I_BUKRS  LIKE RKWA -BUKRS
                              I_LIFNR  LIKE RKWA -LIFNR
                      CHANGING X_FEHLER  TYPE  C
                              S_MSG  TYPE TYP_MSG
                              E_LIFNR  LIKE BSEG -LIFNR
                              E_FILKD  LIKE BSEG -FILKD
                              E_ZTERM  LIKE BSEG -ZTERM
                              E_QSSKZ  LIKE BSEG -QSSKZ .

   DATA S_KRED  LIKE VF_KRED .
   CLEAR S_KRED .

*- read the vendor data
   CALL  FUNCTION  'FI_VENDOR_DATA'
     EXPORTING
      I_BUKRS        I_BUKRS
      I_LIFNR        I_LIFNR
     IMPORTING
      E_KRED         S_KRED
     EXCEPTIONS
      ERROR_MESSAGE  01 .

   IF SY -SUBRC  NE  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

  E_QSSKZ  S_KRED -QSSKZ .
  E_ZTERM  S_KRED -ZTERM .

   IF  NOT S_KRED -LNRZE  IS  INITIAL .       " headquater
    E_LIFNR  S_KRED -LNRZE .
    E_FILKD  I_LIFNR .
     CLEAR S_KRED E_QSSKZ E_ZTERM .

     CALL  FUNCTION  'FI_VENDOR_DATA'
       EXPORTING
        I_BUKRS        I_BUKRS
        I_LIFNR        E_LIFNR
       IMPORTING
        E_KRED         S_KRED
       EXCEPTIONS
        ERROR_MESSAGE  01 .

     IF SY -SUBRC  NE  0 .
       PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
      X_FEHLER  X .
       EXIT .
     ENDIF .
    E_QSSKZ  S_KRED -QSSKZ .
    E_ZTERM  S_KRED -ZTERM .
   ENDIF .

   IF S_KRED -BEGRU  NE SPACE .
     PERFORM AUTHORITY_CHECK  USING  'BEK'  'BRGRU' S_KRED -BEGRU
                             CHANGING S_MSG
                                     X_FEHLER .
     IF X_FEHLER  X .
       EXIT .
     ENDIF .
   ENDIF .

   IF S_KRED -BEGRU_B  NE SPACE .
     PERFORM AUTHORITY_CHECK  USING  'BEK'  'BRGRU' S_KRED -BEGRU_B
                             CHANGING S_MSG
                                     X_FEHLER .
     IF X_FEHLER  X .
       EXIT .
     ENDIF .
   ENDIF .

ENDFORM .                                " VENDOR_DATA_GET

*&---------------------------------------------------------------------*
*&      Form  BUZID_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUZID_GET  USING    I_VGART
                        I_KOART
                CHANGING E_BUZID
                        E_BUSTW .

*------- Buchungsstring ermitteln, BUZID setzen ----------------------*
   CALL  FUNCTION  'MR_STRING_DETERMINE'
     EXPORTING
      I_KNTTP  ' '
      I_KOART  I_KOART
      I_PSTYP  ' '
      I_VGART  I_VGART
     IMPORTING
      E_BUSTW  E_BUSTW
      E_BUZID  E_BUZID .

ENDFORM .                                " BUZID_GET

*&---------------------------------------------------------------------*
*&      Form  KTOSL_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM KTOSL_GET  USING    I_BUSTW
                CHANGING E_KTOSL .

   DATA TAB_T169C  LIKE T169C  OCCURS  0 ,
        S_T169C    LIKE T169C ,
        S_SGNBU    LIKE SGNBU .

   CALL  FUNCTION  'MR_POSTING_GENERATE'
     EXPORTING
      I_BUSTW  I_BUSTW
      I_SGNBU  S_SGNBU
     TABLES
      T_T169C  TAB_T169C .


   LOOP  AT TAB_T169C  INTO S_T169C
                     WHERE BUSTW  I_BUSTW .
    E_KTOSL  S_T169C -VORSL .
   ENDLOOP .


ENDFORM .                                " KTOSL_GET

*&---------------------------------------------------------------------*
*&      Form  PAYMENT_CONDITIONS_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PAYMENT_CONDITIONS_GET  USING    I_ZTERM  LIKE BSEG -ZTERM
                                     I_BLDAT  LIKE BKPF -BLDAT
                                     I_BUDAT  LIKE BKPF -BUDAT
                             CHANGING E_ZFBDT  LIKE BSEG -ZFBDT
                                     E_ZLSPR  LIKE BSEG -ZLSPR
                                     E_ZLSCH  LIKE BSEG -ZLSCH
                                     E_ZBD1T  LIKE BSEG -ZBD1T
                                     E_ZBD1P  LIKE BSEG -ZBD1P
                                     E_ZBD2T  LIKE BSEG -ZBD2T
                                     E_ZBD2P  LIKE BSEG -ZBD2P
                                     E_ZBD3T  LIKE BSEG -ZBD3T
                                     X_FEHLER  TYPE  C
                                     S_MSG   TYPE TYP_MSG .

   DATA S_T052   LIKE T052 ,
        S_SKLIN  LIKE SKLIN .

   CONSTANTS C_T052 ( 4 VALUE  'T052' .

* ZTERM (*) is needed for substitution paymnt term from headquater
   CHECK I_ZTERM  NE  '*' .

   CALL  FUNCTION  'FI_FIND_PAYMENT_CONDITIONS'
     EXPORTING
      I_ZTERM        I_ZTERM
      I_BLDAT        I_BLDAT
      I_BUDAT        I_BUDAT
     IMPORTING
      E_T052         S_T052
      E_ZFBDT        E_ZFBDT
      E_SKLIN        S_SKLIN
     EXCEPTIONS
      ERROR_MESSAGE  1 .

   IF SY -SUBRC  NE  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ELSE .

*------- Zahlungsschlüssel und Zahlungssperre vorschlagen --------------
    E_ZLSPR  S_T052 -ZSCHF .
    E_ZLSCH  S_T052 -ZLSCH .

*----------- Tage und Prozente setzen ----------------------------------
    E_ZBD1T  S_SKLIN -ZTAG1 .
    E_ZBD1P  S_SKLIN -ZPRZ1 .
    E_ZBD2T  S_SKLIN -ZTAG2 .
    E_ZBD2P  S_SKLIN -ZPRZ2 .
    E_ZBD3T  S_SKLIN -ZTAG3 .
   ENDIF .

ENDFORM .                                " PAYMENT_CONDITIONS_GET


*&---------------------------------------------------------------------*
*&      Form  BSET_FILL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM BSET_FILL  TABLES   TI_BKPF   TYPE TYP_TAB_BKPF
                        TI_BSEG   TYPE TYP_TAB_BSEG
                        TI_BSET   TYPE TYP_TAB_BSET
                USING    I_BUKRS   LIKE RKWA -BUKRS
                CHANGING S_MSG     TYPE TYP_MSG
                        X_FEHLER  TYPE  C .

   DATA T_DBSEG   LIKE DBSEG  OCCURS  WITH  HEADER  LINE ,
        S_BSEG    LIKE BSEG ,
        S_DBSEG   LIKE DBSEG ,
        S_BKPF    LIKE BKPF ,
        TAB_BKPF  LIKE BKPF  OCCURS  WITH  HEADER  LINE ,
        F_KALSM   LIKE T005 -KALSM .

   READ  TABLE TI_BKPF  INDEX  INTO S_BKPF .

  S_BKPF -AWTYP  C_AWTYP_RMRP .
   APPEND S_BKPF  TO TAB_BKPF .

* dbseg fill for cash discount
   LOOP  AT TI_BSEG  INTO S_BSEG .
     IF S_BSEG -KOART  C_KOART_KRED .
      T_DBSEG -XSKFB  X .
     ELSE .
      T_DBSEG -XSKFB  SPACE .
     ENDIF .
     APPEND T_DBSEG .
   ENDLOOP .

   CALL  FUNCTION  'FIND_TAX_SPREADSHEET'
     EXPORTING
      BUCHUNGSKREIS  I_BUKRS
     IMPORTING
      SCHEMA         F_KALSM
     EXCEPTIONS
      ERROR_MESSAGE  1 .

   IF SY -SUBRC  NE  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

   CALL  FUNCTION  'CALCULATE_TAX_DOCUMENT'
     EXPORTING
      I_BUKRS        I_BUKRS
     IMPORTING
      E_ITXDAT       ITXDAT
     TABLES
      T_BKPF         TAB_BKPF
      T_BSEG         TI_BSEG
      T_DBSEG        T_DBSEG
     EXCEPTIONS
      ERROR_MESSAGE  1 .

   IF SY -SUBRC  NE  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .
* amount eligible for cash discount
   LOOP  AT TI_BSEG  INTO S_BSEG  WHERE BUZID  C_BUZID_KRED .
     READ  TABLE T_DBSEG  INDEX  INTO S_DBSEG .
    S_BSEG -SKFBT  S_DBSEG -SKFBT .
     MODIFY TI_BSEG  FROM S_BSEG .
   ENDLOOP .

* bseg fill
   CALL  FUNCTION  'CREATE_BSET_ITEM'
     TABLES
      T_BKPF  TI_BKPF
      T_BSEG  TI_BSEG
      T_BSET  TI_BSET .

* vendor amount incl. taxes
   CLEAR S_BSEG .
   LOOP  AT TI_BSEG  INTO S_BSEG  WHERE BUZID  C_BUZID_KRED .
     IF  S_BSEG -SHKZG  'S'  AND  ITXDAT -SHKZG  'S'  )
     OR  S_BSEG -SHKZG  'H'  AND  ITXDAT -SHKZG  'H'  ) .
      S_BSEG -WRBTR  S_BSEG -WRBTR  ITXDAT -FWSTE .
     ELSE .
      S_BSEG -WRBTR  S_BSEG -WRBTR + ITXDAT -FWSTE .
     ENDIF .
    S_BSEG -REWWR  S_BSEG -WRBTR .
    S_BSEG -TXBFW  S_BSEG -WRBTR .
     MODIFY TI_BSEG  FROM S_BSEG .
     CLEAR S_BSEG .
   ENDLOOP .

ENDFORM .                                " BSET_FILL

*&---------------------------------------------------------------------*
*&      Form  RKWA_UPDATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM RKWA_UPDATE  TABLES TI_RKWA  TYPE TYP_TAB_RKWA
                        TI_TAX   TYPE TYP_TAB_TAX
                   USING I_BELNR  LIKE RKWA -BELNR
                        I_GJAHR  LIKE RKWA -GJAHR
                        I_LIFNR  LIKE RKWA -LIFNR
                        I_VENDOR_LINE  TYPE  C
                CHANGING X_FEHLER  TYPE  C
                        S_MSG     TYPE TYP_MSG .

   DATA S_RKWA  LIKE RKWA ,
        S_TAX   TYPE TYP_TAX .


   LOOP  AT TI_RKWA  INTO S_RKWA .
    S_RKWA -STATUS  '01' .
    S_RKWA -BELNR   I_BELNR .
    S_RKWA -GJAHR   I_GJAHR .
     IF  NOT I_VENDOR_LINE  IS  INITIAL .
      S_RKWA -BUZEI   SY -TABIX +  1 .    "erste Zeile ist Kreditorenzeile
     ELSE .
      S_RKWA -BUZEI   SY -TABIX .
     ENDIF .

* sales tax flag
     READ  TABLE TI_TAX  INTO S_TAX
                       WITH  KEY MATNR  S_RKWA -MATNR
                               WERKS  S_RKWA -WERKS
                               LIFNR  I_LIFNR .
     IF SY -SUBRC  NE  0 .
       CLEAR S_MSG .
      S_MSG -MSGID  C_MSGID_M8 .
      S_MSG -MSGTY  C_MSGTY_ERROR .
      S_MSG -MSGNO  '008' .
      S_MSG -MSGV1  'RKWA_UPDATE' .
      X_FEHLER  X .
       EXIT .
     ENDIF .

     IF S_RKWA -MWSKZ  IS  INITIAL .         "ab 4.5A Eintrag in der RKWA
      S_RKWA -MWSKZ  S_TAX -MWSKZ .
     ENDIF .

     MODIFY TI_RKWA  FROM S_RKWA .
   ENDLOOP .

*------ Abrechnung Konsi-Verbindlichkeiten ---------------------------*
   DESCRIBE  TABLE TI_RKWA  LINES SY -TFILL .
   IF SY -TFILL  GT  0 .

     CALL  FUNCTION  'MR_RKWA_UPDATE'  IN  UPDATE  TASK
       EXPORTING
        I_UPDKZ  'U'
       TABLES
        T_RKWA   TI_RKWA .
   ENDIF .

ENDFORM .                                " RKWA_UPDATE

*&---------------------------------------------------------------------*
*&      Form  VARIANT_INIT
*&---------------------------------------------------------------------*
FORM VARIANT_INIT .

   CLEAR S_VARIANT .
  S_VARIANT - REPORT  C_REPID .

ENDFORM .                                " VARIANT_INIT
*&---------------------------------------------------------------------*
*&      Form  F4_VARIA
*&---------------------------------------------------------------------*
FORM F4_VARIA  CHANGING CF_VARIA  LIKE DISVARIANT -VARIANT .

   DATA F_EXIT ( 1 )    TYPE  C .

   PERFORM VARIANT_INIT .

   CALL  FUNCTION  'REUSE_ALV_VARIANT_F4'
     EXPORTING
      IS_VARIANT  S_VARIANT
      I_SAVE      C_SAVE
     IMPORTING
      E_EXIT      F_EXIT
      ES_VARIANT  S_VAR_USR
     EXCEPTIONS
      NOT_FOUND   2 .

   IF SY -SUBRC  2 .
     MESSAGE  ID SY -MSGID  TYPE  'S'       NUMBER SY -MSGNO
             WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
   ELSE .
     IF F_EXIT  SPACE .
      CF_VARIA  S_VAR_USR -VARIANT .
     ENDIF .
   ENDIF .

ENDFORM .                                                     " F4_VARIA
*&---------------------------------------------------------------------*
*&      Form HEAD_MESSAGE_CREATE
*&---------------------------------------------------------------------*
FORM HEAD_MESSAGE_CREATE  TABLES   TI_BKPF  TYPE TYP_TAB_BKPF
                                   TI_BSEG  TYPE TYP_TAB_BSEG
                           USING    I_BLART  LIKE T169F -BLART
                                   I_BELNR  LIKE RKWA -BELNR
                                   I_BUKRS  LIKE RKWA -BUKRS
                           CHANGING X_FEHLER  TYPE  C
                                   S_MSG     TYPE TYP_MSG .


   DATA LF_UPDATE    LIKE  BOOLE -BOOLE .

   DATA H_RBKPV     TYPE MRM_RBKPV ,
        LS_KOMKBMR  LIKE  KOMKBMR .

   CLEAR H_RBKPV S_MSG .

   MOVE-CORRESPONDING TI_BKPF  TO H_RBKPV .
   READ  TABLE TI_BSEG  INDEX  1 .
  H_RBKPV -BELNR   =  I_BELNR .
  H_RBKPV -LIFNR   =  TI_BSEG -LIFNR .
* create messages
  LF_UPDATE  'X' .

* Kommunikationsstruktur füllen
   CLEAR LS_KOMKBMR .
  LS_KOMKBMR -BUKRS  I_BUKRS .
  LS_KOMKBMR -BELNR  I_BELNR .
  LS_KOMKBMR -BLART  I_BLART .
  LS_KOMKBMR -USNAM  H_RBKPV -USNAM .
   IF  NOT TI_BSEG -FILKD  IS  INITIAL .
    LS_KOMKBMR -LIFNR  TI_BSEG -FILKD .   " Partner LF
   ELSE .
    LS_KOMKBMR -LIFNR  TI_BSEG -LIFNR .   " Partner LF
   ENDIF .
  LS_KOMKBMR -LIFRE  TI_BSEG -LIFNR .           " Partner RS
  LS_KOMKBMR -IDENT  C_IDENT_KONS .

   CALL  FUNCTION  'MRM_HEAD_MESSAGE_CREATE'
     EXPORTING
      IF_KAPPL       C_KAPPL_MR
      IF_KALSM       C_KALSM_0003
      IS_RBKPV       H_RBKPV
      IS_KOMKBMR     LS_KOMKBMR
      IF_UPDATE      LF_UPDATE
     EXCEPTIONS
      ERROR_MESSAGE  2
       OTHERS         3 .

   IF SY -SUBRC <>  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
     IF SY -MSGTY  'A' .    "Ausgabe der A-Meldung als E-Meldung:
      S_MSG -MSGTY  'E' .
     ENDIF .
    X_FEHLER  X .
     EXIT .
   ENDIF .

ENDFORM .                                " HEAD_MESSAGE_CREATE
*&---------------------------------------------------------------------*
*&      Form  authority_check
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM AUTHORITY_CHECK  USING    AUTH_OBJ
                              AUTH_ID
                              AUTH_VAL  TYPE LFA1 -BEGRU
                      CHANGING S_MSG     TYPE TYP_MSG
                              X_FEHLER  TYPE  C .
   CASE AUTH_OBJ .
     WHEN  'BEK' .
       AUTHORITY-CHECK OBJECT  'F_BKPF_BEK'
                       ID  'ACTVT'  FIELD  '01'
                       ID AUTH_ID  FIELD AUTH_VAL .
       IF SY -SUBRC  NE  0 .
         CLEAR S_MSG .
        S_MSG -MSGID  C_MSGID_M8 .
        S_MSG -MSGTY  C_MSGTY_ERROR .
        S_MSG -MSGNO  '120' .
        S_MSG -MSGV1  AUTH_VAL .
        X_FEHLER  X .
         EXIT .
       ENDIF .
   ENDCASE .
ENDFORM .                                " authority_check
*&---------------------------------------------------------------------*
*&      Form  bseg_lines_numbering
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_TI_BSEG[]  text
*----------------------------------------------------------------------*
FORM BSEG_LINES_NUMBERING  CHANGING TI_BSEG  TYPE TYP_TAB_BSEG .

   DATA S_BSEG   LIKE BSEG ,
        F_BUZEI  LIKE BSEG -BUZEI .

   CLEAR F_BUZEI .
   LOOP  AT TI_BSEG  INTO S_BSEG .
    F_BUZEI  F_BUZEI +  1 .
    S_BSEG -BUZEI  F_BUZEI .
     MODIFY TI_BSEG  FROM S_BSEG  TRANSPORTING BUZEI .
   ENDLOOP .

ENDFORM .                                " bseg_lines_numbering
*&---------------------------------------------------------------------*
*&      Form  nav_verteilen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TI_BSEG  text
*----------------------------------------------------------------------*
FORM NAV_VERTEILEN  TABLES  TI_BSEG  STRUCTURE BSEG .

   DATA LT_BSEG_OUTPUT  TYPE  STANDARD  TABLE  OF BSEG ,
        LT_BSEG_INPUT   TYPE  STANDARD  TABLE  OF BSEG .

   DATA LS_BSEG  LIKE BSEG .                           "1824213 start
   DATA LV_COUNTER  TYPE  I .

   FIELD-SYMBOLS <LS_BSEG>         TYPE BSEG ,
                 <LS_BSEG_OUTPUT>  TYPE BSEG .

   LOOP  AT TI_BSEG  ASSIGNING <LS_BSEG>
                  WHERE BUZID  C_BUZID_SACH
                    AND KOART  C_KOART_SACH .

    LV_COUNTER  LV_COUNTER +  1 .
    <LS_BSEG> -XREF1  LV_COUNTER .
    LS_BSEG  <LS_BSEG> .
     APPEND LS_BSEG  TO LT_BSEG_INPUT .
   ENDLOOP .

   CLEAR LS_BSEG .

   CALL  FUNCTION  'NDVAT_ADJUSTMENT'
     EXPORTING
      I_BSEG         LS_BSEG
      READ_BSEG      'X'
      CALCULATE      'M'
     IMPORTING
      E_BSEG         LS_BSEG
     TABLES
      T_BSEG_INPUT   LT_BSEG_INPUT
      T_BSEG_OUTPUT  LT_BSEG_OUTPUT .

   LOOP  AT TI_BSEG  ASSIGNING <LS_BSEG>
                       WHERE BUZID  C_BUZID_SACH
                         AND KOART  C_KOART_SACH .

     READ  TABLE LT_BSEG_OUTPUT  ASSIGNING <LS_BSEG_OUTPUT>
                               WITH  KEY XREF1  <LS_BSEG> -XREF1 .
     IF <LS_BSEG_OUTPUT>  IS  ASSIGNED .
      <LS_BSEG> -WRBTR  <LS_BSEG_OUTPUT> -WRBTR .
       DELETE  TABLE LT_BSEG_OUTPUT  FROM <LS_BSEG_OUTPUT> .
       CLEAR <LS_BSEG> -XREF1 .
     ENDIF .
   ENDLOOP .                                            "1824213 end

ENDFORM .                                " nav_verteilen
*&---------------------------------------------------------------------*
*&      Form  null_lines_check                                         *
*&---------------------------------------------------------------------*
*  Prüft ob der Beleg nur 0-Zeilen beinhaltet                          *
*----------------------------------------------------------------------*
*      -->P_TAB_BSEG  text
*      <--P_X_FEHLER  text
*      <--P_S_MSG  text
*----------------------------------------------------------------------*
FORM NULL_LINES_CHECK  TABLES   TI_BSEG  STRUCTURE BSEG
                       CHANGING X_FEHLER  TYPE  C
                               S_MSG     TYPE TYP_MSG .

   DATA XNULLPOS  LIKE BOOLE -BOOLE .

*--- Überprüfung, ob der zu erzeugende FI-Beleg nicht nur Nullzeilen --*
*--- enthält:                                                        --*
   MOVE  'X'  TO XNULLPOS .
   LOOP  AT TI_BSEG .
     IF XNULLPOS  SPACE .
       EXIT .
     ELSE .
       IF TI_BSEG -WRBTR <>  OR TI_BSEG -FWBAS <>  0 .
         CLEAR XNULLPOS .
       ENDIF .
     ENDIF .
   ENDLOOP .

   IF XNULLPOS  'X' .
     CLEAR S_MSG .
    S_MSG -MSGID  C_MSGID_M8 .
    S_MSG -MSGTY  C_MSGTY_ERROR .
    S_MSG -MSGNO  '278' .
    X_FEHLER  X .
     EXIT .
   ENDIF .

ENDFORM .                                " null_lines_check
*&---------------------------------------------------------------------*
*&      Form  BADI_HEADERDATA_MODIFY
*&---------------------------------------------------------------------*
*  in this BAdI the vendor and the invoice type can be changed
*----------------------------------------------------------------------*
FORM BADI_HEADERDATA_MODIFY  TABLES   IT_RKWA   TYPE TYP_TAB_RKWA
                             USING    I_BUKRS   LIKE BKPF -BUKRS
                             CHANGING X_BLART   LIKE T169F -BLART
                                     X_LIFNR   LIKE RKWA -LIFNR
                                     X_FEHLER  TYPE  C
                                     S_MSG     TYPE TYP_MSG .

   CALL  FUNCTION  'MRMBADI_MRKO_HDAT_MODIFY'
     EXPORTING
      I_BUKRS     I_BUKRS
      I_LIFNR     X_LIFNR
      I_BLART     X_BLART
      TI_RKWA     IT_RKWA[]
     IMPORTING
      E_LIFNR     X_LIFNR
      E_BLART     X_BLART
     EXCEPTIONS
      BADI_ERROR  01 .

   IF  SY -SUBRC <>  ) .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

ENDFORM .                                " badi_headerdata_modify
*eject
*&---------------------------------------------------------------------*
*&      Form  DOCUMENT_TYPE_CHECK
*&---------------------------------------------------------------------*
*  netto document type is not allowed
*----------------------------------------------------------------------*
FORM DOCUMENT_TYPE_CHECK  USING    BLART     LIKE T169F -BLART
                          CHANGING S_T003    LIKE T003
                                  X_FEHLER  TYPE  C
                                  S_MSG     TYPE TYP_MSG .
   CLEAR S_T003 .

* gefundene Belegart darf nicht NettoBelegart sein
   CALL  FUNCTION  'FI_DOCUMENT_TYPE_DATA'
     EXPORTING
      I_BLART        BLART
     IMPORTING
      E_T003         S_T003
     EXCEPTIONS
      ERROR_MESSAGE  1
       OTHERS         2 .
   IF  SY -SUBRC <>  ) .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

   IF  S_T003 -XNETB  ) .
     CLEAR S_MSG .
    S_MSG -MSGID  C_MSGID_M8 .
    S_MSG -MSGTY  C_MSGTY_ERROR .
    S_MSG -MSGNO  '733' .
    S_MSG -MSGV1  C_TCODE_MRKO .
    S_MSG -MSGV2  BLART .
    X_FEHLER  X .
     EXIT .
   ENDIF .

ENDFORM .                     "document_type_check
*&--------------------------------------------------------------------*
*&      Form  fm_account_assignment_get
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->S_RKWA     text
*      -->S_BSEG     text
*      -->X_FEHLER   text
*      -->S_MSG      text
*---------------------------------------------------------------------*
FORM FM_ACCOUNT_ASSIGNMENT_GET  USING S_RKWA    STRUCTURE RKWA
                             CHANGING S_BSEG    STRUCTURE BSEG
                                     X_FEHLER  TYPE       C
                                     S_MSG     TYPE      TYP_MSG .
   INCLUDE IFIFMCON_APPL ,
           IFIFMCON_BOOL .

   DATA L_F_MSEG               LIKE ACCTIT ,
        L_FLAG_FMAKT           TYPE  C ,
        L_FLG_ISPS_NOT_ACTIVE  TYPE  C .
* definitions for reading archived documents from AIS
   DATA LT_ARCMKPF   TYPE  TY_T_MKPF ,
        LT_ARCMSEG   TYPE  TY_T_MSEG ,
        LS_ARCMSEG   TYPE  MSEG ,
        LS_BORIDENT  TYPE  BORIDENT .

*----- Nur Aufrufen wenn IS-PS aktiv ist
   CALL  FUNCTION  'FM00_CHECK_ISPS'
     IMPORTING
      E_FLG_ISPS_NOT_ACTIVE  L_FLG_ISPS_NOT_ACTIVE .
   CHECK L_FLG_ISPS_NOT_ACTIVE  IS  INITIAL .

   CALL  FUNCTION  'FMFK_BUKRS_CHECK_FMAKTIV'
     EXPORTING
      IP_BUKRS            S_RKWA -BUKRS
      IP_APPLC            APPLC_CA
     IMPORTING
      OP_IS_ACTIVE        L_FLAG_FMAKT
     EXCEPTIONS
      NO_FIKRS_FOR_BUKRS  01
      WRONG_INPUT_FLAG    02 .                               "#EC *
   CHECK L_FLAG_FMAKT  CON_JA  AND SY -SUBRC  IS  INITIAL .

*----- HHM Kontierung aus dem Materialbeleg holen
   SELECT  SINGLE FIPOS FISTL FKBER GEBER BUDGET_PD GRANT_NBR
     FROM ACCTIT
     INTO CORRESPONDING  FIELDS  OF L_F_MSEG
    WHERE AWTYP  'MKPF'
      AND AWREF  S_RKWA -MBLNR
      AND AWORG  S_RKWA -MJAHR
      AND ZEILE  S_RKWA -ZEILE
      AND KTOSL  'GBB' .
   IF SY -SUBRC <>  OR L_F_MSEG -FIPOS  IS  INITIAL .
     SELECT  SINGLE FIPOS FISTL GEBER FKBER GRANT_NBR
       FROM MSEG
       INTO CORRESPONDING  FIELDS  OF L_F_MSEG
      WHERE MBLNR  S_RKWA -MBLNR
        AND MJAHR  S_RKWA -MJAHR
        AND ZEILE  S_RKWA -ZEILE .
     IF SY -SUBRC <>  0 .
* read MM doc data from AIS (archive)
       REFRESH LT_ARCMKPF .
       REFRESH LT_ARCMSEG .
       CLEAR   LS_BORIDENT .
       CONCATENATE  S_RKWA -MBLNR S_RKWA -MJAHR
                           INTO  LS_BORIDENT -OBJKEY .
       CALL  FUNCTION  'ASH_MM_MATBEL_READ'
         EXPORTING
          I_BORIDENT     LS_BORIDENT
         TABLES
          ET_MKPF        LT_ARCMKPF
          ET_MSEG        LT_ARCMSEG
         EXCEPTIONS
          ERROR_MESSAGE  1
           OTHERS         4 .
       IF SY -SUBRC  0 .
         LOOP  AT LT_ARCMSEG  INTO LS_ARCMSEG
            WHERE ZEILE      S_RKWA -ZEILE .
          L_F_MSEG -FIPOS      LS_ARCMSEG -FIPOS .
          L_F_MSEG -FISTL      LS_ARCMSEG -FISTL .
          L_F_MSEG -GEBER      LS_ARCMSEG -GEBER .
          L_F_MSEG -FKBER      LS_ARCMSEG -FKBER .
          L_F_MSEG -GRANT_NBR  LS_ARCMSEG -GRANT_NBR .
         ENDLOOP .
       ELSE .
         IF  2 .
           MESSAGE E298 (FI ) .
*   MSEG Zeile nicht gefunden! Ableitung der HHM Kontierung nicht möglic
         ENDIF .

         CLEAR S_MSG .
        S_MSG -MSGID  'FI' .
        S_MSG -MSGTY  C_MSGTY_ERROR .
        S_MSG -MSGNO  '298' .
        X_FEHLER  'X' .
         EXIT .
       ENDIF .
     ENDIF .
   ENDIF .

  S_BSEG -GRANT_NBR   L_F_MSEG -GRANT_NBR .
  S_BSEG -FKBER_LONG  L_F_MSEG -FKBER .
  S_BSEG -FIPOS  L_F_MSEG -FIPOS .
  S_BSEG -GEBER  L_F_MSEG -GEBER .
* Budget Period EhP4
   IF CL_OPS_SWITCH_CHECK =>OPS_SFWS_BUD_PER IS  NOT  INITIAL .
    S_BSEG -BUDGET_PD  L_F_MSEG -BUDGET_PD .
   ENDIF .
  S_BSEG -FISTL  L_F_MSEG -FISTL .
ENDFORM .                     "fm_account_assignment_get
*&---------------------------------------------------------------------*
*&      Form  withholding_tax_create
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TAB_ACCIT_WT  text
*      -->P_TI_RBWS  text
*----------------------------------------------------------------------*
FORM WITHHOLDING_TAX_CREATE  TABLES TE_ACCIT_WT  STRUCTURE ACCIT_WT
                                   TI_RBWS      TYPE TYP_TAB_RBWS .

   CHECK  NOT TI_RBWS[]  IS  INITIAL .

   DATA S_RBWS  LIKE RBWS .

   LOOP  AT TI_RBWS  INTO S_RBWS .
     CLEAR TE_ACCIT_WT .
     MOVE-CORRESPONDING S_RBWS  TO TE_ACCIT_WT .
    TE_ACCIT_WT -WT_KEY  S_RBWS -SPLIT_KEY .
     APPEND TE_ACCIT_WT .
   ENDLOOP .

ENDFORM .                     " withholding_tax_create
*&---------------------------------------------------------------------*
*&      Form  vendor_taxnum_check
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_RKWA  text
*      -->P_S_T001  text
*      -->P_LIFNR  text
*      <--P_X_FEHLER  text
*      <--P_S_MSG  text
*----------------------------------------------------------------------*
FORM VENDOR_TAXNUM_CHECK  TABLES   TI_RKWA  TYPE TYP_TAB_RKWA
                           USING    S_T001   LIKE T001
                                   I_LIFNR  LIKE RKWA -LIFNR
                           CHANGING X_FEHLER  TYPE  C
                                   S_MSG    TYPE TYP_MSG .
   DATA S_TAXDATA    TYPE MRM_TAX_2 ,
        S_RKWA       LIKE RKWA ,
        S_KRED       LIKE VF_KRED ,
        TAB_TAXDATA  TYPE MRM_TAB_TAXES ,
        S_T005       LIKE T005 .

   CALL  FUNCTION  'READ_CUSTOMIZED_MESSAGE'
     EXPORTING
      I_ARBGB  'M8'
      I_DTYPE  'W'
      I_MSGNR  '759'
     IMPORTING
      E_MSGTY  SY -MSGTY .
   CHECK SY -MSGTY  'E' .

* read vendor
   CALL  FUNCTION  'FI_VENDOR_DATA'
     EXPORTING
      I_LIFNR         I_LIFNR
     IMPORTING
      E_KRED          S_KRED
     EXCEPTIONS
      VENDOR_MISSING  1
       OTHERS          2 .
   IF SY -SUBRC  NE  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

* check country of vendor
   CALL  FUNCTION  'T005_SINGLE_READ'
     EXPORTING
      T005_LAND1  S_KRED -LAND1
     IMPORTING
      WT005       S_T005
     EXCEPTIONS
      NOT_FOUND   1
       OTHERS      2 .
   IF SY -SUBRC <>  0 .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ELSEIF S_T005 -XEGLD  IS  INITIAL .
     EXIT .
   ENDIF .

* fill table taxdata
   LOOP  AT TI_RKWA  INTO S_RKWA  WHERE MWSKZ  NE SPACE .
    S_TAXDATA -MWSKZ  S_RKWA -MWSKZ .
     COLLECT S_TAXDATA  INTO TAB_TAXDATA .
   ENDLOOP .

* read country data of company code
   CALL  FUNCTION  'MRM_T005_READ'
     EXPORTING
      TI_T001     S_T001
     IMPORTING
      TE_T005     S_T005
     TABLES
      TI_TAXDATA  TAB_TAXDATA "#EC FB_NORC

   IF SY -SUBRC <>  0 .                                         "#EC FB_NORC
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ELSEIF S_T005 -XEGLD  IS  INITIAL .
     EXIT .
   ENDIF .

* check tax number
   IF   S_T005 -INTCA <>  'DE'  AND S_KRED -STENR  IS  INITIAL  )
       OR  S_T005 -INTCA  =   'DE'  AND S_KRED -STENR  IS  INITIAL
           AND S_KRED -STCD1  IS  INITIAL  AND S_KRED -STCEG  IS  INITIAL  .
    SY -MSGTY  'E' .
    SY -MSGID  'M8' .
    SY -MSGNO  '759' .
     PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
    X_FEHLER  X .
     EXIT .
   ENDIF .

ENDFORM .                     " vendor_taxnum_check

*&---------------------------------------------------------------------*
*&      Form  LOCK_RKWA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_RKWA  text
*      <--P_X_FEHLER  text
*      <--P_S_MSG  text
*----------------------------------------------------------------------*
FORM LOCK_RKWA  TABLES   IT_RKWA  TYPE TYP_TAB_RKWA
                CHANGING X_FEHLER
                        S_MSG    TYPE TYP_MSG .

   DATA LS_RKWA  LIKE RKWA .

   CLEAR X_FEHLER .

   LOOP  AT IT_RKWA  INTO LS_RKWA .
     CALL  FUNCTION  'ENQUEUE_E_RKWA'
       EXPORTING
        MBLNR           LS_RKWA -MBLNR
        MJAHR           LS_RKWA -MJAHR
        ZEILE           LS_RKWA -ZEILE
       EXCEPTIONS
        FOREIGN_LOCK    1
        SYSTEM_FAILURE  2
         OTHERS          3 .
     IF SY -SUBRC <>  0 .
       PERFORM MSG_FUELLEN_SYSVAR  CHANGING S_MSG .
      X_FEHLER  'X' .
       EXIT .
     ENDIF .
   ENDLOOP .

ENDFORM .                     " lock_rkwa


*{   INSERT
INCLUDE WRF_RMVKON00F01 .     "Note 663537

*}   INSERT


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值