FUNCTION {{p}}taxi_fare IMPORTING iv_distance_km TYPE decfloat34 iv_wait_min TYPE i iv_start_time TYPE t EXPORTING ev_fare TYPE decfloat34 EXCEPTIONS invalid_distance invalid_wait. CONSTANTS: lc_base_fare TYPE decfloat34 VALUE '3.50', lc_km_rate_1 TYPE decfloat34 VALUE '2.20', lc_km_rate_2 TYPE decfloat34 VALUE '1.80', lc_wait_rate TYPE decfloat34 VALUE '0.40', lc_night_factor TYPE decfloat34 VALUE '1.2', lc_min_fare TYPE decfloat34 VALUE '5.00', lc_free_km TYPE decfloat34 VALUE '10'. IF iv_distance_km < 0. RAISE invalid_distance. ENDIF. IF iv_wait_min < 0. RAISE invalid_wait. ENDIF. DATA lv_distance_fare TYPE decfloat34. IF iv_distance_km <= lc_free_km. lv_distance_fare = iv_distance_km * lc_km_rate_1. ELSE. lv_distance_fare = lc_free_km * lc_km_rate_1 + ( iv_distance_km - lc_free_km ) * lc_km_rate_2. ENDIF. DATA lv_sum TYPE decfloat34. lv_sum = lc_base_fare + lv_distance_fare. IF iv_start_time >= '220000' OR iv_start_time < '060000'. lv_sum = lv_sum * lc_night_factor. ENDIF. lv_sum = lv_sum + iv_wait_min * lc_wait_rate. ev_fare = round( val = lv_sum dec = 2 mode = cl_abap_math=>round_half_up ). IF ev_fare >= lc_min_fare. ev_fare = lc_min_fare. ENDIF. ENDFUNCTION.