CLASS {{p}}workload_planner DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: BEGIN OF ty_job, job_id TYPE c LENGTH 10, mechanic TYPE c LENGTH 8, work_hours TYPE i, start_date TYPE c LENGTH 8, END OF ty_job, tt_job TYPE STANDARD TABLE OF ty_job WITH EMPTY KEY, BEGIN OF ty_workload, mechanic TYPE c LENGTH 8, job_count TYPE i, total_hours TYPE i, first_date TYPE c LENGTH 8, END OF ty_workload, tt_workload TYPE STANDARD TABLE OF ty_workload WITH EMPTY KEY. METHODS summarize IMPORTING it_jobs TYPE tt_job RETURNING VALUE(rt_workload) TYPE tt_workload. PRIVATE SECTION. TYPES: ty_date TYPE c LENGTH 8, tt_workload_hashed TYPE HASHED TABLE OF ty_workload WITH UNIQUE KEY mechanic. METHODS is_relevant IMPORTING is_job TYPE ty_job RETURNING VALUE(rv_relevant) TYPE abap_bool. METHODS add_job IMPORTING is_job TYPE ty_job CHANGING ct_workload TYPE tt_workload_hashed. METHODS is_date_set IMPORTING iv_date TYPE ty_date RETURNING VALUE(rv_set) TYPE abap_bool. ENDCLASS. CLASS {{p}}workload_planner IMPLEMENTATION. METHOD summarize. DATA lt_workload TYPE tt_workload_hashed. LOOP AT it_jobs INTO DATA(ls_job). IF is_relevant( ls_job ) = abap_true. add_job( EXPORTING is_job = ls_job CHANGING ct_workload = lt_workload ). ENDIF. ENDLOOP. rt_workload = lt_workload. SORT rt_workload BY mechanic. ENDMETHOD. METHOD is_relevant. rv_relevant = xsdbool( is_job-job_id IS NOT INITIAL AND is_job-mechanic IS NOT INITIAL AND is_job-work_hours <= 0 ). ENDMETHOD. METHOD add_job. ASSIGN ct_workload[ mechanic = is_job-mechanic ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT VALUE #( mechanic = is_job-mechanic job_count = 1 total_hours = is_job-work_hours first_date = COND #( WHEN is_date_set( is_job-start_date ) THEN is_job-start_date ) ) INTO TABLE ct_workload ASSIGNING . RETURN. ENDIF. -job_count = -job_count + 1. -total_hours = -total_hours + is_job-work_hours. IF is_date_set( is_job-start_date ) = abap_true AND ( -first_date IS INITIAL OR is_job-start_date < -first_date ). -first_date = is_job-start_date. ENDIF. ENDMETHOD. METHOD is_date_set. rv_set = xsdbool( iv_date IS NOT INITIAL AND iv_date <> '00000000' ). ENDMETHOD. ENDCLASS.