Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,181 @@
REPORT {{p}}bakery_bill_old.
DATA: gv_shop_id TYPE {{p}}shop-shop_id.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop_id.
CLASS lcl_billing DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_line,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaves TYPE i,
rolls TYPE i,
total TYPE {{p}}shop-loaf_price,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
BEGIN OF ty_shop,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaf_price TYPE {{p}}shop-loaf_price,
roll_price TYPE {{p}}shop-roll_price,
deliv_fee TYPE {{p}}shop-deliv_fee,
END OF ty_shop,
tt_shop TYPE SORTED TABLE OF ty_shop WITH UNIQUE KEY shop_id,
BEGIN OF ty_deliv,
shop_id TYPE {{p}}deliv-shop_id,
loaves TYPE {{p}}deliv-loaves,
rolls TYPE {{p}}deliv-rolls,
END OF ty_deliv,
tt_deliv TYPE STANDARD TABLE OF ty_deliv WITH EMPTY KEY,
tt_range TYPE RANGE OF {{p}}shop-shop_id.
METHODS read_shops
IMPORTING it_range TYPE tt_range
RETURNING VALUE(rt_shop) TYPE tt_shop.
METHODS read_deliveries
IMPORTING iv_from TYPE d
iv_to TYPE d
RETURNING VALUE(rt_deliv) TYPE tt_deliv.
METHODS calculate
IMPORTING it_shop TYPE tt_shop
it_deliv TYPE tt_deliv
RETURNING VALUE(rt_line) TYPE tt_line.
METHODS display
CHANGING ct_line TYPE tt_line.
ENDCLASS.
CLASS lcl_billing IMPLEMENTATION.
METHOD read_shops.
SELECT shop_id, shop_name, loaf_price, roll_price, deliv_fee
FROM {{p}}shop
WHERE shop_id IN @it_range
AND is_active <> 'X'
INTO TABLE @rt_shop.
ENDMETHOD.
METHOD read_deliveries.
SELECT shop_id, loaves, rolls
FROM {{p}}deliv
WHERE deliv_date >= @iv_from
AND deliv_date <= @iv_to
INTO TABLE @rt_deliv.
ENDMETHOD.
METHOD calculate.
DATA lt_sum TYPE SORTED TABLE OF ty_line WITH UNIQUE KEY shop_id.
LOOP AT it_deliv INTO DATA(ls_deliv).
IF ls_deliv-loaves + ls_deliv-rolls <= 0.
CONTINUE.
ENDIF.
READ TABLE it_shop INTO DATA(ls_shop) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_sum ASSIGNING FIELD-SYMBOL(<ls_sum>) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
INSERT VALUE #( shop_id = ls_shop-shop_id
shop_name = ls_shop-shop_name )
INTO TABLE lt_sum ASSIGNING <ls_sum>.
ENDIF.
<ls_sum>-loaves = <ls_sum>-loaves + ls_deliv-loaves.
<ls_sum>-rolls = <ls_sum>-rolls + ls_deliv-rolls.
<ls_sum>-total = <ls_sum>-total
+ ls_deliv-loaves * ls_shop-loaf_price
+ ls_deliv-rolls * ls_shop-roll_price
+ ls_shop-deliv_fee.
ENDLOOP.
rt_line = CORRESPONDING #( lt_sum ).
SORT rt_line BY total DESCENDING shop_id ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_line ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( s_shop[] ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = p_from iv_to = p_to ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
lo_billing->display( CHANGING ct_line = lt_line ).
CLASS ltc_billing DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_shop FOR TESTING.
METHODS skips_empty_delivery FOR TESTING.
METHODS skips_inactive_shop FOR TESTING.
ENDCLASS.
CLASS ltc_billing IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}SHOP' ) ( '{{P}}DELIV' ) ) ).
DATA lt_shop TYPE STANDARD TABLE OF {{p}}shop WITH EMPTY KEY.
lt_shop = VALUE #(
( shop_id = 'A1' shop_name = 'Alpha' loaf_price = 10 roll_price = 2 deliv_fee = 1 is_active = 'X' )
( shop_id = 'B1' shop_name = 'Beta' loaf_price = 20 roll_price = 0 deliv_fee = 0 is_active = 'X' )
( shop_id = 'C1' shop_name = 'Gamma' loaf_price = 30 roll_price = 0 deliv_fee = 0 is_active = ' ' ) ).
go_env->insert_test_data( lt_shop ).
DATA lt_deliv TYPE STANDARD TABLE OF {{p}}deliv WITH EMPTY KEY.
lt_deliv = VALUE #(
( deliv_id = 1 shop_id = 'A1' deliv_date = '20260105' loaves = 2 rolls = 1 )
( deliv_id = 2 shop_id = 'A1' deliv_date = '20260106' loaves = 0 rolls = 0 )
( deliv_id = 3 shop_id = 'B1' deliv_date = '20260107' loaves = 3 rolls = 0 )
( deliv_id = 4 shop_id = 'C1' deliv_date = '20260108' loaves = 4 rolls = 0 ) ).
go_env->insert_test_data( lt_deliv ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_line ) ).
cl_abap_unit_assert=>assert_equals( exp = 'B1' act = lt_line[ 1 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 60 ) act = lt_line[ 1 ]-total ).
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = lt_line[ 2 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 2 ]-loaves ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 2 ]-rolls ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 23 ) act = lt_line[ 2 ]-total ).
ENDMETHOD.
METHOD skips_empty_delivery.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260106' iv_to = '20260106' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
METHOD skips_inactive_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops(
VALUE #( ( sign = 'I' option = 'EQ' low = 'C1' ) ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,181 @@
REPORT {{p}}bakery_bill_old.
DATA: gv_shop_id TYPE {{p}}shop-shop_id.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop_id.
CLASS lcl_billing DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_line,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaves TYPE i,
rolls TYPE i,
total TYPE {{p}}shop-loaf_price,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
BEGIN OF ty_shop,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaf_price TYPE {{p}}shop-loaf_price,
roll_price TYPE {{p}}shop-roll_price,
deliv_fee TYPE {{p}}shop-deliv_fee,
END OF ty_shop,
tt_shop TYPE SORTED TABLE OF ty_shop WITH UNIQUE KEY shop_id,
BEGIN OF ty_deliv,
shop_id TYPE {{p}}deliv-shop_id,
loaves TYPE {{p}}deliv-loaves,
rolls TYPE {{p}}deliv-rolls,
END OF ty_deliv,
tt_deliv TYPE STANDARD TABLE OF ty_deliv WITH EMPTY KEY,
tt_range TYPE RANGE OF {{p}}shop-shop_id.
METHODS read_shops
IMPORTING it_range TYPE tt_range
RETURNING VALUE(rt_shop) TYPE tt_shop.
METHODS read_deliveries
IMPORTING iv_from TYPE d
iv_to TYPE d
RETURNING VALUE(rt_deliv) TYPE tt_deliv.
METHODS calculate
IMPORTING it_shop TYPE tt_shop
it_deliv TYPE tt_deliv
RETURNING VALUE(rt_line) TYPE tt_line.
METHODS display
CHANGING ct_line TYPE tt_line.
ENDCLASS.
CLASS lcl_billing IMPLEMENTATION.
METHOD read_shops.
SELECT shop_id, shop_name, loaf_price, roll_price, deliv_fee
FROM {{p}}shop
WHERE shop_id IN @it_range
AND is_active = 'X'
INTO TABLE @rt_shop.
ENDMETHOD.
METHOD read_deliveries.
SELECT shop_id, loaves, rolls
FROM {{p}}deliv
WHERE deliv_date >= @iv_from
OR deliv_date <= @iv_to
INTO TABLE @rt_deliv.
ENDMETHOD.
METHOD calculate.
DATA lt_sum TYPE SORTED TABLE OF ty_line WITH UNIQUE KEY shop_id.
LOOP AT it_deliv INTO DATA(ls_deliv).
IF ls_deliv-loaves + ls_deliv-rolls <= 0.
CONTINUE.
ENDIF.
READ TABLE it_shop INTO DATA(ls_shop) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_sum ASSIGNING FIELD-SYMBOL(<ls_sum>) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
INSERT VALUE #( shop_id = ls_shop-shop_id
shop_name = ls_shop-shop_name )
INTO TABLE lt_sum ASSIGNING <ls_sum>.
ENDIF.
<ls_sum>-loaves = <ls_sum>-loaves + ls_deliv-loaves.
<ls_sum>-rolls = <ls_sum>-rolls + ls_deliv-rolls.
<ls_sum>-total = <ls_sum>-total
+ ls_deliv-loaves * ls_shop-loaf_price
+ ls_deliv-rolls * ls_shop-roll_price
+ ls_shop-deliv_fee.
ENDLOOP.
rt_line = CORRESPONDING #( lt_sum ).
SORT rt_line BY total DESCENDING shop_id ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_line ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( s_shop[] ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = p_from iv_to = p_to ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
lo_billing->display( CHANGING ct_line = lt_line ).
CLASS ltc_billing DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_shop FOR TESTING.
METHODS skips_empty_delivery FOR TESTING.
METHODS skips_inactive_shop FOR TESTING.
ENDCLASS.
CLASS ltc_billing IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}SHOP' ) ( '{{P}}DELIV' ) ) ).
DATA lt_shop TYPE STANDARD TABLE OF {{p}}shop WITH EMPTY KEY.
lt_shop = VALUE #(
( shop_id = 'A1' shop_name = 'Alpha' loaf_price = 10 roll_price = 2 deliv_fee = 1 is_active = 'X' )
( shop_id = 'B1' shop_name = 'Beta' loaf_price = 20 roll_price = 0 deliv_fee = 0 is_active = 'X' )
( shop_id = 'C1' shop_name = 'Gamma' loaf_price = 30 roll_price = 0 deliv_fee = 0 is_active = ' ' ) ).
go_env->insert_test_data( lt_shop ).
DATA lt_deliv TYPE STANDARD TABLE OF {{p}}deliv WITH EMPTY KEY.
lt_deliv = VALUE #(
( deliv_id = 1 shop_id = 'A1' deliv_date = '20260105' loaves = 2 rolls = 1 )
( deliv_id = 2 shop_id = 'A1' deliv_date = '20260106' loaves = 0 rolls = 0 )
( deliv_id = 3 shop_id = 'B1' deliv_date = '20260107' loaves = 3 rolls = 0 )
( deliv_id = 4 shop_id = 'C1' deliv_date = '20260108' loaves = 4 rolls = 0 ) ).
go_env->insert_test_data( lt_deliv ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_line ) ).
cl_abap_unit_assert=>assert_equals( exp = 'B1' act = lt_line[ 1 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 60 ) act = lt_line[ 1 ]-total ).
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = lt_line[ 2 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 2 ]-loaves ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 2 ]-rolls ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 23 ) act = lt_line[ 2 ]-total ).
ENDMETHOD.
METHOD skips_empty_delivery.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260106' iv_to = '20260106' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
METHOD skips_inactive_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops(
VALUE #( ( sign = 'I' option = 'EQ' low = 'C1' ) ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,181 @@
REPORT {{p}}bakery_bill_old.
DATA: gv_shop_id TYPE {{p}}shop-shop_id.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop_id.
CLASS lcl_billing DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_line,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaves TYPE i,
rolls TYPE i,
total TYPE {{p}}shop-loaf_price,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
BEGIN OF ty_shop,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaf_price TYPE {{p}}shop-loaf_price,
roll_price TYPE {{p}}shop-roll_price,
deliv_fee TYPE {{p}}shop-deliv_fee,
END OF ty_shop,
tt_shop TYPE SORTED TABLE OF ty_shop WITH UNIQUE KEY shop_id,
BEGIN OF ty_deliv,
shop_id TYPE {{p}}deliv-shop_id,
loaves TYPE {{p}}deliv-loaves,
rolls TYPE {{p}}deliv-rolls,
END OF ty_deliv,
tt_deliv TYPE STANDARD TABLE OF ty_deliv WITH EMPTY KEY,
tt_range TYPE RANGE OF {{p}}shop-shop_id.
METHODS read_shops
IMPORTING it_range TYPE tt_range
RETURNING VALUE(rt_shop) TYPE tt_shop.
METHODS read_deliveries
IMPORTING iv_from TYPE d
iv_to TYPE d
RETURNING VALUE(rt_deliv) TYPE tt_deliv.
METHODS calculate
IMPORTING it_shop TYPE tt_shop
it_deliv TYPE tt_deliv
RETURNING VALUE(rt_line) TYPE tt_line.
METHODS display
CHANGING ct_line TYPE tt_line.
ENDCLASS.
CLASS lcl_billing IMPLEMENTATION.
METHOD read_shops.
SELECT shop_id, shop_name, loaf_price, roll_price, deliv_fee
FROM {{p}}shop
WHERE shop_id IN @it_range
AND is_active = 'X'
INTO TABLE @rt_shop.
ENDMETHOD.
METHOD read_deliveries.
SELECT shop_id, loaves, rolls
FROM {{p}}deliv
WHERE deliv_date >= @iv_from
AND deliv_date <= @iv_to
INTO TABLE @rt_deliv.
ENDMETHOD.
METHOD calculate.
DATA lt_sum TYPE SORTED TABLE OF ty_line WITH UNIQUE KEY shop_id.
LOOP AT it_deliv INTO DATA(ls_deliv).
IF ls_deliv-loaves + ls_deliv-rolls > 0.
CONTINUE.
ENDIF.
READ TABLE it_shop INTO DATA(ls_shop) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_sum ASSIGNING FIELD-SYMBOL(<ls_sum>) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
INSERT VALUE #( shop_id = ls_shop-shop_id
shop_name = ls_shop-shop_name )
INTO TABLE lt_sum ASSIGNING <ls_sum>.
ENDIF.
<ls_sum>-loaves = <ls_sum>-loaves + ls_deliv-loaves.
<ls_sum>-rolls = <ls_sum>-rolls + ls_deliv-rolls.
<ls_sum>-total = <ls_sum>-total
+ ls_deliv-loaves * ls_shop-loaf_price
+ ls_deliv-rolls * ls_shop-roll_price
+ ls_shop-deliv_fee.
ENDLOOP.
rt_line = CORRESPONDING #( lt_sum ).
SORT rt_line BY total DESCENDING shop_id ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_line ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( s_shop[] ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = p_from iv_to = p_to ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
lo_billing->display( CHANGING ct_line = lt_line ).
CLASS ltc_billing DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_shop FOR TESTING.
METHODS skips_empty_delivery FOR TESTING.
METHODS skips_inactive_shop FOR TESTING.
ENDCLASS.
CLASS ltc_billing IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}SHOP' ) ( '{{P}}DELIV' ) ) ).
DATA lt_shop TYPE STANDARD TABLE OF {{p}}shop WITH EMPTY KEY.
lt_shop = VALUE #(
( shop_id = 'A1' shop_name = 'Alpha' loaf_price = 10 roll_price = 2 deliv_fee = 1 is_active = 'X' )
( shop_id = 'B1' shop_name = 'Beta' loaf_price = 20 roll_price = 0 deliv_fee = 0 is_active = 'X' )
( shop_id = 'C1' shop_name = 'Gamma' loaf_price = 30 roll_price = 0 deliv_fee = 0 is_active = ' ' ) ).
go_env->insert_test_data( lt_shop ).
DATA lt_deliv TYPE STANDARD TABLE OF {{p}}deliv WITH EMPTY KEY.
lt_deliv = VALUE #(
( deliv_id = 1 shop_id = 'A1' deliv_date = '20260105' loaves = 2 rolls = 1 )
( deliv_id = 2 shop_id = 'A1' deliv_date = '20260106' loaves = 0 rolls = 0 )
( deliv_id = 3 shop_id = 'B1' deliv_date = '20260107' loaves = 3 rolls = 0 )
( deliv_id = 4 shop_id = 'C1' deliv_date = '20260108' loaves = 4 rolls = 0 ) ).
go_env->insert_test_data( lt_deliv ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_line ) ).
cl_abap_unit_assert=>assert_equals( exp = 'B1' act = lt_line[ 1 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 60 ) act = lt_line[ 1 ]-total ).
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = lt_line[ 2 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 2 ]-loaves ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 2 ]-rolls ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 23 ) act = lt_line[ 2 ]-total ).
ENDMETHOD.
METHOD skips_empty_delivery.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260106' iv_to = '20260106' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
METHOD skips_inactive_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops(
VALUE #( ( sign = 'I' option = 'EQ' low = 'C1' ) ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,181 @@
REPORT {{p}}bakery_bill_old.
DATA: gv_shop_id TYPE {{p}}shop-shop_id.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop_id.
CLASS lcl_billing DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_line,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaves TYPE i,
rolls TYPE i,
total TYPE {{p}}shop-loaf_price,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
BEGIN OF ty_shop,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaf_price TYPE {{p}}shop-loaf_price,
roll_price TYPE {{p}}shop-roll_price,
deliv_fee TYPE {{p}}shop-deliv_fee,
END OF ty_shop,
tt_shop TYPE SORTED TABLE OF ty_shop WITH UNIQUE KEY shop_id,
BEGIN OF ty_deliv,
shop_id TYPE {{p}}deliv-shop_id,
loaves TYPE {{p}}deliv-loaves,
rolls TYPE {{p}}deliv-rolls,
END OF ty_deliv,
tt_deliv TYPE STANDARD TABLE OF ty_deliv WITH EMPTY KEY,
tt_range TYPE RANGE OF {{p}}shop-shop_id.
METHODS read_shops
IMPORTING it_range TYPE tt_range
RETURNING VALUE(rt_shop) TYPE tt_shop.
METHODS read_deliveries
IMPORTING iv_from TYPE d
iv_to TYPE d
RETURNING VALUE(rt_deliv) TYPE tt_deliv.
METHODS calculate
IMPORTING it_shop TYPE tt_shop
it_deliv TYPE tt_deliv
RETURNING VALUE(rt_line) TYPE tt_line.
METHODS display
CHANGING ct_line TYPE tt_line.
ENDCLASS.
CLASS lcl_billing IMPLEMENTATION.
METHOD read_shops.
SELECT shop_id, shop_name, loaf_price, roll_price, deliv_fee
FROM {{p}}shop
WHERE shop_id IN @it_range
AND is_active = 'X'
INTO TABLE @rt_shop.
ENDMETHOD.
METHOD read_deliveries.
SELECT shop_id, loaves, rolls
FROM {{p}}deliv
WHERE deliv_date >= @iv_from
AND deliv_date <= @iv_to
INTO TABLE @rt_deliv.
ENDMETHOD.
METHOD calculate.
DATA lt_sum TYPE SORTED TABLE OF ty_line WITH UNIQUE KEY shop_id.
LOOP AT it_deliv INTO DATA(ls_deliv).
IF ls_deliv-loaves + ls_deliv-rolls <= 0.
CONTINUE.
ENDIF.
READ TABLE it_shop INTO DATA(ls_shop) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_sum ASSIGNING FIELD-SYMBOL(<ls_sum>) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
INSERT VALUE #( shop_id = ls_shop-shop_id
shop_name = ls_shop-shop_name )
INTO TABLE lt_sum ASSIGNING <ls_sum>.
ENDIF.
<ls_sum>-loaves = <ls_sum>-loaves + ls_deliv-loaves.
<ls_sum>-rolls = <ls_sum>-rolls + ls_deliv-rolls.
<ls_sum>-total = <ls_sum>-total
- ls_deliv-loaves * ls_shop-loaf_price
+ ls_deliv-rolls * ls_shop-roll_price
+ ls_shop-deliv_fee.
ENDLOOP.
rt_line = CORRESPONDING #( lt_sum ).
SORT rt_line BY total DESCENDING shop_id ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_line ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( s_shop[] ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = p_from iv_to = p_to ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
lo_billing->display( CHANGING ct_line = lt_line ).
CLASS ltc_billing DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_shop FOR TESTING.
METHODS skips_empty_delivery FOR TESTING.
METHODS skips_inactive_shop FOR TESTING.
ENDCLASS.
CLASS ltc_billing IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}SHOP' ) ( '{{P}}DELIV' ) ) ).
DATA lt_shop TYPE STANDARD TABLE OF {{p}}shop WITH EMPTY KEY.
lt_shop = VALUE #(
( shop_id = 'A1' shop_name = 'Alpha' loaf_price = 10 roll_price = 2 deliv_fee = 1 is_active = 'X' )
( shop_id = 'B1' shop_name = 'Beta' loaf_price = 20 roll_price = 0 deliv_fee = 0 is_active = 'X' )
( shop_id = 'C1' shop_name = 'Gamma' loaf_price = 30 roll_price = 0 deliv_fee = 0 is_active = ' ' ) ).
go_env->insert_test_data( lt_shop ).
DATA lt_deliv TYPE STANDARD TABLE OF {{p}}deliv WITH EMPTY KEY.
lt_deliv = VALUE #(
( deliv_id = 1 shop_id = 'A1' deliv_date = '20260105' loaves = 2 rolls = 1 )
( deliv_id = 2 shop_id = 'A1' deliv_date = '20260106' loaves = 0 rolls = 0 )
( deliv_id = 3 shop_id = 'B1' deliv_date = '20260107' loaves = 3 rolls = 0 )
( deliv_id = 4 shop_id = 'C1' deliv_date = '20260108' loaves = 4 rolls = 0 ) ).
go_env->insert_test_data( lt_deliv ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_line ) ).
cl_abap_unit_assert=>assert_equals( exp = 'B1' act = lt_line[ 1 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 60 ) act = lt_line[ 1 ]-total ).
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = lt_line[ 2 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 2 ]-loaves ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 2 ]-rolls ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 23 ) act = lt_line[ 2 ]-total ).
ENDMETHOD.
METHOD skips_empty_delivery.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260106' iv_to = '20260106' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
METHOD skips_inactive_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops(
VALUE #( ( sign = 'I' option = 'EQ' low = 'C1' ) ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,181 @@
REPORT {{p}}bakery_bill_old.
DATA: gv_shop_id TYPE {{p}}shop-shop_id.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop_id.
CLASS lcl_billing DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_line,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaves TYPE i,
rolls TYPE i,
total TYPE {{p}}shop-loaf_price,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
BEGIN OF ty_shop,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaf_price TYPE {{p}}shop-loaf_price,
roll_price TYPE {{p}}shop-roll_price,
deliv_fee TYPE {{p}}shop-deliv_fee,
END OF ty_shop,
tt_shop TYPE SORTED TABLE OF ty_shop WITH UNIQUE KEY shop_id,
BEGIN OF ty_deliv,
shop_id TYPE {{p}}deliv-shop_id,
loaves TYPE {{p}}deliv-loaves,
rolls TYPE {{p}}deliv-rolls,
END OF ty_deliv,
tt_deliv TYPE STANDARD TABLE OF ty_deliv WITH EMPTY KEY,
tt_range TYPE RANGE OF {{p}}shop-shop_id.
METHODS read_shops
IMPORTING it_range TYPE tt_range
RETURNING VALUE(rt_shop) TYPE tt_shop.
METHODS read_deliveries
IMPORTING iv_from TYPE d
iv_to TYPE d
RETURNING VALUE(rt_deliv) TYPE tt_deliv.
METHODS calculate
IMPORTING it_shop TYPE tt_shop
it_deliv TYPE tt_deliv
RETURNING VALUE(rt_line) TYPE tt_line.
METHODS display
CHANGING ct_line TYPE tt_line.
ENDCLASS.
CLASS lcl_billing IMPLEMENTATION.
METHOD read_shops.
SELECT shop_id, shop_name, loaf_price, roll_price, deliv_fee
FROM {{p}}shop
WHERE shop_id IN @it_range
AND is_active = 'X'
INTO TABLE @rt_shop.
ENDMETHOD.
METHOD read_deliveries.
SELECT shop_id, loaves, rolls
FROM {{p}}deliv
WHERE deliv_date >= @iv_from
AND deliv_date <= @iv_to
INTO TABLE @rt_deliv.
ENDMETHOD.
METHOD calculate.
DATA lt_sum TYPE SORTED TABLE OF ty_line WITH UNIQUE KEY shop_id.
LOOP AT it_deliv INTO DATA(ls_deliv).
IF ls_deliv-loaves + ls_deliv-rolls <= 0.
CONTINUE.
ENDIF.
READ TABLE it_shop INTO DATA(ls_shop) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_sum ASSIGNING FIELD-SYMBOL(<ls_sum>) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
INSERT VALUE #( shop_id = ls_shop-shop_id
shop_name = ls_shop-shop_name )
INTO TABLE lt_sum ASSIGNING <ls_sum>.
ENDIF.
<ls_sum>-loaves = <ls_sum>-loaves + ls_deliv-loaves.
<ls_sum>-rolls = <ls_sum>-rolls + ls_deliv-rolls.
<ls_sum>-total = <ls_sum>-total
+ ls_deliv-loaves * ls_shop-loaf_price
+ ls_deliv-rolls * ls_shop-roll_price
- ls_shop-deliv_fee.
ENDLOOP.
rt_line = CORRESPONDING #( lt_sum ).
SORT rt_line BY total DESCENDING shop_id ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_line ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( s_shop[] ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = p_from iv_to = p_to ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
lo_billing->display( CHANGING ct_line = lt_line ).
CLASS ltc_billing DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_shop FOR TESTING.
METHODS skips_empty_delivery FOR TESTING.
METHODS skips_inactive_shop FOR TESTING.
ENDCLASS.
CLASS ltc_billing IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}SHOP' ) ( '{{P}}DELIV' ) ) ).
DATA lt_shop TYPE STANDARD TABLE OF {{p}}shop WITH EMPTY KEY.
lt_shop = VALUE #(
( shop_id = 'A1' shop_name = 'Alpha' loaf_price = 10 roll_price = 2 deliv_fee = 1 is_active = 'X' )
( shop_id = 'B1' shop_name = 'Beta' loaf_price = 20 roll_price = 0 deliv_fee = 0 is_active = 'X' )
( shop_id = 'C1' shop_name = 'Gamma' loaf_price = 30 roll_price = 0 deliv_fee = 0 is_active = ' ' ) ).
go_env->insert_test_data( lt_shop ).
DATA lt_deliv TYPE STANDARD TABLE OF {{p}}deliv WITH EMPTY KEY.
lt_deliv = VALUE #(
( deliv_id = 1 shop_id = 'A1' deliv_date = '20260105' loaves = 2 rolls = 1 )
( deliv_id = 2 shop_id = 'A1' deliv_date = '20260106' loaves = 0 rolls = 0 )
( deliv_id = 3 shop_id = 'B1' deliv_date = '20260107' loaves = 3 rolls = 0 )
( deliv_id = 4 shop_id = 'C1' deliv_date = '20260108' loaves = 4 rolls = 0 ) ).
go_env->insert_test_data( lt_deliv ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_line ) ).
cl_abap_unit_assert=>assert_equals( exp = 'B1' act = lt_line[ 1 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 60 ) act = lt_line[ 1 ]-total ).
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = lt_line[ 2 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 2 ]-loaves ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 2 ]-rolls ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 23 ) act = lt_line[ 2 ]-total ).
ENDMETHOD.
METHOD skips_empty_delivery.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260106' iv_to = '20260106' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
METHOD skips_inactive_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops(
VALUE #( ( sign = 'I' option = 'EQ' low = 'C1' ) ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,28 @@
{
"id": "G1114",
"pool": "train",
"object_type": "PROG",
"category": "E",
"attempts": [
{
"stage": "bundle",
"errors": [
"Too close to task G0190 (similarity spec 0.53, rules 0.61, names 0.20). Choose a different business topic and different object names."
],
"by_check": {
"extra": 1
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,117 @@
CLASS {{p}}bakery_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES tt_shop TYPE RANGE OF {{p}}shop-shop_id.
METHODS run
IMPORTING iv_from TYPE d
iv_to TYPE d
it_shop TYPE tt_shop OPTIONAL
RETURNING VALUE(rr_data) TYPE REF TO data.
METHODS lines_of
IMPORTING ir_data TYPE REF TO data
RETURNING VALUE(rv_lines) TYPE i.
METHODS value_of
IMPORTING ir_data TYPE REF TO data
iv_row TYPE i
iv_col TYPE string
RETURNING VALUE(rv_value) TYPE string.
METHODS all_shops_jan FOR TESTING.
METHODS sorted_by_total FOR TESTING.
METHODS fee_and_counts FOR TESTING.
METHODS date_filter FOR TESTING.
METHODS shop_filter FOR TESTING.
METHODS inactive_shop FOR TESTING.
METHODS empty_delivery FOR TESTING.
ENDCLASS.
CLASS {{p}}bakery_hidden IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ).
SUBMIT {{p}}bakery_bill_old
WITH p_from = iv_from
WITH p_to = iv_to
WITH s_shop IN it_shop
AND RETURN.
TRY.
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = rr_data ).
CATCH cx_salv_bs_sc_runtime_info.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).
ENDMETHOD.
METHOD lines_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
IF ir_data IS BOUND.
ASSIGN ir_data->* TO <lt_data>.
rv_lines = lines( <lt_data> ).
ENDIF.
ENDMETHOD.
METHOD value_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
ASSIGN ir_data->* TO <lt_data>.
ASSIGN <lt_data>[ iv_row ] TO FIELD-SYMBOL(<ls_line>).
ASSIGN COMPONENT iv_col OF STRUCTURE <ls_line> TO FIELD-SYMBOL(<lv_value>).
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = |Column { iv_col } is missing| ).
rv_value = condense( CONV string( <lv_value> ) ).
ENDMETHOD.
METHOD all_shops_jan.
cl_abap_unit_assert=>assert_equals( exp = 2
act = lines_of( run( iv_from = '20260101' iv_to = '20260131' ) ) ).
ENDMETHOD.
METHOD sorted_by_total.
DATA(lr_data) = run( iv_from = '20251201' iv_to = '20261231' ).
cl_abap_unit_assert=>assert_equals( exp = `S2`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `SHOP_ID` ) ).
cl_abap_unit_assert=>assert_equals( exp = `96.00`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TOTAL` ) ).
cl_abap_unit_assert=>assert_equals( exp = `S1`
act = value_of( ir_data = lr_data iv_row = 2 iv_col = `SHOP_ID` ) ).
ENDMETHOD.
METHOD fee_and_counts.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals( exp = `S1`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `SHOP_ID` ) ).
cl_abap_unit_assert=>assert_equals( exp = `North Shop`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `SHOP_NAME` ) ).
cl_abap_unit_assert=>assert_equals( exp = `15`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `LOAVES` ) ).
cl_abap_unit_assert=>assert_equals( exp = `20`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `ROLLS` ) ).
cl_abap_unit_assert=>assert_equals( exp = `43.00`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TOTAL` ) ).
ENDMETHOD.
METHOD date_filter.
DATA(lr_data) = run( iv_from = '20260201' iv_to = '20260228' ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = `S2`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `SHOP_ID` ) ).
cl_abap_unit_assert=>assert_equals( exp = `62.00`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TOTAL` ) ).
ENDMETHOD.
METHOD shop_filter.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260131'
it_shop = VALUE #( ( sign = 'I' option = 'EQ' low = 'S2' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = `24.00`
act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TOTAL` ) ).
ENDMETHOD.
METHOD inactive_shop.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260131'
it_shop = VALUE #( ( sign = 'I' option = 'EQ' low = 'S3' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines_of( lr_data ) ).
ENDMETHOD.
METHOD empty_delivery.
DATA(lr_data) = run( iv_from = '20260120' iv_to = '20260120'
it_shop = VALUE #( ( sign = 'I' option = 'EQ' low = 'S1' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines_of( lr_data ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,73 @@
{
"task": "G1114",
"mutants": [
{
"object": "{{P}}BAKERY_BILL_OLD",
"mutant": "line 59: = -> <> (eq)",
"status": "killed",
"hidden": "1/7",
"failed_tests": [
"ALL_SHOPS_JAN",
"DATE_FILTER",
"FEE_AND_COUNTS",
"INACTIVE_SHOP",
"SHOP_FILTER",
"SORTED_BY_TOTAL"
]
},
{
"object": "{{P}}BAKERY_BILL_OLD",
"mutant": "line 67: AND -> OR (logic)",
"status": "killed",
"hidden": "3/7",
"failed_tests": [
"DATE_FILTER",
"EMPTY_DELIVERY",
"FEE_AND_COUNTS",
"SHOP_FILTER"
]
},
{
"object": "{{P}}BAKERY_BILL_OLD",
"mutant": "line 74: <= -> > (rel)",
"status": "killed",
"hidden": "1/7",
"failed_tests": [
"ALL_SHOPS_JAN",
"DATE_FILTER",
"EMPTY_DELIVERY",
"FEE_AND_COUNTS",
"SHOP_FILTER",
"SORTED_BY_TOTAL"
]
},
{
"object": "{{P}}BAKERY_BILL_OLD",
"mutant": "line 90: + -> - (arith)",
"status": "killed",
"hidden": "3/7",
"failed_tests": [
"DATE_FILTER",
"FEE_AND_COUNTS",
"SHOP_FILTER",
"SORTED_BY_TOTAL"
]
},
{
"object": "{{P}}BAKERY_BILL_OLD",
"mutant": "line 92: + -> - (arith)",
"status": "killed",
"hidden": "3/7",
"failed_tests": [
"DATE_FILTER",
"FEE_AND_COUNTS",
"SHOP_FILTER",
"SORTED_BY_TOTAL"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,181 @@
REPORT {{p}}bakery_bill_old.
DATA: gv_shop_id TYPE {{p}}shop-shop_id.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop_id.
CLASS lcl_billing DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_line,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaves TYPE i,
rolls TYPE i,
total TYPE {{p}}shop-loaf_price,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
BEGIN OF ty_shop,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaf_price TYPE {{p}}shop-loaf_price,
roll_price TYPE {{p}}shop-roll_price,
deliv_fee TYPE {{p}}shop-deliv_fee,
END OF ty_shop,
tt_shop TYPE SORTED TABLE OF ty_shop WITH UNIQUE KEY shop_id,
BEGIN OF ty_deliv,
shop_id TYPE {{p}}deliv-shop_id,
loaves TYPE {{p}}deliv-loaves,
rolls TYPE {{p}}deliv-rolls,
END OF ty_deliv,
tt_deliv TYPE STANDARD TABLE OF ty_deliv WITH EMPTY KEY,
tt_range TYPE RANGE OF {{p}}shop-shop_id.
METHODS read_shops
IMPORTING it_range TYPE tt_range
RETURNING VALUE(rt_shop) TYPE tt_shop.
METHODS read_deliveries
IMPORTING iv_from TYPE d
iv_to TYPE d
RETURNING VALUE(rt_deliv) TYPE tt_deliv.
METHODS calculate
IMPORTING it_shop TYPE tt_shop
it_deliv TYPE tt_deliv
RETURNING VALUE(rt_line) TYPE tt_line.
METHODS display
CHANGING ct_line TYPE tt_line.
ENDCLASS.
CLASS lcl_billing IMPLEMENTATION.
METHOD read_shops.
SELECT shop_id, shop_name, loaf_price, roll_price, deliv_fee
FROM {{p}}shop
WHERE shop_id IN @it_range
AND is_active = 'X'
INTO TABLE @rt_shop.
ENDMETHOD.
METHOD read_deliveries.
SELECT shop_id, loaves, rolls
FROM {{p}}deliv
WHERE deliv_date >= @iv_from
AND deliv_date <= @iv_to
INTO TABLE @rt_deliv.
ENDMETHOD.
METHOD calculate.
DATA lt_sum TYPE SORTED TABLE OF ty_line WITH UNIQUE KEY shop_id.
LOOP AT it_deliv INTO DATA(ls_deliv).
IF ls_deliv-loaves + ls_deliv-rolls <= 0.
CONTINUE.
ENDIF.
READ TABLE it_shop INTO DATA(ls_shop) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_sum ASSIGNING FIELD-SYMBOL(<ls_sum>) WITH KEY shop_id = ls_deliv-shop_id.
IF sy-subrc <> 0.
INSERT VALUE #( shop_id = ls_shop-shop_id
shop_name = ls_shop-shop_name )
INTO TABLE lt_sum ASSIGNING <ls_sum>.
ENDIF.
<ls_sum>-loaves = <ls_sum>-loaves + ls_deliv-loaves.
<ls_sum>-rolls = <ls_sum>-rolls + ls_deliv-rolls.
<ls_sum>-total = <ls_sum>-total
+ ls_deliv-loaves * ls_shop-loaf_price
+ ls_deliv-rolls * ls_shop-roll_price
+ ls_shop-deliv_fee.
ENDLOOP.
rt_line = CORRESPONDING #( lt_sum ).
SORT rt_line BY total DESCENDING shop_id ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_line ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( s_shop[] ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = p_from iv_to = p_to ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
lo_billing->display( CHANGING ct_line = lt_line ).
CLASS ltc_billing DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_shop FOR TESTING.
METHODS skips_empty_delivery FOR TESTING.
METHODS skips_inactive_shop FOR TESTING.
ENDCLASS.
CLASS ltc_billing IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}SHOP' ) ( '{{P}}DELIV' ) ) ).
DATA lt_shop TYPE STANDARD TABLE OF {{p}}shop WITH EMPTY KEY.
lt_shop = VALUE #(
( shop_id = 'A1' shop_name = 'Alpha' loaf_price = 10 roll_price = 2 deliv_fee = 1 is_active = 'X' )
( shop_id = 'B1' shop_name = 'Beta' loaf_price = 20 roll_price = 0 deliv_fee = 0 is_active = 'X' )
( shop_id = 'C1' shop_name = 'Gamma' loaf_price = 30 roll_price = 0 deliv_fee = 0 is_active = ' ' ) ).
go_env->insert_test_data( lt_shop ).
DATA lt_deliv TYPE STANDARD TABLE OF {{p}}deliv WITH EMPTY KEY.
lt_deliv = VALUE #(
( deliv_id = 1 shop_id = 'A1' deliv_date = '20260105' loaves = 2 rolls = 1 )
( deliv_id = 2 shop_id = 'A1' deliv_date = '20260106' loaves = 0 rolls = 0 )
( deliv_id = 3 shop_id = 'B1' deliv_date = '20260107' loaves = 3 rolls = 0 )
( deliv_id = 4 shop_id = 'C1' deliv_date = '20260108' loaves = 4 rolls = 0 ) ).
go_env->insert_test_data( lt_deliv ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_line ) ).
cl_abap_unit_assert=>assert_equals( exp = 'B1' act = lt_line[ 1 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 60 ) act = lt_line[ 1 ]-total ).
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = lt_line[ 2 ]-shop_id ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_line[ 2 ]-loaves ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_line[ 2 ]-rolls ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}shop-loaf_price( 23 ) act = lt_line[ 2 ]-total ).
ENDMETHOD.
METHOD skips_empty_delivery.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops( VALUE #( ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260106' iv_to = '20260106' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
METHOD skips_inactive_shop.
DATA(lo_billing) = NEW lcl_billing( ).
DATA(lt_shop) = lo_billing->read_shops(
VALUE #( ( sign = 'I' option = 'EQ' low = 'C1' ) ) ).
DATA(lt_deliv) = lo_billing->read_deliveries( iv_from = '20260101' iv_to = '20260131' ).
DATA(lt_line) = lo_billing->calculate( it_shop = lt_shop it_deliv = lt_deliv ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_line ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,74 @@
REPORT {{p}}bakery_bill_old.
DATA: gv_shop_id TYPE {{p}}shop-shop_id.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop_id.
TYPES: BEGIN OF ty_line,
shop_id TYPE {{p}}shop-shop_id,
shop_name TYPE {{p}}shop-shop_name,
loaves TYPE i,
rolls TYPE i,
total TYPE {{p}}shop-loaf_price,
END OF ty_line.
DATA: gt_shop TYPE STANDARD TABLE OF {{p}}shop WITH HEADER LINE,
gt_deliv TYPE STANDARD TABLE OF {{p}}deliv WITH HEADER LINE,
gt_out TYPE STANDARD TABLE OF ty_line WITH HEADER LINE.
START-OF-SELECTION.
PERFORM read_shops.
PERFORM read_deliveries.
PERFORM calc_totals.
PERFORM display.
FORM read_shops.
SELECT * FROM {{p}}shop INTO TABLE gt_shop
WHERE shop_id IN s_shop
AND is_active = 'X'.
SORT gt_shop BY shop_id.
ENDFORM.
FORM read_deliveries.
SELECT * FROM {{p}}deliv INTO TABLE gt_deliv
WHERE deliv_date >= p_from
AND deliv_date <= p_to.
SORT gt_deliv BY shop_id.
ENDFORM.
FORM calc_totals.
DATA: ls_out TYPE ty_line,
lv_fee TYPE {{p}}shop-loaf_price.
CLEAR gt_out.
LOOP AT gt_shop.
CLEAR ls_out.
ls_out-shop_id = gt_shop-shop_id.
ls_out-shop_name = gt_shop-shop_name.
LOOP AT gt_deliv WHERE shop_id = gt_shop-shop_id.
IF gt_deliv-loaves + gt_deliv-rolls > 0.
ls_out-loaves = ls_out-loaves + gt_deliv-loaves.
ls_out-rolls = ls_out-rolls + gt_deliv-rolls.
lv_fee = gt_deliv-loaves * gt_shop-loaf_price
+ gt_deliv-rolls * gt_shop-roll_price
+ gt_shop-deliv_fee.
ls_out-total = ls_out-total + lv_fee.
ENDIF.
ENDLOOP.
IF ls_out-loaves + ls_out-rolls > 0.
APPEND ls_out TO gt_out.
ENDIF.
ENDLOOP.
SORT gt_out BY total DESCENDING shop_id ASCENDING.
ENDFORM.
FORM display.
DATA lo_alv TYPE REF TO cl_salv_table.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = gt_out[] ).
lo_alv->display( ).
CATCH cx_salv_msg.
ENDTRY.
ENDFORM.

View File

@@ -0,0 +1,27 @@
CLASS {{p}}bakery_seed DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}bakery_seed IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DELETE FROM {{p}}deliv.
DELETE FROM {{p}}shop.
INSERT {{p}}shop FROM TABLE @( VALUE #(
( shop_id = 'S1' shop_name = 'North Shop' loaf_price = '2.00' roll_price = '0.50' deliv_fee = '1.50' is_active = 'X' )
( shop_id = 'S2' shop_name = 'South Shop' loaf_price = '3.00' roll_price = '1.00' deliv_fee = '2.00' is_active = 'X' )
( shop_id = 'S3' shop_name = 'Closed Shop' loaf_price = '1.00' roll_price = '0.20' deliv_fee = '0.50' is_active = ' ' ) ) ).
INSERT {{p}}deliv FROM TABLE @( VALUE #(
( deliv_id = 1 shop_id = 'S1' deliv_date = '20260110' loaves = 10 rolls = 20 )
( deliv_id = 2 shop_id = 'S1' deliv_date = '20260112' loaves = 5 rolls = 0 )
( deliv_id = 3 shop_id = 'S2' deliv_date = '20260111' loaves = 4 rolls = 10 )
( deliv_id = 4 shop_id = 'S2' deliv_date = '20260215' loaves = 20 rolls = 0 )
( deliv_id = 5 shop_id = 'S3' deliv_date = '20260110' loaves = 6 rolls = 6 )
( deliv_id = 6 shop_id = 'S1' deliv_date = '20260120' loaves = 0 rolls = 0 )
( deliv_id = 7 shop_id = 'S2' deliv_date = '20251220' loaves = 2 rolls = 2 ) ) ).
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,13 @@
@EndUserText.label : 'Delivery'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}deliv {
key client : abap.clnt not null;
key deliv_id : abap.int4 not null;
shop_id : abap.char(4);
deliv_date : abap.dats;
loaves : abap.int4;
rolls : abap.int4;
}

