Files
Core_Be/Services/ClientStatService.cs
T
Dhananjaya99 bffc9b1686 first commit
2026-09-28 11:44:26 +05:30

150 lines
6.7 KiB
C#

using Fitness_core_BE.Helpers;
using Fitness_core_BE.Interfaces;
using Fitness_core_BE.Interfaces.Services;
namespace Fitness_core_BE.Services
{
public class ClientStatService : IClientStatService
{
// Muscle Beast Gym (gymos_musslbeast) -- the only gym that gets the "Today's Payments"
// stat, per their explicit request. Not a general feature-flag system; if another gym
// wants this later, promote it to a real per-client setting instead of adding more IDs here.
private static readonly Guid MuscleBeastClientId = Guid.Parse("b2abf7b3-a9f0-11f1-945a-54e8d4bf1eca");
private readonly IClientStatRepository _clientStatRepository;
private readonly IOverdueLockRepository _overdueLockRepository;
private readonly UserRoleHelper _userRoleHelper;
public ClientStatService(
IClientStatRepository clientStatRepository,
IOverdueLockRepository overdueLockRepository,
UserRoleHelper userRoleHelper)
{
_clientStatRepository = clientStatRepository;
_overdueLockRepository = overdueLockRepository;
_userRoleHelper = userRoleHelper;
}
public async Task<object> GetTotalCustomerCount(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var count = await _clientStatRepository.GetTotalCustomerCountAsync(clientId);
return new { totalCustomerCount = count };
}
public async Task<object> GetMonthlyCustomerCount(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var count = await _clientStatRepository.GetMonthlyCustomerCountAsync(clientId);
return new { monthlyCustomerCount = count };
}
public async Task<object> GetTotalWorkoutPlanCount(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var count = await _clientStatRepository.GetTotalWorkoutPlanCountAsync(clientId);
return new { totalWorkoutPlanCount = count };
}
public async Task<object> GetTotalMealPlanCount(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var count = await _clientStatRepository.GetTotalMealPlanCountAsync(clientId);
return new { totalMealPlanCount = count };
}
public async Task<object> GetLastMonthCustomerCount(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var count = await _clientStatRepository.GetLastMonthCustomerCountAsync(clientId);
return new { lastMonthCustomerCount = count };
}
public async Task<object> GetLastFiveAttendances(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var records = await _clientStatRepository.GetLastFiveAttendancesAsync(clientId);
return records;
}
public async Task<object> GetLastFivePayments(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var records = await _clientStatRepository.GetLastFivePaymentsAsync(clientId);
return records;
}
public async Task<object> GetLastMonthRevenue(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var revenue = await _clientStatRepository.GetLastMonthRevenueAsync(clientId);
return new { lastMonthRevenue = revenue };
}
public async Task<object> GetMonthlyRevenueVariation(object payload, HttpContext httpContext, DateTime? from = null, DateTime? to = null)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var stats = await _clientStatRepository.GetMonthlyRevenueVariationAsync(clientId, from, to);
var isOwner = (await _userRoleHelper.GetOwnedClientId(userId)).HasValue;
if (!isOwner)
{
// Revenue is owner-only, enforced here (not just hidden client-side) — staff
// still get real NewMemberCount points, just no Revenue figures.
foreach (var point in stats) point.Revenue = 0m;
}
return stats;
}
public async Task<object> GetTotalRevenue(object payload, HttpContext httpContext)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var revenue = await _clientStatRepository.GetTotalRevenueAsync(clientId);
return new { totalRevenue = revenue };
}
public async Task<object> GetClientStatSummary(object payload, HttpContext httpContext, DateTime? from = null, DateTime? to = null)
{
Guid userId = DataExtractor.GetUserIdFromContext(httpContext);
Guid clientId = await _userRoleHelper.GetClientId(userId);
var summary = await _clientStatRepository.GetClientStatSummaryAsync(clientId, from, to);
summary.OverdueCount = (await _overdueLockRepository.GetOverdueCustomerIdsAsync(clientId, DateTime.UtcNow)).Count;
summary.ShowTodayPayments = clientId == MuscleBeastClientId;
var isOwner = (await _userRoleHelper.GetOwnedClientId(userId)).HasValue;
if (!isOwner)
{
// Revenue is owner-only, enforced here (not just hidden client-side) — a staff
// member calling this endpoint directly still gets zeros, not real figures.
summary.ThisMonthRevenue = 0m;
summary.LastMonthRevenue = 0m;
summary.RevenueGrowthPercentage = 0m;
summary.TotalRevenue = 0m;
}
return summary;
}
}
}