Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
123 lines
3.7 KiB
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.
|