View File

@@ -0,0 +1,14 @@
@EndUserText.label : 'Shop'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}shop {
key client : abap.clnt not null;
key shop_id : abap.char(4) not null;
shop_name : abap.char(30);
loaf_price : abap.dec(15,2);
roll_price : abap.dec(15,2);
deliv_fee : abap.dec(15,2);
is_active : abap.char(1);
}

View File

@@ -0,0 +1,43 @@
# 1. Goal
Refactor the legacy report {{P}}BAKERY_BILL_OLD in package $TMP. A bakery bills
its shops for the bread and the rolls that it delivered in a period. The report
must keep its behavior and become maintainable.
# 2. Open questions
None.
# 3. Context
- The report {{P}}BAKERY_BILL_OLD is active in package $TMP. It is legacy code.
- The report reads the tables {{P}}SHOP and {{P}}DELIV. Both tables contain data.
- The report shows an ALV list.
# 4. Contract
- Keep the report {{P}}BAKERY_BILL_OLD in package $TMP. Keep the name.
- Keep the selection screen:
- Parameter P_FROM, type DATS, mandatory: the first delivery date to include.
- Parameter P_TO, type DATS, mandatory: the last delivery date to include.
- Select-option S_SHOP for the shop.
- Keep the ALV output. The output table has these columns, with these names:
SHOP_ID, SHOP_NAME, LOAVES, ROLLS, TOTAL.
# 5. Business rules
The behavior stays the same. The legacy code contains the rules. Read the
legacy code and keep every rule, every filter and every value. Do not change
the selection screen, the output columns or the result rows.
# 6. Constraints
- Release target: 8.16.
- Coding standards: Clean ABAP.
- Quality goals:
- Read each of the two tables with one database access.
- Do not use a nested loop over the two tables. The runtime must grow with
the number of rows, not with the product of the rows.
- Do not use obsolete language elements. No FORM routines, no header-line
tables, no SELECT *.
- Put the logic in a local class. Keep every method below 40 statements.
- Out of scope: do not change the tables {{P}}SHOP and {{P}}DELIV.
# 7. Acceptance
- The report is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests as local test classes in the program.

