Monday, November 17, 2025

Sending mail to vendor with attachment

 class  ExportPaymAdviceRptViaEmailService extends SysOperationServiceBase 

  

    VendTrans               vendTrans; 

    LedgerJournalTrans      LedgerJournalTrans; 

    str                     subject,messageBody; 

    SysEmailSystemTable           sysEmailTable; 

    public void printReport( ExportPaymAdviceRptViaEmailContract _contract) 

    { 

        FromDate                    fromDate    = _contract.parmFromDate(); 

        ToDate                      toDate      = _contract.parmToDate(); 

        VendAccount                 vendAccount = _contract.parmVendAccount(); 

        QueryBuildDataSource        vendTrans_Ds,vendSettlement_DS; 

        Query                       query = new Query(); 

  

        vendTrans_Ds = query.addDataSource(TableNum(VendTrans)); 

        vendTrans_Ds.addRange(fieldNum(VendTrans, TransType)).value(SysQuery::value(LedgerTransType::Payment)); 

        vendTrans_Ds.addRange(fieldNum(VendTrans,  IsEmailSent)).value(SysQuery::value(NoYes::No)); 

       // vendTrans_Ds.addRange(fieldNum(VendTrans, Voucher)).value('T-VPV-0038801'); 

        if (fromDate && toDate) 

        { 

            vendTrans_Ds.addRange(fieldNum(VendTrans, TransDate)).value(queryRange(fromDate,toDate)); 

        } 

        if (vendAccount) 

        { 

            vendTrans_Ds.addRange(fieldNum(VendTrans, AccountNum)).value(SysQuery::value(vendAccount)); 

        } 

        vendSettlement_DS = vendTrans_Ds.addDataSource(TableNum(VendSettlement)); 

        vendSettlement_DS.relations(true); 

        vendSettlement_DS.joinMode(JoinMode::ExistsJoin); 

  

        QueryRun    qr = new QueryRun (query); 

        while (qr.next()) 

        { 

            vendTrans = qr.get(tableNum(vendTrans)); 

            try 

            { 

                LedgerJournalTrans = LedgerJournalTrans::find(vendTrans.JournalNum,vendTrans.Voucher,false); 

                if (LedgerJournalTrans.RecId != 0) 

                { 

                    this.getReport(); 

                } 

                else 

                { 

                    warning ("Transaction is not available."); 

                } 

            } 

            catch 

            { 

                continue; 

            } 

        } 

         

        

    } 

  

    public void getReport() 

    { 

        Filename                             fileName = "PaymentAdviceReport.Pdf"; 

        SrsReportRunController               controller = new SrsReportRunController(); 

        BankPaymAdviceContract               contract = new BankPaymAdviceContract(); 

        SRSPrintDestinationSettings          settings; 

        Array                                arrayFiles; 

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

        SRSProxy                             srsProxy; 

        SRSReportRunService                  srsReportRunService = new SrsReportRunService(); 

        DimensionAttributeValueCombination   dimensionAttributeValueCombination; 

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

        Map                                  reportParametersMap; 

        SRSReportExecutionInfo               executionInfo = new SRSReportExecutionInfo(); 

  

        contract.parmAccountNum(vendtrans.AccountNum); 

        contract.parmLedgerJournalId(LedgerJournalTrans.JournalNum); 

        contract.parmLedgerJournalTransRecId(LedgerJournalTrans.RecId); 

        contract.parmPaymentStatus(CustVendPaymStatus::Sent); 

        contract.parmPaymMode(LedgerJournalTrans.PaymMode); 

        select DISPLAYVALUE from dimensionAttributeValueCombination  

            where dimensionAttributeValueCombination.RECID == LedgerJournalTrans.OffsetLedgerDimension; 

  

        contract.parmCompanyBankAccountId(dimensionAttributeValueCombination.DisplayValue); 

        controller.parmArgs(new Args()); 

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

        controller.parmShowDialog(false); 

        controller.parmLoadFromSysLastValue(false); 

        controller.parmReportContract().parmRdpContract(contract); 

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

        settings.printMediumType(SRSPrintMediumType::File); 

        settings.fileName(fileName); 

        settings.fileFormat(SRSReportFileFormat::PDF); 

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

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

                                                        parameterValueArray, 

                                                        settings.fileFormat(), 

                                                        settings.deviceinfo()); 

        container               binData; 

        Binary                  binaryData; 

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

        binaryData = Binary::constructFromMemoryStream(mstream); 

        if(binaryData) 

        { 

            binData = binaryData.getContainer(); 

        } 

        System.Byte[]       binData1; 

        System.IO.Stream    stream1; 

        for(int i = 0; i < conLen(binData); i++) 

        { 

            binData1 = conPeek(binData,i+1); 

            stream1  = new System.IO.MemoryStream(binData1); 

        } 

        VendTable  vendTable = vendTable::find(vendTrans.AccountNum); 

        if (vendTable.email() != '') 

        { 

            this.InsertIntoMap(); 

            this.sendEmail(vendTable.email(),"Payment advice report",stream1,fileName); 

        } 

        else 

        { 

            warning (strFmt("Email address is missing for vendor - %1"),vendTable.AccountNum); 

        } 

         

    } 

  

    private void sendEmail(Description _emailTo, Description _Subject,System.IO.MemoryStream attachmentStream,FileName _filename) 

    { 

        if (attachmentStream != null) 

        { 

            var         user = xUserInfo::find(); 

          //  var         sysUser = SysUserInfo::find(user.id); 

          //  var         userEmail = sysUser.getSendAsEmail(user); 

            Map         sysMailers = SysMailerFactory::getMailers(); 

            str         sendTo = _emailTo; 

            var         tempTo = new System.Net.Mail.MailAddress(sendTo); 

            String255   emails; 

             ActualVendorTable  ActualVendorTable; 

            container   conEmails; 

            int i; 

            select * from  ActualVendorTable; 

            emails =  ActualVendorTable.CCEmail; 

            conEmails = str2con(emails,';'); 

            if (tempTo.ToString() != sendTo) 

            { 

               warning("Email address is invalid."); 

            } 

            var     messageBuilder = new SysMailerMessageBuilder(); 

            for (i=1;i<=conLen(conEmails);i++) 

            { 

                messageBuilder.addCc(conPeek(conEmails,i)); 

            } 

            messageBuilder.addTo(sendTo); 

            messageBuilder.setSubject(subject); 

            messageBuilder.setBody(messageBody); 

            messageBuilder.setFrom(sysEmailTable.SenderAddr); 

  

            var message = messageBuilder.getMessage(); 

            messageBuilder.addAttachment(attachmentStream,'payment.pdf'); 

  

            boolean     messageSent; 

            SysIMailer  mailer; 

            SysMailerSMTP smtp = new SysMailerSMTP(); 

            mailer = sysMailers.lookup('SMTP'); 

  

            if (mailer is SysIMailerNonInteractive) 

            { 

                SysIMailerNonInteractive nonInteractiveMailer = mailer; 

                messageSent = nonInteractiveMailer.sendNonInteractive(messageBuilder.getMessage()); 

            } 

            else if (mailer is SysIMailerInteractive) 

            { 

                SysIMailerInteractive interactiveMailer = mailer; 

                messageSent = interactiveMailer.sendInteractive(messageBuilder.getMessage()); 

            } 

            if (messageSent) 

            { 

                VendTrans     vendTransLoc; 

  

                select firstonly vendTransLoc  

                    where vendTransLoc.RecId == vendTrans.RecId; 

                if (vendTransLoc.remainAmountMST() == 0) 

                { 

                    ttsbegin; 

                    vendTransLoc.selectForUpdate(true); 

                    vendTransLoc. IsEmailSent = 1; 

                    vendTransLoc.update(); 

                    ttscommit; 

  

                } 

            

            } 

        } 

        else 

        { 

            warning("File is empty."); 

        } 

    } 

  

    public void InsertIntoMap() 

    { 

        Map                     placeholderMap = new Map(Types::String, Types::AnyType); 

        

        SysEmailMessagesystemTable    messageTable; 

        placeholderMap.insert("Vendor Name",VendTable::find(vendTrans.AccountNum).name()); 

        placeholderMap.insert("Payment voucher",vendTrans.Voucher); 

        sysEmailTable = SysEmailSystemTable::find('PaymAdvice'); 

        select firstonly messageTable 

            where messageTable.EmailId == sysEmailTable.EmailId; 

  

        subject     = messageTable.Subject; 

        messageBody = messageTable.Mail; 

        messageBody = SysEmailMessage::stringExpand(messageBody, placeholderMap); 

       // return messageBody; 

    } 

  

 


No comments:

Post a Comment