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,29 @@
{
"id": "G0017",
"pool": "eval",
"object_type": "DDLS",
"category": "B",
"attempts": [
{
"stage": "validate",
"oracle": null,
"null": null
},
{
"stage": "validate",
"oracle": 0,
"null": 0
},
{
"stage": "validate",
"oracle": 98.5,
"null": 0
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0
}
],
"accepted": true
}

View File

@@ -0,0 +1,86 @@
CLASS {{p}}t21_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_cds_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS setup.
METHODS cost_of_project_one FOR TESTING.
METHODS hours_of_project_one FOR TESTING.
METHODS count_of_project_one FOR TESTING.
METHODS no_active_assignment FOR TESTING.
METHODS row_count FOR TESTING.
METHODS over_budget_flag FOR TESTING.
METHODS budget_not_exceeded FOR TESTING.
METHODS project_name_shown FOR TESTING.
ENDCLASS.
CLASS {{p}}t21_hidden IMPLEMENTATION.
METHOD class_setup.
go_env = cl_cds_test_environment=>create( i_for_entity = '{{P}}I_PROJ_EFFORT' ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD setup.
DATA lt_proj TYPE STANDARD TABLE OF {{p}}proj WITH EMPTY KEY.
DATA lt_asgn TYPE STANDARD TABLE OF {{p}}asgn WITH EMPTY KEY.
go_env->clear_doubles( ).
lt_proj = VALUE #( ( proj_id = 'P1' proj_name = 'ALPHA' budget = '500.00' )
( proj_id = 'P2' proj_name = 'BETA' budget = '100.00' )
( proj_id = 'P3' proj_name = 'GAMMA' budget = '1000.00' )
( proj_id = 'P4' proj_name = 'DELTA' budget = '50.00' ) ).
lt_asgn = VALUE #( ( proj_id = 'P1' emp_id = 'E1' work_hours = 10 rate = '50.00' status = 'A' )
( proj_id = 'P1' emp_id = 'E2' work_hours = 4 rate = '25.00' status = 'A' )
( proj_id = 'P1' emp_id = 'E3' work_hours = 8 rate = '100.00' status = 'I' )
( proj_id = 'P2' emp_id = 'E1' work_hours = 2 rate = '50.00' status = 'A' )
( proj_id = 'P4' emp_id = 'E2' work_hours = 5 rate = '10.00' status = 'I' ) ).
go_env->insert_test_data( lt_proj ).
go_env->insert_test_data( lt_asgn ).
ENDMETHOD.
METHOD cost_of_project_one.
SELECT SINGLE total_cost FROM {{p}}i_proj_effort WHERE proj_id = 'P1' INTO @DATA(lv_cost).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '600.00' )
act = CONV decfloat34( lv_cost ) ).
ENDMETHOD.
METHOD hours_of_project_one.
SELECT SINGLE total_hours FROM {{p}}i_proj_effort WHERE proj_id = 'P1' INTO @DATA(lv_hours).
cl_abap_unit_assert=>assert_equals( exp = CONV i( lv_hours ) act = 14 ).
ENDMETHOD.
METHOD count_of_project_one.
SELECT SINGLE assign_count FROM {{p}}i_proj_effort WHERE proj_id = 'P1' INTO @DATA(lv_count).
cl_abap_unit_assert=>assert_equals( exp = CONV i( lv_count ) act = 2 ).
ENDMETHOD.
METHOD no_active_assignment.
SELECT SINGLE proj_name FROM {{p}}i_proj_effort WHERE proj_id = 'P4' INTO @DATA(lv_name).
cl_abap_unit_assert=>assert_equals( exp = 4 act = sy-subrc ).
cl_abap_unit_assert=>assert_initial( lv_name ).
ENDMETHOD.
METHOD row_count.
SELECT COUNT(*) FROM {{p}}i_proj_effort INTO @DATA(lv_rows).
cl_abap_unit_assert=>assert_equals( exp = CONV i( lv_rows ) act = 2 ).
ENDMETHOD.
METHOD over_budget_flag.
SELECT SINGLE over_budget FROM {{p}}i_proj_effort WHERE proj_id = 'P1' INTO @DATA(lv_flag).
cl_abap_unit_assert=>assert_equals( exp = 'X' act = lv_flag ).
ENDMETHOD.
METHOD budget_not_exceeded.
SELECT SINGLE over_budget FROM {{p}}i_proj_effort WHERE proj_id = 'P2' INTO @DATA(lv_flag).
cl_abap_unit_assert=>assert_equals( exp = 'N' act = lv_flag ).
ENDMETHOD.
METHOD project_name_shown.
SELECT SINGLE proj_name FROM {{p}}i_proj_effort WHERE proj_id = 'P2' INTO @DATA(lv_name).
cl_abap_unit_assert=>assert_equals( exp = 'BETA' act = lv_name ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,22 @@
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Project effort'
define view entity {{P}}I_PROJ_EFFORT
as select from {{p}}proj as proj
inner join {{p}}asgn as asgn on asgn.proj_id = proj.proj_id
{
key proj.proj_id as proj_id,
proj.proj_name as proj_name,
count( * ) as assign_count,
sum( asgn.work_hours ) as total_hours,
sum( cast( asgn.work_hours as abap.dec( 15, 2 ) ) * asgn.rate ) as total_cost,
case
when sum( cast( asgn.work_hours as abap.dec( 15, 2 ) ) * asgn.rate ) > proj.budget
then 'X'
else 'N'
end as over_budget
}
where asgn.status = 'A'
group by
proj.proj_id,
proj.proj_name,
proj.budget

View File

@@ -0,0 +1,53 @@
CLASS {{p}}t21_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_cds_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS setup.
METHODS effort_of_one_project FOR TESTING.
METHODS no_active_assignment FOR TESTING.
ENDCLASS.
CLASS {{p}}t21_test IMPLEMENTATION.
METHOD class_setup.
go_env = cl_cds_test_environment=>create( i_for_entity = '{{P}}I_PROJ_EFFORT' ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD setup.
DATA lt_proj TYPE STANDARD TABLE OF {{p}}proj WITH EMPTY KEY.
DATA lt_asgn TYPE STANDARD TABLE OF {{p}}asgn WITH EMPTY KEY.
go_env->clear_doubles( ).
lt_proj = VALUE #( ( proj_id = 'A' proj_name = 'ONE' budget = '100.00' )
( proj_id = 'B' proj_name = 'TWO' budget = '10.00' ) ).
lt_asgn = VALUE #( ( proj_id = 'A' emp_id = 'E1' work_hours = 2 rate = '10.00' status = 'A' )
( proj_id = 'A' emp_id = 'E2' work_hours = 1 rate = '5.00' status = 'A' )
( proj_id = 'A' emp_id = 'E3' work_hours = 9 rate = '9.00' status = 'I' )
( proj_id = 'B' emp_id = 'E1' work_hours = 3 rate = '1.00' status = 'I' ) ).
go_env->insert_test_data( lt_proj ).
go_env->insert_test_data( lt_asgn ).
ENDMETHOD.
METHOD effort_of_one_project.
SELECT SINGLE assign_count, total_hours, total_cost, over_budget
FROM {{p}}i_proj_effort
WHERE proj_id = 'A'
INTO @DATA(ls_effort).
cl_abap_unit_assert=>assert_equals( exp = CONV i( ls_effort-assign_count ) act = 2 ).
cl_abap_unit_assert=>assert_equals( exp = CONV i( ls_effort-total_hours ) act = 3 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '25.00' )
act = CONV decfloat34( ls_effort-total_cost ) ).
cl_abap_unit_assert=>assert_equals( exp = 'N' act = ls_effort-over_budget ).
ENDMETHOD.
METHOD no_active_assignment.
SELECT SINGLE proj_id FROM {{p}}i_proj_effort WHERE proj_id = 'B' INTO @DATA(lv_proj_id).
cl_abap_unit_assert=>assert_equals( exp = 4 act = sy-subrc ).
cl_abap_unit_assert=>assert_initial( lv_proj_id ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,13 @@
@EndUserText.label : 'Project assignment'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}asgn {
key client : abap.clnt not null;
key proj_id : abap.char(10) not null;
key emp_id : abap.char(10) not null;
work_hours : abap.int4;
rate : abap.dec(15,2);
status : abap.char(1);
}

