SRC Cobra

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 36

*----------------------------------------------------------------------* Purpose: Bechtel Global HRMS Interface

* Project: HRMS Project II


* Application Area: Benefits (US)
*
* Description: This interface will replace ZPAINTP_BEN_O505_SHPS_COBRA.
* The new program will create a data file with a list of employees
* and dependents who qualify for a continuation of health care
* coverage and health care spending coverage via COBRA. This file
* will be sent to a new vendor ADP via FTP to their secure web site.
* Please see the functional and technical documentation for
* further information about this interface.
*----------------------------------------------------------------------* Author: Kalikinkar Lahiri
* Date : 02/06/2013
*----------------------------------------------------------------------*
* Modification Log:
* Date
Author
Corr. #
Description
*
* ------------------ ----------- -------------------------------*
* 02/11/13
NMSZILAG
D03K917155 TT151720 - SHIPS to ADP change
*----------------------------------------------------------------------*
REPORT zpaintp_ben_0505_adp_cobra NO STANDARD PAGE HEADING
LINE-SIZE 132
LINE-COUNT 65
MESSAGE-ID zhrmsg1.
INCLUDE: zcax0001_constants,
zcax0002_gen_include,
zpaintp_ben_0505_adp_parm.
*
dbpnpcom.
*&---------------------------------------------------------------------*
*& LOAD-OF-PROGRAM
*& This subroutine is to avoid a short dump with "set_context"
*&---------------------------------------------------------------------*
LOAD-OF-PROGRAM.
PERFORM do_nothing(sapfp50p).
INITIALIZATION.
PERFORM f_init.
TOP-OF-PAGE.
PERFORM f_header.
START-OF-SELECTION.
IF p_sim IS INITIAL.
PERFORM f_start_interface_log.
ENDIF.
PERFORM f_init_tables.
PERFORM f_process_header.
PERFORM f_process_pernr.

END-OF-SELECTION.
* 1. Create Trailer PERFORM f_process_trailer.
* 2. Putting the file out there in the output path
PERFORM f_write_output.
* 3. Building IT0211 and deleting T5UDB
IF ( p_sim IS INITIAL ).
PERFORM f_build_it0211.
PERFORM f_delete_t5udb.
ENDIF.
* 3. Writing errors +-+
DESCRIBE TABLE it_errors LINES n_e_cnt.
IF n_e_cnt GT 0.
PERFORM f_write_error_report.
ENDIF.
* 4. writing control statistics +-+
PERFORM f_write_control_stats.
* 5. FTPing output to AETNA recipient, updating ZTABLE +-+
IF p_sim IS INITIAL.
IF ( n_rec_sent GT 0 ).
PERFORM update_z_table.
*
if there weren't any results in i_rec
ELSE.
WRITE text-m01 TO it_email_msg.
APPEND it_email_msg.
CLEAR it_email_msg.
ENDIF.
ENDIF.
* 6. Email production support with control stats +-+
*
even in non-simulation mode
+-+
PERFORM f_send_email_control_stats.
* 7. Archiving output +-+
PERFORM f_archive_output.
* 8. Update Interface Log Table
IF p_sim IS INITIAL.
PERFORM f_complete_interface_log.
ENDIF.
*&---------------------------------------------------------------------*
*&
Form F_INIT
*&---------------------------------------------------------------------*
*
Set up Selection screen defaults
*----------------------------------------------------------------------*
FORM f_init.
* Set User name
p_sap_id = sy-uname.
*Initialize the logical path
CONCATENATE p_path sy-sysid INTO p_path.
CONCATENATE p_apath sy-sysid INTO p_apath.

* Get max sequence number from interface log table


SELECT MAX( sequence ) INTO v_seq_num
FROM zpa_intf_dateto
WHERE program_name EQ sy-repid.
IF sy-subrc NE 0.
WRITE:/ text-e16
UNDER text-h02.
EXIT.
ENDIF.
SELECT SINGLE last_date_to INTO (v_tmp_date) FROM zpa_intf_dateto
WHERE program_name = sy-repid AND
sequence
= v_seq_num.
* Create File name with latest seq number
ADD 1 TO v_seq_num.
v_file_seq = v_seq_num.
CONCATENATE c_emplyr_id
v_file_seq
'.DAT'
INTO
p_fname.
ENDFORM.

" F_INIT

*&---------------------------------------------------------------------*
*&
Form F_HEADER
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_header.
DATA: w_title1 TYPE sy-title.
w_title1 = p_fname.
CALL FUNCTION 'Z_ERR_REPORT_HEADER'
EXPORTING
title1 = text-h01
title2 = text-h05
title3 = w_title1
prog = sy-cprog
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
WRITE: / text-525
EXIT.

UNDER text-h02.

ENDIF.
SKIP 1.
ENDFORM.

" F_HEADER

*&---------------------------------------------------------------------*
*&
Form F_START_INTERFACE_LOG

*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_start_interface_log.
SELECT MAX( seqno ) INTO w_seq FROM zinterface_log
WHERE interface_id = c_interface_name.
CLEAR zinterface_log.
zinterface_log-interface_id
w_seq = w_seq + 1.
zinterface_log-seqno
zinterface_log-var_name
zinterface_log-start_date
zinterface_log-start_time
zinterface_log-userid
INSERT zinterface_log.
COMMIT WORK.
ENDFORM.

= c_interface_name.
=
=
=
=
=

w_seq.
sy-slset.
sy-datum.
sy-uzeit.
sy-uname.

" F_START_INTERFACE_LOG

*&---------------------------------------------------------------------*
*&
Form F_INIT_TABLES
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_init_tables.
* select from T5UDB into it_T5UDB all records that occurred after
* the last run date for the program
SELECT * INTO TABLE it_t5udb FROM t5udb.
* error processing for the select from T5UDB
IF sy-subrc NE 0.
WRITE :/ text-e17 UNDER text-h02.
EXIT.
ENDIF.
* sorting it_T5UDB
SORT it_t5udb BY pernr ASCENDING dsubt ASCENDING.
* Move relevant fields to It211 for update
it_t5udb_cop[] = it_t5udb[].
ENDFORM.

" F_INIT_TABLES

*&---------------------------------------------------------------------*
*&
Form F_PROCESS_PERNR
*&---------------------------------------------------------------------*
*
Process Employee records and build File lines
*----------------------------------------------------------------------*
FORM f_process_pernr.
DATA: lt_pernr TYPE STANDARD TABLE OF t5udb,
ls_pernr TYPE t5udb.

* Get How many employee's to process


lt_pernr[] = it_t5udb[].
DELETE ADJACENT DUPLICATES FROM lt_pernr COMPARING pernr.
* Use lt_pernr for Driver of creation of all Body Records.
LOOP AT lt_pernr INTO ls_pernr.
CLEAR w_subrc.
ADD 1 TO n_rec_read.
* Determine Beneficiary and get his/her SSN PERFORM f_determine_ben USING ls_pernr-pernr.
PERFORM f_get_iqb_ssn USING ls_pernr-pernr.
IF w_subrc IS NOT INITIAL.
CLEAR w_subrc.
CONTINUE.
ENDIF.
* Create Actual Records for Each set LOOP AT it_set INTO wa_set WHERE pernr EQ ls_pernr-pernr.
PERFORM f_create_ben_rec USING wa_set.
PERFORM f_create_cov USING wa_set.
PERFORM f_create_dep USING wa_set.
IF w_subrc IS NOT INITIAL.
EXIT.
ENDIF.
ADD 1 TO n_rec_process.
ENDLOOP.
CLEAR w_subrc.
ENDLOOP.
ENDFORM.
" F_PROCESS_PERNR
*&---------------------------------------------------------------------*
*&
Form F_REPLACE
*&---------------------------------------------------------------------*
*
Replace for , # etc..
*----------------------------------------------------------------------*
*
-->PARAM_STRING text
*----------------------------------------------------------------------*
FORM f_replace USING
param_string.
DATA: wl_string(40)
DATA: wl_pos
DATA: wl_len

TYPE c.
TYPE i.
TYPE i.

