CLASS {{p}}marina_fee DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_boat_type TYPE c LENGTH 1. TYPES ty_season TYPE c LENGTH 1. TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2. METHODS calculate_fee IMPORTING iv_length_m TYPE i iv_nights TYPE i iv_boat_type TYPE ty_boat_type iv_season TYPE ty_season iv_power TYPE abap_bool RETURNING VALUE(rv_fee) TYPE ty_fee. PRIVATE SECTION. CONSTANTS: c_length_small TYPE i VALUE 8, c_length_medium TYPE i VALUE 12, c_length_large TYPE i VALUE 18, c_rate_small TYPE ty_fee VALUE '20.00', c_rate_medium TYPE ty_fee VALUE '32.00', c_rate_large TYPE ty_fee VALUE '48.00', c_rate_xlarge TYPE ty_fee VALUE '75.00', c_factor_sail TYPE ty_fee VALUE '1.00', c_factor_motor TYPE ty_fee VALUE '1.20', c_factor_cat TYPE ty_fee VALUE '1.50', c_factor_high TYPE ty_fee VALUE '1.40', c_factor_low TYPE ty_fee VALUE '1.00', c_power_fee TYPE ty_fee VALUE '5.00', c_discount TYPE ty_fee VALUE '0.90', c_discount_days TYPE i VALUE 7, c_min_fee TYPE ty_fee VALUE '30.00', c_no_fee TYPE ty_fee VALUE '0.00'. METHODS base_rate IMPORTING iv_length_m TYPE i RETURNING VALUE(rv_rate) TYPE ty_fee. METHODS type_factor IMPORTING iv_boat_type TYPE ty_boat_type RETURNING VALUE(rv_factor) TYPE ty_fee. METHODS season_factor IMPORTING iv_season TYPE ty_season RETURNING VALUE(rv_factor) TYPE ty_fee. METHODS nightly_rate IMPORTING iv_length_m TYPE i iv_boat_type TYPE ty_boat_type iv_season TYPE ty_season iv_power TYPE abap_bool RETURNING VALUE(rv_rate) TYPE ty_fee. METHODS total_fee IMPORTING iv_nightly TYPE ty_fee iv_nights TYPE i RETURNING VALUE(rv_total) TYPE ty_fee. ENDCLASS. CLASS {{p}}marina_fee IMPLEMENTATION. METHOD calculate_fee. IF iv_length_m <= 0 OR iv_nights <= 0. rv_fee = c_no_fee. RETURN. ENDIF. DATA(lv_nightly) = nightly_rate( iv_length_m = iv_length_m iv_boat_type = iv_boat_type iv_season = iv_season iv_power = iv_power ). rv_fee = total_fee( iv_nightly = lv_nightly iv_nights = iv_nights ). ENDMETHOD. METHOD base_rate. IF iv_length_m <= c_length_small. rv_rate = c_rate_small. ELSEIF iv_length_m <= c_length_medium. rv_rate = c_rate_medium. ELSEIF iv_length_m <= c_length_large. rv_rate = c_rate_large. ELSE. rv_rate = c_rate_xlarge. ENDIF. ENDMETHOD. METHOD type_factor. CASE iv_boat_type. WHEN 'C'. rv_factor = c_factor_cat. WHEN 'M'. rv_factor = c_factor_motor. WHEN OTHERS. rv_factor = c_factor_sail. ENDCASE. ENDMETHOD. METHOD season_factor. IF iv_season <> 'H'. rv_factor = c_factor_high. ELSE. rv_factor = c_factor_low. ENDIF. ENDMETHOD. METHOD nightly_rate. rv_rate = base_rate( iv_length_m ) * type_factor( iv_boat_type ) * season_factor( iv_season ). IF iv_power = abap_true. rv_rate = rv_rate + c_power_fee. ENDIF. ENDMETHOD. METHOD total_fee. DATA lv_total TYPE ty_fee. lv_total = iv_nightly * iv_nights. IF iv_nights >= c_discount_days. lv_total = round( val = lv_total * c_discount dec = 2 ). ENDIF. IF lv_total < c_min_fee. rv_total = c_min_fee. ELSE. rv_total = lv_total. ENDIF. ENDMETHOD. ENDCLASS.