top of page

*&---------------------------------------------------------------------*
*& report zixomo_nondiv_payment
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
report zixomo_get_nondiv_payment.

constants: c_wsid(5)    value 'IB01A',
           c_blart(2)   value 'Z5',
           c_hkont(6)   value '564000',
           ws_login(30) type c value 'App_TW_CMS',
           ws_pass(30)  type c value '',
           ws_appid(30) type c value 'TWCMS'.  " Bank Charge A/C

tables: zxomopayoutlog.
parameters: p_chk1   radiobutton group ga default 'X'.
selection-screen begin of block b1 with frame title text-001.
parameters: p_tok    as checkbox default 'X',
            p_budat  type bkpf-budat default sy-datum,
            p_bukrs  type bkpf-bukrs default '1000',
            p_url    type string lower case,
            p_file   type string lower case,
            p_pend   radiobutton group g1,
            p_na     radiobutton group g1,
            p_return radiobutton group g1.
selection-screen end of block b1.

parameters: p_chk2  radiobutton group ga.
selection-screen begin of block b2 with frame title text-002.
select-options: s_budat1 for zxomopayoutlog-payout_date,
                s_zuonr1 for zxomopayoutlog-payout_sequence_id.
parameters: p_pend1 radiobutton group g2 default 'X',
            p_na1   radiobutton group g2,
            p_ret1  radiobutton group g2.
selection-screen end of block b2.

data: it_pend type table of zgl_accdoc with header line,
      wa_log  type zxomopayoutlog.

data: begin of it_result occurs 0,
        chkbx        type  icon-id,
        index(4)     type  c,
        bukrs        type  bkpf-bukrs,
        bldat        type  bkpf-bldat,
        budat        type  bkpf-budat,
        wrbtr        type  bseg-wrbtr,
        waers        type  bkpf-waers,
        zuonr        type  bseg-zuonr,
        sgtxt        type  bseg-sgtxt,
        xref1        type  bseg-xref1,
        xref2        type  bseg-xref2,
        xref3        type  bseg-xref3,
        zzpolicy01   type  zgl_accdoc-zzpolicy01,
        doc_no       type  bkpf-belnr,
        debit        type  bseg-hkont,
        credit       type  bseg-hkont,
        type(1)      type  c,
        message(100) type  c,
      end of it_result.

data: begin of it_canc occurs 0,
        chkbx        type  icon-id,
        index(4)     type  c,
        bukrs        type bkpf-bukrs,
        doc_no       type bkpf-belnr,
        gjahr        type bkpf-gjahr,
        bldat        type  bkpf-bldat,
        budat        type  bkpf-budat,
        wrbtr        type  bseg-wrbtr,
        waers        type  bkpf-waers,
        zuonr        type  bseg-zuonr,
        sgtxt        type  bseg-sgtxt,
        xref1        type  bseg-xref1,
        xref2        type  bseg-xref2,
        xref3        type  bseg-xref3,
        zzpolicy01   type  zgl_accdoc-zzpolicy01,
        debit        type  bseg-hkont,
        credit       type  bseg-hkont,
        type(1)      type  c,
        message(100) type  c,
      end of it_canc.

data: begin of it_return occurs 0,
        cheque_number(20)            type c,
        cheque_status(10)            type c,
        cheque_cancellation_date(10) type c,
        payout_sequence_id(20)       type c,
        type(1)                      type  c,
        message(100)                 type  c,
      end of it_return.

data BEGIN OF it_payhdr2 occurs 0.
  DATA: sel.
  INCLUDE STRUCTURE zxomopayouthdr.
DATA END OF it_payhdr2.

data: it_payhdr type zxomopayouthdr occurs 0 with header line.
data: it_payout type zxomopayoutlog occurs 0 with header line.
data: begin of it_bdcdata occurs 0. "batch session
    include structure bdcdata.
data: end of it_bdcdata.
data:   messtab like bdcmsgcoll occurs 0 with header line.

DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE slis_layout_alv,
      gd_repid     LIKE sy-repid.

types: begin of json_data,
         policy_number                type string,
         campaign_code                type string,
         payer_bank_code              type string,
         payee_bank_code              type string,
         payee_branch_code            type string,
         payee_id                     type string,
         payee_name                   type string,
         payee_bank_account           type string,
         payment_method               type string,
         gross_amount                 type string,
         payment_status               type string,
         bank_charge                  type string,
         payout_currency              type string,
         event_remark                 type string,
         operation_name               type string,
         last_cancellation_date       type string,
         payout_date                  type string,
         payout_sequence_id           type string,
         withdrawal_strip_sequence_id type string,
         cheque_number                type string,
         cheque_status                type string,
         cheque_cancellation_date     type string,
         finance_product_code         type string,
         partner_id                   type string,
         accounting_t0_code           type string,
         accounting_t1_code           type string,
         accounting_t2_code           type string,
         accounting_t5_code           type string,
         accounting_t6_code           type string,
         accounting_t7_code           type string,
       end of json_data.

