From d6e809f4191312770e7e2e91ca8f600637154410 Mon Sep 17 00:00:00 2001 From: Jacob Smith Date: Tue, 5 May 2026 13:38:15 -0700 Subject: [PATCH 1/3] AB#32451 add UOW to AI generation jobs --- .../BackgroundJobs/GenerateApplicationAnalysisJob.cs | 6 ++++++ .../BackgroundJobs/GenerateApplicationScoringJob.cs | 6 ++++++ .../BackgroundJobs/GenerateAttachmentSummaryJob.cs | 6 ++++++ .../BackgroundJobs/RunApplicationAIPipelineJob.cs | 6 ++++++ .../Automation/RunApplicationAIPipelineJobTests.cs | 4 +++- 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs index 30ce556bf..101c79aed 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs @@ -7,6 +7,7 @@ using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; namespace Unity.GrantManager.GrantApplications.Automation.BackgroundJobs; @@ -14,11 +15,13 @@ public class GenerateApplicationAnalysisJob( IApplicationAnalysisService applicationAnalysisService, IRepository generationRequestRepository, ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, ILogger logger) : AsyncBackgroundJob, ITransientDependency { public override async Task ExecuteAsync(GenerateApplicationAnalysisBackgroundJobArgs args) { using (currentTenant.Change(args.TenantId)) + using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == args.RequestKey); await AIGenerationRequestJobHelper.MarkRunningAsync(generationRequestRepository, request); @@ -33,8 +36,11 @@ public override async Task ExecuteAsync(GenerateApplicationAnalysisBackgroundJob catch (Exception ex) { await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); + await uow.CompleteAsync(); throw; } + + await uow.CompleteAsync(); } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs index 87a0eed6a..c383b9667 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs @@ -6,6 +6,7 @@ using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; namespace Unity.GrantManager.GrantApplications.Automation.BackgroundJobs; @@ -13,11 +14,13 @@ public class GenerateApplicationScoringJob( IApplicationScoringAppService applicationScoringAppService, IRepository generationRequestRepository, ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, ILogger logger) : AsyncBackgroundJob, ITransientDependency { public override async Task ExecuteAsync(GenerateApplicationScoringBackgroundJobArgs args) { using (currentTenant.Change(args.TenantId)) + using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == args.RequestKey); await AIGenerationRequestJobHelper.MarkRunningAsync(generationRequestRepository, request); @@ -31,8 +34,11 @@ public override async Task ExecuteAsync(GenerateApplicationScoringBackgroundJobA catch (Exception ex) { await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); + await uow.CompleteAsync(); throw; } + + await uow.CompleteAsync(); } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs index b6c1b186f..2e723d3d0 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs @@ -7,6 +7,7 @@ using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; namespace Unity.GrantManager.GrantApplications.Automation.BackgroundJobs; @@ -14,11 +15,13 @@ public class GenerateAttachmentSummaryJob( IAttachmentSummaryService attachmentSummaryService, IRepository generationRequestRepository, ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, ILogger logger) : AsyncBackgroundJob, ITransientDependency { public override async Task ExecuteAsync(GenerateAttachmentSummaryBackgroundJobArgs args) { using (currentTenant.Change(args.TenantId)) + using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == args.RequestKey); await AIGenerationRequestJobHelper.MarkRunningAsync(generationRequestRepository, request); @@ -33,8 +36,11 @@ public override async Task ExecuteAsync(GenerateAttachmentSummaryBackgroundJobAr catch (Exception ex) { await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); + await uow.CompleteAsync(); throw; } + + await uow.CompleteAsync(); } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs index c749f3ff8..d8c1f16fb 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs @@ -13,6 +13,7 @@ using Volo.Abp.EventBus.Local; using Volo.Abp.Features; using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; namespace Unity.GrantManager.GrantApplications.Automation.BackgroundJobs; @@ -25,6 +26,7 @@ public class RunApplicationAIPipelineJob( ILocalEventBus localEventBus, IRepository generationRequestRepository, ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, ILogger logger) : AsyncBackgroundJob, ITransientDependency { public override async Task ExecuteAsync(RunApplicationAIPipelineJobArgs args) @@ -35,6 +37,7 @@ public override async Task ExecuteAsync(RunApplicationAIPipelineJobArgs args) } using (currentTenant.Change(args.TenantId)) + using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync( generationRequestRepository, @@ -52,6 +55,7 @@ public override async Task ExecuteAsync(RunApplicationAIPipelineJobArgs args) { logger.LogDebug("All AI features are disabled, skipping queued AI generation for application {ApplicationId}.", args.ApplicationId); await AIGenerationRequestJobHelper.MarkCompletedAsync(generationRequestRepository, request); + await uow.CompleteAsync(); return; } @@ -115,10 +119,12 @@ await localEventBus.PublishAsync(new ApplicationAIScoringGeneratedEvent } await AIGenerationRequestJobHelper.MarkCompletedAsync(generationRequestRepository, request); + await uow.CompleteAsync(); } catch (Exception ex) { await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); + await uow.CompleteAsync(); throw; } } diff --git a/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/GrantApplications/Automation/RunApplicationAIPipelineJobTests.cs b/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/GrantApplications/Automation/RunApplicationAIPipelineJobTests.cs index 9bcde4f0f..c8ef48d05 100644 --- a/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/GrantApplications/Automation/RunApplicationAIPipelineJobTests.cs +++ b/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/GrantApplications/Automation/RunApplicationAIPipelineJobTests.cs @@ -13,6 +13,7 @@ using Volo.Abp.EventBus.Local; using Volo.Abp.Features; using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; using Xunit; using Xunit.Abstractions; @@ -78,7 +79,7 @@ await localEventBus.Received(1).PublishAsync( Arg.Is(x => x.ApplicationId == request.ApplicationId)); } - private static RunApplicationAIPipelineJob BuildJob( + private RunApplicationAIPipelineJob BuildJob( IFeatureChecker featureChecker, IRepository generationRequestRepository, ILocalEventBus? localEventBus = null, @@ -95,6 +96,7 @@ private static RunApplicationAIPipelineJob BuildJob( localEventBus ?? Substitute.For(), generationRequestRepository, Substitute.For(), + GetRequiredService(), NullLogger.Instance); } From 7ee8f0098e6c161e830f936bf6f0349791aa99d3 Mon Sep 17 00:00:00 2001 From: Jacob Smith Date: Tue, 5 May 2026 14:02:34 -0700 Subject: [PATCH 2/3] AB#32451 keep AI generation UOW scopes short --- .../AIGenerationRequestJobHelper.cs | 35 +++++++++++++++++++ .../GenerateApplicationAnalysisJob.cs | 11 ++---- .../GenerateApplicationScoringJob.cs | 11 ++---- .../GenerateAttachmentSummaryJob.cs | 11 ++---- .../RunApplicationAIPipelineJob.cs | 16 +++------ .../Pages/GrantApplications/Details.css | 2 -- 6 files changed, 48 insertions(+), 38 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/AIGenerationRequestJobHelper.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/AIGenerationRequestJobHelper.cs index 843b09120..978b3d587 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/AIGenerationRequestJobHelper.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/AIGenerationRequestJobHelper.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Unity.GrantManager.GrantApplications; using Volo.Abp.Domain.Repositories; +using Volo.Abp.Uow; namespace Unity.GrantManager.GrantApplications.Automation.BackgroundJobs; @@ -49,6 +50,40 @@ public static async Task MarkFailedAsync( await generationRequestRepository.UpdateAsync(request, autoSave: true); } + public static async Task MarkRunningInNewUowAsync( + IUnitOfWorkManager unitOfWorkManager, + IRepository generationRequestRepository, + string requestKey) + { + using var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false); + var request = await GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == requestKey); + await MarkRunningAsync(generationRequestRepository, request); + await uow.CompleteAsync(); + } + + public static async Task MarkCompletedInNewUowAsync( + IUnitOfWorkManager unitOfWorkManager, + IRepository generationRequestRepository, + string requestKey) + { + using var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false); + var request = await GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == requestKey); + await MarkCompletedAsync(generationRequestRepository, request); + await uow.CompleteAsync(); + } + + public static async Task MarkFailedInNewUowAsync( + IUnitOfWorkManager unitOfWorkManager, + IRepository generationRequestRepository, + string requestKey, + string? failureReason) + { + using var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false); + var request = await GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == requestKey); + await MarkFailedAsync(generationRequestRepository, request, failureReason); + await uow.CompleteAsync(); + } + public static async Task GetLatestRequestAsync( IRepository generationRequestRepository, Expression> predicate) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs index 101c79aed..b7a78850a 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationAnalysisJob.cs @@ -21,26 +21,21 @@ public class GenerateApplicationAnalysisJob( public override async Task ExecuteAsync(GenerateApplicationAnalysisBackgroundJobArgs args) { using (currentTenant.Change(args.TenantId)) - using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { - var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == args.RequestKey); - await AIGenerationRequestJobHelper.MarkRunningAsync(generationRequestRepository, request); + await AIGenerationRequestJobHelper.MarkRunningInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); try { logger.LogInformation("Executing AI application analysis job for application {ApplicationId}.", args.ApplicationId); await applicationAnalysisService.RegenerateAndSaveAsync(args.ApplicationId, args.PromptVersion); logger.LogInformation("Completed AI application analysis job for application {ApplicationId}.", args.ApplicationId); - await AIGenerationRequestJobHelper.MarkCompletedAsync(generationRequestRepository, request); + await AIGenerationRequestJobHelper.MarkCompletedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); } catch (Exception ex) { - await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); - await uow.CompleteAsync(); + await AIGenerationRequestJobHelper.MarkFailedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey, ex.Message); throw; } - - await uow.CompleteAsync(); } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs index c383b9667..62900413b 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateApplicationScoringJob.cs @@ -20,25 +20,20 @@ public class GenerateApplicationScoringJob( public override async Task ExecuteAsync(GenerateApplicationScoringBackgroundJobArgs args) { using (currentTenant.Change(args.TenantId)) - using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { - var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == args.RequestKey); - await AIGenerationRequestJobHelper.MarkRunningAsync(generationRequestRepository, request); + await AIGenerationRequestJobHelper.MarkRunningInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); try { logger.LogInformation("Executing AI application scoring job for application {ApplicationId}.", args.ApplicationId); await applicationScoringAppService.GenerateApplicationScoringAsync(args.ApplicationId, args.PromptVersion); logger.LogInformation("Completed AI application scoring job for application {ApplicationId}.", args.ApplicationId); - await AIGenerationRequestJobHelper.MarkCompletedAsync(generationRequestRepository, request); + await AIGenerationRequestJobHelper.MarkCompletedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); } catch (Exception ex) { - await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); - await uow.CompleteAsync(); + await AIGenerationRequestJobHelper.MarkFailedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey, ex.Message); throw; } - - await uow.CompleteAsync(); } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs index 2e723d3d0..b9a710478 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/GenerateAttachmentSummaryJob.cs @@ -21,26 +21,21 @@ public class GenerateAttachmentSummaryJob( public override async Task ExecuteAsync(GenerateAttachmentSummaryBackgroundJobArgs args) { using (currentTenant.Change(args.TenantId)) - using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { - var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync(generationRequestRepository, x => x.RequestKey == args.RequestKey); - await AIGenerationRequestJobHelper.MarkRunningAsync(generationRequestRepository, request); + await AIGenerationRequestJobHelper.MarkRunningInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); try { logger.LogInformation( "Executing AI attachment summary job for application {ApplicationId}.", args.ApplicationId); await attachmentSummaryService.GenerateForApplicationAsync(args.ApplicationId, args.PromptVersion); - await AIGenerationRequestJobHelper.MarkCompletedAsync(generationRequestRepository, request); + await AIGenerationRequestJobHelper.MarkCompletedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); } catch (Exception ex) { - await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); - await uow.CompleteAsync(); + await AIGenerationRequestJobHelper.MarkFailedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey, ex.Message); throw; } - - await uow.CompleteAsync(); } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs index d8c1f16fb..9ecd21a82 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs @@ -37,13 +37,8 @@ public override async Task ExecuteAsync(RunApplicationAIPipelineJobArgs args) } using (currentTenant.Change(args.TenantId)) - using (var uow = unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { - var request = await AIGenerationRequestJobHelper.GetLatestRequestAsync( - generationRequestRepository, - x => x.RequestKey == args.RequestKey); - - await AIGenerationRequestJobHelper.MarkRunningAsync(generationRequestRepository, request); + await AIGenerationRequestJobHelper.MarkRunningInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); try { @@ -54,8 +49,7 @@ public override async Task ExecuteAsync(RunApplicationAIPipelineJobArgs args) if (!attachmentSummariesEnabled && !applicationAnalysisEnabled && !scoringEnabled) { logger.LogDebug("All AI features are disabled, skipping queued AI generation for application {ApplicationId}.", args.ApplicationId); - await AIGenerationRequestJobHelper.MarkCompletedAsync(generationRequestRepository, request); - await uow.CompleteAsync(); + await AIGenerationRequestJobHelper.MarkCompletedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); return; } @@ -118,13 +112,11 @@ await localEventBus.PublishAsync(new ApplicationAIScoringGeneratedEvent throw analysisException; } - await AIGenerationRequestJobHelper.MarkCompletedAsync(generationRequestRepository, request); - await uow.CompleteAsync(); + await AIGenerationRequestJobHelper.MarkCompletedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey); } catch (Exception ex) { - await AIGenerationRequestJobHelper.MarkFailedAsync(generationRequestRepository, request, ex.Message); - await uow.CompleteAsync(); + await AIGenerationRequestJobHelper.MarkFailedInNewUowAsync(unitOfWorkManager, generationRequestRepository, args.RequestKey, ex.Message); throw; } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.css b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.css index bac97ee3c..24e633622 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.css +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.css @@ -75,12 +75,10 @@ .ai-generate-btn { height: 2.25rem; - min-width: 8rem; } .ai-generate-btn.btn-sm { height: 2rem; - min-width: 7rem; } .ai-generate-btn .spinner-border-sm { From 963034c9d4681a1a7b18b8caa385fc3071a73342 Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Tue, 5 May 2026 14:51:29 -0700 Subject: [PATCH 3/3] feature/AB#32839-AddCancelledToInvoiceStatusExclusions --- .../EntityFrameworkCore/Repositories/PaymentRequestRepository.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentRequestRepository.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentRequestRepository.cs index 2ac40543b..f26ca656c 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentRequestRepository.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentRequestRepository.cs @@ -58,6 +58,7 @@ public async Task GetTotalPaymentRequestAmountByCorrelationIdAsync(Guid .Where(p => p.Status != PaymentRequestStatus.L1Declined && p.Status != PaymentRequestStatus.L2Declined && p.Status != PaymentRequestStatus.L3Declined + && p.InvoiceStatus != CasPaymentRequestStatus.Cancelled && p.InvoiceStatus != CasPaymentRequestStatus.NotFound && p.InvoiceStatus != CasPaymentRequestStatus.ErrorFromCas) .GroupBy(p => p.CorrelationId)