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:
113
tasks_gen/eval/G0164/reference/commission_calc.clas.abap
Normal file
113
tasks_gen/eval/G0164/reference/commission_calc.clas.abap
Normal 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.
|
||||
Reference in New Issue
Block a user