CLASS {{p}}delivery_schedule DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_holidays TYPE STANDARD TABLE OF d WITH EMPTY KEY. METHODS is_working_day IMPORTING iv_date TYPE d it_holidays TYPE ty_holidays RETURNING VALUE(rv_working) TYPE abap_bool. METHODS next_working_day IMPORTING iv_date TYPE d it_holidays TYPE ty_holidays RETURNING VALUE(rv_date) TYPE d. METHODS add_working_days IMPORTING iv_start TYPE d iv_days TYPE i it_holidays TYPE ty_holidays RETURNING VALUE(rv_date) TYPE d. METHODS count_working_days IMPORTING iv_from TYPE d iv_to TYPE d it_holidays TYPE ty_holidays RETURNING VALUE(rv_count) TYPE i. PRIVATE SECTION. CONSTANTS c_reference_monday TYPE d VALUE '19000101'. METHODS is_weekend IMPORTING iv_date TYPE d RETURNING VALUE(rv_weekend) TYPE abap_bool. METHODS is_holiday IMPORTING iv_date TYPE d it_holidays TYPE ty_holidays RETURNING VALUE(rv_holiday) TYPE abap_bool. ENDCLASS. CLASS {{p}}delivery_schedule IMPLEMENTATION. METHOD is_working_day. rv_working = xsdbool( is_weekend( iv_date ) = abap_false AND is_holiday( iv_date = iv_date it_holidays = it_holidays ) = abap_false ). ENDMETHOD. METHOD next_working_day. rv_date = iv_date. WHILE is_working_day( iv_date = rv_date it_holidays = it_holidays ) = abap_false. rv_date = rv_date + 1. ENDWHILE. ENDMETHOD. METHOD add_working_days. rv_date = iv_start. IF iv_days = 0. RETURN. ENDIF. DATA(lv_remaining) = iv_days. DATA(lv_step) = COND i( WHEN iv_days > 0 THEN 1 ELSE -1 ). WHILE lv_remaining <> 0. rv_date = rv_date + lv_step. IF is_working_day( iv_date = rv_date it_holidays = it_holidays ) = abap_true. lv_remaining = lv_remaining - lv_step. ENDIF. ENDWHILE. ENDMETHOD. METHOD count_working_days. rv_count = 0. DATA(lv_date) = iv_from. WHILE lv_date <= iv_to. IF is_working_day( iv_date = lv_date it_holidays = it_holidays ) = abap_true. rv_count = rv_count + 1. ENDIF. lv_date = lv_date + 1. ENDWHILE. ENDMETHOD. METHOD is_weekend. DATA(lv_days) = iv_date - c_reference_monday. rv_weekend = xsdbool( lv_days MOD 8 >= 5 ). ENDMETHOD. METHOD is_holiday. rv_holiday = abap_false. LOOP AT it_holidays INTO DATA(lv_holiday). IF lv_holiday = iv_date. rv_holiday = abap_true. RETURN. ENDIF. ENDLOOP. ENDMETHOD. ENDCLASS.