All files / src/env zcl_abapgit_user_record.clas.abap

100% Statements 200/200
100% Branches 0/0
100% Functions 0/0
100% Lines 200/200

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 2011x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
CLASS zcl_abapgit_user_record DEFINITION
  PUBLIC
  FINAL
  CREATE PRIVATE
  GLOBAL FRIENDS zcl_abapgit_env_factory.
 
  PUBLIC SECTION.
    CLASS-METHODS reset.
 
    INTERFACES zif_abapgit_user_record.
 
  PROTECTED SECTION.
  PRIVATE SECTION.
    TYPES:
      BEGIN OF ty_user,
        user  TYPE sy-uname,
        name  TYPE string,
        email TYPE string,
      END OF ty_user.
 
    CLASS-DATA gt_user TYPE HASHED TABLE OF ty_user WITH UNIQUE KEY user.
 
    CLASS-METHODS check_user_exists
      IMPORTING
        iv_user     TYPE sy-uname
      EXPORTING
        ev_fullname TYPE string
        ev_email    TYPE string
      RAISING
        zcx_abapgit_exception.
 
    CLASS-METHODS get_user_dtls_from_other_clnt
      IMPORTING
        iv_user        TYPE sy-uname
      RETURNING
        VALUE(rs_user) TYPE ty_user.
 
    CLASS-METHODS build_cache
      IMPORTING
        iv_user        TYPE sy-uname
      RETURNING
        VALUE(rs_user) TYPE ty_user.
 
    CLASS-METHODS read_cache
      IMPORTING
        iv_user        TYPE sy-uname
      RETURNING
        VALUE(rs_user) TYPE ty_user.
ENDCLASS.
 
 
 
CLASS ZCL_ABAPGIT_USER_RECORD IMPLEMENTATION.
 
 
  METHOD build_cache.
 
    " Get user details
    TRY.
        check_user_exists(
          EXPORTING
            iv_user     = iv_user
          IMPORTING
            ev_fullname = rs_user-name
            ev_email    = rs_user-email ).
      CATCH zcx_abapgit_exception.
        " Could not find user, try to get from other clients
        rs_user = get_user_dtls_from_other_clnt( iv_user ).
    ENDTRY.
 
    rs_user-user = iv_user.
    INSERT rs_user INTO TABLE gt_user.
 
  ENDMETHOD.
 
 
  METHOD check_user_exists.
 
    DATA lt_return  TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.
    DATA ls_address TYPE bapiaddr3.
    DATA lt_smtp    TYPE TABLE OF bapiadsmtp.
    DATA ls_smtp    LIKE LINE OF lt_smtp.
 
    CALL FUNCTION 'BAPI_USER_GET_DETAIL'
      EXPORTING
        username = iv_user
      IMPORTING
        address  = ls_address
      TABLES
        return   = lt_return
        addsmtp  = lt_smtp.
    LOOP AT lt_return TRANSPORTING NO FIELDS WHERE type CA 'EA'.
      zcx_abapgit_exception=>raise( |User: { iv_user } not found| ).
    ENDLOOP.
 
    ev_fullname = ls_address-fullname.
 
    " Choose the first email from SU01
    SORT lt_smtp BY consnumber ASCENDING.
 
    LOOP AT lt_smtp INTO ls_smtp.
      ev_email = ls_smtp-e_mail.
      EXIT.
    ENDLOOP.
 
  ENDMETHOD.
 
 
  METHOD get_user_dtls_from_other_clnt.
 
    CONSTANTS lc_cc_category TYPE string VALUE 'C'.
    TYPES ty_dev_clients TYPE SORTED TABLE OF sy-mandt WITH UNIQUE KEY table_line.
    DATA lt_dev_clients TYPE ty_dev_clients.
    FIELD-SYMBOLS <lv_dev_client> LIKE LINE OF lt_dev_clients.
 
    " Could not find the user, try other development clients
    SELECT mandt FROM t000 INTO TABLE lt_dev_clients
        WHERE cccategory = lc_cc_category AND mandt <> sy-mandt
        ORDER BY PRIMARY KEY.
 
    LOOP AT lt_dev_clients ASSIGNING <lv_dev_client>.
      SELECT SINGLE u~bname p~name_text a~smtp_addr INTO (rs_user-user, rs_user-name, rs_user-email)
          FROM usr21 AS u
          INNER JOIN adrp AS p ON p~persnumber = u~persnumber
                              AND p~client     = u~mandt
          INNER JOIN adr6 AS a ON a~persnumber = u~persnumber
                              AND a~addrnumber = u~addrnumber
                              AND a~client     = u~mandt
          CLIENT SPECIFIED
          WHERE u~mandt      = <lv_dev_client>
            AND u~bname      = iv_user
            AND p~date_from <= sy-datum
            AND p~date_to   >= sy-datum
            AND a~date_from <= sy-datum.
      IF sy-subrc = 0.
        EXIT.
      ENDIF.
    ENDLOOP.
 
  ENDMETHOD.
 
 
  METHOD read_cache.
 
    READ TABLE gt_user INTO rs_user WITH TABLE KEY user = iv_user.
    IF sy-subrc <> 0.
      rs_user = build_cache( iv_user ).
    ENDIF.
 
  ENDMETHOD.
 
 
  METHOD reset.
    CLEAR gt_user.
  ENDMETHOD.
 
 
  METHOD zif_abapgit_user_record~get_email.
 
    rv_email = read_cache( iv_username )-email.
 
  ENDMETHOD.
 
 
  METHOD zif_abapgit_user_record~get_name.
 
    rv_name = read_cache( iv_username )-name.
 
  ENDMETHOD.
 
 
  METHOD zif_abapgit_user_record~get_title.
* the queried username might not exist, refactored for open-abap compatibility
 
    DATA lr_addr3             TYPE REF TO data.
    FIELD-SYMBOLS <ls_addr3>  TYPE any.
    FIELD-SYMBOLS <lv_simple> TYPE simple.
 
    TRY.
        CREATE DATA lr_addr3 TYPE ('ADDR3_VAL').
      CATCH cx_sy_create_data_error.
        RETURN.
    ENDTRY.
    ASSIGN lr_addr3->* TO <ls_addr3>.
 
    CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
      EXPORTING
        user_name              = iv_username
      IMPORTING
        user_address           = <ls_addr3>
      EXCEPTIONS
        user_address_not_found = 1
        OTHERS                 = 2.
    IF sy-subrc = 0.
      ASSIGN COMPONENT 'NAME_TEXT' OF STRUCTURE <ls_addr3> TO <lv_simple>.
      rv_title = <lv_simple>.
    ENDIF.
 
  ENDMETHOD.
ENDCLASS.