View File

@@ -0,0 +1,75 @@
{
"id": "G1114",
"category": "E",
"object_type": "PROG",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "TABL",
"name": "{{P}}SHOP",
"file": "seed/shop.tabl.asabap",
"description": "Shops that receive the bakery deliveries"
},
{
"type": "TABL",
"name": "{{P}}DELIV",
"file": "seed/deliv.tabl.asabap",
"description": "Bread and roll deliveries of the bakery"
},
{
"type": "PROG",
"name": "{{P}}BAKERY_BILL_OLD",
"file": "seed/bakery_bill_old.prog.abap",
"description": "Legacy billing report of the bakery"
},
{
"type": "CLAS",
"name": "{{P}}BAKERY_SEED",
"file": "seed/bakery_seed.clas.abap",
"description": "Seed data for the shops and the deliveries",
"run": true
}
],
"contract": [
{
"type": "PROG",
"name": "{{P}}BAKERY_BILL_OLD",
"parameters": [
"p_from",
"p_to",
"s_shop"
]
}
],
"out_of_scope": [
"{{P}}SHOP",
"{{P}}DELIV"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}BAKERY_HIDDEN",
"file": "hidden/bakery_hidden.clas.abap",
"description": "Hidden tests for the refactored bakery report"
}
],
"reference": [
{
"type": "PROG",
"name": "{{P}}BAKERY_BILL_OLD",
"file": "reference/bakery_bill_old.prog.abap",
"description": "Refactored bakery report with local test classes"
}
],
"craft_checks": [
"db_operation_in_loop",
"method_length",
"nested_loops"
]
}