Generator: pilot analysis and fixes; G0002-G0021 tasks; handover notes merged

- Static bundle checks (name length, seed type, reserved words, contract test classes,
  testclasses_file), local abaplint parser check before SAP, max_tokens, robust JSON parse
- Runner: G2 for CDS views with parameters, contract_check detail in report
- G0020 and G0013 fixed by review and revalidated (oracle 100, null 0)
- Pilot results in docs/faz1-tasarim.md 11e; handover notes merged into CLAUDE.md and docs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-03 05:04:23 +02:00
parent 15eb9f1bb2
commit 5de5e2851c
162 changed files with 9943 additions and 23 deletions

View File

@@ -0,0 +1,149 @@
CLASS {{p}}freight_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_freight_calc.
PRIVATE SECTION.
TYPES ty_quantity TYPE p LENGTH 13 DECIMALS 3.
CONSTANTS:
c_base_amount TYPE {{p}}if_freight_calc=>ty_amount VALUE '45.00',
c_base_weight TYPE ty_quantity VALUE '1000.000',
c_weight_rate TYPE {{p}}if_freight_calc=>ty_amount VALUE '6.50',
c_free_km TYPE i VALUE 100,
c_km_rate TYPE {{p}}if_freight_calc=>ty_amount VALUE '9.00',
c_step TYPE ty_quantity VALUE '100.000',
c_volume_factor TYPE i VALUE 250,
c_percent TYPE p LENGTH 3 DECIMALS 2 VALUE '0.01'.
METHODS check_input
IMPORTING iv_weight_kg TYPE {{p}}if_freight_calc=>ty_weight
iv_volume_m3 TYPE {{p}}if_freight_calc=>ty_volume
iv_distance_km TYPE {{p}}if_freight_calc=>ty_distance
iv_fuel_index TYPE {{p}}if_freight_calc=>ty_fuel
RETURNING VALUE(rv_reason) TYPE {{p}}if_freight_calc=>ty_reason.
METHODS chargeable_weight
IMPORTING iv_weight_kg TYPE {{p}}if_freight_calc=>ty_weight
iv_volume_m3 TYPE {{p}}if_freight_calc=>ty_volume
RETURNING VALUE(rv_weight) TYPE ty_quantity.
METHODS base_freight
IMPORTING iv_weight_kg TYPE ty_quantity
RETURNING VALUE(rv_amount) TYPE {{p}}if_freight_calc=>ty_amount.
METHODS distance_freight
IMPORTING iv_distance_km TYPE {{p}}if_freight_calc=>ty_distance
RETURNING VALUE(rv_amount) TYPE {{p}}if_freight_calc=>ty_amount.
METHODS fuel_freight
IMPORTING iv_amount TYPE {{p}}if_freight_calc=>ty_amount
iv_fuel_index TYPE {{p}}if_freight_calc=>ty_fuel
RETURNING VALUE(rv_amount) TYPE {{p}}if_freight_calc=>ty_amount.
METHODS started_steps
IMPORTING iv_excess TYPE ty_quantity
RETURNING VALUE(rv_steps) TYPE i.
ENDCLASS.
CLASS {{p}}freight_calc IMPLEMENTATION.
METHOD {{p}}if_freight_calc~calculate.
DATA lv_reason TYPE {{p}}if_freight_calc=>ty_reason.
DATA lv_weight TYPE ty_quantity.
DATA lv_net TYPE {{p}}if_freight_calc=>ty_amount.
CLEAR rs_result.
lv_reason = check_input( iv_weight_kg = iv_weight_kg
iv_volume_m3 = iv_volume_m3
iv_distance_km = iv_distance_km
iv_fuel_index = iv_fuel_index ).
IF lv_reason <> {{p}}if_freight_calc=>c_reason-ok.
rs_result-reason = lv_reason.
RETURN.
ENDIF.
lv_weight = chargeable_weight( iv_weight_kg = iv_weight_kg
iv_volume_m3 = iv_volume_m3 ).
rs_result-chargeable_weight = lv_weight.
rs_result-base = base_freight( lv_weight ).
rs_result-distance = distance_freight( iv_distance_km ).
lv_net = rs_result-base + rs_result-distance.
rs_result-fuel = fuel_freight( iv_amount = lv_net
iv_fuel_index = iv_fuel_index ).
rs_result-total = rs_result-base + rs_result-distance + rs_result-fuel.
rs_result-reason = {{p}}if_freight_calc=>c_reason-ok.
ENDMETHOD.
METHOD check_input.
IF iv_weight_kg <= 0.
rv_reason = {{p}}if_freight_calc=>c_reason-weight.
ELSEIF iv_volume_m3 < 0.
rv_reason = {{p}}if_freight_calc=>c_reason-volume.
ELSEIF iv_distance_km <= 0.
rv_reason = {{p}}if_freight_calc=>c_reason-distance.
ELSEIF iv_fuel_index < 0 OR iv_fuel_index > 100.
rv_reason = {{p}}if_freight_calc=>c_reason-fuel.
ELSE.
rv_reason = {{p}}if_freight_calc=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD chargeable_weight.
DATA lv_volumetric TYPE ty_quantity.
lv_volumetric = iv_volume_m3 * c_volume_factor.
IF lv_volumetric > iv_weight_kg.
rv_weight = lv_volumetric.
ELSE.
rv_weight = iv_weight_kg.
ENDIF.
ENDMETHOD.
METHOD base_freight.
DATA lv_excess TYPE ty_quantity.
DATA lv_steps TYPE i.
lv_excess = iv_weight_kg - c_base_weight.
IF lv_excess <= 0.
rv_amount = c_base_amount.
ELSE.
lv_steps = started_steps( lv_excess ).
rv_amount = c_base_amount + lv_steps * c_weight_rate.
ENDIF.
ENDMETHOD.
METHOD distance_freight.
DATA lv_excess TYPE ty_quantity.
DATA lv_steps TYPE i.
lv_excess = iv_distance_km - c_free_km.
IF lv_excess <= 0.
rv_amount = 0.
ELSE.
lv_steps = started_steps( lv_excess ).
rv_amount = lv_steps * c_km_rate.
ENDIF.
ENDMETHOD.
METHOD fuel_freight.
DATA lv_scaled TYPE p LENGTH 15 DECIMALS 3.
DATA lv_fuel TYPE p LENGTH 15 DECIMALS 5.
lv_scaled = iv_amount * iv_fuel_index.
lv_fuel = lv_scaled * c_percent.
rv_amount = lv_fuel.
ENDMETHOD.
METHOD started_steps.
DATA lv_excess_scaled TYPE p LENGTH 16 DECIMALS 0.
DATA lv_step_scaled TYPE p LENGTH 16 DECIMALS 0.
lv_excess_scaled = iv_excess * 1000.
lv_step_scaled = c_step * 1000.
rv_steps = lv_excess_scaled DIV lv_step_scaled.
IF lv_excess_scaled MOD lv_step_scaled > 0.
rv_steps = rv_steps + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,114 @@
CLASS ltc_freight_calc DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_freight_calc.
METHODS setup.
METHODS assert_amount
IMPORTING iv_expected TYPE {{p}}if_freight_calc=>ty_amount
iv_actual TYPE {{p}}if_freight_calc=>ty_amount.
METHODS assert_weight
IMPORTING iv_expected TYPE {{p}}if_freight_calc=>ty_weight
iv_actual TYPE {{p}}if_freight_calc=>ty_weight.
METHODS base_and_distance FOR TESTING.
METHODS fuel_is_rounded FOR TESTING.
METHODS volume_sets_chargeable_weight FOR TESTING.
METHODS weight_zero_is_rejected FOR TESTING.
METHODS distance_zero_is_rejected FOR TESTING.
METHODS fuel_index_out_of_range FOR TESTING.
ENDCLASS.
CLASS ltc_freight_calc IMPLEMENTATION.
METHOD setup.
DATA lo_calc TYPE REF TO {{p}}freight_calc.
CREATE OBJECT lo_calc.
mo_cut = lo_calc.
ENDMETHOD.
METHOD assert_amount.
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual ).
ENDMETHOD.
METHOD assert_weight.
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual ).
ENDMETHOD.
METHOD base_and_distance.
DATA ls_result TYPE {{p}}if_freight_calc=>ty_result.
ls_result = mo_cut->calculate( iv_weight_kg = 2000
iv_volume_m3 = 1
iv_distance_km = 500
iv_fuel_index = 100 ).
assert_amount( iv_expected = 110 iv_actual = ls_result-base ).
assert_amount( iv_expected = 36 iv_actual = ls_result-distance ).
assert_amount( iv_expected = 146 iv_actual = ls_result-fuel ).
assert_amount( iv_expected = 292 iv_actual = ls_result-total ).
ENDMETHOD.
METHOD fuel_is_rounded.
DATA ls_result TYPE {{p}}if_freight_calc=>ty_result.
ls_result = mo_cut->calculate( iv_weight_kg = 1000
iv_volume_m3 = 0
iv_distance_km = 100
iv_fuel_index = '12.3' ).
assert_amount( iv_expected = '5.54' iv_actual = ls_result-fuel ).
assert_amount( iv_expected = '50.54' iv_actual = ls_result-total ).
ENDMETHOD.
METHOD volume_sets_chargeable_weight.
DATA ls_result TYPE {{p}}if_freight_calc=>ty_result.
ls_result = mo_cut->calculate( iv_weight_kg = 500
iv_volume_m3 = '4.5'
iv_distance_km = 100
iv_fuel_index = 0 ).
assert_weight( iv_expected = 1125 iv_actual = ls_result-chargeable_weight ).
assert_amount( iv_expected = 58 iv_actual = ls_result-base ).
ENDMETHOD.
METHOD weight_zero_is_rejected.
DATA ls_result TYPE {{p}}if_freight_calc=>ty_result.
ls_result = mo_cut->calculate( iv_weight_kg = 0
iv_volume_m3 = 2
iv_distance_km = 300
iv_fuel_index = 10 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_freight_calc=>c_reason-weight
act = ls_result-reason ).
assert_amount( iv_expected = 0 iv_actual = ls_result-total ).
ENDMETHOD.
METHOD distance_zero_is_rejected.
DATA ls_result TYPE {{p}}if_freight_calc=>ty_result.
ls_result = mo_cut->calculate( iv_weight_kg = 1500
iv_volume_m3 = 0
iv_distance_km = 0
iv_fuel_index = 10 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_freight_calc=>c_reason-distance
act = ls_result-reason ).
assert_amount( iv_expected = 0 iv_actual = ls_result-total ).
ENDMETHOD.
METHOD fuel_index_out_of_range.
DATA ls_result TYPE {{p}}if_freight_calc=>ty_result.
ls_result = mo_cut->calculate( iv_weight_kg = 1500
iv_volume_m3 = 0
iv_distance_km = 300
iv_fuel_index = 120 ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_freight_calc=>c_reason-fuel
act = ls_result-reason ).
assert_amount( iv_expected = 0 iv_actual = ls_result-total ).
ENDMETHOD.
ENDCLASS.