REPORT {{p}}ext_check_old. DATA gv_site TYPE {{p}}exting-site. PARAMETERS: p_from TYPE d OBLIGATORY, p_to TYPE d OBLIGATORY. SELECT-OPTIONS: s_site FOR gv_site. PARAMETERS p_defect AS CHECKBOX. CLASS lcl_check DEFINITION FINAL. PUBLIC SECTION. TYPES ty_state TYPE c LENGTH 7. TYPES ty_urgency TYPE i. TYPES: BEGIN OF ty_line, ext_id TYPE {{p}}exting-ext_id, site TYPE {{p}}exting-site, ext_type TYPE {{p}}exting-ext_type, weight_g TYPE i, pressure_bar TYPE i, state TYPE ty_state, urgency TYPE ty_urgency, END OF ty_line, tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY, tt_site TYPE RANGE OF {{p}}exting-site. METHODS collect IMPORTING iv_from TYPE d iv_to TYPE d it_site TYPE tt_site iv_defect_only TYPE abap_bool RETURNING VALUE(rt_lines) TYPE tt_line. METHODS display CHANGING ct_lines TYPE tt_line. PRIVATE SECTION. TYPES tt_ext TYPE STANDARD TABLE OF {{p}}exting WITH EMPTY KEY. METHODS select_checks IMPORTING iv_from TYPE d iv_to TYPE d it_site TYPE tt_site RETURNING VALUE(rt_ext) TYPE tt_ext. METHODS to_line IMPORTING is_ext TYPE {{p}}exting RETURNING VALUE(rs_line) TYPE ty_line. METHODS state_of IMPORTING is_ext TYPE {{p}}exting RETURNING VALUE(rv_state) TYPE ty_state. METHODS urgency_of IMPORTING is_ext TYPE {{p}}exting RETURNING VALUE(rv_urgency) TYPE ty_urgency. ENDCLASS. CLASS lcl_check IMPLEMENTATION. METHOD collect. DATA lt_lines TYPE tt_line. DATA lt_ext TYPE tt_ext. DATA ls_ext TYPE {{p}}exting. lt_ext = select_checks( iv_from = iv_from iv_to = iv_to it_site = it_site ). LOOP AT lt_ext INTO ls_ext. IF iv_defect_only = abap_true AND urgency_of( ls_ext ) = 4. CONTINUE. ENDIF. APPEND to_line( ls_ext ) TO lt_lines. ENDLOOP. SORT lt_lines BY urgency ASCENDING ext_id ASCENDING. rt_lines = lt_lines. ENDMETHOD. METHOD select_checks. SELECT ext_id, site, ext_type, weight_g, pressure_bar, last_check, next_check FROM {{p}}exting WHERE last_check >= @iv_from AND last_check <= @iv_to AND site IN @it_site INTO TABLE @rt_ext. ENDMETHOD. METHOD to_line. rs_line-ext_id = is_ext-ext_id. rs_line-site = is_ext-site. rs_line-ext_type = is_ext-ext_type. rs_line-weight_g = is_ext-weight_g. rs_line-pressure_bar = is_ext-pressure_bar. rs_line-state = state_of( is_ext ). rs_line-urgency = urgency_of( is_ext ). ENDMETHOD. METHOD state_of. IF is_ext-weight_g < 4000. IF is_ext-ext_type = 'CO2'. rv_state = 'REPLACE'. ELSE. rv_state = 'REFILL'. ENDIF. ELSEIF is_ext-pressure_bar < 10. rv_state = 'SERVICE'. ELSEIF is_ext-next_check - is_ext-last_check < 300. rv_state = 'SHORT'. ELSE. rv_state = 'OK'. ENDIF. ENDMETHOD. METHOD urgency_of. CASE state_of( is_ext ). WHEN 'REPLACE' OR 'REFILL'. rv_urgency = 1. WHEN 'SERVICE'. rv_urgency = 2. WHEN 'SHORT'. rv_urgency = 3. WHEN OTHERS. rv_urgency = 4. ENDCASE. ENDMETHOD. METHOD display. DATA lo_alv TYPE REF TO cl_salv_table. DATA lx_error TYPE REF TO cx_salv_msg. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv CHANGING t_table = ct_lines ). lo_alv->display( ). CATCH cx_salv_msg INTO lx_error. MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'. ENDTRY. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA lv_defect_only TYPE abap_bool. DATA go_check TYPE REF TO lcl_check. DATA gt_lines TYPE lcl_check=>tt_line. IF p_defect = 'X'. lv_defect_only = abap_true. ENDIF. CREATE OBJECT go_check. gt_lines = go_check->collect( iv_from = p_from iv_to = p_to it_site = s_site[] iv_defect_only = lv_defect_only ). go_check->display( CHANGING ct_lines = gt_lines ). CLASS ltc_check 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 states_in_order FOR TESTING. METHODS defect_filter FOR TESTING. METHODS date_range FOR TESTING. ENDCLASS. CLASS ltc_check IMPLEMENTATION. METHOD class_setup. go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}EXTING' ) ) ). DATA lt_ext TYPE STANDARD TABLE OF {{p}}exting WITH EMPTY KEY. lt_ext = VALUE #( ( ext_id = 1 site = 'A' ext_type = 'CO2' weight_g = 3000 pressure_bar = 15 last_check = '20260101' next_check = '20270101' ) ( ext_id = 2 site = 'A' ext_type = 'PW' weight_g = 6000 pressure_bar = 8 last_check = '20260102' next_check = '20270102' ) ( ext_id = 3 site = 'B' ext_type = 'PW' weight_g = 5000 pressure_bar = 12 last_check = '20260103' next_check = '20260120' ) ( ext_id = 4 site = 'B' ext_type = 'PW' weight_g = 5000 pressure_bar = 12 last_check = '20260104' next_check = '20270104' ) ). go_env->insert_test_data( lt_ext ). ENDMETHOD. METHOD class_teardown. go_env->destroy( ). ENDMETHOD. METHOD states_in_order. DATA lo_check TYPE REF TO lcl_check. DATA lt_lines TYPE lcl_check=>tt_line. CREATE OBJECT lo_check. lt_lines = lo_check->collect( iv_from = '20260101' iv_to = '20261231' it_site = VALUE #( ) iv_defect_only = abap_false ). cl_abap_unit_assert=>assert_equals( exp = 4 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 'REPLACE' act = lt_lines[ 1 ]-state ). cl_abap_unit_assert=>assert_equals( exp = 'SERVICE' act = lt_lines[ 2 ]-state ). cl_abap_unit_assert=>assert_equals( exp = 'SHORT' act = lt_lines[ 3 ]-state ). cl_abap_unit_assert=>assert_equals( exp = 'OK' act = lt_lines[ 4 ]-state ). ENDMETHOD. METHOD defect_filter. DATA lo_check TYPE REF TO lcl_check. DATA lt_lines TYPE lcl_check=>tt_line. CREATE OBJECT lo_check. lt_lines = lo_check->collect( iv_from = '20260101' iv_to = '20261231' it_site = VALUE #( ) iv_defect_only = abap_true ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 'SHORT' act = lt_lines[ 3 ]-state ). ENDMETHOD. METHOD date_range. DATA lo_check TYPE REF TO lcl_check. DATA lt_lines TYPE lcl_check=>tt_line. CREATE OBJECT lo_check. lt_lines = lo_check->collect( iv_from = '20260103' iv_to = '20260103' it_site = VALUE #( ) iv_defect_only = abap_false ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lt_lines[ 1 ]-ext_id ). ENDMETHOD. ENDCLASS.