Financial Management Blogs by SAP
Get financial management insights from blog posts by SAP experts. Find and share tips on how to increase efficiency, reduce risk, and optimize working capital.
cancel
Showing results for 
Search instead for 
Did you mean: 
james_lim
Advisor
Advisor


While I was working at the customer site for BPC NW 7.5 for implementing BPC secutiry, I found 'BPC Mass User Management Tool' doesn't support deleting functions!

So I asked a question to customer and she said she had to delete user, profiles and teams one by one using BPC admin console...... :cry:

In addition, at the same time, one of my colleague asked same question to me so I decided to enhance it.

I am not an expert ABAP developer but thanks to my development experience with other programming languages, I could enhance it.

After I made it, I tried to make it as a transport file but I gave up because it may trigger maintenance issue.

If a lot of BPC administrators / consultants need this tool, I will post it later including document so please leave a comment.

== Updated Aug.18th 2014

I attached a source code that I modified.

I used it for a customer and it worked well without any critical issue ( Even though it works, it should be used carefully after test in your environment)

Disclaimer:

1. This is not a code/program that SAP supports.

2. SAP will not support this code as a product. so it should be used as a custom code.

3. I am not responsible anything about this code as well as the result from this code.


== Updated Jul.1st 2020

I found the attachment was missing a long time ago while SCN was migrated to new platform so I attached it again.

I am not sure it will work in BPC 10.X but please try it.
*&---------------------------------------------------------------------*
*& Report ZUJE_MASS_USER_MGMT
*&
*&---------------------------------------------------------------------*
*& Created By: Rich Heilman SAP Labs, LLC
*& Modified By: James Lim SAP Americas
*& Created On: 08/2/2010
*& Modified On: 12/6/2013
*&---------------------------------------------------------------------*

REPORT ZUJE_MASS_USER_DELETE.

TYPE-POOLS: abap, vrm.

*----------------------------------------------------------------------*
* CLASS lcl_application DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_application DEFINITION FINAL.

PUBLIC SECTION.

CONSTANTS: lc_comma TYPE char01 VALUE ',',
lc_pipe TYPE char01 VALUE '|',
lc_tab TYPE char10 VALUE 'TAB'.

TYPES: BEGIN OF t_appldim,
appl_id TYPE uj_appl_id,
dimension TYPE uj_dim_name,
END OF t_appldim.

TYPES: BEGIN OF t_appldimmembers,
appl_id TYPE uj_appl_id,
dimension TYPE uj_dim_name,
member TYPE uj_dim_member,
END OF t_appldimmembers.

CLASS-METHODS: file_f4 RETURNING value(r_file) TYPE string,
directory_f4 RETURNING value(r_path) TYPE string,
get_initial_directory RETURNING value(r_path) TYPE string,
set_delimiter_listbox,
set_delimiter,
export_users_to_file,
import_users_from_file,
export_teams_to_file,
import_teams_from_file,
export_team_assign_to_file,
import_team_assign_from_file,
export_task_profiles_to_file,
import_task_profiles_from_file,
export_mem_profiles_to_file,
import_mem_profiles_from_file,
export_tap_assign_to_file,
import_tap_assign_from_file,
export_map_assign_to_file,
import_map_assign_from_file,
delete_users_from_file,
delete_teams_from_file,
delete_task_profiles_from_file, "TSK
delete_mem_profiles_from_file, "MBR

get_bpc_component_version,
get_appset_data IMPORTING i_appset_id TYPE uj_appset_id
EXCEPTIONS appset_not_found .

PRIVATE SECTION.

CLASS-DATA: lv_appset_id TYPE uja_s_appset_info-appset_id.
CLASS-DATA: lv_delimiter TYPE string.
CLASS-DATA: lv_release TYPE saprelease.
CLASS-DATA: lv_splevel TYPE sappatchlv.
CLASS-DATA: ls_appset_info TYPE uja_s_appset_info.

CLASS-DATA: lt_appl_info TYPE uja_t_appl_info.
CLASS-DATA: lt_appl_dim TYPE TABLE OF t_appldim.
CLASS-DATA: lt_members TYPE TABLE OF t_appldimmembers.
CLASS-DATA: lt_teams_list TYPE uje_t_team.
CLASS-DATA: lt_users_list TYPE uje_t_user.
CLASS-DATA: lt_tprofs TYPE uje_t_api_profile_id.
CLASS-DATA: lt_mprofs TYPE uje_t_api_profile_id.
CLASS-DATA: lt_mprofs_tmp TYPE uje_t_profile.
CLASS-DATA: lt_tasks TYPE uje_t_role_tskasg.
CLASS-DATA: lt_roles TYPE uje_t_role.

CLASS-DATA: lo_context TYPE REF TO if_uj_context.
CLASS-DATA: lt_alv_messages TYPE uj0_t_message.

CLASS-METHODS: set_global_context,
render_alv,
upload IMPORTING i_filepath TYPE any
RETURNING value(rt_strtab) TYPE stringtab,
download IMPORTING i_filepath TYPE any
it_datatab TYPE STANDARD TABLE,
user_is_valid IMPORTING i_user_id TYPE any
RETURNING value(r_boolean) TYPE abap_bool,
team_is_valid IMPORTING i_team_id TYPE any
RETURNING value(r_boolean) TYPE abap_bool,
tprofile_is_valid IMPORTING i_profile_id TYPE any
RETURNING value(r_boolean) TYPE abap_bool,
mprofile_is_valid IMPORTING i_profile_id TYPE any
RETURNING value(r_boolean) TYPE abap_bool,
role_is_valid IMPORTING i_role_id TYPE any
RETURNING value(r_boolean) TYPE abap_bool,
task_is_valid IMPORTING i_task_id TYPE any
RETURNING value(r_boolean) TYPE abap_bool.

ENDCLASS. "lcl_application DEFINITION

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_export RADIOBUTTON GROUP grp1 DEFAULT 'X' USER-COMMAND chk.
PARAMETERS: p_import RADIOBUTTON GROUP grp1.
PARAMETERS: p_delete RADIOBUTTON GROUP grp1.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: p_appset TYPE uja_appset_info-appset_id.
PARAMETERS: p_file TYPE string LOWER CASE.
PARAMETERS: p_delmt TYPE char10 AS LISTBOX VISIBLE LENGTH 20
DEFAULT lcl_application=>lc_comma. "delimiter
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.
PARAMETERS: p_eusers RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_eteams RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_eteama RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_etprof RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_emprof RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_etprfa RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_emprfa RADIOBUTTON GROUP grp2 MODIF ID exp.
SELECTION-SCREEN END OF BLOCK b3.

SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-004.
PARAMETERS: p_iusers RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_iteams RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_iteama RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_itprof RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_improf RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_itprfa RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_imprfa RADIOBUTTON GROUP grp3 MODIF ID imp.
SELECTION-SCREEN END OF BLOCK b4.

SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-005.
PARAMETERS: p_dusers RADIOBUTTON GROUP grp4 MODIF ID del.
PARAMETERS: p_dteams RADIOBUTTON GROUP grp4 MODIF ID del.
PARAMETERS: p_dtprof RADIOBUTTON GROUP grp4 MODIF ID del.
PARAMETERS: p_dmprof RADIOBUTTON GROUP grp4 MODIF ID del.
SELECTION-SCREEN END OF BLOCK b5.

INITIALIZATION.

p_file = lcl_application=>get_initial_directory( ).
lcl_application=>set_delimiter_listbox( ).
lcl_application=>get_bpc_component_version( ).

AT SELECTION-SCREEN OUTPUT.

LOOP AT SCREEN.
IF p_export = abap_true.
IF screen-group1 = 'IMP' OR screen-group1 = 'DEL'.
screen-active = '0'.
ENDIF.
ENDIF.
IF p_import = abap_true.
IF screen-group1 = 'EXP' OR screen-group1 = 'DEL'.
screen-active = '0'.
ENDIF.
ENDIF.
IF p_delete = abap_true.
IF screen-group1 = 'IMP' OR screen-group1 = 'EXP'.
screen-active = '0'.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.

AT SELECTION-SCREEN.
CASE abap_true.
WHEN p_export.
CLEAR: p_iusers, p_iteams, p_iteama, p_itprof,
p_improf, p_itprfa, p_imprfa,
p_dusers, p_dteams, p_dtprof,p_dmprof.

WHEN p_import.
CLEAR: p_eusers, p_eteams, p_eteama, p_etprof,
p_emprof, p_etprfa, p_emprfa,
p_dusers, p_dteams, p_dtprof,p_dmprof.

WHEN p_delete.
CLEAR: p_eusers, p_eteams, p_eteama, p_etprof,
p_emprof, p_etprfa, p_emprfa,
p_iusers, p_iteams, p_iteama, p_itprof,
p_improf, p_itprfa, p_imprfa.
ENDCASE.

IF sy-ucomm <> 'CHK'.

IF p_appset IS INITIAL.
MESSAGE e001(00) WITH 'Please enter an AppSet Id'.
ENDIF.
IF p_file IS INITIAL.
MESSAGE e001(00) WITH 'Please enter a valid directory or file'.
ENDIF.
IF p_delmt IS INITIAL.
MESSAGE e001(00) WITH 'Please specify a delimiter'.
ENDIF.

ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

CASE abap_true.
WHEN p_export. p_file = lcl_application=>directory_f4( ).
WHEN p_import. p_file = lcl_application=>file_f4( ).
WHEN p_delete. p_file = lcl_application=>file_f4( ). "import and delete based on file
ENDCASE.

