Files
abap-llm/tasks_gen/train/G1114/faulty/m1_bakery_bill_old.prog.abap
2026-10-05 18:02:52 +02:00

182 lines
7.0 KiB
ABAP

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.