data: json_itab      type table of json_data,
      json_wa        type json_data,
      temp_json_itab type table of json_data,
      temp_json_wa   type json_data,
      cancel_itab    type table of json_data,
      cancel_wa      type json_data,
      return_itab    type table of json_data,
      return_wa      type json_data.

types: begin of json_response,
         status   type string,
         msg_code type string,
         msg_desc type string,
         response type table of json_data with non-unique default key,
       end of json_response.

data: response_wa type json_response,
      temp        type string,
      w_status    type json_response-status.
data: w_line(4096).
data: begin of outline occurs 0,
        text(255),
      end of outline.

data: begin of it_skip occurs 0,
        zuonr type bseg-zuonr,
        budat type bkpf-budat,
      end of it_skip.

data: w_error.
data: w_datum like sy-datum,
      w_uzeit like sy-uzeit.

initialization.
  select single url into p_url from zws_master where wsid = c_wsid.
  w_datum = sy-datum.
  w_uzeit = sy-uzeit.

at selection-screen.
  if p_url is initial and p_file is initial AND p_chk1 EQ 'X'.
    message e001(00) with 'Please enter URL or File Name'.
  endif.

at selection-screen on value-request for p_file.
  perform f4_filename.

start-of-selection.
  if p_chk1 = 'X'.
    case 'X'.
      when p_pend.
        perform get_data.
        if w_error is initial.
          perform process_data.
          perform process_doc.
        endif.
      when p_na.
        perform get_data.
        if w_error is initial.
          perform process_cancel_data.
          perform process_cancel_doc.
        endif.
      when p_return.
        perform get_data.
        if w_error is initial.
          perform process_return_data.
          perform process_return_doc.
        endif.
    endcase.
    perform display_doc.
  endif.
  if p_chk2 = 'X'.
    case 'X'.
      when p_pend1.
        perform get_log.
        if w_error is initial.
          perform process_data.
          perform process_doc.
        endif.
      when p_na1.
        perform get_log.
        if w_error is initial.
          perform process_cancel_data.
          perform process_cancel_doc.
        endif.
      when p_ret1.
        perform get_log.
        if w_error is initial.
          perform process_return_data.
          perform process_return_doc.
        endif.
    endcase.
    perform display_doc.
  endif.

form get_data.
  data: lo_http_client type ref to if_http_client,
        lo_rest_client type ref to cl_rest_http_client,
        lv_response    type string,
        token(50)      type c,
        pass_token     type string.
  data: rawdata type truxs_t_text_data with header line.
  clear: response_wa,json_itab,json_wa.
  refresh it_pend.

  if p_file is not initial.
    call function 'GUI_UPLOAD'
      exporting
        filename                = p_file
        filetype                = 'ASC'
        codepage                = '8300'
        "CODEPAGE  = '8300'
      tables
        data_tab                = rawdata
      exceptions
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        others                  = 17.

    loop at rawdata.
      temp = rawdata.
      condense temp.
      concatenate lv_response temp into lv_response.
    endloop.
*     /ui2/cl_json=>deserialize( exporting json = lv_response changing data = response_wa  ).
  else.
    case 'X'.
      when p_pend.
        concatenate p_url '?queryDate=' p_budat
                     '&paymentStatus=pending' into p_url.
      when p_na.
        concatenate p_url '?queryDate=' p_budat
                 '&paymentStatus=na' into p_url.
      when p_return.
        concatenate p_url '?queryDate=' p_budat
                     '&paymentStatus=return' into p_url.
    endcase.
    cl_http_client=>create_by_url(
      exporting
        url = p_url
      importing
        client = lo_http_client
      exceptions
        argument_not_found = 1
        plugin_not_active = 2
        internal_error = 3
        others = 4 ).
    if sy-subrc <> 0.
      return.
    endif.

    create object lo_rest_client
      exporting
        io_http_client = lo_http_client.

    lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).

    if p_tok eq 'X'.
      call function 'Z_BAPI_GET_TOKEN'
        exporting
          login         = ws_login
          password      = ws_pass
          applicationid = ws_appid
        importing
          token         = token.
      "Need to save at somewhere for further use?
    else.
      token = 'SAP'.
    endif.
    if token is not initial.
      pass_token = token.
    else.
      pass_token = 'SAP'.
    endif.

*  * passing the token value in header
    call method lo_http_client->request->set_header_field
      exporting
        name  = 'Token'
        value = pass_token.

