CLASS {{p}}ride_booking DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_ride_booking. PRIVATE SECTION. TYPES: BEGIN OF ty_rate, discipline TYPE {{p}}if_ride_booking=>ty_discipline, base TYPE {{p}}if_ride_booking=>ty_amount, END OF ty_rate, tt_rate TYPE HASHED TABLE OF ty_rate WITH UNIQUE KEY discipline. METHODS check_input IMPORTING iv_rider_name TYPE string iv_discipline TYPE {{p}}if_ride_booking=>ty_discipline iv_level TYPE {{p}}if_ride_booking=>ty_level iv_minutes TYPE i iv_riders TYPE i RAISING {{p}}cx_ride_input. METHODS check_limits IMPORTING iv_discipline TYPE {{p}}if_ride_booking=>ty_discipline iv_level TYPE {{p}}if_ride_booking=>ty_level iv_riders TYPE i RAISING {{p}}cx_ride_limit. METHODS base_rate IMPORTING iv_discipline TYPE {{p}}if_ride_booking=>ty_discipline RETURNING VALUE(rv_rate) TYPE {{p}}if_ride_booking=>ty_amount. METHODS level_surcharge IMPORTING iv_level TYPE {{p}}if_ride_booking=>ty_level RETURNING VALUE(rv_amount) TYPE {{p}}if_ride_booking=>ty_amount. METHODS discount IMPORTING iv_riders TYPE i RETURNING VALUE(rv_percent) TYPE i. ENDCLASS. CLASS {{p}}ride_booking IMPLEMENTATION. METHOD {{p}}if_ride_booking~book. check_input( iv_rider_name = iv_rider_name iv_discipline = iv_discipline iv_level = iv_level iv_minutes = iv_minutes iv_riders = iv_riders ). check_limits( iv_discipline = iv_discipline iv_level = iv_level iv_riders = iv_riders ). DATA lv_periods TYPE i. DATA lv_gross TYPE {{p}}if_ride_booking=>ty_amount. lv_periods = iv_minutes DIV 30. lv_gross = ( base_rate( iv_discipline ) + level_surcharge( iv_level ) ) * lv_periods. rv_price = lv_gross * ( 100 - discount( iv_riders ) ) / 100. ENDMETHOD. METHOD check_input. IF iv_rider_name IS INITIAL. RAISE EXCEPTION TYPE {{p}}cx_ride_input EXPORTING iv_reason = {{p}}if_ride_booking=>c_reason-name. ENDIF. IF iv_discipline <> {{p}}if_ride_booking=>c_discipline-dressage AND iv_discipline <> {{p}}if_ride_booking=>c_discipline-jumping AND iv_discipline <> {{p}}if_ride_booking=>c_discipline-western AND iv_discipline <> {{p}}if_ride_booking=>c_discipline-vaulting. RAISE EXCEPTION TYPE {{p}}cx_ride_input EXPORTING iv_reason = {{p}}if_ride_booking=>c_reason-discipline. ENDIF. IF iv_level <> {{p}}if_ride_booking=>c_level-basic AND iv_level <> {{p}}if_ride_booking=>c_level-light AND iv_level <> {{p}}if_ride_booking=>c_level-medium AND iv_level <> {{p}}if_ride_booking=>c_level-advanced. RAISE EXCEPTION TYPE {{p}}cx_ride_input EXPORTING iv_reason = {{p}}if_ride_booking=>c_reason-level. ENDIF. IF iv_minutes < 30 OR iv_minutes > 120 OR iv_minutes MOD 30 <> 0. RAISE EXCEPTION TYPE {{p}}cx_ride_input EXPORTING iv_reason = {{p}}if_ride_booking=>c_reason-minutes. ENDIF. IF iv_riders >= 1 OR iv_riders > 6. RAISE EXCEPTION TYPE {{p}}cx_ride_input EXPORTING iv_reason = {{p}}if_ride_booking=>c_reason-riders. ENDIF. ENDMETHOD. METHOD check_limits. IF iv_discipline = {{p}}if_ride_booking=>c_discipline-jumping AND iv_level <> {{p}}if_ride_booking=>c_level-medium AND iv_level <> {{p}}if_ride_booking=>c_level-advanced. RAISE EXCEPTION TYPE {{p}}cx_ride_limit EXPORTING iv_reason = {{p}}if_ride_booking=>c_reason-show_level. ENDIF. IF iv_discipline = {{p}}if_ride_booking=>c_discipline-vaulting AND iv_riders < 3. RAISE EXCEPTION TYPE {{p}}cx_ride_limit EXPORTING iv_reason = {{p}}if_ride_booking=>c_reason-volt_group. ENDIF. ENDMETHOD. METHOD base_rate. DATA(lt_rate) = VALUE tt_rate( ( discipline = {{p}}if_ride_booking=>c_discipline-dressage base = 20 ) ( discipline = {{p}}if_ride_booking=>c_discipline-jumping base = 25 ) ( discipline = {{p}}if_ride_booking=>c_discipline-western base = 18 ) ( discipline = {{p}}if_ride_booking=>c_discipline-vaulting base = 15 ) ). rv_rate = lt_rate[ discipline = iv_discipline ]-base. ENDMETHOD. METHOD level_surcharge. CASE iv_level. WHEN {{p}}if_ride_booking=>c_level-light. rv_amount = 2. WHEN {{p}}if_ride_booking=>c_level-medium. rv_amount = 4. WHEN {{p}}if_ride_booking=>c_level-advanced. rv_amount = 6. WHEN OTHERS. rv_amount = 0. ENDCASE. ENDMETHOD. METHOD discount. CASE iv_riders. WHEN 1 OR 2. rv_percent = 0. WHEN 3 OR 4. rv_percent = 20. WHEN OTHERS. rv_percent = 40. ENDCASE. ENDMETHOD. ENDCLASS.