REPORT {{p}}helpdesk_old. DATA gv_team TYPE {{p}}ticket-team. PARAMETERS p_from TYPE d OBLIGATORY. PARAMETERS p_to TYPE d OBLIGATORY. SELECT-OPTIONS s_team FOR gv_team. CLASS lcl_report DEFINITION FINAL. PUBLIC SECTION. TYPES: BEGIN OF ty_line, team TYPE {{p}}ticket-team, tickets TYPE i, urgent TYPE i, END OF ty_line, tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY, tt_team TYPE RANGE OF {{p}}ticket-team. TYPES: BEGIN OF ty_group, team TYPE {{p}}ticket-team, priority TYPE {{p}}ticket-priority, cnt TYPE i, END OF ty_group, tt_group TYPE STANDARD TABLE OF ty_group WITH EMPTY KEY. METHODS select_teams IMPORTING iv_from TYPE d iv_to TYPE d it_team TYPE tt_team RETURNING VALUE(rt_line) TYPE tt_line. METHODS display CHANGING ct_line TYPE tt_line. ENDCLASS. CLASS lcl_report IMPLEMENTATION. METHOD select_teams. SELECT team, priority, COUNT(*) AS cnt FROM {{p}}ticket WHERE opened_on >= @iv_from AND opened_on <= @iv_to AND team IN @it_team GROUP BY team, priority INTO TABLE @DATA(lt_group). SORT lt_group BY team. DATA ls_line TYPE ty_line. DATA lv_first TYPE abap_bool VALUE abap_true. LOOP AT lt_group INTO DATA(ls_group). IF lv_first = abap_false AND ls_line-team <> ls_group-team. APPEND ls_line TO rt_line. CLEAR ls_line. ENDIF. lv_first = abap_false. ls_line-team = ls_group-team. ls_line-tickets = ls_line-tickets + ls_group-cnt. IF ls_group-priority = '1' OR ls_group-priority = '2'. ls_line-urgent = ls_line-urgent + ls_group-cnt. ENDIF. ENDLOOP. IF lv_first = abap_false. APPEND ls_line TO rt_line. ENDIF. SORT rt_line BY tickets DESCENDING team ASCENDING. ENDMETHOD. METHOD display. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv) CHANGING t_table = ct_line ). lo_alv->display( ). CATCH cx_salv_msg INTO DATA(lx_error). MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'. ENDTRY. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA(go_report) = NEW lcl_report( ). DATA(gt_line) = go_report->select_teams( iv_from = p_from iv_to = p_to it_team = s_team[] ). go_report->display( CHANGING ct_line = gt_line ). CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. CLASS-DATA go_env TYPE REF TO if_osql_test_environment. CLASS-METHODS class_setup. CLASS-METHODS class_teardown. METHODS setup. METHODS counts_per_team FOR TESTING. METHODS urgent_rule FOR TESTING. METHODS date_filter FOR TESTING. METHODS team_filter FOR TESTING. METHODS sorted_by_tickets FOR TESTING. ENDCLASS. CLASS ltc_report IMPLEMENTATION. METHOD class_setup. go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}TICKET' ) ) ). ENDMETHOD. METHOD class_teardown. go_env->destroy( ). ENDMETHOD. METHOD setup. go_env->clear_doubles( ). DATA lt_ticket TYPE STANDARD TABLE OF {{p}}ticket WITH EMPTY KEY. lt_ticket = VALUE #( ( ticket_id = 1 team = 'A' priority = '1' opened_on = '20260105' ) ( ticket_id = 2 team = 'A' priority = '3' opened_on = '20260110' ) ( ticket_id = 3 team = 'B' priority = '1' opened_on = '20260107' ) ( ticket_id = 4 team = 'B' priority = '1' opened_on = '20260108' ) ( ticket_id = 5 team = 'B' priority = '4' opened_on = '20260109' ) ( ticket_id = 6 team = 'C' priority = '2' opened_on = '20260201' ) ). go_env->insert_test_data( lt_ticket ). ENDMETHOD. METHOD counts_per_team. DATA(lt_line) = NEW lcl_report( )->select_teams( iv_from = '20260101' iv_to = '20260131' it_team = VALUE #( ) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_line ) ). cl_abap_unit_assert=>assert_equals( exp = 'B' act = lt_line[ 1 ]-team ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lt_line[ 1 ]-tickets ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 1 ]-urgent ). ENDMETHOD. METHOD urgent_rule. DATA(lt_line) = NEW lcl_report( )->select_teams( iv_from = '20260201' iv_to = '20260228' it_team = VALUE #( ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_line ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 1 ]-tickets ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 1 ]-urgent ). ENDMETHOD. METHOD date_filter. DATA(lt_line) = NEW lcl_report( )->select_teams( iv_from = '20260109' iv_to = '20260109' it_team = VALUE #( ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_line ) ). cl_abap_unit_assert=>assert_equals( exp = 'B' act = lt_line[ 1 ]-team ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 1 ]-tickets ). ENDMETHOD. METHOD team_filter. DATA(lt_line) = NEW lcl_report( )->select_teams( iv_from = '20260101' iv_to = '20260131' it_team = VALUE #( ( sign = 'I' option = 'EQ' low = 'A' ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_line ) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 1 ]-tickets ). ENDMETHOD. METHOD sorted_by_tickets. DATA(lt_line) = NEW lcl_report( )->select_teams( iv_from = '20260101' iv_to = '20260131' it_team = VALUE #( ) ). cl_abap_unit_assert=>assert_equals( exp = 'B' act = lt_line[ 1 ]-team ). cl_abap_unit_assert=>assert_equals( exp = 'A' act = lt_line[ 2 ]-team ). ENDMETHOD. ENDCLASS.