*   passing the content-type value in header which is a mandatory field
    call method lo_http_client->request->set_header_field
      exporting
        name  = 'Content-Type'
        value = 'application/json;charset=utf-8'.

    lo_http_client->request->set_method( 'GET' ).
    lo_http_client->request->set_content_type( 'application/json' ).
    lo_http_client->propertytype_logon_popup = if_http_client=>co_disabled.

    lo_http_client->send(
                     exceptions
                     http_communication_failure = 1
                     http_invalid_state = 2 ).

*   receiving the response
    lo_http_client->receive(
                    exceptions
                    http_communication_failure = 1
                    http_invalid_state = 2
                    http_processing_failed = 3 ).
    if sy-subrc eq 0.
    endif.

    lv_response = lo_http_client->response->get_cdata( ).
  endif.
  /ui2/cl_json=>deserialize( exporting json = lv_response changing data = response_wa  ).

  if not p_file is initial.
    write: / 'Test File: ', p_file.
  else.
    write: / 'URL     : ', p_url,
           / 'Run Date: ', p_budat.
  endif.

  w_line = lv_response.
  w_status = response_wa-status.
  if w_status = '200' .
    move response_wa-response to json_itab.
    sort json_itab by payout_sequence_id.
    loop at json_itab into json_wa.
      select single payout_sequence_id into temp from zxomopayouthdr
       where payout_sequence_id = json_wa-payout_sequence_id
         and payout_date = json_wa-payout_date
         and status = '02'.   " ALready Processed
      check sy-subrc ne 0.
      on change of json_wa-payout_sequence_id.
        it_payout-sequence = 0.
        it_payhdr-payout_sequence_id = json_wa-payout_sequence_id.
        it_payhdr-payout_date = json_wa-payout_date.
        it_payhdr-status = '01'.   " Created
        it_payhdr-updatedate = w_datum.
        it_payhdr-updatetime = w_uzeit.
        case 'X'.
          when p_pend.
            it_payhdr-datastatus = 'PENDING'.
          when p_na.
            it_payhdr-datastatus = 'NA'.
          when p_return.
            it_payhdr-datastatus = 'RETURN'.
        endcase.
        append it_payhdr.
      endon.
      it_payout-sequence = it_payout-sequence + 1.
      case 'X'.
        when p_pend.
          it_payout-datastatus = 'PENDING'.
        when p_na.
          it_payout-datastatus = 'NA'.
        when p_return.
          it_payout-datastatus = 'RETURN'.
      endcase.
      move-corresponding json_wa to it_payout.
      append it_payout.
    endloop.
    modify zxomopayouthdr from table it_payhdr.
    modify zxomopayoutlog from table it_payout.
  else.
    it_result-type  = 'E'.
    it_result-message = response_wa-msg_code.
    append it_result.
    w_error = 'X'.
  endif.

endform.

form get_log.
  clear: it_payhdr[], it_payout[].
  case 'X'.
    when p_pend1.
      select *
        from zxomopayouthdr
        into corresponding fields of table it_payhdr2
       where payout_sequence_id in s_zuonr1
         and payout_date in s_budat1
         and datastatus = 'PENDING'
         and ( status = '01' or status = '99' ).
*      DATA: temp(10) TYPE n.
*      DO 10 TIMES.
*        temp = temp + 1.
*        it_payhdr-payout_sequence_id = temp.
*        APPEND it_payhdr.
*      ENDDO.
      IF lines( it_payhdr2 ) NE 0.
        perform display_alv_list.
      ENDIF.
      loop at it_payhdr.

        select * from zxomopayoutlog
          appending corresponding fields of table it_payout
         where payout_sequence_id = it_payhdr-payout_sequence_id
           and payout_date = it_payhdr-payout_date.

      endloop.
      loop at it_payout.
        move-corresponding it_payout to json_wa.
        append json_wa to json_itab.
      endloop.
    when p_na1.
      select * from zxomopayouthdr
        into corresponding fields of table it_payhdr
       where payout_sequence_id in s_zuonr1
         and payout_date in s_budat1
         and datastatus = 'NA'
         and ( status = '01' or status = '99' ).
      IF lines( it_payhdr ) NE 0.
        perform display_alv_list.
      ENDIF.

      loop at it_payhdr.
        select * from zxomopayoutlog
         into corresponding fields of table it_payout
         where payout_sequence_id = it_payhdr-payout_sequence_id
           and payout_date = it_payhdr-payout_date.
      endloop.
      loop at it_payout.
        move-corresponding it_payout to cancel_wa.
        append cancel_wa to cancel_itab.
      endloop.

    when p_ret1.
      select * from zxomopayouthdr
        into corresponding fields of table it_payhdr
       where payout_sequence_id in s_zuonr1
         and payout_date in s_budat1
         and datastatus = 'RETURN'
         and ( status = '01' or status = '99' ).

      IF lines( it_payhdr ) NE 0.
        perform display_alv_list.
      ENDIF.

      loop at it_payhdr.
        select * from zxomopayoutlog
         into corresponding fields of table it_payout
         where payout_sequence_id = it_payhdr-payout_sequence_id
           and payout_date = it_payhdr-payout_date.
      endloop.
      loop at it_payout.
        move-corresponding it_payout to return_wa.
        append return_wa to return_itab.
      endloop.
  endcase.
  "TBD

  if lines( json_itab ) eq 0 and lines( cancel_itab ) eq 0 and lines( return_itab ) eq 0.
    w_error = 'X'.
    write: / 'No Record Found.'.
  endif.
