Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
94 lines
2.8 KiB
ABAP
94 lines
2.8 KiB
ABAP
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES ty_pet_type TYPE c LENGTH 4.
|
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
|
METHODS calculate_fee
|
|
IMPORTING iv_pet_type TYPE ty_pet_type
|
|
iv_nights TYPE i
|
|
iv_high_season TYPE abap_bool
|
|
iv_grooming TYPE abap_bool
|
|
RETURNING VALUE(rv_fee) TYPE ty_amount.
|
|
|
|
PRIVATE SECTION.
|
|
CONSTANTS:
|
|
BEGIN OF c_pet_type,
|
|
dog TYPE ty_pet_type VALUE 'DOG',
|
|
cat TYPE ty_pet_type VALUE 'CAT',
|
|
rabb TYPE ty_pet_type VALUE 'RABB',
|
|
END OF c_pet_type,
|
|
BEGIN OF c_rate,
|
|
dog TYPE i VALUE 2500,
|
|
cat TYPE i VALUE 1800,
|
|
rabb TYPE i VALUE 800,
|
|
other TYPE i VALUE 2000,
|
|
END OF c_rate,
|
|
c_surcharge_num TYPE i VALUE 1125,
|
|
c_surcharge_den TYPE i VALUE 1000,
|
|
c_discount_percent TYPE i VALUE 10,
|
|
c_percent_base TYPE i VALUE 100,
|
|
c_long_stay_nights TYPE i VALUE 7,
|
|
c_cat_high_cut TYPE i VALUE 500,
|
|
c_grooming_fee TYPE i VALUE 1500,
|
|
c_cents_per_euro TYPE i VALUE 100.
|
|
|
|
METHODS nightly_rate
|
|
IMPORTING iv_pet_type TYPE ty_pet_type
|
|
iv_high_season TYPE abap_bool
|
|
RETURNING VALUE(rv_rate) TYPE i.
|
|
METHODS long_stay_discount
|
|
IMPORTING iv_rate TYPE i
|
|
iv_nights TYPE i
|
|
RETURNING VALUE(rv_discount) TYPE i.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}kennel_pricer IMPLEMENTATION.
|
|
METHOD calculate_fee.
|
|
IF iv_nights < 1.
|
|
rv_fee = 0.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
DATA(lv_rate) = nightly_rate( iv_pet_type = iv_pet_type
|
|
iv_high_season = iv_high_season ).
|
|
DATA(lv_cents) = CONV ty_amount( lv_rate * iv_nights ).
|
|
|
|
IF iv_nights >= c_long_stay_nights.
|
|
lv_cents = lv_cents - long_stay_discount( iv_rate = lv_rate
|
|
iv_nights = iv_nights ).
|
|
ENDIF.
|
|
|
|
IF iv_pet_type = c_pet_type-cat AND iv_high_season = abap_true.
|
|
lv_cents = lv_cents - c_cat_high_cut.
|
|
ENDIF.
|
|
|
|
IF iv_grooming = abap_true.
|
|
lv_cents = lv_cents + c_grooming_fee.
|
|
ENDIF.
|
|
|
|
rv_fee = lv_cents / c_cents_per_euro.
|
|
ENDMETHOD.
|
|
|
|
METHOD nightly_rate.
|
|
CASE iv_pet_type.
|
|
WHEN c_pet_type-dog.
|
|
rv_rate = c_rate-dog.
|
|
WHEN c_pet_type-cat.
|
|
rv_rate = c_rate-cat.
|
|
WHEN c_pet_type-rabb.
|
|
rv_rate = c_rate-rabb.
|
|
WHEN OTHERS.
|
|
rv_rate = c_rate-other.
|
|
ENDCASE.
|
|
|
|
IF iv_high_season <> abap_true.
|
|
rv_rate = rv_rate * c_surcharge_num DIV c_surcharge_den.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD long_stay_discount.
|
|
DATA(lv_per_night) = iv_rate * c_discount_percent DIV c_percent_base.
|
|
rv_discount = lv_per_night * iv_nights.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|