View File

@@ -0,0 +1,11 @@
@EndUserText.label : 'Project'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}proj {
key client : abap.clnt not null;
key proj_id : abap.char(10) not null;
proj_name : abap.char(30);
budget : abap.dec(15,2);
}

View File

@@ -0,0 +1,42 @@
# 1. Goal
Show the effort of each project. A report and an OData service read the effort,
so the calculation must be in the database, in a CDS view.
# 2. Open questions
None.
# 3. Context
- Table {{P}}PROJ (project), package $TMP. Key: PROJ_ID (CHAR 10).
Fields: PROJ_NAME (CHAR 30), BUDGET (DEC 15,2).
- Table {{P}}ASGN (project assignment), package $TMP. Key: PROJ_ID (CHAR 10),
EMP_ID (CHAR 10). Fields: WORK_HOURS (INT4, the hours of the assignment),
RATE (DEC 15,2, cost of one hour), STATUS (CHAR 1).
# 4. Contract
- Create the CDS view entity {{P}}I_PROJ_EFFORT in package $TMP.
- Elements, with these names: PROJ_ID (key), PROJ_NAME, ASSIGN_COUNT,
TOTAL_HOURS, TOTAL_COST, OVER_BUDGET.
- No authorization check (#NOT_REQUIRED).
# 5. Business rules
1. Show one row for each project that has at least one active assignment.
An assignment is active when its STATUS is 'A'. An assignment with
another status is not active. A project without active assignments does
not appear in the view.
2. ASSIGN_COUNT is the number of active assignments of the project.
3. TOTAL_HOURS is the sum of WORK_HOURS of the active assignments of the
project.
4. TOTAL_COST is the sum of WORK_HOURS multiplied by RATE of the active
assignments of the project, with 2 decimals.
5. OVER_BUDGET is 'X' when TOTAL_COST is greater than the BUDGET of the
project. Otherwise OVER_BUDGET is 'N'.
# 6. Constraints
- Release target: 7.58.
- Coding standards: Clean ABAP.
- Out of scope: do not change {{P}}PROJ and {{P}}ASGN.
# 7. Acceptance
- The view is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests with CL_CDS_TEST_ENVIRONMENT in a global test class.

View File

@@ -0,0 +1,67 @@
{
"id": "G0017",
"category": "B",
"object_type": "DDLS",
"difficulty": 2,
"release_target": "v758",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
},
"seed": [
{
"type": "TABL",
"name": "{{P}}PROJ",
"file": "seed/proj.tabl.asabap",
"description": "Project"
},
{
"type": "TABL",
"name": "{{P}}ASGN",
"file": "seed/asgn.tabl.asabap",
"description": "Project assignment"
}
],
"contract": [
{
"type": "DDLS",
"name": "{{P}}I_PROJ_EFFORT",
"fields": [
"PROJ_ID",
"PROJ_NAME",
"ASSIGN_COUNT",
"TOTAL_HOURS",
"TOTAL_COST",
"OVER_BUDGET"
]
}
],
"out_of_scope": [
"{{P}}PROJ",
"{{P}}ASGN"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T21_HIDDEN",
"file": "hidden/t21_hidden.clas.abap",
"description": "T21 hidden tests"
}
],
"reference": [
{
"type": "DDLS",
"name": "{{P}}I_PROJ_EFFORT",
"file": "reference/i_proj_effort.ddls.asddls",
"description": "Project effort"
},
{
"type": "CLAS",
"name": "{{P}}T21_TEST",
"file": "reference/t21_test.clas.abap",
"description": "T21 own tests"
}
],
"craft_checks": []
}