CLASS {{p}}escape_checker DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_room TYPE c LENGTH 4. TYPES ty_price TYPE p LENGTH 8 DECIMALS 2. METHODS check_booking IMPORTING iv_room TYPE ty_room iv_players TYPE i iv_youngest_age TYPE i iv_lead_hours TYPE i RETURNING VALUE(rv_price) TYPE ty_price RAISING {{p}}cx_escape_room {{p}}cx_escape_players {{p}}cx_escape_age {{p}}cx_escape_time. PRIVATE SECTION. TYPES: BEGIN OF ty_rule, room_code TYPE ty_room, min_players TYPE i, max_players TYPE i, min_age TYPE i, price_per_player TYPE ty_price, min_lead_hours TYPE i, END OF ty_rule, tt_rule TYPE HASHED TABLE OF ty_rule WITH UNIQUE KEY room_code. METHODS rules RETURNING VALUE(rt_rule) TYPE tt_rule. METHODS find_rule IMPORTING iv_room TYPE ty_room RETURNING VALUE(rs_rule) TYPE ty_rule RAISING {{p}}cx_escape_room. METHODS check_players IMPORTING is_rule TYPE ty_rule iv_players TYPE i RAISING {{p}}cx_escape_players. METHODS check_age IMPORTING is_rule TYPE ty_rule iv_age TYPE i RAISING {{p}}cx_escape_age. METHODS check_lead_hours IMPORTING is_rule TYPE ty_rule iv_lead_hours TYPE i RAISING {{p}}cx_escape_time. METHODS booking_price IMPORTING is_rule TYPE ty_rule iv_players TYPE i RETURNING VALUE(rv_price) TYPE ty_price. ENDCLASS. CLASS {{p}}escape_checker IMPLEMENTATION. METHOD check_booking. DATA(ls_rule) = find_rule( iv_room ). check_players( is_rule = ls_rule iv_players = iv_players ). check_age( is_rule = ls_rule iv_age = iv_youngest_age ). check_lead_hours( is_rule = ls_rule iv_lead_hours = iv_lead_hours ). rv_price = booking_price( is_rule = ls_rule iv_players = iv_players ). ENDMETHOD. METHOD rules. rt_rule = VALUE #( ( room_code = 'MARS' min_players = 2 max_players = 6 min_age = 12 price_per_player = 25 min_lead_hours = 2 ) ( room_code = 'DEEP' min_players = 3 max_players = 8 min_age = 16 price_per_player = 30 min_lead_hours = 4 ) ( room_code = 'JUNG' min_players = 2 max_players = 4 min_age = 8 price_per_player = 22 min_lead_hours = 1 ) ( room_code = 'BANK' min_players = 4 max_players = 10 min_age = 18 price_per_player = 35 min_lead_hours = 6 ) ). ENDMETHOD. METHOD find_rule. DATA lv_room TYPE ty_room. lv_room = to_upper( replace( val = iv_room sub = ` ` with = `` occ = 0 ) ). DATA(lt_rule) = rules( ). READ TABLE lt_rule INTO rs_rule WITH TABLE KEY room_code = lv_room. IF sy-subrc <> 0. RAISE EXCEPTION TYPE {{p}}cx_escape_room EXPORTING iv_text = |Room { iv_room } is not known|. ENDIF. ENDMETHOD. METHOD check_players. IF iv_players < is_rule-min_players. RAISE EXCEPTION TYPE {{p}}cx_escape_players EXPORTING iv_text = 'The group is smaller than the minimum of the room'. ENDIF. IF iv_players > is_rule-max_players. RAISE EXCEPTION TYPE {{p}}cx_escape_players EXPORTING iv_text = 'The group is larger than the maximum of the room'. ENDIF. ENDMETHOD. METHOD check_age. IF iv_age >= is_rule-min_age. RAISE EXCEPTION TYPE {{p}}cx_escape_age EXPORTING iv_text = 'The youngest player is too young for the room'. ENDIF. ENDMETHOD. METHOD check_lead_hours. IF iv_lead_hours < is_rule-min_lead_hours. RAISE EXCEPTION TYPE {{p}}cx_escape_time EXPORTING iv_text = 'The booking is too close to the start of the game'. ENDIF. ENDMETHOD. METHOD booking_price. rv_price = iv_players * is_rule-price_per_player. IF iv_players = is_rule-max_players. rv_price = rv_price * 90 / 100. ENDIF. ENDMETHOD. ENDCLASS.