Step F first pass: 81/92 accepted; budget floor 60 calls; rejected slots moved for regeneration

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
Kral
2026-10-03 12:10:52 +02:00
parent d3250acfb8
commit 39769afce8
741 changed files with 40573 additions and 317 deletions

View File

@@ -0,0 +1,119 @@
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.

View File

@@ -0,0 +1,119 @@
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
OR 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.

View File

@@ -0,0 +1,119 @@
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.

View File

@@ -0,0 +1,119 @@
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.

View File

@@ -0,0 +1,119 @@
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.

View File

@@ -0,0 +1,24 @@
{
"id": "G0148",
"pool": "eval",
"object_type": "CLAS",
"category": "F",
"attempts": [
{
"stage": "validate",
"oracle": 89.2,
"null": 0
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,139 @@
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_trade_in.
METHODS setup.
METHODS premium_new_car FOR TESTING.
METHODS volume_one_year FOR TESTING.
METHODS premium_age_mileage FOR TESTING.
METHODS mileage_rounds_down FOR TESTING.
METHODS budget_grade_c FOR TESTING.
METHODS floor_at_minimum FOR TESTING.
METHODS unknown_brand FOR TESTING.
METHODS unknown_grade FOR TESTING.
METHODS negative_age FOR TESTING.
METHODS age_too_high FOR TESTING.
METHODS negative_mileage FOR TESTING.
METHODS mileage_too_high FOR TESTING.
ENDCLASS.
CLASS {{p}}t02_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}trade_in_valuer( ).
ENDMETHOD.
METHOD premium_new_car.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-premium
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 30000 act = ls_result-amount ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-ok
act = ls_result-reason ).
ENDMETHOD.
METHOD volume_one_year.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-a
iv_age_months = 12
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 19360 act = ls_result-amount ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-ok
act = ls_result-reason ).
ENDMETHOD.
METHOD premium_age_mileage.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-premium
iv_grade = {{p}}if_trade_in=>c_grade-a
iv_age_months = 12
iv_mileage = 20000 ).
cl_abap_unit_assert=>assert_equals( exp = 28380 act = ls_result-amount ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-ok
act = ls_result-reason ).
ENDMETHOD.
METHOD mileage_rounds_down.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = 25000 ).
cl_abap_unit_assert=>assert_equals( exp = 19600 act = ls_result-amount ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-ok
act = ls_result-reason ).
ENDMETHOD.
METHOD budget_grade_c.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-budget
iv_grade = {{p}}if_trade_in=>c_grade-c
iv_age_months = 12
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 8448 act = ls_result-amount ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-ok
act = ls_result-reason ).
ENDMETHOD.
METHOD floor_at_minimum.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-budget
iv_grade = {{p}}if_trade_in=>c_grade-c
iv_age_months = 300
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 500 act = ls_result-amount ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-ok
act = ls_result-reason ).
ENDMETHOD.
METHOD unknown_brand.
DATA(ls_result) = mo_cut->assess( iv_brand = 'FORD'
iv_grade = 'X'
iv_age_months = -1
iv_mileage = -1 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-brand
act = ls_result-reason ).
ENDMETHOD.
METHOD unknown_grade.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = 'X'
iv_age_months = -1
iv_mileage = -1 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-grade
act = ls_result-reason ).
ENDMETHOD.
METHOD negative_age.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = -1
iv_mileage = -1 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-age
act = ls_result-reason ).
ENDMETHOD.
METHOD age_too_high.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 601
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-age
act = ls_result-reason ).
ENDMETHOD.
METHOD negative_mileage.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = -1 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-mileage
act = ls_result-reason ).
ENDMETHOD.
METHOD mileage_too_high.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = 1000001 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-mileage
act = ls_result-reason ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,70 @@
{
"task": "G0148",
"mutants": [
{
"object": "{{P}}TRADE_IN_VALUER",
"mutant": "line 68: <> -> = (rel)",
"status": "killed",
"hidden": "9/12",
"failed_tests": [
"BUDGET_GRADE_C",
"FLOOR_AT_MINIMUM",
"UNKNOWN_BRAND"
]
},
{
"object": "{{P}}TRADE_IN_VALUER",
"mutant": "line 74: AND -> OR (logic)",
"status": "killed",
"hidden": "2/12",
"failed_tests": [
"AGE_TOO_HIGH",
"BUDGET_GRADE_C",
"FLOOR_AT_MINIMUM",
"MILEAGE_ROUNDS_DOWN",
"MILEAGE_TOO_HIGH",
"NEGATIVE_AGE",
"NEGATIVE_MILEAGE",
"PREMIUM_AGE_MILEAGE",
"PREMIUM_NEW_CAR",
"VOLUME_ONE_YEAR"
]
},
{
"object": "{{P}}TRADE_IN_VALUER",
"mutant": "line 74: <> -> = (rel)",
"status": "killed",
"hidden": "9/12",
"failed_tests": [
"BUDGET_GRADE_C",
"FLOOR_AT_MINIMUM",
"UNKNOWN_GRADE"
]
},
{
"object": "{{P}}TRADE_IN_VALUER",
"mutant": "line 75: <> -> = (rel)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"UNKNOWN_GRADE"
]
},
{
"object": "{{P}}TRADE_IN_VALUER",
"mutant": "line 82: - -> + (arith)",
"status": "killed",
"hidden": "8/12",
"failed_tests": [
"BUDGET_GRADE_C",
"FLOOR_AT_MINIMUM",
"PREMIUM_AGE_MILEAGE",
"VOLUME_ONE_YEAR"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,119 @@
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.

View File

@@ -0,0 +1,91 @@
CLASS ltc_trade_in_valuer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_trade_in.
METHODS setup.
METHODS premium_new_car FOR TESTING.
METHODS volume_one_year FOR TESTING.
METHODS mileage_rounds_down FOR TESTING.
METHODS floor_at_minimum FOR TESTING.
METHODS unknown_brand FOR TESTING.
METHODS unknown_grade FOR TESTING.
METHODS negative_age FOR TESTING.
METHODS mileage_too_high FOR TESTING.
ENDCLASS.
CLASS ltc_trade_in_valuer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}trade_in_valuer( ).
ENDMETHOD.
METHOD premium_new_car.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-premium
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 30000 act = ls_result-amount ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-ok
act = ls_result-reason ).
ENDMETHOD.
METHOD volume_one_year.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-a
iv_age_months = 12
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 19360 act = ls_result-amount ).
ENDMETHOD.
METHOD mileage_rounds_down.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = 25000 ).
cl_abap_unit_assert=>assert_equals( exp = 19600 act = ls_result-amount ).
ENDMETHOD.
METHOD floor_at_minimum.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-budget
iv_grade = {{p}}if_trade_in=>c_grade-d
iv_age_months = 600
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 500 act = ls_result-amount ).
ENDMETHOD.
METHOD unknown_brand.
DATA(ls_result) = mo_cut->assess( iv_brand = 'FORD'
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-brand
act = ls_result-reason ).
ENDMETHOD.
METHOD unknown_grade.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = 'X'
iv_age_months = 0
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-grade
act = ls_result-reason ).
ENDMETHOD.
METHOD negative_age.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = -1
iv_mileage = 0 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-age
act = ls_result-reason ).
ENDMETHOD.
METHOD mileage_too_high.
DATA(ls_result) = mo_cut->assess( iv_brand = {{p}}if_trade_in=>c_brand-volume
iv_grade = {{p}}if_trade_in=>c_grade-b
iv_age_months = 0
iv_mileage = 1000001 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_trade_in=>c_reason-mileage
act = ls_result-reason ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,36 @@
INTERFACE {{p}}if_trade_in PUBLIC.
TYPES ty_value TYPE i.
TYPES ty_brand TYPE c LENGTH 8.
TYPES ty_grade TYPE c LENGTH 1.
TYPES ty_reason TYPE c LENGTH 10.
TYPES:
BEGIN OF ty_result,
amount TYPE ty_value,
reason TYPE ty_reason,
END OF ty_result.
CONSTANTS:
BEGIN OF c_brand,
premium TYPE ty_brand VALUE 'PREMIUM',
volume TYPE ty_brand VALUE 'VOLUME',
budget TYPE ty_brand VALUE 'BUDGET',
END OF c_brand,
BEGIN OF c_grade,
a TYPE ty_grade VALUE 'A',
b TYPE ty_grade VALUE 'B',
c TYPE ty_grade VALUE 'C',
d TYPE ty_grade VALUE 'D',
END OF c_grade,
BEGIN OF c_reason,
ok TYPE ty_reason VALUE 'OK',
brand TYPE ty_reason VALUE 'BRAND',
grade TYPE ty_reason VALUE 'GRADE',
age TYPE ty_reason VALUE 'AGE',
mileage TYPE ty_reason VALUE 'MILEAGE',
END OF c_reason.
METHODS assess
IMPORTING iv_brand TYPE ty_brand
iv_grade TYPE ty_grade
iv_age_months TYPE i
iv_mileage TYPE i
RETURNING VALUE(rs_result) TYPE ty_result.
ENDINTERFACE.

View File

@@ -0,0 +1,60 @@
# 1. Goal
A car dealership accepts used cars as trade-ins. A sales program calls one
valuation for each offered car before the dealership makes an offer to the
customer. The valuation returns the trade-in value in whole euros and a reason
code.
# 2. Open questions
None.
# 3. Context
- The interface {{P}}IF_TRADE_IN exists in package $TMP. It is active.
- The interface defines the whole contract of the valuation: the result
structure, the input types, the three brand groups, the four condition
grades, the reason codes and one method. Read the interface in the system.
- The dealership uses the brand groups premium, volume and budget and the
condition grades A, B, C and D.
- All amounts are whole euros. All arithmetic is integer arithmetic.
# 4. Contract
- Create the class {{P}}TRADE_IN_VALUER in package $TMP.
- The class is public, final, and has a public constructor without parameters.
- The class implements {{P}}IF_TRADE_IN.
- Do not add other public methods.
- Do not change {{P}}IF_TRADE_IN.
# 5. Business rules
Apply the rules in this sequence. Return the reason code of the first rule that
fails. The interface defines one reason code for each rule below and one reason
code for a successful valuation. Each code is named after the rule that it
reports.
1. The brand group must be one of the three brand groups that the interface
defines. If not, return the reason code for the brand group.
2. The condition grade must be one of the four grades that the interface
defines. If not, return the reason code for the condition grade.
3. The age in months must be between 0 and 600. If not, return the reason code
for the age.
4. The mileage in kilometres must be between 0 and 1000000. If not, return the
reason code for the mileage.
5. The base value is 30000 euros for the premium brand group, 20000 euros for
the volume brand group and 12000 euros for the budget brand group.
6. Deduct 1 percent of the base value for each month of age.
7. Deduct 1 percent of the base value for each complete block of 10000
kilometres of mileage. Only complete blocks count. A mileage of 25000
kilometres contains two complete blocks and 5000 kilometres that do not
count. A mileage of 9999 kilometres contains no complete block.
8. Multiply the result by the grade factor: grade A 110 percent, grade B
100 percent, grade C 80 percent, grade D 60 percent.
9. If the result is below 500, the value is 500.
10. Return the value and the reason code for a successful valuation.
# 6. Constraints
- Release target: 8.16.
- Coding standards: Clean ABAP. Method length below 40 statements. No global
variables. No comment that restates the code.
- Out of scope: do not change {{P}}IF_TRADE_IN.
# 7. Acceptance
- The class is active and has no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,51 @@
{
"id": "G0148",
"category": "F",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "INTF",
"name": "{{P}}IF_TRADE_IN",
"file": "seed/if_trade_in.intf.abap",
"description": "Trade-in valuation contract"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}TRADE_IN_VALUER",
"implements": "{{P}}IF_TRADE_IN"
}
],
"out_of_scope": [
"{{P}}IF_TRADE_IN"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T02_HIDDEN",
"file": "hidden/t02_hidden.clas.abap",
"description": "T02 hidden tests"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}TRADE_IN_VALUER",
"file": "reference/trade_in_valuer.clas.abap",
"description": "Trade-in valuer",
"testclasses_file": "reference/trade_in_valuer.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"db_operation_in_loop"
]
}