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,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 AND 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,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_false.
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,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,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,37 @@
{
"id": "G1082",
"pool": "train",
"object_type": "CLAS",
"category": "E",
"attempts": [
{
"stage": "bundle",
"errors": [
"Too close to task G1042 (similarity spec 0.66, rules 0.63, names 0.00). Choose a different business topic and different object names."
],
"by_check": {
"extra": 1
}
},
{
"stage": "bundle",
"errors": [
"Too close to task G1030 (similarity spec 0.76, rules 0.60, names 0.00). Choose a different business topic and different object names."
],
"by_check": {
"extra": 1
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,136 @@
CLASS {{p}}climb_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
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_two_hours FOR TESTING.
METHODS youth_single_hour FOR TESTING.
METHODS family_rate FOR TESTING.
METHODS equipment_fee FOR TESTING.
METHODS group_fee FOR TESTING.
METHODS member_discount FOR TESTING.
METHODS member_beats_loyalty FOR TESTING.
METHODS top_loyalty FOR TESTING.
METHODS mid_loyalty FOR TESTING.
METHODS unknown_entry FOR TESTING.
METHODS invalid_hours FOR TESTING.
METHODS invalid_climbers FOR TESTING.
ENDCLASS.
CLASS {{p}}climb_hidden 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_two_hours.
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 = '0.00' iv_actual = ls_result-surcharge iv_text = 'surcharge' ).
assert_amount( iv_expected = '0.00' iv_actual = ls_result-discount iv_text = 'discount' ).
assert_amount( iv_expected = '36.00' iv_actual = ls_result-total iv_text = 'total' ).
cl_abap_unit_assert=>assert_initial( act = ls_result-message msg = 'message must be empty' ).
ENDMETHOD.
METHOD youth_single_hour.
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' ).
assert_amount( iv_expected = '6.00' iv_actual = ls_result-total iv_text = 'total' ).
ENDMETHOD.
METHOD family_rate.
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' ).
assert_amount( iv_expected = '84.00' iv_actual = ls_result-total iv_text = 'total' ).
ENDMETHOD.
METHOD equipment_fee.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 3
equipment = abap_true ) ).
assert_amount( iv_expected = '54.00' iv_actual = ls_result-base iv_text = 'base' ).
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_fee.
DATA(ls_small) = mo_cut->price( VALUE #( entry_type = 'A' hours = 1 climbers = 5 ) ).
assert_amount( iv_expected = '45.00' iv_actual = ls_small-base iv_text = 'small base' ).
assert_amount( iv_expected = '0.00' iv_actual = ls_small-surcharge iv_text = 'small surcharge' ).
DATA(ls_group) = mo_cut->price( VALUE #( entry_type = 'A' hours = 1 climbers = 6 ) ).
assert_amount( iv_expected = '54.00' iv_actual = ls_group-base iv_text = 'group base' ).
assert_amount( iv_expected = '15.00' iv_actual = ls_group-surcharge iv_text = 'group surcharge' ).
assert_amount( iv_expected = '69.00' iv_actual = ls_group-total iv_text = 'group 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 = '36.00' iv_actual = ls_result-base iv_text = 'base' ).
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 member_beats_loyalty.
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
member = abap_true visits = 10 ) ).
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 top_loyalty.
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 mid_loyalty.
DATA(ls_three) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
visits = 3 ) ).
assert_amount( iv_expected = '1.80' iv_actual = ls_three-discount iv_text = 'discount' ).
assert_amount( iv_expected = '34.20' iv_actual = ls_three-total iv_text = 'total' ).
DATA(ls_two) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
visits = 2 ) ).
assert_amount( iv_expected = '0.00' iv_actual = ls_two-discount iv_text = 'no discount' ).
assert_amount( iv_expected = '36.00' iv_actual = ls_two-total iv_text = 'no discount 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 ).
assert_amount( iv_expected = '0.00' iv_actual = ls_result-base iv_text = 'base' ).
assert_amount( iv_expected = '0.00' iv_actual = ls_result-total iv_text = 'total' ).
DATA(ls_order) = mo_cut->price( VALUE #( entry_type = 'X' hours = 0 climbers = 0 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'UNKNOWN ENTRY TYPE' act = ls_order-message ).
ENDMETHOD.
METHOD invalid_hours.
DATA(ls_zero) = mo_cut->price( VALUE #( entry_type = 'A' hours = 0 climbers = 2 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_zero-message ).
DATA(ls_many) = mo_cut->price( VALUE #( entry_type = 'A' hours = 7 climbers = 2 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_many-message ).
DATA(ls_order) = mo_cut->price( VALUE #( entry_type = 'A' hours = 0 climbers = 0 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_order-message ).
ENDMETHOD.
METHOD invalid_climbers.
DATA(ls_none) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 0 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'INVALID CLIMBERS' act = ls_none-message ).
DATA(ls_many) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 11 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'INVALID CLIMBERS' act = ls_many-message ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,79 @@
{
"task": "G1082",
"mutants": [
{
"object": "{{P}}CLIMB_PRICER",
"mutant": "line 93: <> -> = (rel)",
"status": "killed",
"hidden": "2/12",
"failed_tests": [
"ADULT_TWO_HOURS",
"EQUIPMENT_FEE",
"GROUP_FEE",
"INVALID_CLIMBERS",
"INVALID_HOURS",
"MEMBER_BEATS_LOYALTY",
"MEMBER_DISCOUNT",
"MID_LOYALTY",
"TOP_LOYALTY",
"UNKNOWN_ENTRY"
]
},
{
"object": "{{P}}CLIMB_PRICER",
"mutant": "line 97: OR -> AND (logic)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"INVALID_HOURS"
]
},
{
"object": "{{P}}CLIMB_PRICER",
"mutant": "line 120: abap_true -> abap_false (bool)",
"status": "killed",
"hidden": "3/12",
"failed_tests": [
"ADULT_TWO_HOURS",
"EQUIPMENT_FEE",
"FAMILY_RATE",
"GROUP_FEE",
"MEMBER_BEATS_LOYALTY",
"MEMBER_DISCOUNT",
"MID_LOYALTY",
"TOP_LOYALTY",
"YOUTH_SINGLE_HOUR"
]
},
{
"object": "{{P}}CLIMB_PRICER",
"mutant": "line 124: + -> - (arith)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"GROUP_FEE"
]
},
{
"object": "{{P}}CLIMB_PRICER",
"mutant": "line 129: = -> <> (eq)",
"status": "killed",
"hidden": "3/12",
"failed_tests": [
"ADULT_TWO_HOURS",
"EQUIPMENT_FEE",
"FAMILY_RATE",
"GROUP_FEE",
"MEMBER_BEATS_LOYALTY",
"MEMBER_DISCOUNT",
"MID_LOYALTY",
"TOP_LOYALTY",
"YOUTH_SINGLE_HOUR"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

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.

View File

@@ -0,0 +1,71 @@
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.
ENDCLASS.
CLASS {{p}}climb_pricer IMPLEMENTATION.
METHOD price.
DATA: lv_rate TYPE ty_amount,
lv_gross TYPE ty_amount.
CLEAR rs_result.
IF is_session-entry_type = 'A' OR is_session-entry_type = 'Y' OR is_session-entry_type = 'F'.
IF is_session-hours GE 1 AND is_session-hours LE 6.
IF is_session-climbers GE 1 AND is_session-climbers LE 10.
IF is_session-entry_type = 'A'.
lv_rate = '9.00'.
ELSEIF is_session-entry_type = 'Y'.
lv_rate = '6.00'.
ELSE.
lv_rate = '7.00'.
ENDIF.
rs_result-base = is_session-hours * lv_rate * is_session-climbers.
IF is_session-equipment = 'X'.
rs_result-surcharge = is_session-climbers * '4.00'.
ENDIF.
IF is_session-climbers GE 6.
rs_result-surcharge = rs_result-surcharge + '15.00'.
ENDIF.
lv_gross = rs_result-base + rs_result-surcharge.
IF is_session-member = 'X'.
rs_result-discount = lv_gross * 15 / 100.
ELSEIF is_session-visits GE 10.
rs_result-discount = lv_gross * 20 / 100.
ELSEIF is_session-visits GE 3.
rs_result-discount = lv_gross * 5 / 100.
ENDIF.
rs_result-total = lv_gross - rs_result-discount.
ELSE.
rs_result-message = 'INVALID CLIMBERS'.
ENDIF.
ELSE.
rs_result-message = 'INVALID HOURS'.
ENDIF.
ELSE.
rs_result-message = 'UNKNOWN ENTRY TYPE'.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,53 @@
# 1. Goal
Refactor the class {{P}}CLIMB_PRICER in package $TMP. The class calculates the
price of a climbing session at a climbing centre. The booking program of the
centre calls the class for each session. The class is correct today, but the
code is hard to read and hard to change. Make the code clean and easy to
change. The behavior must stay the same.
# 2. Open questions
None.
# 3. Context
- The class {{P}}CLIMB_PRICER exists in package $TMP. It is active.
- The booking program calls the method PRICE and then reads the components of
the result structure.
- No user reports a wrong price. All prices are correct.
- The implementation is one long method with deep nesting and many literal
values. A change to one rate is risky.
# 4. Contract
- Refactor the class {{P}}CLIMB_PRICER in package $TMP. The name stays the
same.
- The class is public and final. It has a public constructor without
parameters.
- The public interface must not change. It is:
- TYPES ty_entry TYPE c LENGTH 1.
- TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
- TYPES ty_session with the components entry_type TYPE ty_entry,
hours TYPE i, climbers TYPE i, equipment TYPE abap_bool,
member TYPE abap_bool and visits TYPE i.
- TYPES ty_result with the components base TYPE ty_amount,
surcharge TYPE ty_amount, discount TYPE ty_amount, total TYPE ty_amount
and message TYPE string.
- METHODS price IMPORTING is_session TYPE ty_session
RETURNING VALUE(rs_result) TYPE ty_result.
- Do not add other public methods or public types.
# 5. Business rules
The legacy code contains all the rules. Read the code of {{P}}CLIMB_PRICER
before you change it. Each input must give the same result as the legacy code.
Keep each limit, each rate, each surcharge, each discount and each message
text.
# 6. Constraints
- Release target: 8.16.
- Coding standards: Clean ABAP. Methods below 40 statements. No global
variables. No magic numbers. No comment that restates the code.
- Out of scope: do not change the public interface of {{P}}CLIMB_PRICER. Do not
create other objects.
# 7. Acceptance
- The class is active and has no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,48 @@
{
"id": "G1082",
"category": "E",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "CLAS",
"name": "{{P}}CLIMB_PRICER",
"file": "seed/climb_pricer.clas.abap",
"description": "Legacy class that calculates the price of a climbing session"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}CLIMB_PRICER"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}CLIMB_HIDDEN",
"file": "hidden/climb_hidden.clas.abap",
"description": "Hidden tests that check the unchanged behavior of the refactored climbing session pricer"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}CLIMB_PRICER",
"file": "reference/climb_pricer.clas.abap",
"description": "Refactored climbing session price class",
"testclasses_file": "reference/climb_pricer.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"cyclomatic_complexity"
]
}