Thursday, July 20, 2023

How to send SalesPackingSlip report over the email to Customer in D365FO using X++ code

Generate Sales Packing Slip Report and Email It

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 Image

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();
        }
    }
}

    

Step 4: Result in email

Step 4 Image

No comments:

Post a Comment

How to access extension class method on data entity field property

How to Use Extension Class Methods on Field Properties of Data Entity How to Use Extension Class Methods on Fie...