using Microsoft.Dynamics.ApplicationPlatform.Environment; class CPLDevCapexUtility { //---------------------Vendor Approval Notification----------------------------------- public static void sendFinanceForVendorApprovalNotification1(UserId _usrId, AccountNum _vendor) { SystemNotificationDataContract notification = new SystemNotificationDataContract(); notification.Users().value(1, _usrId); notification.Title("Vendor Approved"); notification.RuleId('ExcelStaticExport'); notification.Message(strFmt("%1 new vendor has added, please approved.", _vendor)); notification.ExpirationDateTime(DateTimeUtil::addHours(DateTimeUtil::utcNow(), 72)); ////// Set up the action associated with the notification ////SystemNotificationActionDataContract action = new SystemNotificationActionDataContract(); ////action.Message("Click to download"); ////action.Type(SystemNotificationActionType::AxActionMenuFunction); ////SystemNotificationMenuFunctionDataContract actionData = new SystemNotificationMenuFunctionDataContract(); ////actionData.MenuItemName(menuItemActionStr(ExportToExcelStaticOpenFileAction)); ////actionData.Data(fileName); ////action.Data(FormJsonSerializer::serializeClass(actionData)); ////notification.Actions().value(1, action); SystemNotificationsManager::AddSystemNotification(notification); } public static void sendFinanceForVendorApprovalEmail(UserId _usrId, AccountNum _vendor) { //SysEmailTable sysEmailTable; SysEmailParameters sysEmailParameters = SysEmailParameters::find(); //SysUserInfo userInfo = SysUserInfo::find(_usrId, false); UserInfo userInfo; select * from userInfo where userInfo.Id==_usrId; var messageBuilder = new SysMailerMessageBuilder(); //select firstonly sysEmailTable; //if(userInfo.Email) if(userInfo.networkAlias) { messageBuilder.setFrom(sysEmailParameters.SMTPUserName); // messageBuilder.addTo(userInfo.Email); messageBuilder.addTo(userInfo.networkAlias); //messageBuilder.addCc("cc@example.com"); //messageBuilder.addBcc("bcc@example.com"); messageBuilder.setSubject("New Vendor added, need to approve"); messageBuilder.setBody(strFmt('%1 new vendor is added, please approve the vendor.', _vendor, curUserId())); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage()); } } //---------------------Vendor Approval Notification End----------------------------------- //---------------------Vendor Approved Notification----------------------------------- public static void sendVendorApprovalNotification1(UserId _usrId, AccountNum _vendor) { SystemNotificationDataContract notification = new SystemNotificationDataContract(); notification.Users().value(1, _usrId); notification.Title("Vendor Approved"); notification.RuleId('ExcelStaticExport'); notification.Message(strFmt("%1 vendor has approved by finance team", _vendor)); notification.ExpirationDateTime(DateTimeUtil::addHours(DateTimeUtil::utcNow(), 72)); //// Set up the action associated with the notification //SystemNotificationActionDataContract action = new SystemNotificationActionDataContract(); //action.Message("Click to download"); //action.Type(SystemNotificationActionType::AxActionMenuFunction); //SystemNotificationMenuFunctionDataContract actionData = new SystemNotificationMenuFunctionDataContract(); //actionData.MenuItemName(menuItemActionStr(ExportToExcelStaticOpenFileAction)); //actionData.Data(fileName); //action.Data(FormJsonSerializer::serializeClass(actionData)); //notification.Actions().value(1, action); SystemNotificationsManager::AddSystemNotification(notification); } public static void sendVendorApprovalEmail(UserId _usrId, AccountNum _vendor) { //SysEmailTable sysEmailTable; SysEmailParameters sysEmailParameters = SysEmailParameters::find(); //SysUserInfo userInfo = SysUserInfo::find(_usrId, false); UserInfo userInfo; select * from userInfo where userInfo.id==_usrId; var messageBuilder = new SysMailerMessageBuilder(); //select firstonly sysEmailTable; if(userInfo.networkAlias) { messageBuilder.setFrom(sysEmailParameters.SMTPUserName); messageBuilder.addTo(userInfo.networkAlias); // messageBuilder.addTo(userInfo.Email); //messageBuilder.addCc("cc@example.com"); //messageBuilder.addBcc("bcc@example.com"); messageBuilder.setSubject("Vendor Approved by finance team"); messageBuilder.setBody(strFmt('%1 vendor has been approved by %2', _vendor, curUserId())); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage()); } } //---------------------Vendor Approved Notification End----------------------------------- //---------------------Fixed Asset Approval Notification ----------------------------------- public static void sendFinanceForFixedAssetApprovalNotification1(UserId _usrId, AssetId _assetId) { SystemNotificationDataContract notification = new SystemNotificationDataContract(); notification.Users().value(1, _usrId); notification.Title("New Fixed Asset"); notification.RuleId('ExcelStaticExport'); notification.Message(strFmt("%1 new fixed asset has added, need to approve", _assetId)); notification.ExpirationDateTime(DateTimeUtil::addHours(DateTimeUtil::utcNow(), 72)); SystemNotificationsManager::AddSystemNotification(notification); } public static void sendFinanceForFixedAssetApprovalEmail(UserId _usrId, AssetId _assetId) { //SysEmailTable sysEmailTable; SysEmailParameters sysEmailParameters = SysEmailParameters::find(); SysUserInfo userInfo = SysUserInfo::find(_usrId, false); var messageBuilder = new SysMailerMessageBuilder(); //select firstonly sysEmailTable; if(userInfo.Email) { messageBuilder.setFrom(sysEmailParameters.SMTPUserName); messageBuilder.addTo(userInfo.Email); //messageBuilder.addCc("cc@example.com"); //messageBuilder.addBcc("bcc@example.com"); messageBuilder.setSubject("New Fixed Asset added"); messageBuilder.setBody(strFmt('%1 new fixed asset has added, need to approve', _assetId)); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage()); } } //---------------------Fixed Asset Approval Notification End----------------------------------- //---------------------Fixed Asset Approved Notification----------------------------------- public static void sendFixedAssetApprovalNotification1(UserId _usrId, AssetId _assetId) { SystemNotificationDataContract notification = new SystemNotificationDataContract(); notification.Users().value(1, _usrId); notification.Title("Fixed Asset Approved"); notification.RuleId('ExcelStaticExport'); notification.Message(strFmt("%1 fixed asset has been approved by finance team", _assetId)); notification.ExpirationDateTime(DateTimeUtil::addHours(DateTimeUtil::utcNow(), 72)); SystemNotificationsManager::AddSystemNotification(notification); } public static void sendFixedAssetApprovalEmail(UserId _usrId, AssetId _assetId) { //SysEmailTable sysEmailTable; SysUserInfo userInfo = SysUserInfo::find(_usrId, false); var messageBuilder = new SysMailerMessageBuilder(); SysEmailParameters sysEmailParameters = SysEmailParameters::find(); //select firstonly sysEmailTable; if(userInfo.Email) { messageBuilder.setFrom(sysEmailParameters.SMTPUserName); messageBuilder.addTo(userInfo.Email); //messageBuilder.addCc("cc@example.com"); //messageBuilder.addBcc("bcc@example.com"); messageBuilder.setSubject("Fixed asset Approved by finance team"); messageBuilder.setBody(strFmt('%1 fixed asset has been approved by %2', _assetId, curUserId())); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage()); } } //---------------------Fixed Asset Approved Notification End----------------------------------- //------------------------------------------------------------------------------------------------------------------------------------- public static void sendNotificationToCreaterForCapexApproval1(UserId _usrId, CPLDevCapexRequestNo _capexReqNo) { SystemNotificationDataContract notification = new SystemNotificationDataContract(); notification.Users().value(1, _usrId); notification.Title("Capex Approved"); notification.RuleId('ExcelStaticExport'); notification.Message(strFmt("%1 Capex has been approved by the team", _capexReqNo)); notification.ExpirationDateTime(DateTimeUtil::addHours(DateTimeUtil::utcNow(), 72)); SystemNotificationsManager::AddSystemNotification(notification); } public static void sendEmailToCreaterForCapexApprovalOld(UserId _usrId, CPLDevCapexRequestNo _capexReqNo) { str emailBody = ''; SysEmailTable sysEmailTable; CPLDevCapexHeader cplCapexHeader; SysEmailParameters sysEmailParameters = SysEmailParameters::find(); SysUserInfo userInfo = SysUserInfo::find(_usrId, false); var messageBuilder = new SysMailerMessageBuilder(); select firstonly sysEmailTable; select firstonly cplCapexHeader where cplCapexHeader.CapexRequestNo == _capexReqNo; if(userInfo.Email) { messageBuilder.setFrom(sysEmailParameters.SMTPUserName); messageBuilder.addTo(userInfo.Email); //messageBuilder.addCc("cc@example.com"); //messageBuilder.addBcc("bcc@example.com"); emailBody = '<html>'; emailBody = '<head><style>table, th, td{border: 1px solid black;border-collapse: collapse;}</style></head>'; emailBody = '<html><body>'; emailBody += '<p1>Hi ' + CPLDevCapexUtility::getUserName(_usrId) + '</p><br>'; emailBody += 'This is to inform you that your capex request has been approved<br>'; emailBody += 'Here is a brief summary of capex request:<br><br>'; emailBody += '<table role="presentation" border="1" cellspacing="0" style="width:100%;"><tr>'; emailBody += '<th>Capex Request No.</th>'; emailBody += '<th>Capex/Project Name</th>'; emailBody += '<th>Priority</th>'; emailBody += '<th>Currency</th>'; emailBody += '<th align="right">Total Amount</th>'; emailBody += '<th align="right">Forecasted Amount</th>'; emailBody += '<th>Request Date</th>'; emailBody += '<th>Request Status</th></tr>'; emailBody += '<tr>'; emailBody += '<td><a href="' + CPLDevCapexUtility::getCapexURL(_capexReqNo) + '" target="_blank">' + _capexReqNo + '</td>'; //emailBody += '<td>' + _capexReqNo + '</td>'; emailBody += '<td>' + cplCapexHeader.CapexProjectName + '</td>'; emailBody += '<td>' + enum2Str(cplCapexHeader.Priority) + '</td>'; emailBody += '<td>' + cplCapexHeader.Currency + '</td>'; emailBody += '<td align="right">' + num2Str(cplCapexHeader.TotalAmount(), 0, 2, DecimalSeparator::Dot, ThousandSeparator::Comma) + '</td>'; emailBody += '<td align="right">' + num2Str(cplCapexHeader.ForecastedAmount, 0, 2, DecimalSeparator::Dot, ThousandSeparator::Comma) + '</td>'; emailBody += '<td>' + date2Str(cplCapexHeader.RequestDate,321,DateDay::Digits2,DateSeparator::Hyphen, DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4) + '</td>'; emailBody += '<td>' + enum2Str(cplCapexHeader.CPLCapexWorkflowStatusEnum) + '</td></tr></table>'; emailBody += '<br><br>Thanks.<br>'; emailBody += '</body></html>'; messageBuilder.setSubject(strFmt("%1 Capex has approved ", _capexReqNo)); messageBuilder.setBody(emailBody,true); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage()); } } public static void sendEmailToCreaterForCapexChangeStatus(UserId _usrId, CPLDevCapexRequestNo _capexReqNo, str csStatus,PurchId _purchid = null) //SIT3-104-To add Auto-created Purchase order number in mail-[PavanKini]03March2023 starts here---> { str emailBody = ''; SysEmailTable sysEmailTable; CPLDevCapexHeader cplCapexHeader; SysEmailParameters sysEmailParameters = SysEmailParameters::find(); // SysUserInfo userInfo = SysUserInfo::find(_usrId, false); //Manju Y UserInfo userInfo; select * from userInfo where userInfo.id==_usrId; var messageBuilder = new SysMailerMessageBuilder(); select firstonly sysEmailTable; select firstonly cplCapexHeader where cplCapexHeader.CapexRequestNo == _capexReqNo; // if(userInfo.Email) if(userInfo.networkAlias) { messageBuilder.setFrom(sysEmailParameters.SMTPUserName); // messageBuilder.addTo(userInfo.Email); messageBuilder.addTo(userInfo.networkAlias);//manju y //messageBuilder.addCc("cc@example.com"); //messageBuilder.addBcc("bcc@example.com"); emailBody = '<html>'; emailBody = '<head><style>table, th, td{border: 1px solid black;border-collapse: collapse;}</style></head>'; emailBody = '<html><body>'; emailBody += '<p1>Hi ' + CPLDevCapexUtility::getUserName(_usrId) + '</p><br>'; if(csStatus == 'ChangeRequest') { emailBody += 'This is to inform you that your capex request has Change Request<br>'; } else { emailBody += strFmt('This is to inform you that your capex request has been %1<br>', csStatus); } emailBody += 'Here is a brief summary of capex request:<br><br>'; emailBody += '<table role="presentation" border="1" cellspacing="0" style="width:100%;"><tr>'; emailBody += '<th>Capex Request No.</th>'; emailBody += '<th>Capex/Project Name</th>'; emailBody += '<th>Priority</th>'; emailBody += '<th>Currency</th>'; emailBody += '<th align="right">Total Amount</th>'; emailBody += '<th align="right">Forecasted Amount</th>'; emailBody += '<th>Request Date</th>'; //SIT3-104-To add Auto-created Purchase order number in mail-[PavanKini]03March2023 starts here---> if(csStatus =="approved" && _purchid) //[ManjuY] added MV validation { emailBody += '<th>Request Status</th>'; emailBody += '<th>Purchase Order No</th></tr>'; } else { emailBody += '<th>Request Status</th></tr>'; } //SIT3-104-To add Auto-created Purchase order number in mail-[PavanKini]03March2023 ends here---> emailBody += '<tr>'; emailBody += '<td><a href="' + CPLDevCapexUtility::getCapexURL(_capexReqNo) + '" target="_blank">' + _capexReqNo + '</td>'; //emailBody += '<td>' + _capexReqNo + '</td>'; emailBody += '<td>' + cplCapexHeader.CapexProjectName + '</td>'; emailBody += '<td>' + enum2Str(cplCapexHeader.Priority) + '</td>'; emailBody += '<td>' + cplCapexHeader.Currency + '</td>'; emailBody += '<td align="right">' + num2Str(cplCapexHeader.TotalAmount(), 0, 2, DecimalSeparator::Dot, ThousandSeparator::Comma) + '</td>'; emailBody += '<td align="right">' + num2Str(cplCapexHeader.ForecastedAmount, 0, 2, DecimalSeparator::Dot, ThousandSeparator::Comma) + '</td>'; emailBody += '<td>' + date2Str(cplCapexHeader.RequestDate,321,DateDay::Digits2,DateSeparator::Hyphen, DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4) + '</td>'; //SIT3-104-To add Auto-created Purchase order number in mail-[PavanKini]03March2023 starts here--> if(csStatus == "approved" && _purchid) //[ManjuY] added MV validation { emailBody += '<td>' + csStatus + '</td>'; emailBody += '<td>' + _purchid + '</td></tr></table>'; } else { emailBody += '<td>' + csStatus + '</td></tr></table>'; } //todo //SIT3-104-To add Auto-created Purchase order number in mail-[PavanKini]03March2023 ends here---> emailBody += '<br><br>Thanks.<br>'; emailBody += '</body></html>'; //SIT-106-Capex Approved email for both single and multiple vendor PDF attachment- PavanKini 06-March-2023 if(csStatus =="approved") { //------------------------------RptGenerate----------------------------------------------------- Filename fileName = _capexReqNo + ".pdf"; SrsReportRunController controller = new SrsReportRunController(); CPLDevCapexSingleVendorContract dataContract1 = new CPLDevCapexSingleVendorContract(); SRSPrintDestinationSettings settings; Array arrayFiles; System.Byte[] reportBytes = new System.Byte[0](); SRSProxy srsProxy; SRSReportRunService srsReportRunService = new SrsReportRunService(); Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray; Map reportParametersMap; SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo(); if(cplCapexHeader.ForKnownVendor == NoYes::Yes) { controller.parmReportName(ssrsReportStr(CPLDevCaexSiingleVendorReport, Report)); } else { controller.parmReportName(ssrsReportStr(CPLDevCaexSiingleVendorReport, CapexMVReport)); } controller.parmShowDialog(false); //controller.parmExecutionMode(SysOperationExecutionMode::ScheduledBatch); //controller.parmInBatch(true); dataContract1 = controller.parmReportContract().parmRdpContract() as CPLDevCapexSingleVendorContract ; dataContract1.parmCPLDevCapexRequestNo(_capexReqNo); //_capexReqNo controller.parmLoadFromSysLastValue(false); // 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(); } System.Byte[] binData1; System.IO.Stream stream1; // Turn the Bytes into a stream for(int i = 0; i < conLen(binData); i++) { binData1 = conPeek(binData,i+1); stream1 = new System.IO.MemoryStream(binData1); } messageBuilder.addAttachment(stream1, fileName); } //-----------------------------RptGenerateEnd---------------------------------------------------- //SIT-106-Capex Approved email for both single and multiple vendor PDF attachment- PavanKini 06-March-2023 messageBuilder.setSubject(strFmt("%1 Capex has %2 ", _capexReqNo, csStatus)); messageBuilder.setBody(emailBody,true); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage()); } } public static void sendEmailToApprovarForCapexApproval(UserId _usrId, CPLDevCapexRequestNo _capexReqNo, System.IO.Stream _stream = null) { str emailBody = ''; SysEmailTable sysEmailTable; CPLDevCapexHeader cplCapexHeader; SysEmailParameters sysEmailParameters = SysEmailParameters::find(); // SysUserInfo userInfo = SysUserInfo::find(_usrId, false); UserInfo userInfo; select * from userInfo where userInfo.id ==_usrId; //manjuy var messageBuilder = new SysMailerMessageBuilder(); //select firstonly sysEmailTable; select firstonly cplCapexHeader where cplCapexHeader.CapexRequestNo == _capexReqNo; URL attachmentUrl = CPLDevCapexUtility::getAttachmentURL(cplCapexHeader.RecId, cplCapexHeader.DataAreaId); changecompany(cplCapexHeader.DataAreaId) { // if(userInfo.Email) if(userInfo.networkAlias) { messageBuilder.setFrom(sysEmailParameters.SMTPUserName); //messageBuilder.addTo(userInfo.Email); messageBuilder.addTo(userInfo.networkAlias); //manjuY //messageBuilder.addCc("cc@example.com"); //messageBuilder.addBcc("bcc@example.com"); emailBody = '<html>'; emailBody += '<head><style>table, th, td{border: 1px solid black;border-collapse: collapse;}</style></head>'; emailBody += '<html><body>'; emailBody += '<p1>Hi ' + CPLDevCapexUtility::getUserName(_usrId) + '</p><br>'; //hcmWorker.name() emailBody += CPLDevCapexUtility::getUserName(cplCapexHeader.CreatedBy) + ' has sent you capex request for review and approval.<br><br>'; //hcmWorkerCreator.name() emailBody += 'Here is a brief summary of capex request:<br><br>'; emailBody += '<table role="presentation" border="1" cellspacing="0" style="width:100%;"><tr>'; emailBody += '<th>Capex Request No.</th>'; emailBody += '<th>Capex/Project Name</th>'; emailBody += '<th>Priority</th>'; emailBody += '<th>Currency</th>'; emailBody += '<th align="right">Total Amount</th>'; emailBody += '<th align="right">Forecasted Amount</th>'; emailBody += '<th>Request Date</th>'; emailBody += '<th>Request Status</th></tr>'; emailBody += '<tr>'; emailBody += '<td><a href="' + CPLDevCapexUtility::getCapexURL(_capexReqNo) + '" target="_blank">' + _capexReqNo + '</td>'; //emailBody += '<td>' + _capexReqNo + '</td>'; emailBody += '<td>' + cplCapexHeader.CapexProjectName + '</td>'; emailBody += '<td>' + enum2Str(cplCapexHeader.Priority) + '</td>'; emailBody += '<td>' + cplCapexHeader.Currency + '</td>'; emailBody += '<td align="right">' + num2Str(cplCapexHeader.TotalAmount(), 0, 2, DecimalSeparator::Dot, ThousandSeparator::Comma) + '</td>'; emailBody += '<td align="right">' + num2Str(cplCapexHeader.ForecastedAmount, 0, 2, DecimalSeparator::Dot, ThousandSeparator::Comma) + '</td>'; emailBody += '<td>' + date2Str(cplCapexHeader.RequestDate,321,DateDay::Digits2,DateSeparator::Hyphen, DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4) + '</td>'; if(cplCapexHeader.CPLCapexWorkflowStatusEnum == CPLCapexWorkflowStatusEnum::Created || cplCapexHeader.CPLCapexWorkflowStatusEnum == CPLCapexWorkflowStatusEnum::Submitted) { emailBody += '<td>Submitted</td></tr></table>'; } else { emailBody += '<td>' + enum2Str(cplCapexHeader.CPLCapexWorkflowStatusEnum) + '</td></tr></table>'; } if(attachmentUrl != '') { emailBody += '<br><br>Please find below attachment url:'; emailBody += '<br><a href="' + attachmentUrl + '" target="_blank">' + attachmentUrl + '</a>'; } emailBody += '<br><br>Please help with your decision on approval/rejection/on-hold to proceed with the request.'; emailBody += '<br><br>Thanks.<br>'; emailBody += '</body></html>'; //Capex Approval reminder email set Subject Line added by [Manju Y] if(cplCapexHeader.ReminderDate == today() && cplCapexHeader.CPLCapexWorkflowStatusEnum==CPLCapexWorkflowStatusEnum::Submitted) { messageBuilder.setSubject(strFmt("REMINDER: %1 Capex for review and approval ", _capexReqNo)); } else { messageBuilder.setSubject(strFmt("%1 Capex for review and approval ", _capexReqNo)); } //messageBuilder.setSubject(strFmt("%1 Capex for review and approval ", _capexReqNo)); messageBuilder.setBody(emailBody,true); //------------------------------RptGenerate----------------------------------------------------- Filename fileName = _capexReqNo + ".pdf"; SrsReportRunController controller = new SrsReportRunController(); CPLDevCapexSingleVendorContract dataContract1 = new CPLDevCapexSingleVendorContract(); SRSPrintDestinationSettings settings; Array arrayFiles; System.Byte[] reportBytes = new System.Byte[0](); SRSProxy srsProxy; SRSReportRunService srsReportRunService = new SrsReportRunService(); Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray; Map reportParametersMap; SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo(); if(cplCapexHeader.ForKnownVendor == NoYes::Yes) { controller.parmReportName(ssrsReportStr(CPLDevCaexSiingleVendorReport, Report)); } else { controller.parmReportName(ssrsReportStr(CPLDevCaexSiingleVendorReport, CapexMVReport)); } controller.parmShowDialog(false); //controller.parmExecutionMode(SysOperationExecutionMode::ScheduledBatch); //controller.parmInBatch(true); dataContract1 = controller.parmReportContract().parmRdpContract() as CPLDevCapexSingleVendorContract ; dataContract1.parmCPLDevCapexRequestNo(_capexReqNo); //_capexReqNo controller.parmLoadFromSysLastValue(false); // 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(); } System.Byte[] binData1; System.IO.Stream stream1; // Turn the Bytes into a stream for(int i = 0; i < conLen(binData); i++) { binData1 = conPeek(binData,i+1); stream1 = new System.IO.MemoryStream(binData1); } //-----------------------------RptGenerateEnd---------------------------------------------------- messageBuilder.addAttachment(stream1, fileName); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage()); } } } public static void sendEmailToApprovarForCapexWorkflowApproval(CPLDevCapexRequestNo _capexReqNo) { WorkflowTable workflowTable; WorkflowVersionTable workflowVersionTable; WorkflowElementTable workflowElementTable; WorkflowStepTable workflowStepTable; WorkflowAssignmentTable workflowAssignmentTable; System.IO.Stream streamAttachment; container conUser; int conPos; select workflowAssignmentTable join workflowStepTable where workflowStepTable.RecId == workflowAssignmentTable.workflowStepTable join workflowElementTable where workflowElementTable.ElementId == workflowStepTable.ElementId join workflowVersionTable where workflowVersionTable.ConfigurationId == workflowElementTable.ConfigurationId && workflowVersionTable.Enabled == NoYes::Yes join workflowTable where workflowTable.RecId == workflowVersionTable.workflowTable && workflowTable.DocumentTableName == "CPLDevCapexHeader" && workflowTable.TemplateName == 'CPLDevCapexWFType'; if(workflowAssignmentTable.UserValue != '') { conUser = str2con(workflowAssignmentTable.UserValue, ";"); if(conLen(conUser) > 0) { for(conPos=1; conPos <= conlen(conUser); conPos++) { CPLDevCapexUtility::sendEmailToApprovarForCapexApproval(conPeek(conUser, conPos),_capexReqNo, streamAttachment); } } } else if(workflowAssignmentTable.ParticipantTokenName !='') //added by Manju Y [fetch users from group] { UserGroupList groupList; while select groupList where groupList.groupId==workflowAssignmentTable.ParticipantTokenName { CPLDevCapexUtility::sendEmailToApprovarForCapexApproval(groupList.userId, _capexReqNo, streamAttachment); } } } private static Name getUserName(UserId _userId) { UserInfo usrInfoLoc; select firstonly1 usrInfoLoc where usrInfoLoc.id == _userId; return usrInfoLoc.name; } public static str getCapexURL(CPLDevCapexRequestNo _requestNo) { try { // gets the generator instance var generator = new Microsoft.Dynamics.AX.Framework.Utilities.UrlHelper.UrlGenerator(); //var currentHost = new System.Uri(UrlUtility::getUrl()); IApplicationEnvironment env = EnvironmentFactory::GetApplicationEnvironment(); str currentUrl = env.Infrastructure.HostUrl; System.Uri currentHost = new System.Uri(currentUrl); generator.HostUrl = currentHost.GetLeftPart(System.UriPartial::Authority); generator.Company = curext(); generator.MenuItemName = 'CPLDevCapexSummMI'; generator.Partition = getCurrentPartition(); // repeat this segment for each datasource to filter var requestQueryParameterCollection = generator.RequestQueryParameterCollection; requestQueryParameterCollection.AddRequestQueryParameter('CPLDevCapexHeader', 'CapexRequestNo', _requestNo); //System.Uri retURI = generator.GenerateFullUrl().AbsoluteUri; // to get the encoded URI, use the following code return generator.GenerateFullUrl().AbsoluteUri; } catch(Exception::CLRError) { System.Exception ex = CLRInterop::getLastException(); info(ex.Message); return ''; } } public static URL getAttachmentURL(RefRecId _recId, DataAreaId _dataArea) { DocuRef docuRef; DocuType docuType; select docuRef order by docuRef.createddatetime desc where docuRef.RefTableId == tableName2Id('CPLDevCapexHeader') //_common.TableId && docuRef.RefRecId == _recId //_common.RecId && docuRef.RefCompanyId == _dataArea //_common.DataAreaId exists join DocuType where DocuType.TypeId == docuRef.TypeId && DocuType.TypeGroup == DocuTypeGroup::URL; return docuRef.url(); } }