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,137 @@
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_entry TYPE c LENGTH 1.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
TYPES:
BEGIN OF ty_session,
entry_type TYPE ty_entry,
hours TYPE i,
climbers TYPE i,
equipment TYPE abap_bool,
member TYPE abap_bool,
visits TYPE i,
END OF ty_session.
TYPES:
BEGIN OF ty_result,
base TYPE ty_amount,
surcharge TYPE ty_amount,
discount TYPE ty_amount,
total TYPE ty_amount,
message TYPE string,
END OF ty_result.
METHODS price
IMPORTING is_session TYPE ty_session
RETURNING VALUE(rs_result) TYPE ty_result.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_entry,
adult TYPE ty_entry VALUE 'A',
youth TYPE ty_entry VALUE 'Y',
family TYPE ty_entry VALUE 'F',
END OF c_entry.
CONSTANTS:
BEGIN OF c_message,
unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE',
invalid_hours TYPE string VALUE 'INVALID HOURS',
invalid_climbers TYPE string VALUE 'INVALID CLIMBERS',
END OF c_message.
CONSTANTS:
c_min_hours TYPE i VALUE 1,
c_max_hours TYPE i VALUE 6,
c_min_climbers TYPE i VALUE 1,
c_max_climbers TYPE i VALUE 10,
c_group_size TYPE i VALUE 6,
c_group_fee TYPE ty_amount VALUE '15.00',
c_equipment_fee TYPE ty_amount VALUE '4.00',
c_top_visits TYPE i VALUE 10,
c_mid_visits TYPE i VALUE 3,
c_member_percent TYPE i VALUE 15,
c_top_percent TYPE i VALUE 20,
c_mid_percent TYPE i VALUE 5,
c_percent TYPE i VALUE 100,
c_rate_adult TYPE ty_amount VALUE '9.00',
c_rate_youth TYPE ty_amount VALUE '6.00',
c_rate_family TYPE ty_amount VALUE '7.00'.
METHODS check_session
IMPORTING is_session TYPE ty_session
RETURNING VALUE(rv_message) TYPE string.
METHODS hourly_rate
IMPORTING is_session TYPE ty_session
RETURNING VALUE(rv_rate) TYPE ty_amount.
METHODS base_price
IMPORTING is_session TYPE ty_session
RETURNING VALUE(rv_base) TYPE ty_amount.
METHODS extra_charge
IMPORTING is_session TYPE ty_session
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
METHODS rebate
IMPORTING iv_gross TYPE ty_amount
is_session TYPE ty_session
RETURNING VALUE(rv_discount) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}climb_pricer IMPLEMENTATION.
METHOD price.
DATA(lv_message) = check_session( is_session ).
IF lv_message IS NOT INITIAL.
rs_result-message = lv_message.
RETURN.
ENDIF.
rs_result-base = base_price( is_session ).
rs_result-surcharge = extra_charge( is_session ).
DATA lv_gross TYPE ty_amount.
lv_gross = rs_result-base + rs_result-surcharge.
rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ).
rs_result-total = lv_gross - rs_result-discount.
ENDMETHOD.
METHOD check_session.
IF is_session-entry_type <> c_entry-adult
AND is_session-entry_type <> c_entry-youth
AND is_session-entry_type <> c_entry-family.
rv_message = c_message-unknown_entry.
ELSEIF is_session-hours < c_min_hours OR is_session-hours > c_max_hours.
rv_message = c_message-invalid_hours.
ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers.
rv_message = c_message-invalid_climbers.
ENDIF.
ENDMETHOD.
METHOD hourly_rate.
CASE is_session-entry_type.
WHEN c_entry-adult.
rv_rate = c_rate_adult.
WHEN c_entry-youth.
rv_rate = c_rate_youth.
WHEN OTHERS.
rv_rate = c_rate_family.
ENDCASE.
ENDMETHOD.
METHOD base_price.
rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers.
ENDMETHOD.
METHOD extra_charge.
IF is_session-equipment = abap_true.
rv_surcharge = is_session-climbers * c_equipment_fee.
ENDIF.
IF is_session-climbers >= c_group_size.
rv_surcharge = rv_surcharge + c_group_fee.
ENDIF.
ENDMETHOD.
METHOD rebate.
IF is_session-member = abap_true.
rv_discount = iv_gross * c_member_percent / c_percent.
ELSEIF is_session-visits >= c_top_visits.
rv_discount = iv_gross * c_top_percent / c_percent.
ELSEIF is_session-visits >= c_mid_visits.
rv_discount = iv_gross * c_mid_percent / c_percent.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,88 @@
CLASS ltc_climb_pricer DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}climb_pricer.
METHODS setup.
METHODS assert_amount
IMPORTING iv_expected TYPE {{p}}climb_pricer=>ty_amount
iv_actual TYPE {{p}}climb_pricer=>ty_amount
iv_text TYPE string.
METHODS adult_booking FOR TESTING.
METHODS youth_booking FOR TESTING.
METHODS family_booking FOR TESTING.
METHODS equipment_surcharge FOR TESTING.
METHODS group_surcharge FOR TESTING.
METHODS member_discount FOR TESTING.
METHODS loyalty_discount FOR TESTING.
METHODS unknown_entry FOR TESTING.
METHODS invalid_hours FOR TESTING.
METHODS invalid_climbers FOR TESTING.
ENDCLASS.
CLASS ltc_climb_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}climb_pricer( ).
ENDMETHOD.
METHOD assert_amount.
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual msg = iv_text ).
ENDMETHOD.
METHOD adult_booking.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2 ) ).
assert_amount( iv_expected = '36.00' iv_actual = ls_result-base iv_text = 'base' ).
assert_amount( iv_expected = '36.00' iv_actual = ls_result-total iv_text = 'total' ).
ENDMETHOD.
METHOD youth_booking.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'Y' hours = 1 climbers = 1 ) ).
assert_amount( iv_expected = '6.00' iv_actual = ls_result-base iv_text = 'base' ).
ENDMETHOD.
METHOD family_booking.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'F' hours = 3 climbers = 4 ) ).
assert_amount( iv_expected = '84.00' iv_actual = ls_result-base iv_text = 'base' ).
ENDMETHOD.
METHOD equipment_surcharge.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 3
equipment = abap_true ) ).
assert_amount( iv_expected = '12.00' iv_actual = ls_result-surcharge iv_text = 'surcharge' ).
assert_amount( iv_expected = '66.00' iv_actual = ls_result-total iv_text = 'total' ).
ENDMETHOD.
METHOD group_surcharge.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 1 climbers = 6 ) ).
assert_amount( iv_expected = '15.00' iv_actual = ls_result-surcharge iv_text = 'surcharge' ).
assert_amount( iv_expected = '69.00' iv_actual = ls_result-total iv_text = 'total' ).
ENDMETHOD.
METHOD member_discount.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
member = abap_true ) ).
assert_amount( iv_expected = '5.40' iv_actual = ls_result-discount iv_text = 'discount' ).
assert_amount( iv_expected = '30.60' iv_actual = ls_result-total iv_text = 'total' ).
ENDMETHOD.
METHOD loyalty_discount.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
visits = 10 ) ).
assert_amount( iv_expected = '7.20' iv_actual = ls_result-discount iv_text = 'discount' ).
assert_amount( iv_expected = '28.80' iv_actual = ls_result-total iv_text = 'total' ).
ENDMETHOD.
METHOD unknown_entry.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'X' hours = 2 climbers = 2 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'UNKNOWN ENTRY TYPE' act = ls_result-message ).
ENDMETHOD.
METHOD invalid_hours.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 7 climbers = 2 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_result-message ).
ENDMETHOD.
METHOD invalid_climbers.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 11 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'INVALID CLIMBERS' act = ls_result-message ).
ENDMETHOD.
ENDCLASS.