CLASS {{p}}loyalty_evaluator DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_loyalty_rules. PRIVATE SECTION. CONSTANTS: c_silver_threshold TYPE i VALUE 1000, c_gold_threshold TYPE i VALUE 5000, c_platinum_threshold TYPE i VALUE 20000. METHODS normalize_points IMPORTING iv_points TYPE i RETURNING VALUE(rv_points) TYPE i. METHODS tier_of IMPORTING iv_points TYPE i RETURNING VALUE(rv_tier) TYPE {{p}}if_loyalty_rules=>ty_tier. METHODS points_to_tier IMPORTING iv_points TYPE i iv_tier TYPE {{p}}if_loyalty_rules=>ty_tier RETURNING VALUE(rv_points) TYPE i. ENDCLASS. CLASS {{p}}loyalty_evaluator IMPLEMENTATION. METHOD {{p}}if_loyalty_rules~get_tier. rv_tier = tier_of( normalize_points( iv_points ) ). ENDMETHOD. METHOD {{p}}if_loyalty_rules~get_discount. CASE iv_tier. WHEN {{p}}if_loyalty_rules=>c_tier-silver. rv_percent = 3. WHEN {{p}}if_loyalty_rules=>c_tier-gold. rv_percent = 7. WHEN {{p}}if_loyalty_rules=>c_tier-platinum. rv_percent = 12. WHEN OTHERS. rv_percent = 0. ENDCASE. ENDMETHOD. METHOD {{p}}if_loyalty_rules~points_to_next_tier. DATA(lv_points) = normalize_points( iv_points ). DATA(lv_tier) = tier_of( lv_points ). rv_points = points_to_tier( iv_points = lv_points iv_tier = lv_tier ). ENDMETHOD. METHOD normalize_points. rv_points = COND #( WHEN iv_points < 0 THEN 0 ELSE iv_points ). ENDMETHOD. METHOD tier_of. IF iv_points >= c_platinum_threshold. rv_tier = {{p}}if_loyalty_rules=>c_tier-platinum. ELSEIF iv_points >= c_gold_threshold. rv_tier = {{p}}if_loyalty_rules=>c_tier-gold. ELSEIF iv_points < c_silver_threshold. rv_tier = {{p}}if_loyalty_rules=>c_tier-silver. ELSE. rv_tier = {{p}}if_loyalty_rules=>c_tier-basic. ENDIF. ENDMETHOD. METHOD points_to_tier. CASE iv_tier. WHEN {{p}}if_loyalty_rules=>c_tier-basic. rv_points = c_silver_threshold - iv_points. WHEN {{p}}if_loyalty_rules=>c_tier-silver. rv_points = c_gold_threshold - iv_points. WHEN {{p}}if_loyalty_rules=>c_tier-gold. rv_points = c_platinum_threshold - iv_points. WHEN OTHERS. rv_points = 0. ENDCASE. ENDMETHOD. ENDCLASS.