START-OF-SELECTION.

lcl_application=>set_delimiter( ).

lcl_application=>get_appset_data(
EXPORTING
i_appset_id = p_appset
EXCEPTIONS
appset_not_found = 1 ).
IF sy-subrc <> 0.
RETURN.
ENDIF.

CASE abap_true.
WHEN p_eusers. lcl_application=>export_users_to_file( ).
WHEN p_iusers. lcl_application=>import_users_from_file( ).
WHEN p_eteams. lcl_application=>export_teams_to_file( ).
WHEN p_iteams. lcl_application=>import_teams_from_file( ).
WHEN p_eteama. lcl_application=>export_team_assign_to_file( ).
WHEN p_iteama. lcl_application=>import_team_assign_from_file( ).
WHEN p_etprof. lcl_application=>export_task_profiles_to_file( ).
WHEN p_itprof. lcl_application=>import_task_profiles_from_file( ).
WHEN p_emprof. lcl_application=>export_mem_profiles_to_file( ).
WHEN p_improf. lcl_application=>import_mem_profiles_from_file( ).
WHEN p_etprfa. lcl_application=>export_tap_assign_to_file( ).
WHEN p_itprfa. lcl_application=>import_tap_assign_from_file( ).
WHEN p_emprfa. lcl_application=>export_map_assign_to_file( ).
WHEN p_imprfa. lcl_application=>import_map_assign_from_file( ).

" for delete functions
WHEN p_dusers. lcl_application=>delete_users_from_file( ).
WHEN p_dteams. lcl_application=>delete_teams_from_file( ).
WHEN p_dtprof. lcl_application=>delete_task_profiles_from_file( ).
WHEN p_dmprof. lcl_application=>delete_mem_profiles_from_file( ).

ENDCASE.

*----------------------------------------------------------------------*
* CLASS lcl_application IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_application IMPLEMENTATION.

METHOD file_f4.

DATA: lt_file_table TYPE filetable.
DATA: ls_file_table LIKE LINE OF lt_file_table.

DATA: lv_rc TYPE sy-subrc.

cl_gui_frontend_services=>file_open_dialog(
CHANGING
file_table = lt_file_table
rc = lv_rc ).
CLEAR ls_file_table .
READ TABLE lt_file_table INTO ls_file_table INDEX 1.
IF sy-subrc = 0.
r_file = ls_file_table-filename.
ENDIF.

ENDMETHOD. "file_f4

METHOD directory_f4.

cl_gui_frontend_services=>directory_browse(
CHANGING
selected_folder = r_path
EXCEPTIONS
OTHERS = 4 ).

ENDMETHOD. "directory_f4

METHOD upload.

cl_gui_frontend_services=>gui_upload(
EXPORTING
filename = i_filepath
CHANGING
data_tab = rt_strtab
EXCEPTIONS
OTHERS = 19 ).
IF sy-subrc <> 0.
MESSAGE e001(00) WITH 'File not found, check file path and name'.
ENDIF.

DELETE rt_strtab WHERE table_line IS INITIAL.

ENDMETHOD. "upload

METHOD download.

DATA: lt_datatab TYPE stringtab.
DATA: ls_datatab LIKE LINE OF lt_datatab.

FIELD-SYMBOLS: <ls_data> TYPE ANY.
FIELD-SYMBOLS: <lv_field> TYPE ANY.

* Convert table to delimited string table
LOOP AT it_datatab ASSIGNING <ls_data>.
CLEAR ls_datatab.
DO.
ASSIGN COMPONENT sy-index
OF STRUCTURE <ls_data> TO <lv_field>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF ls_datatab IS INITIAL.
ls_datatab = <lv_field>.
ELSE.
CONCATENATE ls_datatab <lv_field>
INTO ls_datatab SEPARATED BY lcl_application=>lv_delimiter.
ENDIF.
ENDDO.
APPEND ls_datatab TO lt_datatab.
ENDLOOP.

cl_gui_frontend_services=>gui_download(
EXPORTING
filename = i_filepath
CHANGING
data_tab = lt_datatab
EXCEPTIONS
OTHERS = 24 ).
IF sy-subrc <> 0.
MESSAGE e001(00)
WITH 'File not downloaded, check file path and name'.
ENDIF.

ENDMETHOD. "download

METHOD get_initial_directory.

cl_gui_frontend_services=>get_desktop_directory(
CHANGING
desktop_directory = r_path ).
cl_gui_cfw=>flush( ).

CONCATENATE r_path '\*.csv' INTO r_path.

ENDMETHOD. "get_initial_directory

METHOD export_users_to_file.

TYPES: BEGIN OF t_output,
user_id TYPE uje_user-user_id,
fullname TYPE uje_user-fullname,
email TYPE uje_user-email,
END OF t_output.

DATA: lt_user_id TYPE uje_t_api_user_id.

DATA: lt_users TYPE uje_t_user.
DATA: ls_users LIKE LINE OF lt_users.

DATA: lt_output TYPE TABLE OF t_output.
DATA: ls_output LIKE LINE OF lt_output.

lcl_application=>set_global_context( ).

CALL FUNCTION 'UJE_API_GET_LIST_USERS'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
it_user_id = lt_user_id
IMPORTING
et_user = lt_users.

REFRESH lt_output.
LOOP AT lt_users INTO ls_users.
MOVE-CORRESPONDING ls_users TO ls_output.
APPEND ls_output TO lt_output.
ENDLOOP.

* Download table
lcl_application=>download( EXPORTING i_filepath = p_file
it_datatab = lt_output ).

ENDMETHOD. "export_users_to_file

METHOD import_users_from_file.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.

DATA: ls_user_info TYPE uje_s_userinfo.

DATA: lt_messages TYPE uj0_t_message.
DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_team_asin TYPE uje_t_user_team.
DATA: lt_tprofiles TYPE uje_t_profile_id_act.
DATA: lt_mprofiles TYPE uje_t_profile_id_act.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

lt_strtab = lcl_application=>upload( p_file ).

LOOP AT lt_strtab INTO ls_strtab.

SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_user_info-user_id
ls_user_info-fullname
ls_user_info-email.

* Check if user already exists, and set action accordingly.
IF lcl_application=>user_is_valid( ls_user_info-user_id ) = abap_false.
lv_action = 'I'.
ELSE.
lv_action = 'M'.
ENDIF.

CALL FUNCTION 'UJE_API_MANAGE_USER2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
is_user_info = ls_user_info
i_action = lv_action
it_team_asin = lt_team_asin
it_tprofile_id = lt_tprofiles
it_mprofile_id = lt_mprofiles
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User ID' ls_user_info-user_id
'has been created/updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User ID' ls_user_info-user_id
'not created/updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

lcl_application=>render_alv( ).

ENDMETHOD. "create_users_from_file

METHOD delete_users_from_file.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.

DATA: ls_user_info TYPE uje_s_userinfo.

DATA: lt_messages TYPE uj0_t_message.
DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_team_asin TYPE uje_t_user_team.
DATA: lt_tprofiles TYPE uje_t_profile_id_act.
DATA: lt_mprofiles TYPE uje_t_profile_id_act.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

lt_strtab = lcl_application=>upload( p_file ).

LOOP AT lt_strtab INTO ls_strtab.

SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_user_info-user_id
ls_user_info-fullname
ls_user_info-email.


CALL FUNCTION 'UJE_API_DELETE_USER'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_user_id = ls_user_info-user_id
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User ID' ls_user_info-user_id
'has been removed successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User ID' ls_user_info-user_id
'could not be removed due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

lcl_application=>render_alv( ).

ENDMETHOD. "delete_users_from_file

METHOD export_teams_to_file.

TYPES: BEGIN OF t_output,
team_id TYPE uje_s_team-team_id,
description TYPE uje_s_team-description,
END OF t_output.

DATA: lt_teams TYPE uje_t_team.
DATA: ls_teams LIKE LINE OF lt_teams.

DATA: lt_output TYPE TABLE OF t_output.
DATA: ls_output LIKE LINE OF lt_output.

CALL FUNCTION 'UJE_API_GET_TEAMS'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
IMPORTING
et_team = lt_teams.

REFRESH lt_output.
LOOP AT lt_teams INTO ls_teams.
MOVE-CORRESPONDING ls_teams TO ls_output.
APPEND ls_output TO lt_output.
ENDLOOP.

* Download table
lcl_application=>download( EXPORTING i_filepath = p_file
it_datatab = lt_output ).

ENDMETHOD. "export_teams_to_file

METHOD import_teams_from_file.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.

DATA: ls_team TYPE uje_s_team.

DATA: lt_messages TYPE uj0_t_message.
DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_users TYPE uje_t_user_team.
DATA: lt_tprofiles TYPE uje_t_profile_id_act.
DATA: lt_mprofiles TYPE uje_t_profile_id_act.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

lt_strtab = lcl_application=>upload( p_file ).

LOOP AT lt_strtab INTO ls_strtab.

SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_team-team_id
ls_team-description.

* Check if team is already a valid team, set action appropriatly
IF lcl_application=>team_is_valid( ls_team-team_id ) = abap_false.
lv_action = 'I'.
ELSE.
lv_action = 'M'.
ENDIF.

CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
is_team = ls_team
i_action = lv_action
it_users = lt_users
it_tprofile_id = lt_tprofiles
it_mprofile_id = lt_mprofiles
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_team-team_id
'has been created/updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_team-team_id
'not created/updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

lcl_application=>render_alv( ).

ENDMETHOD. "create_teams_from_file
METHOD delete_teams_from_file.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.