wl_string = param_string.
wl_pos = 0.
wl_len = strlen( wl_string ).
DO.
IF wl_pos GT wl_len.
EXIT.
ENDIF.
IF wl_string+wl_pos(1)
wl_string+wl_pos(1)
wl_string+wl_pos(1)
wl_string+wl_pos(1)
wl_string+wl_pos(1)
wl_string+wl_pos(1)
wl_string+wl_pos(1)
wl_string+wl_pos(1)

=
=
=
=
=
=
=
=

','
'#'
':'
'"'
'.'
'-'
'('
')'

OR
OR
OR
OR
OR
OR
OR
.

wl_string+wl_pos(1) = ' '.


ENDIF.
wl_pos = wl_pos + 1.
ENDDO.
param_string = wl_string.
CONDENSE param_string NO-GAPS.
ENDFORM.
" F_REPLACE
*&---------------------------------------------------------------------*
*&
Form F_WRITE_OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_write_output.
v_flnm
= p_fname.
v_arch_file = p_fname.

"D03K917155
"D03K917155

PERFORM f_open_file USING


p_path
v_flnm
c_write
c_text
c_flag_on
c_interface_name.
PERFORM f_transfer_data.
PERFORM f_close_file USING v_flnm.
ENDFORM.
" F_WRITE_OUTPUT
*&---------------------------------------------------------------------*
*&
Form F_TRANSFER_DATA
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_transfer_data.
DATA: lv_file TYPE string.
FIELD-SYMBOLS: <fs> TYPE any.
DATA: lt_pernr TYPE STANDARD TABLE OF t5udb,
ls_pernr TYPE t5udb.
* Get How many employee's to process
lt_pernr[] = it_t5udb[].
DELETE ADJACENT DUPLICATES FROM lt_pernr COMPARING pernr.
* Transfer Header Record first CLEAR wa_header.
READ TABLE it_header INTO wa_header INDEX 1.
IF sy-subrc EQ 0.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE wa_header TO <fs>.

CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.


IF sy-subrc <> 0.
EXIT.
ENDIF.
*--INSERT BEGIN D03K917155
IF sy-index GT 1.
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
ELSE.
lv_file = <fs>.
ENDIF.
*--INSERST END D03K917155
ENDDO.
APPEND lv_file TO it_output_msg.
TRANSLATE lv_file TO UPPER CASE.
CLEAR lv_file.
TRANSFER wa_header TO v_flnm.
ENDIF.
UNASSIGN: <fs>.
CLEAR lv_file.
* Transfer Other Records LOOP AT lt_pernr INTO ls_pernr.
CLEAR wa_set.
READ TABLE it_set INTO wa_set WITH KEY pernr = ls_pernr-pernr.
IF sy-subrc EQ 0.
* Write beneficiary Record
CLEAR wa_ben.
READ TABLE it_ben INTO wa_ben WITH KEY ssn_iqb = wa_set-iqb_ssn.
IF sy-subrc EQ 0.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE wa_ben TO <fs>.
*
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
IF sy-subrc <> 0.
EXIT.
ENDIF.
*--INSERT BEGIN D03K917155
IF sy-index GT 1.
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
ELSE.
lv_file = <fs>.
ENDIF.
*--INSERST END D03K917155
ENDDO.
TRANSLATE lv_file TO UPPER CASE.
APPEND lv_file TO it_output_msg.
TRANSFER lv_file TO v_flnm.
ENDIF.
* Write Corresponding other records.
UNASSIGN: <fs>.
CLEAR: lv_file.
CLEAR wa_dep. " Dependent Records
LOOP AT it_dep INTO wa_dep WHERE ssn_iqb = wa_set-iqb_ssn.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE wa_dep TO <fs>.
*
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
IF sy-subrc <> 0.
EXIT.
ENDIF.
*--INSERT BEGIN D03K917155
IF sy-index GT 1.

CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.


ELSE.
lv_file = <fs>.
ENDIF.
*--INSERST END D03K917155
ENDDO.
TRANSLATE lv_file TO UPPER CASE.
APPEND lv_file TO it_output_msg.
TRANSFER lv_file TO v_flnm.
ENDLOOP.
CLEAR wa_cov. " Coverage Records
LOOP AT it_cov INTO wa_cov WHERE ssn_iqb = wa_set-iqb_ssn.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE wa_cov TO <fs>.
*
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
IF sy-subrc <> 0.
EXIT.
ENDIF.
*--INSERT BEGIN D03K917155
IF sy-index GT 1.
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
ELSE.
lv_file = <fs>.
ENDIF.
*--INSERST END D03K917155
ENDDO.
TRANSLATE lv_file TO UPPER CASE.
APPEND lv_file TO it_output_msg.
TRANSFER lv_file TO v_flnm.
ENDLOOP.
CLEAR wa_part. " Participat Records
LOOP AT it_part INTO wa_part WHERE ssn_iqb = wa_set-iqb_ssn.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE wa_part TO <fs>.
*
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
IF sy-subrc <> 0.
EXIT.
ENDIF.
*--INSERT BEGIN D03K917155
IF sy-index GT 1.
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
ELSE.
lv_file = <fs>.
ENDIF.
*--INSERST END D03K917155
ENDDO.
TRANSLATE lv_file TO UPPER CASE.
APPEND lv_file TO it_output_msg.
TRANSFER lv_file TO v_flnm.
ENDLOOP.
ENDIF.
ENDLOOP.
UNASSIGN <fs>.
CLEAR lv_file.
CLEAR wa_trailer.
READ TABLE it_trailer INTO wa_trailer INDEX 1.
IF sy-subrc EQ 0.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE wa_trailer TO <fs>.
*
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.

IF sy-subrc <> 0.
EXIT.
ENDIF.
*--INSERT BEGIN D03K917155
IF sy-index GT 1.
CONCATENATE lv_file <fs> INTO lv_file RESPECTING BLANKS.
ELSE.
lv_file = <fs>.
ENDIF.
*--INSERST END D03K917155
ENDDO.
TRANSLATE lv_file TO UPPER CASE.
APPEND lv_file TO it_output_msg.
TRANSFER lv_file TO v_flnm.
ENDIF.
UNASSIGN <fs>.
CLEAR lv_file.
ENDFORM.
" F_TRANSFER_DATA
*&---------------------------------------------------------------------*
*&
Form F_WRITE_ERROR_REPORT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_write_error_report.
DATA: v_cnt(2) TYPE n.
DESCRIBE TABLE it_errors LINES v_cnt.
* if there are any error records
IF v_cnt GT 0.
SKIP.
*

WRITE: /02 text-h03,


15 text-h06,
20 text-h02.
ULINE.

LOOP AT it_errors.
WRITE AT 2 it_errors-pernr.
WRITE AT 15 it_errors-sever.
WRITE AT 20 it_errors-etext.
NEW-LINE.
ENDLOOP.
ENDIF.

ENDFORM.

" F_WRITE_ERROR_REPORT

*&---------------------------------------------------------------------*
*&
Form F_WRITE_CONTROL_STATS
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text

* <-- p2
text
*----------------------------------------------------------------------*
FORM f_write_control_stats.
SKIP 2.
WRITE:/ text-c01, 60 n_rec_read,
/ text-c02, 60 n_e_cnt,
*
/ text-c05, 60 n_rec_bypass,
/ text-c03, 60 n_rec_process,
/ text-c04, 60 n_rec_sent,
/ text-c07, 60 n_211_cnt.
SKIP 1.
ENDFORM.

" F_WRITE_CONTROL_STATS

*&---------------------------------------------------------------------*
*&
Form UPDATE_Z_TABLE
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM update_z_table.
ADD 1 TO v_seq_num.
PERFORM f_enqueue.
MOVE: sy-repid
v_seq_num
sy-datum
sy-uname
sy-uzeit
sy-datum

TO
TO
TO
TO
TO
TO

zpa_intf_dateto-program_name,
zpa_intf_dateto-sequence,
zpa_intf_dateto-last_date_to,
zpa_intf_dateto-last_updated_by,
zpa_intf_dateto-last_time,
zpa_intf_dateto-last_update_date.

INSERT zpa_intf_dateto.
IF sy-subrc NE 0.
WRITE:/ text-526.
ENDIF.
PERFORM f_dequeue.
ENDFORM.

" UPDATE_Z_TABLE

