81 lines
3.3 KiB
Markdown
81 lines
3.3 KiB
Markdown
# 1. Goal
|
|
|
|
A photo studio prices a photo shoot. A booking program calls the calculation
|
|
before it shows the quote to the customer. The program needs the fee parts and
|
|
the total fee.
|
|
|
|
# 2. Open questions
|
|
|
|
None.
|
|
|
|
# 3. Context
|
|
|
|
- The class {{P}}PHOTO_PRICER does not exist. Create it in package $TMP.
|
|
- The booking program uses the public types, the public constants and the
|
|
public method of the class. It does not use other parts of the class.
|
|
|
|
# 4. Contract
|
|
|
|
- Create the class {{P}}PHOTO_PRICER in package $TMP.
|
|
- The class is public and final. It has a public constructor without parameters.
|
|
- The class has these public types:
|
|
- ty_session: type c, length 7.
|
|
- ty_reason: type c, length 8.
|
|
- ty_amount: type p, length 8, 2 decimal places.
|
|
- ty_request: a structure with the components session (ty_session),
|
|
minutes (i), persons (i), photos (i) and distance_km (i).
|
|
- ty_quote: a structure with the components time_fee (ty_amount),
|
|
person_fee (ty_amount), photo_fee (ty_amount), travel_fee (ty_amount),
|
|
crew_fee (ty_amount), total (ty_amount) and reason (ty_reason).
|
|
- The class has these public constants:
|
|
- c_session with the components studio = 'STUDIO' and outdoor = 'OUTDOOR'.
|
|
Both components have the type ty_session.
|
|
- c_reason with the components ok = 'OK', session = 'SESSION',
|
|
minutes = 'MINUTES', persons = 'PERSONS', photos = 'PHOTOS' and
|
|
distance = 'DISTANCE'. All components have the type ty_reason.
|
|
- The class has one public method:
|
|
calculate
|
|
IMPORTING is_request TYPE ty_request
|
|
RETURNING VALUE(rs_quote) TYPE ty_quote.
|
|
- Do not add other public methods.
|
|
|
|
# 5. Business rules
|
|
|
|
First check the input. Apply the checks in this sequence. If a check fails, set
|
|
rs_quote-reason to the reason of that check, keep all fee components and the
|
|
total at 0, and stop.
|
|
|
|
1. is_request-session must be STUDIO or OUTDOOR. Else reason = SESSION.
|
|
2. is_request-minutes must be 30 or more and 480 or less. Else reason = MINUTES.
|
|
3. is_request-persons must be 1 or more and 20 or less. Else reason = PERSONS.
|
|
4. is_request-photos must be 0 or more and 200 or less. Else reason = PHOTOS.
|
|
5. If the session is OUTDOOR, is_request-distance_km must be 1 or more. Else
|
|
reason = DISTANCE. For a STUDIO session, ignore distance_km.
|
|
|
|
If all checks pass, set reason = OK and calculate the fees.
|
|
|
|
- time_fee: each started 15 minutes of the shoot costs 20.00. Example: 30
|
|
minutes cost 40.00. 31 minutes cost 60.00. 480 minutes cost 640.00.
|
|
- person_fee: the first 2 persons are free. Each other person costs 10.00.
|
|
- photo_fee: if photos is less than 50, each photo costs 5.00. If photos is 50
|
|
or more, each photo costs 4.00.
|
|
- travel_fee: for a STUDIO session, 0.00. For an OUTDOOR session, 15.00 plus
|
|
2.00 for each kilometre of distance_km.
|
|
- crew_fee: if persons is more than 8, the studio sends a second photographer.
|
|
The crew_fee is then 40.00. Else the crew_fee is 0.00.
|
|
- total: the sum of time_fee, person_fee, photo_fee, travel_fee and crew_fee.
|
|
|
|
# 6. Constraints
|
|
|
|
- Release target: SAP_BASIS 816.
|
|
- Coding standards: Clean ABAP. Each method has less than 40 statements. No
|
|
global variables. No comment that restates the code.
|
|
- Out of scope: database access, ALV lists, CDS views, function modules,
|
|
reports and dynpros.
|
|
|
|
# 7. Acceptance
|
|
|
|
- The class is active and has no syntax error.
|
|
- The hidden tests pass.
|
|
- Write your own ABAP Unit tests for the class.
|