Coding JAP

2019-04-08 10:39:34

ABAP code for JAP.

First part: ORDERNETS.

As promised in previous post, I´m going to share the code of JAP. O here it is….

                          

*&---------------------------------------------------------------------*
*& Report  ZJAP_GET_TABLES_2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zjap_get_tables_2.

DATA: wa_matnr TYPE matnr,
      wa_dat TYPE erdat,
      wa_vko TYPE bapi_rangesvkorg,
      wa_wrk TYPE werks-werks,
      wa_uart TYPE shp_auart_range,
      ls_zkndposition TYPE zkndposition.

SELECT-OPTIONS: sel_mat FOR wa_matnr,
                sel_date FOR wa_dat,
                sel_vko FOR wa_vko,
                sel_wrk FOR wa_wrk,
                sel_art FOR wa_uart.

PARAMETERS: p_vsf AS CHECKBOX ,
            p_cross AS CHECKBOX ,
            p_safest AS CHECKBOX DEFAULT 'X',"safety stock
             p_cap_pl AS CHECKBOX, "capacity planning
             p_dbset AS CHECKBOX DEFAULT 'X', " write itab into dbtab
             p_capchk AS CHECKBOX DEFAULT 'X', " data for capacity check
             p_days TYPE i DEFAULT 365. " how far in the future shall capa-plan go

"! help class to test other classes as lcl_order
CLASS lcl_main DEFINITION CREATE PRIVATE.

  PUBLIC SECTION.
    "!
    "! @parameter r_result |
    CLASS-METHODS create
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_main.
     METHODS run.

  PROTECTED SECTION.
  PRIVATE SECTION.

ENDCLASS.
CLASS lcl_order_schedule DEFINITION DEFERRED.
"! delivers all primary requirements (sales orders, cross plant deliveries, planned orders VSF
CLASS lcl_order DEFINITION CREATE PRIVATE FRIENDS lcl_order_schedule.

  PUBLIC SECTION.

    TYPES: BEGIN OF t_zkndposition,
      delnr	TYPE delnr,
      del12 TYPE del12,
      delps	TYPE delps,
      delet TYPE delet,
      dat00 TYPE dat00,
      datpr TYPE dat00,
      ettyp TYPE ettyp,
      matnr	TYPE matnr,
      mng01	TYPE mng01,
      werk  TYPE werks_d,
      delkz TYPE delkz,
       END OF t_zkndposition.

   TYPES: BEGIN OF t_matnr_eval,
      matnr TYPE matnr,
      werks  TYPE werks_d,
       END OF t_matnr_eval.

  CLASS-METHODS class_constructor.
  CLASS-METHODS get_tables
    IMPORTING
       i_matnr TYPE STANDARD TABLE
       i_interval TYPE STANDARD TABLE
       i_vkorg TYPE STANDARD TABLE
       i_werks TYPE STANDARD TABLE
       i_auart TYPE STANDARD TABLE
       i_vsf TYPE char1 OPTIONAL
       i_cross TYPE char1 OPTIONAL
       i_safe_st TYPE char1 OPTIONAL " safety stock
       i_capa_plan TYPE char1 OPTIONAL .
  CLASS-METHODS get_mother_position
    CHANGING
      chs_zcapavrglst TYPE zcapavrglst.
  CLASS-DATA: gt_zordernet TYPE TABLE OF zordernet,
              gt_zkndposition TYPE TABLE OF zkndposition.
  METHODS constructor IMPORTING is_zkndposition TYPE t_zkndposition.
  PROTECTED SECTION.
  CLASS-METHODS get_sd_orders.
  CLASS-DATA:  vkorg_rt   TYPE    RANGE OF vkorg,
               matnr_rt   TYPE    RANGE  OF matnr,
               auart_rt   TYPE    RANGE OF auart,
               werks_rt   TYPE    RANGE OF werks-werks,
               datab_rt   TYPE    RANGE OF date.

  CLASS-DATA: gt_orders TYPE TABLE OF svbmtv_trvog .
  CLASS-DATA: gt_schedules TYPE TABLE OF bapisdhedu .
  CLASS-DATA: gt_orders_schedules TYPE TABLE OF t_zkndposition.
  CLASS-DATA: gt_mat_eval TYPE TABLE OF t_matnr_eval,
              lt_mat_eval LIKE gt_mat_eval,
              gs_mat_eval TYPE t_matnr_eval,
              gt_emdps TYPE TABLE OF mdps.
  DATA: gs_zkndposition TYPE t_zkndposition.
  DATA: gt_ioel TYPE TABLE OF ioel.

  PRIVATE SECTION.
    CLASS-DATA safety_stock TYPE char1.
    CLASS-METHODS get_cross_plant.
    CLASS-METHODS get_vsf.
    CLASS-METHODS get_all_postions.
    CLASS-METHODS get_data_md04_for_all
             IMPORTING i_mdps TYPE STANDARD TABLE
                       i_mdez TYPE STANDARD TABLE
                       i_mdsu TYPE STANDARD TABLE
                       i_mat_val TYPE t_matnr_eval.
    CLASS-METHODS get_nets.
    "! set start dates to planned and production orders
    CLASS-METHODS set_initial_dates.
    CLASS-METHODS date_dependences.
    CLASS-METHODS get_capa_plan.
    METHODS build_net.
    METHODS get_lt_ioel.
    METHODS get_net_for_schedule.
    METHODS get_lt_ioel_for_pp_u4
      IMPORTING
        i_schedule TYPE lcl_order=>t_zkndposition.
ENDCLASS.

CLASS lcl_requirement DEFINITION DEFERRED.
CLASS lcl_order_schedule DEFINITION CREATE PRIVATE.

  PUBLIC SECTION.
     TYPES: BEGIN OF t_plant_orders,
      delnr TYPE del12,
      delkz  TYPE delkz,
      o_element TYPE REF TO lcl_requirement,
       END OF t_plant_orders.
    CLASS-METHODS create
      IMPORTING
        is_schedule TYPE lcl_order=>t_zkndposition
        io_order    TYPE REF TO lcl_order
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_order_schedule.
    CLASS-METHODS class_constructor.
    CLASS-METHODS get_baubar
      IMPORTING
        i_delnr TYPE zcapavrglst-delnr
      RETURNING
        VALUE(r_result) TYPE zcapavrglst-baubar.
   CLASS-DATA:
*               gt_zordernet_all TYPE TABLE OF zordernet,
               gt_zordernet_all TYPE HASHED TABLE OF zordernet WITH UNIQUE KEY delnr delps delet delnrpos adresnet,
               gt_plant_orders TYPE TABLE OF t_plant_orders.
    METHODS constructor IMPORTING is_schedule TYPE lcl_order=>t_zkndposition
                                  io_order TYPE REF TO lcl_order.
    METHODS set_primary_replenishement
      IMPORTING
        i_prim TYPE ioel.
    DATA: gt_zordernet TYPE TABLE OF zordernet.
  PROTECTED SECTION.
  PRIVATE SECTION.
  DATA: gs_schedule TYPE lcl_order=>t_zkndposition.
  DATA: gs_zordernet TYPE zordernet,
        go_order TYPE REF TO lcl_order.
  DATA: gv_level TYPE i VALUE 0,
        gv_adress TYPE int2 VALUE 1.
  CLASS-DATA rt_delkz TYPE RANGE OF delkz.
  METHODS set_second_replenishement
    IMPORTING
      i_ioel TYPE ioel.
  METHODS set_custom_order
    CHANGING
      c_gs_zordernet TYPE zordernet.

ENDCLASS.

"!
CLASS lcl_requirement DEFINITION ABSTRACT .

  PUBLIC SECTION.
    METHODS: constructor
      IMPORTING
        i_requirement TYPE lcl_order_schedule=>t_plant_orders,
     get_real_dates_difference ABSTRACT RETURNING VALUE(r_difference) TYPE i,
     move_requirement ABSTRACT IMPORTING iv_diffenrence TYPE i,
             set_dat00_to_dat00_s ABSTRACT,
             get_dat01_s
               RETURNING
                 VALUE(r_result) TYPE dat01,
             get_dat00_s
               RETURNING
                 VALUE(r_result) TYPE dat00,
             get_dat01
               RETURNING
                 VALUE(r_result) TYPE dat01,
             get_dat00
               RETURNING
                 VALUE(r_result) TYPE dat00,
             set_diff
               IMPORTING
                 i_element_vzg TYPE i,
             set_dates_for_capacity.
  PROTECTED SECTION.
  DATA: gs_requirement TYPE lcl_order_schedule=>t_plant_orders,
        gs_zordernet TYPE zordernet.

ENDCLASS.

CLASS lcl_delivery DEFINITION ABSTRACT INHERITING FROM lcl_requirement.

  PUBLIC SECTION.
  METHODS: constructor IMPORTING  i_requirement TYPE lcl_order_schedule=>t_plant_orders.
  METHODS: move_requirement REDEFINITION,
           set_dat00_to_dat00_s REDEFINITION,
           get_real_dates_difference REDEFINITION.
  PROTECTED SECTION.

  DATA: gt_items2 TYPE STANDARD TABLE OF bapiekpo,
        gt_item_schedules TYPE TABLE OF bapieket.

ENDCLASS.

"!
CLASS lcl_order_element DEFINITION ABSTRACT INHERITING FROM lcl_requirement.

  PUBLIC SECTION.
    CLASS-METHODS class_constructor.
   METHODS: constructor
         IMPORTING
        i_requirement TYPE lcl_order_schedule=>t_plant_orders,
        move_requirement REDEFINITION,
        set_dat00_to_dat00_s REDEFINITION,
        set_diff REDEFINITION.
  PROTECTED SECTION.
  CLASS-DATA: gv_real_start TYPE sy-datum .
  DATA: gs_coois_line TYPE ioheader.
  DATA gv_diff TYPE i.  " difference due to date x is date
ENDCLASS.

CLASS lcl_qm_stock DEFINITION CREATE PRIVATE INHERITING FROM lcl_requirement FINAL.

  PUBLIC SECTION.
    CLASS-METHODS create
      IMPORTING
        i_requirement TYPE lcl_order_schedule=>t_plant_orders
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_qm_stock.
  METHODS:get_real_dates_difference REDEFINITION,
          move_requirement REDEFINITION,
          set_dat00_to_dat00_s REDEFINITION.
  PROTECTED SECTION.
  PRIVATE SECTION.

ENDCLASS.
CLASS lcl_kapid DEFINITION DEFERRED.
CLASS lcl_cap_requirement DEFINITION CREATE PRIVATE FINAL FRIENDS lcl_kapid.

  PUBLIC SECTION.
      TYPES: BEGIN OF t_cap_requirement.
      INCLUDE TYPE ioopcap.
      TYPES: start_point    TYPE cx_point_in_time,
             end_point      TYPE cx_point_in_time,
             start_point_w    TYPE cx_point_in_time, "wish
             end_point_w      TYPE cx_point_in_time, "wish
             duration       TYPE cx_duration_sec,
                 ma         TYPE i, "pocet lidi na AG to se musi doplnit
       END OF t_cap_requirement.
      CLASS-METHODS create
        IMPORTING
          is_cap_req TYPE lcl_cap_requirement=>t_cap_requirement
        RETURNING
          VALUE(r_result) TYPE REF TO lcl_cap_requirement.
      METHODS constructor IMPORTING is_cap_req TYPE lcl_cap_requirement=>t_cap_requirement.
      METHODS schedule IMPORTING io_kapid TYPE REF TO lcl_kapid.
      METHODS get_duration RETURNING VALUE(r_duration) TYPE cx_duration_sec.
      METHODS get_ma
        RETURNING
          VALUE(r_ma) TYPE i.
  PROTECTED SECTION.
  PRIVATE SECTION.
        TYPES: BEGIN OF t_capacity,
           kapid    TYPE kapid,
           point    TYPE cx_point_in_time,
           load     TYPE i,
           available TYPE i,
       END OF t_capacity.
    DATA gs_requirement TYPE lcl_cap_requirement=>t_cap_requirement.
    DATA gv_to_dispatch TYPE cx_duration_sec.
    DATA gv_wish_start TYPE cx_point_in_time.
    DATA gv_wish_end TYPE cx_point_in_time.
    DATA go_kapid TYPE REF TO lcl_kapid.
    DATA gv_real_start TYPE cx_point_in_time.
    DATA gs_startpoint TYPE t_capacity.
    DATA gs_endpoint   TYPE t_capacity.
    DATA gv_real_end TYPE cx_point_in_time.
    METHODS get_start_point.
    METHODS get_end_point.
    METHODS alocate.
    METHODS move
      IMPORTING
        i_start    TYPE cx_fsav OPTIONAL
        i_end      TYPE cx_fsav OPTIONAL
        i_duration TYPE cx_duration_sec
      EXPORTING
        e_start TYPE cx_fsav
        e_end   TYPE cx_fsav.
    METHODS alocate_in_window.


