analytics

This commit is contained in:
Tizian.Breuch
2025-09-25 11:47:38 +02:00
parent fb9d793e91
commit 5851072d64
4 changed files with 57 additions and 28 deletions

View File

@@ -1,5 +1,4 @@
// src/Webshop.Application/Services/Admin/AdminAnalyticsService.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -9,6 +8,8 @@ using Webshop.Application.Services.Admin.Interfaces;
using Webshop.Domain.Enums;
using Webshop.Domain.Interfaces;
using Webshop.Infrastructure.Data;
using Webshop.Application; // Hinzugefügt
using Microsoft.Extensions.Logging; // Empfohlen für Logging
namespace Webshop.Application.Services.Admin
{
@@ -16,30 +17,45 @@ namespace Webshop.Application.Services.Admin
{
private readonly ApplicationDbContext _context;
private readonly ISettingService _settingService;
private readonly ILogger<AdminAnalyticsService> _logger; // Empfohlen: Logger hinzufügen
public AdminAnalyticsService(ApplicationDbContext context, ISettingService settingService)
// Empfohlen: Logger per Dependency Injection übergeben
public AdminAnalyticsService(ApplicationDbContext context, ISettingService settingService, ILogger<AdminAnalyticsService> logger)
{
_context = context;
_settingService = settingService;
_logger = logger;
}
public async Task<AnalyticsDto> GetAnalyticsAsync(AnalyticsPeriod period)
public async Task<ServiceResult<AnalyticsDto>> GetAnalyticsAsync(AnalyticsPeriod period)
{
var startDate = GetStartDateFromPeriod(period);
var filteredOrders = await _context.Orders
.Where(o => o.OrderDate >= startDate && o.OrderStatus != OrderStatus.Cancelled.ToString())
.ToListAsync();
var analyticsDto = new AnalyticsDto
try
{
KpiSummary = await GetKpiSummaryAsync(startDate, filteredOrders),
SalesOverTime = GetSalesOverTime(filteredOrders),
TopPerformingProducts = await GetTopPerformingProductsAsync(startDate),
InventoryStatus = await GetInventoryStatusAsync()
};
var startDate = GetStartDateFromPeriod(period);
return analyticsDto;
// Die Abfragen bleiben gleich, werden aber jetzt innerhalb des Try-Blocks ausgeführt.
var filteredOrders = await _context.Orders
.Where(o => o.OrderDate >= startDate && o.OrderStatus != OrderStatus.Cancelled.ToString())
.ToListAsync();
var analyticsDto = new AnalyticsDto
{
KpiSummary = await GetKpiSummaryAsync(startDate, filteredOrders),
SalesOverTime = GetSalesOverTime(filteredOrders),
TopPerformingProducts = await GetTopPerformingProductsAsync(startDate),
InventoryStatus = await GetInventoryStatusAsync()
};
return ServiceResult.Ok(analyticsDto);
}
catch (Exception ex)
{
_logger.LogError(ex, "Fehler beim Abrufen der Analysedaten für den Zeitraum {Period}.", period);
return ServiceResult.Fail<AnalyticsDto>(
ServiceResultType.Failure,
"Ein interner Fehler ist beim Abrufen der Analysedaten aufgetreten."
);
}
}
private async Task<KpiSummaryDto> GetKpiSummaryAsync(DateTimeOffset startDate, List<Domain.Entities.Order> filteredOrders)