Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
114 lines
3.3 KiB
ABAP
114 lines
3.3 KiB
ABAP
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.
|