protected override void DoWork() { var utcNow = Clock.Now.ToUniversalTime(); var failedTenancyNames = new List <string>(); var subscriptionExpiredTenants = _tenantRepository.GetAllList( tenant => tenant.SubscriptionEndDateUtc != null && tenant.SubscriptionEndDateUtc <= utcNow && tenant.IsActive && tenant.EditionId != null ); foreach (var tenant in subscriptionExpiredTenants) { Debug.Assert(tenant.EditionId.HasValue); try { var edition = _editionRepository.Get(tenant.EditionId.Value); Debug.Assert(tenant.SubscriptionEndDateUtc != null, "tenant.SubscriptionEndDateUtc != null"); if (tenant.SubscriptionEndDateUtc.Value.AddDays(edition.WaitingDayAfterExpire ?? 0) >= utcNow) { //Tenant is in waiting days after expire TODO: It's better to filter such entities while querying from repository! continue; } var endSubscriptionResult = AsyncHelper.RunSync(() => _tenantManager.EndSubscriptionAsync(tenant, edition, utcNow)); if (endSubscriptionResult == EndSubscriptionResult.TenantSetInActive) { AsyncHelper.RunSync(() => _userEmailer.TryToSendSubscriptionExpireEmail(tenant.Id, utcNow)); } else if (endSubscriptionResult == EndSubscriptionResult.AssignedToAnotherEdition) { AsyncHelper.RunSync(() => _userEmailer.TryToSendSubscriptionAssignedToAnotherEmail(tenant.Id, utcNow, edition.ExpiringEditionId.Value)); } } catch (Exception exception) { failedTenancyNames.Add(tenant.TenancyName); Logger.Error($"Subscription of tenant {tenant.TenancyName} has been expired but tenant couldn't be made passive !"); Logger.Error(exception.Message, exception); } } if (!failedTenancyNames.Any()) { return; } AsyncHelper.RunSync(() => _userEmailer.TryToSendFailedSubscriptionTerminationsEmail(failedTenancyNames, utcNow)); }