-
-
@report.ProjectName (#@report.ProjectId)
-
-
-
- Status: @report.Summary?.Status
- Manager: @report.Summary?.Manager
- Company: @report.Summary?.Company
- Generated: @report.GeneratedAt.ToLocalTime()
-
-
- @if (!string.IsNullOrWhiteSpace(report.AiGeneratedSummary))
+
+ Generate Project Completion Report
+
+
+ Generate Report
+ @(IsPdfLoading ? "Generating PDF..." : "Download PDF")
+ @if (IsLoading)
{
-
- AI Summary
-
- @((MarkupString)markdownHtml)
-
-
+
}
- @if (report.Timeline != null)
+ @if (!string.IsNullOrEmpty(ErrorMessage))
{
-
- Timeline
-
-
Planned Days@report.Timeline.PlannedDays
-
Actual Days@report.Timeline.TotalDays
-
Variance@report.Timeline.VarianceDays (@report.Timeline.ScheduleAdherence)
-
Performance@report.Timeline.SchedulePerformance
-
-
+ @ErrorMessage
}
- @if (report.Budget != null)
- {
-
- Budget
-
-
Estimated Hrs@report.Budget.EstimatedHours
-
Actual Hrs@report.Budget.ActualHours
-
Variance@report.Budget.VarianceHours (@report.Budget.BudgetAdherence)
-
Cost Perf.@report.Budget.CostPerformance
-
-
- }
- @if (report.Phases?.Any() == true)
- {
-
- Phases (@report.Phases.Count)
-
-
-
- | Phase |
- Status |
- Est Hrs |
- Act Hrs |
-
-
-
- @foreach (var p in report.Phases)
- {
-
- | @p.PhaseName |
- @p.Status |
- @p.EstimatedHours |
- @p.ActualHours |
-
- }
-
-
-
- }
- @if (report.Tickets?.Any() == true)
+
+
+
+@if (Report is not null)
+{
+
+ @Report.ProjectName (#@Report.ProjectId)
+
+ Status: @Report.Summary?.Status
+
+ Manager: @Report.Summary?.Manager | Company: @Report.Summary?.Company
+ Timeline: @Report.Timeline?.PlannedDays d planned / @Report.Timeline?.TotalDays d actual (Var: @Report.Timeline?.VarianceDays)
+ Budget: @Report.Budget?.EstimatedHours h est / @Report.Budget?.ActualHours h actual (Var: @Report.Budget?.VarianceHours)
+
+ @if (!string.IsNullOrWhiteSpace(Report.AiGeneratedSummary))
{
-
- Tickets (@report.Tickets.Count)
-
-
-
- | # |
- Summary |
- Status |
- Est/Act Hrs |
- Assigned |
-
-
-
- @foreach (var t in report.Tickets)
- {
-
- | @t.TicketNumber |
- @t.Summary |
- @t.Status |
- @t.EstimatedHours / @t.ActualHours |
- @t.AssignedTo |
-
- }
-
-
-
+
+
+
+ @(new MarkupString(AiSummaryHtml))
+
+
}
-
+
+