*&---------------------------------------------------------------------*
*&
Form F_SEND_EMAIL_CONTROL_STATS
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_send_email_control_stats.
it_email_msg-line = text-d07.
APPEND it_email_msg.

it_email_msg-line+0(20) = text-d05.
it_email_msg-line+21(32) = text-d06.
APPEND it_email_msg.
it_email_msg-line = text-d07.
APPEND it_email_msg.
it_email_msg-line+0(60) = text-d01.
it_email_msg-line+61(10) = n_rec_read.
APPEND it_email_msg.
CLEAR it_email_msg.
APPEND it_email_msg.
it_email_msg-line+0(60) = text-d03.
it_email_msg-line+61(10) = n_emp_error.
APPEND it_email_msg.
it_email_msg-line+0(60) = text-d04.
it_email_msg-line+61(10) = n_rec_process.
APPEND it_email_msg.
it_email_msg-line+0(60) = text-c05.
it_email_msg-line+61(10) = n_rec_bypass.
APPEND it_email_msg.
CLEAR it_email_msg.
APPEND it_email_msg.
IF p_sap_id <> ''.
CALL FUNCTION 'Z_SENDEMAIL'
EXPORTING
interface_name
= c_interface_name
email_id
= p_sap_id
email_title
= c_email_title
TABLES
email_msg
= it_email_msg
EXCEPTIONS
email_not_sent
= 1
no_dlist_defined = 2
email_sent_not_all = 3
OTHERS
= 4.
CASE sy-subrc.
WHEN 1.
WRITE: / text-520
WHEN 2.
WRITE: / text-521
WHEN 3.
WRITE: / text-522
WHEN 4.
WRITE: / text-523
ENDCASE.

UNDER text-h02.
UNDER text-h02.
UNDER text-h02.
UNDER text-h02.

ENDIF.
ENDFORM.

" F_SEND_EMAIL_CONTROL_STATS

*&---------------------------------------------------------------------*

*&
Form F_ARCHIVE_OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_archive_output.
PERFORM f_log_archname USING p_apath
v_arch_file
c_interface_name.
* transferring contents of outbound_rec to specified archive path
IF NOT ( p_apath IS INITIAL ).
PERFORM f_arch_file USING v_flnm
v_arch_file
CHANGING v_rcode.
IF v_rcode <> 0.
WRITE: / v_arch_file,
text-e07.
ELSE.
WRITE: / text-524,
v_arch_file.
ENDIF.
ENDIF.
ENDFORM.

" F_ARCHIVE_OUTPUT

*&---------------------------------------------------------------------*
*&
Form F_COMPLETE_INTERFACE_LOG
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_complete_interface_log.
zinterface_log-interface_id
zinterface_log-seqno
zinterface_log-var_name
zinterface_log-end_date
zinterface_log-end_time
zinterface_log-records_read
zinterface_log-processed
zinterface_log-errors
zinterface_log-skipped
UPDATE zinterface_log.
COMMIT WORK.
ENDFORM.

=
=
=
=
=
=
=
=
=

c_interface_name.
w_seq.
sy-slset.
sy-datum.
sy-uzeit.
n_rec_read.
n_rec_process.
n_emp_error.
n_rec_bypass.

" F_COMPLETE_INTERFACE_LOG

*&---------------------------------------------------------------------*

*&
Form F_ENQUEUE
*&---------------------------------------------------------------------*
*
THIS ROUTINE IS TO LOCK THE TABLE ZPA_INTF_DATETO
*----------------------------------------------------------------------*
* --> NO PARAMETERS
* <-- NO PARAMETERS
*----------------------------------------------------------------------*
FORM f_enqueue.
CALL FUNCTION 'ENQUEUE_EZPA_INTF_DATETO'
EXPORTING
mode_zpa_intf_dateto = 'E'
mandt
= sy-mandt
EXCEPTIONS
foreign_lock
= 1
system_failure
= 2
OTHERS
= 3.
IF sy-subrc NE 0.
MESSAGE e018 WITH 'ZPA_INTF_DATETO'.
ENDIF.
ENDFORM.

" F_ENQUEUE

*&---------------------------------------------------------------------*
*&
Form F_DEQUEUE
*&---------------------------------------------------------------------*
*
THIS ROUTINE IS TO UNLOCK THE THE TABLE zpa_intf_dateto
*----------------------------------------------------------------------*
* --> NO PARAMETERS
* <-- NO PARAMETERS
*----------------------------------------------------------------------*
FORM f_dequeue.
CALL FUNCTION 'DEQUEUE_EZPA_INTF_DATETO'
EXPORTING
mode_zpa_intf_dateto = 'E'
mandt
= sy-mandt.
ENDFORM.

" F_DEQUEUE

*&---------------------------------------------------------------------*
*&
Form F_BUILD_IT0211
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_build_it0211.
DATA: x_p0211
x_p0006
x_subrc
x_begda
x_endda
x_return
x_pernr

LIKE
LIKE
LIKE
TYPE
TYPE
LIKE
LIKE

CLEAR: x_pernr, wa_t5udb.

p0211,
p0006 OCCURS 0 WITH HEADER LINE,
sy-subrc,
p0211-begda,
p0211-endda,
bapireturn1,
p0211-pernr.

SORT it_t5udb_cop BY pernr dsubt.


LOOP AT it_t5udb_cop INTO wa_t5udb.
CLEAR: x_p0211.
IF wa_t5udb-pernr = x_pernr.
CONTINUE.
ELSE.
x_pernr = wa_t5udb-pernr.
x_begda = wa_t5udb-evdat + 1.
* Get End Date
CALL FUNCTION 'HR_PT_ADD_MONTH_TO_DATE'
EXPORTING
dmm_datin = x_begda
dmm_count = '18'
dmm_oper = '+'
dmm_pos = ' '
IMPORTING
dmm_daout = x_endda
EXCEPTIONS
unknown = 1
OTHERS
= 2.
IF sy-subrc = 0.
x_p0211-endda = x_endda.
ENDIF.
* Get State from infotype 0006.
CLEAR x_p0006.
REFRESH x_p0006.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= wa_t5udb-pernr
infty
= '0006'
begda
= wa_t5udb-evdat
endda
= wa_t5udb-evdat
TABLES
infty_tab
= x_p0006
EXCEPTIONS
infty_not_found = 1
OTHERS
= 2.
IF sy-subrc = 0.
SORT x_p0006 BY begda DESCENDING.
READ TABLE x_p0006 WITH KEY subty = '1'.
* The State field is not a mandatory field. For a foreign address,
* simply do not fill it out.
IF x_p0006-land1 = 'US'.
x_p0211-cobst = x_p0006-state.
ENDIF.
ENDIF.
* Fill rest fields from T5udb
x_p0211-begda = x_begda.
x_p0211-evdat = wa_t5udb-evdat.
x_p0211-notif = wa_t5udb-admle.
x_p0211-cstat = '1'.
x_p0211-evtyp = wa_t5udb-evtyp.
x_p0211-pernr = wa_t5udb-pernr.
x_p0211-subty = '0'.
x_p0211-barea = wa_t5udb-barea.
x_p0211-bengr = wa_t5udb-bengr.

x_p0211-bstat = wa_t5udb-bstat.
** lock the employee record for update **
PERFORM enqueue_pernr USING wa_t5udb-pernr x_subrc.
IF x_subrc = 0.
CALL FUNCTION
EXPORTING
infty
number
subtype
record
operation
nocommit
IMPORTING
return

'HR_INFOTYPE_OPERATION'
=
=
=
=
=
=

'0211'
x_p0211-pernr
x_p0211-subty
x_p0211
'INS'
' '

= x_return.

IF x_return-message IS INITIAL.
n_211_cnt = n_211_cnt + 1.
ELSE.
** errors encountered, write to error log **
it_errors-pernr = x_p0211-pernr.
it_errors-etext = x_return-message.
APPEND it_errors.
CLEAR it_errors.
n_emp_error = n_emp_error + 1.
ENDIF.
* release lock
PERFORM dequeue_pernr USING wa_t5udb-pernr.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.

"f_build_it0211

