Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
109 lines
3.7 KiB
ABAP
109 lines
3.7 KiB
ABAP
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
INTERFACES {{p}}if_hotel_rate.
|
|
|
|
PRIVATE SECTION.
|
|
CONSTANTS:
|
|
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
|
|
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
|
|
|
|
METHODS validate
|
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
|
iv_nights TYPE i
|
|
iv_guests TYPE i
|
|
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
|
|
METHODS room_count
|
|
IMPORTING iv_guests TYPE i
|
|
RETURNING VALUE(rv_rooms) TYPE i.
|
|
METHODS nightly_rate
|
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
|
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
|
|
METHODS discount_percent
|
|
IMPORTING iv_nights TYPE i
|
|
RETURNING VALUE(rv_percent) TYPE i.
|
|
METHODS net_room_total
|
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
|
iv_nights TYPE i
|
|
iv_guests TYPE i
|
|
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
|
|
METHODS extras
|
|
IMPORTING iv_nights TYPE i
|
|
iv_guests TYPE i
|
|
iv_breakfast TYPE abap_bool
|
|
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}hotel_rate IMPLEMENTATION.
|
|
METHOD {{p}}if_hotel_rate~calculate.
|
|
rs_result-reason = validate( iv_category = iv_category
|
|
iv_nights = iv_nights
|
|
iv_guests = iv_guests ).
|
|
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
|
|
rs_result-price = 0.
|
|
RETURN.
|
|
ENDIF.
|
|
rs_result-price = net_room_total( iv_category = iv_category
|
|
iv_nights = iv_nights
|
|
iv_guests = iv_guests )
|
|
+ extras( iv_nights = iv_nights
|
|
iv_guests = iv_guests
|
|
iv_breakfast = iv_breakfast ).
|
|
ENDMETHOD.
|
|
|
|
METHOD validate.
|
|
IF iv_nights < 1.
|
|
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
|
|
ELSEIF iv_guests < 1.
|
|
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
|
|
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
|
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
|
|
OR iv_category <> {{p}}if_hotel_rate=>c_category-suite.
|
|
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
|
|
ELSE.
|
|
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD room_count.
|
|
rv_rooms = ( iv_guests + 1 ) DIV 2.
|
|
ENDMETHOD.
|
|
|
|
METHOD nightly_rate.
|
|
CASE iv_category.
|
|
WHEN {{p}}if_hotel_rate=>c_category-basic.
|
|
rv_amount = '90.00'.
|
|
WHEN {{p}}if_hotel_rate=>c_category-comfort.
|
|
rv_amount = '140.00'.
|
|
WHEN {{p}}if_hotel_rate=>c_category-suite.
|
|
rv_amount = '260.00'.
|
|
ENDCASE.
|
|
ENDMETHOD.
|
|
|
|
METHOD discount_percent.
|
|
IF iv_nights >= 28.
|
|
rv_percent = 20.
|
|
ELSEIF iv_nights >= 14.
|
|
rv_percent = 15.
|
|
ELSEIF iv_nights >= 7.
|
|
rv_percent = 10.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD net_room_total.
|
|
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
|
|
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
|
|
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
|
|
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
|
|
rv_total = lv_total - lv_discount.
|
|
ENDMETHOD.
|
|
|
|
METHOD extras.
|
|
DATA(lv_guest_nights) = iv_guests * iv_nights.
|
|
rv_extras = lv_guest_nights * c_city_tax.
|
|
IF iv_breakfast = abap_true.
|
|
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|