Files
abap-llm/tasks_gen/train/G1063/reference/toll_pricer.clas.abap
2026-10-05 18:02:52 +02:00

104 lines
3.8 KiB
ABAP

CLASS {{p}}toll_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_toll_pricer.
METHODS constructor.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_rate,
vehicle_class TYPE {{p}}if_toll_pricer=>ty_class,
cents_per_km TYPE {{p}}if_toll_pricer=>ty_cents,
END OF ty_rate,
tt_rate TYPE HASHED TABLE OF ty_rate WITH UNIQUE KEY vehicle_class.
CONSTANTS:
c_min_toll TYPE {{p}}if_toll_pricer=>ty_cents VALUE 100,
c_max_km TYPE i VALUE 130,
c_discount TYPE i VALUE 10,
c_night_div TYPE i VALUE 4.
DATA mt_rate TYPE tt_rate.
METHODS fill_rates
RETURNING VALUE(rt_rate) TYPE tt_rate.
METHODS validate
IMPORTING is_journey TYPE {{p}}if_toll_pricer=>ty_journey
RETURNING VALUE(rv_reason) TYPE {{p}}if_toll_pricer=>ty_reason.
METHODS base_toll
IMPORTING is_journey TYPE {{p}}if_toll_pricer=>ty_journey
RETURNING VALUE(rv_amount) TYPE {{p}}if_toll_pricer=>ty_cents.
METHODS apply_discount
IMPORTING iv_amount TYPE {{p}}if_toll_pricer=>ty_cents
iv_has_transponder TYPE abap_bool
RETURNING VALUE(rv_amount) TYPE {{p}}if_toll_pricer=>ty_cents.
METHODS apply_night_surcharge
IMPORTING iv_amount TYPE {{p}}if_toll_pricer=>ty_cents
is_journey TYPE {{p}}if_toll_pricer=>ty_journey
RETURNING VALUE(rv_amount) TYPE {{p}}if_toll_pricer=>ty_cents.
ENDCLASS.
CLASS {{p}}toll_pricer IMPLEMENTATION.
METHOD constructor.
mt_rate = fill_rates( ).
ENDMETHOD.
METHOD {{p}}if_toll_pricer~price_journey.
rs_result-reason = validate( is_journey ).
IF rs_result-reason <> {{p}}if_toll_pricer=>c_reason-ok.
RETURN.
ENDIF.
DATA(lv_amount) = base_toll( is_journey ).
lv_amount = apply_discount( iv_amount = lv_amount
iv_has_transponder = is_journey-has_transponder ).
lv_amount = apply_night_surcharge( iv_amount = lv_amount
is_journey = is_journey ).
rs_result-amount_cents = lv_amount.
ENDMETHOD.
METHOD fill_rates.
rt_rate = VALUE #( ( vehicle_class = {{p}}if_toll_pricer=>c_class-motorcycle cents_per_km = 5 )
( vehicle_class = {{p}}if_toll_pricer=>c_class-car cents_per_km = 10 )
( vehicle_class = {{p}}if_toll_pricer=>c_class-van cents_per_km = 18 )
( vehicle_class = {{p}}if_toll_pricer=>c_class-lorry cents_per_km = 30 ) ).
ENDMETHOD.
METHOD validate.
DATA lv_class TYPE {{p}}if_toll_pricer=>ty_class.
lv_class = to_upper( is_journey-vehicle_class ).
IF NOT line_exists( mt_rate[ vehicle_class = lv_class ] ).
rv_reason = {{p}}if_toll_pricer=>c_reason-vehicle.
ELSEIF is_journey-distance_km < 1 OR is_journey-distance_km > c_max_km.
rv_reason = {{p}}if_toll_pricer=>c_reason-distance.
ELSE.
rv_reason = {{p}}if_toll_pricer=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD base_toll.
DATA lv_class TYPE {{p}}if_toll_pricer=>ty_class.
lv_class = to_upper( is_journey-vehicle_class ).
DATA(lv_rate) = mt_rate[ vehicle_class = lv_class ]-cents_per_km.
rv_amount = is_journey-distance_km * lv_rate.
IF rv_amount < c_min_toll.
rv_amount = c_min_toll.
ENDIF.
ENDMETHOD.
METHOD apply_discount.
rv_amount = iv_amount.
IF iv_has_transponder = abap_true.
rv_amount = iv_amount - iv_amount DIV c_discount.
ENDIF.
ENDMETHOD.
METHOD apply_night_surcharge.
DATA lv_class TYPE {{p}}if_toll_pricer=>ty_class.
lv_class = to_upper( is_journey-vehicle_class ).
rv_amount = iv_amount.
IF is_journey-at_night = abap_true AND lv_class = {{p}}if_toll_pricer=>c_class-lorry.
rv_amount = iv_amount + iv_amount DIV c_night_div.
ENDIF.
ENDMETHOD.
ENDCLASS.