*---------------------------------------------------------------------*
*
FORM enqueue_pernr
*
*---------------------------------------------------------------------*
* Lock the employee record for update
*
*---------------------------------------------------------------------*
* --> p_subrc
- return code
*
*---------------------------------------------------------------------*
FORM enqueue_pernr USING p_pernr p_subrc.
CALL FUNCTION 'HR_BEN_ENQUEUE_PERSONAL_NUMBER'
EXPORTING
pernr
= p_pernr
reaction
= c_no
IMPORTING
subrc
= p_subrc
TABLES
error_table = it_benerr.
IF p_subrc <> 0.
** errors encountered, write to error log **
PERFORM collect_errors.
ENDIF.
ENDFORM.

"enqueue_pernr

*---------------------------------------------------------------------*
*
FORM dequeue_pernr
*
*---------------------------------------------------------------------*
* Unlock the employee record
*
*---------------------------------------------------------------------*
FORM dequeue_pernr USING p_pernr.
DATA: v_subrc

LIKE sy-subrc.

CALL FUNCTION 'HR_BEN_DEQUEUE_PERSONAL_NUMBER'


EXPORTING
pernr
= p_pernr
reaction
= c_no
IMPORTING
subrc
= v_subrc
TABLES
error_table = it_benerr.
IF v_subrc <> 0.
** errors encountered, write to error log **
PERFORM collect_errors.
ENDIF.
ENDFORM.

"dequeue_pernr

*&---------------------------------------------------------------------*
*&
Form F_DELETE_T5UDB
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_delete_t5udb.
DELETE FROM t5udb WHERE pernr NE '00000000'.
ENDFORM.

" F_DELETE_T5UDB

*---------------------------------------------------------------------*
*
FORM collect_errors
*
*---------------------------------------------------------------------*
* Wite error messages from functions to error log
*
*---------------------------------------------------------------------*
FORM collect_errors.
LOOP AT it_benerr.
it_errors-pernr = it_benerr-pernr.
it_errors-etext = it_benerr-etext.
APPEND it_errors.
CLEAR it_errors.
n_emp_error = n_emp_error + 1.
ENDLOOP.
ENDFORM.
"collect_errors
*&---------------------------------------------------------------------*
*&
Form F_COLLECT_ERRORS
*&---------------------------------------------------------------------*
* Wite error messages from functions to error log
*
*----------------------------------------------------------------------*

* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_collect_errors.
LOOP AT it_benerr.
MOVE it_benerr-pernr TO it_errors-pernr.
MOVE it_benerr-etext TO it_errors-etext.
APPEND it_errors.
CLEAR it_errors.
ENDLOOP.
REFRESH it_benerr.
ENDFORM.

" F_COLLECT_ERRORS

*&---------------------------------------------------------------------*
*&
Form F_PROCESS_HEADER
*&---------------------------------------------------------------------*
*
Create Header record for File
*----------------------------------------------------------------------*
FORM f_process_header .
* Get Header value wa_header-recrd_typ = c_rec_h.
wa_header-emplyr_id = c_emplyr.
wa_header-file_no = v_file_seq.
wa_header-file_cr_date = sy-datum.
wa_header-edi_vers = c_edi_vers.
wa_header-spec_vers = c_spec_vers.
wa_header-sys_label = c_sys_lbl.
wa_header-terminator = c_term.
wa_header-cr_lf = c_cr.
APPEND wa_header TO it_header.
ENDFORM.
" F_PROCESS_HEADER
*&---------------------------------------------------------------------*
*&
Form F_DETERMINE_BEN
*&---------------------------------------------------------------------*
*
Determine Beneficiary *----------------------------------------------------------------------*
FORM f_determine_ben USING x_pernr TYPE pernr_d.
DATA: lv_evtyp TYPE cob_evtyp.
DATA: lv_ben TYPE cob_subty.
* Get only Current Employee's record
it_t5udb_pernr[] = it_t5udb[].
DELETE it_t5udb_pernr WHERE pernr NE x_pernr.
SORT it_t5udb_pernr BY evtyp.
* For each Event type for each employee we need to build record fo TYPE B,D,C an
d P
* Get how many set of records requied based on event type
LOOP AT it_t5udb_pernr INTO wa_t5udb_pernr.
IF wa_t5udb_pernr-evtyp NE lv_evtyp.
lv_evtyp = wa_t5udb_pernr-evtyp.
wa_set-pernr = wa_t5udb_pernr-pernr.
wa_set-evtyp = wa_t5udb_pernr-evtyp.
*
wa_set-ben_dubst = wa_t5udb_pernr-dubst.
*
wa_set-dobjp = wa_t5udb_pernr-dobjp.
wa_set-evtdate = wa_t5udb_pernr-evdat.
APPEND wa_set TO it_set.

ELSE.
CONTINUE.
ENDIF.
ENDLOOP.
* Determine who is beneficiary - must be one
LOOP AT it_set INTO wa_set.
CASE wa_set-evtyp.
WHEN '01' OR '02' OR '08'.
* Main Beneficiary is employee only
wa_set-ben_dubst = '0'.
MODIFY it_set FROM wa_set.
WHEN '03' OR '05' OR '07' OR '04'.
* Determine Main Beneficary from dependent evaluation PERFORM f_ben_evaluation USING x_pernr
wa_set-evtdate
wa_set-evtyp
CHANGING lv_ben.
wa_set-ben_dubst = lv_ben.
MODIFY it_set FROM wa_set.
ENDCASE.
ENDLOOP.
ENDFORM.
" F_DETERMINE_BEN
*&---------------------------------------------------------------------*
*&
Form F_BEN_EVALUATION
*&---------------------------------------------------------------------*
*
Evaluate dependent
*----------------------------------------------------------------------*
FORM f_ben_evaluation USING
p_pernr TYPE pernr_d
p_date TYPE cob_evdat
p_evtyp TYPE cob_evtyp
CHANGING p_ben TYPE cob_subty.
DATA: lv_subrc TYPE sy-subrc.
CLEAR: p0021.
REFRESH: p0021.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= p_pernr
infty
= '0021'
begda
= p_date
endda
= p_date
IMPORTING
subrc
= lv_subrc
TABLES
infty_tab
= p0021
EXCEPTIONS
infty_not_found = 1.
IF lv_subrc EQ 0.
IF p_evtyp NE '05'.
* check for spouse first
READ TABLE p0021 WITH KEY famsa = '1'.
IF sy-subrc EQ 0.
p_ben = p0021-famsa.
ELSE.
* Check for domestic Partner -

READ TABLE p0021 WITH KEY famsa = '13'.


IF sy-subrc EQ 0.
p_ben = p0021-famsa.
ENDIF.
ENDIF.
IF p_ben IS INITIAL.
* Try to get eldest Chiildren.
READ TABLE p0021 WITH KEY famsa = '2'.
IF sy-subrc EQ 0.
DELETE p0021 WHERE famsa NE '2'. "Delete all dep other than Children
SORT p0021 BY fgbdt.
READ TABLE p0021 INDEX 1. " Get eldest Children
IF sy-subrc EQ 0.
p_ben = p0021-famsa.
ENDIF.
ELSE.
READ TABLE p0021 WITH KEY famsa = '6'. " Step child
IF sy-subrc EQ 0.
DELETE p0021 WHERE famsa NE '6'. "Delete all dep other than Children
SORT p0021 BY objps.
READ TABLE p0021 INDEX 1. " Get eldest
IF sy-subrc EQ 0.
p_ben = p0021-famsa.
ENDIF.
ELSE.
READ TABLE p0021 WITH KEY famsa = '14'. " child of Domestic Partner
IF sy-subrc EQ 0.
DELETE p0021 WHERE famsa NE '14'. "Delete all dep other than Child
ren
SORT p0021 BY objps.
READ TABLE p0021 INDEX 1. " Get eldest
IF sy-subrc EQ 0.
p_ben = p0021-famsa.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSE. " event of divorce READ TABLE p0021 WITH KEY famsa = '10'.
IF sy-subrc EQ 0.
p_ben = p0021-famsa.
ENDIF.
ENDIF.
IF p_ben IS INITIAL.
w_subrc = 'E'.
it_errors-pernr = p_pernr.
it_errors-etext = text-e39.
APPEND it_errors.
ADD 1 TO n_e_cnt.
CLEAR p_ben. " No Beneficiary found, Skip employee
ENDIF.
ELSE.
w_subrc = 'E'.
it_errors-pernr = p_pernr.
it_errors-etext = text-e36.
APPEND it_errors.
ADD 1 TO n_e_cnt.
ENDIF.
ENDFORM.
" F_BEN_EVALUATION