endform.

form process_data.
  data: gv_item    type i,
        dr_acc     type bseg-hkont,
        cr_acc     type bseg-hkont,
        hktid      type t012a-hktid,
        hbkid      type t012a-hbkid,
        wa_it_pend type zgl_accdoc,
        wa_itab2   type zgl_accdoc
        .
  data: w_trtype type ztrtyp.
  data: tran_itab type table of zbk_acc_det with header line.

  data: temp        type string,
        local_waers type bkpf-waers,
        temp2       type string.
  data: year(4)  type c,
        month(2) type c,
        day(2)   type c.

  temp_json_itab = json_itab.
  loop at json_itab into json_wa.
    on change of json_wa-payout_sequence_id.
      add 1 to gv_item.
      clear: it_pend, w_error.
      select single payout_sequence_id
        into temp
        from zxomopayouthdr
      where payout_sequence_id = json_wa-payout_sequence_id
        and payout_date = json_wa-payout_date
        and datastatus = 'PENDING'
        and ( status = '02' ).
      if sy-subrc eq 0. " Already Processed
        it_skip-zuonr = temp.
        append it_skip.
        continue.   " Skip
      endif.
      it_pend-index = gv_item.
      it_pend-bldat = p_budat.
      it_pend-budat = json_wa-payout_date.
      it_pend-blart = c_blart.    " Doc Type
      it_pend-bukrs = p_bukrs. " Company Code
      it_pend-bktxt = json_wa-operation_name.

      select single sap_curr into it_pend-waers from zws_curr
         where xo_curr = json_wa-payout_currency.   " Currency
      if it_pend-waers is initial.
        concatenate 'No matching currency in ZWS_CURR: ' json_wa-payout_currency
        into it_pend-message separated by space.
        it_pend-type = 'E'.
        w_error = 'X'.
      endif.

* credit line
      it_pend-bschl = '50'.  " Credit
      select single clearing ztrtype
        into ( cr_acc, w_trtype )
        from zxo_clr_acc_det
       where bankcode = json_wa-payer_bank_code
         and currency = it_pend-waers
         and payout_type = json_wa-payment_method.

      if sy-subrc ne 0.
        concatenate 'No matching A/C in ZXO_CLR_ACCT_DET: '
        json_wa-payer_bank_code it_pend-waers json_wa-payment_method
        into it_pend-message separated by space.
        it_pend-type = 'E'.
        w_error = 'X'.
      else.
        perform conversion_exit changing cr_acc.
        it_pend-hkont = cr_acc.
        select single description into it_pend-xblnr
        from zbk_transtype
        where ztrtype = w_trtype.
      endif.
*
      loop at temp_json_itab into temp_json_wa where payout_sequence_id = json_wa-payout_sequence_id.
        it_pend-wrbtr = it_pend-wrbtr + temp_json_wa-gross_amount.
      endloop.
      it_pend-wrbtr = it_pend-wrbtr + json_wa-bank_charge.
      it_pend-dmbtr = 0."let it cal in post function
      it_pend-zuonr = json_wa-payout_sequence_id.
      it_pend-sgtxt = json_wa-payee_bank_code && json_wa-payee_branch_code
                    && json_wa-payee_bank_account.
      it_pend-valut = json_wa-payout_date.
      it_pend-xref1 = json_wa-payee_id.
      it_pend-xref2 = json_wa-payee_name.
      it_pend-xref3 = json_wa-withdrawal_strip_sequence_id.
      it_pend-zzpolicy01 = json_wa-policy_number.
      it_pend-zfieldname = 'ZZPOLICY01;ZZCAMPCD1;ZZT0;ZZT1;ZZT2;ZZT5;ZZT6;ZZT7;ZZPRODLI1;ZZPARTNR01'.
      it_pend-zfieldval = json_wa-policy_number
                      && ';' && json_wa-campaign_code
                      && ';' && json_wa-accounting_t0_code
                      && ';' && json_wa-accounting_t1_code
                      && ';' && json_wa-accounting_t2_code
                      && ';' && json_wa-accounting_t5_code
                      && ';' && json_wa-accounting_t6_code
                      && ';' && json_wa-accounting_t7_code
                      && ';' && json_wa-finance_product_code
                      && ';' && json_wa-partner_id.

