114 lines
3.0 KiB
ABAP
114 lines
3.0 KiB
ABAP
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 AND 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.
|