*&---------------------------------------------------------------------*
*&
Form F_GET_IQB_SSN
*&---------------------------------------------------------------------*
*
Get Primary SSN - For Beneficiary *----------------------------------------------------------------------*
FORM f_get_iqb_ssn USING p_pernr TYPE pernr_d.
DATA: lv_icnum TYPE psg_idnum.
DATA: lv_icnum_cop TYPE psg_idnum.
DATA: lv_subrc TYPE sy-subrc.
LOOP AT it_set INTO wa_set WHERE pernr = p_pernr.
* Get employee's SSN
* Try to get employee's US SSN if possible
CALL FUNCTION 'Z_EMPLOYEE_SSN_NEW'
EXPORTING
pernr
= wa_set-pernr
idcot
= 'US'
molga
= '10'
IMPORTING
icnum
= lv_icnum
EXCEPTIONS
not_found_0709 = 1
not_found_0185 = 2
not_found_ssn = 3
not_found_0002 = 4
OTHERS
= 5.
IF sy-subrc EQ 0.
FIND '-' IN lv_icnum.
IF sy-subrc <> 0.
PERFORM f_create_ssn CHANGING lv_icnum.
v_emp_ssn = lv_icnum.
lv_icnum_cop = lv_icnum.
ELSE.
v_emp_ssn = lv_icnum.
lv_icnum_cop = lv_icnum.
ENDIF.
ELSE. " Look for Canada SSN as we have common citizenship
CALL FUNCTION 'Z_EMPLOYEE_SSN_NEW'
EXPORTING
pernr
= wa_set-pernr
idcot
= 'CA'
molga
= '07'
IMPORTING
icnum
= lv_icnum
EXCEPTIONS
not_found_0709 = 1
not_found_0185 = 2
not_found_ssn = 3
not_found_0002 = 4
OTHERS
= 5.
IF sy-subrc EQ 0.
FIND '-' IN lv_icnum.
IF sy-subrc <> 0.
PERFORM f_create_ssn CHANGING lv_icnum.
v_emp_ssn = lv_icnum.
lv_icnum_cop = lv_icnum.
ELSE.
v_emp_ssn = lv_icnum.

lv_icnum_cop = lv_icnum.
ENDIF.
ELSE.
w_subrc = 'E'.
it_errors-pernr = wa_set-pernr.
it_errors-etext = text-e19.
APPEND it_errors.
ADD 1 TO n_e_cnt.
ENDIF.
ENDIF.
* Get IQB CASE wa_set-ben_dubst.
WHEN '0'. " when Beneficiary is Emp
wa_set-iqb_ssn = v_emp_ssn.
MODIFY it_set FROM wa_set.
WHEN '1' OR '13'. " Beneficiary is Spouse
CLEAR: p0106.
REFRESH p0106.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= wa_set-pernr
infty
= '0106'
IMPORTING
subrc
= lv_subrc
TABLES
infty_tab
= p0106
EXCEPTIONS
infty_not_found = 1
OTHERS
= 2.
IF lv_subrc EQ 0.
LOOP AT p0106 WHERE subty = wa_set-ben_dubst
AND begda <= wa_set-evtdate AND
endda >= wa_set-evtdate.
EXIT.
ENDLOOP.
IF sy-subrc EQ 0.
IF p0106-perid IS NOT INITIAL.
wa_set-iqb_ssn = p0106-perid.
MODIFY it_set FROM wa_set.
ELSE.
REPLACE ALL OCCURRENCES OF '-' IN lv_icnum_cop WITH ''.
CONDENSE lv_icnum_cop.
CONCATENATE 'D0' lv_icnum_cop INTO wa_set-iqb_ssn.
MODIFY it_set FROM wa_set.
ENDIF.
ELSE.
w_subrc = 'E'.
it_errors-pernr = wa_set-pernr.
it_errors-etext = text-e02.
APPEND it_errors.
ADD 1 TO n_e_cnt.
ENDIF.
ENDIF.
WHEN '2' OR '6' OR '14'.
CLEAR: p0106.
REFRESH p0106.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING

pernr
=
infty
=
IMPORTING
subrc
=
TABLES
infty_tab
=
EXCEPTIONS
infty_not_found =
OTHERS
=
IF lv_subrc EQ 0.
LOOP AT p0106 WHERE
AND
AND

wa_set-pernr
'0106'
lv_subrc
p0106
1
2.
subty
objps
begda
endda

= wa_set-ben_dubst
= '01'
<= wa_set-evtdate AND
>= wa_set-evtdate.

EXIT.
ENDLOOP.
IF sy-subrc EQ 0.
IF p0106-perid IS NOT INITIAL.
wa_set-iqb_ssn = p0106-perid.
MODIFY it_set FROM wa_set.
ELSE.
REPLACE ALL OCCURRENCES OF '-' IN lv_icnum_cop WITH ''.
CONDENSE lv_icnum_cop.
CONCATENATE 'D1' lv_icnum_cop INTO wa_set-iqb_ssn.
MODIFY it_set FROM wa_set.
ENDIF.
ELSE.
w_subrc = 'E'.
it_errors-pernr = wa_set-pernr.
it_errors-etext = text-e02.
APPEND it_errors.
ADD 1 TO n_e_cnt.
ENDIF.
ENDIF.
ENDCASE.
IF wa_set-iqb_ssn IS INITIAL.
w_subrc = 'E'.
it_errors-pernr = wa_set-pernr.
it_errors-etext = text-e40.
ENDIF.
ENDLOOP.
ENDFORM.
" F_GET_IQB_SSN
*&---------------------------------------------------------------------*
*&
Form F_CREATE_BEN_REC
*&---------------------------------------------------------------------*
*
Create Beneficiaries' Record
*----------------------------------------------------------------------*
FORM f_create_ben_rec USING pa_set TYPE ty_set.
DATA: lv_subrc TYPE sy-subrc,
lv_country TYPE t005-intca3.
wa_ben-recrd_typ = c_rec_b.
wa_ben-ssn_iqb = pa_set-iqb_ssn.
wa_ben-servc_code = c_servc_code.
wa_ben-emplyr_id = c_emplyr_id.
wa_ben-ben_typ = c_bene_type.
wa_ben-cobra_qe_date = pa_set-evtdate.
CASE pa_set-evtyp.

WHEN '01'.
wa_ben-event_qe_reason = '001'.
WHEN '02'.
wa_ben-event_qe_reason = '008'.
WHEN '03'.
wa_ben-event_qe_reason = '002'.
WHEN '04'.
wa_ben-event_qe_reason = '011'.
WHEN '05'.
wa_ben-event_qe_reason = '003'.
WHEN '07'.
wa_ben-event_qe_reason = '009'.
WHEN '08'.
wa_ben-event_qe_reason = '007'.
ENDCASE.
wa_ben-end_rec = c_term.
wa_ben-cr_lf = c_cr.
* Employee SSN
wa_ben-ssn_emp = v_emp_ssn.
* SSN IQB - Primary Dependent SSN
wa_ben-ssn_qb = pa_set-iqb_ssn.
* Get Personal and Address Details IF pa_set-ben_dubst = '0'. " Employee
CLEAR: p0002, v_subrc.
REFRESH: p0002.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= pa_set-pernr
infty
= '0002'
begda
= pa_set-evtdate
endda
= pa_set-evtdate
IMPORTING
subrc
= v_subrc
TABLES
infty_tab
= p0002
EXCEPTIONS
infty_not_found = 1.
IF lv_subrc EQ 0.
wa_ben-frst_name = p0002-vorna.
wa_ben-lst_name = p0002-nachn.
ELSE.
w_subrc = 'E'.
it_errors-pernr = pa_set-pernr.
it_errors-etext = text-e01.
APPEND it_errors.
ADD 1 TO n_e_cnt.
EXIT.
ENDIF.
* Get address of employee
CLEAR: p0006, v_subrc.
REFRESH: p0006.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= pa_set-pernr
infty
= '0006'
*
subty
= '1'
begda
= pa_set-evtdate
endda
= pa_set-evtdate
IMPORTING

