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.