Felesleges footerek levétele

This commit is contained in:
2026-09-14 11:48:33 +02:00
parent d00e087b35
commit 364c1b455d
4 changed files with 174 additions and 201 deletions
+174 -174
View File
@@ -16,9 +16,9 @@ using System.Threading.Tasks;
using WorkFlowCheck.BL.DocumentGenerator; using WorkFlowCheck.BL.DocumentGenerator;
using WorkFlowCheck.BL.Services.Interfaces; using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DataTables; using WorkFlowCheck.Common.DataTables;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.Common.Enums; using WorkFlowCheck.Common.Enums;
using WorkFlowCheck.Common.Helper; using WorkFlowCheck.Common.Helper;
using WorkFlowCheck.DL; using WorkFlowCheck.DL;
using WorkFlowCheck.DL.Entities; using WorkFlowCheck.DL.Entities;
@@ -35,177 +35,177 @@ namespace WorkFlowCheck.BL.Services
INumberGeneratorService numberGeneratorService, INumberGeneratorService numberGeneratorService,
IMessageService messageService, IMessageService messageService,
IUserService userService) : base(dbContext, mapper) IUserService userService) : base(dbContext, mapper)
{ {
_numberGeneratorService = numberGeneratorService; _numberGeneratorService = numberGeneratorService;
_messageService = messageService; _messageService = messageService;
} }
public async Task<DashboardDTO> GetDashboardInfoAsync() public async Task<DashboardDTO> GetDashboardInfoAsync()
{ {
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
var currentMonthStart = new DateTime(now.Year, now.Month, 1, 0, 0, 0, DateTimeKind.Utc); var currentMonthStart = new DateTime(now.Year, now.Month, 1, 0, 0, 0, DateTimeKind.Utc);
var nextMonthStart = currentMonthStart.AddMonths(1); var nextMonthStart = currentMonthStart.AddMonths(1);
var previousMonthStart = currentMonthStart.AddMonths(-1); var previousMonthStart = currentMonthStart.AddMonths(-1);
var sixMonthStart = currentMonthStart.AddMonths(-5); var sixMonthStart = currentMonthStart.AddMonths(-5);
var fortyEightHoursAgo = now.AddHours(-48); var fortyEightHoursAgo = now.AddHours(-48);
var headers = _dbContext.CheckListHeaders.AsNoTracking(); var headers = _dbContext.CheckListHeaders.AsNoTracking();
var statusCounts = await headers var statusCounts = await headers
.GroupBy(x => x.CheckStatus) .GroupBy(x => x.CheckStatus)
.Select(x => new { Status = x.Key, Count = x.Count() }) .Select(x => new { Status = x.Key, Count = x.Count() })
.ToListAsync(); .ToListAsync();
var monthlyRaw = await headers var monthlyRaw = await headers
.Where(x => x.CreatedAt >= sixMonthStart && x.CreatedAt < nextMonthStart) .Where(x => x.CreatedAt >= sixMonthStart && x.CreatedAt < nextMonthStart)
.GroupBy(x => new { x.CreatedAt.Year, x.CreatedAt.Month }) .GroupBy(x => new { x.CreatedAt.Year, x.CreatedAt.Month })
.Select(x => new .Select(x => new
{ {
x.Key.Year, x.Key.Year,
x.Key.Month, x.Key.Month,
Total = x.Count(), Total = x.Count(),
Approved = x.Count(y => y.CheckStatus == CheckStatus.Signed || y.CheckStatus == CheckStatus.Closed) Approved = x.Count(y => y.CheckStatus == CheckStatus.Signed || y.CheckStatus == CheckStatus.Closed)
}) })
.ToListAsync(); .ToListAsync();
var topUsers = await headers var topUsers = await headers
.Where(x => x.CreatedAt >= currentMonthStart && x.CreatedAt < nextMonthStart) .Where(x => x.CreatedAt >= currentMonthStart && x.CreatedAt < nextMonthStart)
.GroupBy(x => new { x.UserId, x.User.LastName, x.User.FirstName }) .GroupBy(x => new { x.UserId, x.User.LastName, x.User.FirstName })
.Select(x => new DashboardUserItemDTO .Select(x => new DashboardUserItemDTO
{ {
Name = (x.Key.LastName + " " + x.Key.FirstName).Trim(), Name = (x.Key.LastName + " " + x.Key.FirstName).Trim(),
Count = x.Count() Count = x.Count()
}) })
.OrderByDescending(x => x.Count) .OrderByDescending(x => x.Count)
.ThenBy(x => x.Name) .ThenBy(x => x.Name)
.Take(5) .Take(5)
.ToListAsync(); .ToListAsync();
var recentItems = await headers var recentItems = await headers
.OrderByDescending(x => x.LastModAt) .OrderByDescending(x => x.LastModAt)
.Select(x => new .Select(x => new
{ {
x.Id, x.Id,
x.DocumentNumber, x.DocumentNumber,
x.ShortName, x.ShortName,
x.User.LastName, x.User.LastName,
x.User.FirstName, x.User.FirstName,
x.LastModAt, x.LastModAt,
x.CheckStatus x.CheckStatus
}) })
.Take(8) .Take(8)
.ToListAsync(); .ToListAsync();
var delayedApprovalCount = await headers.CountAsync(x => var delayedApprovalCount = await headers.CountAsync(x =>
x.CheckStatus == CheckStatus.Sent && x.LastModAt < fortyEightHoursAgo); x.CheckStatus == CheckStatus.Sent && x.LastModAt < fortyEightHoursAgo);
var blockedCount = statusCounts.FirstOrDefault(x => x.Status == CheckStatus.Blocked)?.Count ?? 0; var blockedCount = statusCounts.FirstOrDefault(x => x.Status == CheckStatus.Blocked)?.Count ?? 0;
var currentMonthCount = monthlyRaw var currentMonthCount = monthlyRaw
.FirstOrDefault(x => x.Year == currentMonthStart.Year && x.Month == currentMonthStart.Month)?.Total ?? 0; .FirstOrDefault(x => x.Year == currentMonthStart.Year && x.Month == currentMonthStart.Month)?.Total ?? 0;
var previousMonthCount = monthlyRaw var previousMonthCount = monthlyRaw
.FirstOrDefault(x => x.Year == previousMonthStart.Year && x.Month == previousMonthStart.Month)?.Total ?? 0; .FirstOrDefault(x => x.Year == previousMonthStart.Year && x.Month == previousMonthStart.Month)?.Total ?? 0;
var approvedThisMonth = monthlyRaw var approvedThisMonth = monthlyRaw
.FirstOrDefault(x => x.Year == currentMonthStart.Year && x.Month == currentMonthStart.Month)?.Approved ?? 0; .FirstOrDefault(x => x.Year == currentMonthStart.Year && x.Month == currentMonthStart.Month)?.Approved ?? 0;
var culture = System.Globalization.CultureInfo.GetCultureInfo("hu-HU"); var culture = System.Globalization.CultureInfo.GetCultureInfo("hu-HU");
var result = new DashboardDTO var result = new DashboardDTO
{ {
GeneratedAt = now, GeneratedAt = now,
TotalCheckLists = statusCounts.Sum(x => x.Count), TotalCheckLists = statusCounts.Sum(x => x.Count),
CheckListsThisMonth = currentMonthCount, CheckListsThisMonth = currentMonthCount,
MonthlyChangePercent = previousMonthCount == 0 MonthlyChangePercent = previousMonthCount == 0
? (currentMonthCount > 0 ? 100 : 0) ? (currentMonthCount > 0 ? 100 : 0)
: Math.Round((currentMonthCount - previousMonthCount) * 100m / previousMonthCount, 1), : Math.Round((currentMonthCount - previousMonthCount) * 100m / previousMonthCount, 1),
OpenAndInProgressCount = statusCounts OpenAndInProgressCount = statusCounts
.Where(x => x.Status == CheckStatus.Open || x.Status == CheckStatus.InProgress) .Where(x => x.Status == CheckStatus.Open || x.Status == CheckStatus.InProgress)
.Sum(x => x.Count), .Sum(x => x.Count),
AwaitingApprovalCount = statusCounts.FirstOrDefault(x => x.Status == CheckStatus.Sent)?.Count ?? 0, AwaitingApprovalCount = statusCounts.FirstOrDefault(x => x.Status == CheckStatus.Sent)?.Count ?? 0,
BlockedCount = blockedCount, BlockedCount = blockedCount,
ApprovedThisMonthCount = approvedThisMonth, ApprovedThisMonthCount = approvedThisMonth,
ApprovalRate = currentMonthCount == 0 ? 0 : Math.Round(approvedThisMonth * 100m / currentMonthCount, 1), ApprovalRate = currentMonthCount == 0 ? 0 : Math.Round(approvedThisMonth * 100m / currentMonthCount, 1),
ActiveUserCount = await _dbContext.Users.AsNoTracking().CountAsync(x => x.Active), ActiveUserCount = await _dbContext.Users.AsNoTracking().CountAsync(x => x.Active),
TemplateCount = await _dbContext.CheckListTemplateHeaders.AsNoTracking().CountAsync(), TemplateCount = await _dbContext.CheckListTemplateHeaders.AsNoTracking().CountAsync(),
TopUsers = topUsers, TopUsers = topUsers,
AttentionItems = new List<DashboardAttentionItemDTO>(), AttentionItems = new List<DashboardAttentionItemDTO>(),
RecentCheckLists = recentItems.Select(x => new DashboardRecentCheckListDTO RecentCheckLists = recentItems.Select(x => new DashboardRecentCheckListDTO
{ {
Id = x.Id, Id = x.Id,
DocumentNumber = x.DocumentNumber, DocumentNumber = x.DocumentNumber,
ShortName = x.ShortName, ShortName = x.ShortName,
Responsible = (x.LastName + " " + x.FirstName).Trim(), Responsible = (x.LastName + " " + x.FirstName).Trim(),
ModifiedAt = x.LastModAt, ModifiedAt = x.LastModAt,
Status = x.CheckStatus, Status = x.CheckStatus,
StatusName = DisplayNameHelper.GetEnumDisplayName(x.CheckStatus) StatusName = DisplayNameHelper.GetEnumDisplayName(x.CheckStatus)
}).ToList() }).ToList()
}; };
for (var i = 0; i < 6; i++) for (var i = 0; i < 6; i++)
{ {
var month = sixMonthStart.AddMonths(i); var month = sixMonthStart.AddMonths(i);
var value = monthlyRaw.FirstOrDefault(x => x.Year == month.Year && x.Month == month.Month); var value = monthlyRaw.FirstOrDefault(x => x.Year == month.Year && x.Month == month.Month);
result.MonthlyItems.Add(new DashboardMonthlyItemDTO result.MonthlyItems.Add(new DashboardMonthlyItemDTO
{ {
Month = month.ToString("MMM", culture).TrimEnd('.'), Month = month.ToString("MMM", culture).TrimEnd('.'),
Total = value?.Total ?? 0, Total = value?.Total ?? 0,
Approved = value?.Approved ?? 0 Approved = value?.Approved ?? 0
}); });
} }
foreach (var status in Enum.GetValues<CheckStatus>()) foreach (var status in Enum.GetValues<CheckStatus>())
{ {
result.StatusItems.Add(new DashboardStatusItemDTO result.StatusItems.Add(new DashboardStatusItemDTO
{ {
Status = status, Status = status,
Name = DisplayNameHelper.GetEnumDisplayName(status), Name = DisplayNameHelper.GetEnumDisplayName(status),
Count = statusCounts.FirstOrDefault(x => x.Status == status)?.Count ?? 0, Count = statusCounts.FirstOrDefault(x => x.Status == status)?.Count ?? 0,
Color = GetDashboardStatusColor(status) Color = GetDashboardStatusColor(status)
}); });
} }
if (delayedApprovalCount > 0) if (delayedApprovalCount > 0)
{ {
result.AttentionItems.Add(new DashboardAttentionItemDTO result.AttentionItems.Add(new DashboardAttentionItemDTO
{ {
Title = $"{delayedApprovalCount} munkalap több mint 48 órája jóváhagyásra vár", Title = $"{delayedApprovalCount} munkalap több mint 48 órája jóváhagyásra vár",
Description = "Érdemes ellenőrizni a beküldött munkalapokat.", Description = "Érdemes ellenőrizni a beküldött munkalapokat.",
IsCritical = true IsCritical = true
}); });
} }
if (blockedCount > 0) if (blockedCount > 0)
{ {
result.AttentionItems.Add(new DashboardAttentionItemDTO result.AttentionItems.Add(new DashboardAttentionItemDTO
{ {
Title = $"{blockedCount} blokkolt munkalap", Title = $"{blockedCount} blokkolt munkalap",
Description = "A folytatásuk felhasználói beavatkozást igényel.", Description = "A folytatásuk felhasználói beavatkozást igényel.",
IsCritical = true IsCritical = true
}); });
} }
if (result.AwaitingApprovalCount > delayedApprovalCount) if (result.AwaitingApprovalCount > delayedApprovalCount)
{ {
result.AttentionItems.Add(new DashboardAttentionItemDTO result.AttentionItems.Add(new DashboardAttentionItemDTO
{ {
Title = $"{result.AwaitingApprovalCount - delayedApprovalCount} friss beküldött munkalap", Title = $"{result.AwaitingApprovalCount - delayedApprovalCount} friss beküldött munkalap",
Description = "Jóváhagyásra váró, 48 óránál frissebb tételek.", Description = "Jóváhagyásra váró, 48 óránál frissebb tételek.",
IsCritical = false IsCritical = false
}); });
} }
return result; return result;
} }
private static string GetDashboardStatusColor(CheckStatus status) => status switch private static string GetDashboardStatusColor(CheckStatus status) => status switch
{ {
CheckStatus.Open => "#64748b", CheckStatus.Open => "#64748b",
CheckStatus.InProgress => "#e28a17", CheckStatus.InProgress => "#e28a17",
CheckStatus.Blocked => "#dc2626", CheckStatus.Blocked => "#dc2626",
CheckStatus.Storno => "#7c3aed", CheckStatus.Storno => "#7c3aed",
CheckStatus.Sent => "#38bdf8", CheckStatus.Sent => "#38bdf8",
CheckStatus.Signed => "#16875b", CheckStatus.Signed => "#16875b",
CheckStatus.Closed => "#123c69", CheckStatus.Closed => "#123c69",
_ => "#94a3b8" _ => "#94a3b8"
}; };
public async Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id) public async Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id)
{ {
var retVal = new CheckListHeaderDTO() var retVal = new CheckListHeaderDTO()
{ {
@@ -18,15 +18,6 @@
<th class="text-center">Action</th> <th class="text-center">Action</th>
</tr> </tr>
</thead> </thead>
<tfoot class="table-light">
<tr>
<th>ID</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(ImageFileDTO.FileName), typeof(ImageFileDTO))</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(ImageFileDTO.FileSize), typeof(ImageFileDTO))</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(ImageFileDTO.CreateDate), typeof(ImageFileDTO))</th>
<th>Action</th>
</tr>
</tfoot>
</table> </table>
</div> </div>
@@ -18,15 +18,6 @@
<th class="text-center">Action</th> <th class="text-center">Action</th>
</tr> </tr>
</thead> </thead>
<tfoot class="table-light">
<tr>
<th>ID</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(ImageFileDTO.FileName), typeof(ImageFileDTO))</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(ImageFileDTO.FileSize), typeof(ImageFileDTO))</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(ImageFileDTO.CreateDate), typeof(ImageFileDTO))</th>
<th>Action</th>
</tr>
</tfoot>
</table> </table>
</div> </div>
@@ -18,15 +18,6 @@
<th class="text-center">Action</th> <th class="text-center">Action</th>
</tr> </tr>
</thead> </thead>
<tfoot class="table-light">
<tr>
<th>ID</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(PDFFileDTO.FileName), typeof(PDFFileDTO))</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(PDFFileDTO.FileSize), typeof(PDFFileDTO))</th>
<th>@DisplayNameHelper.GetDisplayName(nameof(PDFFileDTO.CreateDate), typeof(PDFFileDTO))</th>
<th>Action</th>
</tr>
</tfoot>
</table> </table>
</div> </div>