From f417b4d929c9b1628526893cd38793b918f14762 Mon Sep 17 00:00:00 2001 From: Tom Karasch Date: Mon, 27 Apr 2026 19:10:38 -0400 Subject: [PATCH 1/4] 1047 Add capability to export Site Summary reports as PDFs Introduces a new PDF generation page for Site Summaries, allowing users to select an export destination (Local, Storage, or SharePoint) and preview the report content before generation. --- .../Dto/Reports/SiteSummaryQuerySpec.cs | 31 +-- FMS/Pages/Reporting/SiteSummary/Index.cshtml | 10 +- .../Reporting/SiteSummary/Index.cshtml.cs | 1 + .../Reporting/SiteSummary/IndexPdf.cshtml | 184 ++++++++++++++++++ .../Reporting/SiteSummary/IndexPdf.cshtml.cs | 90 +++++++++ 5 files changed, 287 insertions(+), 29 deletions(-) create mode 100644 FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml create mode 100644 FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs diff --git a/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs b/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs index 1e0257a7..303f4436 100644 --- a/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs +++ b/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs @@ -1,4 +1,4 @@ -namespace FMS.Domain.Dto +namespace FMS.Domain.Dto { public class SiteSummaryQuerySpec { @@ -10,6 +10,9 @@ public SiteSummaryQuerySpec() { } [Display(Name = "Sort By")] public SiteSummarySortBy SortBy { get; set; } = SiteSummarySortBy.Facility_Number; + [Display(Name = "Export To")] + public SiteSummaryExportTo ExportTo { get; set; } = SiteSummaryExportTo.Storage; + [Display(Name = "Facility Number")] public string FacilityNumber { get; set; } @@ -61,7 +64,8 @@ public SiteSummaryQuerySpec() { } { nameof(AllOrgUnits), AllOrgUnits.ToString() }, { nameof(ShowHeader), ShowHeader.ToString() }, { nameof(SortBy), SortBy.ToString() }, - { nameof(Include), Include.ToString() } + { nameof(Include), Include.ToString() }, + { nameof(ExportTo), ExportTo.ToString() } }; public void TrimAll() @@ -83,27 +87,6 @@ public enum SiteSummaryAddlOrgUnitInclusion Include, Exclude } - - public string GetSiteSummarySortText(SiteSummarySortBy sortBy) - { - var title = ""; - switch (sortBy) - { - case SiteSummarySortBy.Facility_Number: - title += " Facility Number"; - break; - case SiteSummarySortBy.Facility_Name: - title += " Facility Name"; - break; - case SiteSummarySortBy.County: - title += " County"; - break; - case SiteSummarySortBy.Class: - title += " Class"; - break; - } - - return title; - } + } } } diff --git a/FMS/Pages/Reporting/SiteSummary/Index.cshtml b/FMS/Pages/Reporting/SiteSummary/Index.cshtml index 7d5f52c2..8c540cde 100644 --- a/FMS/Pages/Reporting/SiteSummary/Index.cshtml +++ b/FMS/Pages/Reporting/SiteSummary/Index.cshtml @@ -1,4 +1,4 @@ -@page +@page @using FMS.Domain.Dto @using FMS.Domain.Entities.Users @model FMS.Pages.Reporting.SiteSummary.IndexModel @@ -137,10 +137,10 @@
-
+
- - Clear + + Clear
@@ -193,7 +193,7 @@ - Export/Print List + Export/Print Site Summary List
diff --git a/FMS/Pages/Reporting/SiteSummary/Index.cshtml.cs b/FMS/Pages/Reporting/SiteSummary/Index.cshtml.cs index d318e7d4..c4ee8ad3 100644 --- a/FMS/Pages/Reporting/SiteSummary/Index.cshtml.cs +++ b/FMS/Pages/Reporting/SiteSummary/Index.cshtml.cs @@ -1,3 +1,4 @@ +using DocumentFormat.OpenXml.Office2010.Excel; using FMS.Domain.Data; using FMS.Domain.Dto; using FMS.Domain.Dto.Reports; diff --git a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml new file mode 100644 index 00000000..929e82a5 --- /dev/null +++ b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml @@ -0,0 +1,184 @@ +@page "{hsiId?}" +@using System.Globalization +@using FMS.Domain.Dto +@model FMS.Pages.Reporting.SiteSummary.IndexPdfModel +@{ + ViewData["Title"] = $"Site Summary(s)"; +} +

@ViewData["Title"]

+← Back to Reports +
+
+
+ + + + + + + + + +
+
+
+

+ Choose Where to Export PDF Files: +

