diff --git a/FMS.Domain/Dto/Event/EventReportDto.cs b/FMS.Domain/Dto/Event/EventReportDto.cs new file mode 100644 index 00000000..5df6244e --- /dev/null +++ b/FMS.Domain/Dto/Event/EventReportDto.cs @@ -0,0 +1,61 @@ +using DocumentFormat.OpenXml.Office.Y2022.FeaturePropertyBag; +using FMS.Domain.Entities; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FMS.Domain.Dto +{ + public class EventReportDto + { + public EventReportDto(Event eventNew) + { + Id = eventNew.Id; + FacilityId = eventNew.FacilityId; + ParentId = eventNew.ParentId; + EventType = eventNew.EventType; + ActionTaken = eventNew.ActionTaken; + StartDate = eventNew.StartDate; + DueDate = eventNew.DueDate; + CompletionDate = eventNew.CompletionDate; + ComplianceOfficer = eventNew.ComplianceOfficer; + EventAmount = eventNew.EventAmount; + EventContractor = eventNew.EventContractor; + Comment = eventNew.Comment; + } + + public Guid Id { get; set; } + + public Guid FacilityId { get; set; } + + public Guid? ParentId { get; set; } + + public string FacilityNumber { get; set; } + + public string FacilityName { get; set; } + + public EventType EventType { get; set; } + + public ActionTaken ActionTaken { get; set; } + + public DateOnly? StartDate { get; set; } + + public DateOnly? DueDate { get; set; } + + public DateOnly? CompletionDate { get; set; } + + public ComplianceOfficer ComplianceOfficer { get; set; } + + public OrganizationalUnit OrganizationalUnit { get; set; } + + [DataType(DataType.Currency)] + public decimal? EventAmount { get; set; } + + public EventContractor EventContractor { get; set; } + + public string Comment { get; set; } + } +} diff --git a/FMS.Domain/Dto/Event/EventReportSort.cs b/FMS.Domain/Dto/Event/EventReportSort.cs new file mode 100644 index 00000000..f1303029 --- /dev/null +++ b/FMS.Domain/Dto/Event/EventReportSort.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FMS.Domain.Dto +{ + public enum EventReportType + { + Pending, + Compliance, + Completed, + CompletedOutstanding, + CompletedByCO, + } +} diff --git a/FMS.Domain/Dto/Reports/DelistedReportByDateDto.cs b/FMS.Domain/Dto/Reports/DelistedReportByDateDto.cs index 72796627..eb27c5b6 100644 --- a/FMS.Domain/Dto/Reports/DelistedReportByDateDto.cs +++ b/FMS.Domain/Dto/Reports/DelistedReportByDateDto.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; -namespace FMS.Domain.Dto.Reports +namespace FMS.Domain.Dto { public class DelistedReportByDateDto { diff --git a/FMS.Domain/Dto/Reports/DelistedReportByDateRangeDto.cs b/FMS.Domain/Dto/Reports/DelistedReportByDateRangeDto.cs index 20fca53a..d876f6a5 100644 --- a/FMS.Domain/Dto/Reports/DelistedReportByDateRangeDto.cs +++ b/FMS.Domain/Dto/Reports/DelistedReportByDateRangeDto.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; -namespace FMS.Domain.Dto.Reports +namespace FMS.Domain.Dto { public class DelistedReportByDateRangeDto { diff --git a/FMS.Domain/Dto/Reports/EventsActivityCompletedByCOReportDto.cs b/FMS.Domain/Dto/Reports/EventsActivityCompletedByCOReportDto.cs new file mode 100644 index 00000000..df0ac410 --- /dev/null +++ b/FMS.Domain/Dto/Reports/EventsActivityCompletedByCOReportDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FMS.Domain.Dto +{ + public class EventsActivityCompletedByCOReportDto + { + } +} diff --git a/FMS.Domain/Dto/Reports/EventsCompletedOutstandingReportDto.cs b/FMS.Domain/Dto/Reports/EventsCompletedOutstandingReportDto.cs new file mode 100644 index 00000000..c059c82e --- /dev/null +++ b/FMS.Domain/Dto/Reports/EventsCompletedOutstandingReportDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FMS.Domain.Dto +{ + public class EventsCompletedOutstandingReportDto + { + } +} diff --git a/FMS.Domain/Dto/Reports/EventsCompletedReportDto.cs b/FMS.Domain/Dto/Reports/EventsCompletedReportDto.cs new file mode 100644 index 00000000..b33c433b --- /dev/null +++ b/FMS.Domain/Dto/Reports/EventsCompletedReportDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FMS.Domain.Dto +{ + public class EventsCompletedReportDto + { + } +} diff --git a/FMS.Domain/Dto/Reports/EventsComplianceReportDto.cs b/FMS.Domain/Dto/Reports/EventsComplianceReportDto.cs new file mode 100644 index 00000000..ffe0aa42 --- /dev/null +++ b/FMS.Domain/Dto/Reports/EventsComplianceReportDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FMS.Domain.Dto +{ + public class EventsComplianceReportDto + { + } +} diff --git a/FMS.Domain/Dto/Reports/EventsPendingReportDto.cs b/FMS.Domain/Dto/Reports/EventsPendingReportDto.cs new file mode 100644 index 00000000..9d1d3489 --- /dev/null +++ b/FMS.Domain/Dto/Reports/EventsPendingReportDto.cs @@ -0,0 +1,51 @@ +using ClosedXML.Attributes; +using FMS.Domain.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FMS.Domain.Dto +{ + public class EventsPendingReportDto + { + public EventsPendingReportDto() {} + + public EventsPendingReportDto(EventReportDto reportEvent) + { + HSIID = reportEvent.FacilityNumber; + FacilityName = reportEvent.FacilityName; + EventTypeName = reportEvent.EventType?.Name; + EventStartDate = reportEvent.StartDate; + EventDueDate = reportEvent.DueDate; + ComplianceOfficerName = reportEvent.ComplianceOfficer?.Name; + UnitName = reportEvent.OrganizationalUnit?.Name; + ActivityComment = reportEvent.Comment; + } + + [XLColumn(Header = "HSI ID")] + public string HSIID { get; set; } + + [XLColumn(Header = "Facility Name")] + public string FacilityName { get; set; } + + [XLColumn(Header = "Event Type")] + public string EventTypeName { get; set; } + + [XLColumn(Header = "Event Start Date")] + public DateOnly? EventStartDate { get; set; } + + [XLColumn(Header = "Event Due Date")] + public DateOnly? EventDueDate { get; set; } + + [XLColumn(Header = "Compliance Officer")] + public string ComplianceOfficerName { get; set; } + + [XLColumn(Header = "Unit")] + public string UnitName { get; set; } + + [XLColumn(Header = "Activity Comment")] + public string ActivityComment { get; set; } + } +} diff --git a/FMS.Domain/Repositories/IReportingRepository.cs b/FMS.Domain/Repositories/IReportingRepository.cs index 75840ee2..5d399fad 100644 --- a/FMS.Domain/Repositories/IReportingRepository.cs +++ b/FMS.Domain/Repositories/IReportingRepository.cs @@ -1,5 +1,4 @@ using FMS.Domain.Dto; -using FMS.Domain.Dto.Reports; using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -30,6 +29,8 @@ public interface IReportingRepository : IDisposable #region Events Reports + Task> GetEventsReportsAsync(EventReportType eventReportType); + #endregion } } diff --git a/FMS.Infrastructure/Repositories/ReportingRepository.cs b/FMS.Infrastructure/Repositories/ReportingRepository.cs index 42bdd42a..87a974e2 100644 --- a/FMS.Infrastructure/Repositories/ReportingRepository.cs +++ b/FMS.Infrastructure/Repositories/ReportingRepository.cs @@ -1,10 +1,12 @@ -using FMS.Domain.Dto; -using FMS.Domain.Dto.Reports; +using DocumentFormat.OpenXml.Office2010.Excel; +using FMS.Domain.Dto; +using FMS.Domain.Entities; using FMS.Domain.Repositories; using FMS.Infrastructure.Contexts; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Threading.Tasks; @@ -174,11 +176,53 @@ public async Task> GetDelistedByDate return reportDto; } - #endregion #region Events Reports + public async Task> GetEventsReportsAsync(EventReportType eventReportType) + { + List facilityList = await _context.Facilities.AsNoTracking() + .Include(e => e.County) + .Include(e => e.FacilityStatus) + .Include(e => e.HsrpFacilityProperties) + .Include(e => e.HsrpFacilityProperties.ComplianceOfficer) + .Include(e => e.FacilityType) + .Include(e => e.Events) + .Include(e => e.ComplianceOfficer) + .Include(e => e.OrganizationalUnit) + .Where(e => (e.FacilityType.Name == "HSI" || e.FacilityType.Name == "VRP")) + .SelectMany(e => e.Events.Where(ev => ev.Active) + .Select(ev => new EventReportDto(ev))) + .ToListAsync(); + + List reportDto; + + switch (eventReportType) + { + case EventReportType.Pending: + reportDto = facilityList.Where(e => e.Status == "Pending").ToList(); + break; + case EventReportType.Compliance: + reportDto = facilityList.Where(e => e.Status == "Compliance").ToList(); + break; + case EventReportType.Completed: + reportDto = facilityList.Where(e => e.Status == "Completed").ToList(); + break; + case EventReportType.CompletedOutstanding: + reportDto = facilityList.Where(e => e.Status == "CompletedOutstanding").ToList(); + break; + case EventReportType.CompletedByCO: + reportDto = facilityList.Where(e => e.Status == "CompletedByCO").ToList(); + break; + default: + reportDto = facilityList; + break; + } + + return reportDto; + } + #endregion #region IDisposable Support diff --git a/FMS/Helpers/EventSortHelper.cs b/FMS/Helpers/EventSortHelper.cs index 1e5eaf38..ac3600de 100644 --- a/FMS/Helpers/EventSortHelper.cs +++ b/FMS/Helpers/EventSortHelper.cs @@ -71,5 +71,71 @@ public static IEnumerable OrderEventQuery( _ => events.OrderBy(e => e.StartDate) .ThenByDescending(e => e.DueDate) }; + + + public static IList SortReportEvents(IList events, EventSort sortBy) + { + var sortedList = new List(); + + // Get top-level parents + var topLevelParents = events.Where(e => e.ParentId == Guid.Empty || e.ParentId == null).OrderReportEventQuery(sortBy); + + foreach (var parent in topLevelParents) + { + sortedList.Add(parent); + AddReportChildrenRecursively(parent, events, sortedList, sortBy); + } + + return sortedList; + } + + private static void AddReportChildrenRecursively(EventReportDto parent, IList allEvents, List sortedList, EventSort sortBy) + { + var children = allEvents.Where(c => c.ParentId == parent.Id).OrderReportEventQuery(sortBy); + foreach (var child in children) + { + sortedList.Add(child); + AddReportChildrenRecursively(child, allEvents, sortedList, sortBy); + } + } + + public static IEnumerable OrderReportEventQuery( + this IEnumerable events, EventSort sortBy) => + sortBy switch + { + EventSort.EventType => events.OrderBy(e => e.EventType.Name) + .ThenByDescending(e => e.StartDate), + EventSort.EventTypeDesc => events.OrderByDescending(e => e.EventType.Name) + .ThenByDescending(e => e.StartDate), + EventSort.ActionTaken => events.OrderBy(e => e.ActionTaken.Name) + .ThenBy(e => e.StartDate), + EventSort.ActionTakenDesc => events.OrderByDescending(e => e.ActionTaken.Name) + .ThenByDescending(e => e.StartDate), + EventSort.StartDateDesc => events.OrderByDescending(e => e.StartDate) + .ThenByDescending(e => e.DueDate), + EventSort.DueDate => events.OrderBy(e => e.DueDate) + .ThenBy(e => e.StartDate), + EventSort.DueDateDesc => events.OrderByDescending(e => e.DueDate) + .ThenBy(e => e.StartDate), + EventSort.CompletionDate => events.OrderByDescending(e => e.CompletionDate) + .ThenBy(e => e.EventType.Name), + EventSort.CompletionDateDesc => events.OrderBy(e => e.CompletionDate) + .ThenBy(e => e.EventType.Name), + EventSort.ComplianceOfficer => events.OrderBy(e => e.ComplianceOfficer.Name) + .ThenBy(e => e.EventType.Name), + EventSort.ComplianceOfficerDesc => events.OrderByDescending(e => e.ComplianceOfficer.Name) + .ThenBy(e => e.EventType.Name), + EventSort.EventAmount => events.OrderBy(e => e.EventAmount) + .ThenBy(e => e.EventType.Name), + EventSort.EventAmountDesc => events.OrderByDescending(e => e.EventAmount) + .ThenByDescending(e => e.EventType.Name), + EventSort.EventContractor => events.OrderByDescending(e => e.EventContractor?.Name) + .ThenBy(e => e.EventType.Name), + EventSort.EventContractorDesc => events.OrderBy(e => e.EventContractor?.Name) + .ThenBy(e => e.EventType.Name), + // EventSort.StartDate + _ => events.OrderBy(e => e.StartDate) + .ThenByDescending(e => e.DueDate) + }; } } diff --git a/FMS/Helpers/ExportHelper.cs b/FMS/Helpers/ExportHelper.cs index 25106f46..5bf7bda0 100644 --- a/FMS/Helpers/ExportHelper.cs +++ b/FMS/Helpers/ExportHelper.cs @@ -72,6 +72,10 @@ public static byte[] ExportExcelAsByteArray(this IEnumerable list, ReportT table.ShowTotalsRow = true; table.Field("Acres").TotalsRowFunction = XLTotalsRowFunction.Sum; } + if (reportType == ReportType.Event) + { + + } wb.SaveAs(ms); diff --git a/FMS/Pages/Reporting/Delisted/Index.cshtml b/FMS/Pages/Reporting/Delisted/Index.cshtml index b11c8814..56202e14 100644 --- a/FMS/Pages/Reporting/Delisted/Index.cshtml +++ b/FMS/Pages/Reporting/Delisted/Index.cshtml @@ -36,9 +36,10 @@
- +
+

* denotes required field

\ No newline at end of file diff --git a/FMS/Pages/Reporting/Delisted/Index.cshtml.cs b/FMS/Pages/Reporting/Delisted/Index.cshtml.cs index 52c3db68..88d5e030 100644 --- a/FMS/Pages/Reporting/Delisted/Index.cshtml.cs +++ b/FMS/Pages/Reporting/Delisted/Index.cshtml.cs @@ -1,8 +1,9 @@ using FMS.Domain.Dto; -using FMS.Domain.Dto.Reports; using FMS.Domain.Repositories; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Graph.Drives.Item.Items.Item.Workbook.Functions.Today; +using Microsoft.Kiota.Abstractions; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -22,7 +23,7 @@ public class IndexModel : PageModel [Display(Name = "End Date")] [BindProperty] - public DateOnly? EndDate { get; set; } = null; + public DateOnly? EndDate { get; set; } = DateOnly.FromDateTime(DateTime.Now); public void OnGet() { @@ -41,7 +42,7 @@ public async Task OnPostByDateAsync() public async Task OnPostByDateRangeAsync() { - var fileName = $"Delisted_by_Date_and_CO_{DateTime.Now:yyyy-MM-dd-HH-mm-ss.FFF}.xlsx"; + var fileName = $"Delisted_by_Date_Range_{DateTime.Now:yyyy-MM-dd-HH-mm-ss.FFF}.xlsx"; // "delistedByDateRangeReportList" Detailed Facility List to go to a report IReadOnlyList delistedByDateRangeReportList = await _repository.GetDelistedByDateRangeAsync(StartDate, EndDate); diff --git a/FMS/Pages/Reporting/Events/Index.cshtml b/FMS/Pages/Reporting/Events/Index.cshtml index 00bb6d8e..3ca7ca55 100644 --- a/FMS/Pages/Reporting/Events/Index.cshtml +++ b/FMS/Pages/Reporting/Events/Index.cshtml @@ -10,38 +10,38 @@

Select a Report from the list

- - Assignment Report By CO + Pending Report
- - Assignment Report By County + Completed Report
- - Assignment Report By HSI + Compliance Report
- - Assignment Report By Site Name + Completed Outstanding Report
- - Assignment Report By Unit + Overdue Report
\ No newline at end of file diff --git a/FMS/Pages/Reporting/Events/Index.cshtml.cs b/FMS/Pages/Reporting/Events/Index.cshtml.cs index bc477566..c3790e1b 100644 --- a/FMS/Pages/Reporting/Events/Index.cshtml.cs +++ b/FMS/Pages/Reporting/Events/Index.cshtml.cs @@ -1,12 +1,35 @@ +using DocumentFormat.OpenXml.Wordprocessing; +using FMS.Domain.Dto; +using FMS.Domain.Repositories; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; namespace FMS.Pages.Reporting.Events { public class IndexModel : PageModel { + private readonly IReportingRepository _repository; + + public IndexModel(IReportingRepository repository) => _repository = repository; + public void OnGet() { + // Method intentionally left empty. + } + + public async Task OnPostPendingAsync() + { + var fileName = $"Events_Pending_{DateTime.Now:yyyy-MM-dd-HH-mm-ss.FFF}.xlsx"; + + // "delistedByDateRangeReportList" Detailed Facility List to go to a report + IReadOnlyList eventsPendingSummaryList = await _repository.GetEventsPendingAsync(); + + + + return File(eventsPendingSummaryList.ExportExcelAsByteArray(ExportHelper.ReportType.Event), "application/vnd.ms-excel", fileName); } } } diff --git a/FMS/Pages/Reporting/Index.cshtml b/FMS/Pages/Reporting/Index.cshtml index 6e8d8ef8..610672e9 100644 --- a/FMS/Pages/Reporting/Index.cshtml +++ b/FMS/Pages/Reporting/Index.cshtml @@ -18,10 +18,10 @@
  • @ReportingOptions.Events
  • -
  • + @*
  • @ReportingOptions.SiteSummary
  • @ReportingOptions.PAF -
  • + *@ \ No newline at end of file