Tuesday, October 18, 2011

Sending PO pdf as a FAX/MAIL

Sending PO pdf as mail/fax to vendor address.

1. First configure o/p type for external send option.
2. Condition records should be maintained as per external send.
3. In driver program handle logic based on nast-nacha = '5'. ('5' is for external send)
4. While calling smart form generate OTF data.
5. Use FM 'SO_NEW_DOCUMENT_ATT_SEND_API1' for external send.
6. For sending PDF as an attachment always use 'RAW' and 'PDF' document type together.
7. To get acknowledgement for Faxing with lotus note use format 'FX, REF="------------"'
8. Other approach is using SAPCONNECT directly by passing sender and receiver
   data to form with SCOT setting.






*Set the print Parameters
  
IF nast-nacha = '1' .                         "[+]PA20110715
    
PERFORM set_print_param USING     ls_addr_key
                            
CHANGING  ls_control_param
                                      ls_composer_param
                                      ls_recipient
                                      ls_sender
                                      ent_retco.
  ENDIF.
*code added by +PAHIRE on 28.10.2010
*ECDK900640
  DATA: lwa_ekko 
TYPE ekko.
  DATA: lv_adrnr 
TYPE ad_addrnum,      "vendor_addressnumber
        lv_syucomm 
TYPE syucomm,
        lv_smtp_addr 
TYPE ad_smtpadr,  "email address fo vendor
        lv_name1 
TYPE name1_gp,        "vendor name1
        lv_str 
TYPE so_obj_des,
        lv_str1 
TYPE so_obj_des,
        lv_str2 
TYPE so_obj_nam,
        lv_str4 
TYPE so_obj_des.

  DATA:   lv_mail_rec_obj  
TYPE swotobjid,
          lv_mail_sen_obj  
TYPE swotobjid,
          lv_mail_app_obj  
TYPE swotobjid,
          lv_cont_par      
TYPE ssfctrlop,
          lv_output        
TYPE ssfcompop.

  CONSTANTS: lc_printer 
TYPE char10 VALUE 'PRINTER',
             lc_telefax 
TYPE char10 VALUE 'TELEFAX',
             lc_email   
TYPE char04 VALUE 'MAIL',
             lc_x 
TYPE char01 VALUE 'X',
             lc_a  
TYPE char01 VALUE 'A'.*BOC BY PA20110728
  DATA: lit_otf_data  
TYPE ssfcrescl,
        lit_otf_final 
TYPE STANDARD TABLE OF itcoo,
        bin_filesize 
TYPE i,
        lv_binfile 
TYPE xstring,
        lit_pdfdata 
TYPE TABLE OF tline,
        lit_pdf 
TYPE soli_tab,
        lit_pdf1 
TYPE solix_tab,
        lv_pdflines 
TYPE i,
        lit_attachments  
TYPE TABLE OF solisti1,
        lit_packing_list 
TYPE TABLE OF sopcklsti1,
        lwa_packing_list 
TYPE sopcklsti1,
        lwa_doc_attr 
TYPE sodocchgi1,
        lit_message 
TYPE TABLE OF solisti1,
        lwa_message 
TYPE solisti1,
        lit_recipients   
TYPE TABLE OF somlreci1,
        lwa_recipient 
TYPE somlreci1,
        f_line 
TYPE i,
        lwa_sf_rec 
TYPE swotobjid,
        lwa_sender  
TYPE swotobjid.

  CONSTANTS: gc_docty_pdf 
TYPE so_obj_tp VALUE 'PDF',
             gc_docty_raw 
TYPE so_obj_tp VALUE 'RAW',
             gc_flag_set 
TYPE char1 VALUE 'X',
             lc_objname 
TYPE char12 VALUE 'PO_Mail'.*EOC BY PA20110728
*Get Vendor email id
  CLEAR: lv_adrnr,lv_smtp_addr.
  
SELECT SINGLE adrnr
    
FROM  lfa1
    
INTO  lv_adrnr
    
WHERE lifnr EQ nast-parnr.

  
IF sy-subrc EQ 0.
    
SELECT SINGLE smtp_addr
      
FROM adr6
      
INTO lv_smtp_addr
      
WHERE addrnumber EQ lv_adrnr.
  ENDIF.
*  Get vendor name
*[+]PA20110720
  
SELECT SINGLE name1
    
FROM lfa1
    
INTO lv_name1
    
WHERE lifnr = l_doc-xekko-lifnr.*Get the Smart Form name.
  
IF NOT tnapr-sform IS INITIAL.
    lf_formname = tnapr-sform.
  ELSE.
    
MESSAGE e001(/smba0/aa_ssfcompose).
  ENDIF.
* Determine smartform function module for purchase document
  
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    
EXPORTING
      formname           = lf_formname
    
IMPORTING
      fm_name            = lf_fm_name
    
EXCEPTIONS
      no_form            = 
1
      no_function_module = 
2
      
OTHERS             3.
  
IF sy-subrc <> 0.
*  error handling
    ent_retco = sy-subrc.
    
