138 lines
4.8 KiB
ABAP
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.
|