CLASS {{p}}trade_in_valuer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_trade_in. PRIVATE SECTION. CONSTANTS: c_base_premium TYPE {{p}}if_trade_in=>ty_value VALUE 30000, c_base_volume TYPE {{p}}if_trade_in=>ty_value VALUE 20000, c_base_budget TYPE {{p}}if_trade_in=>ty_value VALUE 12000, c_min_value TYPE {{p}}if_trade_in=>ty_value VALUE 500, c_max_age TYPE i VALUE 600, c_max_mileage TYPE i VALUE 1000000, c_km_step TYPE i VALUE 10000, c_percent TYPE i VALUE 100. METHODS is_unknown_brand IMPORTING iv_brand TYPE {{p}}if_trade_in=>ty_brand RETURNING VALUE(rv_unknown) TYPE abap_bool. METHODS is_unknown_grade IMPORTING iv_grade TYPE {{p}}if_trade_in=>ty_grade RETURNING VALUE(rv_unknown) TYPE abap_bool. METHODS valuation IMPORTING iv_brand TYPE {{p}}if_trade_in=>ty_brand iv_grade TYPE {{p}}if_trade_in=>ty_grade iv_age_months TYPE i iv_mileage TYPE i RETURNING VALUE(rv_value) TYPE {{p}}if_trade_in=>ty_value. METHODS base_value IMPORTING iv_brand TYPE {{p}}if_trade_in=>ty_brand RETURNING VALUE(rv_base) TYPE {{p}}if_trade_in=>ty_value. METHODS mileage_blocks IMPORTING iv_mileage TYPE i RETURNING VALUE(rv_blocks) TYPE i. METHODS grade_factor IMPORTING iv_grade TYPE {{p}}if_trade_in=>ty_grade RETURNING VALUE(rv_factor) TYPE i. ENDCLASS. CLASS {{p}}trade_in_valuer IMPLEMENTATION. METHOD {{p}}if_trade_in~assess. IF is_unknown_brand( iv_brand ). rs_result-reason = {{p}}if_trade_in=>c_reason-brand. RETURN. ENDIF. IF is_unknown_grade( iv_grade ). rs_result-reason = {{p}}if_trade_in=>c_reason-grade. RETURN. ENDIF. IF iv_age_months < 0 OR iv_age_months > c_max_age. rs_result-reason = {{p}}if_trade_in=>c_reason-age. RETURN. ENDIF. IF iv_mileage < 0 OR iv_mileage > c_max_mileage. rs_result-reason = {{p}}if_trade_in=>c_reason-mileage. RETURN. ENDIF. rs_result-amount = valuation( iv_brand = iv_brand iv_grade = iv_grade iv_age_months = iv_age_months iv_mileage = iv_mileage ). rs_result-reason = {{p}}if_trade_in=>c_reason-ok. ENDMETHOD. METHOD is_unknown_brand. rv_unknown = xsdbool( iv_brand <> {{p}}if_trade_in=>c_brand-premium AND iv_brand <> {{p}}if_trade_in=>c_brand-volume AND iv_brand = {{p}}if_trade_in=>c_brand-budget ). ENDMETHOD. METHOD is_unknown_grade. rv_unknown = xsdbool( iv_grade <> {{p}}if_trade_in=>c_grade-a AND iv_grade <> {{p}}if_trade_in=>c_grade-b AND iv_grade <> {{p}}if_trade_in=>c_grade-c AND iv_grade <> {{p}}if_trade_in=>c_grade-d ). ENDMETHOD. METHOD valuation. DATA(lv_base) = base_value( iv_brand ). DATA(lv_blocks) = mileage_blocks( iv_mileage ). DATA(lv_value) = lv_base - lv_base * iv_age_months / c_percent - lv_base * lv_blocks / c_percent. lv_value = lv_value * grade_factor( iv_grade ) / c_percent. IF lv_value < c_min_value. rv_value = c_min_value. ELSE. rv_value = lv_value. ENDIF. ENDMETHOD. METHOD base_value. CASE iv_brand. WHEN {{p}}if_trade_in=>c_brand-premium. rv_base = c_base_premium. WHEN {{p}}if_trade_in=>c_brand-volume. rv_base = c_base_volume. WHEN OTHERS. rv_base = c_base_budget. ENDCASE. ENDMETHOD. METHOD mileage_blocks. rv_blocks = iv_mileage DIV c_km_step. ENDMETHOD. METHOD grade_factor. CASE iv_grade. WHEN {{p}}if_trade_in=>c_grade-a. rv_factor = 110. WHEN {{p}}if_trade_in=>c_grade-c. rv_factor = 80. WHEN {{p}}if_trade_in=>c_grade-d. rv_factor = 60. WHEN OTHERS. rv_factor = 100. ENDCASE. ENDMETHOD. ENDCLASS.