In this requirement, we need to generate a Docentric report for salesInvoice report and send the report as a email attachment using the SysEmailTemplates. Here is the X++ code to generate a Docentric report stream and send it as email attachment.
internal final class DaxSendDocCentricInvoiceReport { #PrintMgmtSetup public static void printSalesInvoiceToMemory(CustInvoiceJour _custInvoiceJour) { SalesInvoiceController salesInvoiceController; SalesInvoiceContract salesInvoiceContract; Args args = new Args(); CustInvoiceJour custInvoiceJour; SalesInvoiceJournalPrint salesInvoiceJournalPrint; // select custInvoiceJour where custInvoiceJour.SalesId != ''; // Add record to be printed. // In order to have the context table we need to set args.record(). args.record(_custInvoiceJour); salesInvoiceController = SalesInvoiceController::construct(); salesInvoiceController.parmReportName( PrintMgmtDocType::construct(PrintMgmtDocumentType::SalesOrderInvoice).getDefaultReportFormat()); salesInvoiceContract = salesInvoiceController.parmReportContract().parmRdpContract(); salesInvoiceContract.parmCountryRegionISOCode(SysCountryRegionCode::countryInfo()); salesInvoiceController.parmArgs(args); salesInvoiceController.parmExecutionMode(SysOperationExecutionMode::Synchronous); SRSPrintDestinationSettings pds = salesInvoiceController.parmReportContract().parmPrintSettings(); pds.printMediumType(SRSPrintMediumType::Memory_DC); //PrintMgmtPrintContext printContext = new PrintMgmtPrintContext(); //PrintMgmtPrintDestinationTokens destinationTokens = SrsPrintDestinationTokens::constructByTokenType(#SRSPrintDestinationTokenPrintMgmt); //destinationTokens.parmPrintContext(printContext); //destinationTokens.replace(pds); // Use the default Docentric design. pds.parmMemoryPrintDestSettings_DC().parmOutputFileFormat(DocOutputFileFormat::PDF); pds.parmMemoryPrintDestSettings_DC().parmUseSsrsBuiltInDesign(false); pds.parmSrsPrintReportSettings_DC().setProperty_PrintSrsOriginalDesign(false); /* Uncomment this code if you want to use the original SSRS design instead */ //pds.parmMemoryPrintDestSettings_DC().parmOutputFileFormatSrs(SRSReportFileFormat::PDF); //pds.parmMemoryPrintDestSettings_DC().parmUseSsrsBuiltInDesign(true); //pds.parmSrsPrintReportSettings_DC().setProperty_PrintSrsOriginalDesign(true); // Initalize SalesInvoiceJournalPrint class instance because there is no other way // NOT to use Print Management. salesInvoiceJournalPrint = SalesInvoiceJournalPrint::construct(); salesInvoiceJournalPrint.parmPrintFormletter(NoYes::Yes); salesInvoiceJournalPrint.parmUsePrintManagement(false); salesInvoiceJournalPrint.parmUseUserDefinedDestinations(true); salesInvoiceJournalPrint.parmPrinterSettingsFormLetter(salesInvoiceController.parmReportContract().parmPrintSettings().pack()); args.caller(salesInvoiceJournalPrint); args.parmEnumType(enumNum(PrintCopyOriginal)); args.parmEnum(PrintCopyOriginal::OriginalPrint); /* Collect the result of the execution */ // Register event handler to the RenderingComplete event. salesInvoiceController.renderingCompleted += eventhandler(DaxSendDocCentricInvoiceReport::printSalesInvoiceToMemory_renderingComplete); // Start the report execution. salesInvoiceController.parmShowDialog(false); salesInvoiceController.startOperation(); } public static void printSalesInvoiceToMemory_renderingComplete(SrsReportRunController _sender, SrsRenderingCompletedEventArgs _eventArgs) { // Get the report execution info. DocReportExecutionInfo reportExecutionInfo = _eventArgs.parmReportExecutionInfo().parmReportExecutionInfo_DC(); DocPrintReportToMemoryExecutionInfo printDestMemoryExecutionInfo = reportExecutionInfo.parmPrintToMemoryExecutionInfo(); // Use the report content, e.g. upload it to Azure Blob storage. using (System.IO.MemoryStream reportMemoryStream = printDestMemoryExecutionInfo.getReportContentAsMemoryStream()) { // File::SendFileToUser(reportMemoryStream, "TestInvoice.PDF"); PROSendDocCentricInvoiceReport::sendInvoiceByEmail(_eventArgs.parmArgs().record(), "thirupathi.gandi@protivitiGlobal.in", reportMemoryStream ); // DocAzureBlobHelper::uploadBlob('docentric-report-output', 'TestInvoice.pdf', reportMemoryStream); } // Do something else with the report content, e.g. send it to a web service... } public static void sendInvoiceByEmail(CustInvoiceJour _custInvoiceJour, Email _ToEmail, System.IO.MemoryStream _reportStream ) { SysEmailParameters sysEmailParameters = SysEmailParameters::find(); #define.SMTP('SMTP') Map sysMailers = SysMailerFactory::getMailers(); SysEmailSystemTable SysEmailSystemTable = SysEmailSystemTable::find("SalesInv"); SysEmailMessageSystemTable SysEmailMessageSystemTable = SysEmailMessageSystemTable::find("SalesInv",SysEmailSystemTable.DefaultLanguage); str messageBody = SysEmailMessageSystemTable.Mail; str subject = SysEmailMessageSystemTable.Subject + '' + _custInvoiceJour.InvoiceID; if (SysEmailMessageSystemTable) { SysMailerMessageBuilder messageBuilder = new SysMailerMessageBuilder(); try { messageBuilder.setBody(messageBody); messageBuilder.setSubject(subject); messageBuilder.addTo(_ToEmail); messageBuilder.addCc("thiruvaroon555@gmail.com"); messageBuilder.addAttachment(_reportStream, strFmt("Sales Invoice %1.PDF", _custInvoiceJour.InvoiceId)); messageBuilder.setFrom(sysEmailParameters.SMTPUserName); SysMailerFactory::sendNonInteractive(messageBuilder.getMessage()); } catch { exceptionTextFallThrough(); } } else { throw error("Please verify the email template for SalesInvoice"); } }
Thanks!!
No comments:
Post a Comment