Hi All,
In this blog we are going to learn about how to generate a Sales Packing Slip report and send it to the customer's primary email address.
Step 1: Create a new class
internal final class TestPackingSlipJournalExportService
{
SRSCatalogItemName reportDesignLocal;
str documentTitle;
System.IO.MemoryStream reportMemoryStream;
SRSPrintMediumType printMedium;
LanguageId languageId;
System.Byte[] reportBytes;
public static TestPackingSlipJournalExportService construct(SRSPrintMediumType _printMedium)
{
TestPackingSlipJournalExportService service = new TestPackingSlipJournalExportService();
service.parmPrintMedium(_printMedium);
return service;
}
public SRSPrintMediumType parmPrintMedium(SRSPrintMediumType _printMedium = printMedium)
{
printMedium = _printMedium;
return printMedium;
}
/// Export packing slip journal.
public System.Byte[] exportPackingSlipJournal(RecId _custPackingSlipJourRecId, str _fileName)
{
SalesPackingSlipContract salesPackingSlipContract;
SalesPackingSlipController formLetterController = SalesPackingSlipController::construct();
CustPackingSlipJour custPackingSlipJour = CustPackingSlipJour::findRecId(_custPackingSlipJourRecId);
Common printMgmtReferencedTable;
FormLetterReport formLetterReport;
PrintMgmtPrintSettingDetail printSettingDetail;
SalesTable salesTable = custPackingSlipJour.salesTable();
PrintMgmtReportFormatName printMgmtReportFormatName = PrintMgmtDocType::construct(PrintMgmtDocumentType::SalesOrderPackingSlip).getDefaultReportFormat();
reportDesignLocal = printMgmtReportFormatName;
if (!reportDesignLocal)
{
reportDesignLocal = ssrsReportStr(SalesPackingSlip, Report);
}
formLetterReport = FormLetterReport::construct(PrintMgmtDocumentType::SalesOrderPackingSlip);
// Determine where to start looking for Print Mgmt settings
printMgmtReferencedTable = salesTable;
languageId = salesTable.LanguageId ? salesTable.LanguageId : custPackingSlipJour.LanguageId;
formLetterReport.loadPrintSettings(custPackingSlipJour, printMgmtReferencedTable, custPackingSlipJour.LanguageId);
if (formLetterReport.moveNextPrintSetting())
{
printSettingDetail = formLetterReport.getCurrentPrintSetting();
formLetterReport.parmReportRun().loadSettingDetail(printSettingDetail);
}
formLetterReport.parmPrintType(PrintCopyOriginal::Original);
salesPackingSlipContract = new SalesPackingSlipContract();
salesPackingSlipContract.parmRecordId(custPackingSlipJour.RecId);
salesPackingSlipContract.parmTableId(custPackingSlipJour.TableId);
salesPackingSlipContract.parmDocumentTitle("@ExtendedItallianLocalization:DeliveryNote");
this.generateReport(salesPackingSlipContract, _fileName);
return this.getReportBytes();
}
private void generateReport(Object _rdpContract, str _fileName)
{
SrsReportRunController srsReportRunController = new SrsReportRunController();
srsReportRunController.parmReportName(reportDesignLocal);
srsReportRunController.parmExecutionMode(SysOperationExecutionMode::Synchronous);
srsReportRunController.parmShowDialog(false);
srsReportRunController.parmReportContract().parmRdpContract(_rdpContract);
if (languageId)
{
srsReportRunController.parmReportContract().parmRdlContract().parmLanguageId(languageId);
srsReportRunController.parmReportContract().parmRdlContract().parmLabelLanguageId(languageId);
}
srsReportRunController.parmReportContract().parmReportExecutionInfo(new SRSReportExecutionInfo());
srsReportRunController.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());
SRSPrintDestinationSettings printerSettings = srsReportRunController.parmReportContract().parmPrintSettings();
printerSettings.printMediumType(printMedium);
printerSettings.fileFormat(SRSReportFileFormat::PDF);
printerSettings.parmFileName(_fileName);
printerSettings.overwriteFile(true);
SRSReportRunService srsReportRunService = new SRSReportRunService();
srsReportRunService.getReportDataContract(srsReportRunController.parmReportContract().parmReportName());
srsReportRunService.preRunReport(srsReportRunController.parmReportContract());
Map reportParametersMap = srsReportRunService.createParamMapFromContract(srsReportRunController.parmReportContract());
Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);
SRSProxy srsProxy = SRSProxy::constructWithConfiguration(srsReportRunController.parmReportContract().parmReportServerConfig());
// Actual rendering to byte array
reportBytes = srsProxy.renderReportToByteArray(srsReportRunController.parmreportcontract().parmreportpath(), parameterValueArray, printerSettings.fileFormat(), printerSettings.deviceinfo());
}
public System.Byte[] getReportBytes()
{
return reportBytes;
}
}
Step 2: Call the above-created class and get the report bytes
Step 3: Convert the report byte into a stream and pass it as an attachment to the email
You can get the following 3 parameters like below:
- CustPackingSlipJour = CustPackingSlipJour::findRecId(_custPackingSlipJourRecId);
- Email = CustPackingSlipJour.salesTable().customerEmail();
- FileName = "Test.pdf"
public static void sendPackingSlipByEmail(CustPackingSlipJour _custPackingSlipJour, Email _ToEmail, Filename _fileName)
{
TestPackingSlipJournalExportService service = TestPackingSlipJournalExportService::construct(SRSPrintMediumType::File);
System.Byte[] reportBytes = service.exportPackingSlipJournal(_custPackingSlipJour.RecId, _fileName);
if (reportBytes)
{
SysMailerMessageBuilder messageBuilder = new SysMailerMessageBuilder();
try
{
System.IO.Stream stream = new System.IO.MemoryStream(reportBytes);
stream.Position = 0;
messageBuilder.setBody("Packing Slip id - " + _custPackingSlipJour.PackingSlipId);
messageBuilder.setSubject("Packing slip journal confirmation");
messageBuilder.addTo(_ToEmail);
messageBuilder.addAttachment(stream, _fileName);
messageBuilder.setFrom('no-reply@Test.com');
SysMailerFactory::sendNonInteractive(messageBuilder.getMessage());
}
catch
{
exceptionTextFallThrough();
}
}
}