feat(work-orders): add domain enums and aggregate root fields

This commit is contained in:
Arthur Bassi 2026-06-29 17:22:31 -03:00
parent 3a61885c71
commit 456bee2226
6 changed files with 153 additions and 18 deletions

View file

@ -1,5 +1,6 @@
namespace Data.SeaHavenIndustries.Enums
{
/// <summary>Legacy enum — prefer LifecycleStatus for board operations.</summary>
public enum WorkOrderStatus
{
Open = 1,
@ -9,6 +10,72 @@ namespace Data.SeaHavenIndustries.Enums
OnHold = 5
}
/// <summary>10 operational lifecycle values aligned with SHOC board.</summary>
public enum LifecycleStatus
{
Incomplete = 1,
Scheduled = 2,
InProgress = 3,
Complete = 4,
Canceled = 5,
OnHold = 6,
PendingVendor = 7,
PendingApproval = 8,
NeedsReview = 9,
Closed = 10
}
public enum WorkOrderType
{
PO = 1,
PM = 2,
Emergency = 3,
Project = 4,
Inspection = 5,
Other = 99
}
public enum DocStatus
{
Yes = 1,
No = 2,
NotNeeded = 3
}
[Flags]
public enum OperationalFlags
{
None = 0,
PastDue = 1
}
public enum AuditEventType
{
Manual = 1,
System = 2,
Sync = 3,
Vendor = 4
}
public enum AuditActorType
{
Dispatcher = 1,
Vendor = 2,
System = 3,
Sync = 4
}
public enum AuditActionType
{
FieldChanged = 1,
StatusChanged = 2,
AssignmentChanged = 3,
WeekRolled = 4,
SyncRejected = 5,
Create = 6,
Delete = 7
}
public enum WorkOrderPriority
{
Low = 1,
@ -89,4 +156,12 @@ namespace Data.SeaHavenIndustries.Enums
Contact = 4,
Asset = 5
}
public enum WorkOrderMediaCategory
{
Before = 1,
After = 2,
Extra = 3,
Completion = 4
}
}

View file

@ -1,3 +1,4 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Data.SeaHavenIndustries
@ -26,6 +27,10 @@ namespace Data.SeaHavenIndustries
public string? AcceptToken { get; set; }
public string? VerifiedBy { get; set; }
public DateTime? VerifiedAt { get; set; }
[Timestamp]
public byte[]? RowVersion { get; set; }
public ICollection<Comments>? Comments { get; set; }
public ICollection<DispatchWorkOrder>? DispatchWorkOrders { get; set; }
public ICollection<DispatchChecklistItem>? ChecklistItems { get; set; }

View file

@ -15,6 +15,10 @@ namespace Data.SeaHavenIndustries
public string? OldValue { get; set; }
public string? NewValue { get; set; }
public string? Action { get; set; }
public string? EventType { get; set; }
public string? ActorType { get; set; }
public int? DispatchId { get; set; }
public string? CorrelationId { get; set; }
public DateTime CreatedAt { get; set; }
}
}

View file

@ -12,6 +12,6 @@ namespace Data.SeaHavenIndustries
public int? WorkorderId { get; set; }
[ForeignKey(nameof(WorkorderId))]
public virtual WorkOrder? WorkOrder { get; set; }
public string? Notes { get; set; }
}
}

View file

@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Data.SeaHavenIndustries
{
/// <summary>
/// ManualEditFlag — blocks Sync overwrite after first SHOC edit per field.
/// </summary>
public class WorkOrderFieldLock
{
public int Id { get; set; }
public int WorkOrderId { get; set; }
[ForeignKey(nameof(WorkOrderId))]
public virtual WorkOrder? WorkOrder { get; set; }
public string FieldName { get; set; } = "";
public DateTime LockedAt { get; set; }
public string? LockedByUserId { get; set; }
}
}

View file