ENDCLASS.
CLASS lcl_kapid DEFINITION CREATE PRIVATE FRIENDS lcl_cap_requirement.

  PUBLIC SECTION.
       TYPES: BEGIN OF t_kapid,
      kapid TYPE kapid,
      ktext  TYPE ktext,
       END OF t_kapid.
      TYPES: BEGIN OF t_capacity,
           kapid    TYPE kapid,
           point    TYPE cx_point_in_time,
           load     TYPE i,
           available TYPE i,
       END OF t_capacity.
   CLASS-DATA: gt_zcapavrglst TYPE TABLE OF zcapavrglst.
    CLASS-METHODS create
      IMPORTING
        is_kapid TYPE t_kapid
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_kapid.
    CLASS-METHODS plan_capa IMPORTING i_days TYPE i.
    METHODS constructor IMPORTING is_kapid TYPE t_kapid.
  PROTECTED SECTION.
  PRIVATE SECTION.
   CLASS-DATA: gt_kapid TYPE TABLE OF t_kapid,
               gv_days TYPE i,
               start_plan TYPE datum,
               end_plan TYPE datum.
   DATA: gs_kapid TYPE t_kapid,
         gt_avail_per TYPE STANDARD TABLE OF rc65k,
         gs_capacity TYPE t_capacity,
         gt_capacity TYPE TABLE OF t_capacity,
         gt_cap_requirements TYPE TABLE OF lcl_cap_requirement=>t_cap_requirement.
   METHODS plan_kapid.
   METHODS get_master_data.
   METHODS plan_shopfloor.
   METHODS build_db_tables.
   METHODS set_capa_available.
   METHODS set_requirements.
ENDCLASS.

CLASS lcl_qm_stock IMPLEMENTATION.

  METHOD create.
      r_result = NEW #( i_requirement ).
  ENDMETHOD.

  METHOD get_real_dates_difference.
    gs_zordernet-dat00_s = sy-datum.
    gs_zordernet-dat01_s = sy-datum.
  ENDMETHOD.

  METHOD move_requirement.

  ENDMETHOD.

  METHOD set_dat00_to_dat00_s.

  ENDMETHOD.

ENDCLASS.

CLASS lcl_prod_order DEFINITION CREATE PRIVATE INHERITING FROM lcl_order_element FINAL.

  PUBLIC SECTION.
    CLASS-METHODS create
    IMPORTING is_requirement TYPE lcl_order_schedule=>t_plant_orders
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_prod_order.
        METHODS: get_real_dates_difference REDEFINITION,
                 constructor  IMPORTING
                             i_requirement TYPE lcl_order_schedule=>t_plant_orders.
        METHODS: set_dates_for_capacity REDEFINITION.
  PROTECTED SECTION.
  PRIVATE SECTION.
  DATA: gt_confirmations TYPE ioopconf_tab,
        gt_routings      TYPE iooper_tab.
ENDCLASS.

CLASS lcl_plan_order DEFINITION CREATE PRIVATE INHERITING FROM lcl_order_element FINAL.

  PUBLIC SECTION.
    CLASS-METHODS create
        IMPORTING is_requirement TYPE lcl_order_schedule=>t_plant_orders
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_plan_order.
     METHODS: get_real_dates_difference REDEFINITION,
             set_dates_for_capacity REDEFINITION.
  PROTECTED SECTION.
  PRIVATE SECTION.

ENDCLASS.

"!
CLASS lcl_bestellung DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL.

  PUBLIC SECTION.
    CLASS-METHODS create
      IMPORTING
        i_requirement TYPE lcl_order_schedule=>t_plant_orders
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_bestellung.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

"!
CLASS lcl_banf DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL.

  PUBLIC SECTION.
    CLASS-METHODS create
      IMPORTING
        i_requirement TYPE lcl_order_schedule=>t_plant_orders
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_banf.
  METHODS: constructor IMPORTING  i_requirement TYPE lcl_order_schedule=>t_plant_orders,
           get_real_dates_difference REDEFINITION,
           move_requirement REDEFINITION.
  PROTECTED SECTION.
  PRIVATE SECTION.
  DATA: gt_items TYPE TABLE OF bapieban,
        gv_banf TYPE banfn.
ENDCLASS.

CLASS lcl_liefer_einteilung DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL.

  PUBLIC SECTION.
    CLASS-METHODS create
      IMPORTING
        i_requirement TYPE lcl_order_schedule=>t_plant_orders
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_liefer_einteilung.
  PROTECTED SECTION.
  PRIVATE SECTION.

ENDCLASS.

CLASS lcl_liefer_einteilung IMPLEMENTATION.

  METHOD create.
       r_result = NEW #( i_requirement ).
  ENDMETHOD.

ENDCLASS.
"!
CLASS lcl_lieferavis DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL.

  PUBLIC SECTION.
    CLASS-METHODS create
      IMPORTING
        i_requirement TYPE lcl_order_schedule=>t_plant_orders
      RETURNING
        VALUE(r_result) TYPE REF TO lcl_lieferavis.
  PROTECTED SECTION.
  PRIVATE SECTION.

ENDCLASS.




CLASS lcl_services_zjap2 DEFINITION CREATE PRIVATE.

  PUBLIC SECTION.
  CLASS-DATA:
              gt_headtab TYPE HASHED TABLE OF ioheader WITH UNIQUE KEY aufnr, "ioheader_tab,
              gt_capreq TYPE HASHED TABLE OF ioopcap WITH UNIQUE KEY bedid bedzl canum, "ioopcap_tab,
              gt_confirm TYPE ioopconf_tab,
               gt_routings TYPE iooper_tab.
   CLASS-METHODS:
   class_constructor,
   "!
   "! @parameter i_first_date |
   "! @parameter i_second_date |
   "! @parameter r_days |
   "! returns differencee between two import parameters in days
   get_diff_days IMPORTING i_first_date TYPE datum
                           i_second_date TYPE datum
                 RETURNING VALUE(r_days) TYPE i,
   "!
   "! @parameter i_date |
   "! @parameter i_diff |
   "! @parameter i_direction |
   "! @parameter r_new_date |
   "! parameter differencee can be fed with positive or negative values.
   "! if positive but needed negative parameter i_dierection can be helpful
   move_date_with_diff IMPORTING i_date TYPE datum
                                 i_diff TYPE i
                                 i_direction TYPE char1 OPTIONAL
                      RETURNING VALUE(r_new_date) TYPE datum,
   "!
   "! @parameter i_point |
   "! @parameter i_time |
   "! @parameter idate |
   "! @parameter e_point |
   "! @parameter e_time |
   "! @parameter e_date |
   convert_timepoint IMPORTING i_point TYPE cx_point_in_time OPTIONAL
                               i_time TYPE sy-uzeit OPTIONAL
                               i_date TYPE sy-datum OPTIONAL
                     EXPORTING e_point  TYPE cx_point_in_time
                               e_time TYPE sy-uzeit
                               e_date TYPE sy-datum,
   "! get data like in tx COOIS
   get_tx_coois,
   "!
   "! @parameter is_element_line |
   "! @parameter iv_delkz |
   "! @parameter lo_requirement |
   "! returns object of type from inherit classes according to delkz
   get_requirement_object IMPORTING is_element_line TYPE lcl_order_schedule=>t_plant_orders
                    RETURNING VALUE(r_requirement) TYPE REF TO lcl_requirement,
   get_week
     IMPORTING
       i_dat TYPE d
     RETURNING
       VALUE(r_week) TYPE zcapavrglst-week.
  PROTECTED SECTION.
  PRIVATE SECTION.
  CLASS-DATA: gv_calendar TYPE scal-fcalid.

ENDCLASS.

CLASS lcl_main IMPLEMENTATION.

  METHOD create.
    CREATE OBJECT r_result.
  ENDMETHOD.

  METHOD run.
   lcl_order=>get_tables( i_matnr = sel_mat[]
                          i_interval = sel_date[]
                          i_auart = sel_art[]
                          i_vkorg = sel_vko[]
                          i_werks = sel_wrk[]
                          i_capa_plan = p_cap_pl
                          i_cross = p_cross
                          i_vsf = p_vsf
                          i_safe_st = p_safest ).

  IF p_cap_pl IS NOT INITIAL.
   lcl_kapid=>plan_capa( i_days = p_days ).
  ENDIF.

  IF p_dbset IS NOT INITIAL.

   SELECT * FROM zkndposition INTO TABLE @DATA(lt_zkndposition).

   LOOP AT lcl_order=>gt_zkndposition ASSIGNING FIELD-SYMBOL(<fs>).
       TRY.
         <fs>-pozn = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-pozn.
         <fs>-username = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-username.
         <fs>-change_date = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-change_date.
         <fs>-zusage = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage.
         <fs>-zusage_ch_dat = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage_ch_dat.
         <fs>-zusage_date = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage_date.
         <fs>-zusage_usr = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage_usr.
         <fs>-zu_forecast = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zu_forecast.
        CATCH cx_sy_itab_line_not_found.
       CONTINUE.
      ENDTRY.
   ENDLOOP.

   DELETE FROM zkndposition.
   INSERT zkndposition FROM TABLE lcl_order=>gt_zkndposition.

   DELETE FROM zordernet.
   INSERT zordernet FROM TABLE lcl_order=>gt_zordernet.

  ENDIF.

     IF p_cap_pl IS NOT INITIAL.
       SORT lcl_kapid=>gt_zcapavrglst STABLE BY delnr vornr week kapid.
        DELETE ADJACENT DUPLICATES FROM lcl_kapid=>gt_zcapavrglst COMPARING delnr vornr week kapid.
          DELETE FROM zcapavrglst.
           INSERT zcapavrglst FROM TABLE  lcl_kapid=>gt_zcapavrglst.
      ENDIF.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_order IMPLEMENTATION.

  METHOD constructor.
    gs_zkndposition = is_zkndposition.
    gs_zkndposition-del12 = is_zkndposition-delnr.
  ENDMETHOD.

  METHOD class_constructor.

  ENDMETHOD.


  METHOD get_tables.
   matnr_rt = i_matnr.
   auart_rt = i_auart.
   datab_rt = i_interval.
   vkorg_rt = i_vkorg.
   werks_rt = i_werks.
   safety_stock = i_safe_st.

   get_sd_orders( ).

   IF i_cross IS NOT INITIAL.
    get_cross_plant( ).
   ENDIF.
   IF i_vsf IS NOT INITIAL.
    get_vsf( ).
   ENDIF.

   get_all_postions( ).

   get_nets( ).
   set_initial_dates( ).
   date_dependences( ).

   gt_zordernet = lcl_order_schedule=>gt_zordernet_all.
    gt_zkndposition = CORRESPONDING #( gt_orders_schedules ). "MAPPING matnr = material werks = plant ).

   IF i_capa_plan = 'X'.
    get_capa_plan( ).
   ENDIF.

  ENDMETHOD.

  METHOD get_sd_orders.
    DATA iv_trvog TYPE trvog VALUE '0'.
    DATA lt_vbmtv TYPE TABLE OF svbmtv_trvog.
    DATA lt_sales_key TYPE TABLE OF sales_key.
    DATA ls_view TYPE order_view.
    DATA lt_items TYPE TABLE OF bapisdit.
    DATA lt_items_status TYPE TABLE OF bapisditst.
    DATA lt_schedules TYPE TABLE OF bapisdhedu.

  DO 2 TIMES.

    CALL FUNCTION 'SD_SELECT_SALES_DOCUMENTS'
      EXPORTING
        iv_trvog          = iv_trvog
