Files
abap-llm/tasks_gen/train/G1036/spec.md

3.6 KiB

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.