5.1 KiB
5.1 KiB
1. Goal
A logistics program calculates the shipping fee of a parcel. The program must not contain the fee rules itself. It uses an interface as the contract. Create this interface.
2. Open questions
None.
3. Context
- Package $TMP, client 001.
- The interface {{P}}IF_PARCEL_FEE does not exist yet. Create it.
- A parcel has a weight in grams, a shipping zone, and an express flag. A fee is an amount in whole cents.
- The interface is only a contract. Other programs implement it and calculate the
fee. The interface declares four methods:
- check_input: checks the weight and the zone and returns a reason code.
- base_fee: returns the base fee of a zone.
- weight_surcharge: returns the surcharge that the weight causes.
- total_fee: returns the complete fee of a parcel.
- The meaning of the values: zone '1' is the home zone, zone '2' is the national zone, zone '3' is the europe zone. The reason 'OK' means that the input is valid, 'WEIGHT' means that the weight is out of range, and 'ZONE' means that the zone is unknown. The base fee is 350 cents for zone '1', 620 cents for zone '2', and 990 cents for zone '3'. The first 1000 grams are included in the base fee. Each started 1000 grams above 1000 grams costs 90 cents. The express option costs 750 cents. A call with invalid input returns the fee 0.
4. Contract
Create the interface {{P}}IF_PARCEL_FEE in package $TMP. The interface is public. It contains exactly the types, the constants, and the methods below. Do not add other components.
Types:
- ty_weight_g TYPE i
- ty_cents TYPE i
- ty_zone TYPE c LENGTH 1
- ty_reason TYPE c LENGTH 10
Constants:
- c_zone: components home, national, europe, each TYPE ty_zone
- c_reason: components ok, weight, zone, each TYPE ty_reason
- c_limit: components min_weight, max_weight, each TYPE ty_weight_g
- c_surcharge: components per_step, express, each TYPE ty_cents
Methods:
- check_input IMPORTING iv_weight_g TYPE ty_weight_g iv_zone TYPE ty_zone RETURNING VALUE(rv_reason) TYPE ty_reason
- base_fee IMPORTING iv_zone TYPE ty_zone RETURNING VALUE(rv_cents) TYPE ty_cents
- weight_surcharge IMPORTING iv_weight_g TYPE ty_weight_g RETURNING VALUE(rv_cents) TYPE ty_cents
- total_fee IMPORTING iv_weight_g TYPE ty_weight_g iv_zone TYPE ty_zone iv_express TYPE abap_bool RETURNING VALUE(rv_cents) TYPE ty_cents
5. Business rules
- The type ty_zone is a character type with length 1. The type ty_reason is a character type with length 10. The types ty_weight_g and ty_cents are integer types.
- The constant structure c_zone has the components home, national, and europe. Each component has the type ty_zone. The values are '1', '2', and '3'.
- The constant structure c_reason has the components ok, weight, and zone. Each component has the type ty_reason. The values are 'OK', 'WEIGHT', and 'ZONE'.
- The constant structure c_limit has the components min_weight and max_weight. Each component has the type ty_weight_g. The values are 1 and 31500.
- The constant structure c_surcharge has the components per_step and express. Each component has the type ty_cents. The values are 90 and 750.
- The method check_input has the importing parameter iv_weight_g of type ty_weight_g, the importing parameter iv_zone of type ty_zone, and the returning parameter rv_reason of type ty_reason. It returns c_reason-weight if the weight is below c_limit-min_weight or above c_limit-max_weight. Else it returns c_reason-zone if the zone is not one of the values of c_zone. Else it returns c_reason-ok.
- The method base_fee has the importing parameter iv_zone of type ty_zone and the returning parameter rv_cents of type ty_cents. It returns 350 for zone '1', 620 for zone '2', 990 for zone '3', and 0 for every other zone.
- The method weight_surcharge has the importing parameter iv_weight_g of type ty_weight_g and the returning parameter rv_cents of type ty_cents. It returns 0 for a weight up to 1000 grams. For every started 1000 grams above 1000 grams it returns c_surcharge-per_step cents.
- The method total_fee has the importing parameters iv_weight_g of type ty_weight_g, iv_zone of type ty_zone, and iv_express of type abap_bool, and the returning parameter rv_cents of type ty_cents. It returns 0 if check_input does not return c_reason-ok. Else it returns base_fee plus weight_surcharge, and it adds c_surcharge-express if iv_express is abap_true.
6. Constraints
- Release target: SAP_BASIS 816 (SAP ABAP Platform 2025).
- Coding standards: Clean ABAP. No global variables. No comment that restates the code.
- Out of scope: no database table, no CDS view, no function module, no report, and no application class.
7. Acceptance
- The interface {{P}}IF_PARCEL_FEE is active and has no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the interface. An interface has no test include, so create one global test class in package $TMP. The test class implements the interface and checks the constants, the type lengths, and the method signatures. Keep all test code in this one global class.