*       IV_BSTKD          =
*       IV_ZPAVW          =
        iv_vboff          = 'X'
        iv_vball          = 'X'
      TABLES
        t_vbmtv           = lt_vbmtv
*       LVBMTV            =
        i_vkorg_rt        = vkorg_rt
*       I_VTWEG_RT        =
*       I_SPART_RT        =
        i_matnr_rt        = matnr_rt
*       I_KUNNR1_RT       =
*       i_vkbur_rt        =
*       I_VKGRP_RT        =
        i_auart_rt        = auart_rt
*       I_ERNAM_RT        =
*       I_VBELN_RT        =
*       I_AUDAT_RT        =
        i_werks_rt        = werks_rt
*       I_ZPERS_RT        =
        i_datab_rt        = datab_rt
*       I_ERDAT_RT        =
              .

  gt_orders = VALUE #( BASE gt_orders  ( LINES OF lt_vbmtv ) ).
   CLEAR lt_vbmtv.

   iv_trvog = '3'.
  ENDDO.
  lt_sales_key = CORRESPONDING #( gt_orders ).

  ls_view-item = 'X'.
  ls_view-status_i = 'X'.
  ls_view-sdschedule = 'X'.

  CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
    EXPORTING
      i_bapi_view                    = ls_view
*     I_MEMORY_READ                  =
*     I_WITH_HEADER_CONDITIONS       = ' '
    TABLES
      sales_documents                = lt_sales_key
*     ORDER_HEADERS_OUT              =
      order_items_out                = lt_items
      order_schedules_out            = lt_schedules
*     ORDER_BUSINESS_OUT             =
*     ORDER_PARTNERS_OUT             =
*     ORDER_ADDRESS_OUT              =
*     ORDER_STATUSHEADERS_OUT        =
     order_statusitems_out          = lt_items_status
*     ORDER_CONDITIONS_OUT           =
*     ORDER_COND_HEAD                =
*     ORDER_COND_ITEM                =
*     ORDER_COND_QTY_SCALE           =
*     ORDER_COND_VAL_SCALE           =
*     ORDER_CONTRACTS_OUT            =
*     ORDER_TEXTHEADERS_OUT          =
*     ORDER_TEXTLINES_OUT            =
*     ORDER_FLOWS_OUT                =
*     ORDER_CFGS_CUREFS_OUT          =
*     ORDER_CFGS_CUCFGS_OUT          =
*     ORDER_CFGS_CUINS_OUT           =
*     ORDER_CFGS_CUPRTS_OUT          =
*     ORDER_CFGS_CUVALS_OUT          =
*     ORDER_CFGS_CUBLBS_OUT          =
*     ORDER_CFGS_CUVKS_OUT           =
*     ORDER_BILLINGPLANS_OUT         =
*     ORDER_BILLINGDATES_OUT         =
*     ORDER_CREDITCARDS_OUT          =
*     EXTENSIONOUT                   =
            .

*    lt_mat_eval = CORRESPONDING #( lt_items MAPPING matnr = material werks = plant ).

** control because of statur in position.

 LOOP AT lt_items ASSIGNING FIELD-SYMBOL(<item>).
   TRY.
   DATA(ls_status) = lt_items_status[ sd_doc = <item>-doc_number itm_number = <item>-itm_number ].
      CATCH cx_sy_itab_line_not_found.
     CONTINUE.
  ENDTRY.
       IF ls_status-deliv_stat = 'C'.
        CONTINUE.
      ELSE.
         lt_mat_eval = VALUE #( BASE lt_mat_eval ( CORRESPONDING #( <item> MAPPING matnr = material werks = plant ) ) ).
      ENDIF.

 ENDLOOP.

 APPEND LINES OF lt_mat_eval TO  gt_mat_eval.
 APPEND LINES OF lt_schedules TO gt_schedules.
  CLEAR lt_mat_eval.

  ENDMETHOD.


  METHOD get_cross_plant.
  DATA: ls_dynsel TYPE rsds_type,
        lt_clauses TYPE rsds_twhere,
        lt_range TYPE rsds_trange.

  DATA: lt_ekko TYPE TABLE OF ekko,
        lt_ekpo TYPE TABLE OF ekpo,
        lt_eket TYPE TABLE OF eket.

lt_clauses = VALUE #( BASE lt_clauses ( tablename = 'EKKO'
where_tab = VALUE #( ( line = |(| & | | & |LIFNR| & | | & |EQ| & | | & |0000266441| & | | & |)| ) ) ) ).


lt_range = VALUE #( BASE lt_range ( tablename = 'EKKO'
frange_t = VALUE #( ( fieldname = 'LIFNR' selopt_t = VALUE #( ( sign = 'I' option = 'EQ' low = '0000266441' ) ) ) ) ) ).


ls_dynsel-clauses = lt_clauses.
ls_dynsel-trange = lt_range.

    CALL FUNCTION 'ME_READ_EKKO_MULTIPLE'
      EXPORTING
        i_dynsel                  = ls_dynsel
*       i_dynfie                  =
*       i_archiv                  =
*       i_rweit                   =
*       i_guldt                   =
*       i_name1                   =
        i_selection_limit         = 5000
        i_ekpo_dummy              = 'X'
      TABLES
        te_ekko                   = lt_ekko
        te_ekpo                   = lt_ekpo
        te_eket                   = lt_eket
*       te_ekbe                   =
*       te_ekkn                   =
*       te_ekbz                   =
*       te_ekab                   =
*       te_ekek                   =
*       te_ekeh                   =
*       te_ekes                   =
*       ti_imkeys                 =
*       ti_vornr_range            =
*       ti_pspid_ext_range        =
*       ti_selpa_range            =
*       ti_requested_tables       =
*     exceptions
*       wrong_vornr_nplnr         = 1
*       wrong_selpa               = 2
*       limit_ds                  = 3
*       no_trange                 = 4
*       nothing_selected          = 5
*       uncomplete_selected       = 6
*       others                    = 7
              .
    IF sy-subrc <> 0.
* iMPLEMENT SUITABLE ERROR HANDLING HERE
    ENDIF.


 LOOP AT lt_ekko ASSIGNING FIELD-SYMBOL(<ekko>) WHERE reswk = '013' AND bukrs = '015' AND loekz = ''.
 LOOP AT lt_eket ASSIGNING FIELD-SYMBOL(<eket>) WHERE ebeln = <ekko>-ebeln.
 TRY.
   DATA(ls_ekpo) = lt_ekpo[ ebeln = <eket>-ebeln ebelp = <eket>-ebelp loekz = '' elikz = '' ].
      CATCH cx_sy_itab_line_not_found.
     CONTINUE.
  ENDTRY.
   IF <eket>-wemng < <eket>-menge.
    gs_mat_eval = CORRESPONDING #( ls_ekpo ).
    gs_mat_eval-werks = <ekko>-reswk.
    lt_mat_eval = VALUE #( BASE lt_mat_eval ( gs_mat_eval ) ).
    CLEAR: gs_mat_eval.
    ENDIF.
 ENDLOOP.
 ENDLOOP.

 APPEND LINES OF lt_mat_eval TO  gt_mat_eval.
   CLEAR lt_mat_eval.
  ENDMETHOD.


  METHOD get_vsf.
** alternative. business object BUS3027 from TA SWO1

*    CALL FUNCTION 'REQUIREMENTS_MAINTAIN'
**     EXPORTING
**       ECM60R             = ' '
**       ECM60A             = ' '
**       EPRASTA            =
*      TABLES
*        epbpt              =
**       EPBET              =
**       EPBCH              =
**       IPROTO             =
**       ITEM_OUT           =
**       SCHEDULE_OUT       =
**     EXCEPTIONS
**       ERROR              = 1
**       OTHERS             = 2
*              .
*    IF sy-subrc <> 0.
** Implement suitable error handling here
*    ENDIF.

 DATA lt_mdpd TYPE TABLE OF mdpb.

  SELECT * FROM mdpb INTO TABLE lt_mdpd WHERE vervs = 'X'
   AND werks IN werks_rt
    AND plnmg > 0
     AND ( bedae = 'VSF' OR bedae = 'VSEB')
      AND pdatu IN datab_rt.

  lt_mat_eval = CORRESPONDING #( lt_mdpd ).

 APPEND LINES OF lt_mat_eval TO  gt_mat_eval.
  CLEAR lt_mat_eval.
  ENDMETHOD.


  METHOD get_all_postions.
  DATA: lt_mdps TYPE TABLE OF mdps,
        lt_mdez TYPE TABLE OF mdez,
        lt_mdsu TYPE TABLE OF mdsu.

    SORT gt_mat_eval STABLE BY matnr werks.
    DELETE ADJACENT DUPLICATES FROM gt_mat_eval COMPARING matnr werks.

    LOOP AT gt_mat_eval ASSIGNING FIELD-SYMBOL(<mat>).
      "fm md04
      CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
        EXPORTING
*         PLSCN                          =
          matnr                          = <mat>-matnr
          werks                          = <mat>-werks
*         BERID                          =
*         ERGBZ                          =
*         AFIBZ                          =
*         INPER                          =
*         DISPLAY_LIST_MDPSX             =
*         DISPLAY_LIST_MDEZX             =
*         DISPLAY_LIST_MDSUX             =
*         NOBUF                          =
*         PLAUF                          =
*         I_VRFWE                        =
*         IS_SFILT                       =
*         IS_AFILT                       =
*       IMPORTING
*         E_MT61D                        =
*         E_MDKP                         =
*         E_CM61M                        =
*         E_MDSTA                        =
*         E_ERGBZ                        =
       TABLES
         mdpsx                          = lt_mdps
         mdezx                          = lt_mdez
         mdsux                          = lt_mdsu
*       EXCEPTIONS
*         MATERIAL_PLANT_NOT_FOUND       = 1
*         PLANT_NOT_FOUND                = 2
*         OTHERS                         = 3
                .
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

    get_data_md04_for_all( i_mat_val = <mat> i_mdps = lt_mdps i_mdez = lt_mdez i_mdsu = lt_mdsu ).

    ENDLOOP.

  ENDMETHOD.


  METHOD get_data_md04_for_all.
  DATA lt_mdps TYPE TABLE OF mdps.
  DATA lt_mdez TYPE TABLE OF mdez.
  DATA ls_element TYPE t_zkndposition.
  DATA lv_counter TYPE i VALUE 1.
  DATA(lv_count) = lines( i_mdps ).
   IF lv_count <= 1.
    EXIT.
   ENDIF.
   lt_mdps = i_mdps.
   lt_mdez = i_mdez.
   "standard customer orders
   LOOP AT lt_mdps ASSIGNING FIELD-SYMBOL(<mdps>) WHERE plumi = '-' AND ( delkz = 'VC' OR delkz = 'VE' ) AND dat00 IN datab_rt.
    ls_element = CORRESPONDING #( <mdps> ).
    ls_element-matnr = i_mat_val-matnr.
    ls_element-werk = i_mat_val-werks.

     TRY.
   ls_element-ettyp = gt_schedules[ doc_number = ls_element-delnr itm_number = ls_element-delps
                      sched_line = ls_element-delet ]-sched_type.
    ls_element-dat00 = gt_schedules[ doc_number = ls_element-delnr itm_number = ls_element-delps
                      sched_line = ls_element-delet ]-req_date.
         ls_element-datpr = gt_schedules[ doc_number = ls_element-delnr itm_number = ls_element-delps
                      sched_line = ls_element-delet ]-ms_date.
      CATCH cx_sy_itab_line_not_found.
     EXIT.
  ENDTRY.


    gt_orders_schedules = VALUE #( BASE gt_orders_schedules  ( CORRESPONDING #( ls_element
      MAPPING matnr = matnr werk = werk ) ) ).
   ENDLOOP.

