80 lines
3.6 KiB
Markdown
80 lines
3.6 KiB
Markdown
# 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.
|