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.