*** cross plants  and *** primary requirements
      LOOP AT lt_mdps ASSIGNING FIELD-SYMBOL(<mdpsu>) WHERE plumi = '-' AND ( delkz = 'U4' OR delkz = 'PP')
      AND mng01 > 0 AND dat00 IN datab_rt.
    ls_element = CORRESPONDING #( <mdpsu> ).
    ls_element-matnr = i_mat_val-matnr.
    ls_element-werk = i_mat_val-werks.
    ls_element-ettyp = 'CP'.
    ls_element-datpr = ls_element-dat00.

    IF ls_element-delps IS INITIAL. "vsf
         TRY.
   ls_element-delnr = lt_mdez[ delkz = 'PP' dat00 = ls_element-dat00 ]-extra.
   ls_element-delps = '00010'.
   ls_element-delet = lv_counter.
   lv_counter = lv_counter + 1.
      CATCH cx_sy_itab_line_not_found.
     EXIT.
  ENDTRY.
   ENDIF.
    gt_emdps = VALUE #( BASE gt_emdps  ( <mdpsu> ) ).
    gt_orders_schedules = VALUE #( BASE gt_orders_schedules  ( CORRESPONDING #( ls_element
      MAPPING matnr = matnr werk = werk ) ) ).
   ENDLOOP.
  CLEAR: lv_counter.

  ENDMETHOD.


  METHOD get_nets.
   DATA: lt_orders_schedules LIKE gt_orders_schedules,
         lo_order TYPE REF TO lcl_order.

      lt_orders_schedules = gt_orders_schedules.
      SORT lt_orders_schedules STABLE BY delnr delps matnr werk.
      DELETE ADJACENT DUPLICATES FROM lt_orders_schedules COMPARING delnr delps matnr werk.

      LOOP AT lt_orders_schedules ASSIGNING FIELD-SYMBOL(<order>).
        lo_order = NEW #( <order> ).
       lo_order->build_net( ).
      ENDLOOP.

  ENDMETHOD.


  METHOD build_net.
    get_lt_ioel( ).
    get_net_for_schedule( ).
  ENDMETHOD.


  METHOD get_lt_ioel.
   DATA: ls_emdps TYPE mdps.
   DATA: ls_zkndposition LIKE gs_zkndposition.

         ls_zkndposition = gs_zkndposition.

 IF gs_zkndposition-delkz = 'U4' OR gs_zkndposition-delkz = 'PP'.
   EXIT.
 ENDIF.

   CALL FUNCTION 'MD_SALES_ORDER_STATUS_REPORT'
     EXPORTING
*      EDELET                   = 0000
       edelkz                   = ls_zkndposition-delkz
       edelnr                   = ls_zkndposition-del12
       edelps                   = ls_zkndposition-delps
*      EPLSCN                   = 000
*      AVAILABILITY_CHECK       = ' '
       no_savety_stock          = safety_stock
*      DATA_IN_MEMORY           = ' '
*      MEMORY_ID                = 'PLHS'
       ematnr                   = gs_zkndposition-matnr
       ewerks                   = gs_zkndposition-werk
*      EBERID                   = ' '
       emdps                    = ls_emdps
       nodisp                   = 'X'
       i_ignore_mtold           = 'X'
*      I_PROFID                 = ' '
*      I_REP_REFRESH            = ' '
*      IS_PROFILE               =
*      IT_VBEP_KEYS             =
       no_commit_work           = 'X'
*    IMPORTING
*      ET_MLDELAY               =
*      ET_RTREE_SEL             =
     TABLES
       iioelx                   = gt_ioel
     EXCEPTIONS
       error                    = 1
       OTHERS                   = 2
             .
   IF sy-subrc <> 0.
* Implement suitable error handling here
   ENDIF.

  ENDMETHOD.



  METHOD get_net_for_schedule.
    DATA: lo_schedule TYPE REF TO lcl_order_schedule.
   LOOP AT gt_orders_schedules ASSIGNING FIELD-SYMBOL(<schedule>) WHERE delnr = gs_zkndposition-delnr
    AND delps = gs_zkndposition-delps.
    lo_schedule = lcl_order_schedule=>create( is_schedule = <schedule>  io_order = me ).
    IF <schedule>-delkz NE 'PP' AND <schedule>-delkz NE 'U4'.
     LOOP AT gt_ioel ASSIGNING FIELD-SYMBOL(<prim>) WHERE rsnum = <schedule>-delnr
      AND rspos = <schedule>-delps AND etenr = <schedule>-delet AND sobes NE ' '.

       lo_schedule->set_primary_replenishement( <prim> ).
     ENDLOOP.

    ELSEIF <schedule>-delkz = 'PP'.
     get_lt_ioel_for_pp_u4( <schedule> ).
     LOOP AT gt_ioel ASSIGNING FIELD-SYMBOL(<prim_pp>) WHERE rsart+0(2) = <schedule>-delnr+0(2)
      AND dat00 = <schedule>-dat00 AND sobes NE ' '.

       lo_schedule->set_primary_replenishement( <prim_pp> ).
     ENDLOOP.

     ELSEIF <schedule>-delkz = 'U4'.
     get_lt_ioel_for_pp_u4( <schedule> ).
      LOOP AT gt_ioel ASSIGNING FIELD-SYMBOL(<prim_u4>) WHERE rsnum = <schedule>-delnr
      AND rspos = <schedule>-delps AND etenr = <schedule>-delet AND sobes NE ' '.

       lo_schedule->set_primary_replenishement( <prim_u4> ).
     ENDLOOP.
     ENDIF.
         lcl_order_schedule=>gt_zordernet_all =
      VALUE #( BASE lcl_order_schedule=>gt_zordernet_all  ( LINES OF lo_schedule->gt_zordernet ) ).
   ENDLOOP.

  ENDMETHOD.


  METHOD get_lt_ioel_for_pp_u4.
   DATA: ls_emdps TYPE mdps,
         lt_mdps TYPE TABLE OF mdps,
         ls_schedule TYPE lcl_order=>t_zkndposition.


       ls_schedule = i_schedule.
   ls_schedule-del12 = i_schedule-delnr.
   IF i_schedule-delkz = 'PP'.
    CLEAR: ls_schedule.
   ENDIF.

      CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
        EXPORTING
*         PLSCN                          =
          matnr                          = gs_zkndposition-matnr
          werks                          = gs_zkndposition-werk
       TABLES
         mdpsx                          = lt_mdps
*       EXCEPTIONS
*         MATERIAL_PLANT_NOT_FOUND       = 1
*         PLANT_NOT_FOUND                = 2
*         OTHERS                         = 3
                .
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

     TRY.
      ls_emdps = lt_mdps[ dat00 = i_schedule-dat00 delkz = i_schedule-delkz ].
             CATCH cx_sy_itab_line_not_found.
          EXIT.
         ENDTRY.
 ls_emdps-del12 = ls_emdps-delnr.
     CALL FUNCTION 'MD_SALES_ORDER_STATUS_REPORT'
     EXPORTING
*      EDELET                   = 0000
*        edelkz                   = ls_schedule-delkz
*        edelnr                   = ls_schedule-del12
*        edelps                   = ls_schedule-delps
        edelkz                   = ls_emdps-delkz
        edelnr                   = ls_emdps-del12
        edelps                   = ls_emdps-delps
*      EPLSCN                   = 000
*      AVAILABILITY_CHECK       = ' '
       no_savety_stock          = safety_stock
*      DATA_IN_MEMORY           = ' '
*      MEMORY_ID                = 'PLHS'
       ematnr                   = gs_zkndposition-matnr
       ewerks                   = gs_zkndposition-werk
*      EBERID                   = ' '
       emdps                    = ls_emdps
       nodisp                   = 'X'
       i_ignore_mtold           = 'X'
*      I_PROFID                 = ' '
*      I_REP_REFRESH            = ' '
*      IS_PROFILE               =
*      IT_VBEP_KEYS             =
       no_commit_work           = 'X'
*    IMPORTING
*      ET_MLDELAY               =
*      ET_RTREE_SEL             =
     TABLES
       iioelx                   = gt_ioel
     EXCEPTIONS
       error                    = 1
       OTHERS                   = 2
             .
   IF sy-subrc <> 0.
* Implement suitable error handling here
   ENDIF.

  ENDMETHOD.


  METHOD set_initial_dates.
     lcl_services_zjap2=>get_tx_coois( ). "get all needed initial dates for planned and production orders

     LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<order>).
      " 1. set start dates in zordernet for plant orders.
        LOOP AT lcl_order_schedule=>gt_zordernet_all ASSIGNING FIELD-SYMBOL(<delnrpos>) WHERE delnrpos = <order>-delnr.
          IF <order>-delkz = 'PA' OR <order>-delkz = 'FE' .
            TRY.
           <delnrpos>-dat01 = lcl_services_zjap2=>gt_headtab[ aufnr = <order>-delnr ]-gstrp.
             CATCH cx_sy_itab_line_not_found.
            CONTINUE.
         ENDTRY.
         ELSEIF <order>-delkz = 'QM'.
         <delnrpos>-dat01 = <delnrpos>-dat00.
        ENDIF.
      ENDLOOP.

     " 2. set "real_dates" for all elements
       <order>-o_element = lcl_services_zjap2=>get_requirement_object( is_element_line = <order> ).
       IF <order>-o_element IS INITIAL.
        CONTINUE.
       ENDIF.
        DATA(lv_difference) = <order>-o_element->get_real_dates_difference(  ). "!!!!!!!
           IF lv_difference > 0.
             <order>-o_element->move_requirement( lv_difference ).
           ELSE.
             <order>-o_element->set_dat00_to_dat00_s( ).
           ENDIF.
      " 3. set "dat01_s + dat00_s into zordernet
        LOOP AT lcl_order_schedule=>gt_zordernet_all ASSIGNING <delnrpos> WHERE delnrpos = <order>-delnr.
*          IF <order>-delkz = 'PA' OR <order>-delkz = 'FE' .
            <delnrpos>-dat01_s = <order>-o_element->get_dat01_s( ).
            <delnrpos>-dat00_s = <order>-o_element->get_dat00_s( ).
            <delnrpos>-dat01 = <order>-o_element->get_dat01( ).
            <delnrpos>-dat00 = <order>-o_element->get_dat00( ).
        ENDLOOP.
     ENDLOOP.

  ENDMETHOD.


  METHOD date_dependences.
    SORT lcl_order_schedule=>gt_zordernet_all STABLE BY stuffe DESCENDING delnrpos DESCENDING dat00_s ASCENDING.

    LOOP AT lcl_order_schedule=>gt_zordernet_all  ASSIGNING FIELD-SYMBOL(<element>).
           TRY.
              ASSIGN  lcl_order_schedule=>gt_zordernet_all[ nxtrs = <element>-rsnum  delnr = <element>-delnr
                                                                  delps = <element>-delps delet = <element>-delet ]
                                                                  TO FIELD-SYMBOL(<nxtrs>).
             CATCH cx_sy_itab_line_not_found.
            CONTINUE.
           ENDTRY.

