Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
85 lines
2.8 KiB
ABAP
85 lines
2.8 KiB
ABAP
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(<ls_workload>).
|
|
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 <ls_workload>.
|
|
RETURN.
|
|
ENDIF.
|
|
<ls_workload>-job_count = <ls_workload>-job_count + 1.
|
|
<ls_workload>-total_hours = <ls_workload>-total_hours + is_job-work_hours.
|
|
IF is_date_set( is_job-start_date ) = abap_false
|
|
AND ( <ls_workload>-first_date IS INITIAL
|
|
OR is_job-start_date < <ls_workload>-first_date ).
|
|
<ls_workload>-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.
|