subrc
= lv_subrc
TABLES
infty_tab
= p0006
EXCEPTIONS
infty_not_found = 1.
IF lv_subrc EQ 0.
READ TABLE p0006 WITH KEY subty = '1'.
IF sy-subrc EQ 0.
wa_ben-addr1 = p0006-stras.
PERFORM f_replace_add USING wa_ben-addr1.
wa_ben-addr2 = p0006-locat.
PERFORM f_replace_add USING wa_ben-addr2.
wa_ben-city = p0006-ort01.
wa_ben-state = p0006-state.
wa_ben-zip = p0006-pstlz.
PERFORM f_replace_add USING wa_ben-zip.
SELECT SINGLE intca3 FROM t005 INTO lv_country WHERE land1 = p0006-land1
.
IF sy-subrc EQ 0.
wa_ben-country = lv_country.
ENDIF.
wa_ben-dob = p0002-gbdat.
IF p0002-gesch EQ '1'.
wa_ben-gender = 'M'.
ELSEIF p0002-gesch EQ '2'.
wa_ben-gender = 'F'.
ELSE.
wa_ben-gender = 'U'.
ENDIF.
IF p0002-famst EQ '0'.
wa_ben-mrtl_stat = 'S'.
ELSEIF p0002-famst EQ '1'.
wa_ben-mrtl_stat = 'M'.
ELSE.
wa_ben-mrtl_stat = 'U'.
ENDIF.
wa_ben-rel_to_emp = 'E'.
ELSE.
w_subrc = 'E'.
it_errors-pernr = pa_set-pernr.
it_errors-etext = text-e03.
APPEND it_errors.
ADD 1 TO n_e_cnt.
EXIT.
ENDIF.
ELSE.
w_subrc = 'E'.
it_errors-pernr = pa_set-pernr.
it_errors-etext = text-e03.
APPEND it_errors.
ADD 1 TO n_e_cnt.
EXIT.
ENDIF.
ELSE. " Dependent turns beneficiary
CLEAR: p0021.
REFRESH: p0021.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= pa_set-pernr

infty
= '0021'
begda
= pa_set-evtdate
endda
= pa_set-evtdate
IMPORTING
subrc
= lv_subrc
TABLES
infty_tab
= p0021
EXCEPTIONS
infty_not_found = 1.
IF lv_subrc EQ 0.
READ TABLE p0021 WITH KEY famsa = pa_set-ben_dubst.
IF sy-subrc EQ 0.
wa_ben-frst_name = p0021-favor.
wa_ben-lst_name = p0021-fanam.
wa_ben-dob = p0021-fgbdt.
IF p0021-fasex EQ '1'.
wa_ben-gender = 'M'.
ELSEIF p0021-fasex EQ '2'.
wa_ben-gender = 'F'.
ENDIF.
IF p0021-famsa = '1'.
wa_ben-rel_to_emp = 'S'.
ELSEIF p0021-famsa = '13'.
wa_ben-rel_to_emp = 'P'.
ELSEIF p0021-famsa = '2'.
wa_ben-rel_to_emp = 'C'.
ELSEIF p0021-famsa = '14' OR p0021-famsa = '06'.
wa_ben-rel_to_emp = 'O'.
ENDIF.
ENDIF.
* Address CLEAR: p0106.
REFRESH p0106.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= wa_set-pernr
infty
= '0106'
begda
= pa_set-evtdate
endda
= pa_set-evtdate
IMPORTING
subrc
= lv_subrc
TABLES
infty_tab
= p0106
EXCEPTIONS
infty_not_found = 1
OTHERS
= 2.
IF sy-subrc EQ 0.
READ TABLE p0106 WITH KEY subty = pa_set-ben_dubst.
IF sy-subrc EQ 0.
wa_ben-addr1 = p0106-stras.
PERFORM f_replace_add USING wa_ben-addr1.
wa_ben-addr2 = p0106-locat.
PERFORM f_replace_add USING wa_ben-addr2.
wa_ben-city = p0106-ort01.
wa_ben-state = p0106-state.
wa_ben-zip = p0106-pstlz.
PERFORM f_replace_add USING wa_ben-zip.
SELECT SINGLE intca3 FROM t005 INTO lv_country WHERE land1 = p0106-lan
d1.
IF sy-subrc EQ 0.

wa_ben-country = lv_country.
ENDIF.
IF p0106-famst EQ 0.
wa_ben-mrtl_stat = 'S'.
ELSEIF p0106-famst EQ 1.
wa_ben-mrtl_stat = 'M'.
ELSE.
wa_ben-mrtl_stat = 'U'.
ENDIF.
ENDIF.
ELSE.
w_subrc = 'E'.
it_errors-pernr = pa_set-pernr.
it_errors-etext = text-e02.
APPEND it_errors.
ADD 1 TO n_e_cnt.
EXIT.
ENDIF.
ELSE.
w_subrc = 'E'.
it_errors-pernr = pa_set-pernr.
it_errors-etext = text-e02.
APPEND it_errors.
ADD 1 TO n_e_cnt.
EXIT.
ENDIF.
ENDIF.
wa_ben-status = 'N'.
* Append Record
APPEND wa_ben TO it_ben.
CLEAR wa_ben.
ENDFORM.
" F_CREATE_BEN_REC
*&---------------------------------------------------------------------*
*&
Form F_CREATE_COV
*&---------------------------------------------------------------------*
*
Create Coverage Records
*----------------------------------------------------------------------*
FORM f_create_cov USING pa_set TYPE ty_set.
DATA: lv_evdat TYPE begda,
lv_subrc TYPE sy-subrc.
DATA: pln_seq(2) TYPE n.
* Skip processing if already have error IF w_subrc IS NOT INITIAL.
EXIT.
ENDIF.
* Get Family details anyway CLEAR: p0021.
REFRESH: p0021.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= pa_set-pernr
infty
= '0021'
begda
= pa_set-evtdate
endda
= pa_set-evtdate
IMPORTING
subrc
= lv_subrc
TABLES
infty_tab
= p0021
EXCEPTIONS

infty_not_found = 1.
CLEAR: p0106.
REFRESH: p0106.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= pa_set-pernr
infty
= '0106'
begda
= pa_set-evtdate
endda
= pa_set-evtdate
IMPORTING
subrc
= lv_subrc
TABLES
infty_tab
= p0106
EXCEPTIONS
infty_not_found = 1.
* Coverage Records will have 1-1 map with It167 IF w_subrc IS NOT INITIAL.
EXIT.
ENDIF.
CLEAR: p0167.
REFRESH: p0167.
IF pa_set-ben_dubst EQ '10' AND
pa_set-evtyp EQ '05'.
lv_evdat = pa_set-evtdate - 1.
ELSE.
lv_evdat = pa_set-evtdate.
ENDIF.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr
= pa_set-pernr
infty
= '0167'
begda
= lv_evdat
endda
= lv_evdat
IMPORTING
subrc
= lv_subrc
TABLES
infty_tab
= p0167
EXCEPTIONS
infty_not_found = 1.
IF lv_subrc EQ 0.
SORT p0167 BY endda DESCENDING.
* Loop All Active Plans LOOP AT p0167.
wa_cov-recrd_typ = c_rec_c.
wa_cov-ssn_iqb = pa_set-iqb_ssn.
wa_cov-ssn_emp = v_emp_ssn.
CASE p0167-bplan.
WHEN 'AEDN'.
wa_cov-pln_id = '317024'.
WHEN 'EXDN'.
wa_cov-pln_id = '317282'.
WHEN 'EXDN'.
wa_cov-pln_id = '317282'.
WHEN 'EXMD'.
wa_cov-pln_id = '317283'.
WHEN 'EXSP'.
wa_cov-pln_id = '317285'.

WHEN 'AEHF'.
wa_cov-pln_id =
WHEN 'OOA1'.
wa_cov-pln_id =
WHEN 'PPO9'.
wa_cov-pln_id =
WHEN 'GHCE'.
wa_cov-pln_id =
WHEN 'KANC'.
wa_cov-pln_id =
WHEN 'OPCH'.
wa_cov-pln_id =
WHEN 'VISN'.
wa_cov-pln_id =
ENDCASE.
pln_seq = sy-tabix.
wa_cov-pln_seq_no =