*move
        IF <nxtrs>-dat01_s IS NOT INITIAL " deliveries no
         AND <nxtrs>-dat01_s < <element>-dat00_s.

            DATA(lv_diff) = lcl_services_zjap2=>get_diff_days( i_first_date = <element>-dat00_s
                                                              i_second_date = <nxtrs>-dat01_s ).

                 <nxtrs>-dat01_s = lcl_services_zjap2=>move_date_with_diff( i_date = <nxtrs>-dat01_s
                                                                             i_diff = lv_diff ).

                 <nxtrs>-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = <nxtrs>-dat00_s
                                                                             i_diff = lv_diff ).

*********Deliveries
       ELSEIF <element>-dat01 IS INITIAL AND <element>-dat00_s > <nxtrs>-dat00_s.
         CLEAR: lv_diff.
         lv_diff = lcl_services_zjap2=>get_diff_days( i_first_date = <element>-dat00_s
                                                      i_second_date = <element>-dat00 ).

                 <nxtrs>-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = <nxtrs>-dat00_s
                                                                             i_diff = lv_diff ).
         ENDIF.
*********Deliveries


     MODIFY TABLE lcl_order_schedule=>gt_zordernet_all FROM <nxtrs>.
    CLEAR: lv_diff.
    ENDLOOP.

*set delay
       LOOP AT lcl_order_schedule=>gt_zordernet_all  ASSIGNING <element>.
          <element>-vzg = lcl_services_zjap2=>get_diff_days( i_first_date = <element>-dat00_s
                                                            i_second_date = <element>-dat00 ).
               " set delay for capacity requirements
       TRY.
          ASSIGN  lcl_order_schedule=>gt_plant_orders[ delnr = <element>-delnrpos ]
                                                       TO FIELD-SYMBOL(<plant_order>).
               <plant_order>-o_element->set_diff( <element>-vzg ).
          CATCH cx_sy_itab_line_not_found.
          CONTINUE.
       ENDTRY.
       ENDLOOP.
  ENDMETHOD.


  METHOD get_capa_plan.
   "set_dates_capa_requirements, "! sets new dates for capacity requirements according to dates in order-net(zordernet)
   LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<order>).
    <order>-o_element->set_dates_for_capacity( ).
   ENDLOOP.

  ENDMETHOD.



  METHOD get_mother_position.
         DATA:lt_zkndposition TYPE TABLE OF zkndposition.

   LOOP AT gt_zordernet ASSIGNING FIELD-SYMBOL(<zordernet>) WHERE delnrpos = chs_zcapavrglst-delnr.
        TRY.
          ASSIGN  gt_zkndposition[ delnr = <zordernet>-delnr delps = <zordernet>-delps delet = <zordernet>-delet ]
                                                       TO FIELD-SYMBOL(<zkndpos>).
               lt_zkndposition = VALUE  #( BASE lt_zkndposition ( <zkndpos> ) ).
          CATCH cx_sy_itab_line_not_found.
          CONTINUE.
       ENDTRY.
   ENDLOOP.

       "  SORT lt_zkndposition ASCENDING BY datpr.  " produktionstermin
        SORT lt_zkndposition ASCENDING BY dat00.  " kundentermin
          ASSIGN  lt_zkndposition[ 1 ] TO <zkndpos>.
          chs_zcapavrglst-datpr_end = <zkndpos>-datpr.
          chs_zcapavrglst-dat00_end = <zkndpos>-dat00.
          chs_zcapavrglst-matnr_end = <zkndpos>-matnr.
  ENDMETHOD.

ENDCLASS.


CLASS lcl_order_schedule IMPLEMENTATION.

  METHOD class_constructor.
   rt_delkz = VALUE #( ( option = 'EQ' sign = 'I' low = 'BA' )
                        ( option = 'EQ' sign = 'I' low = 'BE' )
                        ( option = 'EQ' sign = 'I' low = 'E1' )
                        ( option = 'EQ' sign = 'I' low = 'LA' )
                        ( option = 'EQ' sign = 'I' low = 'LE' )
                        ( option = 'EQ' sign = 'I' low = 'LL' )
                        ( option = 'EQ' sign = 'I' low = 'U4' )
                        ( option = 'EQ' sign = 'I' low = 'U1' )
                        ( option = 'EQ' sign = 'I' low = 'U2' ) ).
  ENDMETHOD.

  METHOD create.
      r_result = NEW #( is_schedule = is_schedule io_order = io_order ).
  ENDMETHOD.

  METHOD constructor.
    gs_schedule = is_schedule.
    go_order = io_order.
  ENDMETHOD.


  METHOD set_primary_replenishement.
     gs_zordernet = CORRESPONDING #( i_prim MAPPING delnrpos = delnr ).
     set_custom_order( CHANGING c_gs_zordernet = gs_zordernet ).
     gs_zordernet-stuffe = gv_level.
     gs_zordernet-adresnet = gv_adress.
     gv_adress = gv_adress + 1.
     gt_zordernet = VALUE  #( BASE gt_zordernet ( gs_zordernet ) ).

     gt_plant_orders = VALUE  #( BASE gt_plant_orders ( CORRESPONDING #( i_prim ) ) ).
     CLEAR gs_zordernet.

     set_second_replenishement( i_prim ).

  ENDMETHOD.


  METHOD set_second_replenishement.
   DATA: lv_nxtrs TYPE delnr.
   lv_nxtrs = i_ioel-nxtrs.
     CLEAR gs_zordernet.
     gv_level = gv_level + 1.
      LOOP AT go_order->gt_ioel ASSIGNING FIELD-SYMBOL(<ioel>) WHERE rsnum = lv_nxtrs AND sobes <> ' '
                                                                         AND plumi = '+'.  .
            gs_zordernet = CORRESPONDING #( <ioel> MAPPING delnrpos = delnr dat00 = rsdat ).
            IF <ioel>-delkz IN rt_delkz.
             gs_zordernet-dat00_s = <ioel>-dat00.
            ENDIF.
            set_custom_order( CHANGING c_gs_zordernet = gs_zordernet ).
            gs_zordernet-stuffe = gv_level.
                 gs_zordernet-adresnet = gv_adress.
                 gv_adress = gv_adress + 1.
            gt_zordernet = VALUE  #( BASE gt_zordernet ( gs_zordernet ) ).
            gt_plant_orders = VALUE  #( BASE gt_plant_orders ( CORRESPONDING #( <ioel> ) ) ).
            CLEAR gs_zordernet.
      IF <ioel>-nxtrs IS NOT INITIAL.
       set_second_replenishement( <ioel> ).
      ENDIF.
      ENDLOOP.
    gv_level = gv_level - 1.
  ENDMETHOD.


  METHOD set_custom_order.
     c_gs_zordernet-delnr = gs_schedule-delnr.
     c_gs_zordernet-delps = gs_schedule-delps.
     c_gs_zordernet-delet = gs_schedule-delet.
  ENDMETHOD.


  METHOD get_baubar.
     TRY.
      ASSIGN gt_zordernet_all[ delnrpos = i_delnr ] TO FIELD-SYMBOL(<zordernet>).
      IF <zordernet> IS NOT ASSIGNED.
       EXIT.
      ENDIF.
       IF <zordernet>-nxtrs IS INITIAL.
        r_result = 'X'.
       ELSE.
        TRY.
         DATA(ls_nxtrs) = gt_zordernet_all[ rsnum = <zordernet>-nxtrs ].
          CATCH cx_sy_itab_line_not_found.
          r_result = 'X'.
         ENDTRY.
       ENDIF.
      CATCH cx_sy_itab_line_not_found.
     EXIT.
    ENDTRY.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_requirement IMPLEMENTATION.

  METHOD constructor.

    me->gs_requirement = i_requirement.

  ENDMETHOD.

  METHOD get_dat01_s.
   r_result = gs_zordernet-dat01_s.
  ENDMETHOD.


  METHOD get_dat00_s.
   r_result = gs_zordernet-dat00_s.
  ENDMETHOD.


  METHOD set_diff.

  ENDMETHOD.


  METHOD set_dates_for_capacity.

  ENDMETHOD.

  METHOD get_dat01.
   r_result = gs_zordernet-dat01.
  ENDMETHOD.

  METHOD get_dat00.
   r_result = gs_zordernet-dat00.
  ENDMETHOD.

ENDCLASS.


CLASS lcl_order_element IMPLEMENTATION.

  METHOD class_constructor.
   gv_real_start = sy-datum + 1.
  ENDMETHOD.

  METHOD constructor.
   super->constructor( i_requirement ).
   TRY.
      gs_coois_line = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ].
      CATCH cx_sy_itab_line_not_found.
     EXIT.
    ENDTRY.
  ENDMETHOD.

  METHOD move_requirement.

    gs_zordernet = CORRESPONDING #( gs_coois_line ).
    TRY.
    gs_zordernet-dat00 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gltrp.
    gs_zordernet-dat01 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gstrp.
          CATCH cx_sy_itab_line_not_found.
     EXIT.
    ENDTRY.

    IF gs_zordernet-dat00_s IS INITIAL.
     gs_zordernet-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = gs_zordernet-dat00
                                                                    i_diff = iv_diffenrence ) .
      gs_zordernet-dat01_s = sy-datum.
    ENDIF.

  ENDMETHOD.

  METHOD set_dat00_to_dat00_s.
      TRY.
    gs_zordernet-dat00 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gltrp.
    gs_zordernet-dat01 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gstrp.
    gs_zordernet-dat00_s = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gltrp.
    gs_zordernet-dat01_s = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gstrp.
          CATCH cx_sy_itab_line_not_found.
     EXIT.
    ENDTRY.
  ENDMETHOD.

  METHOD set_diff.
   gv_diff = i_element_vzg.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_delivery IMPLEMENTATION.

  METHOD move_requirement.
   IF gs_zordernet-dat00_s IS INITIAL.
     gs_zordernet-dat00_s = sy-datum.
   ENDIF.
     gs_zordernet-dat01_s = gs_zordernet-dat00_s.
  ENDMETHOD.

  METHOD set_dat00_to_dat00_s.
gs_zordernet-dat01_s = gs_zordernet-dat00_s.
  ENDMETHOD.

  METHOD get_real_dates_difference.
         IF gs_zordernet-dat00_s IS INITIAL.
          gs_zordernet-dat00_s = sy-datum.
         ENDIF.
         IF gs_zordernet-dat00_s < sy-datum.
          gs_zordernet-dat00_s = sy-datum.
          ENDIF.
        r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = gs_zordernet-dat00_s
                                                      i_second_date = gs_zordernet-dat00 ).
  ENDMETHOD.

  METHOD constructor.
      super->constructor( i_requirement ).
   TRY.
      gs_zordernet = lcl_order_schedule=>gt_zordernet_all[ delnrpos = gs_requirement-delnr ].
      CATCH cx_sy_itab_line_not_found.
     EXIT.
    ENDTRY.

