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,146 @@
CLASS {{p}}locksmith_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_locksmith_pricer.
PRIVATE SECTION.
CONSTANTS:
c_job_key TYPE {{p}}if_locksmith_pricer=>ty_job_type VALUE 'K',
c_job_lockout TYPE {{p}}if_locksmith_pricer=>ty_job_type VALUE 'L',
c_job_rekey TYPE {{p}}if_locksmith_pricer=>ty_job_type VALUE 'R',
c_key_std TYPE {{p}}if_locksmith_pricer=>ty_key_type VALUE 'S',
c_key_sec TYPE {{p}}if_locksmith_pricer=>ty_key_type VALUE 'Y',
c_key_elec TYPE {{p}}if_locksmith_pricer=>ty_key_type VALUE 'E',
c_call_late TYPE {{p}}if_locksmith_pricer=>ty_callout VALUE 'A',
c_call_week TYPE {{p}}if_locksmith_pricer=>ty_callout VALUE 'W',
c_fee_std TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '89.00',
c_fee_late TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '149.00',
c_fee_week TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '179.00',
c_rekey_base TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '35.00',
c_rate_dup_s TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '4.50',
c_rate_dup_y TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '9.80',
c_rate_dup_e TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '24.00',
c_rate_rek_s TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '6.00',
c_rate_rek_y TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '11.00',
c_rate_rek_e TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '26.00',
c_qty_mid TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '5.00',
c_qty_high TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '20.00',
c_disc_mid TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '10.00',
c_disc_high TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '20.00',
c_percent TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '100.00',
c_nothing TYPE {{p}}if_locksmith_pricer=>ty_amount VALUE '0.00'.
METHODS duplicate_price
IMPORTING iv_quantity TYPE i
iv_key_type TYPE {{p}}if_locksmith_pricer=>ty_key_type
RETURNING VALUE(rv_price) TYPE {{p}}if_locksmith_pricer=>ty_amount.
METHODS rekey_price
IMPORTING iv_quantity TYPE i
iv_key_type TYPE {{p}}if_locksmith_pricer=>ty_key_type
RETURNING VALUE(rv_price) TYPE {{p}}if_locksmith_pricer=>ty_amount.
METHODS lockout_price
IMPORTING iv_callout TYPE {{p}}if_locksmith_pricer=>ty_callout
RETURNING VALUE(rv_price) TYPE {{p}}if_locksmith_pricer=>ty_amount.
METHODS dup_key_rate
IMPORTING iv_key_type TYPE {{p}}if_locksmith_pricer=>ty_key_type
RETURNING VALUE(rv_rate) TYPE {{p}}if_locksmith_pricer=>ty_amount.
METHODS rekey_key_rate
IMPORTING iv_key_type TYPE {{p}}if_locksmith_pricer=>ty_key_type
RETURNING VALUE(rv_rate) TYPE {{p}}if_locksmith_pricer=>ty_amount.
METHODS discount_percent
IMPORTING iv_quantity TYPE i
RETURNING VALUE(rv_percent) TYPE {{p}}if_locksmith_pricer=>ty_amount.
ENDCLASS.
CLASS {{p}}locksmith_pricer IMPLEMENTATION.
METHOD {{p}}if_locksmith_pricer~calculate_price.
CASE iv_job_type.
WHEN c_job_key.
rv_price = duplicate_price( iv_quantity = iv_quantity
iv_key_type = iv_key_type ).
WHEN c_job_lockout.
rv_price = lockout_price( iv_callout = iv_callout ).
WHEN c_job_rekey.
rv_price = rekey_price( iv_quantity = iv_quantity
iv_key_type = iv_key_type ).
WHEN OTHERS.
rv_price = c_nothing.
ENDCASE.
ENDMETHOD.
METHOD duplicate_price.
DATA lv_qty TYPE {{p}}if_locksmith_pricer=>ty_amount.
lv_qty = iv_quantity.
IF lv_qty < 1.
RETURN.
ENDIF.
DATA(lv_rate) = dup_key_rate( iv_key_type ).
IF lv_rate = 0.
RETURN.
ENDIF.
DATA lv_gross TYPE {{p}}if_locksmith_pricer=>ty_amount.
lv_gross = lv_rate * lv_qty.
DATA(lv_discount) = discount_percent( iv_quantity ).
rv_price = lv_gross - lv_gross * lv_discount / c_percent.
ENDMETHOD.
METHOD rekey_price.
DATA lv_qty TYPE {{p}}if_locksmith_pricer=>ty_amount.
lv_qty = iv_quantity.
IF lv_qty < 1.
RETURN.
ENDIF.
DATA(lv_rate) = rekey_key_rate( iv_key_type ).
IF lv_rate = 0.
RETURN.
ENDIF.
rv_price = lv_qty * ( c_rekey_base + lv_rate ).
ENDMETHOD.
METHOD lockout_price.
CASE iv_callout.
WHEN c_call_week.
rv_price = c_fee_week.
WHEN c_call_late.
rv_price = c_fee_late.
WHEN OTHERS.
rv_price = c_fee_std.
ENDCASE.
ENDMETHOD.
METHOD dup_key_rate.
CASE iv_key_type.
WHEN c_key_std.
rv_rate = c_rate_dup_s.
WHEN c_key_sec.
rv_rate = c_rate_dup_y.
WHEN c_key_elec.
rv_rate = c_rate_dup_e.
WHEN OTHERS.
rv_rate = c_nothing.
ENDCASE.
ENDMETHOD.
METHOD rekey_key_rate.
CASE iv_key_type.
WHEN c_key_std.
rv_rate = c_rate_rek_s.
WHEN c_key_sec.
rv_rate = c_rate_rek_y.
WHEN c_key_elec.
rv_rate = c_rate_rek_e.
WHEN OTHERS.
rv_rate = c_nothing.
ENDCASE.
ENDMETHOD.
METHOD discount_percent.
IF iv_quantity >= c_qty_high.
rv_percent = c_disc_high.
ELSEIF iv_quantity >= c_qty_mid.
rv_percent = c_disc_mid.
ELSE.
rv_percent = c_nothing.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,74 @@
CLASS ltc_locksmith_pricer DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_locksmith_pricer.
METHODS setup.
METHODS dup_standard FOR TESTING.
METHODS dup_discount FOR TESTING.
METHODS dup_high_discount FOR TESTING.
METHODS lockout_late FOR TESTING.
METHODS rekey_standard FOR TESTING.
METHODS unknown_job FOR TESTING.
METHODS assert_price
IMPORTING iv_expected TYPE {{p}}if_locksmith_pricer=>ty_amount
iv_actual TYPE {{p}}if_locksmith_pricer=>ty_amount.
ENDCLASS.
CLASS ltc_locksmith_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}locksmith_pricer( ).
ENDMETHOD.
METHOD dup_standard.
assert_price( iv_expected = '13.50'
iv_actual = mo_cut->calculate_price( iv_job_type = 'K'
iv_quantity = 3
iv_key_type = 'S'
iv_callout = 'N' ) ).
ENDMETHOD.
METHOD dup_discount.
assert_price( iv_expected = '20.25'
iv_actual = mo_cut->calculate_price( iv_job_type = 'K'
iv_quantity = 5
iv_key_type = 'S'
iv_callout = 'N' ) ).
ENDMETHOD.
METHOD dup_high_discount.
assert_price( iv_expected = '156.80'
iv_actual = mo_cut->calculate_price( iv_job_type = 'K'
iv_quantity = 20
iv_key_type = 'Y'
iv_callout = 'N' ) ).
ENDMETHOD.
METHOD lockout_late.
assert_price( iv_expected = '149.00'
iv_actual = mo_cut->calculate_price( iv_job_type = 'L'
iv_quantity = 0
iv_key_type = 'X'
iv_callout = 'A' ) ).
ENDMETHOD.
METHOD rekey_standard.
assert_price( iv_expected = '82.00'
iv_actual = mo_cut->calculate_price( iv_job_type = 'R'
iv_quantity = 2
iv_key_type = 'S'
iv_callout = 'N' ) ).
ENDMETHOD.
METHOD unknown_job.
assert_price( iv_expected = '0.00'
iv_actual = mo_cut->calculate_price( iv_job_type = 'X'
iv_quantity = 1
iv_key_type = 'S'
iv_callout = 'N' ) ).
ENDMETHOD.
METHOD assert_price.
cl_abap_unit_assert=>assert_equals( exp = iv_expected
act = iv_actual ).
ENDMETHOD.
ENDCLASS.