* debit line for bank charge if bank charge > 0
      clear wa_it_pend.
      if json_wa-bank_charge > 0.
        move it_pend to wa_it_pend.
        wa_it_pend-bschl = '40'.
        wa_it_pend-hkont = c_hkont.
        wa_it_pend-wrbtr = json_wa-bank_charge.
        wa_it_pend-sgtxt = ''.
      endif.

* all others debit line
      loop at temp_json_itab into temp_json_wa where payout_sequence_id = json_wa-payout_sequence_id.
        clear wa_itab2.
        move it_pend to wa_itab2.
        wa_itab2-bschl = '40'.
        wa_itab2-wrbtr = temp_json_wa-gross_amount.
        wa_itab2-sgtxt = temp_json_wa-event_remark.
        select single hkont
           into wa_itab2-hkont
           from zxo_evt_desc
          where prod_line = temp_json_wa-finance_product_code
            and evt_desc = temp_json_wa-event_remark.
        if sy-subrc ne 0.
          concatenate 'No matching record in ZXO_EVT_DESC: '
          temp_json_wa-finance_product_code
          temp_json_wa-event_remark
          into it_pend-message separated by space.
          wa_itab2-type = 'E'.
          it_pend-type = 'E'.
          w_error = 'X'.
        else.
          append wa_itab2 to it_pend.
        endif.
      endloop.

      " Records to Result itab
      clear it_result.
      move-corresponding it_pend to it_result.
      it_result-credit  = it_pend-hkont.
      it_result-debit   = wa_it_pend-hkont.
      it_result-message = it_pend-message.
      append it_result.

      " Records to IT_PEND
      if it_pend-type <> 'E'.
        append it_pend.
        if wa_it_pend is not initial.
          append wa_it_pend to it_pend.
        endif.
      else.
        update zxomopayouthdr set status = '99'
                                  message = it_pend-message
                  where payout_sequence_id = json_wa-payout_sequence_id
                    and payout_date = json_wa-payout_date.
      endif.
    endon.
  endloop.

endform.

form process_doc.
  data: curr_index(4)  type c,
        bapi_result(4) type c.
  data: w_datum like sy-datum,
        w_uzeit like sy-uzeit.

  if it_pend[] is not initial.
    call function 'Z_BAPI_POST_DOC'
      exporting
        park_flag   = ''
        print_flag  = 'X'
        alv         = 'X'
        test_run    = ' '
      tables
        acc_doc     = it_pend
      exceptions
        check_fail  = 1
        create_fail = 2.

    bapi_result = sy-subrc."Read table in below loop for it_result may replace sy-subrc.
  else.
    bapi_result = -1.
  endif.

  clear curr_index.
  loop at it_pend.
    if curr_index <> it_pend-index."skip duplicate line.for D / C balance record in it_pend.
      curr_index = it_pend-index.
      "update result tab
      read table it_result with key index = it_pend-index.
      move it_pend-doc_no to it_result-doc_no.
      move it_pend-type to it_result-type.
      move it_pend-message to it_result-message.
      modify it_result index sy-tabix.
    endif.
  endloop.
  clear curr_index.
  w_datum = sy-datum.
  w_uzeit = sy-uzeit.
  loop at it_pend.
    on change of it_pend-index.

*      loop at it_payout where payout_sequence_id = it_pend-zuonr.
*        if it_pend-type = ''.
*          it_payout-status = '02'.
*        elseif it_pend-type = 'E'.
*          it_payout-status = '99'.
*          it_payout-message = it_pend-message.
*        endif.
*        modify it_payout.
*      endloop.
*      modify zxomopayoutlog from table it_payout.

      loop at it_payhdr where payout_sequence_id = it_pend-zuonr.
        if it_pend-type = ''.
          it_payhdr-status = '02'.
        elseif it_pend-type = 'E'.
          it_payhdr-status = '99'.
          it_payhdr-message = it_pend-message.
        endif.
        modify it_payhdr.
      endloop.
      modify zxomopayouthdr from table it_payhdr.
    endon.
  endloop.
endform.

form process_cancel_data.
  "Get bukrs,belnr,gjahr

  data: year(4)  type c,
        month(2) type c,
        day(2)   type c.

  if w_error = ''.
    move response_wa-response to cancel_itab.
    skip.
