# 1. Goal A tour operator checks a holiday booking before it confirms the booking. The booking desk calls one check method for each booking. The check method reports each problem as a class-based exception. Each exception carries a message and the values that caused the problem. # 2. Open questions None. # 3. Context - Class {{P}}CX_HOLIDAY_ERROR exists in package $TMP. It is active. It is abstract and inherits from cx_static_check. It has the public read-only attribute mv_message TYPE string and a public constructor with the importing parameter iv_message TYPE string. The constructor sets mv_message. - The tour operator offers five destinations. The destination code and the maximum number of travellers of each destination are: ALPS 6, CRETE 4, KYOTO 8, LAPLAND 5, SAFARI 7. - The booking desk passes the booking and the current date to the check method. - A booking has a destination code, a number of travellers, a number of nights, and a departure date. # 4. Contract Create these five classes in package $TMP. Do not change {{P}}CX_HOLIDAY_ERROR. 1. Class {{P}}HOLIDAY_CHECKER - The class is public and final. It has a public constructor without parameters. - Public type ty_dest_code, type string. - Public type ty_booking, a structure with these components: dest_code TYPE ty_dest_code, travellers TYPE i, nights TYPE i, departure TYPE d. - Public method check with this signature: IMPORTING is_booking TYPE ty_booking iv_today TYPE d RAISING {{P}}CX_HOLIDAY_ERROR - Do not add other public methods. 2. Class {{P}}CX_UNKNOWN_DEST - The class is final and inherits from {{P}}CX_HOLIDAY_ERROR. - Public read-only attribute mv_dest TYPE string. - Public constructor with the importing parameter iv_dest TYPE string. - mv_message is 'Destination is not offered'. - mv_dest holds the normalized destination code. The value has no leading or trailing blanks. 3. Class {{P}}CX_BAD_TRAVELLERS - The class is final and inherits from {{P}}CX_HOLIDAY_ERROR. - Public read-only attributes mv_travellers TYPE i and mv_max TYPE i. - Public constructor with the importing parameters iv_travellers TYPE i and iv_max TYPE i. - mv_message is 'Number of travellers is not allowed'. 4. Class {{P}}CX_BAD_NIGHTS - The class is final and inherits from {{P}}CX_HOLIDAY_ERROR. - Public read-only attribute mv_nights TYPE i. - Public constructor with the importing parameter iv_nights TYPE i. - mv_message is 'Number of nights is not allowed'. 5. Class {{P}}CX_BAD_DEPARTURE - The class is final and inherits from {{P}}CX_HOLIDAY_ERROR. - Public read-only attributes mv_departure TYPE d and mv_earliest TYPE d. - Public constructor with the importing parameters iv_departure TYPE d and iv_earliest TYPE d. - mv_message is 'Departure date is too early'. # 5. Business rules The method check applies these rules in this sequence. The method raises the exception of the first rule that fails. If no rule fails, the method returns without an exception. 1. Normalize the destination code: remove all spaces and convert all letters to upper case. 2. The normalized code must be ALPS, CRETE, KYOTO, LAPLAND, or SAFARI. If it is not, raise {{P}}CX_UNKNOWN_DEST. Pass the normalized code in iv_dest. 3. The number of travellers must be 1 or more. It must not be more than the maximum number of travellers of the destination. If a value is not correct, raise {{P}}CX_BAD_TRAVELLERS. Pass the number of travellers in iv_travellers and the maximum of the destination in iv_max. 4. The number of nights must be 2 or more. It must not be more than 28. If a value is not correct, raise {{P}}CX_BAD_NIGHTS. Pass the number of nights in iv_nights. 5. The departure date must be at least 14 days after iv_today. If it is not, raise {{P}}CX_BAD_DEPARTURE. Pass the departure date in iv_departure and the earliest possible date (iv_today plus 14 days) in iv_earliest. # 6. Constraints - Release target: SAP_BASIS 816 (ABAP Platform 2025). - Coding standards: Clean ABAP. Methods below 40 statements. No global variables. No comment that restates the code. - Out of scope: do not change {{P}}CX_HOLIDAY_ERROR. Do not create a database table, a CDS view entity, a function module, or a report. Do not change the signature of check. # 7. Acceptance - All five classes are active and have no syntax error. - The hidden tests pass. - Write your own ABAP Unit tests for {{P}}HOLIDAY_CHECKER.