*&---------------------------------------------------------------------* *& Report ZSD_BILLINGDOC_FLOE - Copy of SD_INVOICE_PRINT01 *& *&---------------------------------------------------------------------* *& Print Program for Billing Documents *& *&---------------------------------------------------------------------* REPORT ZSD_BILLINGDOC_FLOE MESSAGE-ID vd_pdf. TABLES: nast, tnapr, toa_dara, vbdkr, "#EC NEEDED sapscript komk, "#EC NEEDED sapscript tvko. "#EC NEEDED sapscript *--- SD-SEPA INCLUDE item_topdata. *--- SD-SEPA TYPE-POOLS: szadr. TYPES: BEGIN OF vbeln_posnr_s, vbeln TYPE vbeln, posnr TYPE posnr, END OF vbeln_posnr_s, vbeln_posnr_t TYPE TABLE OF vbeln_posnr_s. DATA: gs_interface TYPE invoice_s_prt_interface, gv_screen_display TYPE char1, gv_price_print_mode TYPE char1, gt_komv TYPE TABLE OF komv, gs_komk TYPE komk, gt_vbtyp_fix_values TYPE TABLE OF dd07v, gv_language TYPE sylangu, gv_dummy TYPE char1, "#EC NEEDED gt_sdaccdpc_doc TYPE vbeln_posnr_t, gt_sdaccdpc TYPE sdaccdpc_t, gv_downpay_refresh TYPE c, BEGIN OF gs_nast. INCLUDE STRUCTURE nast. DATA: email_addr TYPE ad_smtpadr, END OF gs_nast. DATA: gv_badi_filter TYPE char30. DATA: bd_sd_bil TYPE REF TO badi_sd_bil_print01. FIELD-SYMBOLS: TYPE vbdkr, TYPE sysubrc. CONSTANTS: gc_pr_kappl TYPE char1 VALUE 'V', gc_true TYPE char1 VALUE 'X', gc_false TYPE char1 VALUE space, gc_english TYPE char1 VALUE 'E', gc_pdf TYPE char1 VALUE '2', gc_equal TYPE char2 VALUE 'EQ', gc_include TYPE char1 VALUE 'I', BEGIN OF gc_nacha, printer TYPE na_nacha VALUE 1, fax TYPE na_nacha VALUE 2, external_send TYPE na_nacha VALUE 5, END OF gc_nacha, BEGIN OF gc_device, printer TYPE output_device VALUE 'P', fax TYPE output_device VALUE 'F', email TYPE output_device VALUE 'E', web_dynpro TYPE output_device VALUE 'W', END OF gc_device. *----------------------------------------------------------------------* * Varo declarations *----------------------------------------------------------------------* * DATA: lv_pdf TYPE xstring, lv_doc TYPE text40, lv_ccode TYPE /flm/cust_code, lv_ftype TYPE /flm/ftype_code, lv_template TYPE /flm/flang, lv_fver TYPE /flm/fver, lv_fid TYPE /flm/fid, lv_fidvar TYPE /flm/id_var, ls_mess TYPE bapiret2, lv_cms_doc TYPE /flm/cms_doc, lt_variables TYPE /flm/vars_t, ls_variables TYPE /flm/vars_s. * * Ouput processing DATA: lv_reprint TYPE flag, ls_nast TYPE nast. * * Spool print DATA: size TYPE i, total_size TYPE i, spoolid TYPE rspoid, copies TYPE rspocopies, lifetime. *----------------------------------------------------------------------* * Floe declarations *----------------------------------------------------------------------* TYPES: BEGIN OF ty_floe_rec_email_s, email TYPE ad_smtpadr, type TYPE char1, END OF ty_floe_rec_email_s. TYPES: ty_floe_rec_email_t TYPE TABLE OF ty_floe_rec_email_s. TYPES: BEGIN OF ty_floe_var_code_s, var_code TYPE char30, value TYPE string, row_num TYPE numc3, parent_row_num TYPE numc3, END OF ty_floe_var_code_s. TYPES: ty_floe_var_code_t TYPE TABLE OF ty_floe_var_code_s. DATA: gt_rec_emails TYPE ty_floe_rec_email_t, gs_rec_email TYPE ty_floe_rec_email_s, gt_vars TYPE ty_floe_var_code_t, gs_vars TYPE ty_floe_var_code_s, gv_subrc TYPE sysubrc. DATA: ls_attach TYPE /floe/att_s, lt_attach TYPE /floe/att_t, l_im_doc TYPE /floe/doc_ref, gv_etype TYPE /floe/etype_code, l_order TYPE string. DATA: lt_lines TYPE TABLE OF tline, ls_lines TYPE tline, l_text TYPE string, l_tdname TYPE tdobname. * >>>>> BUNDLING <<<<< ************************************************* INCLUDE check_bundling_print. * >>>>> BUNDLING <<<<< ************************************************* *---------------------------------------------------------------------* * FORM ENTRY * *---------------------------------------------------------------------* FORM entry "#EC CALLED USING cv_returncode TYPE sysubrc uv_screen TYPE char1. TRY. * Get BAdI handle GET BADI bd_sd_bil FILTERS filter_billing = tnapr-sform. CATCH cx_badi_not_implemented. * This should not occur due to fallback class but to be save... CLEAR bd_sd_bil. CATCH cx_badi_multiply_implemented. * Several implementations exist for the filter 'form name'. * This appears to be very unlikely but to be save... CLEAR bd_sd_bil. ENDTRY. * Assign RC ASSIGN cv_returncode TO . * Refresh global data PERFORM initialize_data. gv_screen_display = uv_screen. gs_nast = nast. * start processing PERFORM processing. ENDFORM. "entry *---------------------------------------------------------------------* * FORM ENTRY_VARO * *---------------------------------------------------------------------* FORM entry_varo "#EC CALLED USING cv_returncode TYPE sysubrc uv_screen TYPE char1. TRY. * Get BAdI handle GET BADI bd_sd_bil FILTERS filter_billing = tnapr-sform. CATCH cx_badi_not_implemented. * This should not occur due to fallback class but to be save... CLEAR bd_sd_bil. CATCH cx_badi_multiply_implemented. * Several implementations exist for the filter 'form name'. * This appears to be very unlikely but to be save... CLEAR bd_sd_bil. ENDTRY. * Assign RC ASSIGN cv_returncode TO . * Refresh global data PERFORM initialize_data. gv_screen_display = uv_screen. gs_nast = nast. * start processing PERFORM processing_varo. ENDFORM. "entry_varo *---------------------------------------------------------------------* * FORM ENTRY_FLOE * *---------------------------------------------------------------------* FORM entry_floe "#EC CALLED USING cv_returncode TYPE sysubrc uv_screen TYPE char1. TRY. * Get BAdI handle GET BADI bd_sd_bil FILTERS filter_billing = tnapr-sform. CATCH cx_badi_not_implemented. * This should not occur due to fallback class but to be save... CLEAR bd_sd_bil. CATCH cx_badi_multiply_implemented. * Several implementations exist for the filter 'form name'. * This appears to be very unlikely but to be save... CLEAR bd_sd_bil. ENDTRY. * Assign RC ASSIGN cv_returncode TO . * Refresh global data PERFORM initialize_data. gv_screen_display = uv_screen. gs_nast = nast. * start processing PERFORM processing_floe. ENDFORM. "entry_floe *&---------------------------------------------------------------------* *& Form processing *&---------------------------------------------------------------------* FORM processing. *--- Retrieve the data PERFORM get_data. CHECK IS INITIAL. *--- Print, fax, send data PERFORM print_data. CHECK IS INITIAL. ENDFORM. " processing *&---------------------------------------------------------------------* *& Form processing Varo *&---------------------------------------------------------------------* FORM processing_varo. *--- Retrieve the data PERFORM get_data. CHECK IS INITIAL. *--- Print, fax, send data PERFORM print_data_varo. CHECK IS INITIAL. ENDFORM. " processing_varo *&---------------------------------------------------------------------* *& Form processing Floe *&---------------------------------------------------------------------* FORM processing_floe. * Check email type gv_etype = tnapr-fonam. CHECK gv_etype IS NOT INITIAL. *--- Retrieve the data PERFORM get_data. CHECK IS INITIAL. *--- Generate email PERFORM send_data_floe. CHECK IS INITIAL. ENDFORM. " processing_floe *&---------------------------------------------------------------------* *& Form get_data *&---------------------------------------------------------------------* FORM get_data. DATA: ls_comwa TYPE vbco3, lt_vbdpr TYPE tbl_vbdpr. DATA: ls_druckprofil TYPE ledruckprofil, "IBGI ls_nast TYPE nast. "IBGI CALL FUNCTION 'RV_PRICE_PRINT_REFRESH' TABLES tkomv = gt_komv. ls_comwa-mandt = sy-mandt. ls_comwa-spras = gs_nast-spras. ls_comwa-kunde = gs_nast-parnr. ls_comwa-parvw = gs_nast-parvw. IF gs_nast-objky+10(6) NE space. ls_comwa-vbeln = gs_nast-objky+16(10). ELSE. ls_comwa-vbeln = gs_nast-objky. ENDIF. *--- Call the famous print view CALL FUNCTION 'RV_BILLING_PRINT_VIEW' EXPORTING comwa = ls_comwa IMPORTING kopf = gs_interface-head_detail-vbdkr TABLES pos = lt_vbdpr EXCEPTIONS terms_of_payment_not_in_t052 = 1 error_message = 2 OTHERS = 3. IF sy-subrc = 1. sy-msgty = 'I'. PERFORM protocol_update. ELSEIF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. *--- Assign a global pointer to the VBDKR ASSIGN gs_interface-head_detail-vbdkr TO . *--- Set default language gv_language = gs_nast-spras. *--- Set Country for display conversions e.g. WRITE TO SET COUNTRY -land1. *--- Get the item details PERFORM get_item_details USING lt_vbdpr. CHECK IS INITIAL. *--- Get the header details PERFORM get_head_details. CHECK IS INITIAL. * ENHANCEMENT-POINT EHP3_GET_DATA_01 SPOTS ES_SD_INVOICE_PRINT01. *---------------------------------------------------------------------* * fill_floe_variables *---------------------------------------------------------------------* DATA: lt_comp TYPE abap_compdescr_tab, ls_comp_a LIKE LINE OF lt_comp, ld_type TYPE abap_typekind, ls_item_detail TYPE vbdpr, l_row_num TYPE numc3, l_parent_num TYPE numc3, l_item_num TYPE numc3, l_schl_num TYPE numc3, l_old_posnr TYPE posnr. DATA: lo_struct TYPE REF TO cl_abap_structdescr, lo_table TYPE REF TO cl_abap_tabledescr, ldo_data TYPE REF TO data. FIELD-SYMBOLS: TYPE table, . *---------------------------------------------------------------------* * Convert data into floe variables. *---------------------------------------------------------------------* * * Only for Floe CHECK gv_etype IS NOT INITIAL. * Take header data from structure . GET REFERENCE OF INTO ldo_data . lo_struct ?= cl_abap_structdescr=>describe_by_data_ref( ldo_data ). lt_comp = lo_struct->components. * LOOP AT lt_comp INTO ls_comp_a. ASSIGN COMPONENT ls_comp_a-name OF STRUCTURE TO . gs_vars-var_code = ls_comp_a-name. gs_vars-value = . APPEND gs_vars TO gt_vars. ENDLOOP. * * Take item data and schedule line data from table vbdpa. GET REFERENCE OF lt_vbdpr INTO ldo_data . ASSIGN ldo_data->* TO . lo_table ?= cl_abap_structdescr=>describe_by_data_ref( ldo_data ). lo_struct ?= lo_table->get_table_line_type( ). lt_comp = lo_struct->components. * * l_item_num = 0. LOOP AT lt_vbdpr INTO ls_item_detail. * IF sy-tabix EQ 1 OR l_old_posnr NE ls_item_detail-posnr. l_schl_num = 0. l_parent_num = 0. l_item_num = l_item_num + 1. l_row_num = l_item_num. l_old_posnr = ls_item_detail-posnr.. ELSE. * New schedule line l_schl_num = l_schl_num + 1. l_parent_num = l_item_num. l_row_num = l_schl_num. ENDIF. * LOOP AT lt_comp INTO ls_comp_a. ASSIGN COMPONENT ls_comp_a-name OF STRUCTURE ls_item_detail TO . * gs_vars-var_code = ls_comp_a-name. gs_vars-value = . gs_vars-row_num = l_row_num. gs_vars-parent_row_num = l_parent_num. APPEND gs_vars TO gt_vars. ENDLOOP. * ENDLOOP. *---------------------------------------------------------------------* ENDFORM. " get_data *&---------------------------------------------------------------------* *& Form protocol_update *&---------------------------------------------------------------------* FORM protocol_update . CHECK gv_screen_display = gc_false. CALL FUNCTION 'NAST_PROTOCOL_UPDATE' EXPORTING msg_arbgb = sy-msgid msg_nr = sy-msgno msg_ty = sy-msgty msg_v1 = sy-msgv1 msg_v2 = sy-msgv2 msg_v3 = sy-msgv3 msg_v4 = sy-msgv4 EXCEPTIONS OTHERS = 0. ENDFORM. " protocol_update *&---------------------------------------------------------------------* *& Form print_data *&---------------------------------------------------------------------* FORM print_data. DATA: ls_outputparams TYPE sfpoutputparams, ls_docparams TYPE sfpdocparams, lv_form TYPE tdsfname, lv_fm_name TYPE rs38l_fnam, ls_pdf_file TYPE fpformoutput, lv_device TYPE output_device, lv_failed TYPE boole_d, lv_anzal TYPE nast-anzal. "Number of outputs (Orig. + Cop.) lv_form = tnapr-sform. IF tnapr-formtype NE gc_pdf. = 1. MESSAGE e005 WITH -vbeln tnapr-sform INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. *--- Set output parameters PERFORM get_output_params CHANGING ls_outputparams ls_docparams lv_device. CHECK IS INITIAL. IF ls_outputparams-copies EQ 0. lv_anzal = 1. ELSE. lv_anzal = ls_outputparams-copies. ENDIF. ls_outputparams-copies = 1. IF cl_ops_switch_check=>sd_sfws_sc1( ) IS NOT INITIAL. * >>>>> BUNDLING <<<<< ************************************************* * Check for bundling * Import parameter from memory DATA: bundling TYPE char1. CLEAR: bundling. IMPORT bundling FROM MEMORY ID 'BUNDLING'. IF sy-subrc NE 0 OR bundling NE 'X' OR nast-nacha NE '1'. CLEAR: bundling. * Open the spool job CALL FUNCTION 'FP_JOB_OPEN' CHANGING ie_outputparams = ls_outputparams EXCEPTIONS cancel = 1 usage_error = 2 system_error = 3 internal_error = 4 OTHERS = 5. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. ENDIF. * >>>>> BUNDLING <<<<< ************************************************* ELSE. *--- Open the spool job CALL FUNCTION 'FP_JOB_OPEN' CHANGING ie_outputparams = ls_outputparams EXCEPTIONS cancel = 1 usage_error = 2 system_error = 3 internal_error = 4 OTHERS = 5. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. ENDIF. *--- Get the name of the generated function module TRY. CALL FUNCTION 'FP_FUNCTION_MODULE_NAME' EXPORTING i_name = lv_form IMPORTING e_funcname = lv_fm_name. CATCH cx_fp_api_repository cx_fp_api_usage cx_fp_api_internal. = 99. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. RETURN. ENDTRY. IF bd_sd_bil IS BOUND. DO lv_anzal TIMES. IF sy-index NE 1 AND gs_interface-head_detail-repeat NE gc_true. gs_interface-head_detail-repeat = gc_true. ENDIF. * Call BAdI for printing CALL BADI bd_sd_bil->print_data EXPORTING iv_fm_name = lv_fm_name is_interface = gs_interface is_docparams = ls_docparams is_nast = nast IMPORTING es_formoutput = ls_pdf_file EXCEPTIONS error = 1. ENDDO. ELSE. * No BAdI handle: Directly call the function module generated * from according PDF form DO lv_anzal TIMES. IF sy-index NE 1 AND gs_interface-head_detail-repeat NE gc_true. gs_interface-head_detail-repeat = gc_true. ENDIF. CALL FUNCTION lv_fm_name EXPORTING /1bcdwb/docparams = ls_docparams bil_prt_com = gs_interface IMPORTING /1bcdwb/formoutput = ls_pdf_file EXCEPTIONS usage_error = 1 system_error = 2 internal_error = 3 OTHERS = 4. ENDDO. ENDIF. ls_outputparams-copies = lv_anzal. IF NOT sy-subrc IS INITIAL. = sy-subrc. PERFORM protocol_update. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. * Do not directly return but only after closing the spool job lv_failed = abap_true. ENDIF. IF cl_ops_switch_check=>sd_sfws_sc1( ) IS NOT INITIAL. * >>>>> BUNDLING <<<<< ************************************************* IF bundling NE 'X'. * Close the spool job CALL FUNCTION 'FP_JOB_CLOSE' EXCEPTIONS usage_error = 1 system_error = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. = sy-subrc. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. ENDIF. * >>>>> BUNDLING <<<<< ************************************************* ELSE. *--- Close the spool job CALL FUNCTION 'FP_JOB_CLOSE' EXCEPTIONS usage_error = 1 system_error = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. = sy-subrc. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. ENDIF. IF NOT lv_failed IS INITIAL. * Now, leave processing if printing did fail RETURN. ENDIF. *--- Post processing CASE lv_device. WHEN gc_device-fax OR gc_device-email. PERFORM send_data USING lv_device ls_pdf_file. IF ls_outputparams-arcmode <> '1'. CALL FUNCTION 'ARCHIV_CREATE_OUTGOINGDOC_MULT' EXPORTING documentclass = 'PDF' document = ls_pdf_file-pdf TABLES arc_i_tab = ls_docparams-daratab EXCEPTIONS error_archiv = 1 error_communicationtable = 2 error_connectiontable = 3 error_kernel = 4 error_parameter = 5 error_format = 6 OTHERS = 7. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 RAISING system_error. ENDIF. ENDIF. WHEN gc_device-web_dynpro. EXPORT lv_pdf_file = ls_pdf_file-pdf TO MEMORY ID 'PDF_FILE'. ENDCASE. CHECK IS INITIAL. ENDFORM. " print_data *&---------------------------------------------------------------------* *& Form print_data_varo *&---------------------------------------------------------------------* FORM print_data_varo. DATA: ls_outputparams TYPE sfpoutputparams, ls_docparams TYPE sfpdocparams, ls_pdf_file TYPE fpformoutput, lv_device TYPE output_device, lv_failed TYPE boole_d, lv_invoice TYPE char12, ls_fpe TYPE /flm/fpe, lv_anzal TYPE nast-anzal. "Number of outputs (Orig. + Cop.) * *--- Set output parameters PERFORM get_output_params CHANGING ls_outputparams ls_docparams lv_device. CHECK IS INITIAL. IF ls_outputparams-copies EQ 0. lv_anzal = 1. ELSE. lv_anzal = ls_outputparams-copies. ENDIF. ls_outputparams-copies = 1. * Set up defaults lv_ftype = tnapr-sform. lv_template = nast-spras. lv_fver = '00'. lv_doc = nast-objky. lv_invoice = nast-objky. CLEAR lv_reprint. *----------------------------------------------------------------------* * Check for Re-print *----------------------------------------------------------------------* SELECT * INTO ls_nast FROM nast WHERE kappl = gs_nast-kappl AND objky = gs_nast-objky AND kschl = gs_nast-kschl AND spras = gs_nast-spras AND parnr = gs_nast-parnr AND parvw = gs_nast-parvw AND nacha BETWEEN '1' AND '4' AND vstat = '1'. IF gs_nast-aende IS INITIAL. lv_reprint = 'X'. ENDIF. ENDSELECT. * * Find previous output for reprint. * IF lv_reprint = 'X'. * SELECT * FROM /flm/fpe UP TO 1 ROWS INTO ls_fpe WHERE ftype = lv_ftype AND flang = lv_template AND document = lv_doc ORDER BY id DESCENDING. ENDSELECT. * IF sy-subrc EQ 0. * Previous output found * lv_ftype = ls_fpe-ftype. lv_fver = ls_fpe-fver. lv_template = ls_fpe-template. lv_fid = ls_fpe-id. lv_doc = ls_fpe-document. ELSE. * No form found. CLEAR lv_reprint. ENDIF. * ENDIF. *----------------------------------------------------------------------* * Fill variables *----------------------------------------------------------------------* CLEAR ls_variables. ls_variables-var_code = 'REPRINT'. ls_variables-value = lv_reprint. APPEND ls_variables TO lt_variables. CLEAR ls_variables. * ls_variables-var_code = 'KSCHL'. ls_variables-value = gs_nast-kschl. APPEND ls_variables TO lt_variables. CLEAR ls_variables. * ls_variables-var_code = 'SPRAS'. ls_variables-value = gs_nast-spras. APPEND ls_variables TO lt_variables. * * *----------------------------------------------------------------------* * Handle output scenario *----------------------------------------------------------------------* IF gv_screen_display NE gc_true. * IF ls_outputparams-arcmode <> '2'. CALL FUNCTION '/FLM/PDF_PRINT' EXPORTING im_ftype = lv_ftype im_outputparams = ls_outputparams im_toption = lv_template im_fver = lv_fver im_fid = lv_fid im_document = lv_doc im_variables = lt_variables IMPORTING ex_pdf = lv_pdf ex_subrc = ex_mess = ls_mess. *update processing log: CALL FUNCTION 'NAST_PROTOCOL_UPDATE' EXPORTING msg_arbgb = ls_mess-id msg_nr = ls_mess-number msg_ty = ls_mess-type msg_v1 = ls_mess-message_v1 msg_v2 = ls_mess-message_v2 msg_v3 = ls_mess-message_v3 msg_v4 = ls_mess-message_v4 EXCEPTIONS OTHERS = 0. * Drop out if API has thrown an error IF <> 0. RETURN. ENDIF. ELSE. "Just return a PDF for archiving CALL FUNCTION '/FLM/OUTPUT_PDF_PDL_OUT' EXPORTING im_ftype = lv_ftype im_fid = lv_fid im_fver = lv_fver im_toption = lv_template im_document = lv_doc im_variables = lt_variables im_no_print = 'X' * IM_PDLTYPE = * IM_XDCNAME = IMPORTING ex_pdf = lv_pdf ex_subrc = ex_mess = ls_mess. * CALL FUNCTION 'NAST_PROTOCOL_UPDATE' EXPORTING msg_arbgb = ls_mess-id msg_nr = ls_mess-number msg_ty = ls_mess-type msg_v1 = ls_mess-message_v1 msg_v2 = ls_mess-message_v2 msg_v3 = ls_mess-message_v3 msg_v4 = ls_mess-message_v4 EXCEPTIONS OTHERS = 0. * Drop out if API has thrown an error IF <> 0. RETURN. ENDIF. ENDIF. * Handle Archiving IF ls_outputparams-arcmode <> '1'. CALL FUNCTION 'ARCHIV_CREATE_OUTGOINGDOC_MULT' EXPORTING documentclass = 'PDF' document = lv_pdf TABLES arc_i_tab = ls_docparams-daratab EXCEPTIONS error_archiv = 1 error_communicationtable = 2 error_connectiontable = 3 error_kernel = 4 error_parameter = 5 error_format = 6 OTHERS = 7. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 RAISING system_error. ELSE. CALL FUNCTION 'NAST_PROTOCOL_UPDATE' EXPORTING msg_arbgb = '/FLM/TFS' msg_nr = '999' msg_ty = 'I' msg_v1 = 'Document sent to archive' msg_v2 = '' msg_v3 = '' msg_v4 = '' EXCEPTIONS OTHERS = 0. ENDIF. ENDIF. * ELSE. *----------------------------------------------------------------------* * Call screen to preview PDF form *----------------------------------------------------------------------* CALL FUNCTION '/FLM/PREVIEW_OUTPUT_PDF' EXPORTING im_ftype = lv_ftype im_fid = lv_fid im_fver = lv_fver im_toption = lv_template im_document = lv_doc im_variables = lt_variables * IM_DNS_SUB = * IM_HTTPS = IMPORTING ex_subrc = ex_mess = ls_mess. * ENDIF. * ENDFORM. " print_data_varo *&---------------------------------------------------------------------* *& Form send_data_floe *&---------------------------------------------------------------------* FORM send_data_floe. DATA: ls_outputparams TYPE sfpoutputparams, ls_docparams TYPE sfpdocparams, lv_device TYPE output_device, ls_fpe TYPE /flm/fpe, lv_invoice TYPE char12. DATA: lt_mess TYPE bapiret2_t, ls_mess TYPE bapiret2. DATA: ev_ebody TYPE string, et_rec_emails TYPE /floe/rec_email_t, et_attachments TYPE /floe/att_t, ev_esubject_long TYPE /floe/esubject_long, lv_inupd TYPE i, lv_no_commit TYPE flag. * Get output parameters PERFORM get_output_params CHANGING ls_outputparams ls_docparams lv_device. CHECK IS INITIAL. *---------------------------------------------------------------------* * Fill recipient * Add additional recipients in recipient user-exit *---------------------------------------------------------------------* gs_rec_email-email = gs_nast-email_addr. gs_rec_email-type = '1'. APPEND gs_rec_email TO gt_rec_emails. *----------------------------------------------------------------------* * Add variables * Add additional variables in email data user-exit *----------------------------------------------------------------------* CLEAR ls_variables. ls_variables-var_code = 'REPRINT'. ls_variables-value = lv_reprint. APPEND ls_variables TO lt_variables. "Varo APPEND ls_variables TO gt_vars. "Floe * CLEAR ls_variables. ls_variables-var_code = 'KSCHL'. ls_variables-value = gs_nast-kschl. APPEND ls_variables TO lt_variables. "Varo APPEND ls_variables TO gt_vars. "Floe * CLEAR ls_variables. ls_variables-var_code = 'SPRAS'. ls_variables-value = gs_nast-spras. APPEND ls_variables TO lt_variables. "Varo APPEND ls_variables TO gt_vars. "Floe * IF gv_screen_display IS INITIAL. CLEAR ls_variables. ls_variables-var_code = 'FLOE_SEND'. ls_variables-value = 'X'. APPEND ls_variables TO gt_vars. "Floe ENDIF. *---------------------------------------------------------------------* * Add attachment * Add additional attachments in attachment user-exit *---------------------------------------------------------------------* lv_ftype = tnapr-sform. IF lv_ftype IS NOT INITIAL. * Generate PDF attachment with Varo, form type ftype. * * Set up defaults lv_ftype = tnapr-sform. lv_template = nast-spras. lv_fver = '00'. lv_doc = nast-objky. lv_invoice = nast-objky. *----------------------------------------------------------------------* * Check if this is a re-print and set form id *----------------------------------------------------------------------* * Check if this is a re-print and set form id * SELECT * FROM /flm/fpe UP TO 1 ROWS INTO ls_fpe WHERE ftype = lv_ftype AND flang = lv_template AND document = lv_doc ORDER BY id DESCENDING. ENDSELECT. * IF sy-subrc EQ 0 AND gs_nast-aende IS INITIAL. * Previous output found * lv_ftype = ls_fpe-ftype. lv_fver = ls_fpe-fver. lv_template = ls_fpe-template. lv_fid = ls_fpe-id. lv_doc = ls_fpe-document. lv_reprint = 'X'. ENDIF. * IF gv_screen_display IS NOT INITIAL. "+000 *----------------------------------------------------------------------* * Preview the PDF CALL FUNCTION '/FLM/PREVIEW_OUTPUT_PDF' "+000 EXPORTING im_ftype = lv_ftype im_fid = lv_fid im_fver = lv_fver im_toption = lv_template im_document = lv_doc im_variables = lt_variables * IM_DNS_SUB = * IM_HTTPS = IMPORTING ex_subrc = ex_mess = ls_mess. RETURN. * ELSE. "+000 * Call Varo to generate the PDF * CALL FUNCTION '/FLM/OUTPUT_PDF_PDL_OUT' EXPORTING im_ftype = lv_ftype im_fid = lv_fid im_fver = lv_fver im_toption = lv_template im_document = lv_doc im_variables = lt_variables im_no_print = 'X' * IM_PDLTYPE = * IM_XDCNAME = IMPORTING ex_pdf = lv_pdf * EX_PDL = * EX_PAGECOUNT = * EX_JOB_ID = ex_subrc = ex_mess = ls_mess. * * IF <> 0. "-000 CALL FUNCTION 'NAST_PROTOCOL_UPDATE' EXPORTING msg_arbgb = ls_mess-id msg_nr = ls_mess-number msg_ty = ls_mess-type msg_v1 = ls_mess-message_v1 msg_v2 = ls_mess-message_v2 msg_v3 = ls_mess-message_v3 msg_v4 = ls_mess-message_v4 EXCEPTIONS OTHERS = 0. * RETURN. "-000 * ENDIF. "-000 * Get new form id etc. lv_cms_doc = ls_mess-parameter. * CALL METHOD /flm/core=>split_xdp_cms_doc EXPORTING im_cms_doc = lv_cms_doc IMPORTING ex_ccode = lv_ccode ex_ftype = lv_ftype ex_fver = lv_fver ex_flang = lv_template ex_fid = lv_fid ex_fid_var = lv_fidvar. * *------------------------------------------------------------------- * Fill attachment * CONCATENATE 'Invoice_' lv_invoice '.pdf' INTO ls_attach-att_filename. ls_attach-att_description = 'Order_output'. ls_attach-att_data = lv_pdf. APPEND ls_attach TO lt_attach. ENDIF. ENDIF. *------------------------------------------------------------------- * Determine whether this is run as update task * CLEAR: lv_inupd, lv_no_commit. CALL METHOD cl_system_transaction_state=>get_in_update_task RECEIVING in_update_task = lv_inupd. * IF lv_inupd = 1. lv_no_commit = 'X'. ENDIF. * *----------------------------------------------------------------------* * Call Floe API *----------------------------------------------------------------------* CLEAR ev_ebody. * l_im_doc = lv_invoice. * CALL FUNCTION '/FLOE/EMAIL_OUT' EXPORTING im_etype = gv_etype im_elang = gv_language im_document = l_im_doc im_rec_emails = gt_rec_emails im_variables = gt_vars im_send_immediately = 'X' im_attachments = lt_attach im_preview = gv_screen_display im_no_commit = lv_no_commit IMPORTING ex_subrc = ex_ebody = ev_ebody ex_mess = lt_mess ex_rec_emails = et_rec_emails ex_attachments = et_attachments ex_esubject_long = ev_esubject_long. LOOP AT lt_mess INTO ls_mess. CALL FUNCTION 'NAST_PROTOCOL_UPDATE' EXPORTING msg_arbgb = ls_mess-id msg_nr = ls_mess-number msg_ty = ls_mess-type msg_v1 = ls_mess-message_v1 msg_v2 = ls_mess-message_v2 msg_v3 = ls_mess-message_v3 msg_v4 = ls_mess-message_v4 EXCEPTIONS OTHERS = 0. ENDLOOP. * * Drop out if API has thrown an error IF NE 0. RETURN. ENDIF. * *----------------------------------------------------------------------* * Preview Email if required. *----------------------------------------------------------------------* IF NOT gv_screen_display IS INITIAL. CALL FUNCTION '/FLOE/EMAIL_VIEWER' EXPORTING im_preview = 'X' * IM_ETYPE = * IM_EID = im_esubject = 'FLOE Preview' im_ebody = ev_ebody im_rec_emails = et_rec_emails im_attachments = et_attachments IMPORTING ex_subrc = . ENDIF. ENDFORM. " send_data_floe *&---------------------------------------------------------------------* *& Form get_item_details *&---------------------------------------------------------------------* FORM get_item_details USING ut_vbdpr TYPE tbl_vbdpr. DATA: ls_dd07v TYPE dd07v, ls_text TYPE tline, ls_item_detail TYPE invoice_s_prt_item_detail. FIELD-SYMBOLS: TYPE vbdpr, TYPE invoice_s_prt_item_detail. CALL FUNCTION 'DD_DOMVALUES_GET' EXPORTING domname = 'VBTYPL' text = gc_true langu = gv_language TABLES dd07v_tab = gt_vbtyp_fix_values EXCEPTIONS wrong_textflag = 1 OTHERS = 2. IF sy-subrc <> 0. = sy-subrc. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. LOOP AT ut_vbdpr ASSIGNING . CLEAR ls_item_detail. * Clearing items (Verrechnungspositionen) will be printed only in * down payment requests IF ( -fktyp EQ 'P' ) OR ( -fktyp NE 'P' AND -fareg NA '45' ). *--- Fill the VBDPR structure ls_item_detail-vbdpr = . *--- Get the type text of the reference document IF NOT ls_item_detail-vbdpr-vbeln_vg2 IS INITIAL. READ TABLE gt_vbtyp_fix_values INTO ls_dd07v WITH KEY domvalue_l = ls_item_detail-vbdpr-vgtyp. IF sy-subrc IS INITIAL. ls_item_detail-vgtyp_text = ls_dd07v-ddtext. ENDIF. ENDIF. *--- Get the item prices PERFORM get_item_prices CHANGING ls_item_detail. IF <> 0. RETURN. ENDIF. *--- Get configurations PERFORM get_item_characteristics CHANGING ls_item_detail. IF <> 0. RETURN. ENDIF. IF bd_sd_bil IS BOUND. * Call BAdI concerning item details CALL BADI bd_sd_bil->get_item_details EXPORTING is_vbdkr = is_nast = nast iv_language = gv_language CHANGING cs_item_detail = ls_item_detail. ENDIF. APPEND ls_item_detail TO gs_interface-item_detail. ELSEIF ( -fktyp NE 'P' AND -fareg CA '45' ). *--- Get downpayment data PERFORM get_item_downpayment USING . IF <> 0. RETURN. ENDIF. ENDIF. ENDLOOP. ENDFORM. " get_item_details *&---------------------------------------------------------------------* *& Form get_item_prices *&---------------------------------------------------------------------* FORM get_item_prices CHANGING cs_item_detail TYPE invoice_s_prt_item_detail. DATA: ls_komp TYPE komp, ls_komvd TYPE komvd, lv_lines TYPE i. DATA: ro_print TYPE REF TO cl_tm_invoice, lv_sim_flag TYPE boolean, lt_tax_items TYPE komvd_t, ls_tax_items TYPE komvd. *--- Fill the communication structure IF gs_komk-knumv NE -knumv OR gs_komk-knumv IS INITIAL. CLEAR gs_komk. gs_komk-mandt = sy-mandt. gs_komk-fkart = -fkart. gs_komk-kalsm = -kalsm. gs_komk-kappl = gc_pr_kappl. gs_komk-waerk = -waerk. gs_komk-knumv = -knumv. gs_komk-knuma = -knuma. gs_komk-vbtyp = -vbtyp. gs_komk-land1 = -land1. gs_komk-vkorg = -vkorg. gs_komk-vtweg = -vtweg. gs_komk-spart = -spart. gs_komk-bukrs = -bukrs. gs_komk-hwaer = -waers. gs_komk-prsdt = -erdat. gs_komk-kurst = -kurst. gs_komk-kurrf = -kurrf. gs_komk-kurrf_dat = -kurrf_dat. ENDIF. ls_komp-kposn = cs_item_detail-vbdpr-posnr. ls_komp-kursk = cs_item_detail-vbdpr-kursk. ls_komp-kursk_dat = cs_item_detail-vbdpr-kursk_dat. IF cl_sd_doc_category_util=>is_any_retour( -vbtyp ). IF cs_item_detail-vbdpr-shkzg CA ' A'. ls_komp-shkzg = gc_true. ENDIF. ELSE. IF cs_item_detail-vbdpr-shkzg CA 'BX'. ls_komp-shkzg = gc_true. ENDIF. ENDIF. IF bd_sd_bil IS BOUND. * BAdI CALL BADI bd_sd_bil->prepare_item_prices EXPORTING is_vbdkr = iv_language = gv_language is_item_detail = cs_item_detail is_nast = nast CHANGING cs_komp = ls_komp cs_komk = gs_komk. ENDIF. *--- Get the item prices * ERP TM Integration IF cl_ops_switch_check=>aci_sfws_sc_erptms_ii( ) EQ abap_true. ro_print = cl_tm_invoice=>get_instance( ). lv_sim_flag = ro_print->get_simulation_flag( ). IF lv_sim_flag IS INITIAL. IF gv_price_print_mode EQ 'A'. CALL FUNCTION 'RV_PRICE_PRINT_ITEM' EXPORTING comm_head_i = gs_komk comm_item_i = ls_komp language = gv_language IMPORTING comm_head_e = gs_komk comm_item_e = ls_komp TABLES tkomv = gt_komv tkomvd = cs_item_detail-conditions. ELSE. CALL FUNCTION 'RV_PRICE_PRINT_ITEM_BUFFER' EXPORTING comm_head_i = gs_komk comm_item_i = ls_komp language = gv_language IMPORTING comm_head_e = gs_komk comm_item_e = ls_komp TABLES tkomv = gt_komv tkomvd = cs_item_detail-conditions. ENDIF. DELETE cs_item_detail-conditions WHERE kbetr IS INITIAL. ELSE. lt_tax_items = cl_tm_invoice=>gt_tax_items. LOOP AT lt_tax_items INTO ls_tax_items WHERE kposn = cs_item_detail-vbdpr-posnr. APPEND ls_tax_items TO cs_item_detail-conditions. ENDLOOP. IF NOT cs_item_detail-conditions IS INITIAL. cs_item_detail-ex_conditions = gc_true. ENDIF. ENDIF. ELSE. IF gv_price_print_mode EQ 'A'. CALL FUNCTION 'RV_PRICE_PRINT_ITEM' EXPORTING comm_head_i = gs_komk comm_item_i = ls_komp language = gv_language IMPORTING comm_head_e = gs_komk comm_item_e = ls_komp TABLES tkomv = gt_komv tkomvd = cs_item_detail-conditions. ELSE. CALL FUNCTION 'RV_PRICE_PRINT_ITEM_BUFFER' EXPORTING comm_head_i = gs_komk comm_item_i = ls_komp language = gv_language IMPORTING comm_head_e = gs_komk comm_item_e = ls_komp TABLES tkomv = gt_komv tkomvd = cs_item_detail-conditions. ENDIF. ENDIF. IF NOT cs_item_detail-conditions IS INITIAL. * The conditions have always one initial line DESCRIBE TABLE cs_item_detail-conditions LINES lv_lines. IF lv_lines EQ 1. READ TABLE cs_item_detail-conditions INTO ls_komvd INDEX 1. IF NOT ls_komvd IS INITIAL. cs_item_detail-ex_conditions = gc_true. ENDIF. ELSE. cs_item_detail-ex_conditions = gc_true. ENDIF. ENDIF. *--- Fill the tax code CALL FUNCTION 'SD_TAX_CODE_MAINTAIN' EXPORTING key_knumv = gs_komk-knumv key_kposn = ls_komp-kposn i_application = ' ' i_pricing_procedure = gs_komk-kalsm TABLES xkomv = gt_komv. ENDFORM. " get_item_prices *&---------------------------------------------------------------------* *& Form get_head_details *&---------------------------------------------------------------------* FORM get_head_details. *--- Get Sales Org detail PERFORM get_head_tvko. CHECK IS INITIAL. *--- Get Campany Code texts in case of cross company PERFORM get_head_comp_code_texts. CHECK IS INITIAL. *--- Get header prices PERFORM get_head_prices. CHECK IS INITIAL. *--- Get dynamic texts PERFORM get_head_text. CHECK IS INITIAL. *--- Get sending country PERFORM get_head_sending_country. CHECK IS INITIAL. *--- Check repeat printout PERFORM get_head_repeat_flag. CHECK IS INITIAL. *--- Get Payment_split PERFORM get_payment_split. CHECK IS INITIAL. *--- Get Downpayment PERFORM get_head_downpayment. CHECK IS INITIAL. *--- Get Payment Cards PERFORM get_head_paymentcards. CHECK IS INITIAL. *--- SD SEPA: Get Mandate details INCLUDE sd_sepa_faktura_004_pdf. *--- SD SEPA IF bd_sd_bil IS BOUND. * BAdI CALL BADI bd_sd_bil->get_head_details EXPORTING iv_language = gv_language is_nast = nast CHANGING cs_interface = gs_interface. ENDIF. ENDFORM. " get_head_details *&---------------------------------------------------------------------* *& Form get_head_repeat_flag *&---------------------------------------------------------------------* FORM get_head_repeat_flag. DATA: lv_nast TYPE nast. SELECT SINGLE * INTO lv_nast FROM nast WHERE kappl = gs_nast-kappl "#EC * AND objky = gs_nast-objky AND kschl = gs_nast-kschl AND spras = gs_nast-spras AND parnr = gs_nast-parnr AND parvw = gs_nast-parvw AND nacha BETWEEN '1' AND '5' AND vstat = '1'. IF sy-subrc IS INITIAL. gs_interface-head_detail-repeat = gc_true. ENDIF. ENDFORM. " get_head_repeat_flag *&---------------------------------------------------------------------* *& Form get_head_sending_country *&---------------------------------------------------------------------* FORM get_head_sending_country. DATA: ls_address TYPE sdpartner_address. CHECK -sland IS INITIAL. CALL FUNCTION 'SD_ADDRESS_GET' EXPORTING fif_address_number = gs_interface-head_detail-tvko-adrnr fif_address_type = '1' IMPORTING fes_sdpartner_address = ls_address EXCEPTIONS address_not_found = 1 address_type_not_exists = 2 no_person_number = 3 OTHERS = 4. IF sy-subrc IS INITIAL. -sland = ls_address-country. ELSE. = sy-subrc. MESSAGE e004 WITH -vbeln gs_interface-head_detail-tvko-vkorg INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. ENDFORM. " get_head_sending_country *&---------------------------------------------------------------------* *& Form get_head_text *&---------------------------------------------------------------------* FORM get_head_text. DATA: ls_dd07v TYPE dd07v. *--- VBDKR-VBTYP READ TABLE gt_vbtyp_fix_values INTO ls_dd07v WITH KEY domvalue_l = -vbtyp . IF sy-subrc IS INITIAL. gs_interface-head_detail-vbtyp_text = ls_dd07v-ddtext. ENDIF. *--- VBDKR-VGTYP IF NOT -vbeln_vg2 IS INITIAL. READ TABLE gt_vbtyp_fix_values INTO ls_dd07v WITH KEY domvalue_l = -vgtyp. IF sy-subrc IS INITIAL. gs_interface-head_detail-vgtyp_text = ls_dd07v-ddtext. ENDIF. ENDIF. *--- Header and Footer Text IF gs_interface-head_detail-vbdkr-vbtyp = if_sd_doc_category=>intercompany_invoice OR gs_interface-head_detail-vbdkr-vbtyp = if_sd_doc_category=>intercompany_credit_memo. gs_interface-head_detail-head_tdname = gs_interface-head_detail-t001g-txtko. gs_interface-head_detail-head_tdobject = 'TEXT'. gs_interface-head_detail-head_tdid = 'ADRS'. gs_interface-head_detail-foot_tdname = gs_interface-head_detail-t001g-txtfu. gs_interface-head_detail-foot_tdobject = 'TEXT'. gs_interface-head_detail-foot_tdid = 'ADRS'. ELSE. gs_interface-head_detail-head_tdname = gs_interface-head_detail-tvko-txnam_kop. gs_interface-head_detail-head_tdobject = 'TEXT'. gs_interface-head_detail-head_tdid = 'ADRS'. gs_interface-head_detail-foot_tdname = gs_interface-head_detail-tvko-txnam_fus. gs_interface-head_detail-foot_tdobject = 'TEXT'. gs_interface-head_detail-foot_tdid = 'ADRS'. ENDIF. ENDFORM. " get_head_text *&---------------------------------------------------------------------* *& Form get_item_characteristics *&---------------------------------------------------------------------* FORM get_item_characteristics CHANGING cs_item_detail TYPE invoice_s_prt_item_detail. DATA: lt_conf TYPE TABLE OF conf_out, ls_conf TYPE conf_out, lt_cabn TYPE TABLE OF cabn, ls_cabn TYPE cabn. RANGES: lr_cabn FOR ls_cabn-atinn. * Check appropriate config exists CHECK NOT cs_item_detail-vbdpr-cuobj IS INITIAL AND cs_item_detail-vbdpr-attyp NE '02'. CALL FUNCTION 'VC_I_GET_CONFIGURATION' EXPORTING instance = cs_item_detail-vbdpr-cuobj language = gv_language print_sales = gc_true TABLES configuration = lt_conf EXCEPTIONS OTHERS = 4. IF sy-subrc <> 0. = sy-subrc. MESSAGE e001 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. IF NOT lt_conf IS INITIAL. LOOP AT lt_conf INTO ls_conf. lr_cabn-option = gc_equal. lr_cabn-sign = gc_include. lr_cabn-low = ls_conf-atinn. COLLECT lr_cabn. ENDLOOP. CALL FUNCTION 'CLSE_SELECT_CABN' TABLES in_cabn = lr_cabn t_cabn = lt_cabn EXCEPTIONS no_entry_found = 1 OTHERS = 2. IF sy-subrc <> 0. = sy-subrc. MESSAGE e001 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. SORT lt_cabn BY atinn. LOOP AT lt_conf INTO ls_conf. READ TABLE lt_cabn INTO ls_cabn WITH KEY atinn = ls_conf-atinn BINARY SEARCH. IF sy-subrc <> 0 OR ( ls_cabn-attab = 'SDCOM' AND ls_cabn-atfel = 'VKOND' ) OR ls_cabn-attab = 'VCSD_UPDATE'. DELETE lt_conf. ENDIF. ENDLOOP. cs_item_detail-configuration = lt_conf. IF NOT cs_item_detail-configuration IS INITIAL. cs_item_detail-ex_configuration = gc_true. ENDIF. ENDIF. ENDFORM. " get_item_characteristics *&---------------------------------------------------------------------* *& Form GET_head_PRICES *&---------------------------------------------------------------------* FORM get_head_prices. DATA: ro_print TYPE REF TO cl_tm_invoice, lv_sim_flag TYPE boolean, lt_tax_header TYPE komvd_t. * BAdI IF bd_sd_bil IS BOUND. CALL BADI bd_sd_bil->prepare_head_prices EXPORTING is_interface = gs_interface iv_language = gv_language is_nast = nast CHANGING cs_komk = gs_komk. ENDIF. * ERP TM Integration IF cl_ops_switch_check=>aci_sfws_sc_erptms_ii( ) EQ abap_true. ro_print = cl_tm_invoice=>get_instance( ). lv_sim_flag = ro_print->get_simulation_flag( ). IF lv_sim_flag IS INITIAL. IF gv_price_print_mode EQ 'A'. CALL FUNCTION 'RV_PRICE_PRINT_HEAD' EXPORTING comm_head_i = gs_komk language = gv_language IMPORTING comm_head_e = gs_komk TABLES tkomv = gt_komv tkomvd = gs_interface-head_detail-conditions. ELSE. CALL FUNCTION 'RV_PRICE_PRINT_HEAD_BUFFER' EXPORTING comm_head_i = gs_komk language = gv_language IMPORTING comm_head_e = gs_komk TABLES tkomv = gt_komv tkomvd = gs_interface-head_detail-conditions. ENDIF. ELSE. lt_tax_header = cl_tm_invoice=>gt_tax_header. IF lt_tax_header IS NOT INITIAL. gs_interface-head_detail-conditions = lt_tax_header. ENDIF. gs_interface-head_detail-gross_value = cl_tm_invoice=>gv_total_amount. ENDIF. ELSE. IF gv_price_print_mode EQ 'A'. CALL FUNCTION 'RV_PRICE_PRINT_HEAD' EXPORTING comm_head_i = gs_komk language = gv_language IMPORTING comm_head_e = gs_komk TABLES tkomv = gt_komv tkomvd = gs_interface-head_detail-conditions. ELSE. CALL FUNCTION 'RV_PRICE_PRINT_HEAD_BUFFER' EXPORTING comm_head_i = gs_komk language = gv_language IMPORTING comm_head_e = gs_komk TABLES tkomv = gt_komv tkomvd = gs_interface-head_detail-conditions. ENDIF. ENDIF. * Fill gross value gs_interface-head_detail-doc_currency = gs_komk-waerk. IF gs_interface-head_detail-gross_value IS INITIAL. gs_interface-head_detail-gross_value = gs_komk-fkwrt. ENDIF. IF gs_interface-head_detail-supos IS INITIAL. gs_interface-head_detail-supos = gs_komk-supos. ENDIF. IF NOT gs_interface-head_detail-conditions IS INITIAL. gs_interface-head_detail-ex_conditions = gc_true. ENDIF. ENDFORM. " GET_head_PRICES *&---------------------------------------------------------------------* *& Form get_head_tvko *&---------------------------------------------------------------------* FORM get_head_tvko. CALL FUNCTION 'TVKO_SINGLE_READ' EXPORTING vkorg = -vkorg IMPORTING wtvko = gs_interface-head_detail-tvko EXCEPTIONS not_found = 1 OTHERS = 2. IF sy-subrc <> 0. = sy-subrc. MESSAGE e003 WITH -vbeln -vkorg INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. ENDFORM. " get_tvko *&---------------------------------------------------------------------* *& Form get_head_comp_code_texts *&---------------------------------------------------------------------* FORM get_head_comp_code_texts. STATICS ss_t001g TYPE t001g. CHECK -vbtyp = if_sd_doc_category=>intercompany_invoice OR -vbtyp = if_sd_doc_category=>intercompany_credit_memo. IF ss_t001g-bukrs NE -bukrs. SELECT SINGLE * FROM t001g INTO ss_t001g WHERE bukrs EQ -bukrs AND programm EQ sy-repid AND txtid EQ 'SD'. IF sy-subrc <> 0. = sy-subrc. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. RETURN. ENDIF. ENDIF. gs_interface-head_detail-t001g = ss_t001g. ENDFORM. " get_t001g *&---------------------------------------------------------------------* *& Form send_data *&---------------------------------------------------------------------* FORM send_data USING uv_device TYPE output_device us_pdf_file TYPE fpformoutput. DATA: lv_date(14) TYPE c, lv_mail_subject TYPE so_obj_des, lt_mail_text TYPE bcsy_text, lv_send_to_all TYPE os_boolean, lt_adsmtp TYPE TABLE OF adsmtp, ls_adsmtp TYPE adsmtp, lt_adfax TYPE TABLE OF adfax, ls_adfax TYPE adfax, ls_address TYPE sdprt_addr_s, lv_vbeln TYPE vbeln, *output control badi change ls_enh_flag TYPE char1, ls_email_rcp TYPE smtp_sd_sls_addr_s, ls_email_sendr TYPE smtp_sd_sls_addr_s, lo_cl_bcs TYPE REF TO cl_bcs, ls_file_attribs TYPE file_attributes_s, lo_badi_mapper TYPE REF TO badi_sd_obj_mapper, lt_email_addr TYPE adr6_tt, lo_badi_sls_email TYPE REF TO badi_sd_sls_email. CHECK gv_screen_display NE gc_true. *--- Determine the subject text lv_mail_subject = gs_nast-tdcovtitle. IF lv_mail_subject = space. WRITE -fkdat TO lv_date. WRITE -vbeln TO lv_vbeln NO-ZERO. * Type, number, date CONCATENATE gs_interface-head_detail-vbtyp_text lv_vbeln lv_date INTO lv_mail_subject SEPARATED BY space. ENDIF. CASE uv_device. WHEN gc_device-email. *o/p contrl badi enhancement TRY. GET BADI lo_badi_sls_email FILTERS sd_email_progs = if_sd_email_process_constant=>invoice_print01. IF lo_badi_sls_email IS BOUND. IF lo_badi_sls_email->imps IS NOT INITIAL. ls_enh_flag = abap_true. ENDIF. ENDIF. *Catch not implemented exception or multiple implementation CATCH cx_badi_not_implemented. ls_enh_flag = abap_false. CLEAR lo_badi_sls_email. ENDTRY. *end of o/p contrl badi enhancement *--- Get the e-mail-text PERFORM get_mail_body CHANGING lt_mail_text. CHECK IS INITIAL. *--- Get the e-mail address of the recipient ls_address-recip_email_addr = gs_nast-email_addr. *--- Get the e-mail address of the sender * Try to get the e-mail of the sales org. * Otherwise takes the user's e-mail CALL FUNCTION 'ADDR_COMM_GET' EXPORTING address_number = gs_interface-head_detail-tvko-adrnr language = gv_language table_type = 'ADSMTP' TABLES comm_table = lt_adsmtp EXCEPTIONS parameter_error = 1 address_not_exist = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. READ TABLE lt_adsmtp INTO ls_adsmtp WITH KEY flgdefault = gc_true. IF sy-subrc IS INITIAL. ls_address-sender_email_addr = ls_adsmtp-smtp_addr. ENDIF. WHEN gc_device-fax. *--- Get the e-mail address of the recipient ls_address-recip_fax_country = gs_nast-tland. ls_address-recip_fax_number = gs_nast-telfx(30). *--- Get the fax address of the sender * Try to get the fax address of the sales org. * Otherwise takes the user's CALL FUNCTION 'ADDR_COMM_GET' EXPORTING address_number = gs_interface-head_detail-tvko-adrnr language = gv_language table_type = 'ADFAX' TABLES comm_table = lt_adfax EXCEPTIONS parameter_error = 1 address_not_exist = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. READ TABLE lt_adfax INTO ls_adfax WITH KEY flgdefault = gc_true. IF sy-subrc IS INITIAL. ls_address-sender_fax_country = ls_adfax-country. ls_address-sender_fax_number = ls_adfax-fax_number. ENDIF. ENDCASE. * o/p control badi call IF ls_enh_flag EQ abap_true. IF lo_badi_sls_email IS BOUND. TRY. * get Badi handle for obj mapper * filters any filters implement here GET BADI lo_badi_mapper FILTERS sd_process_filter = if_sd_email_process_constant=>invoice_print01. * Catch not implemented exception or multiple implementation CATCH cx_badi_not_implemented. CLEAR lo_badi_mapper. ENDTRY. IF lo_badi_mapper IS BOUND. IF lo_badi_mapper->imps IS NOT INITIAL. CALL BADI lo_badi_mapper->set_sd_inv_to_generic EXPORTING is_inv_details = gs_interface. * Call BAdI for modify email details CALL BADI lo_badi_sls_email->set_mapper EXPORTING io_mapper = lo_badi_mapper->imp. IF sy-subrc <> 0. RETURN. ENDIF. ENDIF. ENDIF. ls_email_sendr-email_addr = ls_address-sender_email_addr. * move default rcp address to badi impl ls_email_rcp-email_addr = ls_address-recip_email_addr. INCLUDE send_data_remove_default IF FOUND. CALL BADI lo_badi_sls_email->modify_email EXPORTING iv_language = gv_language is_email_rcp = ls_email_rcp is_email_sendr = ls_email_sendr CHANGING io_cl_bcs = lo_cl_bcs EXCEPTIONS exc_send_req_bcs = 1 exc_address_bcs = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. = 99. RETURN. ENDIF. INCLUDE send_data_add_email_badi IF FOUND. * add Exceptions for process document method and check response. ls_file_attribs-pdf_file = us_pdf_file. CALL BADI lo_badi_sls_email->process_document EXPORTING iv_language = gv_language iv_text = lt_mail_text iv_subject = lv_mail_subject is_file_attribs = ls_file_attribs CHANGING io_cl_bcs = lo_cl_bcs EXCEPTIONS exc_send_req_bcs = 1 exc_document_bcs = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. = 99. RETURN. ENDIF. * Send Document CALL BADI lo_badi_sls_email->send_document EXPORTING io_cl_bcs = lo_cl_bcs CHANGING ev_send_to_all = lv_send_to_all EXCEPTIONS exc_send_req_bcs = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. = 99. RETURN. ENDIF. IF lv_send_to_all = gc_true. * Write success message into log MESSAGE i022(so) INTO gv_dummy. PERFORM protocol_update. ELSE. * Write fail message into log MESSAGE i023(so) WITH -vbeln INTO gv_dummy. PERFORM protocol_update. ENDIF. ENDIF. * end of o/p contrl badi call. continue old way in else. ELSE. CALL FUNCTION 'SD_PDF_SEND_DATA' EXPORTING iv_device = uv_device iv_email_subject = lv_mail_subject it_email_text = lt_mail_text is_main_data = us_pdf_file iv_language = gv_language is_address = ls_address iv_nast = nast IMPORTING ev_send_to_all = lv_send_to_all EXCEPTIONS exc_document = 1 exc_send_request = 2 exc_address = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE e000 WITH -vbeln INTO gv_dummy. PERFORM protocol_update. = 99. RETURN. ENDIF. IF lv_send_to_all = gc_true. MESSAGE i022(so) INTO gv_dummy. PERFORM protocol_update. ELSE. MESSAGE i023(so) WITH -vbeln INTO gv_dummy. PERFORM protocol_update. ENDIF. ENDIF. ENDFORM. " send_data *&---------------------------------------------------------------------* *& Form get_output_params *&---------------------------------------------------------------------* FORM get_output_params CHANGING cs_outputparams TYPE sfpoutputparams cs_docparams TYPE sfpdocparams cv_device TYPE output_device. DATA: lv_comm_type TYPE ad_comm, ls_comm_values TYPE szadr_comm_values. CASE gs_nast-nacha. WHEN gc_nacha-external_send. IF NOT gs_nast-tcode IS INITIAL. CALL FUNCTION 'ADDR_GET_NEXT_COMM_TYPE' EXPORTING strategy = gs_nast-tcode address_type = -address_type address_number = -adrnr person_number = -adrnp IMPORTING comm_type = lv_comm_type comm_values = ls_comm_values EXCEPTIONS address_not_exist = 1 person_not_exist = 2 no_comm_type_found = 3 internal_error = 4 parameter_error = 5 OTHERS = 6. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. CASE lv_comm_type. WHEN 'INT'. "e-mail cs_outputparams-getpdf = gc_true. cv_device = gc_device-email. gs_nast-email_addr = ls_comm_values-adsmtp-smtp_addr. WHEN 'FAX'. cs_outputparams-getpdf = gc_true. cv_device = gc_device-fax. gs_nast-telfx = ls_comm_values-adfax-fax_number. gs_nast-tland = ls_comm_values-adfax-country. WHEN 'LET'. "Printer cv_device = gc_device-printer. ENDCASE. ELSE. cv_device = gc_device-printer. ENDIF. WHEN gc_nacha-printer. cv_device = gc_device-printer. WHEN gc_nacha-fax. cs_outputparams-getpdf = gc_true. cv_device = gc_device-fax. ENDCASE. * The original document should be printed only once IF NOT gv_screen_display IS INITIAL AND gs_interface-head_detail-repeat EQ gc_false. cs_outputparams-noprint = gc_true. cs_outputparams-nopributt = gc_true. cs_outputparams-noarchive = gc_true. ENDIF. IF gv_screen_display = 'X'. cs_outputparams-getpdf = gc_false. cs_outputparams-preview = gc_true. ELSEIF gv_screen_display = 'W'. "Web dynpro cs_outputparams-getpdf = gc_true. cv_device = gc_device-web_dynpro. ENDIF. cs_outputparams-nodialog = gc_true. cs_outputparams-dest = gs_nast-ldest. cs_outputparams-copies = gs_nast-anzal. cs_outputparams-dataset = gs_nast-dsnam. cs_outputparams-suffix1 = gs_nast-dsuf1. cs_outputparams-suffix2 = gs_nast-dsuf2. cs_outputparams-cover = gs_nast-tdocover. cs_outputparams-covtitle = gs_nast-tdcovtitle. cs_outputparams-authority = gs_nast-tdautority. cs_outputparams-receiver = gs_nast-tdreceiver. cs_outputparams-division = gs_nast-tddivision. cs_outputparams-arcmode = gs_nast-tdarmod. cs_outputparams-reqimm = gs_nast-dimme. cs_outputparams-reqdel = gs_nast-delet. cs_outputparams-senddate = gs_nast-vsdat. cs_outputparams-sendtime = gs_nast-vsura. *--- Set language and default language cs_docparams-langu = gv_language. cs_docparams-replangu1 = -spras_vko. cs_docparams-replangu2 = gc_english. cs_docparams-country = -land1. * Archiving APPEND toa_dara TO cs_docparams-daratab. ENDFORM. " get_output_params *&---------------------------------------------------------------------* *& Form get_mail_body *&---------------------------------------------------------------------* FORM get_mail_body CHANGING ct_mail_text TYPE bcsy_text. DATA: ls_options TYPE itcpo, lt_lines TYPE TABLE OF tline, lt_otfdata TYPE TABLE OF itcoo. CHECK NOT tnapr-fonam IS INITIAL. ls_options-tdgetotf = gc_true. ls_options-tddest = gs_nast-ldest. ls_options-tdprogram = tnapr-pgnam. vbdkr = . komk = gs_komk. tvko = gs_interface-head_detail-tvko. CALL FUNCTION 'OPEN_FORM' EXPORTING dialog = ' ' form = tnapr-fonam language = gv_language options = ls_options EXCEPTIONS canceled = 1 device = 2 form = 3 options = 4 unclosed = 5 mail_options = 6 archive_error = 7 invalid_fax_number = 8 more_params_needed_in_batch = 9 spool_error = 10 codepage = 11 OTHERS = 12. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. CALL FUNCTION 'WRITE_FORM' EXPORTING element = 'MAIL_BODY' EXCEPTIONS element = 1 function = 2 type = 3 unopened = 4 unstarted = 5 window = 6 bad_pageformat_for_print = 7 spool_error = 8 codepage = 9 OTHERS = 10. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. CALL FUNCTION 'CLOSE_FORM' TABLES otfdata = lt_otfdata EXCEPTIONS unopened = 1 bad_pageformat_for_print = 2 send_error = 3 spool_error = 4 codepage = 5 OTHERS = 6. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. CALL FUNCTION 'CONVERT_OTF' TABLES otf = lt_otfdata lines = lt_lines EXCEPTIONS err_max_linewidth = 1 err_format = 2 err_conv_not_possible = 3 err_bad_otf = 4 OTHERS = 5. IF sy-subrc <> 0. = sy-subrc. PERFORM protocol_update. RETURN. ENDIF. CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT' EXPORTING language = gv_language TABLES itf_text = lt_lines text_stream = ct_mail_text. ENDFORM. " get_mail_body *&---------------------------------------------------------------------* *& Form get_item_downpayment *&---------------------------------------------------------------------* FORM get_item_downpayment USING us_vbdpr TYPE vbdpr. DATA: lv_xfilkd TYPE xfilkd_vf, ls_sdaccdpc_doc TYPE vbeln_posnr_s. CHECK -fktyp NE 'P'. CHECK us_vbdpr-fareg CA '45'. * Can there be a head office? CASE -xfilkd. * Ordering party WHEN 'A'. IF -knkli IS INITIAL OR -knkli EQ -kunag. lv_xfilkd = -xfilkd. ENDIF. * Payer WHEN 'B'. lv_xfilkd = -xfilkd. ENDCASE. * Remember the headno and itemno IF NOT us_vbdpr-vbelv IS INITIAL. ls_sdaccdpc_doc-vbeln = us_vbdpr-vbelv. ls_sdaccdpc_doc-posnr = us_vbdpr-posnv. ELSE. ls_sdaccdpc_doc-vbeln = us_vbdpr-vbeln_vauf. ls_sdaccdpc_doc-posnr = us_vbdpr-posnr_vauf. ENDIF. APPEND ls_sdaccdpc_doc TO gt_sdaccdpc_doc. CALL FUNCTION 'SD_DOWNPAYMENT_READ' EXPORTING i_waerk = -waerk i_bukrs = -bukrs i_kunnr = -kunrg i_vbel2 = ls_sdaccdpc_doc-vbeln i_vbeln = -vbeln i_sfakn = -sfakn i_xfilkd = lv_xfilkd i_gesanz = gc_true TABLES t_sdaccdpc = gt_sdaccdpc CHANGING c_downpay_refresh = gv_downpay_refresh EXCEPTIONS no_downpayments = 1 in_downpayments = 2 OTHERS = 3. ENDFORM. " get_item_downpayment *&---------------------------------------------------------------------* *& Form get_head_downpayment *&---------------------------------------------------------------------* FORM get_head_downpayment . DATA: ls_sdaccdpc TYPE sdaccdpc. SORT gt_sdaccdpc_doc BY vbeln posnr. DELETE ADJACENT DUPLICATES FROM gt_sdaccdpc_doc. LOOP AT gt_sdaccdpc INTO ls_sdaccdpc. READ TABLE gt_sdaccdpc_doc WITH KEY vbeln = ls_sdaccdpc-vgbel posnr = ls_sdaccdpc-vgpos BINARY SEARCH TRANSPORTING NO FIELDS. IF NOT sy-subrc IS INITIAL. DELETE gt_sdaccdpc. ENDIF. ENDLOOP. IF NOT -dpval IS INITIAL. -dpend = gs_interface-head_detail-gross_value. SUBTRACT -dpval FROM -dpend. -dpmws_end = -mwsbk - -dpmws. ENDIF. gs_interface-head_detail-down_payments = gt_sdaccdpc. IF NOT gs_interface-head_detail-down_payments IS INITIAL. gs_interface-head_detail-ex_down_payments = gc_true. ENDIF. ENDFORM. " get_head_downpayment *&---------------------------------------------------------------------* *& Form initialize_data *&---------------------------------------------------------------------* FORM initialize_data . CLEAR: gs_interface, gv_screen_display, gv_price_print_mode, gt_komv, gs_komk, gt_vbtyp_fix_values, gv_language, gv_dummy, gt_sdaccdpc_doc, gt_sdaccdpc, gs_nast, gv_downpay_refresh, . * BAdI IF bd_sd_bil IS BOUND. CALL BADI bd_sd_bil->initialize_data. ENDIF. ENDFORM. " initialize_data *&---------------------------------------------------------------------* *& Form get_head_paymentcards *&---------------------------------------------------------------------* FORM get_head_paymentcards. DATA: lt_fplt TYPE TABLE OF fpltvb, ls_fplt TYPE fpltvb, ls_payment_cards TYPE bil_s_prt_payment_cards. STATICS: ss_tvcint TYPE tvcint. CHECK NOT -rplnr IS INITIAL. * Read from the Database CALL FUNCTION 'BILLING_SCHEDULE_READ' EXPORTING fplnr = -rplnr TABLES zfplt = lt_fplt EXCEPTIONS error_message = 0 OTHERS = 0. * Loop at Cards LOOP AT lt_fplt INTO ls_fplt. ls_payment_cards = ls_fplt. * Get text IF ls_fplt-ccins NE ss_tvcint-ccins. SELECT SINGLE * FROM tvcint INTO ss_tvcint WHERE spras = gv_language AND ccins = ls_fplt-ccins. IF sy-subrc = 0. ls_payment_cards-description = ss_tvcint-vtext. ELSE. ls_payment_cards-description = ls_fplt-ccins. ENDIF. ELSE. ls_payment_cards-description = ss_tvcint-vtext. ENDIF. APPEND ls_payment_cards TO gs_interface-head_detail-payment_cards. ADD ls_fplt-fakwr TO -ccval. ENDLOOP. IF NOT gs_interface-head_detail-payment_cards IS INITIAL. gs_interface-head_detail-ex_payment_cards = gc_true. ENDIF. ENDFORM. " get_paymentcards *&---------------------------------------------------------------------* *& Form GET_PAYMENT_SPLIT *&---------------------------------------------------------------------* FORM get_payment_split . DATA: h_skfbt LIKE acccr-skfbt. DATA: h_fkdat LIKE -fkdat. DATA: h_fkwrt LIKE acccr-wrbtr. DATA : BEGIN OF payment_split OCCURS 3. INCLUDE STRUCTURE vtopis. DATA : END OF payment_split. DATA ls_payment_split TYPE bil_s_prt_payment_split. CHECK -zterm NE space. h_skfbt = -skfbk. h_fkwrt = gs_komk-fkwrt. h_fkdat = -fkdat. IF -valdt NE 0. h_fkdat = -valdt. ENDIF. IF -valtg NE 0. h_fkdat = -fkdat + -valtg. ENDIF. CALL FUNCTION 'SD_PRINT_TERMS_OF_PAYMENT_SPLI' EXPORTING i_country = -land1 bldat = h_fkdat budat = h_fkdat cpudt = h_fkdat language = gv_language terms_of_payment = -zterm wert = h_fkwrt "Warenwert + Tax waerk = -waerk fkdat = -fkdat skfbt = h_skfbt i_company_code = -bukrs TABLES top_text_split = payment_split EXCEPTIONS terms_of_payment_not_in_t052 = 01 terms_of_payment_not_in_t052s = 02. LOOP AT payment_split. MOVE payment_split-line TO ls_payment_split-line. APPEND ls_payment_split TO gs_interface-head_detail-payment_split. ENDLOOP. IF NOT gs_interface-head_detail-payment_split IS INITIAL. gs_interface-head_detail-ex_payment_split = gc_true. ENDIF. ENDFORM. "PAYMENT_SPLIT