CLASS {{p}}med_copay DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_med_copay. PRIVATE SECTION. CONSTANTS: c_percent_standard TYPE i VALUE 30, c_percent_chronic TYPE i VALUE 10, c_min_standard TYPE {{p}}if_med_copay=>ty_amount VALUE '5.00', c_max_standard TYPE {{p}}if_med_copay=>ty_amount VALUE '50.00', c_min_chronic TYPE {{p}}if_med_copay=>ty_amount VALUE '5.00', c_max_chronic TYPE {{p}}if_med_copay=>ty_amount VALUE '10.00'. METHODS copay_for_tier IMPORTING iv_total TYPE {{p}}if_med_copay=>ty_amount iv_tier TYPE {{p}}if_med_copay=>ty_tier RETURNING VALUE(rv_amount) TYPE {{p}}if_med_copay=>ty_amount. METHODS percentage IMPORTING iv_total TYPE {{p}}if_med_copay=>ty_amount iv_percent TYPE i RETURNING VALUE(rv_amount) TYPE {{p}}if_med_copay=>ty_amount. METHODS apply_limits IMPORTING iv_amount TYPE {{p}}if_med_copay=>ty_amount iv_min TYPE {{p}}if_med_copay=>ty_amount iv_max TYPE {{p}}if_med_copay=>ty_amount RETURNING VALUE(rv_amount) TYPE {{p}}if_med_copay=>ty_amount. METHODS is_known_tier IMPORTING iv_tier TYPE {{p}}if_med_copay=>ty_tier RETURNING VALUE(rv_known) TYPE abap_bool. ENDCLASS. CLASS {{p}}med_copay IMPLEMENTATION. METHOD {{p}}if_med_copay~calculate. IF iv_price <= 0. rs_result = VALUE #( copay = 0 reason = {{p}}if_med_copay=>c_reason-price ). RETURN. ENDIF. IF iv_quantity < 1. rs_result = VALUE #( copay = 0 reason = {{p}}if_med_copay=>c_reason-quantity ). RETURN. ENDIF. IF is_known_tier( iv_tier ) = abap_false. rs_result = VALUE #( copay = 0 reason = {{p}}if_med_copay=>c_reason-tier ). RETURN. ENDIF. DATA lv_total TYPE {{p}}if_med_copay=>ty_amount. lv_total = iv_price * iv_quantity. rs_result = VALUE #( copay = copay_for_tier( iv_total = lv_total iv_tier = iv_tier ) reason = {{p}}if_med_copay=>c_reason-ok ). IF rs_result-copay > lv_total. rs_result-copay = lv_total. ENDIF. ENDMETHOD. METHOD copay_for_tier. CASE iv_tier. WHEN {{p}}if_med_copay=>c_tier-exempt. rv_amount = 0. WHEN {{p}}if_med_copay=>c_tier-chronic. rv_amount = apply_limits( iv_amount = percentage( iv_total = iv_total iv_percent = c_percent_chronic ) iv_min = c_min_chronic iv_max = c_max_chronic ). WHEN {{p}}if_med_copay=>c_tier-standard. rv_amount = apply_limits( iv_amount = percentage( iv_total = iv_total iv_percent = c_percent_standard ) iv_min = c_min_standard iv_max = c_max_standard ). WHEN OTHERS. rv_amount = 0. ENDCASE. ENDMETHOD. METHOD percentage. rv_amount = round( val = iv_total * iv_percent / 100 dec = 2 ). ENDMETHOD. METHOD apply_limits. rv_amount = iv_amount. IF rv_amount < iv_min. rv_amount = iv_min. ELSEIF rv_amount > iv_max. rv_amount = iv_max. ENDIF. ENDMETHOD. METHOD is_known_tier. rv_known = xsdbool( iv_tier = {{p}}if_med_copay=>c_tier-standard OR iv_tier = {{p}}if_med_copay=>c_tier-chronic OR iv_tier = {{p}}if_med_copay=>c_tier-exempt ). ENDMETHOD. ENDCLASS.