104 lines
3.8 KiB
ABAP
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.
|