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 AND 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.