# 1. Goal A riding stable sells riding lessons. A booking program calls the class {{P}}RIDE_BOOKING for each booking request. The class checks the request and returns the price that one rider pays. The class stops the booking with a class-based exception if the request is not correct. # 2. Open questions None. # 3. Context - The interface {{P}}IF_RIDE_BOOKING is in package $TMP. It is active. - The interface has these types: TY_DISCIPLINE (character 4), TY_LEVEL (character 1), TY_REASON (character 10), TY_AMOUNT (packed number, length 8, 2 decimal places). - The interface has these constants: C_DISCIPLINE: DRESSAGE 'DRES', JUMPING 'SHOW', WESTERN 'WEST', VAULTING 'VOLT'. C_LEVEL: BASIC 'B', LIGHT 'L', MEDIUM 'M', ADVANCED 'S'. C_REASON: NAME 'NAME', DISCIPLINE 'DISCIPLINE', LEVEL 'LEVEL', MINUTES 'MINUTES', RIDERS 'RIDERS', SHOW_LEVEL 'SHOW_LEVEL', VOLT_GROUP 'VOLT_GROUP'. - The interface has one method: BOOK IMPORTING iv_rider_name TYPE string iv_discipline TYPE ty_discipline iv_level TYPE ty_level iv_minutes TYPE i iv_riders TYPE i RETURNING VALUE(rv_price) TYPE ty_amount RAISING {{P}}CX_RIDE_INPUT {{P}}CX_RIDE_LIMIT. - The exception classes {{P}}CX_RIDE_BOOKING, {{P}}CX_RIDE_INPUT and {{P}}CX_RIDE_LIMIT are in package $TMP. They are active. - {{P}}CX_RIDE_BOOKING inherits from CX_STATIC_CHECK. It has the type TY_REASON (character 10), the read-only attribute REASON of type TY_REASON and the constructor with the importing parameter IV_REASON of type TY_REASON. - {{P}}CX_RIDE_INPUT and {{P}}CX_RIDE_LIMIT inherit from {{P}}CX_RIDE_BOOKING. They add nothing. # 4. Contract - Create the class {{P}}RIDE_BOOKING in package $TMP. - The class is public, final, and has a public constructor without parameters. - The class implements {{P}}IF_RIDE_BOOKING. - Do not add other public methods. # 5. Business rules Apply the rules in this sequence. Raise the exception of the first rule that fails. 1. If the rider name is empty, raise {{P}}CX_RIDE_INPUT with the reason NAME. 2. The discipline must be DRES, SHOW, WEST or VOLT. Else raise {{P}}CX_RIDE_INPUT with the reason DISCIPLINE. 3. The level must be B, L, M or S. Else raise {{P}}CX_RIDE_INPUT with the reason LEVEL. 4. The number of minutes must be 30, 60, 90 or 120. Else raise {{P}}CX_RIDE_INPUT with the reason MINUTES. 5. The number of riders must be between 1 and 6. Else raise {{P}}CX_RIDE_INPUT with the reason RIDERS. 6. Show jumping (SHOW) is only for the levels M and S. Else raise {{P}}CX_RIDE_LIMIT with the reason SHOW_LEVEL. 7. Vaulting (VOLT) is only for a group lesson with 3 or more riders. Else raise {{P}}CX_RIDE_LIMIT with the reason VOLT_GROUP. 8. Calculate the price that one rider pays: a. The base rate for 30 minutes: DRES 20, SHOW 25, WEST 18, VOLT 15. b. The level surcharge for 30 minutes: B 0, L 2, M 4, S 6. c. The gross price = (base rate + level surcharge) * (minutes / 30). d. The group discount: 1 or 2 riders 0 percent, 3 or 4 riders 20 percent, 5 or 6 riders 40 percent. e. The price = gross price * (100 - group discount) / 100. # 6. Constraints - Release target: SAP_BASIS 816 (ABAP Platform 2025). - Coding standards: Clean ABAP. Method length below 40 statements. No global variables. No comment that restates the code. - Out of scope: do not change {{P}}IF_RIDE_BOOKING, {{P}}CX_RIDE_BOOKING, {{P}}CX_RIDE_INPUT and {{P}}CX_RIDE_LIMIT. # 7. Acceptance - The class is active and has no syntax error. - The hidden tests pass. - Write your own ABAP Unit tests for the class.