Files
abap-llm/tasks_gen/eval/G0139/faulty/m1_marina_fee.clas.abap

123 lines
3.7 KiB
ABAP

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.