CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. METHODS calculate IMPORTING iv_distance_km TYPE decfloat34 iv_weight_class TYPE i iv_axles TYPE i RETURNING VALUE(rv_fee) TYPE decfloat34 RAISING cx_abap_invalid_value. PRIVATE SECTION. CONSTANTS c_percent TYPE decfloat34 VALUE '100'. CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'. CONSTANTS: BEGIN OF c_rate, class_1 TYPE decfloat34 VALUE '0.10', class_2 TYPE decfloat34 VALUE '0.14', class_3 TYPE decfloat34 VALUE '0.18', class_4 TYPE decfloat34 VALUE '0.22', END OF c_rate. CONSTANTS: BEGIN OF c_surcharge, axles_2 TYPE decfloat34 VALUE '0', axles_3 TYPE decfloat34 VALUE '5', axles_4 TYPE decfloat34 VALUE '10', axles_5 TYPE decfloat34 VALUE '15', END OF c_surcharge. METHODS check_input IMPORTING iv_distance_km TYPE decfloat34 iv_weight_class TYPE i iv_axles TYPE i RAISING cx_abap_invalid_value. METHODS base_rate IMPORTING iv_weight_class TYPE i RETURNING VALUE(rv_rate) TYPE decfloat34. METHODS surcharge IMPORTING iv_axles TYPE i RETURNING VALUE(rv_percent) TYPE decfloat34. ENDCLASS. CLASS {{p}}toll_calc IMPLEMENTATION. METHOD calculate. check_input( iv_distance_km = iv_distance_km iv_weight_class = iv_weight_class iv_axles = iv_axles ). DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ). lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent. rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ). IF rv_fee < c_min_fee. rv_fee = c_min_fee. ENDIF. ENDMETHOD. METHOD check_input. IF iv_distance_km < 0. RAISE EXCEPTION NEW cx_abap_invalid_value( ). ENDIF. IF iv_weight_class < 2 OR iv_weight_class > 4. RAISE EXCEPTION NEW cx_abap_invalid_value( ). ENDIF. IF iv_axles < 2 OR iv_axles > 5. RAISE EXCEPTION NEW cx_abap_invalid_value( ). ENDIF. ENDMETHOD. METHOD base_rate. CASE iv_weight_class. WHEN 1. rv_rate = c_rate-class_1. WHEN 2. rv_rate = c_rate-class_2. WHEN 3. rv_rate = c_rate-class_3. WHEN 4. rv_rate = c_rate-class_4. WHEN OTHERS. rv_rate = 0. ENDCASE. ENDMETHOD. METHOD surcharge. CASE iv_axles. WHEN 2. rv_percent = c_surcharge-axles_2. WHEN 3. rv_percent = c_surcharge-axles_3. WHEN 4. rv_percent = c_surcharge-axles_4. WHEN 5. rv_percent = c_surcharge-axles_5. WHEN OTHERS. rv_percent = 0. ENDCASE. ENDMETHOD. ENDCLASS.