'317298'.
'317300'.
'317303'.
'317307'.
'317311'.
'317313'.
'317322'.
pln_seq.

IF p0167-depcv EQ 'EE'.
wa_cov-cov_class_id = '001'.
ELSEIF p0167-depcv EQ 'EE+2'.
wa_cov-cov_class_id = '004'.
ELSEIF p0167-depcv EQ 'EE+1'.
LOOP AT p0021 WHERE famsa = '1' OR
famsa = '13'.
EXIT.
ENDLOOP.
IF sy-subrc EQ 0.
wa_cov-cov_class_id = '002'.
ELSE.
LOOP AT p0021 WHERE famsa = '2' OR
famsa = '6' OR
famsa = '14'.
EXIT.
ENDLOOP.
IF sy-subrc EQ 0.
wa_cov-cov_class_id = '003'.
ENDIF.
ENDIF.
ENDIF.
wa_cov-end_rec = c_term.
wa_cov-cr_lf = c_cr.
APPEND wa_cov TO it_cov.
PERFORM f_create_participants USING pa_set
p0167
sy-tabix.
IF w_subrc IS NOT INITIAL.
DELETE it_cov FROM wa_cov.
ENDIF.
ENDLOOP.
ENDIF.
IF sy-subrc <> 0.
w_subrc = 'E'.
it_errors-pernr = pa_set-pernr.
it_errors-etext = text-e05.
APPEND it_errors.
ADD 1 TO n_e_cnt.
EXIT.
ENDIF.
ENDFORM.
" F_CREATE_COV

*&---------------------------------------------------------------------*
*&
Form F_CREATE_PARTICIPANTS
*&---------------------------------------------------------------------*
*
build Participants for each Coverage Plan
*----------------------------------------------------------------------*
FORM f_create_participants USING pa_set TYPE ty_set
x0167 TYPE p0167
plan_seq TYPE sy-tabix.
DATA: lv_pln_seq(2) TYPE n.
DATA: lv_dep_seq(2) TYPE n.
* Skip processing if already have error
IF w_subrc IS NOT INITIAL.
EXIT.
ENDIF.
wa_part-recrd_typ = c_rec_p.
wa_part-ssn_iqb = pa_set-iqb_ssn.
wa_part-ssn_emp = v_emp_ssn.
lv_pln_seq = plan_seq.
wa_part-pln_seq_no = lv_pln_seq.
wa_part-end_rec = c_term.
wa_part-cr_lf = c_cr.
CASE x0167-bplan.
WHEN 'AEDN'.
wa_part-pln_id = '317024'.
WHEN 'EXDN'.
wa_part-pln_id = '317282'.
WHEN 'EXDN'.
wa_part-pln_id = '317282'.
WHEN 'EXMD'.
wa_part-pln_id = '317283'.
WHEN 'EXSP'.
wa_part-pln_id = '317285'.
WHEN 'AEHF'.
wa_part-pln_id = '317298'.
WHEN 'OOA1'.
wa_part-pln_id = '317300'.
WHEN 'PPO9'.
wa_part-pln_id = '317303'.
WHEN 'GHCE'.
wa_part-pln_id = '317307'.
WHEN 'KANC'.
wa_part-pln_id = '317311'.
WHEN 'OPCH'.
wa_part-pln_id = '317313'.
WHEN 'VISN'.
wa_part-pln_id = '317322'.
ENDCASE.
* Determine how many participant record required for this plan Id
IF x0167-depcv = 'EE'. " For beneficiary only
IF pa_set-ben_dubst = '0'. " ensuring employee is beneficiary
wa_part-ssn_dep = v_emp_ssn.
APPEND wa_part TO it_part.
ELSE.
" When employee is no longer beneficiary
wa_part-ssn_dep = pa_set-iqb_ssn.
APPEND wa_part TO it_part.
ENDIF.
ELSEIF x0167-depcv = 'EE+1'.
* First Include beneficary as participant

IF pa_set-ben_dubst = '0'. " ensuring employee is beneficiary


wa_part-ssn_dep = v_emp_ssn.
APPEND wa_part TO it_part.
Determine primary dependent and include him/her as participant LOOP AT p0021 WHERE famsa = '1'
OR famsa = '13'.
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
wa_part-dep_seq_no = '01'.
APPEND wa_part TO it_part.
ENDIF.
EXIT.
ENDLOOP.
ELSEIF pa_set-ben_dubst = '1'. " when Spouse is beneficiary
wa_part-ssn_dep = pa_set-iqb_ssn.
APPEND wa_part TO it_part.
Determine primary dependent and include him/her as participant SORT p0021 BY fgbdt.
LOOP AT p0021 WHERE famsa = '2'.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
wa_part-dep_seq_no = p0021-objps.
APPEND wa_part TO it_part.
ENDIF.
EXIT.
ENDLOOP.
ELSEIF pa_set-ben_dubst = '13'. " When Dom. partner is beneficiary
wa_part-ssn_dep = pa_set-iqb_ssn.
APPEND wa_part TO it_part.
Determine primary dependent and include him/her as participant SORT p0021 BY fgbdt.
LOOP AT p0021 WHERE famsa = '14'.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
wa_part-dep_seq_no = p0021-objps.
APPEND wa_part TO it_part.
ENDIF.
EXIT.
ENDLOOP.
ELSEIF pa_set-ben_dubst = '2'. " When eldest child is beneficiary
wa_part-ssn_dep = pa_set-iqb_ssn.
APPEND wa_part TO it_part.
Determine primary dependent and include him/her as participant SORT p0021 BY fgbdt.
LOOP AT p0021 WHERE famsa = '2'.
IF sy-tabix EQ 1.
CONTINUE.
ENDIF.
LOOP AT p0106 WHERE subty = p0021-famsa

AND objps = p0021-objps.


EXIT.
ENDLOOP.
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
wa_part-dep_seq_no = p0021-objps.
APPEND wa_part TO it_part.
ENDIF.
EXIT.
ENDLOOP.
ENDIF.
ELSEIF x0167-depcv = 'EE+2'.
first include beneficary as participant
IF pa_set-ben_dubst = '0'. " ensuring employee is beneficiary
wa_part-ssn_dep = v_emp_ssn.
APPEND wa_part TO it_part.
Determine dependent and include them as participant LOOP AT p0021.
lv_dep_seq = sy-tabix.
wa_part-dep_seq_no = lv_dep_seq.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
APPEND wa_part TO it_part.
ENDIF.
ENDLOOP.
ELSEIF pa_set-ben_dubst = '1'. " when Spouse is beneficiary
wa_part-ssn_dep = pa_set-iqb_ssn.
APPEND wa_part TO it_part.
Determine dependent and include them as participant LOOP AT p0021 WHERE famsa = '2'.
lv_dep_seq = p0021-objps.
wa_part-dep_seq_no = lv_dep_seq.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
APPEND wa_part TO it_part.
ENDIF.
ENDLOOP.
ELSEIF pa_set-ben_dubst = '13'. " When Dom. partner is beneficiary
wa_part-ssn_dep = pa_set-iqb_ssn.
APPEND wa_part TO it_part.
Determine dependent and include them as participant LOOP AT p0021 WHERE famsa = '14'.
lv_dep_seq = p0021-objps.
wa_part-dep_seq_no = lv_dep_seq.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
READ TABLE p0106 WITH KEY subty = p0021-famsa.

IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
APPEND wa_part TO it_part.
ENDIF.
ENDLOOP.
ELSEIF pa_set-ben_dubst = '2'. " When eldest child is beneficiary
wa_part-ssn_dep = pa_set-iqb_ssn.
APPEND wa_part TO it_part.
* Determine primary dependent and include them as participant SORT p0021 BY fgbdt.
LOOP AT p0021 WHERE famsa = '2'.
IF sy-tabix EQ 1.
CONTINUE.
ENDIF.
lv_dep_seq = p0021-objps.
wa_part-dep_seq_no = lv_dep_seq.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
*
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_part-ssn_dep = p0106-perid.
APPEND wa_part TO it_part.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM.
" F_CREATE_PARTICIPANTS
*&---------------------------------------------------------------------*
*&
Form F_CREATE_DEP
*&---------------------------------------------------------------------*
*
Create dependent records
*----------------------------------------------------------------------*
FORM f_create_dep USING
p_set TYPE ty_set..
DATA: lv_dep_seq(2) TYPE n.
IF w_subrc IS NOT INITIAL.
EXIT.
ENDIF.
IF p_set-ben_dubst = '0'. " employee as Beneficiary
LOOP AT p0021.
wa_dep-recrd_typ = c_rec_d.
wa_dep-ssn_iqb = p_set-iqb_ssn.
wa_dep-ssn_emp = v_emp_ssn.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
*
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_dep-ssn_dep = p0106-perid.
ENDIF.
wa_dep-frst_name = p0021-favor.
wa_dep-lst_name = p0021-fanam.
wa_dep-dob = p0021-fgbdt.
lv_dep_seq = sy-tabix.
wa_dep-dep_seq = lv_dep_seq.

CASE p0021-famsa.
WHEN '1'.
wa_dep-rel_to_emp = 'S'.
WHEN '2'.
wa_dep-rel_to_emp = 'C'.
WHEN '13'.
wa_dep-rel_to_emp = 'P'.
WHEN OTHERS.
wa_dep-rel_to_emp = 'O'.
ENDCASE.
wa_dep-end_rec = c_term.
wa_dep-cr_lf = c_cr.
APPEND wa_dep TO it_dep.
ENDLOOP.
ELSEIF p_set-ben_dubst = '1'.
LOOP AT p0021 WHERE famsa = '2'.
wa_dep-recrd_typ = c_rec_d.
wa_dep-ssn_iqb = p_set-iqb_ssn.
wa_dep-ssn_emp = v_emp_ssn.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
*
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_dep-ssn_dep = p0106-perid.
ENDIF.
wa_dep-frst_name = p0021-favor.
wa_dep-lst_name = p0021-fanam.
wa_dep-dob = p0021-fgbdt.
lv_dep_seq = p0021-objps.
wa_dep-dep_seq = lv_dep_seq.
CASE p0021-famsa.
WHEN '1'.
wa_dep-rel_to_emp = 'S'.
WHEN '2'.
wa_dep-rel_to_emp = 'C'.
WHEN '13'.
wa_dep-rel_to_emp = 'P'.
WHEN OTHERS.
wa_dep-rel_to_emp = 'O'.
ENDCASE.
wa_dep-end_rec = c_term.
wa_dep-cr_lf = c_cr.
APPEND wa_dep TO it_dep.
ENDLOOP.
ELSEIF p_set-ben_dubst = '13'.
LOOP AT p0021 WHERE famsa = '14'.
wa_dep-recrd_typ = c_rec_d.
wa_dep-ssn_iqb = p_set-iqb_ssn.
wa_dep-ssn_emp = v_emp_ssn.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
*
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_dep-ssn_dep = p0106-perid.
ENDIF.
wa_dep-frst_name = p0021-favor.

wa_dep-lst_name = p0021-fanam.
wa_dep-dob = p0021-fgbdt.
lv_dep_seq = p0021-objps.
wa_dep-dep_seq = lv_dep_seq.
CASE p0021-famsa.
WHEN '2'.
wa_dep-rel_to_emp = 'C'.
WHEN '13'.
wa_dep-rel_to_emp = 'P'.
WHEN OTHERS.
wa_dep-rel_to_emp = 'O'.
ENDCASE.
wa_dep-end_rec = c_term.
wa_dep-cr_lf = c_cr.
APPEND wa_dep TO it_dep.
ENDLOOP.
ELSEIF p_set-ben_dubst = '2'.
SORT p0021 BY fgbdt.
LOOP AT p0021 WHERE famsa = '2' OR famsa EQ'6'.
IF sy-tabix EQ 1.
CONTINUE.
ENDIF.
wa_dep-recrd_typ = c_rec_d.
wa_dep-ssn_iqb = p_set-iqb_ssn.
wa_dep-ssn_emp = v_emp_ssn.
LOOP AT p0106 WHERE subty = p0021-famsa
AND objps = p0021-objps.
EXIT.
ENDLOOP.
*
READ TABLE p0106 WITH KEY subty = p0021-famsa.
IF sy-subrc EQ 0.
wa_dep-ssn_dep = p0106-perid.
ENDIF.
wa_dep-frst_name = p0021-favor.
wa_dep-lst_name = p0021-fanam.
wa_dep-dob = p0021-fgbdt.
lv_dep_seq = p0021-objps.
wa_dep-dep_seq = lv_dep_seq.
CASE p0021-famsa.
WHEN '2'.
wa_dep-rel_to_emp = 'C'.
WHEN OTHERS.
wa_dep-rel_to_emp = 'O'.
ENDCASE.
wa_dep-end_rec = c_term.
wa_dep-cr_lf = c_cr.
APPEND wa_dep TO it_dep.
ENDLOOP.
ENDIF.
ENDFORM.
" F_CREATE_DEP
*&---------------------------------------------------------------------*
*&
Form F_REPLACE_ADD
*&---------------------------------------------------------------------*
*
Replace a comma with a space.
*----------------------------------------------------------------------*
*
-->PARAM_STRING text
*----------------------------------------------------------------------*
FORM f_replace_add USING
param_string.
DATA: wl_string(90)

TYPE c.

DATA: wl_pos
DATA: wl_len

TYPE i.
TYPE i.

wl_string = param_string.
wl_pos = 0.
wl_len = strlen( wl_string ).
DO.
IF wl_pos GT wl_len.
EXIT.
ENDIF.
IF wl_string+wl_pos(1) = ',' OR
wl_string+wl_pos(1) = '.' OR
wl_string+wl_pos(1) = '-' OR
wl_string+wl_pos(1) = '/' OR
wl_string+wl_pos(1) = '#'.
wl_string+wl_pos(1) = ' '.
ENDIF.
wl_pos = wl_pos + 1.
ENDDO.
param_string = wl_string.
ENDFORM.
" F_REPLACE_ADD
*&---------------------------------------------------------------------*
*&
Form F_PROCESS_TRAILER
*&---------------------------------------------------------------------*
*
Trailer Record
*----------------------------------------------------------------------*
FORM f_process_trailer .
DATA: count TYPE string.
wa_trailer-recrd_typ = c_rec_t.
wa_trailer-emplyr_id = c_emplyr_id.
DESCRIBE TABLE it_ben LINES n_rec_ben.
DESCRIBE TABLE it_cov LINES n_rec_cov.
DESCRIBE TABLE it_dep LINES n_rec_dep.
DESCRIBE TABLE it_part LINES n_rec_part.
count = n_rec_ben.
WRITE count TO wa_trailer-ben_rec_cnt RIGHT-JUSTIFIED.
count = n_rec_cov.
WRITE count TO wa_trailer-cov_rec_cnt RIGHT-JUSTIFIED.
count = n_rec_dep.
WRITE count TO wa_trailer-dep_rec_cnt RIGHT-JUSTIFIED.
count = n_rec_part.
WRITE count TO wa_trailer-part_rec_cnt RIGHT-JUSTIFIED.
n_rec_sent = n_rec_ben + n_rec_cov + n_rec_dep + n_rec_part.
count = n_rec_sent.
WRITE count TO wa_trailer-row_cnt RIGHT-JUSTIFIED.
wa_trailer-terminator = c_term.
wa_trailer-cr_lf = c_cr.
APPEND wa_trailer TO it_trailer.
CLEAR count.
ENDFORM.
" F_PROCESS_TRAILER
*&---------------------------------------------------------------------*
*&
Form F_CREATE_SSN
*&---------------------------------------------------------------------*
*
text

*----------------------------------------------------------------------*
FORM f_create_ssn CHANGING lv_icnum TYPE psg_idnum.
DATA: lv_first(3),
lv_second(2),
lv_third(4).
lv_first = lv_icnum+0(3).
lv_second = lv_icnum+3(2).
lv_third = lv_icnum+5(4).
CLEAR lv_icnum.
CONCATENATE lv_first '-' lv_second '-' lv_third INTO lv_icnum.
ENDFORM.

" F_CREATE_SSN

You might also like