DATA: ls_team TYPE uje_s_team.

DATA: lt_messages TYPE uj0_t_message.
DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_users TYPE uje_t_user_team.
DATA: lt_tprofiles TYPE uje_t_profile_id_act.
DATA: lt_mprofiles TYPE uje_t_profile_id_act.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

lt_strtab = lcl_application=>upload( p_file ).

LOOP AT lt_strtab INTO ls_strtab.

SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_team-team_id
ls_team-description.

CALL FUNCTION 'UJE_API_DELETE_TEAM'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_team_id = ls_team-team_id
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_team-team_id
'has been removed successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_team-team_id
'could not be removed due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

lcl_application=>render_alv( ).

ENDMETHOD. "delete_teams_from_file

METHOD export_team_assign_to_file.

TYPES: BEGIN OF t_user_assign,
user_id TYPE uje_s_user_team-user_id,
team_id TYPE uje_s_user_team-team_id,
teamleader TYPE uje_s_user_team-teamleader,
END OF t_user_assign.

DATA: lt_user_det TYPE uje_t_user_detail.
DATA: ls_user_det LIKE LINE OF lt_user_det.

DATA: ls_user_team TYPE uje_s_user_team.

DATA: lt_team_assign TYPE TABLE OF t_user_assign.
DATA: ls_team_assign LIKE LINE OF lt_team_assign.

CALL FUNCTION 'UJE_API_GET_USERDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
IMPORTING
et_user = lt_user_det.

LOOP AT lt_user_det INTO ls_user_det.
LOOP AT ls_user_det-t_team_id INTO ls_user_team.
MOVE-CORRESPONDING ls_user_team TO ls_team_assign.
APPEND ls_team_assign TO lt_team_assign.
ENDLOOP.
ENDLOOP.

* Download table
lcl_application=>download( EXPORTING i_filepath = p_file
it_datatab = lt_team_assign ).

ENDMETHOD. "export_team_assign_to_file

METHOD import_team_assign_from_file.

TYPES: BEGIN OF t_user_assign,
user_id TYPE uje_s_user_team-user_id,
team_id TYPE uje_s_user_team-team_id,
teamleader TYPE uje_s_user_team-teamleader,
END OF t_user_assign.

DATA: lv_success TYPE uj_bool.

DATA: lt_user_team_temp TYPE uje_t_user_team.
DATA: ls_user_team_temp TYPE uje_s_user_team.

DATA: lt_user_team TYPE uje_t_user_team.
DATA: ls_user_team TYPE uje_s_user_team.

DATA: ls_team_assign TYPE uje_s_user_team.

DATA: lt_messages TYPE uj0_t_message.
DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_tprofiles TYPE uje_t_profile_id_act.
DATA: ls_tprofiles LIKE LINE OF lt_tprofiles.

DATA: lt_mprofiles TYPE uje_t_profile_id_act.
DATA: ls_mprofiles LIKE LINE OF lt_mprofiles.

DATA: lt_tprofile_ids TYPE uje_t_api_profile_id.
DATA: ls_tprofile_ids LIKE LINE OF lt_tprofile_ids.

DATA: lt_mprofile_ids TYPE uje_t_api_profile_id.
DATA: ls_mprofile_ids LIKE LINE OF lt_mprofile_ids.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

DATA: ls_teams_list LIKE LINE OF lt_teams_list.

lt_strtab = lcl_application=>upload( p_file ).

LOOP AT lt_strtab INTO ls_strtab.

SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_team_assign-user_id
ls_team_assign-team_id
ls_team_assign-teamleader.

CLEAR ls_user_team.
ls_user_team-user_id = ls_team_assign-user_id.
ls_user_team-team_id = ls_team_assign-team_id.
ls_user_team-teamleader = ls_team_assign-teamleader.
TRANSLATE ls_user_team-teamleader USING 'YXyX1XxXN n 0 '. "Translate to X or space
APPEND ls_user_team TO lt_user_team.

