using EntitlementBLL.Common; using EntitlementDAL.DTOs; using EntitlementDAL.Interfaces; using GB5Shared.QueryExecutor; using GB5Shared.Telemetry; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Quartz; namespace EntitlementBLL.Handlers; // Daily 03:00: marks MENTITLEMENTBETACLIENT rows whose VALIDUNTIL has passed as inactive // (STATUS=0) and logs BETA_ENROLMENT_EXPIRED for each. [DisallowConcurrentExecution] public class BetaClientExpiryJob : IJob { private readonly IServiceScopeFactory _ScopeFactory; private readonly ILogger _Logger; public BetaClientExpiryJob(IServiceScopeFactory scopeFactory, ILogger logger) { _ScopeFactory = scopeFactory; _Logger = logger; } public async Task Execute(IJobExecutionContext context) { using var activity = GB5Trace.BeginSection("beta-client-expiry-job"); var ct = context.CancellationToken; using var scope = _ScopeFactory.CreateScope(); var betaClientDal = scope.ServiceProvider.GetRequiredService(); var auditDal = scope.ServiceProvider.GetRequiredService(); var queryExecutor = scope.ServiceProvider.GetRequiredService(); var loginFactory = scope.ServiceProvider.GetRequiredService(); var login = loginFactory.Create(-1); var now = DateTime.UtcNow; var expired = await betaClientDal.GetExpiredActiveAsync(now, login, ct).ConfigureAwait(false); foreach (var bc in expired) { var tx = await queryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { GB5Trace.Step("expire-beta-client", new { bc.BetaClientId }); await betaClientDal.DeleteAsync(bc.BetaClientId, login, tx, ct).ConfigureAwait(false); await auditDal.InsertEntitlementAuditAsync(new EntitlementAuditDTO { ClientId = bc.ClientId, Action = "BETA_ENROLMENT_EXPIRED", NewValue = $"BetaProgramName={bc.BetaProgramName}", CreatedById = -1, CreatedOn = now }, login, tx, ct).ConfigureAwait(false); await queryExecutor.CommitAsync(tx).ConfigureAwait(false); } catch (Exception ex) { await queryExecutor.RollbackAsync(tx).ConfigureAwait(false); GB5Trace.MarkFailed("beta-client-expiry-failed", ex); _Logger.LogError(ex, "BetaClientExpiryJob failed for BetaClientId {BetaClientId}", bc.BetaClientId); } } } }