IF gs_requirement-delkz NE 'BA'.
*     gv_bestellung = gs_requirement-delnr.
*CALL FUNCTION 'BAPI_PO_GETDETAIL'
*  EXPORTING
*    purchaseorder                    =  gv_bestellung
*    ITEMS                            = 'X'
**   ACCOUNT_ASSIGNMENT               = ' '
*    SCHEDULES                        = 'X'
**   HISTORY                          = ' '
**   ITEM_TEXTS                       = ' '
**   HEADER_TEXTS                     = ' '
**   SERVICES                         = ' '
**   CONFIRMATIONS                    = ' '
**   SERVICE_TEXTS                    = ' '
**   EXTENSIONS                       = ' '
** IMPORTING
**   PO_HEADER                        =
**   PO_ADDRESS                       =
* TABLES
**   PO_HEADER_TEXTS                  =
*    PO_ITEMS                         = gt_items2
**   PO_ITEM_ACCOUNT_ASSIGNMENT       =
*    po_item_schedules                = gt_item_schedules
**   PO_ITEM_CONFIRMATIONS            =
**   PO_ITEM_TEXTS                    =
**   PO_ITEM_HISTORY                  =
**   PO_ITEM_HISTORY_TOTALS           =
**   PO_ITEM_LIMITS                   =
**   PO_ITEM_CONTRACT_LIMITS          =
**   PO_ITEM_SERVICES                 =
**   PO_ITEM_SRV_ACCASS_VALUES        =
**   RETURN                           =
**   PO_SERVICES_TEXTS                =
**   EXTENSIONOUT                     =
*          .
*          TRY.
**             gs_zordernet-dat01 = gt_items2[ del_compl = ' ' material = gs_zordernet-matnr ]-rel_date.
*            CATCH cx_sy_itab_line_not_found.
*           EXIT.
*         ENDTRY.

gs_zordernet-dat01 = gs_zordernet-dat00. " PO delivery date given.
ENDIF.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_prod_order IMPLEMENTATION.

  METHOD create.
      r_result = NEW #( is_requirement ).
  ENDMETHOD.

  METHOD get_real_dates_difference.
   " production order started?
     DATA(lv_count) = lines( gt_confirmations ).
      IF lv_count IS INITIAL.
       " production order not started
            IF gs_coois_line-gstrp <= sy-datum.
                r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum
                                                                  i_second_date = gs_coois_line-gstrp ).
             ENDIF.

       ELSE.
*       " if end-date today / in the future, hopping it will be done, else...
*        IF gs_coois_line-gltrp < sy-datum.

        SORT gt_confirmations STABLE BY vornr DESCENDING.
        TRY.
         DATA(ls_line) = gt_confirmations[ 1 ].
             TRY.
              DATA(ls_route)  = gt_routings[ vornr = ls_line-vornr ].
               DATA(lv_next_index) = line_index( gt_routings[ vornr = ls_line-vornr ] ).
                lv_next_index = lv_next_index + 1.
                  TRY.
                   DATA(ls_next_route)  = gt_routings[ lv_next_index ].
                      " due date for next route not done yet
                      r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum
                                                                       i_second_date = ls_next_route-fssbd ).
                        CATCH cx_sy_itab_line_not_found.
                         "there is not any next route -> last route partly confirmed
                           r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum
                                                                            i_second_date = ls_route-fssbd ).
                       EXIT.
                      ENDTRY.
                 CATCH cx_sy_itab_line_not_found.
                   EXIT.
                   ENDTRY.
             CATCH cx_sy_itab_line_not_found.
          EXIT.
        ENDTRY.
       ENDIF.
*       ENDIF.
  ENDMETHOD.

  METHOD constructor.

   super->constructor( i_requirement ).

  LOOP AT lcl_services_zjap2=>gt_confirm ASSIGNING FIELD-SYMBOL(<confirm>) WHERE aufnr = gs_requirement-delnr.
   gt_confirmations = VALUE #( BASE gt_confirmations ( <confirm> ) ).
   ENDLOOP.
   LOOP AT lcl_services_zjap2=>gt_routings ASSIGNING FIELD-SYMBOL(<route>) WHERE aufnr = gs_requirement-delnr.
   gt_routings = VALUE #( BASE gt_routings ( <route> ) ).
   ENDLOOP.
  ENDMETHOD.

  METHOD set_dates_for_capacity.
    LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<capa>) WHERE aufnr = gs_requirement-delnr AND kbearest > 0.
     <capa>-fstad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fstad i_diff = gv_diff ).
     <capa>-fssad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fssad i_diff = gv_diff ).
    ENDLOOP.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_plan_order IMPLEMENTATION.

  METHOD create.
    r_result = NEW #( is_requirement ).
  ENDMETHOD.

  METHOD get_real_dates_difference.
   IF gs_coois_line-gstrp <= sy-datum.
    r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum
                                                      i_second_date = gs_coois_line-gstrp ).
   ENDIF.
  ENDMETHOD.

  METHOD set_dates_for_capacity.
    LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<capa>) WHERE plnum = gs_requirement-delnr AND kbearest > 0.
     <capa>-fstad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fstad i_diff = gv_diff ).
     <capa>-fssad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fssad i_diff = gv_diff ).
    ENDLOOP.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_bestellung IMPLEMENTATION.

  METHOD create.
    r_result = NEW #( i_requirement ).
  ENDMETHOD.

ENDCLASS.


CLASS lcl_banf IMPLEMENTATION.

  METHOD create.
    r_result = NEW #( i_requirement ).
  ENDMETHOD.

  METHOD constructor.
       super->constructor( i_requirement ).
       gv_banf = gs_requirement-delnr.
    CALL FUNCTION 'BAPI_REQUISITION_GETDETAIL'
      EXPORTING
        number                               = gv_banf
*       ACCOUNT_ASSIGNMENT                   = ' '
*       ITEM_TEXTS                           = ' '
*       SERVICES                             = ' '
*       SERVICE_TEXTS                        = ' '
      TABLES
        requisition_items                    = gt_items
*       REQUISITION_ACCOUNT_ASSIGNMENT       =
*       REQUISITION_TEXT                     =
*       REQUISITION_LIMITS                   =
*       REQUISITION_CONTRACT_LIMITS          =
*       REQUISITION_SERVICES                 =
*       REQUISITION_SERVICES_TEXTS           =
*       REQUISITION_SRV_ACCASS_VALUES        =
*       RETURN                               =
              .
      TRY.
    gs_zordernet-dat01 = gt_items[ material = gs_zordernet-matnr preq_no = gs_zordernet-delnrpos ]-rel_date.
          CATCH cx_sy_itab_line_not_found.
       EXIT.
      ENDTRY.
  ENDMETHOD.

  METHOD get_real_dates_difference.
            r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum
                                                      i_second_date = gs_zordernet-dat01 ).
  ENDMETHOD.


  METHOD move_requirement.
     gs_zordernet-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = gs_zordernet-dat00
                                                                    i_diff = iv_diffenrence ) .
     gs_zordernet-dat01_s = lcl_services_zjap2=>move_date_with_diff( i_date = gs_zordernet-dat01
                                                                    i_diff = iv_diffenrence ) .
  ENDMETHOD.

ENDCLASS.

CLASS lcl_lieferavis IMPLEMENTATION.

  METHOD create.
    r_result = NEW #( i_requirement ).
  ENDMETHOD.

ENDCLASS.

CLASS lcl_services_zjap2 IMPLEMENTATION.

  METHOD class_constructor.
    gv_calendar = 'Z3'.
  ENDMETHOD.

  METHOD get_diff_days.
            DATA:
      lv_first               TYPE scal-facdate,
      lv_second              TYPE scal-facdate.

      CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
      EXPORTING
*       CORRECT_OPTION               = '+'
        date                         = i_first_date
        factory_calendar_id          = gv_calendar
      IMPORTING
*       DATE                         =
        factorydate                  = lv_first
*       WORKINGDAY_INDICATOR         =
      EXCEPTIONS
        calendar_buffer_not_loadable = 1
        correct_option_invalid       = 2
        date_after_range             = 3
        date_before_range            = 4
        date_invalid                 = 5
        factory_calendar_not_found   = 6
        OTHERS                       = 7.
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      EXIT.
    ENDIF.


    CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
      EXPORTING
*       CORRECT_OPTION               = '+'
        date                         = i_second_date
        factory_calendar_id          = gv_calendar
      IMPORTING
*       DATE                         =
        factorydate                  = lv_second
*       WORKINGDAY_INDICATOR         =
      EXCEPTIONS
        calendar_buffer_not_loadable = 1
        correct_option_invalid       = 2
        date_after_range             = 3
        date_before_range            = 4
        date_invalid                 = 5
        factory_calendar_not_found   = 6
        OTHERS                       = 7.
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      EXIT.
    ENDIF.

    r_days = lv_first - lv_second.
  ENDMETHOD.

  METHOD move_date_with_diff.

      DATA:
      lv_old_date      TYPE scal-facdate,
      lv_new_date     TYPE scal-facdate.

    CLEAR: lv_old_date,
           lv_new_date.

    CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
      EXPORTING
*       CORRECT_OPTION               = '+'
        date                         = i_date
        factory_calendar_id          = gv_calendar
      IMPORTING
*       DATE                         =
        factorydate                  = lv_old_date
*       WORKINGDAY_INDICATOR         =
      EXCEPTIONS
        calendar_buffer_not_loadable = 1
        correct_option_invalid       = 2
        date_after_range             = 3
        date_before_range            = 4
        date_invalid                 = 5
        factory_calendar_not_found   = 6
        OTHERS                       = 7.
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      EXIT.
    ENDIF.

 IF i_direction IS INITIAL.
      lv_new_date = lv_old_date + i_diff .
 ELSEIF i_direction = '+'.
  lv_new_date = lv_old_date + i_diff .
 ELSEIF i_direction = '-'.
    lv_new_date = lv_old_date + ( -1 * i_diff ).
 ENDIF.

    CALL FUNCTION 'FACTORYDATE_CONVERT_TO_DATE'
      EXPORTING
        factorydate                  = lv_new_date
        factory_calendar_id          = gv_calendar
      IMPORTING
        date                         = r_new_date
      EXCEPTIONS
        calendar_buffer_not_loadable = 1
        factorydate_after_range      = 2
        factorydate_before_range     = 3
        factorydate_invalid          = 4
        factory_calendar_id_missing  = 5
        factory_calendar_not_found   = 6
        OTHERS                       = 7.
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      EXIT.
    ENDIF.

  ENDMETHOD.

  METHOD convert_timepoint.
     DATA:
          lv_max  TYPE sy-datum,
          lv_convert TYPE sy-datum.
          lv_max = sy-datum + 4855.

    IF i_date > lv_max.
      lv_convert = lv_max - 1.
    ELSE.
      lv_convert =  i_date.
    ENDIF.

    IF i_point IS NOT INITIAL.
      CALL FUNCTION 'POINT_IN_TIME_CONVERT'
        EXPORTING
*         KZ_ENDTERMIN  = ' '
          point_in_time = i_point
        IMPORTING
          date          = e_date
          time          = e_time.

    ELSEIF i_date IS NOT INITIAL.
      CALL FUNCTION 'DATE_TIME_CONVERT'
        EXPORTING
          date          = lv_convert
          time          = i_time
        IMPORTING
          point_in_time = e_point
*       EXCEPTIONS
*         DATE_BEFORE_REL_DATE       = 1
*         DATE_TO_BIG   = 2
*         OTHERS        = 3
        .
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.


    ENDIF.
  ENDMETHOD.

  METHOD get_tx_coois.
   DATA: lt_seltab TYPE TABLE OF rsparams,
         ls_tcoa TYPE tcoa,
         lt_headtab TYPE ioheader_tab,
         gt_itemtab TYPE ioitem_tab,
         lt_capreq TYPE ioopcap_tab,
         lv_selname TYPE string,
         lt_kbed_plnum TYPE TABLE OF kbedd,
         lv_plnum TYPE plnum.

  CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
    EXPORTING
      curr_report     = 'SAPLCOISOUTPUT'"l_repid
    TABLES
      selection_table = lt_seltab
    EXCEPTIONS
      not_found       = 1
      no_report       = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    RETURN.
  ENDIF.
    lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_SYST1' kind = 'P' low = 'RÜCK' ) ). "only done orders
   lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_SYSH1' kind = 'P' low = 'I0009' ) ). "only done orders
   lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_KZ_E1' kind = 'P' low = 'X' ) ). "only done orders
lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_AUTYP' kind = 'P' low = '10' ) ). "only production orders

    lt_seltab = VALUE #( BASE lt_seltab ( selname = 'S_WERKS' kind = 'S' sign = 'I' option = 'EQ'
                       low = '013' ) ).
      lt_seltab = VALUE #( BASE lt_seltab ( selname = 'S_WERKS' kind = 'S' sign = 'I' option = 'EQ'
                       low = '015' ) ).

***** prepare_plant_orders
 SORT lcl_order_schedule=>gt_plant_orders STABLE BY delnr.
 DELETE ADJACENT DUPLICATES FROM lcl_order_schedule=>gt_plant_orders COMPARING delnr.

 LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<order>) WHERE ( delkz = 'FE' OR delkz = 'PA' ).
  IF <order>-delkz = 'FE'.
   lv_selname = 'S_AUFNR'.
  ELSEIF <order>-delkz = 'PA'.
    lv_selname = 'S_PLNUM'.
  ELSE.
   CONTINUE.
     ENDIF.

       lt_seltab = VALUE #( BASE lt_seltab ( selname = lv_selname kind = 'S' sign = 'I' option = 'EQ'
                       low = <order>-delnr ) ).
    CLEAR: lv_selname.
 ENDLOOP.

***** prepare_plant_orders


  ls_tcoa-header_sel = 'X'.
  ls_tcoa-item_sel = 'Y'.
  ls_tcoa-oper_sel = 'X'.
  ls_tcoa-opcap_sel = 'X'.
  ls_tcoa-opconf_sel = 'X'.
  ls_tcoa-layoutid_aa = '000000000001'.
  CALL FUNCTION 'COIS_SELECT_PARAMETERS_SET'
    EXPORTING
      it_parameter = lt_seltab
      is_tcoa      = ls_tcoa.

  CLEAR: gt_headtab, gt_itemtab, gt_routings, gt_confirm.
  CALL FUNCTION 'COIS_SELECT_ORDERS_READ'
    CHANGING
      ct_ioheader = lt_headtab
      ct_ioitem   = gt_itemtab
      ct_iooper   = gt_routings
      ct_ioopcap  = lt_capreq
      ct_ioopconf = gt_confirm.

      IF NOT lt_headtab IS INITIAL.
          gt_headtab = VALUE #( BASE gt_headtab  ( LINES OF lt_headtab ) ).
        CLEAR lt_headtab.
      ENDIF.
      gt_capreq = VALUE #( BASE gt_capreq ( LINES OF lt_capreq ) ).
      CLEAR: lt_headtab, lt_capreq.
*     add planned orders to the table of
      CALL FUNCTION 'COIS_SELECT_PL_ORDERS_READ'
        EXPORTING
          iv_read_components    = ls_tcoa-opcomp_sel
*          ir_planned_order_type = lr_paart
        CHANGING
          ct_ioheader           = lt_headtab.
*          ct_ioopcomp           = lt_ioopcomp.
      IF NOT lt_headtab IS INITIAL.
          gt_headtab = VALUE #( BASE gt_headtab  ( LINES OF lt_headtab ) ).
        CLEAR lt_headtab.
      ENDIF.

   LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<pl_order>) WHERE delkz = 'PA' .
    lv_plnum = <pl_order>-delnr.
      CALL FUNCTION 'MD_PLDORD_GETDETAIL_BAPI'
        EXPORTING
          plannedorder_number       = lv_plnum
*         ECM61O                    =
*       IMPORTING
*         HEADER_DATA               =
*         IKBKO1                    =
*         IKBKO2                    =
*         IKBKO3                    =
       TABLES
*         COMPONENTS_DATA           =
         capacity_data1            = lt_kbed_plnum
*         CAPACITY_DATA2            =
*         CAPACITY_DATA3            =
*         RF61Q                     =
*       EXCEPTIONS
*         NO_AUTHORITY              = 1
*         OTHERS                    = 2
                .
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.

          lt_capreq = CORRESPONDING #( lt_kbed_plnum ).
          gt_capreq = VALUE #( BASE gt_capreq ( LINES OF lt_capreq ) ).
     CLEAR: lt_capreq.
    ENDLOOP.

  ENDMETHOD.

  METHOD get_requirement_object.
     r_requirement =
                   SWITCH #(
                             is_element_line-delkz
                             WHEN 'PA' THEN lcl_plan_order=>create( is_element_line )
                             WHEN 'FE' THEN lcl_prod_order=>create( is_element_line )
                             WHEN 'BA' THEN lcl_banf=>create( is_element_line )
                             WHEN 'BE' THEN lcl_bestellung=>create( is_element_line )
                             WHEN 'LA' THEN lcl_lieferavis=>create( is_element_line )
                             WHEN 'LE' THEN lcl_liefer_einteilung=>create( is_element_line )
                             WHEN 'QM' THEN lcl_qm_stock=>create( is_element_line )
                           ) .

  ENDMETHOD.


  METHOD get_week.
      CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE'
        EXPORTING
          date = i_dat
        IMPORTING
          week = r_week
*         MONDAY        =
*         SUNDAY        =
        .
  ENDMETHOD.

ENDCLASS.

CLASS lcl_kapid IMPLEMENTATION.

  METHOD create.
    r_result = NEW #( is_kapid ).
  ENDMETHOD.

  METHOD constructor.
   gs_kapid = is_kapid.
  ENDMETHOD.

  METHOD plan_capa.

   gv_days = i_days.
   start_plan = sy-datum.
   end_plan = sy-datum + i_days.

*** remove unnecessary capacity requirements from the main table
DELETE lcl_services_zjap2=>gt_capreq WHERE fstad < sy-datum.
****************************************************************

   gt_kapid = CORRESPONDING #( lcl_services_zjap2=>gt_capreq ).
   SORT gt_kapid STABLE BY kapid.
   DELETE ADJACENT DUPLICATES FROM gt_kapid COMPARING kapid.
   LOOP AT gt_kapid ASSIGNING FIELD-SYMBOL(<kapid>).
    DATA(lo_kapid) = create( is_kapid = <kapid> ).
     lo_kapid->plan_kapid( ).
   ENDLOOP.
  ENDMETHOD.

  METHOD plan_kapid.
    get_master_data( ).
    set_requirements( ).
    plan_shopfloor( ).
    build_db_tables( ).
  ENDMETHOD.

  METHOD get_master_data.
* Create period for each day (shifts can be different by day):
  CALL FUNCTION 'CR_CAPACITY_PERIODS'
    EXPORTING
      datub         = end_plan
      datuv         = start_plan
*       KAPEL         = ' '
      kapid         = gs_kapid-kapid
*       MRPCAL        = ' '
*       PEANZ         = '000'
      peart         = 'A'  "day
*       PEBEG         = ' '
*       PEDAU         = '000'
*       VERSN         =
*       ZRAST         = ' '
    TABLES
      t_per         = gt_avail_per.

* Get available capacity for each day by shift:
  CALL FUNCTION 'CR_CAPACITY_AVAILABLE_PERIODS'
    EXPORTING
      exact_breaks              = 'X'
      shifts                    = 'X'
      unit_si                   = 'X'      "in seconds
    TABLES
      t_avail                   = gt_avail_per
    EXCEPTIONS
      hierarchy_not_found       = 1
      object_not_in_hierarchy   = 2
      version_without_hierarchy = 3
      parameter_not_with_time   = 4
      OTHERS                    = 5.
  ENDMETHOD.

  METHOD plan_shopfloor.
   set_capa_available( ).
    LOOP AT gt_cap_requirements ASSIGNING FIELD-SYMBOL(<req>).
     DATA(lo_requirement) = lcl_cap_requirement=>create( <req> ).
      <req>-duration = lo_requirement->get_duration( ).
      <req>-ma       = lo_requirement->get_ma( ).
      lo_requirement->schedule( me ).
      <req>-start_point = lo_requirement->gv_real_start.
      <req>-end_point = lo_requirement->gv_real_end.
      <req>-start_point_w = lo_requirement->gv_wish_start.
      <req>-end_point_w = lo_requirement->gv_wish_end.
        CLEAR:lo_requirement->gv_real_end, lo_requirement->gv_real_start, lo_requirement->gv_wish_end, lo_requirement->gv_wish_start.
    ENDLOOP.
  ENDMETHOD.

  METHOD build_db_tables.
   DATA: ls_zcapavrglst TYPE zcapavrglst.

   LOOP AT gt_cap_requirements ASSIGNING FIELD-SYMBOL(<req>) WHERE start_point > 0 AND end_point > 0.

****************************************************************************************************************
       lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-start_point
                                              IMPORTING e_date =  <req>-fstad
                                                        e_time = <req>-fstau ).
       lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-end_point
                                              IMPORTING e_date =  <req>-fssad
                                                        e_time = <req>-fssaz ).

       lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-start_point_w
                                              IMPORTING e_date =  <req>-sstad
                                                        e_time = <req>-sstau ).
       lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-end_point_w
                                              IMPORTING e_date =  <req>-sendd
                                                        e_time = <req>-sendu ).

**** duration in sec transform to min
  <req>-duration = <req>-duration / 60.

    ls_zcapavrglst = CORRESPONDING #( <req> MAPPING dat00_s = fssad time00_s = fssaz dat01_s = fstad time01_s = fstau
                                       mazahl = ma delnr = plnum dat00 = sendd time00 = sendu dat01 = sstad time01 = sstau ).
    IF ls_zcapavrglst-delnr IS INITIAL.
       ls_zcapavrglst-delnr = <req>-aufnr.
    ENDIF.
      ls_zcapavrglst-capa_demand = ls_zcapavrglst-duration.
      TRY.
         ls_zcapavrglst-matnr = lcl_services_zjap2=>gt_headtab[ aufnr = ls_zcapavrglst-delnr ]-matnr.
         ls_zcapavrglst-maktx = lcl_services_zjap2=>gt_headtab[ aufnr = ls_zcapavrglst-delnr ]-matxt.
         ls_zcapavrglst-mng01 = lcl_services_zjap2=>gt_headtab[ aufnr = ls_zcapavrglst-delnr ]-gamng.
        CATCH cx_sy_itab_line_not_found.

      ENDTRY.

      ls_zcapavrglst-vzg = lcl_services_zjap2=>get_diff_days( i_first_date = ls_zcapavrglst-dat00_s
                                                             i_second_date = ls_zcapavrglst-dat00 ).
      ls_zcapavrglst-week = lcl_services_zjap2=>get_week( ls_zcapavrglst-dat01_s ).
      ls_zcapavrglst-baubar = lcl_order_schedule=>get_baubar( ls_zcapavrglst-delnr ).
      lcl_order=>get_mother_position( CHANGING chs_zcapavrglst = ls_zcapavrglst ).
*****************************************************************************************************************
    gt_zcapavrglst = VALUE #( BASE gt_zcapavrglst ( ls_zcapavrglst ) ).
    CLEAR: ls_zcapavrglst.
   ENDLOOP.
  ENDMETHOD.


  METHOD set_capa_available.
    LOOP AT gt_avail_per ASSIGNING FIELD-SYMBOL(<avail>).
