fix(work-orders): allow Complete without a linked site

Snapshot whatever Site/Vendor/POC data exists instead of gating completion on Locations.
This commit is contained in:
Arthur Bassi 2026-09-10 17:56:00 -03:00
parent e0139d4601
commit deeb29b512
2 changed files with 41 additions and 13 deletions

View file

@ -3,7 +3,6 @@ using System.Text.Json;
using Data.SeaHavenIndustries;
using SeaHaven.DataServices.Helpers;
using SeaHaven.Services.DTOs;
using SeaHaven.Services.Exceptions;
namespace SeaHaven.Services.Helpers
{
@ -13,10 +12,7 @@ namespace SeaHaven.Services.Helpers
public static void Capture(WorkOrder workOrder)
{
var location = workOrder.Locations
?? throw new WorkOrderBoardValidationException(
"CompletionSnapshotUnavailable",
"Site details are required before marking the work order Completed.");
var location = workOrder.Locations;
var contact = workOrder.WorkOrderContacts?
.OrderBy(item => item.Id)
@ -39,14 +35,14 @@ namespace SeaHaven.Services.Helpers
new WorkOrderFrozenSite
{
Code = workOrder.SiteCode,
Label = FirstNotBlank(location.Name, location.Title, workOrder.SiteCode),
Address = JoinAddress(location.Address1, location.Address2),
City = location.City,
State = location.State,
Zip = location.Zip,
Phone = location.PhoneNumber,
Email = location.Email,
Maps = BuildMapsUrl(location)
Label = FirstNotBlank(location?.Name, location?.Title, workOrder.SiteCode),
Address = JoinAddress(location?.Address1, location?.Address2),
City = location?.City,
State = location?.State,
Zip = location?.Zip,
Phone = location?.PhoneNumber,
Email = location?.Email,
Maps = location == null ? null : BuildMapsUrl(location)
},
JsonOptions);

View file

@ -117,6 +117,38 @@ public class WorkOrderCompletionFreezeTests
Assert.Equal("Frozen POC", afterFlag.PocName);
}
[Fact]
public async Task FirstCompletedTransitionWithoutSiteStillCapturesAvailableSnapshot()
{
await using var context = CreateContext();
var service = CreateService(context);
var workOrder = new WorkOrder
{
Id = 1,
InternalWONumber = "00000012345",
SiteCode = "BK5",
LifecycleStatus = LifecycleStatus.Scheduled,
ScheduledDate = DateTime.UtcNow.Date.AddDays(1),
RowVersion = Version()
};
context.Add(workOrder);
await context.SaveChangesAsync();
var completed = await service.PatchFieldAsync(
workOrder.Id,
Patch(WorkOrderBoardFieldNames.LifecycleStatus, "Complete", workOrder),
"actor-1");
var persisted = await context.workOrders.SingleAsync();
Assert.Equal(LifecycleStatus.Completed, completed.LifecycleStatus);
Assert.Equal("BK5", completed.FrozenSite?.Code);
Assert.Equal("BK5", completed.FrozenSite?.Label);
Assert.Null(completed.FrozenSite?.City);
Assert.Null(completed.FrozenCompany);
Assert.False(string.IsNullOrWhiteSpace(persisted.FrozenSite));
Assert.Null(persisted.FrozenCompany);
}
[Fact]
public async Task OpenWorkOrderProjectionKeepsUsingLiveLocation()
{