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