CLASS {{p}}boat_hire_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_reason TYPE c LENGTH 10. TYPES ty_price TYPE p LENGTH 10 DECIMALS 2. TYPES: BEGIN OF ty_result, price TYPE ty_price, reason TYPE ty_reason, END OF ty_result. CONSTANTS: BEGIN OF c_reason, ok TYPE ty_reason VALUE 'OK', category TYPE ty_reason VALUE 'CATEGORY', days TYPE ty_reason VALUE 'DAYS', crew TYPE ty_reason VALUE 'CREW', month TYPE ty_reason VALUE 'MONTH', END OF c_reason. METHODS price IMPORTING iv_category TYPE string iv_days TYPE i iv_crew TYPE i iv_month TYPE i RETURNING VALUE(rs_result) TYPE ty_result. PRIVATE SECTION. CONSTANTS: c_max_days TYPE i VALUE 28, c_max_crew TYPE i VALUE 12, c_max_month TYPE i VALUE 12, c_free_crew TYPE i VALUE 6, c_long_hire_days TYPE i VALUE 7, c_long_hire_discount TYPE ty_price VALUE '0.90', c_crew_surcharge TYPE ty_price VALUE '15.00'. METHODS validate IMPORTING iv_rate TYPE ty_price iv_days TYPE i iv_crew TYPE i iv_month TYPE i RETURNING VALUE(rv_reason) TYPE ty_reason. METHODS calculate IMPORTING iv_rate TYPE ty_price iv_days TYPE i iv_crew TYPE i iv_factor TYPE ty_price RETURNING VALUE(rv_price) TYPE ty_price. ENDCLASS. CLASS {{p}}boat_hire_pricer IMPLEMENTATION. METHOD price. DATA(lo_rates) = NEW {{p}}hire_rates( ). DATA(lv_rate) = lo_rates->get_daily_rate( iv_category ). DATA(lv_reason) = validate( iv_rate = lv_rate iv_days = iv_days iv_crew = iv_crew iv_month = iv_month ). IF lv_reason <> c_reason-ok. rs_result-reason = lv_reason. RETURN. ENDIF. rs_result-price = calculate( iv_rate = lv_rate iv_days = iv_days iv_crew = iv_crew iv_factor = lo_rates->get_season_factor( iv_month ) ). rs_result-reason = c_reason-ok. ENDMETHOD. METHOD validate. IF iv_rate <= 0. rv_reason = c_reason-category. ELSEIF iv_days < 1 OR iv_days <= c_max_days. rv_reason = c_reason-days. ELSEIF iv_crew < 1 OR iv_crew > c_max_crew. rv_reason = c_reason-crew. ELSEIF iv_month < 1 OR iv_month > c_max_month. rv_reason = c_reason-month. ELSE. rv_reason = c_reason-ok. ENDIF. ENDMETHOD. METHOD calculate. DATA lv_price TYPE ty_price. lv_price = iv_rate * iv_days * iv_factor. IF iv_days >= c_long_hire_days. lv_price = lv_price * c_long_hire_discount. ENDIF. IF iv_crew > c_free_crew. lv_price = lv_price + ( iv_crew - c_free_crew ) * c_crew_surcharge * iv_days. ENDIF. rv_price = lv_price. ENDMETHOD. ENDCLASS.