*    write: / 'Convert from JSON to SAP Format ...'.
    loop at cancel_itab into cancel_wa.
      select single payout_sequence_id
        into temp
        from zxomopayouthdr
      where payout_sequence_id = cancel_wa-payout_sequence_id
        and payout_date = cancel_wa-payout_date
        and datastatus = 'NA'
        and status = '02'.
      if sy-subrc eq 0. " ALreayd Processed
        it_skip-zuonr = temp.
        append it_skip.
        continue.   " Skip
      endif.
      select single bkpf~bukrs
                    bkpf~belnr as doc_no
                    bkpf~gjahr
                    bseg~zuonr
        into corresponding fields of it_canc
        from bseg
       inner join bkpf on bkpf~bukrs = bseg~bukrs
                      and bkpf~belnr = bseg~belnr
                      and bkpf~gjahr = bseg~gjahr
                      and bkpf~blart = c_blart
                      and bkpf~stblg = ''
       where bseg~zuonr = cancel_wa-payout_sequence_id.
      if sy-subrc ne 0.
        it_canc-zuonr = cancel_wa-payout_sequence_id.
        concatenate 'No matching Payout Seq ID: '
           cancel_wa-payout_sequence_id
           into it_canc-message separated by space.
        it_canc-type = 'E'.
        w_error = 'X'.
        update zxomopayouthdr set status = '99'
                                  message = it_pend-message
                  where payout_sequence_id = cancel_wa-payout_sequence_id
                    and payout_date = cancel_wa-payout_date.
      endif.
      append it_canc.
    endloop.
  endif.
endform.

form process_cancel_doc.
  data: re_budat    type bkpf-budat,
        temp_month  type i,
        temp_str(2) type c.
  data: gv_item  type i.
  data: obj_key type bapiacrev-obj_key.
  data: w_reversal type bapiacrev.
  data: it_return type table of bapiret2,
        wa_return type bapiret2.

  loop at it_canc where type <> 'E'.
    add 1 to gv_item.
    it_canc-index = gv_item.

    w_reversal-obj_type = 'BKPFF'.
    w_reversal-reason_rev = 'CP'.
    concatenate it_canc-doc_no
                it_canc-bukrs
                it_canc-gjahr into w_reversal-obj_key_r.
    call function 'BAPI_ACC_DOCUMENT_REV_POST'
      exporting
        reversal = w_reversal
        bus_act  = 'RFBU'
      importing
        obj_key  = obj_key
      tables
        return   = it_return.
    loop at it_return into wa_return where type = 'E'. " Error
      it_canc-type = 'E'.
      it_canc-message = wa_return-message.
      modify it_canc.
    endloop.
    if sy-subrc ne 0.
      call function 'BAPI_TRANSACTION_COMMIT'.

      it_canc-sgtxt = obj_key.
      modify it_canc.
    endif.
    modify it_canc.
    "    move-corresponding it_canc to it_result.
    "    append it_result.
  endloop.

  "LOG
  loop at it_canc."result tab and record tab is create in same time. tabix<->record will be match.
    on change of it_canc-index.
      loop at it_payhdr where payout_sequence_id = it_canc-zuonr.
        if it_canc-type = ''.
          it_payhdr-status = '02'.
        elseif it_pend-type = 'E'.
          it_payhdr-status = '99'.
          it_payhdr-message = it_canc-message.
        endif.
        modify it_payhdr.
      endloop.
      modify zxomopayouthdr from table it_payhdr.
*    loop at it_payout where payout_sequence_id = it_canc-zuonr.
*      if it_canc-type = ''.
*        it_payout-status = '02'.
*      elseif it_canc-type = 'E'.
*        it_payout-status = '99'.
*        it_payout-message = it_pend-message.
*      endif.
*      modify it_payout.
*    endloop.
*    modify zxomopayoutlog from table it_payout.
    ENDON.
  endloop.
endform.

form process_return_data.
  data: w_chect like payr-chect,
        w_xbanc like payr-xbanc.
  if w_error = ''.
    move response_wa-response to return_itab.
    sort json_itab by payout_sequence_id.
    temp_json_itab = json_itab.
    loop at return_itab into return_wa.
      select single payout_sequence_id
       into temp
       from zxomopayouthdr
     where payout_sequence_id = return_wa-payout_sequence_id
       and datastatus = 'RETURN'
       and status = '02'.
      if sy-subrc eq 0. " Already Processed
        it_skip-zuonr = temp.
        append it_skip.
        continue.   " Skip
      endif.
      move-corresponding return_wa to it_return.
      if return_wa-cheque_status = '作廢'.
        it_return-cheque_status = '99'.
      else.
        it_return-cheque_status = '98'.
      endif.
      w_chect = it_return-cheque_number.
      shift w_chect left deleting leading '0'.
      select single chect xbanc from payr
        into ( w_chect, w_xbanc )
        where zbukr = p_bukrs
          and chect = w_chect.
      if sy-subrc ne 0. " Record not found
        it_return-type = 'E'.
        concatenate 'No check information found: '
                    it_return-cheque_number
        into it_return-message.
      elseif w_xbanc = 'X'.
        it_return-type = 'E'.
        concatenate 'Cashed Check cannot be processed: '
                    it_return-cheque_number
        into it_return-message.
      endif.
      append it_return.
    endloop.
  endif.
