feat(work-orders): run schedule status side-effects on board field mutations

This commit is contained in:
Arthur Bassi 2026-09-08 16:22:11 -03:00
parent e12b3ea54b
commit ae9122243d
2 changed files with 31 additions and 15 deletions

View file

@ -62,21 +62,7 @@ namespace SeaHaven.Services.Helpers
}
public static List<BoardFieldChange> ApplyAutoScheduleSideEffects(WorkOrder workOrder)
{
var changes = new List<BoardFieldChange>();
if (!WorkOrderBoardMutationRules.ShouldAutoSchedule(
workOrder.LifecycleStatus,
workOrder.ScheduledDate,
workOrder.AssignTo,
workOrder.ScheduleWeekOnly))
return changes;
var old = workOrder.LifecycleStatus?.ToString();
workOrder.LifecycleStatus = LifecycleStatus.Scheduled;
workOrder.Status = WorkOrderDerivedFields.GetLifecycleStatusLabel(LifecycleStatus.Scheduled);
changes.Add(BoardFieldChange.StatusChanged("LifecycleStatus", old, LifecycleStatus.Scheduled.ToString()));
return changes;
}
=> WorkOrderDerivedFields.ApplyLifecycleFromSchedule(workOrder);
public static BoardFieldChange ApplyApptTime(WorkOrder workOrder, Dispatch dispatch, string? value)
{

View file

@ -1,4 +1,5 @@
using Data.SeaHavenIndustries;
using Data.SeaHavenIndustries.Enums;
using SeaHaven.Services.Helpers;
namespace SeaHavenIndustries.Tests;
@ -50,4 +51,33 @@ public class WorkOrderBoardFieldMutationsTests
Assert.Equal(new DateTime(2026, 6, 25, 9, 0, 0), workOrder.ScheduledStart);
Assert.Equal(new DateTime(2026, 6, 25, 11, 0, 0), workOrder.ScheduledEnd);
}
[Fact]
public void ApplyScheduledDate_IncompleteWithoutAssignee_PromotesToScheduled()
{
var workOrder = new WorkOrder { LifecycleStatus = LifecycleStatus.Incomplete };
var changes = WorkOrderBoardFieldMutations.ApplyScheduledDate(
workOrder,
new DateTime(2026, 6, 25));
Assert.Equal(LifecycleStatus.Scheduled, workOrder.LifecycleStatus);
Assert.Contains(changes, c => c.Action == AuditActionType.StatusChanged);
}
[Fact]
public void ApplyScheduledDate_ClearsScheduled_DemotesToPending()
{
var workOrder = new WorkOrder
{
LifecycleStatus = LifecycleStatus.Scheduled,
ScheduledDate = new DateTime(2026, 6, 25)
};
var changes = WorkOrderBoardFieldMutations.ApplyScheduledDate(workOrder, parsed: null);
Assert.Equal(LifecycleStatus.Pending, workOrder.LifecycleStatus);
Assert.Contains(changes, c => c.Action == AuditActionType.StatusChanged
&& c.NewValue == LifecycleStatus.Pending.ToString());
}
}