134 lines
4.1 KiB
ABAP
134 lines
4.1 KiB
ABAP
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.
|