diff --git a/Data.SeaHavenIndustries/Migrations/ApplicationDbContextModelSnapshot.cs b/Data.SeaHavenIndustries/Migrations/ApplicationDbContextModelSnapshot.cs index 608754d..3da8116 100644 --- a/Data.SeaHavenIndustries/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Data.SeaHavenIndustries/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1975,10 +1975,6 @@ namespace Data.SeaHavenIndustries.Migrations .HasMaxLength(2000) .HasColumnType("nvarchar(2000)"); - b.Property("FlagColor") - .HasMaxLength(7) - .HasColumnType("nvarchar(7)"); - b.Property("InternalWONumber") .HasColumnType("nvarchar(max)"); diff --git a/Data.SeaHavenIndustries/Models/WorkerOrder.cs b/Data.SeaHavenIndustries/Models/WorkerOrder.cs index 052c2d3..cb30f29 100644 --- a/Data.SeaHavenIndustries/Models/WorkerOrder.cs +++ b/Data.SeaHavenIndustries/Models/WorkerOrder.cs @@ -70,10 +70,6 @@ namespace Data.SeaHavenIndustries // --- Completion slice --- public DocStatus? DocStatus { get; set; } - /// Board flag color (#RRGGBB from fixed palette). Null = no flag. - [MaxLength(7)] - public string? FlagColor { get; set; } - // --- Legacy SQL columns (drift reconciliation) --- public string? AvettaTask { get; set; } public DateOnly? AssignDate { get; set; } diff --git a/SeaHaven.DataServices/Helpers/WorkOrderBoardProjection.cs b/SeaHaven.DataServices/Helpers/WorkOrderBoardProjection.cs index 5520791..71c417a 100644 --- a/SeaHaven.DataServices/Helpers/WorkOrderBoardProjection.cs +++ b/SeaHaven.DataServices/Helpers/WorkOrderBoardProjection.cs @@ -66,7 +66,6 @@ namespace SeaHaven.DataServices.Helpers w.ServiceNotes, w.ExtraServices, w.DocStatus, - w.FlagColor, w.PrimaryDispatchId, w.RowVersion, DispatchRowVersion = w.PrimaryDispatch != null ? w.PrimaryDispatch.RowVersion : null @@ -116,7 +115,6 @@ namespace SeaHaven.DataServices.Helpers w.ServiceNotes, w.ExtraServices, w.DocStatus, - w.FlagColor, w.PrimaryDispatchId, w.RowVersion, w.DispatchRowVersion, diff --git a/SeaHaven.DataServices/Interfaces/WorkOrderBoardModels.cs b/SeaHaven.DataServices/Interfaces/WorkOrderBoardModels.cs index c46ff55..ce96697 100644 --- a/SeaHaven.DataServices/Interfaces/WorkOrderBoardModels.cs +++ b/SeaHaven.DataServices/Interfaces/WorkOrderBoardModels.cs @@ -45,7 +45,6 @@ namespace SeaHaven.DataServices.Interfaces string? ServiceNotes, string? ExtraServices, DocStatus? DocStatus, - string? FlagColor, int? PrimaryDispatchId, byte[]? RowVersion, byte[]? DispatchRowVersion, diff --git a/SeaHaven.Services/DTOs/WorkOrderBoardDTOs.cs b/SeaHaven.Services/DTOs/WorkOrderBoardDTOs.cs index f0b13f9..1f1b549 100644 --- a/SeaHaven.Services/DTOs/WorkOrderBoardDTOs.cs +++ b/SeaHaven.Services/DTOs/WorkOrderBoardDTOs.cs @@ -54,8 +54,6 @@ namespace SeaHaven.Services.DTOs public string? ServiceNotes { get; set; } public List? ExtraServices { get; set; } public DocStatus? DocStatus { get; set; } - /// Board flag color (#RRGGBB). Null = no flag. Distinct from Color (dispatcher avatar). - public string? FlagColor { get; set; } public int? PrimaryDispatchId { get; set; } public byte[]? RowVersion { get; set; } public byte[]? DispatchRowVersion { get; set; } diff --git a/SeaHaven.Services/Helpers/WorkOrderBoardFieldNames.cs b/SeaHaven.Services/Helpers/WorkOrderBoardFieldNames.cs index a76a7fe..233090e 100644 --- a/SeaHaven.Services/Helpers/WorkOrderBoardFieldNames.cs +++ b/SeaHaven.Services/Helpers/WorkOrderBoardFieldNames.cs @@ -18,7 +18,6 @@ namespace SeaHaven.Services.Helpers public const string Pm = "pm"; public const string ServiceNotes = "serviceNotes"; public const string ExtraServices = "extraServices"; - public const string FlagColor = "flagColor"; public const string RescheduleCount = "RescheduleCount"; private static readonly HashSet DispatchFields = new(StringComparer.OrdinalIgnoreCase) @@ -45,8 +44,7 @@ namespace SeaHaven.Services.Helpers DocStatus, Pm, ServiceNotes, - ExtraServices, - FlagColor + ExtraServices }; public static bool IsEditable(string field) => Canonicalize(field) != null; @@ -86,7 +84,6 @@ namespace SeaHaven.Services.Helpers Pm => "Trade", ServiceNotes => "ServiceNotes", ExtraServices => "ExtraServices", - FlagColor => "FlagColor", _ => canonical }; } diff --git a/SeaHaven.Services/Implementation/WorkOrderBoardService.cs b/SeaHaven.Services/Implementation/WorkOrderBoardService.cs index 56c576e..076f090 100644 --- a/SeaHaven.Services/Implementation/WorkOrderBoardService.cs +++ b/SeaHaven.Services/Implementation/WorkOrderBoardService.cs @@ -118,7 +118,6 @@ namespace SeaHaven.Services.Implementation ServiceNotes = row.ServiceNotes, ExtraServices = ParseExtraServices(row.ExtraServices), DocStatus = row.DocStatus, - FlagColor = row.FlagColor, PrimaryDispatchId = row.PrimaryDispatchId, RowVersion = row.RowVersion, DispatchRowVersion = row.DispatchRowVersion diff --git a/SeaHaven.Services/Implementation/WorkOrderBoardUpdateService.cs b/SeaHaven.Services/Implementation/WorkOrderBoardUpdateService.cs index c924009..90b57fb 100644 --- a/SeaHaven.Services/Implementation/WorkOrderBoardUpdateService.cs +++ b/SeaHaven.Services/Implementation/WorkOrderBoardUpdateService.cs @@ -161,7 +161,6 @@ namespace SeaHaven.Services.Implementation WorkOrderBoardFieldNames.Pm => new List { ApplyStringField(value, auditField, v => workOrder.Trade = v, () => workOrder.Trade) }, WorkOrderBoardFieldNames.ServiceNotes => new List { ApplyServiceNotes(workOrder, value, auditField) }, WorkOrderBoardFieldNames.ExtraServices => new List { ApplyExtraServices(workOrder, value, auditField) }, - WorkOrderBoardFieldNames.FlagColor => new List { ApplyFlagColor(workOrder, value, auditField) }, _ => throw new WorkOrderBoardValidationException("InvalidField", $"Field '{field}' is not editable.") }; } @@ -549,24 +548,6 @@ namespace SeaHaven.Services.Implementation return FieldChange.ForField(auditField, old, parsed.ToString()); } - private static FieldChange ApplyFlagColor(WorkOrder workOrder, string? value, string auditField) - { - if (!WorkOrderFlagColors.TryNormalize(value, out var canonical)) - throw new WorkOrderBoardValidationException("InvalidValue", $"Invalid flagColor: {value}"); - - if (canonical != null && !WorkOrderFlagColors.IsAllowed(canonical)) - throw new WorkOrderBoardValidationException( - "InvalidValue", - $"flagColor must be one of the allowed palette values or empty to clear."); - - var old = workOrder.FlagColor; - if (string.Equals(old, canonical, StringComparison.OrdinalIgnoreCase)) - return FieldChange.Unchanged(auditField); - - workOrder.FlagColor = canonical; - return FieldChange.ForField(auditField, old, canonical); - } - private static List ApplyAutoScheduleSideEffects(WorkOrder workOrder) { var changes = new List(); diff --git a/SeaHaven.Services/Implementation/WorkOrderDetailService.cs b/SeaHaven.Services/Implementation/WorkOrderDetailService.cs index 849c5f6..0f7b5d0 100644 --- a/SeaHaven.Services/Implementation/WorkOrderDetailService.cs +++ b/SeaHaven.Services/Implementation/WorkOrderDetailService.cs @@ -114,7 +114,6 @@ namespace SeaHaven.Services.Implementation ServiceNotes = extended?.ServiceNotes ?? row.ServiceNotes, ExtraServices = ParseExtraServices(extended?.ExtraServices) ?? row.ExtraServices, DocStatus = row.DocStatus, - FlagColor = row.FlagColor, PrimaryDispatchId = row.PrimaryDispatchId, RowVersion = row.RowVersion, DispatchRowVersion = row.DispatchRowVersion, diff --git a/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs b/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs index ecaba65..94ba33d 100644 --- a/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs +++ b/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs @@ -350,157 +350,4 @@ public class WorkOrderBoardUpdateServiceTests Assert.Equal("InvalidValue", ex.Code); } - - [Fact] - public async Task PatchField_SetsFlagColor_CanonicalUppercase() - { - var (context, service) = CreateSut(); - var wo = new WorkOrder - { - Id = 1, - LifecycleStatus = LifecycleStatus.Incomplete, - RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } - }; - context.workOrders.Add(wo); - await context.SaveChangesAsync(); - - var result = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto - { - Field = WorkOrderBoardFieldNames.FlagColor, - Value = "#ef4444", - WorkOrderVersion = ToVersion(wo) - }, "actor-1"); - - Assert.Equal("#EF4444", result.FlagColor); - Assert.Equal("#EF4444", (await context.workOrders.FindAsync(1))!.FlagColor); - } - - [Fact] - public async Task PatchField_ClearsFlagColor_WithNullOrEmpty() - { - var (context, service) = CreateSut(); - var wo = new WorkOrder - { - Id = 1, - LifecycleStatus = LifecycleStatus.Incomplete, - FlagColor = "#EF4444", - RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } - }; - context.workOrders.Add(wo); - await context.SaveChangesAsync(); - - var cleared = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto - { - Field = WorkOrderBoardFieldNames.FlagColor, - Value = "", - WorkOrderVersion = ToVersion(wo) - }, "actor-1"); - - Assert.Null(cleared.FlagColor); - Assert.Null((await context.workOrders.FindAsync(1))!.FlagColor); - } - - [Fact] - public async Task PatchField_ClearsFlagColor_WithNullValue() - { - var (context, service) = CreateSut(); - var wo = new WorkOrder - { - Id = 1, - LifecycleStatus = LifecycleStatus.Incomplete, - FlagColor = "#3B82F6", - RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } - }; - context.workOrders.Add(wo); - await context.SaveChangesAsync(); - - var cleared = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto - { - Field = WorkOrderBoardFieldNames.FlagColor, - Value = null, - WorkOrderVersion = ToVersion(wo) - }, "actor-1"); - - Assert.Null(cleared.FlagColor); - Assert.Null((await context.workOrders.FindAsync(1))!.FlagColor); - } - - [Fact] - public async Task PatchField_FlagColorOutsidePalette_Throws() - { - var (context, service) = CreateSut(); - var wo = new WorkOrder - { - Id = 1, - LifecycleStatus = LifecycleStatus.Incomplete, - RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } - }; - context.workOrders.Add(wo); - await context.SaveChangesAsync(); - - var ex = await Assert.ThrowsAsync(() => - service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto - { - Field = WorkOrderBoardFieldNames.FlagColor, - Value = "#000000", - WorkOrderVersion = ToVersion(wo) - }, "actor-1")); - - Assert.Equal("InvalidValue", ex.Code); - } - - [Fact] - public async Task PatchField_FlagColorMalformed_Throws() - { - var (context, service) = CreateSut(); - var wo = new WorkOrder - { - Id = 1, - LifecycleStatus = LifecycleStatus.Incomplete, - RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } - }; - context.workOrders.Add(wo); - await context.SaveChangesAsync(); - - var ex = await Assert.ThrowsAsync(() => - service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto - { - Field = WorkOrderBoardFieldNames.FlagColor, - Value = "not-a-color", - WorkOrderVersion = ToVersion(wo) - }, "actor-1")); - - Assert.Equal("InvalidValue", ex.Code); - } - - [Fact] - public async Task PatchField_FlagColor_DoesNotRequireDispatchVersion() - { - var (context, service) = CreateSut(); - var wo = new WorkOrder - { - Id = 1, - LifecycleStatus = LifecycleStatus.Incomplete, - PrimaryDispatchId = 10, - RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } - }; - context.Dispatches.Add(new Dispatch - { - Id = 10, - WorkOrderId = 1, - RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 2 } - }); - context.workOrders.Add(wo); - await context.SaveChangesAsync(); - - var result = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto - { - Field = WorkOrderBoardFieldNames.FlagColor, - Value = "#8B5CF6", - WorkOrderVersion = ToVersion(wo) - // no DispatchVersion - }, "actor-1"); - - Assert.Equal("#8B5CF6", result.FlagColor); - } }