diff --git a/Data.SeaHavenIndustries/Enums/WorkOrderEnums.cs b/Data.SeaHavenIndustries/Enums/WorkOrderEnums.cs index 9c2e454..b8db7fc 100644 --- a/Data.SeaHavenIndustries/Enums/WorkOrderEnums.cs +++ b/Data.SeaHavenIndustries/Enums/WorkOrderEnums.cs @@ -1,92 +1,171 @@ -namespace Data.SeaHavenIndustries.Enums -{ - public enum WorkOrderStatus - { - Open = 1, - InProgress = 2, - Completed = 3, - Cancelled = 4, - OnHold = 5 - } - - public enum WorkOrderPriority - { - Low = 1, - Medium = 2, - High = 3, - Critical = 4 - } - - public enum AuditAction - { - Create = 1, - Edit = 2, - Delete = 3, - StatusChange = 4, - AssignmentChange = 5, - Dispatch = 6, - DispatchUpdate = 7, - DispatchVerify = 8 - } - - public enum ContactType - { - Primary = 1, - Secondary = 2, - Billing = 3, - Technical = 4 - } - - public enum AssetStatus - { - Active = 1, - Inactive = 2, - UnderMaintenance = 3, - Retired = 4 - } - - public enum DispatchStatus - { - Pending = 1, - Assigned = 2, - InProgress = 3, - Completed = 4, - Cancelled = 5 - } - - public enum FollowUpStatus - { - Open = 1, - InProgress = 2, - Resolved = 3, - Closed = 4 - } - - public enum PMScheduleFrequency - { - Daily = 1, - Weekly = 2, - Monthly = 3, - Quarterly = 4, - SemiAnnual = 5, - Annual = 6 - } - - public enum CommentType - { - General = 1, - Internal = 2, - Customer = 3, - Vendor = 4, - System = 5 - } - - public enum RecordType - { - WorkOrder = 1, - Dispatch = 2, - Quote = 3, - Contact = 4, - Asset = 5 - } -} +namespace Data.SeaHavenIndustries.Enums +{ + /// Legacy enum — prefer LifecycleStatus for board operations. + public enum WorkOrderStatus + { + Open = 1, + InProgress = 2, + Completed = 3, + Cancelled = 4, + OnHold = 5 + } + + /// 10 operational lifecycle values aligned with SHOC board (FE labels). + public enum LifecycleStatus + { + Incomplete = 1, + Pending = 2, + Scheduled = 3, + EnRoute = 4, + OnSite = 5, + InProgress = 6, + Completed = 7, + Rescheduled = 8, + Canceled = 9, + PendingQuote = 10 + } + + /// Board work-order types. Legacy values retained for backward compatibility. + public enum WorkOrderType + { + PO = 1, + PM = 2, + Emergency = 3, + Project = 4, + Inspection = 5, + Reactive = 6, + AddOn = 7, + 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, + Medium = 2, + High = 3, + Critical = 4 + } + + public enum AuditAction + { + Create = 1, + Edit = 2, + Delete = 3, + StatusChange = 4, + AssignmentChange = 5, + Dispatch = 6, + DispatchUpdate = 7, + DispatchVerify = 8 + } + + public enum ContactType + { + Primary = 1, + Secondary = 2, + Billing = 3, + Technical = 4 + } + + public enum AssetStatus + { + Active = 1, + Inactive = 2, + UnderMaintenance = 3, + Retired = 4 + } + + public enum DispatchStatus + { + Pending = 1, + Assigned = 2, + InProgress = 3, + Completed = 4, + Cancelled = 5 + } + + public enum FollowUpStatus + { + Open = 1, + InProgress = 2, + Resolved = 3, + Closed = 4 + } + + public enum PMScheduleFrequency + { + Daily = 1, + Weekly = 2, + Monthly = 3, + Quarterly = 4, + SemiAnnual = 5, + Annual = 6 + } + + public enum CommentType + { + General = 1, + Internal = 2, + Customer = 3, + Vendor = 4, + System = 5 + } + + public enum RecordType + { + WorkOrder = 1, + Dispatch = 2, + Quote = 3, + Contact = 4, + Asset = 5 + } + + public enum WorkOrderMediaCategory + { + Before = 1, + After = 2, + Extra = 3, + Completion = 4 + } +} + \ No newline at end of file diff --git a/Data.SeaHavenIndustries/Models/Dispatch.cs b/Data.SeaHavenIndustries/Models/Dispatch.cs index 869fedf..831cc17 100644 --- a/Data.SeaHavenIndustries/Models/Dispatch.cs +++ b/Data.SeaHavenIndustries/Models/Dispatch.cs @@ -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 { get; set; } public ICollection? DispatchWorkOrders { get; set; } public ICollection? ChecklistItems { get; set; } diff --git a/Data.SeaHavenIndustries/Models/WorkOrderAuditLog.cs b/Data.SeaHavenIndustries/Models/WorkOrderAuditLog.cs index 0b2572f..b3fbb7d 100644 --- a/Data.SeaHavenIndustries/Models/WorkOrderAuditLog.cs +++ b/Data.SeaHavenIndustries/Models/WorkOrderAuditLog.cs @@ -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; } } } diff --git a/Data.SeaHavenIndustries/Models/WorkOrderContacts.cs b/Data.SeaHavenIndustries/Models/WorkOrderContacts.cs index 96e89eb..52919ea 100644 --- a/Data.SeaHavenIndustries/Models/WorkOrderContacts.cs +++ b/Data.SeaHavenIndustries/Models/WorkOrderContacts.cs @@ -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; } } } diff --git a/Data.SeaHavenIndustries/Models/WorkOrderFieldLock.cs b/Data.SeaHavenIndustries/Models/WorkOrderFieldLock.cs new file mode 100644 index 0000000..c749159 --- /dev/null +++ b/Data.SeaHavenIndustries/Models/WorkOrderFieldLock.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations.Schema; + +namespace Data.SeaHavenIndustries +{ + /// + /// ManualEditFlag — blocks Sync overwrite after first SHOC edit per field. + /// + 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; } + } +} diff --git a/Data.SeaHavenIndustries/Models/WorkerOrder.cs b/Data.SeaHavenIndustries/Models/WorkerOrder.cs index 6d3692e..a5038d7 100644 --- a/Data.SeaHavenIndustries/Models/WorkerOrder.cs +++ b/Data.SeaHavenIndustries/Models/WorkerOrder.cs @@ -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 { + /// + /// Work Order aggregate root. Domain slices (Core, Scheduling, Tracking, Analytics, Completion) + /// are persisted as flat columns on workOrders for Fase 0 backward compatibility. + /// public class WorkOrder : FullAuditEntity { + // --- Core slice --- public string? InternalWONumber { get; set; } public string? ExternalWorkOrderId { get; set; } public string? WorkerOrderNumber { get; set; } @@ -15,34 +20,59 @@ 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; } + /// SHOC board "Service" column (PM type label). Not Trade/Problem. + public string? Service { 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 +81,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 { get; set; } public ICollection? Quotes { get; set; } public ICollection? WorkOrderContacts { get; set; } public ICollection? workOrderAttachments { get; set; } public ICollection? WorkOrderCategories { get; set; } public ICollection? Dispatches { get; set; } + public ICollection? FieldLocks { get; set; } } }