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,130 @@
CLASS {{p}}freight_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_result,
status TYPE c LENGTH 10,
base TYPE p LENGTH 9 DECIMALS 2,
surcharge TYPE p LENGTH 9 DECIMALS 2,
total TYPE p LENGTH 9 DECIMALS 2,
END OF ty_result.
CONSTANTS:
BEGIN OF c_status,
ok TYPE c LENGTH 10 VALUE 'OK',
weight TYPE c LENGTH 10 VALUE 'WEIGHT',
zone TYPE c LENGTH 10 VALUE 'ZONE',
END OF c_status.
METHODS calculate
IMPORTING
iv_weight_kg TYPE p LENGTH 8 DECIMALS 2
iv_zone TYPE string
iv_express TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(rs_result) TYPE ty_result.
METHODS is_zone_supported
IMPORTING
iv_zone TYPE string
RETURNING
VALUE(rv_supported) TYPE abap_bool.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_rate,
zone TYPE c LENGTH 2,
rate TYPE p LENGTH 6 DECIMALS 2,
END OF ty_rate,
tt_rate TYPE HASHED TABLE OF ty_rate WITH UNIQUE KEY zone.
CONSTANTS c_express_share TYPE p LENGTH 5 DECIMALS 2 VALUE '0.25'.
METHODS normalize_zone
IMPORTING iv_zone TYPE string
RETURNING VALUE(rv_zone) TYPE string.
METHODS rates
RETURNING VALUE(rt_rate) TYPE tt_rate.
METHODS rate_for_zone
IMPORTING iv_zone TYPE string
RETURNING VALUE(rv_rate) TYPE p LENGTH 6 DECIMALS 2.
METHODS empty_result
IMPORTING iv_status TYPE c LENGTH 10
RETURNING VALUE(rs_result) TYPE ty_result.
METHODS base_amount
IMPORTING iv_rate TYPE p LENGTH 6 DECIMALS 2
iv_weight_kg TYPE p LENGTH 8 DECIMALS 2
RETURNING VALUE(rv_base) TYPE p LENGTH 9 DECIMALS 2.
METHODS surcharge_amount
IMPORTING iv_base TYPE p LENGTH 9 DECIMALS 2
iv_express TYPE abap_bool
RETURNING VALUE(rv_surcharge) TYPE p LENGTH 9 DECIMALS 2.
ENDCLASS.
CLASS {{p}}freight_calculator IMPLEMENTATION.
METHOD calculate.
DATA(lv_zone) = normalize_zone( iv_zone ).
IF iv_weight_kg <= 0.
rs_result = empty_result( c_status-weight ).
RETURN.
ENDIF.
IF is_zone_supported( lv_zone ) = abap_false.
rs_result = empty_result( c_status-zone ).
RETURN.
ENDIF.
rs_result-base = base_amount( iv_rate = rate_for_zone( lv_zone )
iv_weight_kg = iv_weight_kg ).
rs_result-surcharge = surcharge_amount( iv_base = rs_result-base
iv_express = iv_express ).
rs_result-total = rs_result-base + rs_result-surcharge.
rs_result-status = c_status-ok.
ENDMETHOD.
METHOD is_zone_supported.
DATA(lv_zone) = normalize_zone( iv_zone ).
DATA(lt_rate) = rates( ).
rv_supported = xsdbool( line_exists( lt_rate[ zone = lv_zone ] ) ).
ENDMETHOD.
METHOD normalize_zone.
rv_zone = to_upper( replace( val = iv_zone sub = ` ` with = `` occ = 0 ) ).
ENDMETHOD.
METHOD rates.
rt_rate = VALUE #( ( zone = 'DE' rate = '4.50' )
( zone = 'AT' rate = '5.20' )
( zone = 'CH' rate = '7.80' )
( zone = 'FR' rate = '6.40' )
( zone = 'NL' rate = '4.90' )
( zone = 'PL' rate = '5.10' )
( zone = 'ES' rate = '6.90' ) ).
ENDMETHOD.
METHOD rate_for_zone.
DATA(lt_rate) = rates( ).
READ TABLE lt_rate WITH TABLE KEY zone = iv_zone INTO DATA(ls_rate).
rv_rate = ls_rate-rate.
ENDMETHOD.
METHOD empty_result.
rs_result = VALUE #( status = iv_status ).
ENDMETHOD.
METHOD base_amount.
DATA lv_amount TYPE p LENGTH 13 DECIMALS 4.
lv_amount = iv_rate * iv_weight_kg.
rv_base = round( val = lv_amount dec = 2 ).
ENDMETHOD.
METHOD surcharge_amount.
IF iv_express = abap_false.
RETURN.
ENDIF.
DATA lv_amount TYPE p LENGTH 13 DECIMALS 4.
lv_amount = iv_base * c_express_share.
rv_surcharge = round( val = lv_amount dec = 2 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,56 @@
CLASS ltc_freight_calculator DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}freight_calculator.
METHODS setup.
METHODS base_parcel FOR TESTING.
METHODS express_parcel FOR TESTING.
METHODS zone_is_normalized FOR TESTING.
METHODS weight_error FOR TESTING.
METHODS unknown_zone FOR TESTING.
METHODS zone_support FOR TESTING.
ENDCLASS.
CLASS ltc_freight_calculator IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}freight_calculator( ).
ENDMETHOD.
METHOD base_parcel.
cl_abap_unit_assert=>assert_equals(
exp = VALUE {{p}}freight_calculator=>ty_result( status = 'OK' base = '45.00' total = '45.00' )
act = mo_cut->calculate( iv_weight_kg = '10.00' iv_zone = `DE` ) ).
ENDMETHOD.
METHOD express_parcel.
cl_abap_unit_assert=>assert_equals(
exp = VALUE {{p}}freight_calculator=>ty_result( status = 'OK'
base = '45.00'
surcharge = '11.25'
total = '56.25' )
act = mo_cut->calculate( iv_weight_kg = '10.00' iv_zone = `DE` iv_express = abap_true ) ).
ENDMETHOD.
METHOD zone_is_normalized.
cl_abap_unit_assert=>assert_equals(
exp = VALUE {{p}}freight_calculator=>ty_result( status = 'OK' base = '39.00' total = '39.00' )
act = mo_cut->calculate( iv_weight_kg = '5.00' iv_zone = ` ch ` ) ).
ENDMETHOD.
METHOD weight_error.
cl_abap_unit_assert=>assert_equals(
exp = VALUE {{p}}freight_calculator=>ty_result( status = 'WEIGHT' )
act = mo_cut->calculate( iv_weight_kg = '0.00' iv_zone = `DE` ) ).
ENDMETHOD.
METHOD unknown_zone.
cl_abap_unit_assert=>assert_equals(
exp = VALUE {{p}}freight_calculator=>ty_result( status = 'ZONE' )
act = mo_cut->calculate( iv_weight_kg = '5.00' iv_zone = `XX` ) ).
ENDMETHOD.
METHOD zone_support.
cl_abap_unit_assert=>assert_true( mo_cut->is_zone_supported( `de` ) ).
cl_abap_unit_assert=>assert_false( mo_cut->is_zone_supported( `XX` ) ).
ENDMETHOD.
ENDCLASS.