send email using sysoutgoing in D365 fo x++

 class DSASendReportAsEmailAttachmentServiceclass extends SysOperationServiceBase

{

    

    Map           mappings = new Map(Types::String,Types::String);

    //Args          _args;



    public void process()

    {

        custTable     custTable;


        while select custTable  

        where custTable.AccountNum == '10-30001'

        {

            this.generateAndSendCustStatementReport(custTable.AccountNum);

        }

    }


    public void generateAndSendCustStatementReport(CustAccount  _custAccount)

    {

        //Set  variables

        custTable                       custTable;

        Array                           arrayFiles;

        SRSProxy                        srsProxy;

        Map                             reportParametersMap;

        SRSPrintDestinationSettings     settings;

        SrsReportRunController          formLetterController = ZACustStatementReportController::construct();

        ZACustStatementReportController      controller = formLetterController;

        ZACustStatementReportContract   contract = new ZACustStatementReportContract();

        System.Byte[]                   reportBytes = new System.Byte[0]();

        SRSReportRunService             srsReportRunService = new SrsReportRunService();

        SRSReportExecutionInfo          executionInfo = new SRSReportExecutionInfo();

        TransDate                       _fromDate, _toDate;

        SysEmailRecipients              recipientEmailAddr;


        Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray;

        

        

        Filename    fileName  =  _custAccount + '.pdf';


        ////Get FromDate & ToDate

        _fromDate = this.templatePeriod();

        _toDate =  today();


        //set the report contract parameters

        contract.parmFromDate(_fromDate);

        contract.parmToDate(_toDate);

        contract.parmCustAccount(_custAccount);



        //set the report controller parameters & set report name and design name

        //controller.parmArgs(_args);

        controller.parmReportName(ssrsReportStr(ZACustStatementReport, Report));

        controller.parmShowDialog(false);

        controller.parmLoadFromSysLastValue(false);

        controller.parmReportContract().parmRdpContract(contract);


        // Provide printer settings

        settings = controller.parmReportContract().parmPrintSettings();

        settings.printMediumType(SRSPrintMediumType::File);

        settings.fileName(fileName);

        settings.fileFormat(SRSReportFileFormat::PDF);


        // Below is a part of code responsible for rendering the report

        controller.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());

        controller.parmReportContract().parmReportExecutionInfo(executionInfo);

        srsReportRunService.getReportDataContract(controller.parmreportcontract().parmReportName());

        srsReportRunService.preRunReport(controller.parmreportcontract());

        reportParametersMap = srsReportRunService.createParamMapFromContract(controller.parmReportContract());

        parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);

        srsProxy = SRSProxy::constructWithConfiguration(controller.parmReportContract().parmReportServerConfig());


        // Actual rendering to byte array

        reportBytes = srsproxy.renderReportToByteArray(controller.parmreportcontract().parmreportpath(),

                                                        parameterValueArray,

                                                        settings.fileFormat(),

                                                        settings.deviceinfo());


        // You can also convert the report Bytes into an xpp BinData object if needed

        container binData;

        Binary binaryData;

        System.IO.MemoryStream mstream = new System.IO.MemoryStream(reportBytes);

        binaryData = Binary::constructFromMemoryStream(mstream);


        if (binaryData)

        {

            binData = binaryData.getContainer();

        }


        


        Email mail = this.getEmail(_custAccount);


        if(mail)

        {

            //Getting recipient Email Address

            recipientEmailAddr = mail;


            //Inserting Data into Map

            this.populateEmailMessageMap(_custAccount);


            //Send email using sysoutgoing email

            this.sendEmailWithAttachment(binData, fileName, recipientEmailAddr);

        }

        else

        {

            throw error("Mail Not Found!");

        }

        

    }


    /// <summary>

    /// sendEmailWithAttachment using sysoutgoing email table

    /// </summary>

    /// <param name = "_binData">container</param>

    /// <param name = "_fileName">str</param>

    /// <param name = "_recipientEmailAddr">SysEmailRecipients</param>

    public void sendEmailWithAttachment(container _binData, str _fileName, SysEmailRecipients _recipientEmailAddr)

    {

        DSNotificationEmailTemplate     DSNotificationEmailTemplate;

        SysEmailItemId                  nextEmailItemId;

        SysEmailContents                sysEmailContents;

        SysOutgoingEmailTable           outgoingEmailTable;

        SysOutgoingEmailData            outgoingEmailData;

        str                             subject;

        Filename                        fileExtension = ".pdf";


        

        [DSNotificationEmailTemplate, subject, sysEmailContents] = this.getEmailTemplateDetails();


        if (DSNotificationEmailTemplate.RecId > 0)

        {

            nextEmailItemId  = EventInbox::nextEventId();

      

     

            outgoingEmailTable.clear();

            outgoingEmailTable.Origin                       = DSNotificationEmailTemplate.TemplateId;

            outgoingEmailTable.EmailItemId                  = nextEmailItemId;

            outgoingEmailTable.IsSystemEmail                = NoYes::Yes;

            outgoingEmailTable.Sender                       = SysUserInfo::find(curUserId()).Email;

            outgoingEmailTable.SenderName                   = SysUserInfo::find(curUserId()).Id;

            outgoingEmailTable.Recipient                    = _recipientEmailAddr;

            outgoingEmailTable.Subject                      = subject;

            outgoingEmailTable.Priority                     = eMailPriority::High;

            outgoingEmailTable.WithRetries                  = NoYes::No;

            outgoingEmailTable.RetryNum                     = 0;

            outgoingEmailTable.UserId                       = curUserId();

            outgoingEmailTable.Status                       = SysEmailStatus::Unsent;

            outgoingEmailTable.Message                      =  sysEmailContents;

            outgoingEmailTable.LatestStatusChangeDateTime   = DateTimeUtil::getSystemDateTime();

            outgoingEmailTable.TemplateId                   = DSNotificationEmailTemplate.TemplateId;

            outgoingEmailTable.insert();


            if (conLen(_binData) > 0)

            {

                outgoingEmailData.clear();

                outgoingEmailData.EmailItemId               = nextEmailItemId;

                outgoingEmailData.DataId                    = 1;

                outgoingEmailData.EmailDataType             = SysEmailDataType::Attachment;

                outgoingEmailData.Data                      = _binData;

                outgoingEmailData.FileName                  = _filename;

                outgoingEmailData.FileExtension             = fileExtension;

                outgoingEmailData.insert();

            }

        }

        

    }


    /// <summary>

    /// getEmailTemplateDetails

    /// </summary>

    /// <returns>container</returns>

    private container getEmailTemplateDetails()

    {

        DSNotificationSendingTemplate   DSNotificationSendingTemplate;

        DSNotificationEmailTemplate     DSNotificationEmailTemplate;

        DSNotifications                 DSNotifications;

        DSHRGroup                       DSHRGroup;

        DSHRGroupWorkers                DSHRGroupWorkers;

        SysEmailContents                sysEmailContents;

        str                             subject;


        


        select DSNotifications


            join DSNotificationSendingTemplate

            where DSNotificationSendingTemplate.NotificationType == DSNotifications.NotificationType

            && DSNotificationSendingTemplate.NotificationType == DSNotificationType::ZACustStatementReport


            join DSNotificationEmailTemplate

            where DSNotificationSendingTemplate.TemplateId == DSNotificationEmailTemplate.TEMPLATEID


            join DSHRGroup

            where DSNotificationSendingTemplate.NotificationWorkerGroup == DSHRGroup.RecId


            join DSHRGroupWorkers

            where DSHRGroupWorkers.RefRecId == DSHRGroup.RecId;


        subject = SysEmailMessage::stringExpand(DSNotificationEmailTemplate.mailSubject, mappings);

        sysEmailContents =  SysEmailMessage::stringExpand(DSNotificationEmailTemplate.mailBody, mappings);


        return [DSNotificationEmailTemplate, subject, sysEmailContents];

    }


    private LogisticsElectronicAddressLocator getEmail(CustAccount  _custAccount)

    {

        LogisticsElectronicAddress  logisticsElectronicAddress;

        HcmWorker                   hcmWorker;

        DirPerson                   dirPerson;

        DirPartyTable               dirPartyTable;


        CustTable custTable = custTable::find(_custAccount);


        select hcmWorker

        where hcmWorker.RecId == custTable.MainContactWorker

        join dirPerson

        where dirPerson.RecId == hcmWorker.Person

        join dirPartyTable

        where dirPartyTable.RecId == dirPerson.RecId

        join logisticsElectronicAddress

        where dirPartyTable.PrimaryContactEmail == logisticsElectronicAddress.RecId;


        return logisticsElectronicAddress.Locator;

    }


    private Email getCustResMail(CustAccount  _custAccount)

    {

        CustTable custTable = custTable::find(_custAccount);

        Email mail = HcmWorker::findByPerson(custTable.MainContactWorker).email();


        return mail;

    }


    private TransDate templatePeriod()

    {

        DSNotifications DSNotifications;

        TransDate       TransDate;


        select DSNotifications

            where DSNotifications.NotificationType == DSNotificationType::ZACustStatementReport;


        if(DSNotifications.DSATimePeriodEnum == DSATimePeriodEnum::LastWeek)

        {

            TransDate = systemDateGet() -7;

        }

        else if(DSNotifications.DSATimePeriodEnum == DSATimePeriodEnum::LastMonth)

        {

            TransDate = prevMth(systemDateGet());

        }


        return TransDate;


    }


    /// <summary>

    /// populate map for email place holders

    /// </summary>

    private void populateEmailMessageMap(CustAccount  _custAccount )

    {

        custTable   custTable = CustTable::find(_custAccount);


        while select custTable

        {

            mappings.insert("custAccount", strFmt("%1", custTable.AccountNum));

            mappings.insert("Customer", strFmt("%1", custTable.name()));


        }

    }


}

Comments

Popular posts from this blog

step 20 Update script for service model: AOSService on machine: CR-VM-Test-1

To bypass table level field validation on data entity in x++