From 60e006e8d7ab8e04cdf0adac2b5c434580741a0b Mon Sep 17 00:00:00 2001 From: Alexandre Brandizzi Date: Wed, 16 Sep 2026 22:17:59 -0300 Subject: [PATCH] fix(uplifts): calculate granted exposure amounts (SH-207) --- .../UpliftQueueReadTests.cs | 33 ++++++++++++++++++- .../Implementation/UpliftDataService.cs | 10 ++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Api.SeaHavenIndustries.Tests/UpliftQueueReadTests.cs b/Api.SeaHavenIndustries.Tests/UpliftQueueReadTests.cs index ad539bd..09beca4 100644 --- a/Api.SeaHavenIndustries.Tests/UpliftQueueReadTests.cs +++ b/Api.SeaHavenIndustries.Tests/UpliftQueueReadTests.cs @@ -86,7 +86,8 @@ public sealed class UpliftQueueReadTests var vendor = new Vendor { CompanyName = vendorName, IsActive = true }; var workOrder = new WorkOrder { - WorkerOrderNumber = number, + InternalWONumber = number, + WorkerOrderNumber = $"legacy-{number}", SiteCode = site, Service = service, WorkerOrderTitle = "Repair" @@ -407,6 +408,36 @@ public sealed class UpliftQueueReadTests itemB.WorkOrderApprovedExposureTotal.Should().Be(75m); } + [Fact] + public async Task Exposure_UsesGrantedAmountForVendorPortalAndRequestedAmountForWorkOrderRequests() + { + using var context = NewContext(); + var (vendor, workOrder) = await SeedWorkOrderAsync(context, "WO-ORIGIN", "SITE-A", "HVAC"); + var dispatch = await SeedDispatchAsync(context, vendor, workOrder, "DIS-ORIGIN"); + context.DispatchUpliftRequests.AddRange( + Request( + dispatch, + "Approved", + new DateTime(2026, 3, 1), + decided: new DateTime(2026, 3, 2), + requested: 400m, + currentNte: 100m), + Request( + dispatch, + "Approved", + new DateTime(2026, 3, 3), + decided: new DateTime(2026, 3, 4), + requested: 250m, + createdBy: "internal-user", + currentNte: 100m)); + await context.SaveChangesAsync(); + + var exposure = await new UpliftDataService(context) + .GetApprovedExposureForWorkOrdersAsync(new[] { workOrder.Id }, CancellationToken.None); + + exposure.Should().ContainSingle().Which.AdminApprovedTotal.Should().Be(550m); + } + [Fact] public async Task Exposure_IncludesLinkedDispatchesViaServerDerivedWorkOrderLinks() { diff --git a/SeaHaven.DataServices/Implementation/UpliftDataService.cs b/SeaHaven.DataServices/Implementation/UpliftDataService.cs index 8d7ac66..658c8a7 100644 --- a/SeaHaven.DataServices/Implementation/UpliftDataService.cs +++ b/SeaHaven.DataServices/Implementation/UpliftDataService.cs @@ -61,7 +61,7 @@ namespace SeaHaven.DataServices.Implementation PONumber = x.d.PONumber, WorkOrderId = x.d.WorkOrderId, VendorCompanyName = x.v != null ? x.v.CompanyName : x.u.RequestedByVendorName, - WorkOrderNumber = x.wo != null ? x.wo.WorkerOrderNumber : null, + WorkOrderNumber = x.wo != null ? x.wo.InternalWONumber : null, WorkOrderSiteCode = x.wo != null ? x.wo.SiteCode : null, WorkOrderService = x.wo != null ? x.wo.Service : null, RequestedByVendorName = x.u.RequestedByVendorName, @@ -317,9 +317,13 @@ namespace SeaHaven.DataServices.Implementation { DispatchId = g.Key, AutoApproved = g.Where(x => x.Status == "NoApprovalRequired") - .Sum(x => (decimal?)x.RequestedNTE), + .Sum(x => (decimal?)(x.createdby == null + ? x.RequestedNTE - (x.CurrentNTE ?? 0m) + : x.RequestedNTE)), AdminApproved = g.Where(x => x.Status == "Approved") - .Sum(x => (decimal?)x.RequestedNTE) + .Sum(x => (decimal?)(x.createdby == null + ? x.RequestedNTE - (x.CurrentNTE ?? 0m) + : x.RequestedNTE)) }) .ToListAsync(cancellationToken);