**** start of the day****
   lcl_services_zjap2=>convert_timepoint( EXPORTING i_date = <avail>-datuv
                                                    i_time = <avail>-zeitv
                                          IMPORTING e_point =  gs_capacity-point ).

     gs_capacity-kapid = gs_kapid-kapid.
     gs_capacity-load = 0.
     gs_capacity-available =  <avail>-angeb / <avail>-einzt.

      gt_capacity = VALUE #( BASE gt_capacity ( gs_capacity ) ).

     CLEAR gs_capacity.
     ENDLOOP.

  SORT gt_capacity STABLE ASCENDING BY point.
  ENDMETHOD.


  METHOD set_requirements.

  DATA: ls_cap_requirements LIKE LINE OF gt_cap_requirements.
   LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<cap_reqrm>) WHERE kapid = gs_kapid-kapid.
    ls_cap_requirements = CORRESPONDING #( <cap_reqrm> ).

    lcl_services_zjap2=>convert_timepoint( EXPORTING i_date = <cap_reqrm>-fstad
                                                     i_time = <cap_reqrm>-fstau
                                           IMPORTING e_point = ls_cap_requirements-start_point ).
    lcl_services_zjap2=>convert_timepoint( EXPORTING i_date = <cap_reqrm>-fssad
                                                     i_time = <cap_reqrm>-fssaz
                                           IMPORTING e_point = ls_cap_requirements-end_point ).

    gt_cap_requirements = VALUE #( BASE gt_cap_requirements ( ls_cap_requirements ) ).
    CLEAR: ls_cap_requirements.
   ENDLOOP.
   SORT gt_cap_requirements STABLE BY start_point aufnr plnum.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_cap_requirement IMPLEMENTATION.

  METHOD create.
        r_result = NEW #( is_cap_req ).
  ENDMETHOD.

  METHOD constructor.
   gs_requirement = is_cap_req.
  ENDMETHOD.


  METHOD schedule.
    go_kapid = io_kapid.
    gv_to_dispatch = gs_requirement-duration.
    gv_wish_start = gs_requirement-start_point.
    gv_wish_end = gs_requirement-end_point.


WHILE gv_to_dispatch > 0.

      get_start_point( ).
      get_end_point( ).
      alocate( ).

 ENDWHILE.

  ENDMETHOD.


  METHOD get_start_point.
    SORT go_kapid->gt_capacity STABLE BY point DESCENDING.

    LOOP AT go_kapid->gt_capacity INTO gs_startpoint
      WHERE point <= gs_requirement-start_point.
      EXIT.
    ENDLOOP.

    SORT go_kapid->gt_capacity STABLE BY point ASCENDING.

IF gs_startpoint-available < gs_requirement-ma.


"soupni
    LOOP AT go_kapid->gt_capacity INTO gs_startpoint
      WHERE point > gs_requirement-start_point
      AND available >= gs_requirement-ma.

      CLEAR: gs_requirement-start_point, gs_requirement-end_point.
       gs_requirement-start_point = gs_startpoint-point.
    move(
      EXPORTING
        i_start    = gs_requirement-start_point
        i_duration = gs_requirement-duration
      IMPORTING
        e_end   = gs_requirement-end_point ).

      EXIT.
    ENDLOOP.

ENDIF.

IF gv_real_start IS INITIAL. gv_real_start = gs_requirement-start_point.ENDIF.

  ENDMETHOD.


  METHOD get_end_point.
      LOOP AT go_kapid->gt_capacity INTO gs_endpoint
       WHERE point > gs_requirement-start_point
       AND available < gs_requirement-ma.
       EXIT.
     ENDLOOP.

     IF sy-subrc <> 0.
       LOOP AT go_kapid->gt_capacity INTO gs_endpoint
         WHERE point >= gs_requirement-end_point
         AND available >= gs_requirement-ma.
        EXIT.
       ENDLOOP.
     ENDIF.

  ENDMETHOD.


  METHOD alocate.
   DATA: lv_alocated TYPE cx_duration_sec,
                  lv_end TYPE cx_point_in_time.

     IF gs_endpoint-point < gs_requirement-end_point.
            lv_end = gs_endpoint-point.
     ELSE.
            lv_end =   gs_requirement-end_point.
       gv_real_end = gs_requirement-end_point.
     ENDIF.

IF lv_end IS NOT INITIAL.

          CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME'
        EXPORTING
          arbid                    = gs_requirement-arbid
          flg_capacity_scheduling  = 'X'
*          flg_compute_beg_end_prod = 'X'
*          flg_exact_breaks         = 'X'

          point_in_time_start_in   = gs_requirement-start_point
          point_in_time_end_in = lv_end
                           kapid   = gs_requirement-kapid
        IMPORTING

          duration_out = lv_alocated.

          gv_to_dispatch = gv_to_dispatch - lv_alocated.
CLEAR: gs_requirement-end_point.
 gs_requirement-end_point = lv_end.

 IF lv_alocated = 0.
   gv_to_dispatch = 0.
 ENDIF.

*******************************************
 IF lv_alocated > 0.
          alocate_in_window( ).
 ENDIF.
*******************************************

 IF gv_to_dispatch > 0 AND lv_alocated > 0.
**** posun
  gs_requirement-start_point = lv_end.
  CLEAR: gs_requirement-end_point.
           CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME'
        EXPORTING
          arbid                    = gs_requirement-arbid
          flg_capacity_scheduling  = 'X'
*          flg_compute_beg_end_prod = 'X'
*          flg_exact_breaks         = 'X'

          duration_in =  gv_to_dispatch
          point_in_time_start_in   = gs_requirement-start_point

                           kapid   = gs_requirement-kapid
        IMPORTING
         point_in_time_end_out = gs_requirement-end_point.

 ENDIF.
CLEAR: lv_alocated, lv_end.
ELSEIF lv_alocated = 0 OR gv_to_dispatch < 0.
  gv_real_end = 0.
  gv_real_start = 0.
  gv_to_dispatch = 0.

  DELETE lcl_services_zjap2=>gt_capreq WHERE bedid = gs_requirement-bedid
   AND bedzl = gs_requirement-bedzl
   AND canum = gs_requirement-canum.
ENDIF.
  ENDMETHOD.


  METHOD move.
     IF i_start IS NOT INITIAL.
      CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME'
        EXPORTING
          arbid                    = gs_requirement-arbid
          duration_in              = i_duration
          flg_capacity_scheduling  = 'X'
*          flg_compute_beg_end_prod = 'X'
*          flg_exact_breaks         = 'X'

          point_in_time_start_in   = i_start
                           kapid   = gs_requirement-kapid
        IMPORTING
          point_in_time_end_out    = e_end.

    ELSEIF i_end IS NOT INITIAL.
      CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME'
        EXPORTING
          arbid                    = gs_requirement-arbid
          duration_in              = i_duration
          flg_capacity_scheduling  = 'X'
*          flg_compute_beg_end_prod = 'X'
*          flg_exact_breaks         = 'X'

          point_in_time_end_in     = i_end
                           kapid   = gs_requirement-kapid

        IMPORTING
          point_in_time_start_out  = e_start.
    ENDIF.
  ENDMETHOD.


  METHOD alocate_in_window.
  DATA: ls_capacity LIKE LINE OF go_kapid->gt_capacity,
        ls_predposledni LIKE LINE OF go_kapid->gt_capacity.

    IF gv_real_start = gs_requirement-start_point.
       TRY.
         DATA(ls_wa) = go_kapid->gt_capacity[ point = gv_real_start ].
         CLEAR: ls_wa.
        CATCH cx_sy_itab_line_not_found.
        ls_capacity-kapid = gs_requirement-kapid.
        ls_capacity-point = gv_real_start.
        ls_capacity-load = gs_startpoint-load.
        ls_capacity-available = gs_startpoint-available.
              go_kapid->gt_capacity = VALUE #( BASE go_kapid->gt_capacity ( ls_capacity ) ).
        CLEAR ls_capacity.
      ENDTRY.
    ENDIF.

       LOOP AT go_kapid->gt_capacity ASSIGNING FIELD-SYMBOL(<capa>)
        WHERE point >= gs_requirement-start_point
         AND point < gs_requirement-end_point.

         IF ( <capa>-load + gs_requirement-ma ) < 0 OR ( <capa>-available - gs_requirement-ma ) < 0.
          gv_to_dispatch = -1.
           EXIT.
         ELSE.
          <capa>-load  = <capa>-load + gs_requirement-ma.
         <capa>-available = <capa>-available - gs_requirement-ma.
         ENDIF.


         CLEAR ls_predposledni.
         ls_predposledni = <capa>.

       ENDLOOP.

  IF gv_to_dispatch = 0.
       TRY.
         ls_wa = go_kapid->gt_capacity[ point = gs_requirement-end_point ].
         CLEAR: ls_wa.
        CATCH cx_sy_itab_line_not_found.
        ls_capacity-kapid = gs_requirement-kapid.
        ls_capacity-point = gv_real_end.
        ls_capacity-load = ls_predposledni-load - gs_requirement-ma.
        ls_capacity-available = ls_predposledni-available + gs_requirement-ma.

              IF ls_capacity-load < 0 OR ls_capacity-available < 0.
               gv_to_dispatch = -1.
              EXIT.
            ENDIF.

              go_kapid->gt_capacity = VALUE #( BASE go_kapid->gt_capacity ( ls_capacity ) ).
          SORT go_kapid->gt_capacity STABLE ASCENDING BY point.
          CLEAR ls_capacity.
        CLEAR ls_capacity.
      ENDTRY.

 ENDIF.
 gv_real_end = gs_requirement-end_point.

  ENDMETHOD.

  METHOD get_duration.
        DATA ls_prevod TYPE kbedd.

  ls_prevod = CORRESPONDING #( gs_requirement ).

CALL FUNCTION 'CY_AMOUNT_KBED_COMPUTE'
  EXPORTING
    in_kbed                      = ls_prevod
*   IN_OPR                       =
*   IN_DURATION_SEC              =
*   IN_EXAKT_BREAKS              =
*   IN_DURATION_OPR_UNIT         =
*   IN_UNIT                      =
*   IN_FLG_UNIT_OPR_GE_DAY       =
 IMPORTING
*   ex_amount_kbed               = neco
   ex_requirement_sec           = r_duration
 EXCEPTIONS
   duration_initial             = 1
   unit_conversion_error        = 2
   schedule_error               = 3
   OTHERS                       = 4
          .
IF sy-subrc <> 0.
* Implement suitable error handling here.
 r_duration = 1.
ENDIF.
  gs_requirement-duration = r_duration.
  ENDMETHOD.


  METHOD get_ma.
   DATA: lv_worker TYPE cy_kbeares,
         lv_machine TYPE cy_kbeares.
   IF gs_requirement-kapar = '001'.
    r_ma = 1.
   ELSEIF gs_requirement-kapar = '002'.
         LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<second>)
          WHERE bedid = gs_requirement-bedid
          AND bedzl = gs_requirement-bedzl
          AND canum <> gs_requirement-canum.
          EXIT.
         ENDLOOP.
    IF sy-subrc NE 0.
    EXIT.
    ENDIF.

    IF gs_requirement-keinh = 'MIN'.
      lv_worker = gs_requirement-kbearest * 60.
    ELSEIF gs_requirement-keinh = 'H'.
      lv_worker = gs_requirement-kbearest * 3600.
    ELSEIF gs_requirement-keinh = 'STD'.
      lv_worker = gs_requirement-kbearest * 3600.
    ELSEIF gs_requirement-keinh = 'TAG'.
      lv_worker = gs_requirement-kbearest * 86400.
    ENDIF.

     IF <second>-keinh = 'MIN'.
      lv_machine = <second>-kbearest * 60.
    ELSEIF <second>-keinh = 'H'.
      lv_machine = <second>-kbearest * 3600.
    ELSEIF <second>-keinh = 'STD'.
      lv_machine = <second>-kbearest * 3600.
    ELSEIF <second>-keinh = 'TAG'.
      lv_machine = <second>-kbearest * 86400.
    ENDIF.



    r_ma = lv_worker / lv_machine.
    IF r_ma < 1.
    r_ma = 1.
    ELSEIF r_ma > 5.
    r_ma = 1.
    ENDIF.
   ENDIF.

    gs_requirement-ma = 1. 

  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
lcl_main=>create( )->run( ).