IF lcl_application=>team_is_valid( ls_team_assign-team_id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_team_assign-team_id 'does not yet exist.'
'No user assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

IF lcl_application=>user_is_valid( ls_team_assign-user_id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_team_assign-user_id 'does not yet exist.'
'No user assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

ENDLOOP.

LOOP AT lcl_application=>lt_teams_list INTO ls_teams_list.

REFRESH lt_user_team_temp.
REFRESH lt_tprofile_ids.
REFRESH lt_mprofile_ids.

* Check that there is data for team assignment, otherwise skip
READ TABLE lt_user_team TRANSPORTING NO FIELDS
WITH KEY team_id = ls_teams_list-team_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.

* Get existing team data for this team.
CALL FUNCTION 'UJE_API_GET_TEAMDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_team_id = ls_teams_list-team_id
IMPORTING
et_user_team = lt_user_team_temp
et_tprofile_id = lt_tprofile_ids
et_mprofile_id = lt_mprofile_ids.

* Update with new users.
LOOP AT lt_user_team INTO ls_user_team
WHERE team_id = ls_teams_list-team_id.
MOVE-CORRESPONDING ls_user_team TO ls_user_team_temp.
APPEND ls_user_team_temp TO lt_user_team_temp.
ENDLOOP.

* Keep existing profiles.
REFRESH lt_tprofiles.
LOOP AT lt_tprofile_ids INTO ls_tprofile_ids.
ls_tprofiles-profile_id = ls_tprofile_ids-profile_id.
APPEND ls_tprofiles TO lt_tprofiles.
ENDLOOP.
REFRESH lt_mprofiles.
LOOP AT lt_mprofile_ids INTO ls_mprofile_ids.
ls_mprofiles-profile_id = ls_mprofile_ids-profile_id.
APPEND ls_mprofiles TO lt_mprofiles.
ENDLOOP.

* now update the user/team assignments
CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
is_team = ls_teams_list
i_action = 'M'
it_users = lt_user_team_temp
it_tprofile_id = lt_tprofiles
it_mprofile_id = lt_mprofiles
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_list-team_id 'user assignments'
'have been updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_list-team_id 'user assignments'
'not updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

lcl_application=>render_alv( ).

ENDMETHOD. "import_team_assign_from_file

METHOD export_task_profiles_to_file.

TYPES: BEGIN OF t_output,
identifier TYPE char01, " Row Identifer
profile TYPE uj_profile_id,
values TYPE string,
END OF t_output.

DATA: ls_tprofs LIKE LINE OF lt_tprofs.
DATA: lv_profile TYPE uj_profile_id.

DATA: ls_profile TYPE uje_s_profile.
DATA: lt_role_id TYPE uje_t_api_role_id.
DATA: ls_role_id LIKE LINE OF lt_role_id.

DATA: lt_task_info TYPE uje_t_task_info.
DATA: ls_task_info LIKE LINE OF lt_task_info.

DATA: lt_users_asin TYPE uje_t_api_user_id.
DATA: ls_users_asin LIKE LINE OF lt_users_asin.

DATA: lt_teams_asin TYPE uje_t_api_team_id.
DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

DATA: lt_output TYPE TABLE OF t_output.
DATA: ls_output LIKE LINE OF lt_output.

LOOP AT lcl_application=>lt_tprofs INTO ls_tprofs.

lv_profile = ls_tprofs-profile_id.

* Get relevant data for task profile
CLEAR ls_profile.
REFRESH: lt_role_id, lt_task_info, lt_users_asin, lt_teams_asin.
CALL FUNCTION 'UJE_API_GET_TPROFILEDATA2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_profile_id = lv_profile
IMPORTING
es_profile = ls_profile
et_role_id = lt_role_id
et_task_info = lt_task_info
et_user_id = lt_users_asin
et_team_id = lt_teams_asin.

* Write Header row
CLEAR ls_output.
ls_output-identifier = 'H'.
ls_output-profile = lv_profile.
ls_output-values = ls_profile-description.
APPEND ls_output TO lt_output.

* Write task assigments
CLEAR ls_output.
ls_output-identifier = 'K'.
ls_output-profile = lv_profile.
LOOP AT lt_task_info INTO ls_task_info.
ls_output-values = ls_task_info-task_id.
APPEND ls_output TO lt_output.
ENDLOOP.

* Write role assigments
CLEAR ls_output.
ls_output-identifier = 'R'.
ls_output-profile = lv_profile.
LOOP AT lt_role_id INTO ls_role_id.
ls_output-values = ls_role_id-role_id.
APPEND ls_output TO lt_output.
ENDLOOP.

* Write user assignments
CLEAR ls_output.
ls_output-identifier = 'U'.
ls_output-profile = lv_profile.
LOOP AT lt_users_asin INTO ls_users_asin.
ls_output-values = ls_users_asin-user_id.
APPEND ls_output TO lt_output.
ENDLOOP.

* Write team assignments
CLEAR ls_output.
ls_output-identifier = 'T'.
ls_output-profile = lv_profile.
LOOP AT lt_teams_asin INTO ls_teams_asin.
ls_output-values = ls_teams_asin-team_id.
APPEND ls_output TO lt_output.
ENDLOOP.

ENDLOOP.

* Download table
lcl_application=>download( EXPORTING i_filepath = p_file
it_datatab = lt_output ).

ENDMETHOD. "export_task_profiles_to_file

METHOD import_task_profiles_from_file.

TYPES: BEGIN OF t_input,
identifier TYPE char01, " Row Identifer
profile TYPE uj_profile_id,
values TYPE string,
END OF t_input.

TYPES: BEGIN OF t_task_profile,
profile TYPE uje_s_profile,
roles TYPE uje_t_api_role_id,
task_info TYPE uje_t_task_info,
users_asin TYPE uje_t_api_user_id,
teams_asin TYPE uje_t_api_team_id,
END OF t_task_profile.

DATA: lt_task_profile TYPE TABLE OF t_task_profile.
DATA: ls_task_profile LIKE LINE OF lt_task_profile.

DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_messages TYPE uj0_t_message.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.
DATA: lv_last_profile TYPE uj_profile_id.

DATA: lt_role_id TYPE uje_t_api_role_id.
DATA: ls_role_id LIKE LINE OF lt_role_id.

DATA: lt_task_info TYPE uje_t_task_info.
DATA: ls_task_info LIKE LINE OF lt_task_info.

DATA: lt_users_asin TYPE uje_t_api_user_id.
DATA: ls_users_asin LIKE LINE OF lt_users_asin.

DATA: lt_teams_asin TYPE uje_t_api_team_id.
DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

DATA: lt_input TYPE TABLE OF t_input.
DATA: ls_input LIKE LINE OF lt_input.

DATA: lt_obj_asin TYPE uje_t_profile_asin.
DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

DATA: lt_task_asin TYPE uje_t_task_id_act.
DATA: ls_task_asin LIKE LINE OF lt_task_asin.

* Upload file
lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
LOOP AT lt_strtab INTO ls_strtab.
CLEAR ls_input.
SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
ls_input-profile
ls_input-values.
APPEND ls_input TO lt_input.
ENDLOOP.

* Build profile table containing all associated data
SORT lt_input STABLE ASCENDING BY profile identifier values.

LOOP AT lt_input INTO ls_input.

IF ls_input-profile <> lv_last_profile
AND lv_last_profile IS NOT INITIAL.
APPEND ls_task_profile TO lt_task_profile.
CLEAR ls_task_profile.
ENDIF.

* Based on record identifier
CASE ls_input-identifier.
WHEN 'H'. " Header
ls_task_profile-profile-profile_id = ls_input-profile.
ls_task_profile-profile-description = ls_input-values.
WHEN 'K'. " Task info
SPLIT ls_input-values AT lcl_application=>lv_delimiter INTO ls_task_info-task_id
ls_task_info-description.
IF lcl_application=>task_is_valid( ls_task_info-task_id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Task ID' ls_task_info-task_id 'is not valid.'
'No task profile updates done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.
APPEND ls_task_info TO ls_task_profile-task_info.
WHEN 'R'. " Roles
ls_role_id = ls_input-values.
IF lcl_application=>role_is_valid( ls_role_id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Role ID' ls_role_id 'is not valid.'
'No task profile updates done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.
APPEND ls_role_id TO ls_task_profile-roles.
WHEN 'U'. " Users Assignments
ls_users_asin = ls_input-values.
IF lcl_application=>user_is_valid( ls_users_asin ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_users_asin 'does not exist.'
'No task profile updates done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.
APPEND ls_users_asin TO ls_task_profile-users_asin.
WHEN 'T'. " Team Assignments
ls_teams_asin = ls_input-values.
IF lcl_application=>team_is_valid( ls_teams_asin ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_asin 'does not exist.'
'No task profile updates done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.
APPEND ls_teams_asin TO ls_task_profile-teams_asin.
ENDCASE.

lv_last_profile = ls_input-profile.

AT LAST.
APPEND ls_task_profile TO lt_task_profile.
ENDAT.

ENDLOOP.

* Now for each profile, call API to create/update
LOOP AT lt_task_profile INTO ls_task_profile.

* Determine if the task profile is new, set action accordingly.
IF lcl_application=>tprofile_is_valid( ls_task_profile-profile ) = abap_false.
lv_action = 'I'.
ELSE.
lv_action = 'M'.
ENDIF.

* Move data to API tables
REFRESH lt_obj_asin.
LOOP AT ls_task_profile-roles INTO ls_role_id.
ls_obj_asin-object_id = ls_role_id.
ls_obj_asin-profile_id = ls_task_profile-profile.
ls_obj_asin-object_type = 'R'.
APPEND ls_obj_asin TO lt_obj_asin.
ENDLOOP.
LOOP AT ls_task_profile-users_asin INTO ls_users_asin.
ls_obj_asin-object_id = ls_users_asin.
ls_obj_asin-profile_id = ls_task_profile-profile.
ls_obj_asin-object_type = 'U'.
APPEND ls_obj_asin TO lt_obj_asin.
ENDLOOP.
LOOP AT ls_task_profile-teams_asin INTO ls_teams_asin.
ls_obj_asin-object_id = ls_teams_asin.
ls_obj_asin-profile_id = ls_task_profile-profile.
ls_obj_asin-object_type = 'T'.
APPEND ls_obj_asin TO lt_obj_asin.
ENDLOOP.

REFRESH lt_task_asin.
LOOP AT ls_task_profile-task_info INTO ls_task_info.
ls_task_asin-task_id = ls_task_info-task_id.
APPEND ls_task_asin TO lt_task_asin.
ENDLOOP.

* Call API
CALL FUNCTION 'UJE_API_MANAGE_TPROFILE2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_action = lv_action
is_profile = ls_task_profile-profile
it_obj_asin = lt_obj_asin
it_task_asin = lt_task_asin
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.
IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
'has been created/updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
'not created/updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

* Display ALV
lcl_application=>render_alv( ).

ENDMETHOD. "import_task_profiles_from_file
METHOD Delete_task_profiles_from_file.

TYPES: BEGIN OF t_input,
identifier TYPE char01, " Row Identifer
profile TYPE uj_profile_id,
values TYPE string,
END OF t_input.

TYPES: BEGIN OF t_task_profile,
profile TYPE uje_s_profile,
roles TYPE uje_t_api_role_id,
task_info TYPE uje_t_task_info,
users_asin TYPE uje_t_api_user_id,
teams_asin TYPE uje_t_api_team_id,
END OF t_task_profile.

DATA: lt_task_profile TYPE TABLE OF t_task_profile.
DATA: ls_task_profile LIKE LINE OF lt_task_profile.

DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_messages TYPE uj0_t_message.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.
DATA: lv_last_profile TYPE uj_profile_id.

DATA: lt_role_id TYPE uje_t_api_role_id.
DATA: ls_role_id LIKE LINE OF lt_role_id.

DATA: lt_task_info TYPE uje_t_task_info.
DATA: ls_task_info LIKE LINE OF lt_task_info.

DATA: lt_users_asin TYPE uje_t_api_user_id.
DATA: ls_users_asin LIKE LINE OF lt_users_asin.

DATA: lt_teams_asin TYPE uje_t_api_team_id.
DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

DATA: lt_input TYPE TABLE OF t_input.
DATA: ls_input LIKE LINE OF lt_input.

DATA: lt_obj_asin TYPE uje_t_profile_asin.
DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

DATA: lt_task_asin TYPE uje_t_task_id_act.
DATA: ls_task_asin LIKE LINE OF lt_task_asin.

* Upload file
lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
LOOP AT lt_strtab INTO ls_strtab.
CLEAR ls_input.
SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
ls_input-profile
ls_input-values.
APPEND ls_input TO lt_input.
ENDLOOP.

* Build profile table containing all associated data
SORT lt_input STABLE ASCENDING BY profile identifier values.

LOOP AT lt_input INTO ls_input.

IF ls_input-profile <> lv_last_profile
AND lv_last_profile IS NOT INITIAL.
APPEND ls_task_profile TO lt_task_profile.
CLEAR ls_task_profile.
ENDIF.

* Based on record identifier
CASE ls_input-identifier.
WHEN 'H'. " Header
ls_task_profile-profile-profile_id = ls_input-profile.
ls_task_profile-profile-description = ls_input-values.
ENDCASE.

lv_last_profile = ls_input-profile.

AT LAST.
APPEND ls_task_profile TO lt_task_profile.
ENDAT.

ENDLOOP.

* Now for each profile, call API to create/update
LOOP AT lt_task_profile INTO ls_task_profile.

CALL FUNCTION 'UJE_API_DELETE_PROFILE'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_profile_id = ls_task_profile-profile-profile_id
i_profile_class = 'TSK'
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.


IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
'has been deleted successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
'could not be deleted due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

* Display ALV
lcl_application=>render_alv( ).

ENDMETHOD. "import_task_profiles_from_file

METHOD export_mem_profiles_to_file.

TYPES: BEGIN OF t_output,
identifier TYPE char01, " Row Identifer
profile TYPE uj_profile_id,
values TYPE string,
END OF t_output.

DATA: ls_profile TYPE uje_s_profile.

DATA: lv_profile TYPE uj_profile_id.

DATA: lt_memaccess TYPE uje_t_memaccess.
DATA: ls_memaccess LIKE LINE OF lt_memaccess.

DATA: lt_users_asin TYPE uje_t_api_user_id.
DATA: ls_users_asin LIKE LINE OF lt_users_asin.

DATA: lt_teams_asin TYPE uje_t_api_team_id.
DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

DATA: ls_mprofs LIKE LINE OF lt_mprofs.

DATA: lt_output TYPE TABLE OF t_output.
DATA: ls_output LIKE LINE OF lt_output.

LOOP AT lcl_application=>lt_mprofs INTO ls_mprofs.

lv_profile = ls_mprofs-profile_id.

* Get relevant data for task profile
CLEAR ls_profile.
REFRESH: lt_memaccess, lt_users_asin, lt_teams_asin.

CALL FUNCTION 'UJE_API_GET_MPROFILEDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_profile_id = lv_profile
IMPORTING
es_profile = ls_profile
et_memaccess = lt_memaccess
et_user_id = lt_users_asin
et_team_id = lt_teams_asin.

* Write Header row
CLEAR ls_output.
ls_output-identifier = 'H'.
ls_output-profile = lv_profile.
ls_output-values = ls_profile-description.
APPEND ls_output TO lt_output.

* Write member access
CLEAR ls_output.
ls_output-identifier = 'M'.
ls_output-profile = lv_profile.
LOOP AT lt_memaccess INTO ls_memaccess.
ls_memaccess-profile_id = lv_profile.
CONCATENATE ls_memaccess-dimension
ls_memaccess-application_id
ls_memaccess-member
ls_memaccess-rwd
INTO ls_output-values SEPARATED BY lcl_application=>lv_delimiter.
APPEND ls_output TO lt_output.
ENDLOOP.

* Write user assignments
CLEAR ls_output.
ls_output-identifier = 'U'.
ls_output-profile = lv_profile.
LOOP AT lt_users_asin INTO ls_users_asin.
ls_output-values = ls_users_asin-user_id.
APPEND ls_output TO lt_output.
ENDLOOP.

* Write team assignments
CLEAR ls_output.
ls_output-identifier = 'T'.
ls_output-profile = lv_profile.
LOOP AT lt_teams_asin INTO ls_teams_asin.
ls_output-values = ls_teams_asin-team_id.
APPEND ls_output TO lt_output.
ENDLOOP.

ENDLOOP.

* Download table
lcl_application=>download( EXPORTING i_filepath = p_file
it_datatab = lt_output ).

ENDMETHOD. "export_mem_profiles_to_file

METHOD import_mem_profiles_from_file.

TYPES: BEGIN OF t_input,
identifier TYPE char01, " Row Identifer
profile TYPE uj_profile_id,
values TYPE string,
END OF t_input.

TYPES: BEGIN OF t_memacc_profile,
profile TYPE uje_s_profile,
memacc TYPE uje_t_memaccess,
users_asin TYPE uje_t_api_user_id,
teams_asin TYPE uje_t_api_team_id,
END OF t_memacc_profile.

DATA: lt_memacc_profile TYPE TABLE OF t_memacc_profile.
DATA: ls_memacc_profile LIKE LINE OF lt_memacc_profile.

DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_messages TYPE uj0_t_message.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.
DATA: lv_last_profile TYPE uj_profile_id.

DATA: lt_memaccess TYPE uje_t_memaccess.
DATA: ls_memaccess LIKE LINE OF lt_memaccess.

DATA: lt_users_asin TYPE uje_t_api_user_id.
DATA: ls_users_asin LIKE LINE OF lt_users_asin.

DATA: lt_teams_asin TYPE uje_t_api_team_id.
DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

DATA: lt_input TYPE TABLE OF t_input.
DATA: ls_input LIKE LINE OF lt_input.

DATA: lt_obj_asin TYPE uje_t_profile_asin.
DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

* Upload file
lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
LOOP AT lt_strtab INTO ls_strtab.
CLEAR ls_input.
SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
ls_input-profile
ls_input-values.
APPEND ls_input TO lt_input.
ENDLOOP.

* Build profile table containing all associated data
SORT lt_input STABLE ASCENDING BY profile identifier values.

LOOP AT lt_input INTO ls_input.

IF ls_input-profile <> lv_last_profile
AND lv_last_profile IS NOT INITIAL.
APPEND ls_memacc_profile TO lt_memacc_profile.
CLEAR ls_memacc_profile.
ENDIF.

* Based on record identifier
CASE ls_input-identifier.
WHEN 'H'. " Header
ls_memacc_profile-profile-profile_id = ls_input-profile.
ls_memacc_profile-profile-description = ls_input-values.
WHEN 'M'. " Member Access info
ls_memaccess-profile_id = ls_input-profile.
SPLIT ls_input-values AT lcl_application=>lv_delimiter INTO ls_memaccess-dimension
ls_memaccess-application_id
ls_memaccess-member
ls_memaccess-rwd.

* Check APPLICATION_ID
READ TABLE lcl_application=>lt_appl_info
TRANSPORTING NO FIELDS
WITH KEY application_id = ls_memaccess-application_id.
IF sy-subrc <> 0.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Application ID' ls_memaccess-application_id
'not valid for this Application Set'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
'not created/updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

* Check DIMENSION
READ TABLE lcl_application=>lt_appl_dim
TRANSPORTING NO FIELDS
WITH KEY appl_id = ls_memaccess-application_id
dimension = ls_memaccess-dimension.
IF sy-subrc <> 0.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Dimension' ls_memaccess-dimension
'not valid for Application'
ls_memaccess-application_id
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
CONCATENATE 'Member Access Profile'
ls_memacc_profile-profile-profile_id
'not created/updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

* Check MEMBER
READ TABLE lcl_application=>lt_members
TRANSPORTING NO FIELDS
WITH KEY appl_id = ls_memaccess-application_id
dimension = ls_memaccess-dimension
member = ls_memaccess-member.
IF sy-subrc <> 0 AND ls_memaccess-member <> '[ALL]'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Member' ls_memaccess-member
'not valid for Dimension' ls_memaccess-dimension
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
'not created/updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.
APPEND ls_memaccess TO ls_memacc_profile-memacc.
WHEN 'U'. " Users Assignments
ls_users_asin = ls_input-values.
IF lcl_application=>user_is_valid( ls_users_asin ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_users_asin 'does not exist.'
'No member access profile updates done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.
APPEND ls_users_asin TO ls_memacc_profile-users_asin.
WHEN 'T'. " Team Assignments
ls_teams_asin = ls_input-values.
IF lcl_application=>team_is_valid( ls_teams_asin ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_asin 'does not exist.'
'No member access profile updates done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.
APPEND ls_teams_asin TO ls_memacc_profile-teams_asin.
ENDCASE.

lv_last_profile = ls_input-profile.

AT LAST.
APPEND ls_memacc_profile TO lt_memacc_profile.
ENDAT.

ENDLOOP.

* Now for each profile, call API to create/update
LOOP AT lt_memacc_profile INTO ls_memacc_profile.

* Determine if the task profile is new, set action accordingly.
IF lcl_application=>mprofile_is_valid( ls_memacc_profile-profile ) = abap_false.
lv_action = 'I'.
ELSE.
lv_action = 'M'.
ENDIF.

* Move data to API tables
REFRESH lt_obj_asin.
LOOP AT ls_memacc_profile-users_asin INTO ls_users_asin.
ls_obj_asin-object_id = ls_users_asin.
ls_obj_asin-profile_id = ls_memacc_profile-profile.
ls_obj_asin-object_type = 'U'.
APPEND ls_obj_asin TO lt_obj_asin.
ENDLOOP.
LOOP AT ls_memacc_profile-teams_asin INTO ls_teams_asin.
ls_obj_asin-object_id = ls_teams_asin.
ls_obj_asin-profile_id = ls_memacc_profile-profile.
ls_obj_asin-object_type = 'T'.
APPEND ls_obj_asin TO lt_obj_asin.
ENDLOOP.

* Move member access data to table.
REFRESH lt_memaccess.
LOOP AT ls_memacc_profile-memacc INTO ls_memaccess.
APPEND ls_memaccess TO lt_memaccess.
ENDLOOP.

* Call API
CALL FUNCTION 'UJE_API_MANAGE_MPROFILE2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_action = lv_action
is_profile = ls_memacc_profile-profile
it_memaccess = lt_memaccess
it_obj_asin = lt_obj_asin
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.
IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
'has been created/updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
'not created/updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

* Display ALV
lcl_application=>render_alv( ).

ENDMETHOD. "import_mem_profiles_from_file
METHOD delete_mem_profiles_from_file.

TYPES: BEGIN OF t_input,
identifier TYPE char01, " Row Identifer
profile TYPE uj_profile_id,
values TYPE string,
END OF t_input.

TYPES: BEGIN OF t_memacc_profile,
profile TYPE uje_s_profile,
memacc TYPE uje_t_memaccess,
users_asin TYPE uje_t_api_user_id,
teams_asin TYPE uje_t_api_team_id,
END OF t_memacc_profile.

DATA: lt_memacc_profile TYPE TABLE OF t_memacc_profile.
DATA: ls_memacc_profile LIKE LINE OF lt_memacc_profile.

DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_messages TYPE uj0_t_message.

DATA: lv_action TYPE uj_action.
DATA: lv_success TYPE uj_bool.
DATA: lv_last_profile TYPE uj_profile_id.

DATA: lt_memaccess TYPE uje_t_memaccess.
DATA: ls_memaccess LIKE LINE OF lt_memaccess.

DATA: lt_users_asin TYPE uje_t_api_user_id.
DATA: ls_users_asin LIKE LINE OF lt_users_asin.

DATA: lt_teams_asin TYPE uje_t_api_team_id.
DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

DATA: lt_input TYPE TABLE OF t_input.
DATA: ls_input LIKE LINE OF lt_input.

DATA: lt_obj_asin TYPE uje_t_profile_asin.
DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

* Upload file
lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
LOOP AT lt_strtab INTO ls_strtab.
CLEAR ls_input.
SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
ls_input-profile
ls_input-values.
APPEND ls_input TO lt_input.
ENDLOOP.

* Build profile table containing all associated data
SORT lt_input STABLE ASCENDING BY profile identifier values.

LOOP AT lt_input INTO ls_input.

IF ls_input-profile <> lv_last_profile
AND lv_last_profile IS NOT INITIAL.
APPEND ls_memacc_profile TO lt_memacc_profile.
CLEAR ls_memacc_profile.
ENDIF.

* Based on record identifier
CASE ls_input-identifier.
WHEN 'H'. " Header
ls_memacc_profile-profile-profile_id = ls_input-profile.
ls_memacc_profile-profile-description = ls_input-values.
ENDCASE.

lv_last_profile = ls_input-profile.

AT LAST.
APPEND ls_memacc_profile TO lt_memacc_profile.
ENDAT.

ENDLOOP.

* Now for each profile, call API to create/update
LOOP AT lt_memacc_profile INTO ls_memacc_profile.

*"*"Local Interface:
*" IMPORTING
*" VALUE(I_APPSET_ID) TYPE UJ_APPSET_ID
*" VALUE(IS_USER) TYPE UJ0_S_USER
*" VALUE(I_PROFILE_ID) TYPE UJ_PROFILE_ID
*" VALUE(I_PROFILE_CLASS) TYPE UJ_PROFILE_CLASS
*" EXPORTING
*" VALUE(E_SUCCESS) TYPE UJ_BOOL
*" VALUE(ET_MESSAGE_LINES) TYPE UJ0_T_MESSAGE

* Call API

CALL FUNCTION 'UJE_API_DELETE_PROFILE'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_profile_id = ls_memacc_profile-profile-profile_id
i_profile_class = 'MBR'

IMPORTING
e_success = lv_success
et_message_lines = lt_messages.
IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
'has been deleted successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
'could not be deleted due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

* Display ALV
lcl_application=>render_alv( ).

ENDMETHOD. "delete_mem_profiles_from_file

METHOD export_tap_assign_to_file.

TYPES: BEGIN OF t_output,
identifier TYPE char01, "Identifer, U or T
profile TYPE uj_profile_id,
id TYPE uj_user_id, "User ID or Team ID
END OF t_output.

DATA: ls_tprofs LIKE LINE OF lt_tprofs.
DATA: lv_profile TYPE uj_profile_id.

DATA: lt_user_assign TYPE uje_t_api_user_id.
DATA: ls_user_assign LIKE LINE OF lt_user_assign.

DATA: lt_team_assign TYPE uje_t_api_team_id.
DATA: ls_team_assign LIKE LINE OF lt_team_assign.

DATA: lt_output TYPE TABLE OF t_output.
DATA: ls_output LIKE LINE OF lt_output.

LOOP AT lcl_application=>lt_tprofs INTO ls_tprofs.

lv_profile = ls_tprofs-profile_id.
CALL FUNCTION 'UJE_API_GET_TPROFILEDATA2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_profile_id = lv_profile
IMPORTING
et_user_id = lt_user_assign
et_team_id = lt_team_assign.

LOOP AT lt_user_assign INTO ls_user_assign.
CLEAR ls_output.
ls_output-identifier = 'U'.
ls_output-profile = lv_profile.
ls_output-id = ls_user_assign-user_id.
APPEND ls_output TO lt_output.
ENDLOOP.

LOOP AT lt_team_assign INTO ls_team_assign.
CLEAR ls_output.
ls_output-identifier = 'T'.
ls_output-profile = lv_profile.
ls_output-id = ls_team_assign-team_id.
APPEND ls_output TO lt_output.
ENDLOOP.

ENDLOOP.

* Download table
lcl_application=>download( EXPORTING i_filepath = p_file
it_datatab = lt_output ).

ENDMETHOD. "export_tap_assign_to_file

METHOD import_tap_assign_from_file.

TYPES: BEGIN OF t_input,
identifier TYPE char01, "Identifer, U or T
profile TYPE uj_profile_id,
id TYPE uj_user_id, "User ID or Team ID
END OF t_input.

DATA: lv_success TYPE uj_bool.

DATA: lt_user_team TYPE uje_t_user_team.

DATA: lt_messages TYPE uj0_t_message.
DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_tprofiles TYPE uje_t_profile_id_act.
DATA: ls_tprofiles LIKE LINE OF lt_tprofiles.

DATA: lt_mprofiles TYPE uje_t_profile_id_act.
DATA: ls_mprofiles LIKE LINE OF lt_mprofiles.

DATA: lt_tprofile_ids TYPE uje_t_api_profile_id.

DATA: lt_mprofile_ids TYPE uje_t_api_profile_id.
DATA: ls_mprofile_ids LIKE LINE OF lt_mprofile_ids.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

DATA: ls_teams_list LIKE LINE OF lt_teams_list.
DATA: ls_users_list LIKE LINE OF lt_users_list.

DATA: lt_input TYPE TABLE OF t_input.
DATA: ls_input LIKE LINE OF lt_input.

DATA: lt_user_data TYPE uje_t_user_detail.
DATA: ls_user_data LIKE LINE OF lt_user_data.

lt_strtab = lcl_application=>upload( p_file ).

LOOP AT lt_strtab INTO ls_strtab.

SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
ls_input-profile
ls_input-id.

IF lcl_application=>tprofile_is_valid( ls_input-profile ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Profile' ls_input-profile 'does not yet exist.'
'No task profile assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

CASE ls_input-identifier.

WHEN 'T'.
IF lcl_application=>team_is_valid( ls_input-id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_input-id 'does not yet exist.'
'No task profile assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

WHEN 'U'.
IF lcl_application=>user_is_valid( ls_input-id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_input-id 'does not yet exist.'
'No task profile assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

ENDCASE.

APPEND ls_input TO lt_input.

ENDLOOP.

LOOP AT lcl_application=>lt_users_list INTO ls_users_list.

CALL FUNCTION 'UJE_API_GET_USERDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_user_id = ls_users_list-user_id
IMPORTING
et_user = lt_user_data.

CLEAR ls_user_data.
READ TABLE lt_user_data INTO ls_user_data
WITH KEY user_info-user_id = ls_users_list-user_id.
IF sy-subrc = 0.
lt_user_team = ls_user_data-t_team_id.
lt_tprofiles = ls_user_data-t_tprofile_id.
lt_mprofiles = ls_user_data-t_mprofile_id.
ENDIF.

REFRESH lt_tprofiles.
LOOP AT lt_input INTO ls_input
WHERE identifier = 'U'
AND id = ls_users_list-user_id.
ls_tprofiles-profile_id = ls_input-profile.
APPEND ls_tprofiles TO lt_tprofiles.
ENDLOOP.

IF lt_tprofiles IS INITIAL.
CONTINUE.
ENDIF.

CALL FUNCTION 'UJE_API_MANAGE_USER2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
is_user_info = ls_users_list
i_action = 'M'
it_team_asin = lt_user_team
it_tprofile_id = lt_tprofiles
it_mprofile_id = lt_mprofiles
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_users_list-user_id 'task profile assignments'
'have been updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_users_list-user_id 'task profile assignments'
'not updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

LOOP AT lcl_application=>lt_teams_list INTO ls_teams_list.

REFRESH lt_tprofile_ids.
REFRESH lt_mprofile_ids.

* Get existing team data for this team.
CALL FUNCTION 'UJE_API_GET_TEAMDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_team_id = ls_teams_list-team_id
IMPORTING
et_user_team = lt_user_team
et_tprofile_id = lt_tprofile_ids
et_mprofile_id = lt_mprofile_ids.

REFRESH lt_tprofiles.
LOOP AT lt_input INTO ls_input
WHERE identifier = 'T'
AND id = ls_teams_list-team_id.
ls_tprofiles-profile_id = ls_input-profile.
APPEND ls_tprofiles TO lt_tprofiles.
ENDLOOP.

IF lt_tprofiles IS INITIAL.
CONTINUE.
ENDIF.

* Keep existing member access profiles.
REFRESH lt_mprofiles.
LOOP AT lt_mprofile_ids INTO ls_mprofile_ids.
ls_mprofiles-profile_id = ls_mprofile_ids-profile_id.
APPEND ls_mprofiles TO lt_mprofiles.
ENDLOOP.

CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
is_team = ls_teams_list
i_action = 'M'
it_users = lt_user_team
it_tprofile_id = lt_tprofiles
it_mprofile_id = lt_mprofiles
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_list-team_id 'task profile assignments'
'have been updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_list-team_id 'task profile assignments'
'not updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

lcl_application=>render_alv( ).

ENDMETHOD. "import_tap_assign_from_file

METHOD export_map_assign_to_file.

TYPES: BEGIN OF t_output,
identifier TYPE char01, "Identifer, U or T
profile TYPE uj_profile_id,
id TYPE uj_user_id, "User ID or Team ID
END OF t_output.

DATA: ls_mprofs LIKE LINE OF lt_mprofs.
DATA: lv_profile TYPE uj_profile_id.

DATA: lt_user_assign TYPE uje_t_api_user_id.
DATA: ls_user_assign LIKE LINE OF lt_user_assign.

DATA: lt_team_assign TYPE uje_t_api_team_id.
DATA: ls_team_assign LIKE LINE OF lt_team_assign.

DATA: lt_output TYPE TABLE OF t_output.
DATA: ls_output LIKE LINE OF lt_output.

LOOP AT lcl_application=>lt_mprofs INTO ls_mprofs.

lv_profile = ls_mprofs-profile_id.
CALL FUNCTION 'UJE_API_GET_MPROFILEDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_profile_id = lv_profile
IMPORTING
et_user_id = lt_user_assign
et_team_id = lt_team_assign.

LOOP AT lt_user_assign INTO ls_user_assign.
CLEAR ls_output.
ls_output-identifier = 'U'.
ls_output-profile = lv_profile.
ls_output-id = ls_user_assign-user_id.
APPEND ls_output TO lt_output.
ENDLOOP.

LOOP AT lt_team_assign INTO ls_team_assign.
CLEAR ls_output.
ls_output-identifier = 'T'.
ls_output-profile = lv_profile.
ls_output-id = ls_team_assign-team_id.
APPEND ls_output TO lt_output.
ENDLOOP.

ENDLOOP.

* Download table
lcl_application=>download( EXPORTING i_filepath = p_file
it_datatab = lt_output ).

ENDMETHOD. "export_map_assign_to_file

METHOD import_map_assign_from_file.

TYPES: BEGIN OF t_input,
identifier TYPE char01, "Identifer, U or T
profile TYPE uj_profile_id,
id TYPE uj_user_id, "User ID or Team ID
END OF t_input.

DATA: lv_success TYPE uj_bool.

DATA: lt_user_team TYPE uje_t_user_team.

DATA: lt_messages TYPE uj0_t_message.
DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

DATA: lt_tprofiles TYPE uje_t_profile_id_act.
DATA: ls_tprofiles LIKE LINE OF lt_tprofiles.

DATA: lt_mprofiles TYPE uje_t_profile_id_act.
DATA: ls_mprofiles LIKE LINE OF lt_mprofiles.

DATA: lt_tprofile_ids TYPE uje_t_api_profile_id.
DATA: ls_tprofile_ids LIKE LINE OF lt_tprofile_ids.

DATA: lt_mprofile_ids TYPE uje_t_api_profile_id.

DATA: lt_strtab TYPE stringtab.
DATA: ls_strtab LIKE LINE OF lt_strtab.

DATA: ls_teams_list LIKE LINE OF lt_teams_list.
DATA: ls_users_list LIKE LINE OF lt_users_list.

DATA: lt_input TYPE TABLE OF t_input.
DATA: ls_input LIKE LINE OF lt_input.

DATA: lt_user_data TYPE uje_t_user_detail.
DATA: ls_user_data LIKE LINE OF lt_user_data.

lt_strtab = lcl_application=>upload( p_file ).

LOOP AT lt_strtab INTO ls_strtab.

SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
ls_input-profile
ls_input-id.

IF lcl_application=>mprofile_is_valid( ls_input-profile ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Profile' ls_input-profile 'does not yet exist.'
'No member profile assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

CASE ls_input-identifier.
WHEN 'T'.
IF lcl_application=>team_is_valid( ls_input-id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_input-id 'does not yet exist.'
'No member profile assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

WHEN 'U'.
IF lcl_application=>user_is_valid( ls_input-id ) = abap_false.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_input-id 'does not yet exist.'
'No member profile assigments done.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RETURN.
ENDIF.

ENDCASE.

APPEND ls_input TO lt_input.

ENDLOOP.

LOOP AT lcl_application=>lt_users_list INTO ls_users_list.

* Get Existing data
CALL FUNCTION 'UJE_API_GET_USERDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_user_id = ls_users_list-user_id
IMPORTING
et_user = lt_user_data.

CLEAR ls_user_data.
READ TABLE lt_user_data INTO ls_user_data
WITH KEY user_info-user_id = ls_users_list-user_id.
IF sy-subrc = 0.
lt_user_team = ls_user_data-t_team_id.
lt_tprofiles = ls_user_data-t_tprofile_id.
lt_mprofiles = ls_user_data-t_mprofile_id.
ENDIF.

* Overwrite the member access profile data
REFRESH lt_mprofiles.
LOOP AT lt_input INTO ls_input
WHERE identifier = 'U'
AND id = ls_users_list-user_id.
ls_mprofiles-profile_id = ls_input-profile.
APPEND ls_mprofiles TO lt_mprofiles.
ENDLOOP.

IF lt_mprofiles IS INITIAL.
CONTINUE.
ENDIF.

* Update user
CALL FUNCTION 'UJE_API_MANAGE_USER2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
is_user_info = ls_users_list
i_action = 'M'
it_team_asin = lt_user_team
it_tprofile_id = lt_tprofiles
it_mprofile_id = lt_mprofiles
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_users_list-user_id 'member profile assignments'
'have been updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'User' ls_users_list-user_id 'member profile assignments'
'not updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

LOOP AT lcl_application=>lt_teams_list INTO ls_teams_list.

REFRESH lt_tprofile_ids.
REFRESH lt_mprofile_ids.

* Get existing team data for this team.
CALL FUNCTION 'UJE_API_GET_TEAMDATA'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
i_team_id = ls_teams_list-team_id
IMPORTING
et_user_team = lt_user_team
et_tprofile_id = lt_tprofile_ids
et_mprofile_id = lt_mprofile_ids.

* Overwrite member access profile data
REFRESH lt_mprofiles.
LOOP AT lt_input INTO ls_input
WHERE identifier = 'T'
AND id = ls_teams_list-team_id.
ls_mprofiles-profile_id = ls_input-profile.
APPEND ls_mprofiles TO lt_mprofiles.
ENDLOOP.

IF lt_mprofiles IS INITIAL.
CONTINUE.
ENDIF.

* Keep assigned task profiles
REFRESH lt_tprofiles.
LOOP AT lt_tprofile_ids INTO ls_tprofile_ids.
ls_tprofiles-profile_id = ls_tprofile_ids-profile_id.
APPEND ls_tprofiles TO lt_tprofiles.
ENDLOOP.

* UPdate Team
CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
is_team = ls_teams_list
i_action = 'M'
it_users = lt_user_team
it_tprofile_id = lt_tprofiles
it_mprofile_id = lt_mprofiles
IMPORTING
e_success = lv_success
et_message_lines = lt_messages.

IF lv_success = 'Y'.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'S'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_list-team_id 'member profile assignments'
'have been updated successfully'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ELSE.
APPEND LINES OF lt_messages TO lt_alv_messages.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'Team' ls_teams_list-team_id 'member profile assignments'
'not updated due to error'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
ENDIF.

ENDLOOP.

lcl_application=>render_alv( ).

ENDMETHOD. "import_map_assign_from_file

METHOD set_global_context.

DATA: ls_user TYPE uj0_s_user.
DATA: lv_value TYPE uj_value.

DATA: lo_srv_mgr_dao TYPE REF TO cl_uja3_svrmgr_dao.

* GEt the system admin user id
CREATE OBJECT lo_srv_mgr_dao.
lo_srv_mgr_dao->read_sysadmin_id( IMPORTING e_sysadmin_id = lv_value ).
ls_user-user_id = lv_value.

* Set the context
TRY.
cl_uj_context=>set_cur_context(
EXPORTING i_appset_id = lcl_application=>lv_appset_id
is_user = ls_user ).
CATCH cx_uj_obj_not_found .
ENDTRY.

* Get it
lo_context = cl_uj_context=>get_cur_context( ).
* Set user to system admin
lo_context->switch_to_srvadmin( ).

ENDMETHOD. "set_global_context

METHOD set_delimiter_listbox.

* set delimiter listbox.
DATA: lt_vrm_values TYPE vrm_values.
DATA: ls_vrm_values LIKE LINE OF lt_vrm_values.
DATA: lv_name TYPE vrm_id VALUE 'P_DELMT'.

REFRESH lt_vrm_values.

ls_vrm_values-key = lcl_application=>lc_comma.
ls_vrm_values-text = 'Comma'.
APPEND ls_vrm_values TO lt_vrm_values.

ls_vrm_values-key = lcl_application=>lc_tab.
ls_vrm_values-text = 'Tab'.
APPEND ls_vrm_values TO lt_vrm_values.

ls_vrm_values-key = lcl_application=>lc_pipe.
ls_vrm_values-text = 'Pipe'.
APPEND ls_vrm_values TO lt_vrm_values.

CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = lv_name
values = lt_vrm_values.

ENDMETHOD. "set_delimiter_listbox

METHOD set_delimiter.

IF p_delmt = lcl_application=>lc_tab.
lcl_application=>lv_delimiter = cl_abap_char_utilities=>horizontal_tab.
ELSE.
lcl_application=>lv_delimiter = p_delmt.
ENDIF.

ENDMETHOD. "set_delimiter

METHOD render_alv.

TYPE-POOLS: icon.

TYPES: BEGIN OF t_alv,
icon TYPE icon-id,
msgid TYPE uj0_s_message-msgid,
msgty TYPE uj0_s_message-msgty,
msgno TYPE uj0_s_message-msgno,
message TYPE uj0_s_message-message,
END OF t_alv.

DATA: lt_alv TYPE TABLE OF t_alv.
DATA: lo_table TYPE REF TO cl_salv_table.
DATA: lo_columns TYPE REF TO cl_salv_columns_table.
DATA: lo_column TYPE REF TO cl_salv_column_table.
DATA: lo_functions TYPE REF TO cl_salv_functions.

FIELD-SYMBOLS: <ls_alv> LIKE LINE OF lt_alv,
<ls_alv_messages> LIKE LINE OF lt_alv_messages.

* Convert messages from API to ALV output
LOOP AT lt_alv_messages ASSIGNING <ls_alv_messages>.
APPEND INITIAL LINE TO lt_alv ASSIGNING <ls_alv>.
MOVE-CORRESPONDING <ls_alv_messages> TO <ls_alv>.
CASE <ls_alv>-msgty.
WHEN 'E'. WRITE icon_message_error_small AS ICON TO <ls_alv>-icon.
WHEN 'W'. WRITE icon_message_warning_small AS ICON TO <ls_alv>-icon.
WHEN 'I'. WRITE icon_message_information_small AS ICON TO <ls_alv>-icon.
WHEN 'S'. WRITE icon_checked AS ICON TO <ls_alv>-icon.
ENDCASE.
ENDLOOP.

* Show messages
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_table
CHANGING t_table = lt_alv ).
CATCH cx_salv_msg.
ENDTRY.

lo_functions = lo_table->get_functions( ).
lo_functions->set_all( abap_true ).

TRY.
lo_columns = lo_table->get_columns( ).
lo_column ?= lo_columns->get_column( 'ICON' ).
lo_column->set_icon( abap_true ).
lo_column ?= lo_columns->get_column( 'MSGNO' ).
lo_column->set_leading_zero( abap_true ).
CATCH cx_salv_not_found.
ENDTRY.

lo_table->display( ).

ENDMETHOD. "render_alv

METHOD get_appset_data.

DATA: ls_uja_appl_info TYPE uja_s_appl_info.
DATA: lt_uja_appl_dim TYPE uja_t_appl_dim.
DATA: ls_uja_appl_dim LIKE LINE OF lt_uja_appl_dim.

DATA: ls_members LIKE LINE OF lt_members.
DATA: ls_appl_dim LIKE LINE OF lt_appl_dim.

DATA: lt_appl_list TYPE uja_t_appl_id.
DATA: ls_appl_list LIKE LINE OF lt_appl_list.

DATA: lo_appset_dao TYPE REF TO cl_uja_appset_dao.
DATA: lo_application_dao TYPE REF TO cl_uja_application_dao.
DATA: lo_dim TYPE REF TO cl_uja_dim.

DATA: lt_member_field TYPE uja_t_mbr_field.
DATA: ls_member_field LIKE LINE OF lt_member_field.

DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

lcl_application=>lv_appset_id = i_appset_id.

TRY.

* Get the appset info, need the prefix
CREATE OBJECT lo_appset_dao
EXPORTING
i_appset_id = lcl_application=>lv_appset_id.

lo_appset_dao->get_appset_info(
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
IMPORTING
es_appset_info = lcl_application=>ls_appset_info ).

* Get the list of applications for this appset, need the application prefixes
lo_appset_dao->get_appl_list(
IMPORTING
et_appl_list = lt_appl_list ).

CATCH cx_uj_db_error.
* Do not raise exception here
ENDTRY.

* Check Appset to make sure it is valid
IF lcl_application=>ls_appset_info IS INITIAL.
CLEAR ls_alv_messages.
ls_alv_messages-msgid = '00'.
ls_alv_messages-msgty = 'E'.
ls_alv_messages-msgno = '001'.
CONCATENATE 'AppSet' lcl_application=>lv_appset_id 'does not exist.'
INTO ls_alv_messages-message SEPARATED BY space.
APPEND ls_alv_messages TO lt_alv_messages.
lcl_application=>render_alv( ).
RAISE appset_not_found .
ENDIF.

lcl_application=>set_global_context( ).

* Loop applications, get application info, add to internal table
LOOP AT lt_appl_list INTO ls_appl_list.

TRY.

CREATE OBJECT lo_application_dao
EXPORTING
i_appset_id = lcl_application=>lv_appset_id.

lo_application_dao->get_application_info(
EXPORTING
i_application_id = ls_appl_list
IMPORTING
es_appl_info = ls_uja_appl_info ).

APPEND ls_uja_appl_info TO lcl_application=>lt_appl_info.

* Get dimension list for each application
lo_application_dao->get_dim_list(
EXPORTING
i_application_id = ls_appl_list
IMPORTING
et_appl_dim = lt_uja_appl_dim ).
LOOP AT lt_uja_appl_dim INTO ls_uja_appl_dim.
ls_appl_dim-appl_id = ls_appl_list.
ls_appl_dim-dimension = ls_uja_appl_dim-dimension.
COLLECT ls_appl_dim INTO lcl_application=>lt_appl_dim.
ENDLOOP.

* Get members for each dimension
LOOP AT lt_uja_appl_dim INTO ls_uja_appl_dim.
CREATE OBJECT lo_dim
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
i_dimension = ls_uja_appl_dim-dimension.

REFRESH lt_member_field.
lo_dim->read_dim_mbr_field(
EXPORTING
i_attr_name = 'ID'
f_uppercase = abap_false "<-- Get in correct case
IMPORTING
et_member = lt_member_field ).
LOOP AT lt_member_field INTO ls_member_field.
ls_members-appl_id = ls_appl_list.
ls_members-dimension = ls_uja_appl_dim-dimension.
ls_members-member = ls_member_field-member.
COLLECT ls_members INTO lcl_application=>lt_members.
ENDLOOP.

ENDLOOP.

CATCH: cx_uj_db_error, cx_uja_admin_error, cx_uj_static_check.
* Do not raise exception here
ENDTRY.

ENDLOOP.

CALL FUNCTION 'UJE_API_GET_USERS'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
IMPORTING
et_user = lcl_application=>lt_users_list.

CALL FUNCTION 'UJE_API_GET_TEAMS'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
IMPORTING
et_team = lcl_application=>lt_teams_list.

CALL FUNCTION 'UJE_API_GET_TPROFILES'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
IMPORTING
et_profile_id = lcl_application=>lt_tprofs.

* The interface for this FM has changed in 7.5 SP5 so we need to
* handle for both the old function interface as well as the new.
* Also, handle for 7.5 releases on newer NW stacks(NW 7.3 and higher).
IF ( lv_release = '750' AND lv_splevel >= '0005' )
or ( lv_release >= '753' ).

DATA: ls_mprofs LIKE LINE OF lcl_application=>lt_mprofs.
DATA: ls_mprofs_tmp LIKE LINE OF lcl_application=>lt_mprofs_tmp.
CALL FUNCTION 'UJE_API_GET_MPROFILES'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
IMPORTING
et_profile = lcl_application=>lt_mprofs_tmp.
REFRESH lcl_application=>lt_mprofs.
LOOP AT lt_mprofs_tmp INTO ls_mprofs_tmp.
ls_mprofs-profile_id = ls_mprofs_tmp-profile_id.
APPEND ls_mprofs TO lt_mprofs.
ENDLOOP.

ELSE. " Release 7.0 and release 7.5 <= SP4

CALL FUNCTION 'UJE_API_GET_MPROFILES'
EXPORTING
i_appset_id = lcl_application=>lv_appset_id
is_user = lcl_application=>lo_context->ds_user
IMPORTING
et_profile_id = lcl_application=>lt_mprofs.

ENDIF.

CALL FUNCTION 'UJE_API_GET_ROLE_TSKASG'
IMPORTING
et_taskasgn = lcl_application=>lt_tasks.

CALL FUNCTION 'UJE_API_GET_ROLES'
IMPORTING
et_role = lcl_application=>lt_roles.

ENDMETHOD. "get_supporting_Data

METHOD user_is_valid.

READ TABLE lcl_application=>lt_users_list
TRANSPORTING NO FIELDS
WITH KEY user_id = i_user_id.
IF sy-subrc = 0.
r_boolean = abap_true.
ELSE.
r_boolean = abap_false.
ENDIF.

ENDMETHOD. "user_id_valid


METHOD team_is_valid.

READ TABLE lcl_application=>lt_teams_list
TRANSPORTING NO FIELDS
WITH KEY team_id = i_team_id.
IF sy-subrc = 0.
r_boolean = abap_true.
ELSE.
r_boolean = abap_false.
ENDIF.

ENDMETHOD. "team_id_valid

METHOD tprofile_is_valid.

READ TABLE lcl_application=>lt_tprofs
TRANSPORTING NO FIELDS
WITH KEY profile_id = i_profile_id.
IF sy-subrc = 0.
r_boolean = abap_true.
ELSE.
r_boolean = abap_false.
ENDIF.

ENDMETHOD. "tprofile_is_valid

METHOD mprofile_is_valid.

READ TABLE lcl_application=>lt_mprofs
TRANSPORTING NO FIELDS
WITH KEY profile_id = i_profile_id.
IF sy-subrc = 0.
r_boolean = abap_true.
ELSE.
r_boolean = abap_false.
ENDIF.

ENDMETHOD. "mprofile_is_valid

METHOD role_is_valid.

READ TABLE lcl_application=>lt_roles
TRANSPORTING NO FIELDS
WITH KEY role_id = i_role_id.
IF sy-subrc = 0.
r_boolean = abap_true.
ELSE.
r_boolean = abap_false.
ENDIF.

ENDMETHOD. "role_is_valid
METHOD task_is_valid.

READ TABLE lcl_application=>lt_tasks
TRANSPORTING NO FIELDS
WITH KEY task_id = i_task_id.
IF sy-subrc = 0.
r_boolean = abap_true.
ELSE.
r_boolean = abap_false.
ENDIF.

ENDMETHOD. "task_is_valid

METHOD get_bpc_component_version.

DATA: ls_cvers TYPE cvers.

CALL FUNCTION 'UPG_GET_SINGLE_COMPREL'
EXPORTING
iv_component = `CPMBPC`
IMPORTING
ev_version = ls_cvers
EXCEPTIONS
OTHERS = 4.
IF sy-subrc = 0.
lv_release = ls_cvers-release.
lv_splevel = ls_cvers-extrelease.
ENDIF.

ENDMETHOD. "get_bpc_component_version

ENDCLASS. "lcl_application IMPLEMENTATION

 

 

Note: This ABAP program needs to add text element as below


 


 


 



 

 

 
7 Comments