CLASS {{p}}heli_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. METHODS calculate IMPORTING iv_tour_type TYPE string iv_passengers TYPE i iv_minutes TYPE i iv_member TYPE abap_bool EXPORTING ev_skip TYPE abap_bool ev_fee TYPE decfloat34 RAISING {{p}}cx_heli_invalid. PRIVATE SECTION. CONSTANTS: c_rate_scenic TYPE decfloat34 VALUE '8', c_rate_training TYPE decfloat34 VALUE '12', c_pax_surcharge TYPE decfloat34 VALUE '15', c_member_rate TYPE decfloat34 VALUE '0.875', c_min_fee TYPE decfloat34 VALUE '50', c_max_fee TYPE decfloat34 VALUE '1500', c_max_pax TYPE i VALUE 6, c_min_minutes TYPE i VALUE 5. METHODS check_input IMPORTING iv_passengers TYPE i iv_minutes TYPE i RAISING {{p}}cx_heli_invalid. METHODS scenic_fee IMPORTING iv_passengers TYPE i iv_minutes TYPE i iv_member TYPE abap_bool RETURNING VALUE(rv_fee) TYPE decfloat34. METHODS round_fee IMPORTING iv_fee TYPE decfloat34 RETURNING VALUE(rv_fee) TYPE decfloat34. METHODS apply_limits IMPORTING iv_fee TYPE decfloat34 RETURNING VALUE(rv_fee) TYPE decfloat34. ENDCLASS. CLASS {{p}}heli_pricer IMPLEMENTATION. METHOD calculate. check_input( iv_passengers = iv_passengers iv_minutes = iv_minutes ). ev_skip = abap_false. CASE iv_tour_type. WHEN 'SC'. ev_fee = apply_limits( round_fee( scenic_fee( iv_passengers = iv_passengers iv_minutes = iv_minutes iv_member = iv_member ) ) ). WHEN 'TR'. ev_fee = apply_limits( round_fee( CONV decfloat34( iv_minutes ) * c_rate_training ) ). WHEN 'CH'. ev_skip = abap_true. WHEN OTHERS. ev_fee = 0. ENDCASE. ENDMETHOD. METHOD check_input. IF iv_passengers < 1 OR iv_passengers > c_max_pax. RAISE EXCEPTION TYPE {{p}}cx_heli_invalid EXPORTING iv_reason = {{p}}cx_heli_invalid=>co_reason-passengers. ENDIF. IF iv_minutes < c_min_minutes. RAISE EXCEPTION TYPE {{p}}cx_heli_invalid EXPORTING iv_reason = {{p}}cx_heli_invalid=>co_reason-minutes. ENDIF. ENDMETHOD. METHOD scenic_fee. rv_fee = CONV decfloat34( iv_minutes ) * c_rate_scenic + CONV decfloat34( iv_passengers ) * c_pax_surcharge. IF iv_member = abap_true. rv_fee = rv_fee * c_member_rate. ENDIF. ENDMETHOD. METHOD round_fee. rv_fee = round( val = iv_fee dec = 2 mode = cl_abap_math=>round_half_up ). ENDMETHOD. METHOD apply_limits. rv_fee = iv_fee. IF rv_fee < c_min_fee. rv_fee = c_min_fee. ELSEIF rv_fee > c_max_fee. rv_fee = c_max_fee. ENDIF. ENDMETHOD. ENDCLASS.