+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ + + Clear +
+
+
+
+
+
+ @if (Model.SummaryList.Count == 0) + { +

No matching results found.

+ } + else + { + + + + + + + + + + + + @foreach (var item in Model.SummaryList) + { + + + + + + + + } + +
Facility InfoCleanup StatusCleanup PriorityScore InfoSubstances
+ @Html.DisplayFor(m => item.FacilityNumber, "StringOrNone")
+ @Html.DisplayFor(m => item.Name, "StringOrNone")
+ @Html.DisplayFor(m => item.OrganizationalUnit.Name, "StringOrNone")
+ @Html.DisplayFor(m => item.ComplianceOfficer.Name, "StringOrNone")
+ @Html.DisplayFor(m => item.County.Name, "StringOrNone")
+ @Html.DisplayFor(m => item.Latitude, "DecimalOrNone")/@Html.DisplayFor(m => item.Longitude, "DecimalOrNone")
+
+ Parcels:
+ @foreach (var parcel in item.Parcels) + { + if (parcel.ParcelType?.Name != "SubList" && parcel.DeListDate is null) + { +
+ PARCEL NUMBER
+ @parcel.ParcelNumber
+ ACREAGE
+ @Html.DisplayFor(Model => parcel.Acres, "DoubleOrNone")
+ DATE LISTED
+ @Html.DisplayFor(Model => parcel.ListDate, "DateOrNone")
+
+ } + } +
+ LAST KNOWN PROPERTY OWNER(S):
+ @foreach (var contact in item.Contacts) + { + @if (contact.ContactType?.Name == "Property Owner" && contact.Active) + { +
+ if (!string.IsNullOrEmpty(contact.Company)) + { + @contact.Company
+ } + else + { + @contact.GetFullName()
+ } + @contact.Address +
+ @contact.City + , + @contact.State + + @contact.PostalCode +
+ } + } + @if (Model.HasSublistedParcels(item)) + { +
+

EPD received notification of a release to the following property(s), and determined on the indicated date that the property should be subisted as part of this site.

+ @foreach (var parcel in item.Parcels) + { + if (parcel.ParcelType?.Name == "SubList") + { +
+ PARCEL NAME
+ @parcel.SubListParcelName
+ ACREAGE
+ @Html.DisplayFor(Model => parcel.Acres, "DoubleOrNone")
+ PARCEL NUMBER
+ @parcel.ParcelNumber
+ DATE LISTED
+ @Html.DisplayFor(Model => parcel.ListDate, "DateOrNone")
+
+ } + } + } +
+ STATUS OF CLEANUP ACTIVITIES:
+ @Model.GetStatusLanguage(item) +
+ CLEANUP PRIORITY: The Director has designated this site as a Class @item.LocationDetails?.LocationClass.Name
+ GA EPD DIRECTOR'S DETERMINATION REGARDING CORRECTIVE ACTION:
+ @item.LocationDetails?.LocationClass.Description +
+ REGULATED SUBSTANCES RELEASED, AND THREATS TO HUMAN HEALTH AND ENVIRONMENT POSED BY THE RELEASE:
+ @Model.GetScoreLanguage(item) +
+ @foreach (var substance in item.Substances.OrderBy(s => s.Chemical.ChemicalName)) + { +
+
@substance.Chemical.ChemicalName
+
@Html.DisplayFor(model => substance.Groundwater, "BoolCheckbox")GW
+
@Html.DisplayFor(model => substance.Soil, "BoolCheckbox")Soil
+
+ } +
+ } +
\ No newline at end of file diff --git a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs new file mode 100644 index 00000000..d92444ac --- /dev/null +++ b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs @@ -0,0 +1,90 @@ +using FMS.Domain.Dto; +using FMS.Domain.Repositories; +using FMS.Helpers; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace FMS.Pages.Reporting.SiteSummary +{ + public class IndexPdfModel : PageModel + { + private readonly IReportingRepository _repository; + private readonly IConfiguration _configuration; + + public IndexPdfModel(IReportingRepository repository, IConfiguration configuration) + { + _repository = repository; + _configuration = configuration; + } + + public string GoogleMapsApiKey => _configuration["GoogleMapSettings:ApiKey"] ?? string.Empty; + + [BindProperty] + public SiteSummaryQuerySpec Spec { get; set; } + + [BindProperty] + public IReadOnlyList SummaryList { get; set; } = []; + + [BindProperty] + public SiteSummaryQuerySpec.SiteSummaryExportTo SiteSummaryExportTo { get; set; } + + + public async Task OnGetAsync(SiteSummaryQuerySpec spec) + { + Spec = spec; + + SummaryList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); + + return Page(); + } + + public async Task OnGetExportAsync(SiteSummaryQuerySpec spec) + { + Spec = spec; + + SiteSummaryExportTo = Spec.ExportTo; + + SummaryList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); + + return Page(); + } + + public string GetGoogleMapsUrl(SiteSummaryReportDto facility) + { + if (facility.Latitude != 0 && facility.Longitude != 0 && facility.LocationDetails != null) + { + return + $"https://maps.googleapis.com/maps/api/staticmap?center={facility.Latitude},{facility.Longitude}&zoom={facility.LocationDetails?.MapZoom}&size=250x250&markers=color:red|{facility.Latitude},{facility.Longitude}&maptype=roadmap&key={GoogleMapsApiKey}&style=feature:poi|visibility:off"; + } + return null; + } + + public string GetStatusLanguage(SiteSummaryReportDto facility) => + SiteSummaryHelper.GetCleanupStatusLanguage(facility); + + public string GetScoreLanguage(SiteSummaryReportDto facility) + { + var groundWaterLang = SiteSummaryHelper.GetLanguageForGWScore(facility); + var onsiteScoreLang = SiteSummaryHelper.GetLanguageForOSScore(facility); + var exLang = ""; + if (facility.ScoreDetails != null && facility.ScoreDetails.UseComments) + { + exLang = SiteSummaryHelper.GetLanguageForExceptions(facility); + } + + return groundWaterLang + onsiteScoreLang + exLang; + } + + public bool HasSublistedParcels(SiteSummaryReportDto facility) + { + foreach (var parcel in facility.Parcels) + { + if (parcel.ParcelType?.Name == "SubList") + { + return true; + } + } + return false; + } + } +} From 027613a9c2f3e1a98d6a6c39d2de133e90909397 Mon Sep 17 00:00:00 2001 From: Tom Karasch Date: Thu, 7 May 2026 14:05:20 -0400 Subject: [PATCH 2/4] 1047 Add initial PDF generation infrastructure for Site Summary reports Introduces the `itext.pdfhtml` dependency and initial helper classes to support converting Site Summary reports to PDF. This includes a new `SiteSummaryLog` entity for tracking generated files and updated routing logic to handle different export destinations (Local, Storage, and SharePoint). Includes a legacy VB.NET reference file in `docs/` for logic migration purposes. Fixes #1047 --- FMS.Domain/Entities/SiteSummaryLog.cs | 26 + FMS/FMS.csproj | 1 + FMS/Helpers/SiteSummaryPdfHelper.cs | 135 ++++ .../Reporting/SiteSummary/IndexPdf.cshtml | 9 +- .../Reporting/SiteSummary/IndexPdf.cshtml.cs | 101 ++- .../Report - Macro for - Site Summary 1 1.cls | 609 ++++++++++++++++++ 6 files changed, 848 insertions(+), 33 deletions(-) create mode 100644 FMS.Domain/Entities/SiteSummaryLog.cs create mode 100644 FMS/Helpers/SiteSummaryPdfHelper.cs create mode 100644 docs/Report - Macro for - Site Summary 1 1.cls diff --git a/FMS.Domain/Entities/SiteSummaryLog.cs b/FMS.Domain/Entities/SiteSummaryLog.cs new file mode 100644 index 00000000..7ed29469 --- /dev/null +++ b/FMS.Domain/Entities/SiteSummaryLog.cs @@ -0,0 +1,26 @@ +using FMS.Domain.Entities.Base; +using System; +using System.Collections.Generic; +using System.Text; + +namespace FMS.Domain.Entities +{ + public class SiteSummaryLog : BaseActiveModel + { + public SiteSummaryLog() { } + + public SiteSummaryLog(Guid id, string fileName, string filePath, string fileType) + { + Id = id; + PdfFileName = fileName; + PdfFilePath = filePath; + PdfFileType = fileType; + } + + public string PdfFileName { get; set; } + + public string PdfFilePath { get; set; } + + public string PdfFileType { get; set; } + } +} diff --git a/FMS/FMS.csproj b/FMS/FMS.csproj index 82d17237..8c4899a4 100644 --- a/FMS/FMS.csproj +++ b/FMS/FMS.csproj @@ -27,6 +27,7 @@ + diff --git a/FMS/Helpers/SiteSummaryPdfHelper.cs b/FMS/Helpers/SiteSummaryPdfHelper.cs new file mode 100644 index 00000000..272ff3a4 --- /dev/null +++ b/FMS/Helpers/SiteSummaryPdfHelper.cs @@ -0,0 +1,135 @@ +using FMS.Domain.Dto; +using FMS.Domain.Repositories; +using iText.Commons.Utils; +using System.Net; +using System; +using System.IO; +using iText.Html2pdf; + +namespace FMS.Helpers +{ + public class SiteSummaryPdfHelper + { + private readonly IReportingRepository _repository; + private readonly IConfiguration _configuration; + public SiteSummaryPdfHelper(IReportingRepository repository, IConfiguration configuration) + { + _repository = repository; + _configuration = configuration; + } + public string GoogleMapsApiKey => _configuration["GoogleMapSettings:ApiKey"] ?? string.Empty; + + public string GetGoogleMapsUrl(SiteSummaryReportDto facility) + { + if (facility.Latitude != 0 && facility.Longitude != 0 && facility.LocationDetails != null) + { + return + $"https://maps.googleapis.com/maps/api/staticmap?center={facility.Latitude},{facility.Longitude}&zoom={facility.LocationDetails?.MapZoom}&size=250x250&markers=color:red|{facility.Latitude},{facility.Longitude}&maptype=roadmap&key={GoogleMapsApiKey}&style=feature:poi|visibility:off"; + } + return null; + } + + public string GetStatusLanguage(SiteSummaryReportDto facility) => + SiteSummaryHelper.GetCleanupStatusLanguage(facility); + + public string GetScoreLanguage(SiteSummaryReportDto facility) + { + var groundWaterLang = SiteSummaryHelper.GetLanguageForGWScore(facility); + var onsiteScoreLang = SiteSummaryHelper.GetLanguageForOSScore(facility); + var exLang = ""; + if (facility.ScoreDetails != null && facility.ScoreDetails.UseComments) + { + exLang = SiteSummaryHelper.GetLanguageForExceptions(facility); + } + + return groundWaterLang + onsiteScoreLang + exLang; + } + + public bool HasSublistedParcels(SiteSummaryReportDto facility) + { + foreach (var parcel in facility.Parcels) + { + if (parcel.ParcelType?.Name == "SubList") + { + return true; + } + } + return false; + } + + /// + /// Converts a simple HTML file to PDF using an InputStream and an OutputStream as arguments for the convertToPdf() method. + /// + public class CreateFromURL + { + const string USER_AGENT = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; " + + "Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; " + + ".NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; " + + "InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)"; + + /// + /// The path to the resulting PDF file. + /// + public static readonly String DEST = "results/htmlsamples/ch07/url2pdf_1.pdf"; + + /// + /// The target folder for the result. + /// + public static readonly String ADDRESS = "https://stackoverflow.com/help/on-topic"; + + /// + /// The main method of this example. + /// + /// no arguments are needed to run this example. + public static void Main(String[] args) + { + //String licensePath = LicenseUtil.GetPathToLicenseFileWithITextCoreAndPdfHtmlAndPdfCalligraphProducts(); + //using (Stream license = FileUtil.GetInputStreamForFile(licensePath)) + //{ + // LicenseKey.LoadLicenseFile(license); + //} + + FileInfo file = new FileInfo(DEST); + file.Directory.Create(); + + new CreateFromURL().CreatePdf(new Uri(ADDRESS), DEST); + } + + /// + /// Creates the PDF file. + /// + /// the URL object for the web page + /// the path to the resulting PDF + public void CreatePdf(Uri url, String dest) + { + using (var fileStream = new FileStream(dest, FileMode.Create)) + { + try + { + using (var httpClient = new System.Net.Http.HttpClient()) + { + httpClient.Timeout = TimeSpan.FromSeconds(15); + httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(USER_AGENT); + var websiteTask = httpClient.GetByteArrayAsync(url); + websiteTask.Wait(); + byte[] website = websiteTask.Result; + HtmlConverter.ConvertToPdf(new MemoryStream(website), fileStream); + } + } + catch (AggregateException ae) when (ae.InnerException is System.Net.Http.HttpRequestException hre) + { + // Handle HTTP request exception + } + catch (System.Net.Http.HttpRequestException hre) + { + // Handle HTTP request exception + } + catch (System.TimeoutException) + { + // Handle timeout + } + } + } + } + } +} diff --git a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml index 929e82a5..a51ee16f 100644 --- a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml +++ b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml @@ -9,7 +9,7 @@ ← Back to Reports
-
+ @@ -69,7 +69,7 @@ } else { - + @*
@@ -107,6 +107,9 @@ } }
+
+ Site Map for @item.Name +
LAST KNOWN PROPERTY OWNER(S):
@foreach (var contact in item.Contacts) { @@ -179,6 +182,6 @@ } -
Facility Info
+ *@ }
\ No newline at end of file diff --git a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs index d92444ac..6508d994 100644 --- a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs +++ b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs @@ -17,7 +17,6 @@ public IndexPdfModel(IReportingRepository repository, IConfiguration configurati _configuration = configuration; } - public string GoogleMapsApiKey => _configuration["GoogleMapSettings:ApiKey"] ?? string.Empty; [BindProperty] public SiteSummaryQuerySpec Spec { get; set; } @@ -38,53 +37,95 @@ public async Task OnGetAsync(SiteSummaryQuerySpec spec) return Page(); } - public async Task OnGetExportAsync(SiteSummaryQuerySpec spec) + public async Task OnPostAsync(SiteSummaryQuerySpec spec) { Spec = spec; SiteSummaryExportTo = Spec.ExportTo; + switch (SiteSummaryExportTo) + { + case SiteSummaryQuerySpec.SiteSummaryExportTo.Storage: + if (!await ExportToStorage()) + { + GetReturnMessage(ResponseType.Storage); + return Page(); + } + break; + case SiteSummaryQuerySpec.SiteSummaryExportTo.SharePoint: + if (!await ExportToSharePoint()) + { + GetReturnMessage(ResponseType.SharePoint); + return Page(); + } + break; + case SiteSummaryQuerySpec.SiteSummaryExportTo.Local: + if (!await ExportLocal()) + { + GetReturnMessage(ResponseType.Local); + return Page(); + } + break; + default: + break; + } + GetReturnMessage(ResponseType.Success); + return Page(); + } + + public async Task ExportToStorage() + { SummaryList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); - return Page(); + return true; } - public string GetGoogleMapsUrl(SiteSummaryReportDto facility) + public async Task ExportToSharePoint() { - if (facility.Latitude != 0 && facility.Longitude != 0 && facility.LocationDetails != null) - { - return - $"https://maps.googleapis.com/maps/api/staticmap?center={facility.Latitude},{facility.Longitude}&zoom={facility.LocationDetails?.MapZoom}&size=250x250&markers=color:red|{facility.Latitude},{facility.Longitude}&maptype=roadmap&key={GoogleMapsApiKey}&style=feature:poi|visibility:off"; - } - return null; + SummaryList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); + + return true; } - public string GetStatusLanguage(SiteSummaryReportDto facility) => - SiteSummaryHelper.GetCleanupStatusLanguage(facility); + public async Task ExportLocal() + { + SummaryList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); + + return true; + } - public string GetScoreLanguage(SiteSummaryReportDto facility) + public async Task OnPostReportAsync() { - var groundWaterLang = SiteSummaryHelper.GetLanguageForGWScore(facility); - var onsiteScoreLang = SiteSummaryHelper.GetLanguageForOSScore(facility); - var exLang = ""; - if (facility.ScoreDetails != null && facility.ScoreDetails.UseComments) - { - exLang = SiteSummaryHelper.GetLanguageForExceptions(facility); - } + var fileName = $"Events_NoActionTaken_{DateTime.Now:yyyy-MM-dd-HH-mm-ss.FFF}.xlsx"; - return groundWaterLang + onsiteScoreLang + exLang; + // "eventsNoActionTakenList" List to go to a report + IList eventsList = await _repository.GetEventsNoActionTakenReportAsync(); + + // Map to EventsNoActionTakenReportDto + var eventsNoActionTakenReportList = from p in eventsList + select new EventsNoActionTakenReportDto(p); + + // Export to Excel + return File( + eventsNoActionTakenReportList.ExportExcelAsByteArray(ExportHelper.ReportType.EventNoActionTaken), + "application/vnd.ms-excel", fileName); } - public bool HasSublistedParcels(SiteSummaryReportDto facility) + public string GetReturnMessage(ResponseType responseType) => responseType switch { - foreach (var parcel in facility.Parcels) - { - if (parcel.ParcelType?.Name == "SubList") - { - return true; - } - } - return false; + ResponseType.Storage => "Writing PDF Files to Storage was unsuccessful", + ResponseType.SharePoint => "Writing PDF Files to SharePoint was unsuccessful", + ResponseType.Local => "Exporting single PDF file was unsuccessful", + ResponseType.Success => "Operation completed successfully", + _ => "" + }; + + public enum ResponseType + { + Storage, + SharePoint, + Local, + Success } } } diff --git a/docs/Report - Macro for - Site Summary 1 1.cls b/docs/Report - Macro for - Site Summary 1 1.cls new file mode 100644 index 00000000..0250ecdd --- /dev/null +++ b/docs/Report - Macro for - Site Summary 1 1.cls @@ -0,0 +1,609 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "Report_Site Summary" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Compare Database + +Function setImagePath() +'This is to change the map insert with the HSI number + + Dim strImagePath As String + Dim strMDBPath As String + Dim intSlashLoc As String + + On Error GoTo PictureNotAvailable + strMDBPath = CurrentProject.FullName + intSlashLoc = InStrRev(strMDBPath, "\", Len(strMDBPath)) + + strImagePath = Left(strMDBPath, intSlashLoc) & "maps\h" + Trim(Str([HSI_ID])) + ".bmp" + Me.ImageFrame.Picture = strImagePath + GoTo sitesumrpt + +PictureNotAvailable: + strImagePath = Left(strMDBPath, intSlashLoc) & "maps\NoPicture.BMP" + Me.ImageFrame.Picture = strImagePath + + +sitesumrpt: + +OSmessage = "" +gwmessage = "" +except2message = "" +hsiexception = "" +hsi10144 = "" +gwa = "" +gw1e = "" +gw2em = "" +osa = "" +osb = "" +os1em = "" + +'This is to handle the exceptions for soil and gw scores + +If ([HSI_ID] = 10459 Or [HSI_ID] = 10498 Or [HSI_ID] = 10689 Or [HSI_ID] = 10829) Then + + Select Case HSI_ID + Case 10498 + hsiexception = "The Director has determined that a release of regulated substances from groundwater has posed a threat to a water of the state." + Case 10459, 10829, 10689 + hsiexception = "The Director has determined that a release of regulated substances from groundwater to a water of the state has resulted in an exceedance of state water quality standards." + End Select + gwmessage = hsiexception + 'except2message = hsi10144 +Else + +' Added new case to handle sources with a valid grand water score that need exception language - BGregory 12/4/2013 + + If ([HSI_ID] = 10144 Or [HSI_ID] = 10747 Or [HSI_ID] = 10826 Or [HSI_ID] = 10926) Then + + Select Case HSI_ID + + Case 10144 + hsiexception = "Releases of Mercury and PCBs at this site have caused bioaccumulation in fish and shellfish that has resulted in the need to recommend that human consumption be limited. A cleanup and investigation have been initiated at this site, pursuant to a CERCLA 106 removal order issued by USEPA. The site is listed on the National Priority List. " + Case 10747 + hsiexception = "The Director has determined that a release of regulated substances has occurred due to the abandonment of solid waste containing chromium, silver, zinc, and hydrochloric acid in containers, process units, and tanks at the site." + Case 10826 + hsiexception = "The Director has determined that a release of regulated substances from groundwater has posed a threat to a water of the state." + Case 10926 + hsiexception = "The Director has determined that a release of regulated substances from groundwater to a water of the state has resulted in an exceedance of state water quality standards." + End Select + End If + + +'This deals with listed for Groundwater + + If gw_score > 10 Then + + Select Case gw_a + Case 45 + gwa = "This site has a known release of " + gw_1d + " in groundwater at levels exceeding the reportable quantity. " + Case 10 + gwa = "This site has a suspected release of " + gw_1d + " in groundwater at levels exceeding the reportable quantity. " + Case 5 + gwa = "This site has a release of " + gw_1d + " that exceeds a reportable quantity because it has the potential to contaminate groundwater. " + Case Else + gwa = "!!!!! INVALID VALUE FOR GW_A !!!!!" + End Select + + Select Case gw_1e + Case 25 + gw1e = "This release has resulted in known human exposure greater than or equal to the MCL for " + gw_1d + ". " + Case 20 + gw1e = "This release has resulted in suspected human exposure. " + Case 18 + gw1e = "This release has resulted in known human exposure, with no MCL having been established for " + gw_1d + ". " + Case 15 + gw1e = "This release has resulted in known human exposure less than the MCL for " + gw_1d + ". " + Case 12 + gw1e = "This release has resulted in suspected human exposure. " + Case 8 + gw1e = "This release has resulted in suspected human exposure. " + Case 4, 3, 2 + gw1e = "No human exposure via drinking water is suspected from this release. " + Case 1, 0 + gw1e = "" + Case Else + gw1e = "!!!!! INVALID VALUE FOR GW_1E !!!!!" + End Select + + If gw_1e < 8 Then + + gw2estrt = "The nearest drinking water well is " + gw2eend = " from the area affected by the release. " + + Select Case [gw_2e] + Case 16 + gw2em = "less than 0.5 miles" + Case 9 + gw2em = "between 0.5 and 1 miles" + Case 4 + gw2em = "between 1 and 2 miles" + Case 1 + gw2em = "between 2 and 3 miles" + Case 0 + gw2em = "greater than 3 miles" + Case Else + gw2em = "!!!!! INVALID VALUE FOR GW_2E !!!!!" + End Select +End If + +'Added for HSI Exemption with valid GW score. BGregory 12/4/2013 + + If IsNull(hsiexception) Then + gwmessage = gwa + gw1e + gw2estrt + gw2em + gw2eend + Else + gwmessage = gwa + gw1e + gw2estrt + gw2em + gw2eend + except2message = hsiexception + End If +End If + +'This deals with listed for Soil + +If os_score <= 20 Then +OSmessage = "" +Else + Select Case [os_b] + Case 25 + osb = "This site has a known release of " + os_1d + " in soil at levels exceeding the reportable quantity. " + Case 15 + osb = "This site has a suspected release of " + os_1d + " in soil at levels exceeding the reportable quantity. " + Case Else + osb = "!!!!! INVALID VALUE FOR OS_B !!!!!" + + End Select + + Select Case [os_a] + Case 2 + osa = "This site has limited access. " + Case 4 + osa = "This site has unlimited access. " + Case Else + osa = "!!!!! INVALID VALUE FOR OS_A !!!!!" + + End Select + + Select Case [os_1e] + Case 8 + os1em = "less than 300 feet" + Case 6 + os1em = "between 301 and 1000 feet" + Case 4 + os1em = "between 1001 and 3000 feet" + Case 2 + os1em = "between 3001 and 5280 feet" + Case Else + os1em = "!!!!! INVALID VALUE FOR OS-1E !!!!!" + End Select + + OSmessage = osb + osa + "The nearest resident individual is " + os1em + " from the area affected by the release. " + End If +End If +'For Director's determination of corrective action +If Class = "II" Then +CAdeter = "Pending" +Else +CAdeter = "The Director has determined that this site requires corrective action." +End If + +'For cleanup status +mrrs = "Hazardous Site Response Act cleanup levels have been met for " +mrrs5_1 = "Hazardous Site Response Act cleanup levels have been met for " +mrrs5_2 = " through institutional and engineering controls to eliminate or reduce present and future threats to human health and the environment." +mcip = "Cleanup activities are being conducted for " +minv = "Investigations are being conducted to determine how much cleanup is necessary for " +mnat = "EPD has not yet directed the responsible parties to begin investigation or cleanup under the Hazardous Site Response Act for " +msource = "source materials" +msoil = "soil" +mgwater = "groundwater" +mssgall = "source materials, soil, and groundwater" +mssl = "source materials and soil" +msgw = "source materials and groundwater" +mslgw = "soil and groundwater" +mper = "." +'Added for Inactive and Abandon Sites -- TKarasch 11/8/17 +minac1 = "Although directed to by EPD, identified responsible parties are not currently performing the required investigation and/or cleanup under the Hazardous Site Response Act for " +minac2 = ". Enforcement is pending." +mabnd1 = "Identified responsible parties are unable or unwilling to conduct the required investigation and/or cleanup under the Hazardous Site Response Act for " +mabnd2 = ". EPD may perform these actions using state funding from the Hazardous Waste Trust Fund and may lien the property or pursue cost recovery." + +If ([Source_Stat] = "RRS5") Then +SESTAT = "5" +Else +SESTAT = Left([Source_Stat], 3) +End If + +If ([Soil_stat] = "RRS5") Then +SLSTAT = "5" +Else +SLSTAT = Left([Soil_stat], 3) +End If + +If ([Ground-water_Stat] = "RRS5") Then +GWSTAT = "5" +Else +GWSTAT = Left([Ground-water_Stat], 3) +End If + +cleanupstat = SESTAT & SLSTAT & GWSTAT + +Select Case cleanupstat + +'& Same Code for all 3 Status +Case "555" + clup = mrrs5_1 + IIf(LF = "Y", msgw, mssgall) + mrrs5_2 +Case "RRSRRSRRS" + clup = mrrs + IIf(LF = "Y", msgw, mssgall) + mper +Case "CIPCIPCIP" + clup = mcip + IIf(LF = "Y", msgw, mssgall) + mper +Case "INVINVINV" + clup = minv + IIf(LF = "Y", msgw, mssgall) + mper +Case "NATNATNAT" + clup = mnat + IIf(LF = "Y", msgw, mssgall) + mper +'Added Case Logic for ABND and INAC - TK-11/22/17 +Case "inainaina" + clup = minac1 + IIf(LF = "Y", msgw, mssgall) + minac2 +Case "abnabnabn" + clup = mabnd1 + IIf(LF = "Y", msgw, mssgall) + mabnd2 + +' Same Code for 2 of 3 Status +Case "55RRS" + clup = mrrs5_1 + IIf(LF = "Y", msource, mssl) + mrrs5_2 + " " + mrrs + mgwater + mper +Case "5RRS5" + clup = mrrs5_1 + msgw + mrrs5_2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) +Case "RRS55" + clup = mrrs5_1 + IIf(LF = "Y", mgwater, mslgw) + mrrs5_2 + " " + mrrs + msource + mper + +Case "55CIP" + clup = mrrs5_1 + IIf(LF = "Y", msource, mssl) + mrrs5_2 + " " + mcip + mgwater + mper +Case "5CIP5" + clup = mrrs5_1 + msgw + mrrs5_2 + " " + IIf(LF = "Y", "", mcip + msoil + mper) +Case "CIP55" + clup = mrrs5_1 + IIf(LF = "Y", mgwater, mslgw) + mrrs5_2 + " " + mcip + msource + mper + +Case "55INV" + clup = mrrs5_1 + IIf(LF = "Y", msource, mssl) + mrrs5_2 + " " + minv + mgwater + mper +Case "5INV5" + clup = mrrs5_1 + msgw + mrrs5_2 + " " + IIf(LF = "Y", "", minv + msoil + mper) +Case "INV55" + clup = mrrs5_1 + IIf(LF = "Y", mgwater, mslgw) + mrrs5_2 + " " + minv + msource + mper + +Case "55NAT" + clup = mrrs5_1 + IIf(LF = "Y", msource, mssl) + mrrs5_2 + " " + mnat + mgwater + mper +Case "5NAT5" + clup = mrrs5_1 + msgw + mrrs5_2 + " " + IIf(LF = "Y", "", mnat + msoil + mper) +Case "NAT55" + clup = mrrs5_1 + IIf(LF = "Y", mgwater, mslgw) + mrrs5_2 + " " + mnat + msource + mper + +Case "RRSRRS5" + clup = mrrs + IIf(LF = "Y", msource, mssl) + mper + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "RRS5RRS" + clup = mrrs + msgw + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) +Case "5RRSRRS" + clup = mrrs + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mrrs5_1 + msource + mrrs5_2 + +Case "RRSRRSCIP" + clup = mrrs + IIf(LF = "Y", msource, mssl) + mper + " " + mcip + mgwater + mper +Case "RRSCIPRRS" + clup = mrrs + msgw + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) +Case "CIPRRSRRS" + clup = mrrs + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mcip + msource + mper + +Case "RRSRRSINV" + clup = mrrs + IIf(LF = "Y", msource, mssl) + mper + " " + minv + mgwater + mper +Case "RRSINVRRS" + clup = mrrs + msgw + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) +Case "INVRRSRRS" + clup = mrrs + IIf(LF = "Y", mgwater, mslgw) + mper + " " + minv + msource + mper + +Case "RRSRRSNAT" + clup = mrrs + IIf(LF = "Y", msource, mssl) + mper + " " + mnat + mgwater + mper +Case "RRSNATRRS" + clup = mrrs + msgw + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) +Case "NATRRSRRS" + clup = mrrs + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mnat + msource + mper + + +Case "CIPCIP5" + clup = mcip + IIf(LF = "Y", msource, mssl) + mper + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "CIP5CIP" + clup = mcip + msgw + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) +Case "5CIPCIP" + clup = mcip + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mrrs5_1 + msource + mrrs5_2 + +Case "CIPCIPRRS" + clup = mcip + IIf(LF = "Y", msource, mssl) + mper + " " + mrrs + mgwater + mper +Case "CIPRRSCIP" + clup = mcip + msgw + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) +Case "RRSCIPCIP" + clup = mcip + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mrrs + msource + mper + +Case "CIPCIPINV" + clup = mcip + IIf(LF = "Y", msource, mssl) + mper + " " + minv + mgwater + mper +Case "CIPINVCIP" + clup = mcip + msgw + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) +Case "INVCIPCIP" + clup = mcip + IIf(LF = "Y", mgwater, mslgw) + mper + " " + minv + msource + mper + +Case "CIPCIPNAT" + clup = mcip + IIf(LF = "Y", msource, mssl) + mper + " " + mnat + mgwater + mper +Case "CIPNATCIP" + clup = mcip + msgw + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) +Case "NATCIPCIP" + clup = mcip + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mnat + msource + mper + +Case "INVINV5" + clup = minv + IIf(LF = "Y", msource, mssl) + mper + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "INV5INV" + clup = minv + msgw + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) +Case "5INVINV" + clup = minv + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mrrs5_1 + msource + mrrs5_2 + +Case "INVINVRRS" + clup = minv + IIf(LF = "Y", msource, mssl) + mper + " " + mrrs + mgwater + mper +Case "INVRRSINV" + clup = minv + msgw + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) +Case "RRSINVINV" + clup = minv + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mrrs + msource + mper + +Case "INVINVCIP" + clup = minv + IIf(LF = "Y", msource, mssl) + mper + " " + mcip + mgwater + mper +Case "INVCIPINV" + clup = minv + msgw + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) +Case "CIPINVINV" + clup = minv + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mcip + msource + mper + +Case "INVINVNAT" + clup = minv + IIf(LF = "Y", msource, mssl) + mper + " " + mnat + mgwater + mper +Case "INVNATINV" + clup = minv + msgw + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) +Case "NATINVINV" + clup = minv + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mnat + msource + mper + +Case "NATNAT5" + clup = mnat + IIf(LF = "Y", msource, mssl) + mper + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "NAT5NAT" + clup = mnat + msgw + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) +Case "5NATNAT" + clup = mnat + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mrrs5_1 + msource + mrrs5_2 + +Case "NATNATRRS" + clup = mnat + IIf(LF = "Y", msource, mssl) + mper + " " + mrrs + mgwater + mper +Case "NATRRSNAT" + clup = mnat + msgw + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) +Case "RRSNATNAT" + clup = mnat + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mrrs + msource + mper + +Case "NATNATCIP" + clup = mnat + IIf(LF = "Y", msource, mssl) + mper + " " + mcip + mgwater + mper +Case "NATCIPNAT" + clup = mnat + msgw + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) +Case "CIPNATNAT" + clup = mnat + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mcip + msource + mper + +Case "NATNATINV" + clup = mnat + IIf(LF = "Y", msource, mssl) + mper + " " + minv + mgwater + mper +Case "NATINVNAT" + clup = mnat + msgw + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) +Case "INVNATNAT" + clup = mnat + IIf(LF = "Y", mgwater, mslgw) + mper + " " + minv + msource + mper +'Added Case Logic for ABND and INAC - TK-11/22/17 +'Abandon sites +Case "rrsrrsabn" + clup = mrrs + IIf(LF = "Y", msource, mssl) + mper + " " + mabnd1 + mgwater + mabnd2 +Case "rrsabnrrs" + clup = mrrs + mssl + mper + " " + IIf(LF = "Y", "", mabnd1 + msoil + mabnd2) +Case "abnrrsrrs" + clup = mrrs + IIf(LF = "Y", mgwater, mslgw) + mper + " " + mabnd1 + msource + mabnd2 +Case "rrsabnabn" + clup = mrrs + msource + mper + " " + mabnd1 + IIf(LF = "Y", mgwater, mslgw) + mabnd2 +Case "abnabnrrs" + clup = mrrs + mgwater + mper + " " + mabnd1 + IIf(LF = "Y", msource, mssl) + mabnd2 +Case "abnrrsabn" + clup = IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mabnd1 + msgw + mabnd2 +Case "55abn" + clup = mrrs5_1 + IIf(LF = "Y", msource, mssl) + mrrs5_2 + " " + mabnd1 + mgwater + mabnd2 +Case "5abn5" + clup = mrrs5_1 + msgw + mrrs5_2 + " " + IIf(LF = "Y", "", mabnd1 + msoil + mabnd2) +Case "abn55" + clup = mrrs5_1 + IIf(LF = "Y", mgwater, mslgw) + mrrs5_2 + " " + mabnd1 + msource + mabnd2 +Case "5abnabn" + clup = mrrs5_1 + msource + mrrs5_2 + " " + mabnd1 + IIf(LF = "Y", mgwater, mslgw) + mabnd2 +Case "abnabn5" + clup = mrrs5_1 + mgwater + mrrs5_2 + " " + mabnd1 + IIf(LF = "Y", msource, mssl) + mabnd2 +Case "abn5abn" + clup = IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mabnd1 + msgw + mabnd2 +'Inactive sites +Case "rrsrrsina" + clup = mrrs + IIf(LF = "Y", msource, mssl) + mper + " " + minac1 + mgwater + minac2 +Case "rrsinarrs" + clup = mrrs + msgw + mper + " " + minac1 + IIf(LF = "Y", "", msoil) + minac2 +Case "rrsinaina" + clup = mrrs + msource + mper + " " + minac1 + IIf(LF = "Y", mgwater, mslgw) + minac2 +Case "inarrsrrs" + clup = mrrs + IIf(LF = "Y", mgwater, mslgw) + mper + " " + minac1 + msource + minac2 +Case "inainarrs" + clup = mrrs + mgwater + mper + " " + minac1 + IIf(LF = "Y", msource, mssl) + minac2 +Case "inarrsina" + clup = IIf(LF = "Y", "", mrrs + msoil + mper) + " " + minac1 + msgw + minac2 +Case "55ina" + clup = mrrs5_1 + IIf(LF = "Y", msource, mssl) + mrrs5_2 + " " + minac1 + mgwater + minac2 +Case "5ina5" + clup = mrrs5_1 + msgw + mrrs5_2 + " " + IIf(LF = "Y", "", minac1 + msoil + minac2) +Case "ina55" + clup = mrrs5_1 + IIf(LF = "Y", mgwater, mslgw) + mrrs5_2 + " " + minac1 + msource + minac2 +Case "5inaina" + clup = mrrs5_1 + msource + mrrs5_2 + " " + minac1 + IIf(LF = "Y", mgwater, mslgw) + minac2 +Case "inaina5" + clup = mrrs5_1 + mgwater + mrrs5_2 + " " + minac1 + IIf(LF = "Y", msource, mssl) + minac2 +Case "ina5ina" + clup = IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + minac1 + msgw + minac2 + +' 3 Different Status +Case "RRS5CIP" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mcip + mgwater + mper +Case "RRSCIP5" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "RRS5INV" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + minv + mgwater + mper +Case "RRSINV5" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "RRS5NAT" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mnat + mgwater + mper +Case "RRSNAT5" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "RRSCIPINV" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + minv + mgwater + mper +Case "RRSINVCIP" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mcip + mgwater + mper +Case "RRSCIPNAT" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mnat + mgwater + mper +Case "RRSNATCIP" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mcip + mgwater + mper +Case "RRSINVNAT" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mnat + mgwater + mper +Case "RRSNATINV" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + minv + mgwater + mper + + +Case "5RRSCIP" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mcip + mgwater + mper +Case "5RRSRRS" + clup = mrrs + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mrrs) + mslgw + mper +Case "5CIPRRS" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mrrs + mgwater + mper +Case "5RRSINV" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + minv + mgwater + mper +Case "5INVRRS" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mrrs + mgwater + mper +Case "5RRSNAT" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + minv + mgwater + mper +Case "5NATRRS" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mrrs + mgwater + mper +Case "5CIPINV" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + minv + mgwater + mper +Case "5INVCIP" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mcip + mgwater + mper +Case "5CIPNAT" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mnat + mgwater + mper +Case "5NATCIP" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mcip + mgwater + mper +Case "5INVNAT" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mnat + mgwater + mper +Case "5NATINV" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + minv + mgwater + mper + +Case "CIPRRS5" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "CIP5RRS" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mrrs + mgwater + mper +Case "CIPRRSINV" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + minv + mgwater + mper +Case "CIPINVRRS" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mrrs + mgwater + mper +Case "CIPRRSNAT" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mnat + mgwater + mper +Case "CIPNATRRS" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mrrs + mgwater + mper +Case "CIP5INV" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + minv + mgwater + mper +Case "CIPINV5" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "CIP5NAT" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mnat + mgwater + mper +Case "CIPNAT5" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "CIPINVNAT" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mnat + mgwater + mper +Case "CIPNATINV" + clup = mcip + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + minv + mgwater + mper + +Case "INVRRS5" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "INV5RRS" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mrrs + mgwater + mper +Case "INVRRSCIP" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mcip + mgwater + mper +Case "INVCIPRRS" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mrrs + mgwater + mper +Case "INVRRSNAT" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mnat + mgwater + mper +Case "INVNATRRS" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mrrs + mgwater + mper +Case "INV5CIP" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mcip + mgwater + mper +Case "INVCIP5" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "INV5NAT" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mnat + mgwater + mper +Case "INVNAT5" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "INVCIPNAT" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mnat + mgwater + mper +Case "INVNATCIP" + clup = minv + msource + mper + " " + IIf(LF = "Y", "", mnat + msoil + mper) + " " + mcip + mgwater + mper + + +Case "NATRRS5" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "NAT5RRS" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mrrs + mgwater + mper +Case "NATRRSCIP" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mcip + mgwater + mper +Case "NATCIPRRS" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mrrs + mgwater + mper +Case "NATRRSINV" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + minv + mgwater + mper +Case "NATINVRRS" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mrrs + mgwater + mper +Case "NAT5CIP" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mcip + mgwater + mper +Case "NATCIP5" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "NAT5INV" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + minv + mgwater + mper +Case "NATINV5" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "NATCIPINV" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", mcip + msoil + mper) + " " + minv + mgwater + mper +Case "NATINVCIP" + clup = mnat + msource + mper + " " + IIf(LF = "Y", "", minv + msoil + mper) + " " + mcip + mgwater + mper + +'Added Case Logic for ABND and INAC - TK-11/22/17 +'Abandon +Case "rrs5abn" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mabnd1 + mgwater + mabnd2 +Case "rrsabn5" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mabnd1 + msoil + mabnd2) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "5rrsabn" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mabnd1 + mgwater + mabnd2 +Case "5abnrrs" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mabnd1 + msoil + mabnd2) + " " + mrrs + mgwater + mper +Case "abn5rrs" + clup = mabnd1 + msource + mabnd2 + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mrrs + mgwater + mper +Case "abnrrs5" + clup = mabnd1 + msource + mabnd2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 +'Inactive +Case "rrs5ina" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + minac1 + mgwater + minac2 +Case "rrsina5" + clup = mrrs + msource + mper + " " + IIf(LF = "Y", "", minac1 + msoil + minac2) + " " + mrrs5_1 + mgwater + mrrs5_2 +Case "5rrsina" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + minac1 + mgwater + minac2 +Case "5inarrs" + clup = mrrs5_1 + msource + mrrs5_2 + " " + IIf(LF = "Y", "", minac1 + msoil + minac2) + " " + mrrs + mgwater + mper +Case "ina5rrs" + clup = minac1 + msource + minac2 + " " + IIf(LF = "Y", "", mrrs5_1 + msoil + mrrs5_2) + " " + mrrs + mgwater + mper +Case "inarrs5" + clup = minac1 + msource + minac2 + " " + IIf(LF = "Y", "", mrrs + msoil + mper) + " " + mrrs5_1 + mgwater + mrrs5_2 + +Case Else + clup = "DATA IS INCOMPLETE - PLEASE CHECK!!!!!!!!!" + +End Select + +End Function From 23013106fd8f00161e3761c34845f79a8cc276a7 Mon Sep 17 00:00:00 2001 From: Tom Karasch Date: Thu, 7 May 2026 14:10:37 -0400 Subject: [PATCH 3/4] 1047 Configure Site Summary PDF output paths and URL storage Makes the Site Summary PDF output path configurable via `appsettings.json` to support various export destinations. Renames the `FilePath` configuration key to `PdfFilePath` for specificity. Adds a `PdfURL` property to `SiteSummaryLog` for storing web-accessible PDF links. --- FMS.Domain/Entities/SiteSummaryLog.cs | 2 ++ FMS/Helpers/SiteSummaryPdfHelper.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/FMS.Domain/Entities/SiteSummaryLog.cs b/FMS.Domain/Entities/SiteSummaryLog.cs index 7ed29469..88d858db 100644 --- a/FMS.Domain/Entities/SiteSummaryLog.cs +++ b/FMS.Domain/Entities/SiteSummaryLog.cs @@ -22,5 +22,7 @@ public SiteSummaryLog(Guid id, string fileName, string filePath, string fileType public string PdfFilePath { get; set; } public string PdfFileType { get; set; } + + public string PdfURL { get; set; } } } diff --git a/FMS/Helpers/SiteSummaryPdfHelper.cs b/FMS/Helpers/SiteSummaryPdfHelper.cs index 272ff3a4..83defa3d 100644 --- a/FMS/Helpers/SiteSummaryPdfHelper.cs +++ b/FMS/Helpers/SiteSummaryPdfHelper.cs @@ -70,7 +70,7 @@ public class CreateFromURL /// /// The path to the resulting PDF file. /// - public static readonly String DEST = "results/htmlsamples/ch07/url2pdf_1.pdf"; + public static readonly String DEST = String.Concat(Environment.GetEnvironmentVariable("PdfFilePath"), "url2pdf_1.pdf"); /// /// The target folder for the result. From 5dd54aa8df36ecef02f5c1d503a752f2f517a7b2 Mon Sep 17 00:00:00 2001 From: Tom Karasch Date: Thu, 14 May 2026 14:07:05 -0400 Subject: [PATCH 4/4] 1047 Implement local HTML-to-PDF generation for Site Summary reports Enables the conversion of existing HTML Site Summary report views into PDF files for local export. This is achieved by: * Refactoring `SiteSummaryPdfHelper` to fetch the rendered HTML content from a local endpoint. * Utilizing `itext.pdfhtml` to convert the fetched HTML stream to a PDF file. * Introducing a new `_PdfReportLayout.cshtml` and an `IsPdf` flag in the report query specification for conditional rendering optimized for PDF output. * Adding the `itext.bouncy-castle-adapter` dependency to support required PDF functionalities. * Updating the `IndexPdf` page to trigger and save these locally generated PDFs. --- .../Dto/Reports/SiteSummaryQuerySpec.cs | 4 +- FMS/FMS.csproj | 1 + FMS/Helpers/SiteSummaryHelper.cs | 2 +- FMS/Helpers/SiteSummaryPdfHelper.cs | 152 ++++++------------ .../Reporting/SiteSummary/IndexPdf.cshtml | 2 + .../Reporting/SiteSummary/IndexPdf.cshtml.cs | 37 ++++- FMS/Pages/Reporting/SiteSummary/Report.cshtml | 9 +- .../Reporting/SiteSummary/Report.cshtml.cs | 5 +- FMS/Pages/Reporting/_PdfReportLayout.cshtml | 18 +++ FMS/SiteSummary_10308.pdf | Bin 0 -> 27339 bytes FMS/SiteSummary_10789.pdf | Bin 0 -> 2575 bytes FMS/SiteSummary_10919.pdf | Bin 0 -> 31789 bytes 12 files changed, 116 insertions(+), 114 deletions(-) create mode 100644 FMS/Pages/Reporting/_PdfReportLayout.cshtml create mode 100644 FMS/SiteSummary_10308.pdf create mode 100644 FMS/SiteSummary_10789.pdf create mode 100644 FMS/SiteSummary_10919.pdf diff --git a/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs b/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs index 303f4436..5c148503 100644 --- a/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs +++ b/FMS.Domain/Dto/Reports/SiteSummaryQuerySpec.cs @@ -11,7 +11,7 @@ public SiteSummaryQuerySpec() { } public SiteSummarySortBy SortBy { get; set; } = SiteSummarySortBy.Facility_Number; [Display(Name = "Export To")] - public SiteSummaryExportTo ExportTo { get; set; } = SiteSummaryExportTo.Storage; + public SiteSummaryExportTo ExportTo { get; set; } = SiteSummaryExportTo.Local; [Display(Name = "Facility Number")] public string FacilityNumber { get; set; } @@ -49,6 +49,8 @@ public SiteSummaryQuerySpec() { } [Display(Name = "Show Header at top of reports")] public bool ShowHeader { get; set; } = false; + public bool IsPdf { get; set; } = false; + public IDictionary AsRouteValues() => new Dictionary { { nameof(FacilityNumber), FacilityNumber }, diff --git a/FMS/FMS.csproj b/FMS/FMS.csproj index 8c4899a4..4f5edf9b 100644 --- a/FMS/FMS.csproj +++ b/FMS/FMS.csproj @@ -27,6 +27,7 @@ + diff --git a/FMS/Helpers/SiteSummaryHelper.cs b/FMS/Helpers/SiteSummaryHelper.cs index a62fb39f..5a52e8ab 100644 --- a/FMS/Helpers/SiteSummaryHelper.cs +++ b/FMS/Helpers/SiteSummaryHelper.cs @@ -1,4 +1,4 @@ -using FMS.Domain.Dto; +using FMS.Domain.Dto; using FMS.Domain.Repositories; namespace FMS.Helpers diff --git a/FMS/Helpers/SiteSummaryPdfHelper.cs b/FMS/Helpers/SiteSummaryPdfHelper.cs index 83defa3d..556e6cdd 100644 --- a/FMS/Helpers/SiteSummaryPdfHelper.cs +++ b/FMS/Helpers/SiteSummaryPdfHelper.cs @@ -10,125 +10,71 @@ namespace FMS.Helpers { public class SiteSummaryPdfHelper { - private readonly IReportingRepository _repository; - private readonly IConfiguration _configuration; - public SiteSummaryPdfHelper(IReportingRepository repository, IConfiguration configuration) - { - _repository = repository; - _configuration = configuration; - } - public string GoogleMapsApiKey => _configuration["GoogleMapSettings:ApiKey"] ?? string.Empty; - public string GetGoogleMapsUrl(SiteSummaryReportDto facility) - { - if (facility.Latitude != 0 && facility.Longitude != 0 && facility.LocationDetails != null) - { - return - $"https://maps.googleapis.com/maps/api/staticmap?center={facility.Latitude},{facility.Longitude}&zoom={facility.LocationDetails?.MapZoom}&size=250x250&markers=color:red|{facility.Latitude},{facility.Longitude}&maptype=roadmap&key={GoogleMapsApiKey}&style=feature:poi|visibility:off"; - } - return null; - } + /// + /// Converts a simple HTML file to PDF using an InputStream and an OutputStream as arguments for the convertToPdf() method. + /// - public string GetStatusLanguage(SiteSummaryReportDto facility) => - SiteSummaryHelper.GetCleanupStatusLanguage(facility); + const string USER_AGENT = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; " + + "Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; " + + ".NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; " + + "InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)"; - public string GetScoreLanguage(SiteSummaryReportDto facility) - { - var groundWaterLang = SiteSummaryHelper.GetLanguageForGWScore(facility); - var onsiteScoreLang = SiteSummaryHelper.GetLanguageForOSScore(facility); - var exLang = ""; - if (facility.ScoreDetails != null && facility.ScoreDetails.UseComments) - { - exLang = SiteSummaryHelper.GetLanguageForExceptions(facility); - } + /// + /// The path to the resulting PDF file. + /// + public static readonly String DEST = String.Concat(Environment.GetEnvironmentVariable("PdfFilePath"), "url2pdf_1.pdf"); - return groundWaterLang + onsiteScoreLang + exLang; - } + /// + /// The target folder for the result. + /// + public string ADDRESS = "~/Reporting/SiteSummary/Report/"; - public bool HasSublistedParcels(SiteSummaryReportDto facility) + /// + /// The main method of this example. + /// + /// no arguments are needed to run this example. + public static void CreateNewPdf(String hsiNumber) { - foreach (var parcel in facility.Parcels) - { - if (parcel.ParcelType?.Name == "SubList") - { - return true; - } - } - return false; + FileInfo file = new FileInfo(DEST); + file.Directory.Create(); + + new SiteSummaryPdfHelper().CreatePdf(new Uri(new SiteSummaryPdfHelper().ADDRESS + hsiNumber), DEST); } /// - /// Converts a simple HTML file to PDF using an InputStream and an OutputStream as arguments for the convertToPdf() method. + /// Creates the PDF file. /// - public class CreateFromURL + /// the URL object for the web page + /// the path to the resulting PDF + public void CreatePdf(Uri url, String dest) { - const string USER_AGENT = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; " + - "Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; " + - ".NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; " + - "InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)"; - - /// - /// The path to the resulting PDF file. - /// - public static readonly String DEST = String.Concat(Environment.GetEnvironmentVariable("PdfFilePath"), "url2pdf_1.pdf"); - - /// - /// The target folder for the result. - /// - public static readonly String ADDRESS = "https://stackoverflow.com/help/on-topic"; - - /// - /// The main method of this example. - /// - /// no arguments are needed to run this example. - public static void Main(String[] args) + using (var fileStream = new FileStream(dest, FileMode.Create)) { - //String licensePath = LicenseUtil.GetPathToLicenseFileWithITextCoreAndPdfHtmlAndPdfCalligraphProducts(); - //using (Stream license = FileUtil.GetInputStreamForFile(licensePath)) - //{ - // LicenseKey.LoadLicenseFile(license); - //} - - FileInfo file = new FileInfo(DEST); - file.Directory.Create(); - - new CreateFromURL().CreatePdf(new Uri(ADDRESS), DEST); - } - - /// - /// Creates the PDF file. - /// - /// the URL object for the web page - /// the path to the resulting PDF - public void CreatePdf(Uri url, String dest) - { - using (var fileStream = new FileStream(dest, FileMode.Create)) + try { - try - { - using (var httpClient = new System.Net.Http.HttpClient()) - { - httpClient.Timeout = TimeSpan.FromSeconds(15); - httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(USER_AGENT); - var websiteTask = httpClient.GetByteArrayAsync(url); - websiteTask.Wait(); - byte[] website = websiteTask.Result; - HtmlConverter.ConvertToPdf(new MemoryStream(website), fileStream); - } - } - catch (AggregateException ae) when (ae.InnerException is System.Net.Http.HttpRequestException hre) - { - // Handle HTTP request exception - } - catch (System.Net.Http.HttpRequestException hre) + using (var httpClient = new System.Net.Http.HttpClient()) { - // Handle HTTP request exception - } - catch (System.TimeoutException) - { - // Handle timeout + httpClient.Timeout = TimeSpan.FromSeconds(15); + httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(USER_AGENT); + var websiteTask = httpClient.GetByteArrayAsync(url); + websiteTask.Wait(); + byte[] website = websiteTask.Result; + HtmlConverter.ConvertToPdf(new MemoryStream(website), fileStream); } } + catch (AggregateException ae) when (ae.InnerException is System.Net.Http.HttpRequestException hre) + { + // Handle HTTP request exception + } + catch (System.Net.Http.HttpRequestException hre) + { + // Handle HTTP request exception + } + catch (System.TimeoutException) + { + // Handle timeout + } } } } diff --git a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml index a51ee16f..ca970eba 100644 --- a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml +++ b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml @@ -7,6 +7,7 @@ }

@ViewData["Title"]

← Back to Reports +
@@ -19,6 +20,7 @@ +
diff --git a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs index 6508d994..479b02aa 100644 --- a/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs +++ b/FMS/Pages/Reporting/SiteSummary/IndexPdf.cshtml.cs @@ -1,8 +1,12 @@ using FMS.Domain.Dto; using FMS.Domain.Repositories; using FMS.Helpers; +using FMS.Platform.Extensions; +using iText.Html2pdf; +using iText.Signatures; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using System.IO; namespace FMS.Pages.Reporting.SiteSummary { @@ -11,12 +15,16 @@ public class IndexPdfModel : PageModel private readonly IReportingRepository _repository; private readonly IConfiguration _configuration; + private static readonly HttpClient client = new HttpClient(); + public IndexPdfModel(IReportingRepository repository, IConfiguration configuration) { _repository = repository; _configuration = configuration; } + public DisplayMessage Message { get; private set; } + [BindProperty] public SiteSummaryQuerySpec Spec { get; set; } @@ -31,6 +39,7 @@ public IndexPdfModel(IReportingRepository repository, IConfiguration configurati public async Task OnGetAsync(SiteSummaryQuerySpec spec) { Spec = spec; + Spec.IsPdf = true; SummaryList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); @@ -60,11 +69,9 @@ public async Task OnPostAsync(SiteSummaryQuerySpec spec) } break; case SiteSummaryQuerySpec.SiteSummaryExportTo.Local: - if (!await ExportLocal()) - { - GetReturnMessage(ResponseType.Local); - return Page(); - } + await ExportLocal(); + TempData?.SetDisplayMessage(Context.Success, GetReturnMessage(ResponseType.Local)); + return Page(); break; default: break; @@ -89,7 +96,25 @@ public async Task ExportToSharePoint() public async Task ExportLocal() { - SummaryList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); + try + { + var fileName = $"SiteSummary_{Spec.FacilityNumber}.pdf"; + + string htmlSrc = "https://localhost:44362/Reporting/SiteSummary/Report/" + Spec.FacilityNumber; + + using Stream inputStream = await client.GetStreamAsync(htmlSrc); + + using (FileStream pdfDest = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + + ConverterProperties properties = new ConverterProperties(); + HtmlConverter.ConvertToPdf(inputStream, pdfDest, properties); + } + } + catch (Exception ex) + { + return false; + } return true; } diff --git a/FMS/Pages/Reporting/SiteSummary/Report.cshtml b/FMS/Pages/Reporting/SiteSummary/Report.cshtml index 6eebffd6..9b8fa190 100644 --- a/FMS/Pages/Reporting/SiteSummary/Report.cshtml +++ b/FMS/Pages/Reporting/SiteSummary/Report.cshtml @@ -2,7 +2,14 @@ @using System.Globalization @model FMS.Pages.Reporting.SiteSummary.ReportModel @{ - Layout = "_ReportLayout"; + @if(Model.Spec.IsPdf) + { + Layout = "_PdfReportLayout"; + } + else + { + Layout = "_ReportLayout"; + } } @{ diff --git a/FMS/Pages/Reporting/SiteSummary/Report.cshtml.cs b/FMS/Pages/Reporting/SiteSummary/Report.cshtml.cs index 8da6076d..10e4fdd6 100644 --- a/FMS/Pages/Reporting/SiteSummary/Report.cshtml.cs +++ b/FMS/Pages/Reporting/SiteSummary/Report.cshtml.cs @@ -34,6 +34,8 @@ public ReportModel(IReportingRepository repository, IConfiguration configuration public async Task OnGetAsync(SiteSummaryQuerySpec spec = null, [FromRoute] string hsiId = null) { + Spec = spec; + Spec.TrimAll(); if (!string.IsNullOrEmpty(hsiId)) { Report = await _repository.GetSingleFacilitySiteSummaryDtoAsync(hsiId); @@ -49,8 +51,7 @@ public async Task OnGetAsync(SiteSummaryQuerySpec spec = null, [F if (User.Identity is not { IsAuthenticated: true }) return Challenge(); - Spec = spec; - Spec.TrimAll(); + ShowHeader = Spec.ShowHeader; ReportList = await _repository.GetFacilitySiteSummaryDtoAsync(Spec); diff --git a/FMS/Pages/Reporting/_PdfReportLayout.cshtml b/FMS/Pages/Reporting/_PdfReportLayout.cshtml new file mode 100644 index 00000000..3799babf --- /dev/null +++ b/FMS/Pages/Reporting/_PdfReportLayout.cshtml @@ -0,0 +1,18 @@ + + + + + + + @ViewData["Title"] + + + + + + +
+ @RenderBody() +
+ + diff --git a/FMS/SiteSummary_10308.pdf b/FMS/SiteSummary_10308.pdf new file mode 100644 index 0000000000000000000000000000000000000000..161e36e49afb594d6a66f86660697a061ef7aa60 GIT binary patch literal 27339 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 literal 0 HcmV?d00001 diff --git a/FMS/SiteSummary_10789.pdf b/FMS/SiteSummary_10789.pdf new file mode 100644 index 0000000000000000000000000000000000000000..83715e4205bf432f3926d62f78506ae4f97124f7 GIT binary patch literal 2575 zcmc&$c~}!?8h;c-iJ(4m2r4ob0*L~dncRS(7y=?h5F#RnGD#*7NHQS@hgGnmkEkrA zqGCC$AS&Rlic+CmDn?W4wL%dURE~Jx?VjY3f%<{FX+=@^+~juSOq1rMlE|34v-}k~5+_XLk|kozv+kVOY}0uO zC|(%ui!{}178{+Is7}k;@!V-TFdQCFc=tZA=)#%{#EN~J2@y$|JxQ0CQw6@Qax3qwe-NlhQOx^%NBp_wtK4?t5_rN)-7pE>QpkhIb?IrvX?DJ>0Tmjn`N{GC+*2s zWlw^wu4K3#Qb)vcSQRy2COqmoQwJ8__Wxz~o|IK?d1;{0V!P`ln@7cjf!dNq<>wC4 zQl6^q-p?&6U1}8vN*l#%?oK_K%zmD6UhP#|(WaTozs0SAO!M;uCT4tM{@UeVCssx! zXLg7?mURuLY}?hnvcBg;d(bklmouJo=G1vjqT{COmCDR}bECK0(iLbgXjA7f?*Oz{+wO;aP*@bXN ziyIXK>sV*PqZfK@dd#!_%q;GW1J@+HB_@M%k;bWKHe!oJt{g90KyPcFET=X?Ig!E4vn-!uJw(9~n6 z-{aM1U-q;nnH5p?rHcrNgpfay)vufk1Ke|NXMJ(ZX>_`kHPYFYqYQ1DV78b)WWQ?6 z9yz=-O@e(WD2JNHTuK^>UsmC)rVJPs2Xc0=G3k__rlglq6lMD|yUQSAK+dKCd|R zK38*#5aPvd%F2F+-`N_;8D{+Co^f?5ekE2zD!1+}kKpE4pWe9MqA|I7`KGe=0k&j1=wIAChcmvkdK^1scCPoO<^1jiem&rX#kzg0gR;pzS1lA8 z5#xueMo~6Yo9W}<72`49Dm~qpvQUq?!@d!AHU7qy59aVkcuMSt*=5|b5_Ow}@ z4ehG5>AzZBxV=iS1J?FC99(URG}ac+xoaEkIMNp_U=KNP?JxV)u&%>CgL3s(wNGNC zo;&Qgl^kw}SJ}{#I@)x8fKl{V==JHfChdsvmAW9yr+NOltMD&Is(Pfq9<6sDD$q15 z%Cg%WoUGiEwCsGN>5t(&?UA+ejS`}TowkuBzouBw8?;rv=E$q?&w4aR*!M$!4x<}i zF@KQYSkv5y76@w7zgaMGG041gsHP#HX`;I0G9zX%rtPTbepTJzv-*xTD*aTafbD1Y;Q}jFb$sBd_ug`KNM#dhzH@;Xk2_&XE%%MLsx|N!` zbb7HxX?q|Jl?i9ssBWe2yOi1f%f@6XRHjk_`kov@;-W$^vK~u`1a(^~lL{~>a5O0x zQRpxLY=DHIN=&T~ph|uB)=BGM5I{4W`N9BQzhLQz#8Zf+pQz%c%2A!ZSd_)m+oiV# z(n-ur1O0(=<{kr*ji?X_7CQ?j&w|;y$)FNrG9TUOAo#e$AWQ?P5E*1p$W)puNO1;1 zXCjG<3I97FSb+)E0#rc|^UxI41wbwoZQyYO0h$}x4F;kJ-hRP>KoY7@>aL0+0_89W zg0A|@0B^Y>Rfz(A3QR2rHiZ#MsyI}Nx(YA}rXVK#ksiKVF0H3X9)G7?9on~h>wENQD)<}Fi-|G5uU^HqAE z>fHqyo`$H*YSstjKWko(NreA{VtqQyC}v}7U4B5M0I^URsn4#E=)ap{2<-Qc+KU>>oUx%Rk{kG)R}Df5br)SeGAvB*-F_zVQ1i(sJur85wiL8l4GLMB8JP*EnGN&`^= zpTa~zCPb!z5XcAV5TDE!ktr0E&!h+`pa@}#$V?#><}(CT3MioIGz$0#!lW@NG(N;Y zVJ3~jM1&NE2xd~52%V4c=~Oy`G6V>Mvi|=TM3ekwA`H+MUt~2%HYN#KaQiUi~hOomRm4?IPIYGX-zX2Q`^}_%F literal 0 HcmV?d00001 diff --git a/FMS/SiteSummary_10919.pdf b/FMS/SiteSummary_10919.pdf new file mode 100644 index 0000000000000000000000000000000000000000..32b79274ee282acb34cd147b978c137ec97f5d36 GIT binary patch literal 31789 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 N#nQoPUnxoB{4cBsH#z_S literal 0 HcmV?d00001