Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,152 @@
CLASS {{p}}shred_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_size TYPE i.
TYPES ty_service TYPE c LENGTH 1.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
BEGIN OF c_size,
small TYPE ty_size VALUE 60,
large TYPE ty_size VALUE 240,
END OF c_size.
CONSTANTS:
BEGIN OF c_service,
plant TYPE ty_service VALUE 'P',
onsite TYPE ty_service VALUE 'O',
END OF c_service.
METHODS calculate_price
IMPORTING iv_boxes TYPE i
iv_size TYPE ty_size
iv_service TYPE ty_service
iv_express TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
CONSTANTS:
c_price_small TYPE ty_price VALUE '8.00',
c_price_medium TYPE ty_price VALUE '12.00',
c_price_large TYPE ty_price VALUE '18.00',
c_onsite_surcharge TYPE ty_price VALUE '3.50',
c_express_factor TYPE ty_price VALUE '1.20',
c_contract_factor TYPE ty_price VALUE '0.90',
c_high_volume_factor TYPE ty_price VALUE '0.90',
c_mid_volume_factor TYPE ty_price VALUE '0.95',
c_mid_volume_limit TYPE i VALUE 10,
c_high_volume_limit TYPE i VALUE 25,
c_onsite_minimum TYPE ty_price VALUE '60.00',
c_plant_minimum TYPE ty_price VALUE '35.00'.
METHODS box_price
IMPORTING iv_size TYPE ty_size
iv_service TYPE ty_service
RETURNING VALUE(rv_price) TYPE ty_price.
METHODS apply_volume_discount
IMPORTING iv_boxes TYPE i
iv_total TYPE ty_price
RETURNING VALUE(rv_total) TYPE ty_price.
METHODS apply_contract_discount
IMPORTING iv_contract TYPE abap_bool
iv_total TYPE ty_price
RETURNING VALUE(rv_total) TYPE ty_price.
METHODS apply_express_surcharge
IMPORTING iv_express TYPE abap_bool
iv_total TYPE ty_price
RETURNING VALUE(rv_total) TYPE ty_price.
METHODS apply_minimum
IMPORTING iv_service TYPE ty_service
iv_total TYPE ty_price
RETURNING VALUE(rv_total) TYPE ty_price.
ENDCLASS.
CLASS {{p}}shred_pricer IMPLEMENTATION.
METHOD calculate_price.
DATA lv_total TYPE ty_price.
IF iv_boxes <= 0.
RETURN.
ENDIF.
lv_total = iv_boxes * box_price( iv_size = iv_size
iv_service = iv_service ).
lv_total = apply_volume_discount( iv_boxes = iv_boxes
iv_total = lv_total ).
lv_total = apply_contract_discount( iv_contract = iv_contract
iv_total = lv_total ).
lv_total = apply_express_surcharge( iv_express = iv_express
iv_total = lv_total ).
rv_price = apply_minimum( iv_service = iv_service
iv_total = lv_total ).
ENDMETHOD.
METHOD box_price.
CASE iv_size.
WHEN c_size-small.
rv_price = c_price_small.
WHEN c_size-large.
rv_price = c_price_large.
WHEN OTHERS.
rv_price = c_price_medium.
ENDCASE.
IF iv_service = c_service-onsite.
rv_price = rv_price + c_onsite_surcharge.
ENDIF.
ENDMETHOD.
METHOD apply_volume_discount.
IF iv_boxes >= c_high_volume_limit.
rv_total = iv_total * c_high_volume_factor.
ELSEIF iv_boxes >= c_mid_volume_limit.
rv_total = iv_total * c_mid_volume_factor.
ELSE.
rv_total = iv_total.
ENDIF.
ENDMETHOD.
METHOD apply_contract_discount.
IF iv_contract = abap_true.
rv_total = iv_total * c_contract_factor.
ELSE.
rv_total = iv_total.
ENDIF.
ENDMETHOD.
METHOD apply_express_surcharge.
IF iv_express = abap_true.
rv_total = iv_total * c_express_factor.
ELSE.
rv_total = iv_total.
ENDIF.
ENDMETHOD.
METHOD apply_minimum.
DATA lv_minimum TYPE ty_price.
CASE iv_service.
WHEN c_service-onsite.
lv_minimum = c_onsite_minimum.
WHEN OTHERS.
lv_minimum = c_plant_minimum.
ENDCASE.
IF iv_total < lv_minimum.
rv_total = lv_minimum.
ELSE.
rv_total = iv_total.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,71 @@
CLASS ltc_shred_pricer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}shred_pricer.
METHODS setup.
METHODS expect_price
IMPORTING iv_expected TYPE {{p}}shred_pricer=>ty_price
iv_boxes TYPE i
iv_size TYPE {{p}}shred_pricer=>ty_size
iv_service TYPE {{p}}shred_pricer=>ty_service
iv_express TYPE abap_bool
iv_contract TYPE abap_bool.
METHODS no_boxes_is_free FOR TESTING.
METHODS plant_minimum_charge FOR TESTING.
METHODS onsite_minimum_charge FOR TESTING.
METHODS volume_discount FOR TESTING.
METHODS contract_and_express FOR TESTING.
METHODS unknown_size_falls_back FOR TESTING.
ENDCLASS.
CLASS ltc_shred_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}shred_pricer( ).
ENDMETHOD.
METHOD expect_price.
cl_abap_unit_assert=>assert_equals(
exp = iv_expected
act = mo_cut->calculate_price( iv_boxes = iv_boxes
iv_size = iv_size
iv_service = iv_service
iv_express = iv_express
iv_contract = iv_contract ) ).
ENDMETHOD.
METHOD no_boxes_is_free.
expect_price( iv_expected = '0.00' iv_boxes = 0 iv_size = 120
iv_service = 'P' iv_express = abap_false iv_contract = abap_false ).
ENDMETHOD.
METHOD plant_minimum_charge.
expect_price( iv_expected = '35.00' iv_boxes = 1 iv_size = 60
iv_service = 'P' iv_express = abap_false iv_contract = abap_false ).
ENDMETHOD.
METHOD onsite_minimum_charge.
expect_price( iv_expected = '60.00' iv_boxes = 1 iv_size = 60
iv_service = 'O' iv_express = abap_false iv_contract = abap_false ).
ENDMETHOD.
METHOD volume_discount.
expect_price( iv_expected = '182.40' iv_boxes = 24 iv_size = 60
iv_service = 'P' iv_express = abap_false iv_contract = abap_false ).
ENDMETHOD.
METHOD contract_and_express.
expect_price( iv_expected = '437.40' iv_boxes = 25 iv_size = 240
iv_service = 'P' iv_express = abap_true iv_contract = abap_true ).
ENDMETHOD.
METHOD unknown_size_falls_back.
expect_price( iv_expected = '114.00' iv_boxes = 10 iv_size = 100
iv_service = 'P' iv_express = abap_false iv_contract = abap_false ).
ENDMETHOD.
ENDCLASS.