using GB5Shared.DTO.Framework.Login; using GB5Shared.Telemetry; using Microsoft.Extensions.Logging; using PERMBLL.Interfaces; using PERMDAL.DTOs; using PERMDAL.Interfaces; using System.Text.Json; namespace PERMBLL.Implementations; public class BellCurveBLL : IBellCurveBLL { private readonly IBellCurveDAL _dal; private readonly ILogger _logger; public BellCurveBLL(IBellCurveDAL dal, ILogger logger) { _dal = dal; _logger = logger; } public async Task GetBellCurveReportAsync(int appraisalPlanId, int ouId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-bellcurve", new { appraisalPlanId, ouId }); var bands = (await _dal.GetBellCurveBandsAsync(appraisalPlanId, ouId, login, ct).ConfigureAwait(false)).ToList(); var planName = await _dal.GetAppraisalPlanNameAsync(appraisalPlanId, login, ct).ConfigureAwait(false) ?? string.Empty; int total = bands.Sum(b => b.EmployeeCount); foreach (var band in bands) band.Percentage = total > 0 ? Math.Round(band.EmployeeCount * 100m / total, 2) : 0m; var report = new BellCurveReportDTO { AppraisalPlanId = appraisalPlanId, AppraisalPlanName = planName, TotalEmployees = total, Bands = bands }; return JsonSerializer.Serialize(report); } catch (Exception ex) { GB5Trace.MarkFailed("get-bellcurve-failed", ex); _logger.LogError(ex, "GetBellCurveReport failed for PlanId {PlanId}", appraisalPlanId); throw; } } }