endform.

form process_return_doc.
  data: hbkid type t012k-hbkid,
        hktid type t012k-hktid.
  data: w_chect like payr-chect.
  data: w_date(10).
  loop at it_return where type <> 'E'.
    w_chect = it_return-cheque_number.
    shift w_chect left deleting leading '0'.
    select single hbkid hktid
     into ( hbkid, hktid ) from payr
    where zbukr = p_bukrs
      and chect = w_chect.
    concatenate it_return-cheque_cancellation_date+6(2) '.'
                it_return-cheque_cancellation_date+4(2) '.'
                it_return-cheque_cancellation_date(4)
    into w_date.
    refresh it_bdcdata.
    perform bdc_dynpro      using: 'SAPMFCHK' '0800'.
    perform bdc_field       using: 'BDC_OKCODE' '=RAGL',
                                   'PAYR-HBKID' hbkid,
                                   'PAYR-HKTID' hktid,
                                   'PAYR-CHECT' it_return-cheque_number,
                                   'PAYR-VOIDR' it_return-cheque_status,
                                   'UF05A-STGRD' 'CQ',
                                   'RF05R-BUDAT' w_date.
    call transaction 'FCH8' using it_bdcdata
                     mode 'N' update 'S'
                     messages into messtab.
    loop at messtab where msgtyp = 'E'.
      w_error = 'X'.
      message id messtab-msgid
              type messtab-msgtyp
              number messtab-msgnr
              with messtab-msgv1 messtab-msgv2 messtab-msgv3 messtab-msgv4
              into it_return-message.
      it_return-type = messtab-msgtyp.
      modify it_return.
    endloop.
    "Result itab?
  endloop.

  "LOG
  loop at it_return."result tab and record tab is create in same time. tabix<->record will be match.
    loop at it_payhdr where payout_sequence_id = it_return-payout_sequence_id.
      if it_return-type = ''.
        it_payhdr-status = '02'.
      elseif it_return-type = 'E'.
        it_payhdr-status = '99'.
        it_payhdr-message = it_pend-message.
      endif.
      modify it_payhdr.
    endloop.
    modify zxomopayouthdr from table it_payhdr.
  endloop.
endform.


form bdc_dynpro using program dynpro.
  clear it_bdcdata.
  it_bdcdata-program  = program.
  it_bdcdata-dynpro   = dynpro.
  it_bdcdata-dynbegin = 'X'.
  append it_bdcdata.
endform.                    "

form bdc_field using fnam fval.
  clear it_bdcdata.
  it_bdcdata-fnam = fnam.
  it_bdcdata-fval = fval.
  append it_bdcdata.
endform.                    "BDC_FIELD


form conversion_exit changing k_varbl.
  call function 'CONVERSION_EXIT_ALPHA_INPUT'
    exporting
      input  = k_varbl
    importing
      output = k_varbl.
endform.                    "CONVERSION_EXITs

form f4_filename.

  data: l_desktop   type string,
        l_i_files   type filetable,
        l_wa_files  type file_table,
        l_rcode     type int4,
        l_file_type type string.

  l_file_type = 'TXT|*.txt'.

  call method cl_gui_frontend_services=>file_open_dialog
    exporting
      window_title            = 'Select file'
      default_extension       = l_file_type
      file_filter             = l_file_type
    changing
      file_table              = l_i_files
      rc                      = l_rcode
    exceptions
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      others                  = 5.
  if sy-subrc <> 0.
    message e000(00) with 'Error while opening file'.
  endif.

  check l_i_files is not initial.

  read table l_i_files index 1 into l_wa_files.
  if sy-subrc = 0.
    p_file = l_wa_files-filename.
  else.
    message e000(00) with 'Error while opening file'.
  endif.
endform.

