|
@@ -10,41 +10,30 @@ namespace Kitty_Fall.Cms.Controllers;
|
|
|
public class RevenueReportController : CmsAuthorizedController
|
|
public class RevenueReportController : CmsAuthorizedController
|
|
|
{
|
|
{
|
|
|
private readonly ModelContext _db;
|
|
private readonly ModelContext _db;
|
|
|
- private readonly IReadOnlyList<ServiceFilterOptionViewModel> _serviceFilters;
|
|
|
|
|
- private readonly HashSet<string> _supportedServiceFilters;
|
|
|
|
|
- private readonly string _defaultServiceFilter;
|
|
|
|
|
|
|
+ private readonly IReadOnlyList<RevenueReportServiceOption> _services;
|
|
|
|
|
+ private readonly string _defaultService;
|
|
|
|
|
|
|
|
public RevenueReportController(ModelContext db, IConfiguration configuration)
|
|
public RevenueReportController(ModelContext db, IConfiguration configuration)
|
|
|
{
|
|
{
|
|
|
_db = db;
|
|
_db = db;
|
|
|
-
|
|
|
|
|
- _serviceFilters = configuration
|
|
|
|
|
- .GetSection("RevenueReport:Services")
|
|
|
|
|
- .Get<List<ServiceFilterOptionViewModel>>()?
|
|
|
|
|
- .Where(x => !string.IsNullOrWhiteSpace(x.Value) && !string.IsNullOrWhiteSpace(x.Name))
|
|
|
|
|
- .Select(x => new ServiceFilterOptionViewModel
|
|
|
|
|
|
|
+ _services = (configuration
|
|
|
|
|
+ .GetSection("RevenueReport:Services")
|
|
|
|
|
+ .Get<List<RevenueReportServiceOption>>()
|
|
|
|
|
+ ?? new List<RevenueReportServiceOption>())
|
|
|
|
|
+ .Where(x => !string.IsNullOrWhiteSpace(x.Value))
|
|
|
|
|
+ .Select(x => new RevenueReportServiceOption
|
|
|
{
|
|
{
|
|
|
Value = x.Value.Trim(),
|
|
Value = x.Value.Trim(),
|
|
|
- Name = x.Name.Trim()
|
|
|
|
|
|
|
+ Name = string.IsNullOrWhiteSpace(x.Name) ? x.Value.Trim() : x.Name.Trim()
|
|
|
})
|
|
})
|
|
|
.DistinctBy(x => x.Value, StringComparer.OrdinalIgnoreCase)
|
|
.DistinctBy(x => x.Value, StringComparer.OrdinalIgnoreCase)
|
|
|
- .ToList()
|
|
|
|
|
- ?? new List<ServiceFilterOptionViewModel>();
|
|
|
|
|
-
|
|
|
|
|
- if (_serviceFilters.Count == 0)
|
|
|
|
|
- {
|
|
|
|
|
- throw new InvalidOperationException("RevenueReport:Services must contain at least one service.");
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- _supportedServiceFilters = _serviceFilters
|
|
|
|
|
- .Select(x => x.Value)
|
|
|
|
|
- .ToHashSet(StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
|
|
+ .ToList();
|
|
|
|
|
|
|
|
var configuredDefault = configuration["RevenueReport:DefaultService"]?.Trim();
|
|
var configuredDefault = configuration["RevenueReport:DefaultService"]?.Trim();
|
|
|
- _defaultServiceFilter = !string.IsNullOrWhiteSpace(configuredDefault)
|
|
|
|
|
- && _supportedServiceFilters.Contains(configuredDefault)
|
|
|
|
|
- ? _serviceFilters.First(x => string.Equals(x.Value, configuredDefault, StringComparison.OrdinalIgnoreCase)).Value
|
|
|
|
|
- : _serviceFilters[0].Value;
|
|
|
|
|
|
|
+ _defaultService = _services.FirstOrDefault(x =>
|
|
|
|
|
+ string.Equals(x.Value, configuredDefault, StringComparison.OrdinalIgnoreCase))?.Value
|
|
|
|
|
+ ?? _services.FirstOrDefault()?.Value
|
|
|
|
|
+ ?? string.Empty;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[HttpGet("/RevenueReport")]
|
|
[HttpGet("/RevenueReport")]
|
|
@@ -65,14 +54,14 @@ public class RevenueReportController : CmsAuthorizedController
|
|
|
{
|
|
{
|
|
|
TimeReport = x.TimeReport,
|
|
TimeReport = x.TimeReport,
|
|
|
Type = x.Type ?? string.Empty,
|
|
Type = x.Type ?? string.Empty,
|
|
|
- Revenue = x.Revenue,
|
|
|
|
|
- RegisterOnMps = x.RegisterOnMps,
|
|
|
|
|
- RegisterOnWeb = x.RegisterOnWeb,
|
|
|
|
|
- Renew = x.Renew,
|
|
|
|
|
- BuyOnWeb = x.BuyOnWeb,
|
|
|
|
|
- BuyOnMps = x.BuyOnMps,
|
|
|
|
|
- UserActive = x.UserActive,
|
|
|
|
|
- UserInactive = x.UserInactive
|
|
|
|
|
|
|
+ Revenue = x.Revenue ?? 0,
|
|
|
|
|
+ RegisterOnMps = x.RegisterOnMps ?? 0,
|
|
|
|
|
+ RegisterOnWeb = x.RegisterOnWeb ?? 0,
|
|
|
|
|
+ Renew = x.Renew ?? 0,
|
|
|
|
|
+ BuyOnWeb = x.BuyOnWeb ?? 0,
|
|
|
|
|
+ BuyOnMps = x.BuyOnMps ?? 0,
|
|
|
|
|
+ UserActive = x.UserActive ?? 0,
|
|
|
|
|
+ UserInactive = x.UserInactive ?? 0
|
|
|
})
|
|
})
|
|
|
.ToListAsync();
|
|
.ToListAsync();
|
|
|
|
|
|
|
@@ -82,7 +71,7 @@ public class RevenueReportController : CmsAuthorizedController
|
|
|
FromDate = normalizedFromDate,
|
|
FromDate = normalizedFromDate,
|
|
|
ToDate = normalizedToDate,
|
|
ToDate = normalizedToDate,
|
|
|
ServiceFilter = normalizedServiceFilter,
|
|
ServiceFilter = normalizedServiceFilter,
|
|
|
- ServiceFilters = _serviceFilters,
|
|
|
|
|
|
|
+ Services = _services.ToList(),
|
|
|
TotalRows = items.Count,
|
|
TotalRows = items.Count,
|
|
|
TotalRevenue = items.Sum(x => x.Revenue),
|
|
TotalRevenue = items.Sum(x => x.Revenue),
|
|
|
AverageRevenue = items.Count == 0 ? 0 : items.Average(x => x.Revenue),
|
|
AverageRevenue = items.Count == 0 ? 0 : items.Average(x => x.Revenue),
|
|
@@ -90,7 +79,7 @@ public class RevenueReportController : CmsAuthorizedController
|
|
|
Items = items
|
|
Items = items
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- return View("~/Views/Reports/Revenue.cshtml", model);
|
|
|
|
|
|
|
+ return View(model);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[HttpGet("/RevenueReport/DailyTrend")]
|
|
[HttpGet("/RevenueReport/DailyTrend")]
|
|
@@ -109,7 +98,7 @@ public class RevenueReportController : CmsAuthorizedController
|
|
|
.Select(x => new RevenueTrendItemViewModel
|
|
.Select(x => new RevenueTrendItemViewModel
|
|
|
{
|
|
{
|
|
|
TimeReport = x.Key,
|
|
TimeReport = x.Key,
|
|
|
- Revenue = x.Sum(y => y.Revenue)
|
|
|
|
|
|
|
+ Revenue = x.Sum(y => y.Revenue) ?? 0
|
|
|
})
|
|
})
|
|
|
.ToListAsync();
|
|
.ToListAsync();
|
|
|
|
|
|
|
@@ -118,14 +107,14 @@ public class RevenueReportController : CmsAuthorizedController
|
|
|
FromDate = normalizedFromDate,
|
|
FromDate = normalizedFromDate,
|
|
|
ToDate = normalizedToDate,
|
|
ToDate = normalizedToDate,
|
|
|
ServiceFilter = normalizedServiceFilter,
|
|
ServiceFilter = normalizedServiceFilter,
|
|
|
- ServiceFilters = _serviceFilters,
|
|
|
|
|
|
|
+ Services = _services.ToList(),
|
|
|
TotalColumns = items.Count,
|
|
TotalColumns = items.Count,
|
|
|
TotalRevenue = items.Sum(x => x.Revenue),
|
|
TotalRevenue = items.Sum(x => x.Revenue),
|
|
|
AverageRevenue = items.Count == 0 ? 0 : items.Average(x => x.Revenue),
|
|
AverageRevenue = items.Count == 0 ? 0 : items.Average(x => x.Revenue),
|
|
|
Items = items
|
|
Items = items
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- return View("~/Views/Reports/RevenueTrend.cshtml", model);
|
|
|
|
|
|
|
+ return View("DailyTrend", model);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private static string NormalizeReportType(string? reportType)
|
|
private static string NormalizeReportType(string? reportType)
|
|
@@ -152,10 +141,10 @@ public class RevenueReportController : CmsAuthorizedController
|
|
|
|
|
|
|
|
private string NormalizeServiceFilter(string? serviceFilter)
|
|
private string NormalizeServiceFilter(string? serviceFilter)
|
|
|
{
|
|
{
|
|
|
- var normalizedServiceFilter = (serviceFilter ?? string.Empty).Trim();
|
|
|
|
|
- return _supportedServiceFilters.Contains(normalizedServiceFilter)
|
|
|
|
|
- ? _serviceFilters.First(x => string.Equals(x.Value, normalizedServiceFilter, StringComparison.OrdinalIgnoreCase)).Value
|
|
|
|
|
- : _defaultServiceFilter;
|
|
|
|
|
|
|
+ var configuredService = _services.FirstOrDefault(x =>
|
|
|
|
|
+ string.Equals(x.Value, serviceFilter?.Trim(), StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
+
|
|
|
|
|
+ return configuredService?.Value ?? _defaultService;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private IQueryable<ReportByTime> BuildBaseQuery(string reportType, DateTime? fromDate, DateTime? toDate, string serviceFilter)
|
|
private IQueryable<ReportByTime> BuildBaseQuery(string reportType, DateTime? fromDate, DateTime? toDate, string serviceFilter)
|