IF sy-subrc = 1.
      
MESSAGE e001(/smba0/aa_ssfcompose).
    ENDIF.
    
IF sy-subrc = 2.
      
MESSAGE e002(/smba0/aa_ssfcompose) WITH tnapr-sform.
    ENDIF.
    
PERFORM protocol_update_i.
  ENDIF.
*  IF lv_smtp_addr IS NOT INITIAL.
* Prepare the output & Container parameters according to Medium type
  
IF nast-nacha = '1'.                   "If Output Medium is Printer
    lv_cont_par-device    = lc_printer.
    lv_cont_par-no_dialog = lc_x.
    lv_cont_par-preview   = lc_x.
    lv_output-tddest      = nast-ldest.  
"Spool: Output device
    lv_output-tdimmed     = lc_x.        
"Print parameters, print immediately
    lv_output-tdnewid     = lc_x.        
"Print parameters, new spool request

  
ELSEIF nast-nacha = '2'.               "If Output Medium is Fax
    lv_cont_par-device = lc_telefax.

  
ELSEIF nast-nacha = '5'.               "If Output Medium is External Mail
    lv_output-tddest       = nast-ldest.  
"Spool: Output device
*    lv_output-tdimmed     = lc_x.        "Print parameters, print immediately    "[-]PA20110715
*    lv_output-tdnewid     = lc_x.        "Print parameters, new spool request    "[-]PA20110728
    lv_cont_par-no_dialog  = lc_x.
    lv_cont_par-preview    = lc_x.
    lv_cont_par-getotf     = lc_x.

    
CONCATENATE l_doc-xekko-ebeln  l_doc-xekko-ekgrp lv_name1  "[+]PA20110720
    
INTO lv_str SEPARATED BY space.

    
CONCATENATE 'FX,REF="' lv_str '"' INTO lv_str1.   "[+]PA20110720
    
CONCATENATE 'PO_' l_doc-xekko-ebeln INTO lv_str4.
    
CONDENSE lv_str4.

    lv_str2 = l_doc-xekko-ebeln.
*    lv_cont_par-device = lc_email.
    
IF sy-ucomm EQ 'PREVOUTPUT'.
      lv_cont_par-device = lc_printer.
      lv_output-tdnewid  = lc_x.
      lv_cont_par-getotf = 
''.

      
CALL FUNCTION lf_fm_name
        
EXPORTING
          archive_index      = toa_dara
          archive_parameters = arc_params
          control_parameters = lv_cont_par          
"ls_control_param
          mail_recipient     = lwa_sf_rec           
"ls_recipient
          mail_sender        = lwa_sender           
"ls_sender
          output_options     = lv_output            
"ls_composer_param
          is_ekko            = l_doc-xekko
          user_settings      = 
' '                  "Disable User Printer
          is_pekko           = l_doc-xpekko
          is_nast            = nast
          iv_from_mem        = l_from_memory
          iv_druvo           = iv_druvo
          iv_xfz             = iv_xfz
        
TABLES
          it_ekpo            = l_doc-xekpo[]
          it_ekpa            = l_doc-xekpa[]
          it_pekpo           = l_doc-xpekpo[]
          it_eket            = l_doc-xeket[]
          it_tkomv           = l_doc-xtkomv[]
          it_ekkn            = l_doc-xekkn[]
          it_ekek            = l_doc-xekek[]
          it_komk            = l_xkomk[]
        
EXCEPTIONS
          formatting_error   = 
1
          internal_error     = 
2
          send_error         = 
3
          user_canceled      = 
4
          
OTHERS             5.

      
IF sy-subrc <> 0.
        ent_retco = sy-subrc.
        
PERFORM protocol_update_i.* get SmartForm protocoll and store it in the NAST protocoll
        
PERFORM add_smfrm_prot.
      ENDIF.
    ENDIF.
*    lv_output-bcs_commit = lc_x.
*    lv_output-bcs_status = lc_a.
*    lv_output-tdiexit = lc_x.
  ENDIF.
*ECDK900640
*End of addition by +PAHIRE

  
IF sy-ucomm eq ''.*>>>>> Change of Parameters <<<<<<<<<<<<<<<<<<<<<<<
    
CALL FUNCTION lf_fm_name
      
EXPORTING
        archive_index      = toa_dara
        archive_parameters = arc_params
        control_parameters = lv_cont_par          
"ls_control_param
        mail_recipient     = lwa_sf_rec           
"ls_recipient
        mail_sender        = lwa_sender           
"ls_sender
        output_options     = lv_output            
"ls_composer_param
        is_ekko            = l_doc-xekko
        user_settings      = 
' '                  "Disable User Printer
        is_pekko           = l_doc-xpekko
        is_nast            = nast
        iv_from_mem        = l_from_memory
        iv_druvo           = iv_druvo
        iv_xfz             = iv_xfz
      
IMPORTING
        job_output_info    = lit_otf_data
      
