* _______ _______ _______ _______ _______ _______ ______ _______ _______ ______ _______ * | _ | _ | _ | | | _ | || _ | _ | _ | | _ | * | |_| | |_| | |_| | _ | | |_| | _ | |_| | |_| | | || | |_| | * | | | | |_| | | | | | | | | |_||_| | * | | _ || | ___| _| | |_| | | _ || __ | | * | _ | |_| | _ | | | |_| _ | | _ | |_| | | | | _ | * |__| |__|_______|__| |__|___| |_______|__| |__|______||__| |__|_______|___| |_|__| |__| * www.abapcadabra.com * *------------------------------------------------------------------------------------------- * program : ZABAPCADABRA_CONDITIONAL_MAILER * title : Compose an email with an SO10 text and send it out. The email * itself is specifically selected for a "parental leave" * notification. * functional area : HR Human Resource * environment : 4.7 * Documentation : * Previous version : This is the initial version * Developer name : Wim Maasdam - Luxon-ERP * Development date : 07/09/2015 * Version : 0.1 *--------------------------------------------------------------------- * Change list: * Date Description * 07/09/2015 Initial release *--------------------------------------------------------------------- REPORT ZABAPCADABRA_CONDITIONAL_MAILER. TABLES: stxh, sscrfields. "Selection screen purpose only INFOTYPES: 0000, 0001, 0002, 0003, 0006, 0019, 0105. NODES: pernr. "Logical database support *--------------------------------------------------------------------- * C L A S S D E F I N I T I O N *--------------------------------------------------------------------- CLASS lcl_utilities DEFINITION. PUBLIC SECTION. CLASS-METHODS: f4_so10_texts CHANGING tdname TYPE stxh-tdname, call_so10_editor IMPORTING tdname TYPE stxh-tdname tdspras TYPE stxh-tdspras. ENDCLASS. "lcl_f4_processing DEFINITION CLASS lcl_mailman DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_receiver, email TYPE ad_smtpadr, name TYPE ad_smtpadr, END OF ty_receiver, BEGIN OF ty_content, line type char255, END OF ty_content. CLASS-DATA: gt_receivers TYPE STANDARD TABLE OF ty_receiver, gt_email_body TYPE BCSY_TEXT, gt_email_body_prepped TYPE BCSY_TEXT, gv_subject TYPE SOOD-OBJDES. CLASS-METHODS: set_subject IMPORTING subject TYPE ANY, read_body_text IMPORTING tdname TYPE stxh-tdname tdspras TYPE stxh-tdspras, prepare_body_text importing name type any date_of_task type d, set_receivers IMPORTING r1 TYPE ANY r2 TYPE ANY OPTIONAL r3 TYPE ANY OPTIONAL r4 TYPE ANY OPTIONAL r5 TYPE ANY OPTIONAL, send_email. ENDCLASS. *---------------------------------------------------------------------- * CLASS lcl_logging - the message logging and error logging for this * interface is done in the Business Application Log (trx. SLG0, SLG1). * The log is displayed at the end of the report run. Logs can also * be saved (options on the selection screen are available). *---------------------------------------------------------------------- CLASS lcl_logging DEFINITION. PUBLIC SECTION. CLASS-DATA: go_log TYPE REF TO cl_ishmed_bal, gv_errors_were_logged TYPE boolean VALUE space. CLASS-METHODS: initialize IMPORTING object TYPE balobj_d DEFAULT 'ALERT' subobject TYPE balsubobj DEFAULT 'PROCESSING', set_subject IMPORTING subject TYPE any, set_message IMPORTING message TYPE any OPTIONAL par1 TYPE any DEFAULT space par2 TYPE any DEFAULT space par3 TYPE any DEFAULT space msgty TYPE symsgty DEFAULT 'I' PREFERRED PARAMETER message, set_error IMPORTING message TYPE any OPTIONAL par1 TYPE any DEFAULT space par2 TYPE any DEFAULT space PREFERRED PARAMETER message. ENDCLASS. "lcl_logging DEFINITION *--------------------------------------------------------------------- * S E L E C T I O N - S C R E E N *--------------------------------------------------------------------- selection-screen begin of block B01 with frame title text-b01. parameters: pa_test as checkbox default 'X'. select-options: so_drang for sy-datum. SELECTION-SCREEN skip. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_10 FOR FIELD pa_subj. PARAMETERS: pa_subj TYPE C length 100 LOWER CASE visible length 56 DEFAULT 'Notification - parental leave'. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_11 FOR FIELD pa_body. PARAMETERS: pa_body TYPE stxh-tdname DEFAULT 'ZHR_MAILER_PARENTAL_LEAVE_BODY'. SELECTION-SCREEN PUSHBUTTON (4) but_01 USER-COMMAND SO10. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_12 FOR FIELD pa_langu. PARAMETERS: pa_langu TYPE stxh-tdspras DEFAULT sy-langu. selection-SCREEN END OF LINE. selection-screen end of block b01. selection-screen begin of block B02 with frame title text-b02. parameters: pa_store as checkbox default 'X'. selection-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON (20) but_02 USER-COMMAND SLG1. selection-SCREEN END OF LINE. selection-screen end of block b02. AT selection-SCREEN ON VALUE-request FOR pa_body. lcl_utilities=>f4_so10_texts( CHANGING tdname = pa_body ). AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN 'SO10'. lcl_utilities=>call_so10_editor( EXPORTING tdname = pa_body tdspras = pa_langu ). WHEN 'SLG1'. SET PARAMETER ID 'BALOBJ' FIELD 'ZREP'. SET PARAMETER ID 'BALSUBOBJ' FIELD 'PARENTAL_LEAVE'. CALL TRANSACTION 'SLG1'. ENDCASE. *--------------------------------------------------------------------- * C L A S S I M P L E M E N T A T I O N *--------------------------------------------------------------------- CLASS lcl_utilities IMPLEMENTATION. METHOD f4_so10_texts. TYPES: BEGIN OF lty_columns, * List the fields you want to show in the F4 popup tdname TYPE stxh-tdname, END OF lty_columns. DATA: lt_columns TYPE STANDARD TABLE OF lty_columns. CLEAR: lt_columns[]. * Set selection values / note this is just for example purpose: SELECT tdname FROM stxh INTO TABLE lt_columns WHERE TDOBJECT = 'TEXT' AND TDID = 'ST ' AND TDSPRAS = pa_langu. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'TDNAME' dynpprog = SY-REPID dynpnr = '1000' dynprofield = 'PA_BODY' WINDOW_TITLE = 'Select a standard SO10 text' value_org = 'S' TABLES value_tab = lt_columns. ENDMETHOD. METHOD call_so10_editor. DATA: lt_bdcdata TYPE STANDARD TABLE OF bdcdata, lw_bdcdata TYPE bdcdata. * bdc_add 'X' 'PROGRAM_NAME' 'SCREEN NUMBER'. * bdc_add ' ' 'FIELDNAME' 'FIELDVALUE'. DEFINE bdc_add. CLEAR lw_bdcdata. lw_bdcdata-dynbegin = &1. IF &1 EQ 'X'. lw_bdcdata-PROGRAM = &2. lw_bdcdata-DYNPRO = &3. ELSE. lw_bdcdata-fnam = &2. lw_bdcdata-fval = &3. ENDIF. APPEND lw_bdcdata TO lt_bdcdata. END-OF-DEFINITION. CLEAR lt_bdcdata. bdc_add: 'X' 'SAPMSSCE' '1100', ' ' 'RSSCE-TDNAME' tdname, ' ' 'RSSCE-TDSPRAS' tdspras. CALL TRANSACTION 'SO10' USING lt_bdcdata MODE 'E'. ENDMETHOD. ENDCLASS. "lcl_f4_processing IMPLEMENTATION CLASS lcl_mailman IMPLEMENTATION. METHOD set_subject. IF NOT subject IS INITIAL. gv_subject = subject. ELSE. CONCATENATE 'Message from SAP' sy-sysid 'client' sy-mandt INTO gv_subject SEPARATED BY space. ENDIF. ENDMETHOD. METHOD read_body_text. DATA: lt_lines TYPE STANDARD TABLE OF TLINE, lw_tline TYPE TLINE, lw_TBTCM type TBTCM, lt_JOBLOG type standard table of TBTC5, lw_JOBLOG type TBTC5. IF NOT tdname IS INITIAL. * Read the standard SO10 longtext CLEAR: lt_lines[]. CALL FUNCTION 'READ_TEXT' EXPORTING ID = 'ST ' LANGUAGE = tdspras NAME = tdname OBJECT = 'TEXT' TABLES LINES = lt_lines EXCEPTIONS OTHERS = 0. LOOP AT lt_lines INTO lw_tline. APPEND lw_tline-tdline TO gt_email_body. ENDLOOP. ENDIF. CONCATENATE 'This email was created in SAP' sy-sysid 'client' sy-mandt INTO lw_tline-tdline SEPARATED BY space. APPEND space TO gt_email_body. APPEND lw_tline-tdline TO gt_email_body. ENDMETHOD. METHOD prepare_body_text. data: lw_tdline type tline, lv_datefield type c length 10. gt_email_body_prepped[] = gt_email_body[]. write date_of_task to lv_datefield dd/mm/yyyy. loop at gt_email_body_prepped into lw_tdline. replace '{name}' in lw_tdline-tdline with name. replace '{date-of-task}' in lw_tdline-tdline with lv_datefield. modify gt_email_body_prepped from lw_tdline. endloop. ENDMETHOD. METHOD set_receivers. DATA: lw_receiver TYPE ty_receiver. lw_receiver-email = r1. APPEND lw_receiver TO gt_receivers. IF NOT R2 IS INITIAL. lw_receiver-email = r2. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R3 IS INITIAL. lw_receiver-email = r3. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R4 IS INITIAL. lw_receiver-email = r4. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R5 IS INITIAL. lw_receiver-email = r5. APPEND lw_receiver TO gt_receivers. ENDIF. ENDMETHOD. METHOD send_email. * local objects - referencing classes DATA: lo_send_request TYPE REF TO cl_bcs, lo_document TYPE REF TO cl_document_bcs, lo_receiver TYPE REF TO cl_cam_address_bcs, lo_sender TYPE REF TO cl_sapuser_bcs, * pool of help variables lv_status TYPE os_boolean, lv_length_hlp TYPE I, lv_length_att TYPE sood-objlen, lt_solix TYPE solix_tab, lw_receiver TYPE ty_receiver. TRY. * Create a request handler lo_send_request = cl_bcs=>create_persistent( ). * Link the body text to the email (document type RAW, importance 0 * and sensitivity F, all defaults) cl_document_bcs=>create_from_text( EXPORTING i_text = gt_email_body_prepped i_subject = gv_subject RECEIVING result = lo_document ). * Set the document on the request lo_send_request->set_document( EXPORTING i_document = lo_document ). * Set the receivers LOOP AT gt_receivers INTO lw_receiver. cl_cam_address_bcs=>create_internet_address( EXPORTING i_address_string = lw_receiver-email i_address_name = lw_receiver-name RECEIVING result = lo_receiver ). lo_send_request->add_recipient( EXPORTING i_recipient = lo_receiver ). ENDLOOP. * Set the sender lo_sender = cl_sapuser_bcs=>create( sy-uname ). lo_send_request->set_sender( EXPORTING i_sender = lo_sender ). lo_send_request->set_priority( '5' ). "High=1 to Low=9 * Send the email lv_status = lo_send_request->send( ). CATCH cx_send_req_bcs. CATCH cx_document_bcs. CATCH cx_address_bcs. ENDTRY. IF lv_status = 'X'. *------------------------------ COMMIT WORK. *------------------------------ lcl_logging=>set_message( exporting message = 'Email sent to &' par1 = lw_receiver-email ). ELSE. lcl_logging=>set_error( exporting message = 'Email NOT sent to &' par1 = lw_receiver-email ). ENDIF. ENDMETHOD. "send_email ENDCLASS. *---------------------------------------------------------------------- * CLASS lcl_logging IMPLEMENTATION *---------------------------------------------------------------------- CLASS lcl_logging IMPLEMENTATION. METHOD initialize. TRY. CREATE OBJECT go_log EXPORTING i_object = object i_subobject = subobject i_repid = sy-repid. CATCH cx_ishmed_log. "#EC NO_HANDLER * No actual processing here ENDTRY. ENDMETHOD. "initialize METHOD set_subject. DATA: lv_subject TYPE c LENGTH 100. lv_subject = subject. * concatenate '==>' lv_subject into lv_subject SEPARATED BY space. TRANSLATE lv_subject TO UPPER CASE. TRY. go_log->add_free_text( EXPORTING i_msg_type = 'W' i_text = lv_subject ). CATCH cx_ishmed_log. "#EC NO_HANDLER * No actual logic on catch ENDTRY. ENDMETHOD. "set_subject METHOD set_message. " importing message type any, par1, par2 DATA: lv_message TYPE c LENGTH 100. lv_message = message. REPLACE '&' WITH par1 INTO lv_message. CONDENSE lv_message. REPLACE '&' WITH par2 INTO lv_message. CONDENSE lv_message. REPLACE '&' WITH par3 INTO lv_message. CONDENSE lv_message. TRY. go_log->add_free_text( EXPORTING i_msg_type = msgty i_text = lv_message ). CATCH cx_ishmed_log. "#EC NO_HANDLER * No actual logic on catch ENDTRY. ENDMETHOD. "set_message METHOD set_error. " importing message type any, par1, par2 DATA: lv_message TYPE c LENGTH 100. lv_message = message. REPLACE '&' WITH par1 INTO lv_message. REPLACE '&' WITH par2 INTO lv_message. CONDENSE lv_message. TRY. go_log->add_free_text( EXPORTING i_msg_type = 'E' i_text = lv_message ). lcl_logging=>gv_errors_were_logged = abap_true. CATCH cx_ishmed_log. "#EC NO_HANDLER * No actual logic on catch ENDTRY. ENDMETHOD. "set_error ENDCLASS. "lcl_logging IMPLEMENTATION *--------------------------------------------------------------------- * I N I T I T A L I Z A T I O N *--------------------------------------------------------------------- INITIALIZATION. * All texts for this report have been set up as hard-coded texts (no use * of the report text-pool). Reason: easy copying of report source code. lbl_10 = 'Subject'. lbl_11 = 'Body text'. lbl_12 = 'Language'. but_01 = '@3I@'. but_02 = 'Application log'. lcl_logging=>initialize( exporting object = 'ZREP' subobject = 'PARENTAL_LEAVE' ). *--------------------------------------------------------------------- * S T A R T - O F - S E L E C T I O N *--------------------------------------------------------------------- start-OF-selection. lcl_logging=>set_subject( 'Report run - send email notification - parental leave' ). lcl_logging=>set_message( exporting message = 'Report ran by & - testmode = '''&'''' par1 = sy-uname par2 = pa_test ). * Compose the email lcl_mailman=>set_subject( EXPORTING subject = pa_subj ). lcl_mailman=>read_body_text( EXPORTING tdname = pa_body tdspras = pa_langu ). data: lw_p0019 type p0019, lw_p0105 type p0105, lv_email_date type d, lv_message type string. get pernr. * Check whether the selected employee is applicable for email sending: loop at p0019 into lw_p0019 where subty = '22'. * An entry with a task-date was found: lcl_logging=>set_message( exporting message = 'Employee & - &' par1 = p0001-pernr par2 = p0001-ename ). CL_BS_PERIOD_TOOLSET_BASICS=>SUBTRACT_MONTHS_FROM_DATE( exporting iv_date = lw_p0019-TERMN iv_months = 3 RECEIVING rv_date = lv_email_date ). if lv_email_date = sy-datum or ( lv_email_date in so_drang and not so_drang[] is initial ). concatenate '> has parental leave date -' lw_p0019-TERMN+6(2) '/' lw_p0019-TERMN+4(2) '/' lw_p0019-TERMN(4) '- email notifcation NOW DUE' into lv_message. lcl_logging=>set_message( lv_message ). * Determine the receiver: clear: lcl_mailman=>gt_receivers[]. * To test the email functionality - add a receiver here: * lcl_mailman=>set_receivers( r1 = 'wimmaasdam@gmail.com' ). loop at p0105 into lw_p0105 "Subtype 2 and 3 are used for email addresses where subty between '0002' and '0003' and begda <= sy-datum and endda > sy-datum. lcl_mailman=>set_receivers( r1 = lw_p0105-USRID_LONG ). endloop. if lcl_mailman=>gt_receivers[] is initial. lcl_logging=>set_error( 'No receivers could be determined' ). else. if pa_test is initial. * Set the email longtext: (apply some variables) lcl_mailman=>prepare_body_text( exporting name = p0001-ename date_of_task = lw_p0019-termn ). * Send the email: lcl_mailman=>send_email( ). endif. endif. else. concatenate '> has parental leave date -' lw_p0019-TERMN+6(2) '/' lw_p0019-TERMN+4(2) '/' lw_p0019-TERMN(4) '- email notifcation due on -' lv_email_date+6(2) '/' lv_email_date+4(2) '/' lv_email_date(4) '-' into lv_message. lcl_logging=>set_message( lv_message ). endif. endloop. *--------------------------------------------------------------------- * E N D - O F - S E L E C T I O N *--------------------------------------------------------------------- end-of-selection. if not pa_store is initial. lcl_logging=>go_log->save( ). endif. lcl_logging=>go_log->display( ).