form display_doc.

  data: w_text(10).
  data: w_skip    type i, w_success type i, w_error type i.

  clear: w_skip, w_success, w_error.
  describe table it_skip lines w_skip.
  describe table it_skip lines w_skip.
  loop at it_result.
    if it_result-type = 'E'.
      w_error = w_error + 1.
    else.
      w_success = w_success + 1.
    endif.
  endloop.
  loop at it_canc.
    if it_canc-type = 'E'.
      w_error = w_error + 1.
    else.
      w_success = w_success + 1.
    endif.
  endloop.
  loop at it_return.
    if it_return-type = 'E'.
      w_error = w_error + 1.
    else.
      w_success = w_success + 1.
    endif.
  endloop.
  write: / 'Record count: ',
        /5 'Skipped: ', w_skip,
        /5 'Posted:  ', w_success,
        /5 'Error    ', w_error.
  uline.
  loop at it_skip.
    write: / 'Skipped' under text-003,
              it_skip-zuonr under text-004.
  endloop.

  if ( p_pend = 'X' and p_chk1 = 'X' ) or
     ( p_pend1 = 'X' and p_chk2 = 'X' ).

    loop at it_result.
      at first.
        write: / 'Status: ', w_status.
      endat.
      write: /  it_result-type under text-003,
                it_result-zuonr under text-004,
                40 it_result-budat,
                it_result-doc_no under text-005,
                it_result-message under text-006.
    endloop.

  elseif ( p_na = 'X' and p_chk1 = 'X' ) or
         ( p_na1 = 'X' and p_chk2 = 'X' ).

    loop at it_canc.
      at first.
        write: / 'Status: ', w_status.
      endat.
      write: / it_canc-type under text-003,
              it_canc-zuonr under text-004,
              40 it_canc-budat,
              it_canc-doc_no under text-005,
              it_canc-message under text-006.
    endloop.


  elseif ( p_return = 'X' and p_chk1 = 'X' ) or
         ( p_ret1 = 'X' and p_chk2 = 'X' ).

    loop at it_return.
      at first.
        write: / 'Status: ', w_status.
      endat.
      write: / it_return-type under text-003,
              it_return-payout_sequence_id under text-004,
              it_return-cheque_number under text-005,
              40 it_return-cheque_cancellation_date,
              it_return-message under text-006.
    endloop.

  endif.

endform.


FORM display_alv_list.
  gd_repid = sy-repid.
  PERFORM build_fieldcatalog.
  PERFORM build_layout.
  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      i_callback_program      = gd_repid
      i_callback_user_command = 'USER_COMMAND'
      i_callback_pf_status_set = 'SET_PF_STATUS'   "see FORM
      is_layout               = gd_layout
      it_fieldcat             = fieldcatalog[]
      i_save                  = 'X'
    TABLES
      t_outtab                = it_payhdr2
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    " DISPLAY_ALV_REPORT
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZGUI_STATUS'.
                  "Copy of 'STANDARD' pf_status from fgroup SALV
ENDFORM.

FORM build_fieldcatalog.
  fieldcatalog-fieldname   = 'PAYOUT_SEQUENCE_ID'.
  fieldcatalog-seltext_m   = 'Payout Sequence ID'.
  fieldcatalog-col_pos     = 0.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
*  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'PAYOUT_DATE'.
  fieldcatalog-seltext_m   = 'Payout Date'.
  fieldcatalog-col_pos     = 1.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'UPDATEDATE'.
  fieldcatalog-seltext_m   = 'Update Date'.
  fieldcatalog-col_pos     = 5.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'UPDATETIME'.
  fieldcatalog-seltext_m   = 'Update Time'.
  fieldcatalog-col_pos     = 6.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.
ENDFORM.                    " BUILD_FIELDCATALOG

FORM build_layout.
  gd_layout-box_fieldname     = 'SEL'.
  "set field name to store row selection
  gd_layout-edit              = 'X'. "makes whole ALV table editable
  gd_layout-zebra             = 'X'.
ENDFORM.                    " BUILD_LAYOUT

FORM user_command USING r_ucomm LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.

* Check function code
  CASE r_ucomm.
    WHEN 'EXEC'.  "user presses SAVE
      LOOP AT it_payhdr2.
        IF it_payhdr2-sel NE 'X'.
*            DELETE it_payhdr.
          MOVE-CORRESPONDING it_payhdr2 TO it_payhdr.
          APPEND it_payhdr.
*       Process records that have been selected
        ENDIF.
      ENDLOOP.
      "rs_selfield-refresh = 'X'.
      rs_selfield-exit = 'X'.
      SET PF-STATUS space.
      LEAVE SCREEN.
*      SUPPRESS DIALOG.
*      LEAVE TO LIST-PROCESSING.

  ENDCASE.
ENDFORM.                    "user_command


top-of-page.
  write: /1  'Status'(003),
          15 'Payment Seq'(004),
          40 'Date'(008),
          55 'Doc No'(005),
          70 'Message'(006).
  uline.

bottom of page