using Data.SeaHavenIndustries.Enums; namespace SeaHaven.Services.DTOs { public class WorkOrderDetailDto { public WorkOrderDetailInfoDto Info { get; set; } = new(); public WorkOrderCompletionDto Completion { get; set; } = new(); public List Comments { get; set; } = new(); public List Audit { get; set; } = new(); public List Media { get; set; } = new(); } public class WorkOrderDetailInfoDto : WorkOrderBoardRowDto { public string? Description { get; set; } public string? Trade { get; set; } public string? Problem { get; set; } public string? SubTrade { get; set; } public string? VendorNotes { get; set; } } public class CompletionDocTemplateDto { public int Id { get; set; } public string Name { get; set; } = ""; public string ServiceKey { get; set; } = ""; public WorkOrderType? WorkOrderType { get; set; } public string TemplateUrl { get; set; } = ""; public bool IsActive { get; set; } } // Completion document templates registry item and detail (same shape). public class CompletionDocTemplateDetailDto : CompletionDocTemplateDto { public string? ExtraSafetyNote { get; set; } public List Procedures { get; set; } = new(); public DateTime? CreatedAt { get; set; } public DateTime? UpdatedAt { get; set; } public string? CreatedByName { get; set; } } public class CompletionDocTemplateProcedureDto { public int Id { get; set; } public string Name { get; set; } = ""; public string Description { get; set; } = ""; public int SortOrder { get; set; } } // Create/update body. Legacy fields are optional: on update, null leaves the // stored value unchanged, as does a null Procedures list. WorkOrderType is the // exception: omitting it keeps the stored value, while an explicit // "workOrderType": null clears it so the template applies to every work order // type of its trade. ExtraSafetyNote is always applied, so null removes the note. public class CompletionDocTemplateCreateDto { private WorkOrderType? _workOrderType; public string? Name { get; set; } public string? ExtraSafetyNote { get; set; } public List? Procedures { get; set; } public string? ServiceKey { get; set; } public WorkOrderType? WorkOrderType { get => _workOrderType; set { _workOrderType = value; WorkOrderTypeSpecified = true; } } // True when the body carried workOrderType at all, including as null. [System.Text.Json.Serialization.JsonIgnore] public bool WorkOrderTypeSpecified { get; private set; } public string? TemplateUrl { get; set; } public bool? IsActive { get; set; } } public class CompletionDocTemplateProcedureInputDto { public string? Name { get; set; } public string? Description { get; set; } } public class CompletionDocTemplateLinkedWorkOrdersDto { public int Count { get; set; } public List WorkOrderIds { get; set; } = new(); } public class WorkOrderCompletionDto { public DocStatus? DocStatus { get; set; } public CompletionDocTemplateDto? Template { get; set; } public string? SignOffName { get; set; } public string? SignOffAttachment { get; set; } public string? SignOffSignature { get; set; } public List DispatchSignoffs { get; set; } = new(); } public class DispatchSignoffDto { public int DispatchId { get; set; } public string? SignoffType { get; set; } public string? Name { get; set; } public string? SignedAt { get; set; } } public class WorkOrderCommentDto { public int Id { get; set; } public string? AuthorId { get; set; } public string? AuthorName { get; set; } public string Text { get; set; } = ""; public string Time { get; set; } = ""; public string? Documents { get; set; } } public class WorkOrderCommentCreateDto { public string Text { get; set; } = ""; } public class WorkOrderAuditEntryDto { public string Type { get; set; } = "manual"; public string? DispatcherId { get; set; } public string Action { get; set; } = ""; public string? FieldName { get; set; } public string OldValue { get; set; } = ""; public string NewValue { get; set; } = ""; public string Time { get; set; } = ""; public int? DispatchId { get; set; } } public class WorkOrderMediaFileDto { public int Id { get; set; } public WorkOrderMediaCategory Category { get; set; } public string Url { get; set; } = ""; public string? FileName { get; set; } public string? UploadedAt { get; set; } public bool IsLegacy { get; set; } } public sealed class WorkOrderMediaContentDto { public required Stream Content { get; init; } public required string ContentType { get; init; } public required string FileName { get; init; } } public class WorkOrderCompletionDocUploadDto { public string? SignOffName { get; set; } public string? SignOffSignature { get; set; } public string? WorkOrderVersion { get; set; } } }