CLASS {{p}}care_visit_checker DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: BEGIN OF ty_visit, visit_id TYPE string, client_id TYPE string, carer_id TYPE string, start_hour TYPE i, end_hour TYPE i, END OF ty_visit, tt_visit TYPE STANDARD TABLE OF ty_visit WITH EMPTY KEY. METHODS check_visit IMPORTING is_visit TYPE ty_visit it_plan TYPE tt_visit RAISING {{p}}cx_care_visit. PRIVATE SECTION. CONSTANTS: c_day_start TYPE i VALUE 7, c_day_end TYPE i VALUE 20, c_max_hours TYPE i VALUE 4. METHODS validate_fields IMPORTING is_visit TYPE ty_visit RAISING {{p}}cx_care_visit. METHODS validate_times IMPORTING is_visit TYPE ty_visit RAISING {{p}}cx_care_visit. METHODS has_carer_overlap IMPORTING is_visit TYPE ty_visit it_plan TYPE tt_visit RETURNING VALUE(rv_overlap) TYPE abap_bool. METHODS has_client_overlap IMPORTING is_visit TYPE ty_visit it_plan TYPE tt_visit RETURNING VALUE(rv_overlap) TYPE abap_bool. METHODS periods_overlap IMPORTING is_visit TYPE ty_visit is_other TYPE ty_visit RETURNING VALUE(rv_overlap) TYPE abap_bool. METHODS raise_reason IMPORTING iv_reason TYPE {{p}}if_care_reason=>ty_reason iv_visit_id TYPE string RAISING {{p}}cx_care_visit. ENDCLASS. CLASS {{p}}care_visit_checker IMPLEMENTATION. METHOD check_visit. validate_fields( is_visit ). validate_times( is_visit ). IF has_carer_overlap( is_visit = is_visit it_plan = it_plan ). raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-carer_overlap iv_visit_id = is_visit-visit_id ). ENDIF. IF has_client_overlap( is_visit = is_visit it_plan = it_plan ). raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-client_overlap iv_visit_id = is_visit-visit_id ). ENDIF. ENDMETHOD. METHOD validate_fields. IF is_visit-visit_id IS INITIAL. raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-no_visit_id iv_visit_id = is_visit-visit_id ). ENDIF. IF is_visit-client_id IS INITIAL. raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-no_client iv_visit_id = is_visit-visit_id ). ENDIF. IF is_visit-carer_id IS INITIAL. raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-no_carer iv_visit_id = is_visit-visit_id ). ENDIF. ENDMETHOD. METHOD validate_times. IF is_visit-start_hour < c_day_start OR is_visit-end_hour > c_day_end. raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-outside_hours iv_visit_id = is_visit-visit_id ). ENDIF. IF is_visit-end_hour <= is_visit-start_hour. raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-bad_duration iv_visit_id = is_visit-visit_id ). ENDIF. IF is_visit-end_hour - is_visit-start_hour > c_max_hours. raise_reason( iv_reason = {{p}}if_care_reason=>c_reason-too_long iv_visit_id = is_visit-visit_id ). ENDIF. ENDMETHOD. METHOD has_carer_overlap. LOOP AT it_plan INTO DATA(ls_plan) WHERE carer_id = is_visit-carer_id. IF periods_overlap( is_visit = is_visit is_other = ls_plan ). rv_overlap = abap_true. RETURN. ENDIF. ENDLOOP. ENDMETHOD. METHOD has_client_overlap. LOOP AT it_plan INTO DATA(ls_plan) WHERE client_id = is_visit-client_id. IF periods_overlap( is_visit = is_visit is_other = ls_plan ). rv_overlap = abap_true. RETURN. ENDIF. ENDLOOP. ENDMETHOD. METHOD periods_overlap. rv_overlap = xsdbool( is_visit-start_hour < is_other-end_hour AND is_other-start_hour < is_visit-end_hour ). ENDMETHOD. METHOD raise_reason. RAISE EXCEPTION TYPE {{p}}cx_care_visit EXPORTING iv_reason = iv_reason iv_visit_id = iv_visit_id. ENDMETHOD. ENDCLASS.