Step F first pass: 81/92 accepted; budget floor 60 calls; rejected slots moved for regeneration

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
Kral
2026-10-03 12:10:52 +02:00
parent d3250acfb8
commit 39769afce8
741 changed files with 40573 additions and 317 deletions

View File

@@ -0,0 +1,113 @@
CLASS {{p}}commission_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_commission.
PRIVATE SECTION.
TYPES ty_exact TYPE p LENGTH 15 DECIMALS 4.
CONSTANTS:
c_rate_base TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0100',
c_rate_mid TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0300',
c_rate_top TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0500',
c_bonus_5 TYPE {{p}}if_commission=>ty_amount VALUE '200',
c_bonus_10 TYPE {{p}}if_commission=>ty_amount VALUE '500',
c_cap TYPE {{p}}if_commission=>ty_amount VALUE '5000'.
METHODS base_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS extra_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS top_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS round_to_cents
IMPORTING iv_value TYPE ty_exact
RETURNING VALUE(rv_value) TYPE {{p}}if_commission=>ty_amount.
METHODS loyalty_bonus
IMPORTING iv_years TYPE i
RETURNING VALUE(rv_bonus) TYPE {{p}}if_commission=>ty_amount.
ENDCLASS.
CLASS {{p}}commission_calc IMPLEMENTATION.
METHOD {{p}}if_commission~calculate.
DATA: lv_exact TYPE ty_exact,
lv_bonus TYPE {{p}}if_commission=>ty_amount.
IF iv_sales <= 0 AND iv_target <= 0.
RETURN.
ENDIF.
IF iv_sales * 2 < iv_target.
RETURN.
ENDIF.
lv_exact = base_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + extra_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + top_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_bonus = round_to_cents( lv_exact ) + loyalty_bonus( iv_years ).
IF lv_bonus > c_cap.
lv_bonus = c_cap.
ENDIF.
rv_bonus = lv_bonus.
ENDMETHOD.
METHOD base_commission.
DATA lv_base TYPE ty_exact.
IF iv_sales < iv_target.
lv_base = iv_sales.
ELSE.
lv_base = iv_target.
ENDIF.
rv_part = lv_base * c_rate_base.
ENDMETHOD.
METHOD extra_commission.
DATA: lv_excess TYPE ty_exact,
lv_limit TYPE ty_exact.
IF iv_sales <= iv_target.
RETURN.
ENDIF.
lv_excess = iv_sales - iv_target.
lv_limit = iv_target / 2.
IF lv_excess > lv_limit.
lv_excess = lv_limit.
ENDIF.
rv_part = lv_excess * c_rate_mid.
ENDMETHOD.
METHOD top_commission.
DATA: lv_threshold TYPE ty_exact,
lv_top TYPE ty_exact.
lv_threshold = iv_target * 3.
lv_threshold = lv_threshold / 2.
IF iv_sales <= lv_threshold.
RETURN.
ENDIF.
lv_top = iv_sales - lv_threshold.
rv_part = lv_top * c_rate_top.
ENDMETHOD.
METHOD round_to_cents.
DATA lv_cents TYPE {{p}}if_commission=>ty_amount.
lv_cents = round( val = iv_value dec = 2 ).
rv_value = lv_cents.
ENDMETHOD.
METHOD loyalty_bonus.
IF iv_years >= 10.
rv_bonus = c_bonus_10.
ELSEIF iv_years >= 5.
rv_bonus = c_bonus_5.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,113 @@
CLASS {{p}}commission_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_commission.
PRIVATE SECTION.
TYPES ty_exact TYPE p LENGTH 15 DECIMALS 4.
CONSTANTS:
c_rate_base TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0100',
c_rate_mid TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0300',
c_rate_top TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0500',
c_bonus_5 TYPE {{p}}if_commission=>ty_amount VALUE '200',
c_bonus_10 TYPE {{p}}if_commission=>ty_amount VALUE '500',
c_cap TYPE {{p}}if_commission=>ty_amount VALUE '5000'.
METHODS base_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS extra_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS top_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS round_to_cents
IMPORTING iv_value TYPE ty_exact
RETURNING VALUE(rv_value) TYPE {{p}}if_commission=>ty_amount.
METHODS loyalty_bonus
IMPORTING iv_years TYPE i
RETURNING VALUE(rv_bonus) TYPE {{p}}if_commission=>ty_amount.
ENDCLASS.
CLASS {{p}}commission_calc IMPLEMENTATION.
METHOD {{p}}if_commission~calculate.
DATA: lv_exact TYPE ty_exact,
lv_bonus TYPE {{p}}if_commission=>ty_amount.
IF iv_sales <= 0 OR iv_target <= 0.
RETURN.
ENDIF.
IF iv_sales / 2 < iv_target.
RETURN.
ENDIF.
lv_exact = base_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + extra_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + top_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_bonus = round_to_cents( lv_exact ) + loyalty_bonus( iv_years ).
IF lv_bonus > c_cap.
lv_bonus = c_cap.
ENDIF.
rv_bonus = lv_bonus.
ENDMETHOD.
METHOD base_commission.
DATA lv_base TYPE ty_exact.
IF iv_sales < iv_target.
lv_base = iv_sales.
ELSE.
lv_base = iv_target.
ENDIF.
rv_part = lv_base * c_rate_base.
ENDMETHOD.
METHOD extra_commission.
DATA: lv_excess TYPE ty_exact,
lv_limit TYPE ty_exact.
IF iv_sales <= iv_target.
RETURN.
ENDIF.
lv_excess = iv_sales - iv_target.
lv_limit = iv_target / 2.
IF lv_excess > lv_limit.
lv_excess = lv_limit.
ENDIF.
rv_part = lv_excess * c_rate_mid.
ENDMETHOD.
METHOD top_commission.
DATA: lv_threshold TYPE ty_exact,
lv_top TYPE ty_exact.
lv_threshold = iv_target * 3.
lv_threshold = lv_threshold / 2.
IF iv_sales <= lv_threshold.
RETURN.
ENDIF.
lv_top = iv_sales - lv_threshold.
rv_part = lv_top * c_rate_top.
ENDMETHOD.
METHOD round_to_cents.
DATA lv_cents TYPE {{p}}if_commission=>ty_amount.
lv_cents = round( val = iv_value dec = 2 ).
rv_value = lv_cents.
ENDMETHOD.
METHOD loyalty_bonus.
IF iv_years >= 10.
rv_bonus = c_bonus_10.
ELSEIF iv_years >= 5.
rv_bonus = c_bonus_5.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,113 @@
CLASS {{p}}commission_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_commission.
PRIVATE SECTION.
TYPES ty_exact TYPE p LENGTH 15 DECIMALS 4.
CONSTANTS:
c_rate_base TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0100',
c_rate_mid TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0300',
c_rate_top TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0500',
c_bonus_5 TYPE {{p}}if_commission=>ty_amount VALUE '200',
c_bonus_10 TYPE {{p}}if_commission=>ty_amount VALUE '500',
c_cap TYPE {{p}}if_commission=>ty_amount VALUE '5000'.
METHODS base_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS extra_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS top_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS round_to_cents
IMPORTING iv_value TYPE ty_exact
RETURNING VALUE(rv_value) TYPE {{p}}if_commission=>ty_amount.
METHODS loyalty_bonus
IMPORTING iv_years TYPE i
RETURNING VALUE(rv_bonus) TYPE {{p}}if_commission=>ty_amount.
ENDCLASS.
CLASS {{p}}commission_calc IMPLEMENTATION.
METHOD {{p}}if_commission~calculate.
DATA: lv_exact TYPE ty_exact,
lv_bonus TYPE {{p}}if_commission=>ty_amount.
IF iv_sales <= 0 OR iv_target <= 0.
RETURN.
ENDIF.
IF iv_sales * 2 < iv_target.
RETURN.
ENDIF.
lv_exact = base_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + extra_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + top_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_bonus = round_to_cents( lv_exact ) + loyalty_bonus( iv_years ).
IF lv_bonus > c_cap.
lv_bonus = c_cap.
ENDIF.
rv_bonus = lv_bonus.
ENDMETHOD.
METHOD base_commission.
DATA lv_base TYPE ty_exact.
IF iv_sales < iv_target.
lv_base = iv_sales.
ELSE.
lv_base = iv_target.
ENDIF.
rv_part = lv_base * c_rate_base.
ENDMETHOD.
METHOD extra_commission.
DATA: lv_excess TYPE ty_exact,
lv_limit TYPE ty_exact.
IF iv_sales <= iv_target.
RETURN.
ENDIF.
lv_excess = iv_sales - iv_target.
lv_limit = iv_target / 2.
IF lv_excess > lv_limit.
lv_excess = lv_limit.
ENDIF.
rv_part = lv_excess * c_rate_mid.
ENDMETHOD.
METHOD top_commission.
DATA: lv_threshold TYPE ty_exact,
lv_top TYPE ty_exact.
lv_threshold = iv_target * 3.
lv_threshold = lv_threshold / 2.
IF iv_sales > lv_threshold.
RETURN.
ENDIF.
lv_top = iv_sales - lv_threshold.
rv_part = lv_top * c_rate_top.
ENDMETHOD.
METHOD round_to_cents.
DATA lv_cents TYPE {{p}}if_commission=>ty_amount.
lv_cents = round( val = iv_value dec = 2 ).
rv_value = lv_cents.
ENDMETHOD.
METHOD loyalty_bonus.
IF iv_years >= 10.
rv_bonus = c_bonus_10.
ELSEIF iv_years >= 5.
rv_bonus = c_bonus_5.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,113 @@
CLASS {{p}}commission_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_commission.
PRIVATE SECTION.
TYPES ty_exact TYPE p LENGTH 15 DECIMALS 4.
CONSTANTS:
c_rate_base TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0100',
c_rate_mid TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0300',
c_rate_top TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0500',
c_bonus_5 TYPE {{p}}if_commission=>ty_amount VALUE '200',
c_bonus_10 TYPE {{p}}if_commission=>ty_amount VALUE '500',
c_cap TYPE {{p}}if_commission=>ty_amount VALUE '5000'.
METHODS base_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS extra_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS top_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS round_to_cents
IMPORTING iv_value TYPE ty_exact
RETURNING VALUE(rv_value) TYPE {{p}}if_commission=>ty_amount.
METHODS loyalty_bonus
IMPORTING iv_years TYPE i
RETURNING VALUE(rv_bonus) TYPE {{p}}if_commission=>ty_amount.
ENDCLASS.
CLASS {{p}}commission_calc IMPLEMENTATION.
METHOD {{p}}if_commission~calculate.
DATA: lv_exact TYPE ty_exact,
lv_bonus TYPE {{p}}if_commission=>ty_amount.
IF iv_sales <= 0 OR iv_target <= 0.
RETURN.
ENDIF.
IF iv_sales * 2 < iv_target.
RETURN.
ENDIF.
lv_exact = base_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + extra_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + top_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_bonus = round_to_cents( lv_exact ) + loyalty_bonus( iv_years ).
IF lv_bonus > c_cap.
lv_bonus = c_cap.
ENDIF.
rv_bonus = lv_bonus.
ENDMETHOD.
METHOD base_commission.
DATA lv_base TYPE ty_exact.
IF iv_sales < iv_target.
lv_base = iv_sales.
ELSE.
lv_base = iv_target.
ENDIF.
rv_part = lv_base * c_rate_base.
ENDMETHOD.
METHOD extra_commission.
DATA: lv_excess TYPE ty_exact,
lv_limit TYPE ty_exact.
IF iv_sales <= iv_target.
RETURN.
ENDIF.
lv_excess = iv_sales - iv_target.
lv_limit = iv_target / 2.
IF lv_excess > lv_limit.
lv_excess = lv_limit.
ENDIF.
rv_part = lv_excess * c_rate_mid.
ENDMETHOD.
METHOD top_commission.
DATA: lv_threshold TYPE ty_exact,
lv_top TYPE ty_exact.
lv_threshold = iv_target * 3.
lv_threshold = lv_threshold / 2.
IF iv_sales <= lv_threshold.
RETURN.
ENDIF.
lv_top = iv_sales + lv_threshold.
rv_part = lv_top * c_rate_top.
ENDMETHOD.
METHOD round_to_cents.
DATA lv_cents TYPE {{p}}if_commission=>ty_amount.
lv_cents = round( val = iv_value dec = 2 ).
rv_value = lv_cents.
ENDMETHOD.
METHOD loyalty_bonus.
IF iv_years >= 10.
rv_bonus = c_bonus_10.
ELSEIF iv_years >= 5.
rv_bonus = c_bonus_5.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,33 @@
{
"id": "G0164",
"pool": "eval",
"object_type": "CLAS",
"category": "G",
"attempts": [
{
"stage": "bundle",
"errors": [
"hidden/t42_hidden.clas.abap line 57: syntax error for release v740sp05 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"assert_bonus\"",
"hidden/t42_hidden.clas.abap line 57: syntax error for release v740sp05 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"99\"",
"hidden/t42_hidden.clas.abap line 82: syntax error for release v740sp05 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"assert_bonus\"",
"hidden/t42_hidden.clas.abap line 82: syntax error for release v740sp05 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"35\"",
"hidden/t42_hidden.clas.abap line 82: syntax error for release v740sp05 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"55\"",
"hidden/t42_hidden.clas.abap line 82: syntax error for release v740sp05 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"55\""
],
"by_check": {
"abaplint": 6
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 4,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,101 @@
CLASS {{p}}t42_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_commission.
METHODS setup.
METHODS assert_bonus
IMPORTING iv_expected TYPE {{p}}if_commission=>ty_amount
iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
iv_years TYPE i
iv_msg TYPE string.
METHODS zero_sales FOR TESTING.
METHODS zero_target FOR TESTING.
METHODS negative_sales FOR TESTING.
METHODS below_half_target FOR TESTING.
METHODS exactly_half_target FOR TESTING.
METHODS at_target FOR TESTING.
METHODS above_target FOR TESTING.
METHODS top_tier FOR TESTING.
METHODS rounds_to_cent FOR TESTING.
METHODS loyalty_five_years FOR TESTING.
METHODS loyalty_ten_years FOR TESTING.
METHODS cap_applied FOR TESTING.
ENDCLASS.
CLASS {{p}}t42_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}commission_calc( ).
ENDMETHOD.
METHOD assert_bonus.
cl_abap_unit_assert=>assert_equals(
exp = iv_expected
act = mo_cut->calculate( iv_sales = iv_sales
iv_target = iv_target
iv_years = iv_years )
msg = iv_msg ).
ENDMETHOD.
METHOD zero_sales.
assert_bonus( iv_expected = 0 iv_sales = 0 iv_target = 1000
iv_years = 0 iv_msg = 'zero sales' ).
ENDMETHOD.
METHOD zero_target.
assert_bonus( iv_expected = 0 iv_sales = 1000 iv_target = 0
iv_years = 0 iv_msg = 'zero target' ).
ENDMETHOD.
METHOD negative_sales.
assert_bonus( iv_expected = 0 iv_sales = -100 iv_target = 1000
iv_years = 0 iv_msg = 'negative sales' ).
ENDMETHOD.
METHOD below_half_target.
assert_bonus( iv_expected = 0 iv_sales = '499.99' iv_target = 1000
iv_years = 0 iv_msg = 'below half target' ).
ENDMETHOD.
METHOD exactly_half_target.
assert_bonus( iv_expected = 5 iv_sales = 500 iv_target = 1000
iv_years = 0 iv_msg = 'exactly half target' ).
ENDMETHOD.
METHOD at_target.
assert_bonus( iv_expected = 10 iv_sales = 1000 iv_target = 1000
iv_years = 0 iv_msg = 'at target' ).
ENDMETHOD.
METHOD above_target.
assert_bonus( iv_expected = 16 iv_sales = 1200 iv_target = 1000
iv_years = 0 iv_msg = 'above target' ).
ENDMETHOD.
METHOD top_tier.
assert_bonus( iv_expected = 50 iv_sales = 2000 iv_target = 1000
iv_years = 0 iv_msg = 'top tier' ).
ENDMETHOD.
METHOD rounds_to_cent.
assert_bonus( iv_expected = '12.35' iv_sales = '1234.55'
iv_target = '1234.55'
iv_years = 0 iv_msg = 'rounding' ).
ENDMETHOD.
METHOD loyalty_five_years.
assert_bonus( iv_expected = 210 iv_sales = 1000 iv_target = 1000
iv_years = 5 iv_msg = 'five years' ).
ENDMETHOD.
METHOD loyalty_ten_years.
assert_bonus( iv_expected = 510 iv_sales = 1000 iv_target = 1000
iv_years = 10 iv_msg = 'ten years' ).
ENDMETHOD.
METHOD cap_applied.
assert_bonus( iv_expected = 5000 iv_sales = 100000 iv_target = 1000
iv_years = 10 iv_msg = 'cap' ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,64 @@
{
"task": "G0164",
"mutants": [
{
"object": "{{P}}COMMISSION_CALC",
"mutant": "line 42: OR -> AND (logic)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"ZERO_TARGET"
]
},
{
"object": "{{P}}COMMISSION_CALC",
"mutant": "line 45: * -> / (arith)",
"status": "killed",
"hidden": "6/12",
"failed_tests": [
"ABOVE_TARGET",
"AT_TARGET",
"EXACTLY_HALF_TARGET",
"LOYALTY_FIVE_YEARS",
"LOYALTY_TEN_YEARS",
"ROUNDS_TO_CENT"
]
},
{
"object": "{{P}}COMMISSION_CALC",
"mutant": "line 92: <= -> > (rel)",
"status": "killed",
"hidden": "4/12",
"failed_tests": [
"ABOVE_TARGET",
"AT_TARGET",
"CAP_APPLIED",
"EXACTLY_HALF_TARGET",
"LOYALTY_FIVE_YEARS",
"LOYALTY_TEN_YEARS",
"ROUNDS_TO_CENT",
"TOP_TIER"
]
},
{
"object": "{{P}}COMMISSION_CALC",
"mutant": "line 95: - -> + (arith)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"TOP_TIER"
]
},
{
"object": "{{P}}COMMISSION_CALC",
"mutant": "line 102: 2 -> 3 (const)",
"status": "survived",
"hidden": "12/12",
"failed_tests": []
}
],
"valid": 5,
"killed": 4,
"kill_rate": 0.8,
"ok": true
}

View File

@@ -0,0 +1,113 @@
CLASS {{p}}commission_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_commission.
PRIVATE SECTION.
TYPES ty_exact TYPE p LENGTH 15 DECIMALS 4.
CONSTANTS:
c_rate_base TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0100',
c_rate_mid TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0300',
c_rate_top TYPE p LENGTH 7 DECIMALS 4 VALUE '0.0500',
c_bonus_5 TYPE {{p}}if_commission=>ty_amount VALUE '200',
c_bonus_10 TYPE {{p}}if_commission=>ty_amount VALUE '500',
c_cap TYPE {{p}}if_commission=>ty_amount VALUE '5000'.
METHODS base_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS extra_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS top_commission
IMPORTING iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
RETURNING VALUE(rv_part) TYPE ty_exact.
METHODS round_to_cents
IMPORTING iv_value TYPE ty_exact
RETURNING VALUE(rv_value) TYPE {{p}}if_commission=>ty_amount.
METHODS loyalty_bonus
IMPORTING iv_years TYPE i
RETURNING VALUE(rv_bonus) TYPE {{p}}if_commission=>ty_amount.
ENDCLASS.
CLASS {{p}}commission_calc IMPLEMENTATION.
METHOD {{p}}if_commission~calculate.
DATA: lv_exact TYPE ty_exact,
lv_bonus TYPE {{p}}if_commission=>ty_amount.
IF iv_sales <= 0 OR iv_target <= 0.
RETURN.
ENDIF.
IF iv_sales * 2 < iv_target.
RETURN.
ENDIF.
lv_exact = base_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + extra_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_exact = lv_exact + top_commission( iv_sales = iv_sales iv_target = iv_target ).
lv_bonus = round_to_cents( lv_exact ) + loyalty_bonus( iv_years ).
IF lv_bonus > c_cap.
lv_bonus = c_cap.
ENDIF.
rv_bonus = lv_bonus.
ENDMETHOD.
METHOD base_commission.
DATA lv_base TYPE ty_exact.
IF iv_sales < iv_target.
lv_base = iv_sales.
ELSE.
lv_base = iv_target.
ENDIF.
rv_part = lv_base * c_rate_base.
ENDMETHOD.
METHOD extra_commission.
DATA: lv_excess TYPE ty_exact,
lv_limit TYPE ty_exact.
IF iv_sales <= iv_target.
RETURN.
ENDIF.
lv_excess = iv_sales - iv_target.
lv_limit = iv_target / 2.
IF lv_excess > lv_limit.
lv_excess = lv_limit.
ENDIF.
rv_part = lv_excess * c_rate_mid.
ENDMETHOD.
METHOD top_commission.
DATA: lv_threshold TYPE ty_exact,
lv_top TYPE ty_exact.
lv_threshold = iv_target * 3.
lv_threshold = lv_threshold / 2.
IF iv_sales <= lv_threshold.
RETURN.
ENDIF.
lv_top = iv_sales - lv_threshold.
rv_part = lv_top * c_rate_top.
ENDMETHOD.
METHOD round_to_cents.
DATA lv_cents TYPE {{p}}if_commission=>ty_amount.
lv_cents = round( val = iv_value dec = 2 ).
rv_value = lv_cents.
ENDMETHOD.
METHOD loyalty_bonus.
IF iv_years >= 10.
rv_bonus = c_bonus_10.
ELSEIF iv_years >= 5.
rv_bonus = c_bonus_5.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,63 @@
CLASS ltc_commission DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_commission.
METHODS setup.
METHODS assert_bonus
IMPORTING iv_expected TYPE {{p}}if_commission=>ty_amount
iv_sales TYPE {{p}}if_commission=>ty_amount
iv_target TYPE {{p}}if_commission=>ty_amount
iv_years TYPE i.
METHODS zero_or_negative FOR TESTING.
METHODS below_half_target FOR TESTING.
METHODS at_target FOR TESTING.
METHODS above_target FOR TESTING.
METHODS top_tier FOR TESTING.
METHODS loyalty_bonus FOR TESTING.
METHODS cap_applied FOR TESTING.
ENDCLASS.
CLASS ltc_commission IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}commission_calc( ).
ENDMETHOD.
METHOD assert_bonus.
cl_abap_unit_assert=>assert_equals(
exp = iv_expected
act = mo_cut->calculate( iv_sales = iv_sales
iv_target = iv_target
iv_years = iv_years ) ).
ENDMETHOD.
METHOD zero_or_negative.
assert_bonus( iv_expected = 0 iv_sales = 0 iv_target = 1000 iv_years = 0 ).
assert_bonus( iv_expected = 0 iv_sales = -100 iv_target = 1000 iv_years = 0 ).
assert_bonus( iv_expected = 0 iv_sales = 1000 iv_target = 0 iv_years = 0 ).
ENDMETHOD.
METHOD below_half_target.
assert_bonus( iv_expected = 0 iv_sales = 400 iv_target = 1000 iv_years = 0 ).
ENDMETHOD.
METHOD at_target.
assert_bonus( iv_expected = 10 iv_sales = 1000 iv_target = 1000 iv_years = 0 ).
ENDMETHOD.
METHOD above_target.
assert_bonus( iv_expected = 16 iv_sales = 1200 iv_target = 1000 iv_years = 0 ).
ENDMETHOD.
METHOD top_tier.
assert_bonus( iv_expected = 50 iv_sales = 2000 iv_target = 1000 iv_years = 0 ).
ENDMETHOD.
METHOD loyalty_bonus.
assert_bonus( iv_expected = 210 iv_sales = 1000 iv_target = 1000 iv_years = 5 ).
assert_bonus( iv_expected = 510 iv_sales = 1000 iv_target = 1000 iv_years = 10 ).
ENDMETHOD.
METHOD cap_applied.
assert_bonus( iv_expected = 5000 iv_sales = 100000 iv_target = 1000 iv_years = 10 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,8 @@
INTERFACE {{p}}if_commission PUBLIC.
TYPES ty_amount TYPE p LENGTH 15 DECIMALS 2.
METHODS calculate
IMPORTING iv_sales TYPE ty_amount
iv_target TYPE ty_amount
iv_years TYPE i
RETURNING VALUE(rv_bonus) TYPE ty_amount.
ENDINTERFACE.

View File

@@ -0,0 +1,68 @@
# 1. Goal
A company pays a monthly commission to its sales agents. A payroll program
calls one calculation for each agent and each month. The calculation returns
the commission of one agent.
# 2. Open questions
None.
# 3. Context
- The interface {{P}}IF_COMMISSION exists in package $TMP. It is active.
- The interface contains the type TY_AMOUNT. TY_AMOUNT is a packed number
with length 15 and 2 decimal places.
- The interface contains one method:
CALCULATE
IMPORTING iv_sales TYPE ty_amount
iv_target TYPE ty_amount
iv_years TYPE i
RETURNING VALUE(rv_bonus) TYPE ty_amount
- iv_sales is the sales volume of the month.
- iv_target is the monthly target of the agent.
- iv_years is the number of completed years of service of the agent.
# 4. Contract
- Create the class {{P}}COMMISSION_CALC in package $TMP.
- The class is public and final. The class has a public constructor without
parameters.
- The class implements the interface {{P}}IF_COMMISSION.
- Do not add other public methods.
# 5. Business rules
Apply the rules in this sequence.
1. If iv_sales is zero or negative, or if iv_target is zero or negative,
return 0.
2. If two times iv_sales is less than iv_target, return 0.
3. Calculate the commission. Keep the full precision. Round only in rule 4.
a. Add 1 percent of the part of iv_sales that is at most iv_target.
b. If iv_sales is more than iv_target, add 3 percent of the part of
iv_sales that is more than iv_target. Use at most half of iv_target
for this part.
c. If iv_sales is more than 1.5 times iv_target, add 5 percent of the
part of iv_sales that is more than 1.5 times iv_target.
4. Round the commission to 2 decimal places. Use commercial rounding.
5. Add the loyalty bonus. Add 500 if iv_years is 10 or more. Add 200 if
iv_years is 5 or more. Add 0 in all other cases.
6. If the result is more than 5000, return 5000.
7. Return the result.
# 6. Constraints
- Release target: 7.40 SP05. Use only language elements that this release
supports. Do not use language elements of a later release.
- Coding standards: Clean ABAP. Method length below 40 statements. No global
variables. No comment that restates the code.
- Out of scope: do not change the interface {{P}}IF_COMMISSION.
# 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,51 @@
{
"id": "G0164",
"category": "G",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v740sp05",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
},
"seed": [
{
"type": "INTF",
"name": "{{P}}IF_COMMISSION",
"file": "seed/if_commission.intf.abap",
"description": "Commission calculation contract"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}COMMISSION_CALC",
"implements": "{{P}}IF_COMMISSION"
}
],
"out_of_scope": [
"{{P}}IF_COMMISSION"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T42_HIDDEN",
"file": "hidden/t42_hidden.clas.abap",
"description": "T42 hidden tests"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}COMMISSION_CALC",
"file": "reference/commission_calc.clas.abap",
"description": "Commission calculation",
"testclasses_file": "reference/commission_calc.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"no_newer_syntax"
]
}