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

138 lines
4.8 KiB
ABAP

REPORT {{p}}groom_bill_old.
TYPES: ty_charge TYPE p LENGTH 9 DECIMALS 2,
BEGIN OF ty_line,
groom_id TYPE {{p}}groom-groom_id,
pet TYPE {{p}}groom-pet,
service TYPE {{p}}groom-service,
charge TYPE ty_charge,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
tt_pet TYPE RANGE OF {{p}}groom-pet.
DATA gv_pet TYPE {{p}}groom-pet.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_pet FOR gv_pet.
CLASS lcl_groom_bill DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: c_service_basic TYPE {{p}}groom-service VALUE 'BASIC',
c_service_full TYPE {{p}}groom-service VALUE 'FULL',
c_coat_long TYPE {{p}}groom-coat VALUE 'LONG',
c_coat_curly TYPE {{p}}groom-coat VALUE 'CURLY',
c_charge_basic TYPE ty_charge VALUE '30.00',
c_charge_full TYPE ty_charge VALUE '50.00',
c_surch_long TYPE ty_charge VALUE '10.00',
c_surch_curly TYPE ty_charge VALUE '15.00',
c_surch_heavy TYPE ty_charge VALUE '20.00',
c_discount TYPE ty_charge VALUE '5.00',
c_heavy_kg TYPE {{p}}groom-weight_kg VALUE '25.0'.
METHODS bill
IMPORTING iv_date TYPE d
it_pet TYPE tt_pet
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
PRIVATE SECTION.
METHODS charge_of
IMPORTING is_groom TYPE {{p}}groom
RETURNING VALUE(rv_charge) TYPE ty_charge.
ENDCLASS.
CLASS lcl_groom_bill IMPLEMENTATION.
METHOD bill.
DATA lt_groom TYPE STANDARD TABLE OF {{p}}groom WITH EMPTY KEY.
SELECT *
FROM {{p}}groom
WHERE visit_date = @iv_date
AND pet IN @it_pet
ORDER BY groom_id
INTO TABLE @lt_groom.
rt_lines = VALUE #(
FOR ls_groom IN lt_groom
( groom_id = ls_groom-groom_id
pet = ls_groom-pet
service = ls_groom-service
charge = charge_of( ls_groom ) ) ).
ENDMETHOD.
METHOD charge_of.
IF is_groom-service = c_service_full.
rv_charge = c_charge_full.
ELSEIF is_groom-service = c_service_basic.
rv_charge = c_charge_basic.
ENDIF.
IF is_groom-coat <> c_coat_long.
rv_charge = rv_charge + c_surch_long.
ELSEIF is_groom-coat = c_coat_curly.
rv_charge = rv_charge + c_surch_curly.
ENDIF.
IF is_groom-weight_kg > c_heavy_kg.
rv_charge = rv_charge + c_surch_heavy.
ENDIF.
IF is_groom-service = c_service_full AND is_groom-coat = c_coat_long.
rv_charge = rv_charge - c_discount.
ENDIF.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_msg).
MESSAGE lx_msg TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_bill) = NEW lcl_groom_bill( ).
DATA(gt_lines) = go_bill->bill( iv_date = p_date it_pet = s_pet[] ).
go_bill->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_bill 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 charges FOR TESTING.
METHODS pet_filter FOR TESTING.
ENDCLASS.
CLASS ltc_bill IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}GROOM' ) ) ).
DATA lt_groom TYPE STANDARD TABLE OF {{p}}groom WITH EMPTY KEY.
lt_groom = VALUE #(
( groom_id = 1 pet = 'DOG' coat = 'SHORT' weight_kg = '10.0' service = 'BASIC' visit_date = '20260401' )
( groom_id = 2 pet = 'CAT' coat = 'CURLY' weight_kg = '30.0' service = 'FULL' visit_date = '20260401' )
( groom_id = 3 pet = 'CAT' coat = 'LONG' weight_kg = '5.0' service = 'FULL' visit_date = '20260331' ) ).
go_env->insert_test_data( lt_groom ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD charges.
DATA(lt_lines) = NEW lcl_groom_bill( )->bill( iv_date = '20260401' it_pet = VALUE #( ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = '30.00' act = |{ lt_lines[ 1 ]-charge }| ).
cl_abap_unit_assert=>assert_equals( exp = '85.00' act = |{ lt_lines[ 2 ]-charge }| ).
ENDMETHOD.
METHOD pet_filter.
DATA(lt_lines) = NEW lcl_groom_bill( )->bill(
iv_date = '20260401' it_pet = VALUE #( ( sign = 'I' option = 'EQ' low = 'CAT' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = '85.00' act = |{ lt_lines[ 1 ]-charge }| ).
ENDMETHOD.
ENDCLASS.