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.