Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
51 lines
1.3 KiB
ABAP
51 lines
1.3 KiB
ABAP
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.
|