*&---------------------------------------------------------------------* *& Report Z_CATS_EMAIL * *& * ************************************************************************ * *** Change History *** * ************************************************************************ * Programmer : Claude Bourque * Date of Change: August 31, 2006 * Change Request: D01K909335 * ACL# : ACL-648 * Description : Utility to email employees if timesheets have been * processed. This should be run daily in background ************************************************************************ * Programmer : Claude Bourque * Date of Change: September 11, 2006 * Change Request: D01K909399 * ACL# : ACL-654 * Description : Exclude entries entered/approved by CSR's and entries * entered/approved by employees themselves. ************************************************************************ REPORT z_cats_email . DATA: objectkey LIKE swr_struct-object_key, lv_cont TYPE swr_cont, lt_cont TYPE STANDARD TABLE OF swr_cont, firstname LIKE ess_emp-firstname, lastname LIKE ess_emp-lastname, i0001 LIKE p0001 OCCURS 0 WITH HEADER LINE, l_moabw LIKE t001p-moabw, return LIKE bapireturn. TYPES: BEGIN OF cats_struc, "Data table structure pernr LIKE catsdb-pernr, tmp_key LIKE catsdb-counter, workdate LIKE catsdb-workdate, awart LIKE catsdb-awart, hours LIKE catsdb-catshours, awart_text LIKE catsdb-zzawart_text, awart_text_f LIKE catsdb-zzawart_text, status LIKE catsdb-status, approver LIKE catsdb-apnam, END OF cats_struc. DATA: icatsdb TYPE TABLE OF catsdb, icatsdb_wa TYPE catsdb, icats_wa TYPE catsxt_comp_itab WITH HEADER LINE, cats_tab TYPE TABLE OF cats_struc, cats_tab_wa TYPE cats_struc. DATA: separator(2) VALUE ' ', " 2 blank spaces for separator hours_as_txt(5) TYPE c, " stores hours as text string1(8) TYPE c, " Year string2(8) TYPE c, " MMDD (month and day) string3(8) TYPE c, " Month string4(8) TYPE c, " Day ************************************************************************ * Since blanks get ignored when concatenating, ALT-255 is used * instead which is a blank character that does NOT get ignored ************************************************************************ blank(18) VALUE '                  '. "alt-255 used as a blank SELECT * FROM catsdb INTO TABLE icatsdb WHERE ( awart = '0215' "Bank OT - used OR awart = '0100' "Vacation OR awart = '0105' "Floating Holiday OR awart = '0110' "Compressed OR awart = '0120' "Pre 2006 Vacation OR awart = '0160' "Personal Unpaid OR awart = '0170' "Personal Paid OR awart = '0800' "Attendance OR awart = '0801' "OT OR awart = '0803' "Standby Allowance OR awart = '0804' "Shift Premium OR awart = '0610' "Family Care Leave OR awart = '0620' "Jury Durty OR awart = '0630' "Bereavement OR awart = '0640' "Birth/Adoption OR awart = '0660' ) "Moving Day AND apdat = sy-datum AND apnam <> 'WF-BATCH' "WF-BATCH approvals comes from Vac Rqst AND apnam <> 'LAVC' "Exclude CSR's AND apnam <> 'ROYP' AND apnam <> 'DELM' AND apnam <> 'BRUH' AND apnam <> 'LLEW' AND apnam <> 'DUFJ' AND apnam <> 'GOUA' OR ( status = 40 "Rejected AND laeda = sy-datum ) . SORT icatsdb BY pernr. LOOP AT icatsdb INTO icatsdb_wa. IF icatsdb_wa-ernam <> icatsdb_wa-apnam. " only if creator <> approver cats_tab_wa-pernr = icatsdb_wa-pernr. cats_tab_wa-tmp_key = icatsdb_wa-counter. cats_tab_wa-workdate = icatsdb_wa-workdate. cats_tab_wa-hours = icatsdb_wa-catshours. cats_tab_wa-awart = icatsdb_wa-awart. IF icatsdb_wa-status = 30. " approved cats_tab_wa-approver = icatsdb_wa-apnam. " use approved by field ELSE. " rejected cats_tab_wa-approver = icatsdb_wa-aenam. " use changed by field ENDIF. cats_tab_wa-status = icatsdb_wa-status. APPEND cats_tab_wa TO cats_tab. ENDIF. " ernam <> apnam ENDLOOP. " icatsdb CLEAR cats_tab_wa. SORT cats_tab BY pernr. LOOP AT cats_tab INTO cats_tab_wa. AT NEW pernr. CLEAR lt_cont. lv_cont-element = 'PERNR'. CONCATENATE cats_tab_wa-pernr sy-datum INTO lv_cont-value. APPEND lv_cont TO lt_cont. ************************************************************************ * Read IT0001 to get PersArea/SubArea to read PSG for Abs/Att type ************************************************************************ CALL FUNCTION 'HR_READ_INFOTYPE' EXPORTING tclas = 'A' pernr = cats_tab_wa-pernr infty = '0001' begda = sy-datum endda = sy-datum * BYPASS_BUFFER = ' ' * LEGACY_MODE = ' ' * IMPORTING * SUBRC = TABLES infty_tab = i0001 * EXCEPTIONS * INFTY_NOT_FOUND = 1 * OTHERS = 2 . IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ************************************************************************ * Get PSG for Abs/Att type which will be required to get the text later ************************************************************************ SELECT SINGLE moabw INTO l_moabw FROM t001p WHERE molga = '07' AND werks = i0001-werks AND btrtl = i0001-btrtl. CHECK sy-subrc = 0. ENDAT. lv_cont-element = 'ENGLISH'. lv_cont-value = cats_tab_wa-workdate. ************************************************************************ * Create string to concatenate workdate,Abs/Att Type, Text & Status ************************************************************************ * Split date into 3 strings of YYYY MM and DD. Then concatenate with '/' ************************************************************************ * First split year from date ************************************************************************ CALL FUNCTION 'STRING_SPLIT_AT_POSITION' EXPORTING string = lv_cont-value pos = 4 * LANGU = SY-LANGU IMPORTING string1 = string1 "Year stored here string2 = string2 "Month & date stored here * POS_NEW = * EXCEPTIONS * STRING1_TOO_SMALL = 1 * STRING2_TOO_SMALL = 2 * POS_NOT_VALID = 3 * OTHERS = 4 . IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. **************************************************************************** * Then split month and day **************************************************************************** CALL FUNCTION 'STRING_SPLIT_AT_POSITION' EXPORTING string = string2 "Month/Day together pos = 2 * LANGU = SY-LANGU IMPORTING string1 = string3 "Month string2 = string4 "Day * POS_NEW = * EXCEPTIONS * STRING1_TOO_SMALL = 1 * STRING2_TOO_SMALL = 2 * POS_NOT_VALID = 3 * OTHERS = 4 . IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. CLEAR lv_cont-value. **************************************************************************** * Now concatenate and separate with '/'. string 1=YY,string 3=MM,string 4=DD **************************************************************************** CONCATENATE string1 string3 string4 INTO lv_cont-value SEPARATED BY '/'. hours_as_txt = cats_tab_wa-hours. SELECT SINGLE atext INTO (cats_tab_wa-awart_text) FROM t554t WHERE sprsl EQ 'EN' AND awart EQ cats_tab_wa-awart AND moabw EQ l_moabw. CONCATENATE cats_tab_wa-awart_text blank INTO cats_tab_wa-awart_text. ************************************************************************ * Get manager's first and last name ************************************************************************ CALL FUNCTION 'HR_GETEMPLOYEEDATA_FROMUSER' EXPORTING username = cats_tab_wa-approver validbegin = sy-datum check_auth = ' ' IMPORTING firstname = firstname lastname = lastname EXCEPTIONS user_not_found = 1 countrygrouping_not_found = 2 infty_not_found = 3 OTHERS = 4. IF sy-subrc <> 0. CALL FUNCTION 'BAPI_MESSAGE_GETDETAIL' EXPORTING id = 'AQ' number = 803 textformat = 'ASC' * MESSAGE_V1 = CUR_MANAGERID IMPORTING message = return-message. ENDIF. CONCATENATE lv_cont-value cats_tab_wa-awart_text hours_as_txt INTO lv_cont-value SEPARATED BY separator. **************************************************************************** * Convert Status code to text **************************************************************************** CASE cats_tab_wa-status. WHEN 30. CONCATENATE lv_cont-value ', Approved' INTO lv_cont-value. WHEN 40. CONCATENATE lv_cont-value ', Rejected' INTO lv_cont-value. WHEN OTHERS. CONCATENATE lv_cont-value ', Processed' INTO lv_cont-value. ENDCASE. CONCATENATE lv_cont-value 'by:' firstname lastname INTO lv_cont-value SEPARATED BY space. APPEND lv_cont TO lt_cont. **************************************************************************** * Do the same in French **************************************************************************** lv_cont-element = 'FRENCH'. CLEAR lv_cont-value. CONCATENATE string1 string3 string4 INTO lv_cont-value SEPARATED BY '/'. hours_as_txt = cats_tab_wa-hours. SELECT SINGLE atext INTO (cats_tab_wa-awart_text_f) FROM t554t WHERE sprsl EQ 'FR' AND awart EQ cats_tab_wa-awart AND moabw EQ l_moabw. CONCATENATE cats_tab_wa-awart_text_f blank INTO cats_tab_wa-awart_text_f. CONCATENATE lv_cont-value cats_tab_wa-awart_text_f hours_as_txt INTO lv_cont-value SEPARATED BY space. ************************************************************************ * ALT-255 is used instead of blanks after words to line up in output ************************************************************************ CASE cats_tab_wa-status. WHEN 30. CONCATENATE lv_cont-value ', Approuvée' INTO lv_cont-value. WHEN 40. CONCATENATE lv_cont-value ', Refusée  ' "followed by 2 ALT-255's INTO lv_cont-value. WHEN OTHERS. CONCATENATE lv_cont-value ', Traitée  ' "followed by 2 ALT-255's INTO lv_cont-value. ENDCASE. CONCATENATE lv_cont-value 'par:' firstname lastname INTO lv_cont-value SEPARATED BY space. APPEND lv_cont TO lt_cont. AT END OF pernr. ************************************************************************ * Since it's impossible to determine the workitem (removed from CATSDB) * after approval, we can use the personnel number since the object key * in this case is not important but this a mandatory field ************************************************************************ objectkey = icatsdb_wa-pernr. SORT lt_cont BY value. "sort so dates are in order in email CALL FUNCTION 'SAP_WAPI_CREATE_EVENT' EXPORTING object_type = 'CATS' object_key = objectkey event = 'PartiallyCompleted' commit_work = 'X' TABLES input_container = lt_cont. ENDAT. ENDLOOP. "cats_tab