@ -1,11 +1,16 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using static System.Runtime.InteropServices.JavaScript.JSType;
using Data.SeaHavenIndustries.Enums;
namespace Data.SeaHavenIndustries
{
/// <summary>
/// Work Order aggregate root. Domain slices (Core, Scheduling, Tracking, Analytics, Completion)
/// are persisted as flat columns on workOrders for Fase 0 backward compatibility.
/// </summary>
public class WorkOrder : FullAuditEntity
{
// --- Core slice ---
public string? InternalWONumber { get; set; }
public string? ExternalWorkOrderId { get; set; }
public string? WorkerOrderNumber { get; set; }
@ -15,34 +20,57 @@ namespace Data.SeaHavenIndustries
public string? SiteCode { get; set; }
public string? Building { get; set; }
public string? Severity { get; set; }
public DateTime? DateReported { get; set; }
public DateTime? DueDate { get; set; }
public string? AssignTo { get; set; }
[ForeignKey(nameof(AssignTo))]
public virtual ApplicationUser? AssignToUser { get; set; }
public int? LocationId { get; set; }
[ForeignKey(nameof(LocationId))]
public virtual Locations? Locations { get; set; }
public LifecycleStatus? LifecycleStatus { get; set; }
public string? LegacyStatus { get; set; }
public WorkOrderType? WorkOrderType { get; set; }
public int? PrimaryDispatchId { get; set; }
[ForeignKey(nameof(PrimaryDispatchId))]
public virtual Dispatch? PrimaryDispatch { get; set; }
// --- Scheduling slice ---
public DateTime? ScheduledDate { get; set; }
public DateTime? ScheduledStart { get; set; }
public DateTime? ScheduledEnd { get; set; }
public DateOnly? TargetWeek { get; set; }
public bool? ScheduleWeekOnly { get; set; }
// --- Tracking slice (set-once) ---
public DateOnly? OriginalWeek { get; set; }
public DateOnly? OriginalDate { get; set; }
// --- Analytics slice ---
public int RescheduleCount { get; set; }
public int CarriedOver { get; set; }
public OperationalFlags OperationalFlags { get; set; }
// --- Completion slice ---
public DocStatus? DocStatus { get; set; }
// --- Legacy SQL columns (drift reconciliation) ---
public string? AvettaTask { get; set; }
public DateOnly? AssignDate { get; set; }
// --- Legacy fields (retained for Blazor / coexistence) ---
public DateTime? DateReported { get; set; }
public string? SourceEmailS3Key { get; set; }
public string? Problem { get; set; }
public string? Trade { get; set; }
public string? SubTrade { get; set; }
public decimal? VendorNTE { get; set; }
public DateTime? ScheduledDate { get; set; }
public DateTime? CompletedDate { get; set; }
public string? Source { get; set; }
public bool? istemplate { get; set; }
public string? PO { get; set; }
public string? TT { get; set; }
//public int? ContactId { get; set; }
//[ForeignKey(nameof(ContactId))]
//public virtual Contacts? POC { get; set; }
public string? AssignTo { get; set; }
[ForeignKey(nameof(AssignTo))]
public virtual ApplicationUser? AssignToUser { get; set; }
public DateTime? DueDate { get; set; }
public string? Priority { get; set; }
public string? Status { get; set; }
public int? LocationId { get; set; }
[ForeignKey(nameof(LocationId))]
public virtual Locations? Locations { get; set; }
//public int? CategoryId { get; set; }
//[ForeignKey(nameof(CategoryId))]
//public virtual Category? Category { get; set; }
public string? Attachments { get; set; }
public string? BeforPhotoIssue { get; set; }
public string? BeforPhotoAttachment { get; set; }
@ -51,11 +79,16 @@ namespace Data.SeaHavenIndustries
public string? SignOffName { get; set; }
public string? SignOffAttachment { get; set; }
public string? SignOffSignature { get; set; }
[Timestamp]
public byte[]? RowVersion { get; set; }
public ICollection<Comments>? Comments { get; set; }
public ICollection<Quotes>? Quotes { get; set; }
public ICollection<WorkOrderContacts>? WorkOrderContacts { get; set; }
public ICollection<WorkOrderAttachments>? workOrderAttachments { get; set; }
public ICollection<WorkOrderCategories>? WorkOrderCategories { get; set; }
public ICollection<Dispatch>? Dispatches { get; set; }
public ICollection<WorkOrderFieldLock>? FieldLocks { get; set; }
}
}