Compare commits
	
		
			1 Commits
		
	
	
		
			7eba0fa25a
			...
			compile-co
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 83789cdd91 | 
							
								
								
									
										74
									
								
								Fab2ApprovalMKLink/Extensions/ControllerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								Fab2ApprovalMKLink/Extensions/ControllerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					#if NET8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using Fab2ApprovalSystem.PdfGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.Rendering;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.ViewEngines;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.ViewFeatures;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Fab2ApprovalSystem.Extensions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public static class ControllerExtensions {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static ActionResult GetBinaryContentResult<TModel>(this Controller controller, string viewName, string contentType, TModel model) {
 | 
				
			||||||
 | 
					        string pageTitle = string.Empty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        string htmlText = RenderViewToString(controller, viewName, model);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        StandardPdfRenderer standardPdfRenderer = new();
 | 
				
			||||||
 | 
					        // Let the html be rendered into a PDF document through iTextSharp.
 | 
				
			||||||
 | 
					        byte[] buffer = standardPdfRenderer.Render(htmlText, pageTitle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the PDF as a binary stream to the client.
 | 
				
			||||||
 | 
					        return new BinaryContentResult(buffer, contentType);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static string RenderViewToString<TModel>(this Controller controller, string viewName, TModel model) {
 | 
				
			||||||
 | 
					        if (string.IsNullOrEmpty(viewName))
 | 
				
			||||||
 | 
					            viewName = controller.ControllerContext.ActionDescriptor.ActionName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        controller.ViewData.Model = model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        using (StringWriter writer = new()) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                CompositeViewEngine compositeViewEngine = controller.HttpContext.RequestServices.GetRequiredService(typeof(ICompositeViewEngine)) as CompositeViewEngine;
 | 
				
			||||||
 | 
					                if (compositeViewEngine is null || compositeViewEngine.ViewEngines.Count == 0) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ViewEngineResult viewResult = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (viewName.EndsWith(".cshtml"))
 | 
				
			||||||
 | 
					                    viewResult = compositeViewEngine.GetView(viewName, viewName, false);
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    viewResult = compositeViewEngine.FindView(controller.ControllerContext, viewName, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!viewResult.Success)
 | 
				
			||||||
 | 
					                    return $"A view with the name '{viewName}' could not be found";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ViewContext viewContext = new(
 | 
				
			||||||
 | 
					                    controller.ControllerContext,
 | 
				
			||||||
 | 
					                    viewResult.View,
 | 
				
			||||||
 | 
					                    controller.ViewData,
 | 
				
			||||||
 | 
					                    controller.TempData,
 | 
				
			||||||
 | 
					                    writer,
 | 
				
			||||||
 | 
					                    new HtmlHelperOptions()
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Task task = viewResult.View.RenderAsync(viewContext);
 | 
				
			||||||
 | 
					                task.Wait();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return writer.GetStringBuilder().ToString();
 | 
				
			||||||
 | 
					            } catch (Exception ex) {
 | 
				
			||||||
 | 
					                return $"Failed - {ex.Message}";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@ -116,7 +116,3 @@ input[type="checkbox"].input-validation-error {
 | 
				
			|||||||
  top: 55px;
 | 
					  top: 55px;
 | 
				
			||||||
  left: 25px;
 | 
					  left: 25px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
.navbar-header-hidden {
 | 
					 | 
				
			||||||
    display: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -7,22 +7,22 @@ using System.Linq;
 | 
				
			|||||||
#if !NET8
 | 
					#if !NET8
 | 
				
			||||||
using System.Web;
 | 
					using System.Web;
 | 
				
			||||||
using System.Web.Mvc;
 | 
					using System.Web.Mvc;
 | 
				
			||||||
 | 
					using Fab2ApprovalSystem.PdfGenerator;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if NET8
 | 
					#if NET8
 | 
				
			||||||
using Microsoft.AspNetCore.Authorization;
 | 
					using Microsoft.AspNetCore.Authorization;
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc;
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc.Rendering;
 | 
					#endif
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc.ViewEngines;
 | 
					
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc.ViewFeatures;
 | 
					#if NET8
 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Fab2ApprovalSystem.Extensions;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using Fab2ApprovalSystem.DMO;
 | 
					using Fab2ApprovalSystem.DMO;
 | 
				
			||||||
using Fab2ApprovalSystem.Misc;
 | 
					using Fab2ApprovalSystem.Misc;
 | 
				
			||||||
using Fab2ApprovalSystem.Models;
 | 
					using Fab2ApprovalSystem.Models;
 | 
				
			||||||
using Fab2ApprovalSystem.ViewModels;
 | 
					using Fab2ApprovalSystem.ViewModels;
 | 
				
			||||||
using Fab2ApprovalSystem.PdfGenerator;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !NET8
 | 
					#if !NET8
 | 
				
			||||||
using Kendo.Mvc.Extensions;
 | 
					using Kendo.Mvc.Extensions;
 | 
				
			||||||
@ -35,11 +35,12 @@ namespace Fab2ApprovalSystem.Controllers;
 | 
				
			|||||||
#if !NET8
 | 
					#if !NET8
 | 
				
			||||||
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
 | 
					[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
 | 
				
			||||||
[SessionExpireFilter]
 | 
					[SessionExpireFilter]
 | 
				
			||||||
 | 
					public class ECNController : PdfViewController {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if NET8
 | 
					#if NET8
 | 
				
			||||||
[Route("[controller]")]
 | 
					[Route("[controller]")]
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
public class ECNController : Controller {
 | 
					public class ECNController : Controller {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private const string ECN_PREFIX = "ECN_";
 | 
					    private const string ECN_PREFIX = "ECN_";
 | 
				
			||||||
    private const string TECN_PREFIX = "TECN_";
 | 
					    private const string TECN_PREFIX = "TECN_";
 | 
				
			||||||
@ -700,7 +701,6 @@ public class ECNController : Controller {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !NET8
 | 
					#if !NET8
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ActionResult GetApproversList([DataSourceRequest] DataSourceRequest request, int issueID, byte step, bool isTECN, bool isEmergrncyTECN) {
 | 
					    public ActionResult GetApproversList([DataSourceRequest] DataSourceRequest request, int issueID, byte step, bool isTECN, bool isEmergrncyTECN) {
 | 
				
			||||||
        int isITARCompliant = 0;
 | 
					        int isITARCompliant = 0;
 | 
				
			||||||
        ECN ecn = new ECN();
 | 
					        ECN ecn = new ECN();
 | 
				
			||||||
@ -924,12 +924,19 @@ public class ECNController : Controller {
 | 
				
			|||||||
            if (!di.Exists)
 | 
					            if (!di.Exists)
 | 
				
			||||||
                di.Create();
 | 
					                di.Create();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            string htmlText;
 | 
					            // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This
 | 
				
			||||||
            string pageTitle = string.Empty;
 | 
					            // requires the controller to be inherited from MyController instead of MVC's Controller.
 | 
				
			||||||
            htmlText = RenderViewToString("ECNPdf", ecn);
 | 
					#if !NET8
 | 
				
			||||||
            StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNForm_{outputFileName}");
 | 
					            SavePdf(ecnFolderPath + "\\ECNForm_" + outputFileName, "ECNPdf", ecn);
 | 
				
			||||||
            htmlText = RenderViewToString("ECNApprovalPdf", ecn);
 | 
					            SavePdf(ecnFolderPath + "\\ECNApprovalLog_" + outputFileName, "ECNApprovalPdf", ecn);
 | 
				
			||||||
            StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNApprovalLog_{outputFileName}");
 | 
					#endif
 | 
				
			||||||
 | 
					#if NET8
 | 
				
			||||||
 | 
					            string html;
 | 
				
			||||||
 | 
					            html = this.RenderViewToString("ECNPdf", ecn);
 | 
				
			||||||
 | 
					            System.IO.File.WriteAllText(ecnFolderPath + "\\ECNForm_" + outputFileName, html);
 | 
				
			||||||
 | 
					            html = this.RenderViewToString("ECNApprovalPdf", ecn);
 | 
				
			||||||
 | 
					            System.IO.File.WriteAllText(ecnFolderPath + "\\ECNApprovalLog_" + outputFileName, html);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        } catch (Exception ex) {
 | 
					        } catch (Exception ex) {
 | 
				
			||||||
            EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = GetUserIdentityName(), DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message });
 | 
					            EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = GetUserIdentityName(), DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message });
 | 
				
			||||||
            ecn = null;
 | 
					            ecn = null;
 | 
				
			||||||
@ -939,52 +946,6 @@ public class ECNController : Controller {
 | 
				
			|||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private string RenderViewToString(string viewName, ECNPdf ecnPdf) {
 | 
					 | 
				
			||||||
        string result;
 | 
					 | 
				
			||||||
        ViewData.Model = ecnPdf;
 | 
					 | 
				
			||||||
        using (StringWriter writer = new()) {
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
#if !NET8
 | 
					 | 
				
			||||||
                ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, string.Empty);
 | 
					 | 
				
			||||||
                if (viewResult is null)
 | 
					 | 
				
			||||||
                    return $"A view with the name '{viewName}' could not be found";
 | 
					 | 
				
			||||||
                ViewContext viewContext = new(ControllerContext, viewResult.View, ViewData, TempData, writer);
 | 
					 | 
				
			||||||
                viewResult.View.Render(viewContext, writer);
 | 
					 | 
				
			||||||
                result = writer.GetStringBuilder().ToString();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if NET8
 | 
					 | 
				
			||||||
                ViewEngineResult viewResult;
 | 
					 | 
				
			||||||
                CompositeViewEngine compositeViewEngine = HttpContext.RequestServices.GetRequiredService(typeof(ICompositeViewEngine)) as CompositeViewEngine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (viewName.EndsWith(".cshtml")) {
 | 
					 | 
				
			||||||
                    viewResult = compositeViewEngine.GetView(viewName, viewName, false);
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    viewResult = compositeViewEngine.FindView(ControllerContext, viewName, false);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (!viewResult.Success) {
 | 
					 | 
				
			||||||
                    return $"A view with the name '{viewName}' could not be found";
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ViewContext viewContext = new(ControllerContext,
 | 
					 | 
				
			||||||
                                              viewResult.View,
 | 
					 | 
				
			||||||
                                              ViewData,
 | 
					 | 
				
			||||||
                                              TempData,
 | 
					 | 
				
			||||||
                                              writer,
 | 
					 | 
				
			||||||
                                              new HtmlHelperOptions());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                System.Threading.Tasks.Task task = viewResult.View.RenderAsync(viewContext);
 | 
					 | 
				
			||||||
                task.Wait();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                result = writer.GetStringBuilder().ToString();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            } catch (Exception ex) {
 | 
					 | 
				
			||||||
                result = $"Failed - {ex.Message}";
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return result;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool GenerateECNPdfDifferentLocation(int ecnNumber, int folderName) {
 | 
					    public bool GenerateECNPdfDifferentLocation(int ecnNumber, int folderName) {
 | 
				
			||||||
        ECNPdf ecn = new();
 | 
					        ECNPdf ecn = new();
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
@ -1002,9 +963,15 @@ public class ECNController : Controller {
 | 
				
			|||||||
            if (!di.Exists)
 | 
					            if (!di.Exists)
 | 
				
			||||||
                di.Create();
 | 
					                di.Create();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            string pageTitle = string.Empty;
 | 
					            // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This
 | 
				
			||||||
            string htmlText = RenderViewToString("ECNPdf", ecn);
 | 
					            // requires the controller to be inherited from MyController instead of MVC's Controller.
 | 
				
			||||||
            StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNForm_{outputFileName}");
 | 
					#if !NET8
 | 
				
			||||||
 | 
					            SavePdf(ecnFolderPath + "\\ECNForm_" + outputFileName, "ECNPdf", ecn);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if NET8
 | 
				
			||||||
 | 
					            string html = this.RenderViewToString("ECNPdf", ecn);
 | 
				
			||||||
 | 
					            System.IO.File.WriteAllText(ecnFolderPath + "\\ECNForm_" + outputFileName, html);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        } catch (Exception ex) {
 | 
					        } catch (Exception ex) {
 | 
				
			||||||
            EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = GetUserIdentityName(), DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message });
 | 
					            EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = GetUserIdentityName(), DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message });
 | 
				
			||||||
            ecn = null;
 | 
					            ecn = null;
 | 
				
			||||||
@ -1023,14 +990,17 @@ public class ECNController : Controller {
 | 
				
			|||||||
            ecn = ecnDMO.GetECNPdf(ecnNumber);
 | 
					            ecn = ecnDMO.GetECNPdf(ecnNumber);
 | 
				
			||||||
            ViewBag.Category = ecnDMO.GetCategoryID(ecn);
 | 
					            ViewBag.Category = ecnDMO.GetCategoryID(ecn);
 | 
				
			||||||
            ViewBag.TrainingNotificationTo = ecnDMO.GetTrainingNotificationTo(ecn, trainingDMO);
 | 
					            ViewBag.TrainingNotificationTo = ecnDMO.GetTrainingNotificationTo(ecn, trainingDMO);
 | 
				
			||||||
            string pageTitle = string.Empty;
 | 
					            // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This
 | 
				
			||||||
            string htmlText = RenderViewToString("ECNPdf", ecn);
 | 
					            // requires the controller to be inherited from MyController instead of MVC's Controller.
 | 
				
			||||||
            if (Debugger.IsAttached) {
 | 
					#if !NET8
 | 
				
			||||||
                return Content(htmlText, "text/html");
 | 
					            return ViewPdf("", "ECNPdf", ecn);
 | 
				
			||||||
            } else {
 | 
					#endif
 | 
				
			||||||
                byte[] buffer = StandardPdfRenderer.GetPortableDocumentFormatBytes(pageTitle, htmlText);
 | 
					#if NET8
 | 
				
			||||||
                return new BinaryContentResult(buffer, "application/pdf");
 | 
					            if (Debugger.IsAttached)
 | 
				
			||||||
            }
 | 
					                return Content(this.RenderViewToString("ECNPdf", ecn), "text/html");
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                return this.GetBinaryContentResult("ECNPdf", "application/pdf", ecn);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        } catch (Exception ex) {
 | 
					        } catch (Exception ex) {
 | 
				
			||||||
            EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = GetUserIdentityName(), DocumentType = "ECN", OperationType = "Print PDF", Comments = ex.Message });
 | 
					            EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = GetUserIdentityName(), DocumentType = "ECN", OperationType = "Print PDF", Comments = ex.Message });
 | 
				
			||||||
            ecn = null;
 | 
					            ecn = null;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,4 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.IO;
 | 
					 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Diagnostics;
 | 
					using System.Diagnostics;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
@ -9,22 +8,22 @@ using System.Web;
 | 
				
			|||||||
using System.Web.Mvc;
 | 
					using System.Web.Mvc;
 | 
				
			||||||
using System.Configuration;
 | 
					using System.Configuration;
 | 
				
			||||||
using System.Threading;
 | 
					using System.Threading;
 | 
				
			||||||
 | 
					using Fab2ApprovalSystem.PdfGenerator;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if NET8
 | 
					#if NET8
 | 
				
			||||||
using Microsoft.AspNetCore.Authorization;
 | 
					using Microsoft.AspNetCore.Authorization;
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc;
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc.Rendering;
 | 
					#endif
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc.ViewEngines;
 | 
					
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc.ViewFeatures;
 | 
					#if NET8
 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Fab2ApprovalSystem.Extensions;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using Fab2ApprovalSystem.DMO;
 | 
					using Fab2ApprovalSystem.DMO;
 | 
				
			||||||
using Fab2ApprovalSystem.Misc;
 | 
					using Fab2ApprovalSystem.Misc;
 | 
				
			||||||
using Fab2ApprovalSystem.Models;
 | 
					using Fab2ApprovalSystem.Models;
 | 
				
			||||||
using Fab2ApprovalSystem.ViewModels;
 | 
					using Fab2ApprovalSystem.ViewModels;
 | 
				
			||||||
using Fab2ApprovalSystem.PdfGenerator;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !NET8
 | 
					#if !NET8
 | 
				
			||||||
using Kendo.Mvc.Extensions;
 | 
					using Kendo.Mvc.Extensions;
 | 
				
			||||||
@ -37,11 +36,12 @@ namespace Fab2ApprovalSystem.Controllers;
 | 
				
			|||||||
#if !NET8
 | 
					#if !NET8
 | 
				
			||||||
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
 | 
					[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
 | 
				
			||||||
[SessionExpireFilter]
 | 
					[SessionExpireFilter]
 | 
				
			||||||
 | 
					public class LotTravelerController : PdfViewController {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if NET8
 | 
					#if NET8
 | 
				
			||||||
[Route("[controller]")]
 | 
					[Route("[controller]")]
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
public class LotTravelerController : Controller {
 | 
					public class LotTravelerController : Controller {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private readonly LotTravelerDMO LotTravDMO = new();
 | 
					    private readonly LotTravelerDMO LotTravDMO = new();
 | 
				
			||||||
    private readonly string docTypeString = "LotTraveler";
 | 
					    private readonly string docTypeString = "LotTraveler";
 | 
				
			||||||
@ -220,14 +220,17 @@ public class LotTravelerController : Controller {
 | 
				
			|||||||
        try {
 | 
					        try {
 | 
				
			||||||
            workRequest = LotTravDMO.GetLTWorkRequestItemPDF(workRequestID);
 | 
					            workRequest = LotTravDMO.GetLTWorkRequestItemPDF(workRequestID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            string pageTitle = string.Empty;
 | 
					            // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This
 | 
				
			||||||
            string htmlText = RenderViewToString("WorkRequestPDF", workRequest);
 | 
					            // requires the controller to be inherited from MyController instead of MVC's Controller.
 | 
				
			||||||
            if (Debugger.IsAttached) {
 | 
					#if !NET8
 | 
				
			||||||
                return Content(htmlText, "text/html");
 | 
					            return ViewPdf("", "WorkRequestPDF", workRequest);
 | 
				
			||||||
            } else {
 | 
					#endif
 | 
				
			||||||
                byte[] buffer = StandardPdfRenderer.GetPortableDocumentFormatBytes(pageTitle, htmlText);
 | 
					#if NET8
 | 
				
			||||||
                return new BinaryContentResult(buffer, "application/pdf");
 | 
					            if (Debugger.IsAttached)
 | 
				
			||||||
            }
 | 
					                return Content(this.RenderViewToString("WorkRequestPDF", workRequest), "text/html");
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                return this.GetBinaryContentResult("WorkRequestPDF", "application/pdf", workRequest);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        } catch (Exception ex) {
 | 
					        } catch (Exception ex) {
 | 
				
			||||||
            Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n DisplayWorkRequestPDF - LotTraveler\r\n" + ex.InnerException.ToString(), EventLogEntryType.Error);
 | 
					            Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n DisplayWorkRequestPDF - LotTraveler\r\n" + ex.InnerException.ToString(), EventLogEntryType.Error);
 | 
				
			||||||
            EventLogDMO.Add(new WinEventLog() { IssueID = workRequest.SWRNumber, UserID = GetUserIdentityName(), DocumentType = "LotTravler", OperationType = "Generate PDF", Comments = ex.Message });
 | 
					            EventLogDMO.Add(new WinEventLog() { IssueID = workRequest.SWRNumber, UserID = GetUserIdentityName(), DocumentType = "LotTravler", OperationType = "Generate PDF", Comments = ex.Message });
 | 
				
			||||||
@ -236,52 +239,6 @@ public class LotTravelerController : Controller {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private string RenderViewToString(string viewName, object model) {
 | 
					 | 
				
			||||||
        string result;
 | 
					 | 
				
			||||||
        ViewData.Model = model;
 | 
					 | 
				
			||||||
        using (StringWriter writer = new()) {
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
#if !NET8
 | 
					 | 
				
			||||||
                ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, string.Empty);
 | 
					 | 
				
			||||||
                if (viewResult is null)
 | 
					 | 
				
			||||||
                    return $"A view with the name '{viewName}' could not be found";
 | 
					 | 
				
			||||||
                ViewContext viewContext = new(ControllerContext, viewResult.View, ViewData, TempData, writer);
 | 
					 | 
				
			||||||
                viewResult.View.Render(viewContext, writer);
 | 
					 | 
				
			||||||
                result = writer.GetStringBuilder().ToString();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if NET8
 | 
					 | 
				
			||||||
                ViewEngineResult viewResult;
 | 
					 | 
				
			||||||
                CompositeViewEngine compositeViewEngine = HttpContext.RequestServices.GetRequiredService(typeof(ICompositeViewEngine)) as CompositeViewEngine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (viewName.EndsWith(".cshtml")) {
 | 
					 | 
				
			||||||
                    viewResult = compositeViewEngine.GetView(viewName, viewName, false);
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    viewResult = compositeViewEngine.FindView(ControllerContext, viewName, false);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (!viewResult.Success) {
 | 
					 | 
				
			||||||
                    return $"A view with the name '{viewName}' could not be found";
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ViewContext viewContext = new(ControllerContext,
 | 
					 | 
				
			||||||
                                              viewResult.View,
 | 
					 | 
				
			||||||
                                              ViewData,
 | 
					 | 
				
			||||||
                                              TempData,
 | 
					 | 
				
			||||||
                                              writer,
 | 
					 | 
				
			||||||
                                              new HtmlHelperOptions());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                System.Threading.Tasks.Task task = viewResult.View.RenderAsync(viewContext);
 | 
					 | 
				
			||||||
                task.Wait();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                result = writer.GetStringBuilder().ToString();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            } catch (Exception ex) {
 | 
					 | 
				
			||||||
                result = $"Failed - {ex.Message}";
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return result;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ActionResult WorkRequestRevision(int workRequestID) {
 | 
					    public ActionResult WorkRequestRevision(int workRequestID) {
 | 
				
			||||||
        int isITARCompliant = 1;
 | 
					        int isITARCompliant = 1;
 | 
				
			||||||
        LTWorkRequest workRequest = new();
 | 
					        LTWorkRequest workRequest = new();
 | 
				
			||||||
@ -323,7 +280,9 @@ public class LotTravelerController : Controller {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return Content("Successfully Saved");
 | 
					        return Content("Successfully Saved");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// 
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
    public JsonResult GetBaseFlowLocations(string baseFlow) {
 | 
					    public JsonResult GetBaseFlowLocations(string baseFlow) {
 | 
				
			||||||
        List<BaseFlowLocation> loclist = LotTravDMO.GetBaseFlowLocations(baseFlow);
 | 
					        List<BaseFlowLocation> loclist = LotTravDMO.GetBaseFlowLocations(baseFlow);
 | 
				
			||||||
        return GetJsonResult(loclist);
 | 
					        return GetJsonResult(loclist);
 | 
				
			||||||
@ -410,6 +369,9 @@ public class LotTravelerController : Controller {
 | 
				
			|||||||
        return Content(newWorkRequestID.ToString());
 | 
					        return Content(newWorkRequestID.ToString());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// For the Revison
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
    public ActionResult UpdateMaterialDetailRevision(LTWorkRequest model) {
 | 
					    public ActionResult UpdateMaterialDetailRevision(LTWorkRequest model) {
 | 
				
			||||||
        var modelMaterialDetail = model.LTMaterial;
 | 
					        var modelMaterialDetail = model.LTMaterial;
 | 
				
			||||||
        int previousMaterialID = model.LTMaterial.ID;
 | 
					        int previousMaterialID = model.LTMaterial.ID;
 | 
				
			||||||
@ -1354,14 +1316,17 @@ public class LotTravelerController : Controller {
 | 
				
			|||||||
        try {
 | 
					        try {
 | 
				
			||||||
            traveler = LotTravDMO.GetLotTravlerPdf(ltLotID, revisionNumber);
 | 
					            traveler = LotTravDMO.GetLotTravlerPdf(ltLotID, revisionNumber);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            string pageTitle = string.Empty;
 | 
					            // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This
 | 
				
			||||||
            string htmlText = RenderViewToString("LotTravelerPDF", traveler);
 | 
					            // requires the controller to be inherited from MyController instead of MVC's Controller.
 | 
				
			||||||
            if (Debugger.IsAttached) {
 | 
					#if !NET8
 | 
				
			||||||
                return Content(htmlText, "text/html");
 | 
					            return ViewPdf("", "LotTravelerPDF", traveler);
 | 
				
			||||||
            } else {
 | 
					#endif
 | 
				
			||||||
                byte[] buffer = StandardPdfRenderer.GetPortableDocumentFormatBytes(pageTitle, htmlText);
 | 
					#if NET8
 | 
				
			||||||
                return new BinaryContentResult(buffer, "application/pdf");
 | 
					            if (Debugger.IsAttached)
 | 
				
			||||||
            }
 | 
					                return Content(this.RenderViewToString("LotTravelerPDF", traveler), "text/html");
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                return this.GetBinaryContentResult("LotTravelerPDF", "application/pdf", traveler);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        } catch (Exception ex) {
 | 
					        } catch (Exception ex) {
 | 
				
			||||||
            EventLogDMO.Add(new WinEventLog() { IssueID = traveler.SWRNumber, UserID = GetUserIdentityName(), DocumentType = "LotTraveler", OperationType = "Generate PDF", Comments = ex.Message });
 | 
					            EventLogDMO.Add(new WinEventLog() { IssueID = traveler.SWRNumber, UserID = GetUserIdentityName(), DocumentType = "LotTraveler", OperationType = "Generate PDF", Comments = ex.Message });
 | 
				
			||||||
            traveler = null;
 | 
					            traveler = null;
 | 
				
			||||||
@ -1450,7 +1415,7 @@ public class LotTravelerController : Controller {
 | 
				
			|||||||
        string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));
 | 
					        string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        string ecnFolderPath = _AppSettings.AttachmentFolder + "LotTraveler\\" + swrNumber.ToString();
 | 
					        string ecnFolderPath = _AppSettings.AttachmentFolder + "LotTraveler\\" + swrNumber.ToString();
 | 
				
			||||||
        var sDocument = Path.Combine(ecnFolderPath, fileGuid + fileExtension);
 | 
					        var sDocument = System.IO.Path.Combine(ecnFolderPath, fileGuid + fileExtension);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var FDir_AppData = _AppSettings.AttachmentFolder;
 | 
					        var FDir_AppData = _AppSettings.AttachmentFolder;
 | 
				
			||||||
        if (!sDocument.StartsWith(FDir_AppData)) {
 | 
					        if (!sDocument.StartsWith(FDir_AppData)) {
 | 
				
			||||||
 | 
				
			|||||||
@ -326,6 +326,9 @@
 | 
				
			|||||||
    <Compile Include="Models\WinEventLogModel.cs" />
 | 
					    <Compile Include="Models\WinEventLogModel.cs" />
 | 
				
			||||||
    <Compile Include="Models\WorkFlowModels.cs" />
 | 
					    <Compile Include="Models\WorkFlowModels.cs" />
 | 
				
			||||||
    <Compile Include="PdfGenerator\BinaryContentResult.cs" />
 | 
					    <Compile Include="PdfGenerator\BinaryContentResult.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="PdfGenerator\FakeView.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="PdfGenerator\HtmlViewRenderer.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="PdfGenerator\PdfViewController.cs" />
 | 
				
			||||||
    <Compile Include="PdfGenerator\PrintHeaderFooter.cs" />
 | 
					    <Compile Include="PdfGenerator\PrintHeaderFooter.cs" />
 | 
				
			||||||
    <Compile Include="PdfGenerator\StandardPdfRenderer.cs" />
 | 
					    <Compile Include="PdfGenerator\StandardPdfRenderer.cs" />
 | 
				
			||||||
    <Compile Include="Properties\AssemblyInfo.cs" />
 | 
					    <Compile Include="Properties\AssemblyInfo.cs" />
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										36
									
								
								Fab2ApprovalSystem/PdfGenerator/FakeView.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Fab2ApprovalSystem/PdfGenerator/FakeView.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					using System.Web;
 | 
				
			||||||
 | 
					using System.Web.Mvc;
 | 
				
			||||||
 | 
					using System.Web.Security;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if NET8
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.Rendering;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.ViewEngines;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Net;
 | 
				
			||||||
 | 
					using System.Net.Http;
 | 
				
			||||||
 | 
					using System.Security.Claims;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Fab2ApprovalSystem.PdfGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class FakeView : IView {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void Render(ViewContext viewContext, TextWriter writer) {
 | 
				
			||||||
 | 
					        throw new NotImplementedException();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if NET8
 | 
				
			||||||
 | 
					    string IView.Path => throw new NotImplementedException();
 | 
				
			||||||
 | 
					    Task IView.RenderAsync(ViewContext context) => throw new NotImplementedException();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										59
									
								
								Fab2ApprovalSystem/PdfGenerator/HtmlViewRenderer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								Fab2ApprovalSystem/PdfGenerator/HtmlViewRenderer.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					using System.Web;
 | 
				
			||||||
 | 
					using System.Web.Mvc;
 | 
				
			||||||
 | 
					using System.Web.Mvc.Html;
 | 
				
			||||||
 | 
					using System.Web.Security;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if NET8
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Net;
 | 
				
			||||||
 | 
					using System.Net.Http;
 | 
				
			||||||
 | 
					using System.Security.Claims;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Fab2ApprovalSystem.PdfGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class HtmlViewRenderer {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public string RenderViewToString(Controller controller, string viewName, object viewData) {
 | 
				
			||||||
 | 
					        StringBuilder renderedView = new();
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					        using (StringWriter responseWriter = new(renderedView)) {
 | 
				
			||||||
 | 
					            HttpResponse fakeResponse = new(responseWriter);
 | 
				
			||||||
 | 
					            HttpContext fakeContext = new(HttpContext.Current.Request, fakeResponse);
 | 
				
			||||||
 | 
					            ControllerContext fakeControllerContext = new(new HttpContextWrapper(fakeContext), controller.ControllerContext.RouteData, controller.ControllerContext.Controller);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var oldContext = HttpContext.Current;
 | 
				
			||||||
 | 
					            HttpContext.Current = fakeContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            using (var viewPage = new ViewPage()) {
 | 
				
			||||||
 | 
					                HtmlHelper html = new HtmlHelper(CreateViewContext(responseWriter, fakeControllerContext), viewPage);
 | 
				
			||||||
 | 
					                html.RenderPartial(viewName, viewData);
 | 
				
			||||||
 | 
					                HttpContext.Current = oldContext;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return renderedView.ToString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static ViewContext CreateViewContext(TextWriter responseWriter, ControllerContext fakeControllerContext) {
 | 
				
			||||||
 | 
					        return new ViewContext(fakeControllerContext, new FakeView(), new ViewDataDictionary(), new TempDataDictionary(), responseWriter);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										56
									
								
								Fab2ApprovalSystem/PdfGenerator/PdfViewController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								Fab2ApprovalSystem/PdfGenerator/PdfViewController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,56 @@
 | 
				
			|||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					using System.Web;
 | 
				
			||||||
 | 
					using System.Web.Mvc;
 | 
				
			||||||
 | 
					using System.Web.Security;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Net;
 | 
				
			||||||
 | 
					using System.Net.Http;
 | 
				
			||||||
 | 
					using System.Security.Claims;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Fab2ApprovalSystem.PdfGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !NET8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class PdfViewController : Controller {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private readonly HtmlViewRenderer htmlViewRenderer;
 | 
				
			||||||
 | 
					    private readonly StandardPdfRenderer standardPdfRenderer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PdfViewController() {
 | 
				
			||||||
 | 
					        htmlViewRenderer = new HtmlViewRenderer();
 | 
				
			||||||
 | 
					        standardPdfRenderer = new StandardPdfRenderer();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected ActionResult ViewPdf(string pageTitle, string viewName, object model) {
 | 
				
			||||||
 | 
					        // Render the view html to a string.
 | 
				
			||||||
 | 
					        string htmlText = htmlViewRenderer.RenderViewToString(this, viewName, model);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Let the html be rendered into a PDF document through iTextSharp.
 | 
				
			||||||
 | 
					        byte[] buffer = standardPdfRenderer.Render(htmlText, pageTitle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the PDF as a binary stream to the client.
 | 
				
			||||||
 | 
					        return new BinaryContentResult(buffer, "application/pdf");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected void SavePdf(string fileName, string viewName, object model) {
 | 
				
			||||||
 | 
					        // Render the view html to a string.
 | 
				
			||||||
 | 
					        string htmlText = htmlViewRenderer.RenderViewToString(this, viewName, model);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Let the html be rendered into a PDF document through iTextSharp.
 | 
				
			||||||
 | 
					        byte[] buffer = standardPdfRenderer.Render(htmlText, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        using (FileStream fs = new(fileName, FileMode.Create)) {
 | 
				
			||||||
 | 
					            fs.Write(buffer, 0, buffer.Length);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@ -9,33 +9,16 @@ using System.IO;
 | 
				
			|||||||
namespace Fab2ApprovalSystem.PdfGenerator;
 | 
					namespace Fab2ApprovalSystem.PdfGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class StandardPdfRenderer {
 | 
					public class StandardPdfRenderer {
 | 
				
			||||||
 | 
					 | 
				
			||||||
    private const int HorizontalMargin = 40;
 | 
					    private const int HorizontalMargin = 40;
 | 
				
			||||||
    private const int VerticalMargin = 40;
 | 
					    private const int VerticalMargin = 40;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static byte[] GetPortableDocumentFormatBytes(string pageTitle, string htmlText) {
 | 
					    public byte[] Render(string htmlText, string pageTitle) {
 | 
				
			||||||
        byte[] results;
 | 
					        byte[] renderedBuffer;
 | 
				
			||||||
        using (MemoryStream memoryStream = GetPortableDocumentFormat(pageTitle, htmlText)) {
 | 
					 | 
				
			||||||
            results = new byte[memoryStream.Position];
 | 
					 | 
				
			||||||
            memoryStream.Position = 0;
 | 
					 | 
				
			||||||
            memoryStream.Read(results, 0, results.Length);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return results;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static void WritePortableDocumentFormatToFile(string pageTitle, string htmlText, string path) {
 | 
					        using (MemoryStream outputMemoryStream = new()) {
 | 
				
			||||||
        using (MemoryStream memoryStream = GetPortableDocumentFormat(pageTitle, htmlText)) {
 | 
					 | 
				
			||||||
            using (FileStream fileStream = new(path, FileMode.Create)) {
 | 
					 | 
				
			||||||
                memoryStream.CopyTo(fileStream);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static MemoryStream GetPortableDocumentFormat(string pageTitle, string htmlText) {
 | 
					 | 
				
			||||||
        MemoryStream result = new();
 | 
					 | 
				
			||||||
#if !NET8
 | 
					#if !NET8
 | 
				
			||||||
            using (Document pdfDocument = new Document(PageSize.A4, HorizontalMargin, HorizontalMargin, VerticalMargin, VerticalMargin)) {
 | 
					            using (Document pdfDocument = new Document(PageSize.A4, HorizontalMargin, HorizontalMargin, VerticalMargin, VerticalMargin)) {
 | 
				
			||||||
            using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, result)) {
 | 
					                PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, outputMemoryStream);
 | 
				
			||||||
                pdfWriter.CloseStream = false;
 | 
					                pdfWriter.CloseStream = false;
 | 
				
			||||||
                pdfWriter.PageEvent = new PrintHeaderFooter { Title = pageTitle };
 | 
					                pdfWriter.PageEvent = new PrintHeaderFooter { Title = pageTitle };
 | 
				
			||||||
                pdfDocument.Open();
 | 
					                pdfDocument.Open();
 | 
				
			||||||
@ -44,10 +27,15 @@ public class StandardPdfRenderer {
 | 
				
			|||||||
                        htmlWorker.Parse(htmlViewReader);
 | 
					                        htmlWorker.Parse(htmlViewReader);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        return result;
 | 
					
 | 
				
			||||||
 | 
					            renderedBuffer = new byte[outputMemoryStream.Position];
 | 
				
			||||||
 | 
					            outputMemoryStream.Position = 0;
 | 
				
			||||||
 | 
					            outputMemoryStream.Read(renderedBuffer, 0, renderedBuffer.Length);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return renderedBuffer;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,19 +1,5 @@
 | 
				
			|||||||
@model Fab2ApprovalSystem.ViewModels.ECNPdf
 | 
					@model Fab2ApprovalSystem.ViewModels.ECNPdf
 | 
				
			||||||
@{
 | 
					<table style="width:100%;">
 | 
				
			||||||
    Layout = null;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<!DOCTYPE html>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<head>
 | 
					 | 
				
			||||||
    <meta charset="utf-8" />
 | 
					 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
					 | 
				
			||||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 | 
					 | 
				
			||||||
    <title></title>
 | 
					 | 
				
			||||||
</head>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<body class="navbar-inner">
 | 
					 | 
				
			||||||
    <table style="width:100%;">
 | 
					 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <td>
 | 
					        <td>
 | 
				
			||||||
            <table cellpadding="3" cellspacing="3" border="1">
 | 
					            <table cellpadding="3" cellspacing="3" border="1">
 | 
				
			||||||
@ -121,6 +107,7 @@
 | 
				
			|||||||
                        </table>
 | 
					                        </table>
 | 
				
			||||||
                    </td>
 | 
					                    </td>
 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            </table>
 | 
					            </table>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
@ -240,6 +227,7 @@
 | 
				
			|||||||
                    </td>
 | 
					                    </td>
 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            </table>
 | 
					            </table>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
@ -266,6 +254,35 @@
 | 
				
			|||||||
            </table>
 | 
					            </table>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
 | 
					    @*<tr>
 | 
				
			||||||
 | 
					    <td>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <table border="1">
 | 
				
			||||||
 | 
					    <tr bgcolor="#c4baba" color="#000000">
 | 
				
			||||||
 | 
					    <td colspan="3">Training Notification</td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
 | 
					    <tr>
 | 
				
			||||||
 | 
					    <td>
 | 
				
			||||||
 | 
					    <table border="0">
 | 
				
			||||||
 | 
					    <tr>
 | 
				
			||||||
 | 
					    <td>
 | 
				
			||||||
 | 
					    <font size="1">
 | 
				
			||||||
 | 
					    Training:
 | 
				
			||||||
 | 
					    @(Model.TrainingRequired ? "Yes" : "No")
 | 
				
			||||||
 | 
					    </font>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <font size="1">
 | 
				
			||||||
 | 
					    @(Model.TrainingBy.Length > 0 ? "(" + Model.TrainingBy + ")" : Model.TrainingBy)
 | 
				
			||||||
 | 
					    </font>
 | 
				
			||||||
 | 
					    </td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					    </td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </td>
 | 
				
			||||||
 | 
					    </tr>*@
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <td>
 | 
					        <td>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -321,8 +338,10 @@
 | 
				
			|||||||
                        </font>
 | 
					                        </font>
 | 
				
			||||||
                    </td>
 | 
					                    </td>
 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            </table>
 | 
					            </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
@ -330,7 +349,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            <table border="1">
 | 
					            <table border="1">
 | 
				
			||||||
                <tr bgcolor="#c4baba" color="#000000">
 | 
					                <tr bgcolor="#c4baba" color="#000000">
 | 
				
			||||||
                        <td colspan="1">Training Notification</td>
 | 
					                    <td colspan="5">Training Notification</td>
 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
                <tr style="display:block;">
 | 
					                <tr style="display:block;">
 | 
				
			||||||
                    <td>
 | 
					                    <td>
 | 
				
			||||||
@ -348,8 +367,10 @@
 | 
				
			|||||||
                        </font>
 | 
					                        </font>
 | 
				
			||||||
                    </td>
 | 
					                    </td>
 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            </table>
 | 
					            </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
@ -496,11 +517,19 @@
 | 
				
			|||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            </table>
 | 
					            </table>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    </table>
 | 
					 | 
				
			||||||
</body>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
</html>
 | 
					</table> <!--main table -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -52,7 +52,7 @@ public class EngChangeNoticeDMOTests {
 | 
				
			|||||||
        try { throw new Exception(); } catch (Exception) { }
 | 
					        try { throw new Exception(); } catch (Exception) { }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static void EngChangeNoticeDMO(ILogger? logger, AppSettings appSettings, int ecnNumber) {
 | 
					    private static void EngChangeNoticeDMO(ILogger? logger, AppSettings appSettings) {
 | 
				
			||||||
#pragma warning disable IDE0059
 | 
					#pragma warning disable IDE0059
 | 
				
			||||||
        SetGlobalVars(logger, appSettings);
 | 
					        SetGlobalVars(logger, appSettings);
 | 
				
			||||||
        ECN_DMO ecnDMO = new();
 | 
					        ECN_DMO ecnDMO = new();
 | 
				
			||||||
@ -84,9 +84,6 @@ public class EngChangeNoticeDMOTests {
 | 
				
			|||||||
        // int SubmitTECNExtensionDocument(int issueID, appSettings.UserId, int documentType, DateTime extensionDate);
 | 
					        // int SubmitTECNExtensionDocument(int issueID, appSettings.UserId, int documentType, DateTime extensionDate);
 | 
				
			||||||
        // void TECNExtensionLog(int ecnNumber, DateTime extensionDate);
 | 
					        // void TECNExtensionLog(int ecnNumber, DateTime extensionDate);
 | 
				
			||||||
        // void UpdateECNType(int ecnNumber, string ecnType);
 | 
					        // void UpdateECNType(int ecnNumber, string ecnType);
 | 
				
			||||||
        ECNPdf ecn = ecnDMO.GetECNPdf(ecnNumber);
 | 
					 | 
				
			||||||
        string categoryId = ecnDMO.GetCategoryID(ecn);
 | 
					 | 
				
			||||||
        string trainingNotificationTo = ecnDMO.GetTrainingNotificationTo(ecn, new TrainingDMO());
 | 
					 | 
				
			||||||
        if (ecnDMO is null) { }
 | 
					        if (ecnDMO is null) { }
 | 
				
			||||||
#pragma warning restore IDE0059
 | 
					#pragma warning restore IDE0059
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -95,14 +92,13 @@ public class EngChangeNoticeDMOTests {
 | 
				
			|||||||
    [Ignore]
 | 
					    [Ignore]
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    [TestMethod]
 | 
					    [TestMethod]
 | 
				
			||||||
    [DataRow(82689)]
 | 
					    public void EngChangeNoticeDMOIsAttachedOnly() {
 | 
				
			||||||
    public void EngChangeNoticeDMOIsAttachedOnly(int ecnNumber) {
 | 
					 | 
				
			||||||
        _Logger?.LogInformation("Starting Web Application");
 | 
					        _Logger?.LogInformation("Starting Web Application");
 | 
				
			||||||
        IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider;
 | 
					        IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider;
 | 
				
			||||||
        AppSettings? appSettings = serviceProvider?.GetRequiredService<AppSettings>();
 | 
					        AppSettings? appSettings = serviceProvider?.GetRequiredService<AppSettings>();
 | 
				
			||||||
        Assert.IsTrue(appSettings is not null);
 | 
					        Assert.IsTrue(appSettings is not null);
 | 
				
			||||||
        if (System.Diagnostics.Debugger.IsAttached)
 | 
					        if (System.Diagnostics.Debugger.IsAttached)
 | 
				
			||||||
            EngChangeNoticeDMO(_Logger, appSettings, ecnNumber);
 | 
					            EngChangeNoticeDMO(_Logger, appSettings);
 | 
				
			||||||
        _Logger?.LogInformation("{TestName} completed", _TestContext?.TestName);
 | 
					        _Logger?.LogInformation("{TestName} completed", _TestContext?.TestName);
 | 
				
			||||||
        NonThrowTryCatch();
 | 
					        NonThrowTryCatch();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user