ZFIT_UPL_CJ_LOG
https://docs.google.com/spreadsheets/d/1lhd5EwwuNh3L_OkXRRH-AmphiIjkcmmle1rsmLg7Fek/edit?usp=sharing

REPORT zfi_upload_cj MESSAGE-ID zfi.
* -------------------------------------------------------------------- *
* G L O B A L V A R I A B L E
* -------------------------------------------------------------------- *
TABLES: zfit_upl_cj_log.
TYPES:
gty_data TYPE zfist0004,
gtt_data TYPE TABLE OF zfist0004,
gty_xlsx TYPE zfist0005,
gtt_xlsx TYPE TABLE OF zfist0005.
" [START] JDS 08.03.2023 : balance validation
TYPES:
BEGIN OF gty_balance,
cajo_number TYPE tcj_balance-cajo_number,
time_stamp TYPE tcj_balance-time_stamp,
closing_sum TYPE tcj_balance-closing_sum,
currency TYPE tcj_balance-currency,
END OF gty_balance,
gtt_balance TYPE TABLE OF gty_balance.
" [END] JDS 08.03.2023 : balance validation
TYPES:
BEGIN OF gty_trans,
comp_code TYPE tcj_transactions-comp_code,
transact_number TYPE tcj_transactions-transact_number,
transact_type TYPE tcj_transactions-transact_type,
gl_account TYPE tcj_transactions-gl_account,
transact_name TYPE tcj_trans_names-transact_name,
END OF gty_trans,
gtt_trans TYPE TABLE OF gty_trans.
TYPES:
BEGIN OF gty_cardnum,
comp_code TYPE zfit_upl_cj_map-comp_code,
cajo_number TYPE zfit_upl_cj_map-cajo_number,
cardnum TYPE zfit_upl_cj_map-cardnum,
END OF gty_cardnum,
gtt_cardnum TYPE TABLE OF gty_cardnum.
" [START] JDS 31.07.2023 : add validation
TYPES: BEGIN OF gty_fmci,
bukrs TYPE t001-bukrs,
fipex TYPE fmci-fipex,
END OF gty_fmci,
gtt_fmci TYPE TABLE OF gty_fmci.
TYPES: BEGIN OF gty_skb1,
bukrs TYPE skb1-bukrs,
saknr TYPE skb1-saknr,
END OF gty_skb1,
gtt_skb1 TYPE TABLE OF gty_skb1.
" [END] JDS 31.07.2023 : add validation
DATA:
gt_fmci TYPE gtt_fmci, " JDS 31.07.2023 : add cmmt_item validation
gt_skb1 TYPE gtt_skb1, " JDS 31.07.2023 : add gl validation
gt_trans TYPE gtt_trans,
gt_cardnum TYPE gtt_cardnum,
gt_data TYPE gtt_data,
go_alv_table TYPE REF TO cl_salv_table,
gt_log TYPE TABLE OF zfit_upl_cj_log. " repost
CONSTANTS:
gc_icon_error TYPE icon_d VALUE icon_red_light,
gc_icon_success TYPE icon_d VALUE icon_green_light.
* -------------------------------------------------------------------- *
* S E L E C T I O N S C R E E N
* -------------------------------------------------------------------- *
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
PARAMETERS : rb_upl RADIOBUTTON GROUP rad1 DEFAULT 'X' USER-COMMAND uc1,
rb_bgj RADIOBUTTON GROUP rad1,
rb_repos RADIOBUTTON GROUP rad1, " repost
rb_log RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file TYPE string LOWER CASE MODIF ID upl. "OBLIGATORY.
SELECT-OPTIONS: so_bukrs FOR zfit_upl_cj_log-comp_code MODIF ID log,
so_cajon FOR zfit_upl_cj_log-cajo_number MODIF ID log,
so_ttype FOR zfit_upl_cj_log-transact_type MODIF ID log,
so_hkont FOR zfit_upl_cj_log-gl_account MODIF ID log,
so_budat FOR zfit_upl_cj_log-pstng_date MODIF ID log,
so_statu FOR zfit_upl_cj_log-status MODIF ID log,
so_erdat FOR zfit_upl_cj_log-erdat MODIF ID log,
so_erzet FOR zfit_upl_cj_log-erzet MODIF ID log,
so_ernam FOR zfit_upl_cj_log-ernam MODIF ID log.
SELECTION-SCREEN END OF BLOCK b2.
AT SELECTION-SCREEN OUTPUT.
PERFORM f_sel_out.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
"Popup file open
PERFORM f_f4_file CHANGING p_file.
* -------------------------------------------------------------------- *
* C L A S S
* -------------------------------------------------------------------- *
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS :
on_user_command FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function,
on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING column row.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
*
METHOD on_user_command.
PERFORM f_handle_user_command USING e_salv_function.
ENDMETHOD. " on_user_command
*
METHOD on_link_click.
PERFORM f_handle_hotspot USING column row.
ENDMETHOD. " on_link_click
*
ENDCLASS. "lcl_event_handler IMPLEMENTATION
* -------------------------------------------------------------------- *
* S T A R T O F S E L E C T I O N
* -------------------------------------------------------------------- *
START-OF-SELECTION.
PERFORM f_validation_upload.
CASE 'X'.
WHEN rb_bgj.
PERFORM f_get_file_from_sap_server USING p_file
CHANGING gt_data.
PERFORM f_get_master_data.
PERFORM f_build_data.
* PERFORM f_balance_validation. " JDS 08.03.2023 : add balance validation
PERFORM f_process_cjdoc.
WHEN rb_upl.
PERFORM f_get_upload_data_xlsx USING p_file
CHANGING gt_data.
PERFORM f_get_master_data.
PERFORM f_build_data.
* PERFORM f_balance_validation. " JDS 08.03.2023 : add balance validation
WHEN rb_repos. " repost
* PERFORM f_get_repost_data CHANGING gt_data.
PERFORM f_get_log_data CHANGING gt_data.
PERFORM f_get_master_data.
PERFORM f_build_data.
WHEN rb_log.
PERFORM f_get_log_data CHANGING gt_data.
ENDCASE.
* -------------------------------------------------------------------- *
* E N D O F S E L E C T I O N
* -------------------------------------------------------------------- *
END-OF-SELECTION.
IF sy-batch NE 'X'.
PERFORM f_display_alv.
ENDIF.
* -------------------------------------------------------------------- *
* S U B R O U T I N E S
* -------------------------------------------------------------------- *
*&---------------------------------------------------------------------*
*& Form f_get_log_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GT_DATA
*&---------------------------------------------------------------------*
FORM f_get_log_data CHANGING pct_data TYPE gtt_data.
SELECT *
FROM zfit_upl_cj_log
INTO TABLE gt_log
WHERE comp_code IN so_bukrs
AND cajo_number IN so_cajon
AND transact_type IN so_ttype
AND gl_account IN so_hkont
AND pstng_date IN so_budat
AND status IN so_statu
AND erdat IN so_erdat
AND erzet IN so_erzet
AND ernam IN so_ernam.
IF sy-subrc EQ 0.
LOOP AT gt_log INTO DATA(ls_log).
APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
MOVE-CORRESPONDING ls_log TO <lfs_data>.
CASE ls_log-status.
WHEN 'S'.
<lfs_data>-icon = gc_icon_success.
WHEN 'E'.
<lfs_data>-icon = gc_icon_error.
ENDCASE.
ENDLOOP.
ELSE.
" No data exists
MESSAGE ID '/ACCGO/CAS_FLLW_MSG' TYPE 'S' NUMBER 338 DISPLAY LIKE 'E'.
ENDIF.
SORT pct_data BY cajo_number pstng_date seq subseq. " JDS 09.03.2023 : repost
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_display_alv .
CHECK gt_data IS NOT INITIAL.
IF rb_repos NE 'X' AND rb_log NE 'X'. " JDS 09.03.2023 : repost
SORT gt_data BY sort_no.
ENDIF.
TRY .
cl_salv_table=>factory(
IMPORTING
r_salv_table = go_alv_table
CHANGING
t_table = gt_data ).
PERFORM f_set_status.
PERFORM f_set_columns.
PERFORM f_set_events.
go_alv_table->display( ).
CATCH cx_salv_msg.
ENDTRY.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_set_status
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_set_status .
DATA: lv_pfstatus TYPE sypfkey.
IF rb_repos NE 'X'. " JDS 09.03.2023 : repost
lv_pfstatus = 'STANDARD'.
LOOP AT gt_data INTO DATA(ls_data) WHERE icon IS NOT INITIAL.
lv_pfstatus = 'STANDARD2'.
EXIT.
ENDLOOP.
ELSE.
lv_pfstatus = 'STANDARD_REPOS'.
ENDIF.
go_alv_table->set_screen_status(
EXPORTING
pfstatus = lv_pfstatus
report = sy-repid
set_functions = go_alv_table->c_functions_all ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_set_columns
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_set_columns .
DATA:
lo_columns TYPE REF TO cl_salv_columns_table,
lo_column TYPE REF TO cl_salv_column_table.
DEFINE _set_text.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_short_text( '' ).
lo_column->set_medium_text( '' ).
lo_column->set_long_text( &2 ).
CATCH cx_salv_not_found.
ENDTRY.
END-OF-DEFINITION.
DEFINE _set_hide.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_visible( value = if_salv_c_bool_sap=>false ).
CATCH cx_salv_not_found.
ENDTRY.
END-OF-DEFINITION.
DEFINE _set_technical.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_technical( ).
CATCH cx_salv_not_found.
ENDTRY.
END-OF-DEFINITION.
DEFINE _set_icon.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_icon( ).
CATCH cx_salv_not_found.
ENDTRY.
END-OF-DEFINITION.
DEFINE _set_checkbox.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_cell_type( value = if_salv_c_cell_type=>checkbox_hotspot ).
CATCH cx_salv_not_found.
ENDTRY.
END-OF-DEFINITION.
DEFINE _set_hotspot.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_cell_type(
value = if_salv_c_cell_type=>hotspot
).
CATCH cx_salv_not_found.
ENDTRY.
END-OF-DEFINITION.
DEFINE _set_curr_col.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_currency_column( value = &2 ).
CATCH cx_salv_not_found.
CATCH cx_salv_data_error.
ENDTRY.
END-OF-DEFINITION.
DEFINE _set_key.
TRY.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_key( ).
CATCH cx_salv_not_found.
CATCH cx_salv_data_error.
ENDTRY.
END-OF-DEFINITION.
lo_columns = go_alv_table->get_columns( ).
lo_columns->set_optimize( abap_true ).
lo_columns->set_key_fixation( ).
_set_icon 'ICON'.
_set_text 'ICON' 'Icon' ##NO_TEXT.
_set_text 'ALLOC_NMBR' 'Card Number' ##NO_TEXT.
_set_technical 'SORT_NO'.
_set_hotspot 'BELNR'.
_set_curr_col 'P_PAYMENTS' 'CURRENCY'.
IF rb_repos NE 'X'. " JDS 09.03.2023 : repost
_set_technical 'CHECKBOX'.
ELSE.
_set_checkbox 'CHECKBOX'.
_set_key 'CHECKBOX'.
_set_key 'ICON'.
_set_key 'COMP_CODE'.
_set_key 'CAJO_NUMBER'.
_set_technical 'SEQ'.
_set_technical 'SUBSEQ'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_set_events
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_set_events .
DATA:
lo_events TYPE REF TO cl_salv_events_table,
lo_event_handler TYPE REF TO lcl_event_handler.
* Get the event object
lo_events = go_alv_table->get_event( ).
* Event handler
CREATE OBJECT lo_event_handler.
SET HANDLER lo_event_handler->on_user_command FOR lo_events.
SET HANDLER lo_event_handler->on_link_click FOR lo_events.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_validation_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_validation_upload .
DATA: lv_ext TYPE c LENGTH 10,
lv_filename TYPE c LENGTH 255.
CASE 'X'.
WHEN rb_bgj OR rb_upl.
IF p_file IS INITIAL.
MESSAGE 'Please choose file to upload' TYPE 'S' DISPLAY LIKE 'E' ##NO_TEXT.
LEAVE LIST-PROCESSING.
ENDIF.
lv_filename = p_file.
CALL FUNCTION 'TRINT_FILE_GET_EXTENSION'
EXPORTING
filename = lv_filename
IMPORTING
extension = lv_ext.
IF lv_ext NE 'XLSX'.
MESSAGE 'Only XLSX file allowed' TYPE 'S' DISPLAY LIKE 'E' ##NO_TEXT.
LEAVE LIST-PROCESSING.
ENDIF.
WHEN rb_log.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- P_FILE
*&---------------------------------------------------------------------*
FORM f_f4_file CHANGING pc_flupld TYPE string.
DATA: lt_filetable TYPE filetable,
ls_filetable TYPE file_table,
lv_subrc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
file_filter = 'Excel Files (*.XLSX)|*.XLSX|' ##NO_TEXT " cl_gui_frontend_services=>filetype_excel "
CHANGING
file_table = lt_filetable
rc = lv_subrc
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 ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
READ TABLE lt_filetable INTO ls_filetable INDEX 1.
pc_flupld = ls_filetable-filename.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_get_file_from_sap_server
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_FILE
*& <-- GT_DATA
*&---------------------------------------------------------------------*
FORM f_get_file_from_sap_server USING p_file
CHANGING pct_data TYPE gtt_data.
DATA:
lv_xstring TYPE xstring.
"1. Read excel from SAP Path Server (AL11)
OPEN DATASET p_file FOR INPUT IN BINARY MODE.
IF sy-subrc EQ 0.
"2. Convert to XSTRING
READ DATASET p_file INTO lv_xstring.
IF sy-subrc NE 0.
RETURN.
ENDIF.
ENDIF.
CLOSE DATASET p_file.
PERFORM f_xstring2data USING lv_xstring CHANGING pct_data.
PERFORM f_validation_data CHANGING pct_data.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_get_upload_data_xlsx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_FILE
*& <-- GT_OA
*&---------------------------------------------------------------------*
FORM f_get_upload_data_xlsx USING p_file TYPE string
CHANGING pct_data TYPE gtt_data.
PERFORM f_ac_xl_to_sap USING p_file
CHANGING pct_data.
IF pct_data IS INITIAL.
"No data to upload
MESSAGE s611(cpe_ipc) DISPLAY LIKE fiehc_con_msgty_e.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_ac_xl_to_sap
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_FILE
*& <-- PCT_OA
*&---------------------------------------------------------------------*
FORM f_ac_xl_to_sap USING p_file TYPE string
CHANGING pct_data TYPE gtt_data.
DATA:
lv_filelength TYPE i,
lv_headerxstring TYPE xstring,
lt_records TYPE solix_tab.
PERFORM f_xlsx2itab USING p_file CHANGING lv_filelength lv_headerxstring lt_records.
PERFORM f_itab2xstring USING lv_filelength lt_records CHANGING lv_headerxstring .
PERFORM f_xstring2data USING lv_headerxstring CHANGING pct_data.
PERFORM f_validation_data CHANGING pct_data.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_xlsx2itab
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_FILE
*& <-- LV_FILELENGTH
*& <-- LV_HEADERXSTRING
*& <-- LT_RECORDS
*&---------------------------------------------------------------------*
FORM f_xlsx2itab USING p_file TYPE string
CHANGING pc_filelength TYPE i
pc_headerxstring TYPE xstring
pct_records TYPE solix_tab.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = p_file
filetype = 'BIN'
IMPORTING
filelength = pc_filelength
header = pc_headerxstring
TABLES
data_tab = pct_records
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
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_itab2xstring
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_FILELENGTH
*& <-- LV_HEADERXSTRING
*& <-- LT_RECORDS
*&---------------------------------------------------------------------*
FORM f_itab2xstring USING p_filelength TYPE i
pt_records TYPE solix_tab
CHANGING pc_headerxstring TYPE xstring.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = p_filelength
IMPORTING
buffer = pc_headerxstring
TABLES
binary_tab = pt_records
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_xstring2data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- PCT_DATA
*&---------------------------------------------------------------------*
FORM f_xstring2data USING p_headerxstring TYPE xstring
* CHANGING pct_data_p TYPE gtt_data
* pct_data_r TYPE gtt_data.
CHANGING pct_data TYPE gtt_data.
DATA:
lv_filename_str TYPE string,
lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet,
lt_worksheets TYPE STANDARD TABLE OF string,
lv_err_msg TYPE string,
lv_idx TYPE sy-index,
lo_exc TYPE REF TO cx_fdt_excel_core,
lo_data_raw TYPE REF TO data,
ls_data TYPE gty_data,
ls_xlsx TYPE gty_xlsx,
lv_sort TYPE i,
lv_char10 TYPE char10,
ls_item TYPE zfist0006,
lv_worksheet_i TYPE i. " JDS 08.03.2023 : GL multi purpose (pay/rec)
FIELD-SYMBOLS:
<lft_data_raw> TYPE STANDARD TABLE.
TRY .
CREATE OBJECT lo_excel_ref
EXPORTING
document_name = lv_filename_str
xdocument = p_headerxstring.
IF lo_excel_ref IS NOT INITIAL.
lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
IMPORTING
worksheet_names = lt_worksheets
).
ENDIF.
DATA:
lr_descr TYPE REF TO cl_abap_structdescr,
ls_comp TYPE abap_compdescr.
DATA: lv_lines TYPE i.
lr_descr ?= cl_abap_typedescr=>describe_by_data( ls_xlsx ).
DESCRIBE TABLE lr_descr->components LINES lv_lines.
IF lt_worksheets IS NOT INITIAL.
LOOP AT lt_worksheets INTO DATA(lv_worksheet).
" [START] JDS 08.03.2023 : GL multi purpose (pay/rec)
lv_worksheet_i = sy-tabix.
IF lv_worksheet_i > 2.
EXIT.
ENDIF.
" [END] JDS 08.03.2023 : GL multi purpose (pay/rec)
lv_idx = 2. " first data row
lo_data_raw = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet( lv_worksheet ).
ASSIGN lo_data_raw->* TO <lft_data_raw>.
IF sy-subrc EQ 0.
LOOP AT <lft_data_raw> ASSIGNING FIELD-SYMBOL(<lfs_data_raw>) FROM lv_idx.
lv_sort = lv_sort + 1.
APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
CLEAR: ls_xlsx.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <lfs_data_raw> TO FIELD-SYMBOL(<lfs_raw>).
IF sy-subrc NE 0 OR sy-index > lv_lines.
EXIT.
ELSE.
ASSIGN COMPONENT sy-index OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(<lfs_dest>).
CASE sy-index.
WHEN 9 OR 10 OR 11. " ALPHA = IN CHAR10 (HKONT, KOSTL, PRCTR)
lv_char10 = |{ <lfs_raw> ALPHA = IN }|.
<lfs_dest> = lv_char10.
WHEN 3 OR 4. " date
PERFORM f_convert_date USING <lfs_raw> CHANGING <lfs_dest>.
WHEN 8. " Currency
ASSIGN COMPONENT 5 OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(<lfs_waers>).
PERFORM f_convert_curr_in USING <lfs_raw> <lfs_waers> CHANGING <lfs_dest>.
* PERFORM f_convert_curr_in USING <lfs_raw> 'IDR' CHANGING <lfs_dest>.
WHEN 12. " commitment item / fipos
PERFORM f_convert_fipos_in USING <lfs_raw> CHANGING <lfs_dest>.
WHEN OTHERS.
<lfs_dest> = <lfs_raw>.
ENDCASE.
ENDIF.
ENDDO.
MOVE-CORRESPONDING ls_xlsx TO ls_item.
IF ls_xlsx-comp_code IS INITIAL.
<lfs_data> = ls_data.
MOVE-CORRESPONDING ls_item TO <lfs_data>.
ELSE.
MOVE-CORRESPONDING ls_xlsx TO <lfs_data>.
ls_data = <lfs_data>.
ENDIF.
<lfs_data>-sort_no = lv_sort.
" [START] JDS 08.03.2023 : GL multi purpose (pay/rec)
CASE lv_worksheet_i.
WHEN 1.
<lfs_data>-transact_type = 'C'. " receipt
WHEN 2.
<lfs_data>-transact_type = 'E'. " payment
ENDCASE.
" [END] JDS 08.03.2023 : GL multi purpose (pay/rec)
ENDLOOP.
ENDIF.
ENDLOOP.
ENDIF.
CATCH cx_fdt_excel_core INTO lo_exc.
lv_err_msg = lo_exc->get_text( ).
MESSAGE lv_err_msg TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDTRY.
* SORT pct_data BY int_no ebelp tier_from.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_convert_curr_in
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> <LFS_RAW>
*& --> <LFS_WAERS>
*& <-- <LFS_DEST>
*&---------------------------------------------------------------------*
FORM f_convert_curr_in USING p_in
p_waers
CHANGING pc_out.
IF p_waers EQ 'IDR'.
pc_out = p_in / 100.
ELSE.
pc_out = p_in.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_convert_date
*&---------------------------------------------------------------------*
*& external to internal date
*&---------------------------------------------------------------------*
*& --> <LFS_VALUE>
*& <-- YYYYMMDD
*&---------------------------------------------------------------------*
FORM f_convert_date USING p_date_string TYPE string CHANGING pc_date TYPE datum .
DATA: lv_convert_date(10) TYPE c.
CHECK p_date_string IS NOT INITIAL.
lv_convert_date = p_date_string .
"date format YYYY/MM/DD
FIND REGEX '^\d{4}[/|-]\d{1,2}[/|-]\d{1,2}$' IN lv_convert_date.
IF sy-subrc = 0.
CALL FUNCTION '/SAPDMC/LSM_DATE_CONVERT'
EXPORTING
date_in = lv_convert_date
date_format_in = 'DYMD'
to_output_format = ' '
to_internal_format = 'X'
IMPORTING
date_out = lv_convert_date
EXCEPTIONS
illegal_date = 1
illegal_date_format = 2
no_user_date_format = 3
OTHERS = 4.
ELSE.
" date format DD/MM/YYYY or DD-MM-YYYY or DD.MM.YYYY
FIND REGEX '^\d{1,2}[/|-|.]\d{1,2}[/|-|.]\d{4}$' IN lv_convert_date.
IF sy-subrc = 0.
CALL FUNCTION '/SAPDMC/LSM_DATE_CONVERT'
EXPORTING
date_in = lv_convert_date
date_format_in = 'DDMY'
to_output_format = ' '
to_internal_format = 'X'
IMPORTING
date_out = lv_convert_date
EXCEPTIONS
illegal_date = 1
illegal_date_format = 2
no_user_date_format = 3
OTHERS = 4.
ENDIF.
ENDIF.
IF sy-subrc = 0.
pc_date = lv_convert_date .
ELSE.
CLEAR pc_date.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_validation_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GT_DATA
*&---------------------------------------------------------------------*
FORM f_validation_data CHANGING pct_data TYPE gtt_data.
* DATA:
* lv_ematn TYPE gty_data-ematn,
* lv_intno TYPE gty_data-int_no,
* lt_log TYPE gtt_log,
* lv_icon TYPE icon_d,
* lv_remarks TYPE gty_data-remarks.
* PERFORM f_get_log USING pct_data CHANGING lt_log .
* SORT lt_log BY int_no.
* LOOP AT pct_data INTO DATA(ls_grp_h) WHERE icon IS INITIAL GROUP BY ls_grp_h-int_no.
* READ TABLE lt_log INTO DATA(ls_log) WITH KEY int_no = ls_grp_h-int_no BINARY SEARCH.
* IF sy-subrc NE 0.
* CLEAR: ls_log.
* ENDIF.
* LOOP AT GROUP ls_grp_h INTO DATA(ls_grp_i) GROUP BY ls_grp_i-ebelp.
* LOOP AT GROUP ls_grp_i ASSIGNING FIELD-SYMBOL(<lfs_data>).
* ENDLOOP.
* ENDLOOP.
*
* ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_sel_out
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_sel_out . DATA: lv_upl TYPE char1,
lv_log TYPE char1.
CASE 'X'.
WHEN rb_log OR rb_repos.
lv_upl = 0.
lv_log = 1.
WHEN rb_upl OR rb_bgj.
lv_upl = 1.
lv_log = 0.
WHEN OTHERS.
ENDCASE.
LOOP AT SCREEN.
CASE screen-name.
WHEN 'P_FILE'.
screen-required = 2.
MODIFY SCREEN.
ENDCASE.
CASE screen-group1.
WHEN 'UPL'.
screen-active = lv_upl.
MODIFY SCREEN.
WHEN 'LOG'.
screen-active = lv_log.
MODIFY SCREEN.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_handle_user_command
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_SALV_FUNCTION
*&---------------------------------------------------------------------*
FORM f_handle_user_command USING p_ucomm TYPE salv_de_function.
DATA: lv_answer TYPE char4,
lv_subrc LIKE sy-subrc.
CASE p_ucomm.
WHEN '&POST'. " Posting
IF rb_repos EQ 'X'. " repost
PERFORM f_validation_repos CHANGING lv_subrc.
IF lv_subrc IS INITIAL.
PERFORM f_process_cjdoc_repost.
PERFORM f_refresh_table USING go_alv_table.
ENDIF.
ELSE.
PERFORM f_validation_post CHANGING lv_subrc.
IF lv_subrc IS INITIAL.
PERFORM f_process_cjdoc.
PERFORM f_grey_button.
PERFORM f_refresh_table USING go_alv_table.
ENDIF.
ENDIF.
WHEN '&ZALL'. " select all
PERFORM f_select_all USING 'X'.
PERFORM f_refresh_table USING go_alv_table.
WHEN '&ZSAL'. " deselect all
PERFORM f_select_all USING ''.
PERFORM f_refresh_table USING go_alv_table.
WHEN '&DEL'. " deselect all
PERFORM f_validation_delete CHANGING lv_subrc.
IF lv_subrc IS INITIAL.
PERFORM f_popup_confirm CHANGING lv_answer.
IF lv_answer EQ '1'.
PERFORM f_delete_data.
PERFORM f_refresh_table USING go_alv_table.
ENDIF.
ENDIF.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_refresh_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GO_ALV_TABLE
*&---------------------------------------------------------------------*
FORM f_refresh_table USING po_alv_table TYPE REF TO cl_salv_table.
DATA:
lo_columns TYPE REF TO cl_salv_columns_table,
ls_stable TYPE lvc_s_stbl.
ls_stable-col = 'X'.
ls_stable-row = 'X'.
lo_columns = po_alv_table->get_columns( ).
lo_columns->set_optimize( abap_true ).
po_alv_table->refresh(
EXPORTING
s_stable = ls_stable
* refresh_mode = if_salv_c_refresh=>soft
).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_handle_hotspot
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> COLUMN
*& --> ROW
*&---------------------------------------------------------------------*
FORM f_handle_hotspot USING p_column TYPE salv_de_column
p_row TYPE salv_de_row.
CASE p_column.
WHEN 'BELNR'.
PERFORM f_click_belnr USING p_row.
WHEN 'CHECKBOX'.
PERFORM f_click_checkbox USING p_row.
PERFORM f_refresh_table USING go_alv_table.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_click_belnr
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> RS_SELFIELD_TABINDEX
*&---------------------------------------------------------------------*
FORM f_click_belnr USING p_index.
READ TABLE gt_data INTO DATA(ls_data) INDEX p_index.
IF sy-subrc EQ 0.
CHECK ls_data-belnr IS NOT INITIAL.
IF ls_data-belnr CO '0123456789'.
PERFORM f_call_fb03 USING ls_data-comp_code ls_data-belnr ls_data-pstng_date(4).
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_call_fb03
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_DATA_BUKRS
*& --> LS_DATA_BELNR
*& --> LS_DATA_BUDAT(4)
*&---------------------------------------------------------------------*
FORM f_call_fb03 USING p_bukrs
p_belnr
p_gjahr.
SET PARAMETER ID 'BLN' FIELD p_belnr.
SET PARAMETER ID 'BUK' FIELD p_bukrs.
SET PARAMETER ID 'GJR' FIELD p_gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_post_cjdoc
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_post_cjdoc USING p_cjdocno TYPE bapi_cj_key-posting_number
CHANGING pcs_data TYPE gty_data.
*FORM f_post_cjdoc USING ps_ujs TYPE zsdt0018
* ps_map TYPE gty_map
* p_cjdocno TYPE bapi_cj_key-posting_number
* p_total TYPE wrbtr
* CHANGING pcs_result TYPE gty_result.
DATA: lt_itcj TYPE TABLE OF iscj_postings WITH HEADER LINE,
lt_itcjcpd TYPE TABLE OF tcj_cpd WITH HEADER LINE,
lt_itcjtax TYPE TABLE OF tcj_wtax_items WITH HEADER LINE,
lt_itcjpos TYPE TABLE OF iscj_postings WITH HEADER LINE,
lv_cajo_num TYPE tcj_c_journals-cajo_number,
lv_begbal TYPE cjamount,
lv_totrep TYPE cjamount,
lv_totpay TYPE cjamount,
lv_totcek TYPE cjamount,
lv_runbal TYPE cjamount,
lv_casbal TYPE cjamount,
lv_num_rec TYPE i,
lv_num_pay TYPE i,
lv_num_cek TYPE i,
lv_error_number TYPE cjbelnr,
lv_budat TYPE budat,
lv_typ TYPE cjtranstyp.
DATA: lv_awkey TYPE bkpf-awkey.
lt_itcj-cajo_number = pcs_data-cajo_number.
lt_itcj-comp_code = pcs_data-comp_code.
lt_itcj-fisc_year = pcs_data-pstng_date(4).
lt_itcj-posting_number = p_cjdocno.
lt_itcj-h_net_amount = pcs_data-p_payments.
lt_itcj-h_net_payment_wt = pcs_data-p_payments.
lt_itcj-h_total_amount = pcs_data-p_payments.
lt_itcj-document_date = pcs_data-doc_date.
lt_itcj-document_number = pcs_data-ref_doc_no.
lt_itcj-posting_date = pcs_data-pstng_date.
lt_itcj-document_status = 'S'.
lt_itcj-transact_name = pcs_data-transact_name.
lt_itcj-kostl = pcs_data-costcenter.
lt_itcj-prctr = pcs_data-profit_ctr.
lt_itcj-gl_account = pcs_data-gl_account.
lt_itcj-fipos = pcs_data-cmmt_item.
lt_itcj-position_text = pcs_data-position_text.
CASE pcs_data-transact_type.
WHEN 'C'.
lv_typ = 'R'.
lt_itcj-h_receipts = pcs_data-p_payments.
lt_itcj-alloc_nmbr = pcs_data-alloc_nmbr.
WHEN 'E' OR 'B'. " edited by JDS 06.02.2023 : trans type 'B'
* lv_typ = pcs_data-transact_type.
lv_typ = 'E'.
" [start] remarked by JDS 31.07.2023
* IF pcs_data-currency NE 'IDR'.
* lt_itcj-h_payments = pcs_data-p_payments / 100.
* ELSE.
* lt_itcj-h_payments = pcs_data-p_payments.
* ENDIF.
" [end] remarked by JDS 31.07.2023
lt_itcj-h_payments = pcs_data-p_payments. " remarked by JDS 31.07.2023
ENDCASE.
APPEND lt_itcj.
CALL FUNCTION 'FCJ_POST_ALL'
EXPORTING
i_comp_code = pcs_data-comp_code
i_cajo_number = pcs_data-cajo_number
i_currency = pcs_data-currency
i_typ = lv_typ
i_display_period_lo = pcs_data-pstng_date
i_display_period_hi = pcs_data-pstng_date
IMPORTING
e_error_number = lv_error_number
TABLES
itcj_postings = lt_itcj[]
itcj_wtax_items = lt_itcjtax[]
itcj_split_postings = lt_itcjpos[]
itcj_cpd = lt_itcjcpd[]
CHANGING
p_beg_balance = lv_begbal
p_total_receipts = lv_totrep
p_total_payments = lv_totpay
p_total_checks = lv_totcek
p_run_balance = lv_runbal
p_run_cash_balance = lv_casbal
p_numb_of_rec = lv_num_rec
p_numb_of_paym = lv_num_pay
p_numb_of_checks = lv_num_cek.
IF lv_error_number IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
pcs_data-icon = gc_icon_success.
CONCATENATE p_cjdocno pcs_data-cajo_number pcs_data-comp_code INTO lv_awkey.
SELECT SINGLE belnr
FROM bkpf
INTO pcs_data-belnr
WHERE bukrs = pcs_data-comp_code
AND gjahr = pcs_data-pstng_date(4)
AND awtyp = 'CAJO'
AND awkey = lv_awkey.
ELSE.
pcs_data-icon = gc_icon_error.
ENDIF.
ENDFORM.
FORM f_create_cjdoc
*FORM f_create_cjdoc USING ps_ujs TYPE zsdt0018
* ps_map TYPE gty_map
* p_total TYPE wrbtr
CHANGING pc_cjdocno TYPE bapi_cj_key-posting_number
pcs_data TYPE gty_data.
* pcs_result TYPE gty_result.
DATA: ls_header TYPE bapi_cj_header,
lt_item TYPE TABLE OF bapi_cj_items WITH HEADER LINE,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.
" header
ls_header-doc_date = pcs_data-doc_date.
ls_header-pstng_date = pcs_data-pstng_date.
ls_header-comp_code = pcs_data-comp_code.
ls_header-cajo_number = pcs_data-cajo_number.
ls_header-currency = pcs_data-currency.
ls_header-currency_iso = pcs_data-currency.
ls_header-ref_doc_no = pcs_data-ref_doc_no.
* ls_header-text1 = pcs_data-text1.
* ls_header-text2 = pcs_data-text2.
" item
lt_item-position_number = 900.
lt_item-transact_number = pcs_data-transact_number.
CASE pcs_data-transact_type.
WHEN 'C'.
IF pcs_data-currency NE 'IDR'.
lt_item-p_receipts = pcs_data-p_payments.
ELSE.
lt_item-p_receipts = pcs_data-p_payments * 100.
ENDIF.
ls_header-alloc_nmbr = pcs_data-alloc_nmbr.
WHEN OTHERS.
IF pcs_data-currency NE 'IDR'.
lt_item-p_payments = pcs_data-p_payments.
ELSE.
lt_item-p_payments = pcs_data-p_payments * 100.
ENDIF.
ENDCASE.
lt_item-gl_account = pcs_data-gl_account.
lt_item-costcenter = pcs_data-costcenter.
lt_item-profit_ctr = pcs_data-profit_ctr.
lt_item-cmmt_item = pcs_data-cmmt_item.
lt_item-position_text = pcs_data-position_text.
APPEND lt_item.
CALL FUNCTION 'BAPI_CASHJOURNALDOC_CREATE'
EXPORTING
header = ls_header
IMPORTING
cash_journal_doc_no = pc_cjdocno
TABLES
items = lt_item[]
return = lt_return[].
IF pc_cjdocno IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
pcs_data-icon = gc_icon_success.
pcs_data-cjbelnr = pc_cjdocno.
ELSE.
" E FCJ 023 Document could not be saved; correct the errors listed
DELETE lt_return WHERE id = 'FCJ' AND number = '023'.
LOOP AT lt_return INTO DATA(ls_ret) WHERE type = 'E'.
IF pcs_data-remarks IS INITIAL.
pcs_data-remarks = ls_ret-message.
ELSE.
pcs_data-remarks = pcs_data-remarks && ` ; ` && ls_ret-message.
ENDIF.
ENDLOOP.
pcs_data-icon = gc_icon_error.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_process_cjdoc
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_process_cjdoc .
DATA: lv_cjdocno TYPE bapi_cj_key-posting_number,
lv_cannot_run TYPE flag.
* LOOP AT gt_data INTO DATA(ls_data) WHERE icon IS NOT INITIAL.
* lv_cannot_run = 'X'.
* EXIT.
* ENDLOOP.
*
* IF lv_cannot_run EQ 'X'.
* " Cannot run posting cash journal
* MESSAGE s003(zfi) DISPLAY LIKE 'E'.
* EXIT.
* ENDIF.
SORT gt_data BY transact_type.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) WHERE icon IS INITIAL.
PERFORM f_create_cjdoc CHANGING lv_cjdocno <lfs_data>.
IF lv_cjdocno IS NOT INITIAL.
PERFORM f_post_cjdoc USING lv_cjdocno <lfs_data>.
ENDIF.
ENDLOOP.
SORT gt_data BY sort_no.
PERFORM f_update_log.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_process_cjdoc_repost
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_process_cjdoc_repost .
DATA: lv_cjdocno TYPE bapi_cj_key-posting_number,
lv_cannot_run TYPE flag.
SORT gt_data BY transact_type.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) WHERE checkbox EQ 'X'.
CLEAR: <lfs_data>-remarks.
PERFORM f_create_cjdoc CHANGING lv_cjdocno <lfs_data>.
IF lv_cjdocno IS NOT INITIAL.
PERFORM f_post_cjdoc USING lv_cjdocno <lfs_data>.
ENDIF.
ENDLOOP.
SORT gt_data BY cajo_number pstng_date seq subseq.
PERFORM f_update_log_repost.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_grey_button
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_grey_button .
DATA: lv_pfstatus TYPE sypfkey.
lv_pfstatus = 'STANDARD2'.
go_alv_table->set_screen_status(
EXPORTING
pfstatus = lv_pfstatus
report = sy-repid
set_functions = go_alv_table->c_functions_all ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_get_master_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_get_master_data .
DATA(lt_data) = gt_data.
SORT lt_data BY comp_code gl_account.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code gl_account.
SELECT a~comp_code a~transact_number a~transact_type a~gl_account b~transact_name
FROM tcj_transactions AS a
INNER JOIN tcj_trans_names AS b ON a~comp_code = b~comp_code AND a~transact_number = b~transact_number
INTO TABLE gt_trans
FOR ALL ENTRIES IN lt_data
WHERE a~comp_code = lt_data-comp_code
AND a~gl_account = lt_data-gl_account
AND b~langu = 'E'.
lt_data = gt_data.
SORT lt_data BY comp_code cajo_number.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code cajo_number.
SELECT comp_code cajo_number cardnum
FROM zfit_upl_cj_map
INTO TABLE gt_cardnum
FOR ALL ENTRIES IN lt_data
WHERE comp_code = lt_data-comp_code
AND cajo_number = lt_data-cajo_number.
" [START] JDS 31.07.2023 : add validation
DATA: lt_fmci_tmp TYPE gtt_fmci.
lt_data = gt_data.
SORT lt_data BY comp_code cmmt_item.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code cmmt_item.
LOOP AT lt_data INTO DATA(ls_data).
APPEND INITIAL LINE TO lt_fmci_tmp ASSIGNING FIELD-SYMBOL(<lfs_fmci>).
<lfs_fmci>-bukrs = ls_data-comp_code.
<lfs_fmci>-fipex = ls_data-cmmt_item.
ENDLOOP.
SELECT b~bukrs a~fipex
FROM fmci AS a
INNER JOIN t001 AS b ON a~fikrs = b~fikrs
INTO TABLE gt_fmci
FOR ALL ENTRIES IN lt_fmci_tmp
WHERE b~bukrs = lt_fmci_tmp-bukrs
AND a~fipex = lt_fmci_tmp-fipex.
lt_data = gt_data.
SORT lt_data BY comp_code gl_account.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code gl_account.
SELECT bukrs saknr
FROM skb1
INTO TABLE gt_skb1
FOR ALL ENTRIES IN lt_data
WHERE bukrs = lt_data-comp_code
AND saknr = lt_data-gl_account.
" [END] JDS 31.07.2023 : add validation
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_update_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_update_log .
DATA: lt_log TYPE TABLE OF zfit_upl_cj_log,
lv_subseq TYPE zfit_upl_cj_log-subseq.
SELECT SINGLE MAX( seq )
FROM zfit_upl_cj_log
INTO @DATA(lv_seq).
lv_seq = lv_seq + 1.
LOOP AT gt_data INTO DATA(ls_data).
lv_subseq = lv_subseq + 1.
APPEND INITIAL LINE TO lt_log ASSIGNING FIELD-SYMBOL(<lfs_log>).
<lfs_log>-comp_code = ls_data-comp_code.
<lfs_log>-cajo_number = ls_data-cajo_number.
<lfs_log>-transact_type = ls_data-transact_type.
<lfs_log>-gl_account = ls_data-gl_account.
<lfs_log>-seq = lv_seq.
<lfs_log>-subseq = lv_subseq.
<lfs_log>-doc_date = ls_data-doc_date.
<lfs_log>-pstng_date = ls_data-pstng_date.
<lfs_log>-currency = ls_data-currency.
<lfs_log>-alloc_nmbr = ls_data-alloc_nmbr.
<lfs_log>-ref_doc_no = ls_data-ref_doc_no.
<lfs_log>-position_text = ls_data-position_text.
* <lfs_log>-text1 = ls_data-text1.
* <lfs_log>-text2 = ls_data-text2.
<lfs_log>-p_payments = ls_data-p_payments.
<lfs_log>-costcenter = ls_data-costcenter.
<lfs_log>-profit_ctr = ls_data-profit_ctr.
<lfs_log>-cmmt_item = ls_data-cmmt_item.
<lfs_log>-cjbelnr = ls_data-cjbelnr.
<lfs_log>-remarks = ls_data-remarks.
CASE ls_data-icon.
WHEN gc_icon_success.
<lfs_log>-status = 'S'.
WHEN gc_icon_error.
<lfs_log>-status = 'E'.
WHEN OTHERS.
ENDCASE.
<lfs_log>-erdat = sy-datum.
<lfs_log>-erzet = sy-uzeit.
<lfs_log>-ernam = sy-uname.
ENDLOOP.
MODIFY zfit_upl_cj_log FROM TABLE lt_log.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_update_log_repost
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_update_log_repost .
DATA: lt_log TYPE TABLE OF zfit_upl_cj_log,
lv_subseq TYPE zfit_upl_cj_log-subseq.
SORT gt_log BY comp_code cajo_number transact_type gl_account seq subseq.
LOOP AT gt_data INTO DATA(ls_data) WHERE checkbox = 'X'.
READ TABLE gt_log INTO DATA(ls_log) WITH KEY comp_code = ls_data-comp_code
cajo_number = ls_data-cajo_number
transact_type = ls_data-transact_type
gl_account = ls_data-gl_account
seq = ls_data-seq
subseq = ls_data-subseq BINARY SEARCH.
IF sy-subrc EQ 0.
CASE ls_data-icon.
WHEN gc_icon_error.
ls_log-status = 'E'.
WHEN gc_icon_success.
ls_log-status = 'S'.
ENDCASE.
ls_log-cjbelnr = ls_data-cjbelnr.
ls_log-remarks = ls_data-remarks.
" timestamps
ls_log-erdat = sy-datum.
ls_log-erzet = sy-uzeit.
ls_log-ernam = sy-uname.
APPEND ls_log TO lt_log.
ENDIF.
ENDLOOP.
MODIFY zfit_upl_cj_log FROM TABLE lt_log.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_build_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_build_data .
SORT gt_trans BY comp_code gl_account transact_type.
SORT gt_cardnum BY comp_code cajo_number.
SORT gt_fmci BY bukrs fipex. " JDS 31.07.2023 : add validation
SORT gt_skb1 BY bukrs saknr. " JDS 31.07.2023 : add validation
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
READ TABLE gt_trans INTO DATA(ls_trans) WITH KEY comp_code = <lfs_data>-comp_code
gl_account = <lfs_data>-gl_account
transact_type = <lfs_data>-transact_type BINARY SEARCH.
IF sy-subrc EQ 0.
<lfs_data>-transact_type = ls_trans-transact_type.
<lfs_data>-transact_number = ls_trans-transact_number.
<lfs_data>-transact_name = ls_trans-transact_name.
ELSE.
READ TABLE gt_trans INTO ls_trans WITH KEY comp_code = <lfs_data>-comp_code
gl_account = <lfs_data>-gl_account
transact_type = 'B' BINARY SEARCH.
IF sy-subrc EQ 0.
<lfs_data>-transact_type = ls_trans-transact_type.
<lfs_data>-transact_number = ls_trans-transact_number.
<lfs_data>-transact_name = ls_trans-transact_name.
ELSE.
<lfs_data>-icon = gc_icon_error.
<lfs_data>-remarks = TEXT-e02. " invalid GL Account
ENDIF.
ENDIF.
READ TABLE gt_cardnum INTO DATA(ls_cardnum) WITH KEY comp_code = <lfs_data>-comp_code cajo_number = <lfs_data>-cajo_number BINARY SEARCH.
IF sy-subrc EQ 0.
<lfs_data>-alloc_nmbr = ls_cardnum-cardnum.
ENDIF.
" [START] JDS 31.07.2023 : add validation
IF <lfs_data>-cmmt_item IS NOT INITIAL.
READ TABLE gt_fmci INTO DATA(ls_fmci) WITH KEY bukrs = <lfs_data>-comp_code fipex = <lfs_data>-cmmt_item BINARY SEARCH.
IF sy-subrc NE 0.
<lfs_data>-icon = gc_icon_error.
<lfs_data>-remarks = TEXT-e03. " invalid Commitment Item
ENDIF.
ENDIF.
READ TABLE gt_skb1 INTO DATA(ls_skb1) WITH KEY bukrs = <lfs_data>-comp_code saknr = <lfs_data>-gl_account BINARY SEARCH.
IF sy-subrc NE 0.
<lfs_data>-icon = gc_icon_error.
<lfs_data>-remarks = TEXT-e04. " invalid GL Account
ENDIF.
" [END] JDS 31.07.2023 : add validation
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_convert_fipos_in
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> <LFS_RAW>
*& <-- <LFS_DEST>
*&---------------------------------------------------------------------*
FORM f_convert_fipos_in USING p_in
CHANGING pc_out.
CALL FUNCTION 'CONVERSION_EXIT_FMCIS_INPUT'
EXPORTING
input = p_in
IMPORTING
output = pc_out.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_balance_validation
*&---------------------------------------------------------------------*
*& " JDS 08.03.2023 : add balance validation
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_balance_validation .
** DATA: lt_balance TYPE gtt_balance.
**
** " get balance
** PERFORM f_get_balance CHANGING lt_balance.
**
** " calculate remaining cash on hand
** DATA(lt_data) = gt_data.
** SORT lt_data BY cajo_number .
**
** LOOP AT lt_data INTO DATA(ls_data).
** " at new
** AT NEW cajo_number.
** READ TABLE lt_balance ASSIGNING FIELD-SYMBOL(<lfs_bal>) WITH KEY cajo_number = ls_data-cajo_number BINARY SEARCH.
** IF sy-subrc NE 0.
** " error handling
** APPEND INITIAL LINE TO lt_balance ASSIGNING <lfs_bal>.
** <lfs_bal>-cajo_number = ls_data-cajo_number.
** ENDIF.
** ENDAT.
**
** " sequence
** CASE ls_data-transact_type.
** WHEN 'C'. " receipt
** <lfs_bal>-closing_sum += ls_data-p_payments.
** WHEN OTHERS. " payment
** <lfs_bal>-closing_sum -= ls_data-p_payments.
** ENDCASE.
**
** " at end
** AT END OF cajo_number.
** ENDAT.
**
** ENDLOOP.
** " validating..
** SORT gt_data BY cajo_number.
** LOOP AT lt_balance INTO DATA(ls_bal).
** IF ls_bal-closing_sum < 0.
** IF sy-batch EQ 'X'.
** PERFORM f_write_error USING ls_bal.
** ENDIF.
** READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) WITH KEY cajo_number = ls_bal-cajo_number BINARY SEARCH.
** IF sy-subrc EQ 0.
** LOOP AT gt_data ASSIGNING <lfs_data> FROM sy-tabix.
** IF <lfs_data>-cajo_number NE ls_bal-cajo_number.
** EXIT.
** ENDIF.
** <lfs_data>-icon = gc_icon_error.
** <lfs_data>-remarks = TEXT-e01.
** ENDLOOP.
** ENDIF.
** ENDIF.
** ENDLOOP.
******" REFERENCE(I_AMOUNT) TYPE CJAMOUNT
******" REFERENCE(I_DOCUMENT_STATUS) TYPE CJDOCSTAT
******" REFERENCE(I_TYP) TYPE CJTRANSTYP OPTIONAL
******" REFERENCE(I_COMP_CODE) LIKE TCJ_C_JOURNALS-COMP_CODE
******" REFERENCE(I_CAJO_NUMBER) LIKE TCJ_C_JOURNALS-CAJO_NUMBER
******" REFERENCE(I_CHECK_STACK) LIKE ISCJ_POSTINGS-CHECK_STACK
******" REFERENCE(I_PROCESS_STATUS) TYPE CJDOCSTAT
******" REFERENCE(I_POSTING_DATE) LIKE SY-DATUM
******" REFERENCE(I_MEANS_OF_PAYMENT) TYPE CJMOFPAYM OPTIONAL
******" REFERENCE(I_XBAPI) TYPE BOOLEAN OPTIONAL
***** DATA:
***** lv_amount TYPE cjamount,
***** lv_document_status TYPE cjdocstat,
***** lv_comp_code TYPE tcj_c_journals-comp_code,
***** lv_cajo_number TYPE tcj_c_journals-cajo_number,
***** lv_check_stack TYPE iscj_postings-check_stack,
***** lv_process_status TYPE cjdocstat,
***** lv_datum LIKE sy-datum.
*****
***** DATA(lt_data) = gt_data.
***** SORT lt_data BY cajo_number .
*****
***** CALL FUNCTION 'FCJ_CHECK_DOC_AMOUNT'
***** EXPORTING
***** i_amount = lv_amount
***** i_document_status = lv_document_status
****** I_TYP =
***** i_comp_code = lv_comp_code
***** i_cajo_number = lv_cajo_number
***** i_check_stack = lv_check_stack
***** i_process_status = lv_process_status
***** i_posting_date = lv_datum
****** I_MEANS_OF_PAYMENT =
****** I_XBAPI =
***** EXCEPTIONS
***** error_message = 1
***** warning_message = 2
***** OTHERS = 3.
***** IF sy-subrc <> 0.
****** Implement suitable error handling here
***** ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_get_balance
*&---------------------------------------------------------------------*
*& " JDS 08.03.2023 : add balance validation
*&---------------------------------------------------------------------*
*& <-- LT_BALANCE
*&---------------------------------------------------------------------*
FORM f_get_balance CHANGING pct_balance TYPE gtt_balance.
DATA: lt_bal_tmp TYPE gtt_balance.
DATA(lt_data) = gt_data.
SORT lt_data BY cajo_number pstng_date DESCENDING.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING cajo_number.
LOOP AT lt_data INTO DATA(ls_data).
APPEND INITIAL LINE TO lt_bal_tmp ASSIGNING FIELD-SYMBOL(<lfs_bal>).
<lfs_bal>-cajo_number = ls_data-cajo_number.
<lfs_bal>-time_stamp = ls_data-pstng_date && '235959'.
ENDLOOP.
SELECT cajo_number time_stamp closing_sum currency
FROM tcj_balance
INTO TABLE pct_balance
FOR ALL ENTRIES IN lt_bal_tmp
WHERE cajo_number = lt_bal_tmp-cajo_number
AND rec_type = ''
AND time_stamp <= lt_bal_tmp-time_stamp.
SORT pct_balance BY cajo_number time_stamp DESCENDING.
DELETE ADJACENT DUPLICATES FROM pct_balance COMPARING cajo_number.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_write_error
*&---------------------------------------------------------------------*
*& " JDS 08.03.2023 : add balance validation
*&---------------------------------------------------------------------*
*& --> LS_BAL_CAJO_NUMBER
*& --> LS_BAL_CLOSING_SUM
*&---------------------------------------------------------------------*
FORM f_write_error USING ps_bal TYPE gty_balance.
DATA: lv_text_amt TYPE char30.
WRITE ps_bal-closing_sum TO lv_text_amt CURRENCY ps_bal-currency.
WRITE:/ `[ERROR] Insufficient balance: `, ps_bal-cajo_number, ` ` , lv_text_amt.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_get_repost_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_get_repost_data CHANGING pct_data TYPE gtt_data.
DATA: lt_log TYPE TABLE OF zfit_upl_cj_log.
SELECT *
FROM zfit_upl_cj_log
INTO TABLE lt_log
WHERE comp_code IN so_bukrs
AND cajo_number IN so_cajon
AND transact_type IN so_ttype
AND gl_account IN so_hkont
AND pstng_date IN so_budat
AND status EQ 'E'
AND erdat IN so_erdat
AND erzet IN so_erzet
AND ernam IN so_ernam.
IF sy-subrc EQ 0.
LOOP AT lt_log INTO DATA(ls_log).
APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
MOVE-CORRESPONDING ls_log TO <lfs_data>.
CASE ls_log-status.
WHEN 'S'.
<lfs_data>-icon = gc_icon_success.
WHEN 'E'.
<lfs_data>-icon = gc_icon_error.
ENDCASE.
ENDLOOP.
ELSE.
" No data exists
MESSAGE ID '/ACCGO/CAS_FLLW_MSG' TYPE 'S' NUMBER 338 DISPLAY LIKE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_click_checkbox
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_ROW
*&---------------------------------------------------------------------*
FORM f_click_checkbox USING p_index.
READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) INDEX p_index.
IF sy-subrc EQ 0.
CASE <lfs_data>-checkbox.
WHEN ''.
<lfs_data>-checkbox = 'X'.
WHEN 'X'.
<lfs_data>-checkbox = ''.
ENDCASE.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_select_all
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*&---------------------------------------------------------------------*
FORM f_select_all USING p_x.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
<lfs_data>-checkbox = p_x.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_popup_confirm
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_ANSWER
*&---------------------------------------------------------------------*
FORM f_popup_confirm CHANGING pc_answer.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
* TITLEBAR = ' '
* DIAGNOSE_OBJECT = ' '
text_question = 'Are you sure?'
text_button_1 = TEXT-b01
icon_button_1 = 'ICON_OKAY'
text_button_2 = TEXT-b02
icon_button_2 = 'ICON_CANCEL'
* DEFAULT_BUTTON = '1'
display_cancel_button = ''
* USERDEFINED_F1_HELP = ' '
* START_COLUMN = 25
* START_ROW = 6
* POPUP_TYPE =
* IV_QUICKINFO_BUTTON_1 = ' '
* IV_QUICKINFO_BUTTON_2 = ' '
IMPORTING
answer = pc_answer
* TABLES
* PARAMETER =
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_delete_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_delete_data .
DATA: lt_log LIKE gt_log.
SORT gt_log BY comp_code cajo_number transact_type gl_account seq subseq.
LOOP AT gt_data INTO DATA(ls_data) WHERE checkbox = 'X'.
READ TABLE gt_log INTO DATA(ls_log) WITH KEY comp_code = ls_data-comp_code
cajo_number = ls_data-cajo_number
transact_type = ls_data-transact_type
gl_account = ls_data-gl_account
seq = ls_data-seq
subseq = ls_data-subseq BINARY SEARCH.
IF sy-subrc EQ 0.
APPEND ls_log TO lt_log.
ENDIF.
ENDLOOP.
DELETE zfit_upl_cj_log FROM TABLE lt_log.
DELETE gt_data WHERE checkbox = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_validation_delete
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_SUBRC
*&---------------------------------------------------------------------*
FORM f_validation_delete CHANGING pc_subrc LIKE sy-subrc.
READ TABLE gt_data WITH KEY checkbox = 'X' icon = gc_icon_success TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
pc_subrc = 4.
" Cannot delete successed data
MESSAGE s002(zfi002) DISPLAY LIKE 'E'.
EXIT.
ENDIF.
READ TABLE gt_data WITH KEY checkbox = 'X' TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
pc_subrc = 4.
" Please select data
MESSAGE s003(zfi002) DISPLAY LIKE 'E'.
EXIT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_validation_repos
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_SUBRC
*&---------------------------------------------------------------------*
FORM f_validation_repos CHANGING pc_subrc.
READ TABLE gt_data WITH KEY checkbox = 'X' icon = gc_icon_success TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
pc_subrc = 4.
" Cannot post successed data
MESSAGE s001(zfi002) DISPLAY LIKE 'E'.
EXIT.
ENDIF.
READ TABLE gt_data WITH KEY checkbox = 'X' TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
pc_subrc = 4.
" Please select data
MESSAGE s003(zfi002) DISPLAY LIKE 'E'.
EXIT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_validation_post
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_SUBRC
*&---------------------------------------------------------------------*
FORM f_validation_post CHANGING pc_subrc.
LOOP AT gt_data INTO DATA(ls_data) WHERE icon IS NOT INITIAL.
" Cannot run posting cash journal
pc_subrc = 4.
MESSAGE s003(zfi) DISPLAY LIKE 'E'.
EXIT.
ENDLOOP.
CHECK pc_subrc IS NOT INITIAL.
ENDFORM.