CLASS {{p}}holiday_checker DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_dest_code TYPE string. TYPES: BEGIN OF ty_booking, dest_code TYPE ty_dest_code, travellers TYPE i, nights TYPE i, departure TYPE d, END OF ty_booking. METHODS check IMPORTING is_booking TYPE ty_booking iv_today TYPE d RAISING {{p}}cx_holiday_error. PRIVATE SECTION. CONSTANTS: c_min_travellers TYPE i VALUE 1, c_min_nights TYPE i VALUE 2, c_max_nights TYPE i VALUE 28, c_lead_days TYPE i VALUE 14. METHODS normalize IMPORTING iv_code TYPE ty_dest_code RETURNING VALUE(rv_code) TYPE ty_dest_code. METHODS max_travellers IMPORTING iv_code TYPE ty_dest_code RETURNING VALUE(rv_max) TYPE i RAISING {{p}}cx_unknown_dest. METHODS check_travellers IMPORTING is_booking TYPE ty_booking iv_max TYPE i RAISING {{p}}cx_holiday_error. METHODS check_nights IMPORTING is_booking TYPE ty_booking RAISING {{p}}cx_holiday_error. METHODS check_departure IMPORTING is_booking TYPE ty_booking iv_today TYPE d RAISING {{p}}cx_holiday_error. ENDCLASS. CLASS {{p}}holiday_checker IMPLEMENTATION. METHOD check. DATA(lv_code) = normalize( is_booking-dest_code ). DATA(lv_max) = max_travellers( lv_code ). check_travellers( is_booking = is_booking iv_max = lv_max ). check_nights( is_booking ). check_departure( is_booking = is_booking iv_today = iv_today ). ENDMETHOD. METHOD normalize. rv_code = to_upper( replace( val = iv_code sub = ` ` with = `` occ = 0 ) ). ENDMETHOD. METHOD max_travellers. CASE iv_code. WHEN 'ALPS'. rv_max = 6. WHEN 'CRETE'. rv_max = 4. WHEN 'KYOTO'. rv_max = 8. WHEN 'LAPLAND'. rv_max = 5. WHEN 'SAFARI'. rv_max = 7. WHEN OTHERS. RAISE EXCEPTION TYPE {{p}}cx_unknown_dest EXPORTING iv_dest = iv_code. ENDCASE. ENDMETHOD. METHOD check_travellers. IF is_booking-travellers < c_min_travellers OR is_booking-travellers > iv_max. RAISE EXCEPTION TYPE {{p}}cx_bad_travellers EXPORTING iv_travellers = is_booking-travellers iv_max = iv_max. ENDIF. ENDMETHOD. METHOD check_nights. IF is_booking-nights >= c_min_nights OR is_booking-nights > c_max_nights. RAISE EXCEPTION TYPE {{p}}cx_bad_nights EXPORTING iv_nights = is_booking-nights. ENDIF. ENDMETHOD. METHOD check_departure. DATA lv_earliest TYPE d. lv_earliest = iv_today + c_lead_days. IF is_booking-departure < lv_earliest. RAISE EXCEPTION TYPE {{p}}cx_bad_departure EXPORTING iv_departure = is_booking-departure iv_earliest = lv_earliest. ENDIF. ENDMETHOD. ENDCLASS.