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 PermESSBLL : IPermESSBLL { private readonly IAppraisalDAL _appraisalDal; private readonly IPIPDAL _pipDal; private readonly ITNADAL _tnaDal; private readonly ILogger _logger; public PermESSBLL( IAppraisalDAL dal, IPIPDAL pipDal, ITNADAL tnaDal, ILogger logger) { _appraisalDal = dal; _pipDal = pipDal; _tnaDal = tnaDal; _logger = logger; } public async Task GetMyAppraisalAsync(LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-my-appraisal", new { login.UserId }); var dto = await _appraisalDal.GetMyAppraisalAsync(login.UserId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(dto); } catch (Exception ex) { GB5Trace.MarkFailed("get-my-appraisal-failed", ex); _logger.LogError(ex, "GetMyAppraisal failed for EmployeeId {EmployeeId}", login.UserId); throw; } } public async Task GetMyPerformanceSummaryAsync(LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-my-performance-summary", new { login.UserId }); var appraisalTask = _appraisalDal.GetMyAppraisalAsync(login.UserId, login, ct); var activePIPTask = _pipDal.GetActivePIPForEmployeeAsync(login.UserId, login, ct); var tnaPendingTask = _tnaDal.GetPendingTNACountAsync(login.UserId, login, ct); await Task.WhenAll(appraisalTask, activePIPTask, tnaPendingTask).ConfigureAwait(false); var summary = new PerformanceSummaryDTO { CurrentAppraisal = await appraisalTask, ActivePIP = await activePIPTask, PendingTNACount = await tnaPendingTask }; return JsonSerializer.Serialize(summary); } catch (Exception ex) { GB5Trace.MarkFailed("get-my-performance-summary-failed", ex); _logger.LogError(ex, "GetMyPerformanceSummary failed for EmployeeId {EmployeeId}", login.UserId); throw; } } }