TABLES
        it_ekpo            = l_doc-xekpo[]
        it_ekpa            = l_doc-xekpa[]
        it_pekpo           = l_doc-xpekpo[]
        it_eket            = l_doc-xeket[]
        it_tkomv           = l_doc-xtkomv[]
        it_ekkn            = l_doc-xekkn[]
        it_ekek            = l_doc-xekek[]
        it_komk            = l_xkomk[]
      
EXCEPTIONS
        formatting_error   = 
1
        internal_error     = 
2
        send_error         = 
3
        user_canceled      = 
4
        
OTHERS             5.

    
IF sy-subrc <> 0.
      ent_retco = sy-subrc.
      
PERFORM protocol_update_i.* get SmartForm protocoll and store it in the NAST protocoll
      
PERFORM add_smfrm_prot.
    ELSE.
      lit_otf_final[] = lit_otf_data-otfdata[].

      
" Converting OTF data into bin_file we dont need it_otf_final
      
" and it_pdfdata[] we just need lv_binfile.

      
CALL FUNCTION 'CONVERT_OTF'
        
EXPORTING
          
format                = gc_docty_pdf
        
IMPORTING
          bin_filesize          = bin_filesize
          bin_file              = lv_binfile
        
TABLES
          otf                   = lit_otf_final
          
lines                 = lit_pdfdata[]
        
EXCEPTIONS
          err_max_linewidth     = 
1
          err_format            = 
2
          err_conv_not_possible = 
3
          err_bad_otf           = 
4
          
OTHERS                5.

      
" Converting the bin_file to PDF to solix type.

      
CALL METHOD cl_bcs_convert=>xstring_to_solix
        
EXPORTING
          iv_xstring = lv_binfile
        RECEIVING
          et_solix   = lit_pdf1[].

      
" Changing the contents into solist1 since this is supported
      
" for Email function module.

      
CALL FUNCTION 'SO_SOLIXTAB_TO_SOLITAB'
        
EXPORTING
          ip_solixtab = lit_pdf1[]
        
IMPORTING
          ep_solitab  = lit_pdf[].


      
DESCRIBE TABLE lit_pdf LINES lv_pdflines.

      
APPEND LINES OF lit_pdf TO lit_attachments.

      REFRESH: lit_pdf1[],lit_pdf[].
*Body of mail
      lwa_message = text-002.
      
APPEND lwa_message TO lit_message.*Packing list for RAW(for different subject and attachment name)
      
CLEAR lwa_packing_list.
      lwa_packing_list-head_start = 
1.
      lwa_packing_list-head_num   = 
1.
      lwa_packing_list-body_start = 
1.
      lwa_packing_list-body_num   = 
1.
      lwa_packing_list-doc_type   = gc_docty_raw.
      
APPEND lwa_packing_list TO lit_packing_list.*Packing list for PDF
      
CLEAR lwa_packing_list.
      lwa_packing_list-transf_bin = gc_flag_set.
      lwa_packing_list-head_start = 
1.
      lwa_packing_list-head_num   = 
1.
      lwa_packing_list-body_start = 
1.
      lwa_packing_list-body_num   = lv_pdflines.
      lwa_packing_list-doc_type   = gc_docty_pdf.
      lwa_packing_list-obj_descr  = lv_str4.
      lwa_packing_list-obj_name   = lv_str2.
      lwa_packing_list-obj_langu = sy-langu.
      lwa_packing_list-doc_size   = lwa_packing_list-body_num * 
255.
      
APPEND lwa_packing_list TO lit_packing_list.

      f_line = lwa_packing_list-body_start +  lwa_packing_list-body_num.
      
CLEAR lwa_packing_list.*Document attributes
      lwa_doc_attr-obj_name = lc_objname.
      lwa_doc_attr-obj_descr = lv_str1.
      lwa_doc_attr-obj_langu = sy-langu.
      lwa_doc_attr-sensitivty = 
'F'.      "functional message
*Get receiver list
      lwa_recipient-rec_type = 
'U'.
      lwa_recipient-receiver = lv_smtp_addr.
      lwa_recipient-com_type = 
'INT'.
      
APPEND lwa_recipient TO lit_recipients.*FM to send external mail
      
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
            
EXPORTING
              document_data              = lwa_doc_attr
              put_in_outbox              = gc_flag_set
*               commit_work                = 'X'
            
TABLES
              packing_list               = lit_packing_list
              contents_bin               = lit_attachments
              contents_txt               = lit_message
              receivers                  = lit_recipients
            
EXCEPTIONS
              too_many_receivers         = 
1
              document_not_sent          = 
2
              document_type_not_exist    = 
3
              operation_no_authorization = 
4
              parameter_error            = 
5
              x_error                    = 
6
              enqueue_error              = 
7
              
OTHERS                     8.
      
IF sy-subrc NE 0.
        
PERFORM protocol_update_i.* get SmartForm protocoll and store it in the NAST protocoll
        
PERFORM add_smfrm_prot.
      
ELSEIF sy-subrc = 0.
      ENDIF.
    ENDIF.
    
CLEAR it_otf_data.
  ENDIF.