using FabApprovalWorkerService.Models; using System.Text; namespace FabApprovalWorkerService.Services; public interface IECNService { Task> GetExpiringTECNs(); Task> GetExpiredTECNs(); Task> GetTECNNotificationUserEmails(); Task GetEcnByNumber(int ecnNumber); } public class ECNService : IECNService { private readonly ILogger _logger; private readonly IDalService _dalService; public ECNService(ILogger logger, IDalService dalService) { _logger = logger ?? throw new ArgumentNullException("ILogger not injected"); _dalService = dalService ?? throw new ArgumentNullException("IDalService not injected"); } public async Task GetEcnByNumber(int ecnNumber) { try { _logger.LogInformation($"Attempting to get ECN {ecnNumber}"); if (ecnNumber <= 0) throw new ArgumentException($"{ecnNumber} not a valid ECN number"); string sql = $"select * from ECN where ECNNumber = {ecnNumber}"; ECN? ecn = (await _dalService.QueryAsync(sql)).FirstOrDefault(); if (ecn is null) throw new Exception($"ECN {ecnNumber} not found"); return ecn; } catch (Exception ex) { StringBuilder errMsgBuilder = new(); errMsgBuilder.Append($"An exception occurred when attempting to get ECN {ecnNumber}. "); errMsgBuilder.Append($"Exception: {ex.Message}"); _logger.LogError(errMsgBuilder.ToString()); throw; } } public async Task> GetExpiredTECNs() { try { _logger.LogInformation("Attempting to get all TECNs expired in the last day"); DateTime today = DateTime.Now.Date; DateTime tomorrow = DateTime.Now.Date.AddDays(1); StringBuilder queryBuilder = new StringBuilder(); queryBuilder.Append("select ECNNumber, IsTECN, ExpirationDate, ExtensionDate, OriginatorID, Title "); queryBuilder.Append($"from ECN where IsTECN = 1 and "); queryBuilder.Append("Cancelled = 0 and Deleted = 0 "); queryBuilder.Append("and (CloseDate IS NULL or CloseDate = '');"); IEnumerable activeTecns = await _dalService.QueryAsync(queryBuilder.ToString()); _logger.LogInformation($"There are {activeTecns.Count()} active TECNs"); IEnumerable expiredTecns = activeTecns.Where(e => ((e.ExpirationDate < tomorrow) && (e.ExpirationDate >= today)) || ((e.ExtensionDate < tomorrow) && (e.ExtensionDate >= today))); _logger.LogInformation($"There are {expiredTecns.Count()} TECNs with an expiration date or extension date today"); IEnumerable expiredTecnsNotExtended = expiredTecns .Where(e => !(e.ExtensionDate >= tomorrow)) .ToList(); _logger.LogInformation($"There are {expiredTecnsNotExtended.Count()} TECNs expiring today"); return expiredTecnsNotExtended; } catch (Exception ex) { StringBuilder errMsgBuilder = new(); errMsgBuilder.Append("An exception occurred when attempting to get all TECNs expired in the last day. "); errMsgBuilder.Append($"Exception: {ex.Message}"); _logger.LogError(errMsgBuilder.ToString()); throw; } } public async Task> GetExpiringTECNs() { try { _logger.LogInformation("Attempting to get all TECNs expiring in the next five days"); DateTime tomorrow = DateTime.Now.AddDays(1).Date; DateTime fiveDaysFromToday = DateTime.Now.AddDays(5).Date; StringBuilder queryBuilder = new StringBuilder(); queryBuilder.Append("select * from ECN "); queryBuilder.Append($"where IsTECN = 1 and "); queryBuilder.Append("Cancelled = 0 and Deleted = 0 "); queryBuilder.Append("and (CloseDate IS NULL or CloseDate = '');"); IEnumerable activeTecns = (await _dalService.QueryAsync(queryBuilder.ToString())); _logger.LogInformation($"There are {activeTecns.Count()} active TECNs"); IEnumerable expiringTecns = activeTecns.Where(e => ((e.ExpirationDate >= tomorrow) && (e.ExpirationDate <= fiveDaysFromToday)) || ((e.ExtensionDate >= tomorrow) && (e.ExtensionDate <= fiveDaysFromToday))); _logger.LogInformation($"There are {expiringTecns.Count()} TECNs with an expiration date or extension date in the next 5 days"); IEnumerable expiringTecnsNotExtended = expiringTecns .Where(e => !(e.ExtensionDate > fiveDaysFromToday)) .ToList(); _logger.LogInformation($"There are {expiringTecnsNotExtended.Count()} TECNs expiring in the next five days"); return expiringTecnsNotExtended; } catch (Exception ex) { StringBuilder errMsgBuilder = new(); errMsgBuilder.Append("An exception occurred when attempting to get all TECNs expiring in the next five days. "); errMsgBuilder.Append($"Exception: {ex.Message}"); _logger.LogError(errMsgBuilder.ToString()); throw; } } public async Task> GetTECNNotificationUserEmails() { try { _logger.LogInformation("Attempting to get TECN notification user emails"); string sql = "select u.Email from TECNNotificationsUsers t join Users u on t.UserId = u.UserID;"; IEnumerable tecnNotificationUserEmails = (await _dalService.QueryAsync(sql)).ToList(); _logger.LogInformation($"Found {tecnNotificationUserEmails.Count()} TECN notification user emails"); return tecnNotificationUserEmails; } catch (Exception ex) { StringBuilder errMsgBuilder = new(); errMsgBuilder.Append("An exception occurred when attempting to get TECN notification user emails. "); errMsgBuilder.Append($"Exception: {ex.Message}"); _logger.LogError(errMsgBuilder.ToString()); throw; } } }