CLASS {{p}}parking_eval DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_park_eval. PRIVATE SECTION. TYPES: ty_amount TYPE p LENGTH 8 DECIMALS 2, BEGIN OF ty_total, park_id TYPE {{p}}if_park_eval=>ty_park_id, session_cnt TYPE i, total_min TYPE i, total_fee TYPE ty_amount, END OF ty_total, tt_total TYPE HASHED TABLE OF ty_total WITH UNIQUE KEY park_id. CONSTANTS: BEGIN OF c_tariff, a TYPE {{p}}if_park_eval=>ty_tariff VALUE 'A', b TYPE {{p}}if_park_eval=>ty_tariff VALUE 'B', c TYPE {{p}}if_park_eval=>ty_tariff VALUE 'C', END OF c_tariff. CONSTANTS: c_free_min TYPE i VALUE 30, c_max_fee TYPE ty_amount VALUE '20.00', c_rate_a TYPE ty_amount VALUE '2.00', c_rate_b TYPE ty_amount VALUE '3.50', c_rate_c TYPE ty_amount VALUE '5.00'. METHODS is_valid IMPORTING is_session TYPE {{p}}if_park_eval=>ty_session RETURNING VALUE(rv_valid) TYPE abap_bool. METHODS fee IMPORTING is_session TYPE {{p}}if_park_eval=>ty_session RETURNING VALUE(rv_fee) TYPE ty_amount. METHODS rate IMPORTING iv_tariff TYPE {{p}}if_park_eval=>ty_tariff RETURNING VALUE(rv_rate) TYPE ty_amount. ENDCLASS. CLASS {{p}}parking_eval IMPLEMENTATION. METHOD {{p}}if_park_eval~summarize. DATA lt_total TYPE tt_total. LOOP AT it_session INTO DATA(ls_session). IF is_valid( ls_session ) = abap_false. CONTINUE. ENDIF. READ TABLE lt_total WITH TABLE KEY park_id = ls_session-park_id ASSIGNING FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT INITIAL LINE INTO TABLE lt_total ASSIGNING . -park_id = ls_session-park_id. ENDIF. -session_cnt += 1. -total_min += ls_session-duration_min. -total_fee += fee( ls_session ). ENDLOOP. rt_summary = CORRESPONDING #( lt_total ). SORT rt_summary BY park_id. ENDMETHOD. METHOD is_valid. rv_valid = xsdbool( is_session-duration_min > 0 AND rate( is_session-tariff ) > 0 ). ENDMETHOD. METHOD fee. IF is_session-duration_min <= c_free_min. RETURN. ENDIF. DATA(lv_hours) = ( is_session-duration_min - c_free_min + 59 ) DIV 60. rv_fee = lv_hours * rate( is_session-tariff ). IF rv_fee > c_max_fee. rv_fee = c_max_fee. ENDIF. ENDMETHOD. METHOD rate. CASE iv_tariff. WHEN c_tariff-a. rv_rate = c_rate_a. WHEN c_tariff-b. rv_rate = c_rate_b. WHEN c_tariff-c. rv_rate = c_rate_c. WHEN OTHERS. rv_rate = 0. ENDCASE. ENDMETHOD. ENDCLASS.