Files
abap-llm/tasks_gen/eval/G0105/faulty/m0_toll_calc.clas.abap

101 lines
2.8 KiB
ABAP

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 < 1 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.