mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 08:23:12 +00:00
UpdateAsync only applied WorkOrderType when it had a value, so once a template was restricted to one work order type no request could make it trade-generic again. The DTO now records whether workOrderType was present in the body: omitting it keeps the stored value, an explicit null clears it, and a concrete value sets it. The templates page echoes the stored legacy fields on PUT, so its behaviour is unchanged.
163 lines
5.6 KiB
C#
163 lines
5.6 KiB
C#
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<WorkOrderCommentDto> Comments { get; set; } = new();
|
|
public List<WorkOrderAuditEntryDto> Audit { get; set; } = new();
|
|
public List<WorkOrderMediaFileDto> 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<CompletionDocTemplateProcedureDto> 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<CompletionDocTemplateProcedureInputDto>? 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<int> 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<DispatchSignoffDto> 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; }
|
|
}
|
|
}
|