REPORT {{p}}fleet_cost_old. PARAMETERS p_from TYPE d OBLIGATORY. PARAMETERS p_to TYPE d OBLIGATORY. DATA gv_cat TYPE {{p}}vehicle-category. SELECT-OPTIONS s_cat FOR gv_cat. CLASS lcl_fleet DEFINITION FINAL. PUBLIC SECTION. TYPES: BEGIN OF ty_line, vehicle_id TYPE {{p}}vehicle-vehicle_id, plate TYPE {{p}}vehicle-plate, category TYPE {{p}}vehicle-category, distance TYPE {{p}}trip-distance_km, fuel_cost TYPE {{p}}trip-toll_fee, toll_cost TYPE {{p}}trip-toll_fee, total_cost TYPE {{p}}trip-toll_fee, cost_per_km TYPE p LENGTH 15 DECIMALS 3, END OF ty_line, tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY, tt_cat TYPE RANGE OF {{p}}vehicle-category. CLASS-METHODS select_costs IMPORTING iv_from TYPE d iv_to TYPE d it_cat TYPE tt_cat RETURNING VALUE(rt_lines) TYPE tt_line. CLASS-METHODS show CHANGING ct_lines TYPE tt_line. PRIVATE SECTION. CLASS-METHODS cost_per_km IMPORTING is_line TYPE ty_line RETURNING VALUE(rv_value) TYPE ty_line-cost_per_km. ENDCLASS. CLASS lcl_fleet IMPLEMENTATION. METHOD select_costs. SELECT v~vehicle_id, v~plate, v~category, SUM( t~distance_km ) AS distance, SUM( t~fuel_liters * t~fuel_price ) AS fuel_cost, SUM( t~toll_fee ) AS toll_cost FROM {{p}}vehicle AS v INNER JOIN {{p}}trip AS t ON t~vehicle_id = v~vehicle_id WHERE t~trip_date BETWEEN @iv_from AND @iv_to OR v~category IN @it_cat GROUP BY v~vehicle_id, v~plate, v~category INTO TABLE @DATA(lt_sums). LOOP AT lt_sums INTO DATA(ls_sum). DATA(ls_line) = VALUE ty_line( vehicle_id = ls_sum-vehicle_id plate = ls_sum-plate category = ls_sum-category distance = ls_sum-distance fuel_cost = ls_sum-fuel_cost toll_cost = ls_sum-toll_cost total_cost = ls_sum-fuel_cost + ls_sum-toll_cost ). ls_line-cost_per_km = cost_per_km( ls_line ). APPEND ls_line TO rt_lines. ENDLOOP. SORT rt_lines BY total_cost DESCENDING. ENDMETHOD. METHOD cost_per_km. IF is_line-distance > 0. rv_value = ROUND( val = is_line-total_cost / is_line-distance dec = 3 ). ENDIF. ENDMETHOD. METHOD show. 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_error). MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'. ENDTRY. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA(gt_lines) = lcl_fleet=>select_costs( iv_from = p_from iv_to = p_to it_cat = s_cat[] ). lcl_fleet=>show( CHANGING ct_lines = gt_lines ). CLASS ltc_fleet 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_vehicle FOR TESTING. METHODS period_filter FOR TESTING. METHODS category_filter FOR TESTING. ENDCLASS. CLASS ltc_fleet IMPLEMENTATION. METHOD class_setup. go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}VEHICLE' ) ( '{{P}}TRIP' ) ) ). DATA lt_vehicle TYPE STANDARD TABLE OF {{p}}vehicle WITH EMPTY KEY. lt_vehicle = VALUE #( ( vehicle_id = 'V1' plate = 'AAA' category = 'VAN' ) ( vehicle_id = 'V2' plate = 'BBB' category = 'TRUCK' ) ). go_env->insert_test_data( lt_vehicle ). DATA lt_trip TYPE STANDARD TABLE OF {{p}}trip WITH EMPTY KEY. lt_trip = VALUE #( ( trip_id = 1 vehicle_id = 'V1' trip_date = '20260105' distance_km = 100 fuel_liters = 10 fuel_price = 2 toll_fee = 1 ) ( trip_id = 2 vehicle_id = 'V2' trip_date = '20260106' distance_km = 50 fuel_liters = 5 fuel_price = 2 toll_fee = 0 ) ). go_env->insert_test_data( lt_trip ). ENDMETHOD. METHOD class_teardown. go_env->destroy( ). ENDMETHOD. METHOD totals_per_vehicle. DATA(lt_lines) = lcl_fleet=>select_costs( iv_from = '20260101' iv_to = '20260131' it_cat = VALUE #( ) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 'V1' act = lt_lines[ 1 ]-vehicle_id ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}trip-toll_fee( 21 ) act = lt_lines[ 1 ]-total_cost ). cl_abap_unit_assert=>assert_equals( exp = 'V2' act = lt_lines[ 2 ]-vehicle_id ). ENDMETHOD. METHOD period_filter. DATA(lt_lines) = lcl_fleet=>select_costs( iv_from = '20260106' iv_to = '20260106' it_cat = VALUE #( ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 'V2' act = lt_lines[ 1 ]-vehicle_id ). ENDMETHOD. METHOD category_filter. DATA(lt_lines) = lcl_fleet=>select_costs( iv_from = '20260101' iv_to = '20260131' it_cat = VALUE #( ( sign = 'I' option = 'EQ' low = 'TRUCK' ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 'V2' act = lt_lines[ 1 ]-vehicle_id ). ENDMETHOD. ENDCLASS.