using Data.SeaHavenIndustries;
using Data.SeaHavenIndustries.Enums;
namespace SeaHaven.Services.DTOs
{
public class WorkOrderDTO
{
public int Id { get; set; }
public string? InternalWONumber { get; set; }
public string? WorkerOrderTitle { get; set; }
public string? Description { get; set; }
public WorkOrderStatus Status { get; set; }
public WorkOrderPriority Priority { get; set; }
public int? LocationId { get; set; }
public string? LocationName { get; set; }
public string? AssignTo { get; set; }
public DateTime? DueDate { get; set; }
public DateTime? CompletedDate { get; set; }
public DateTime? CreatedDate { get; set; }
public string? CreatedBy { get; set; }
public DateTime? ModifiedDate { get; set; }
public string? ModifiedBy { get; set; }
///
/// Maps entity to DTO (Entity -> DTO)
///
public static WorkOrderDTO MapToModel(WorkOrder entity)
{
if (entity == null) return null;
return new WorkOrderDTO
{
Id = entity.Id,
InternalWONumber = entity.InternalWONumber,
WorkerOrderTitle = entity.WorkerOrderTitle,
Description = entity.Description,
Status = Enum.TryParse(entity.Status, out var status) ? status : WorkOrderStatus.Open,
Priority = Enum.TryParse(entity.Priority, out var priority) ? priority : WorkOrderPriority.Medium,
LocationId = entity.LocationId,
LocationName = null,
AssignTo = entity.AssignTo,
DueDate = entity.DueDate,
CompletedDate = entity.CompletedDate,
CreatedDate = entity.CreatedDate,
CreatedBy = entity.createdby,
ModifiedDate = entity.LastModificationTime,
ModifiedBy = entity.LastModifierUserId?.ToString()
};
}
///
/// Maps DTO to entity (DTO -> Entity)
///
public static WorkOrder MapToEntity(WorkOrderDTO dto)
{
if (dto == null) return null;
return new WorkOrder
{
Id = dto.Id,
InternalWONumber = dto.InternalWONumber,
WorkerOrderTitle = dto.WorkerOrderTitle,
Description = dto.Description,
Status = dto.Status.ToString(),
Priority = dto.Priority.ToString(),
LocationId = dto.LocationId,
AssignTo = dto.AssignTo,
DueDate = dto.DueDate,
CompletedDate = dto.CompletedDate
};
}
}
public class CreateWorkOrderDTO
{
public required string WorkerOrderTitle { get; set; }
public string? Description { get; set; }
public WorkOrderStatus? Status { get; set; }
public WorkOrderPriority? Priority { get; set; }
public int? LocationId { get; set; }
public string? AssignTo { get; set; }
public DateTime? DueDate { get; set; }
/// Optional CRM customer name for org-wide AccountId resolution.
public string? Customer { get; set; }
public static WorkOrder MapToEntity(CreateWorkOrderDTO dto)
{
if (dto == null) return null!;
return new WorkOrder
{
WorkerOrderTitle = dto.WorkerOrderTitle,
Description = dto.Description,
Status = (dto.Status ?? WorkOrderStatus.Open).ToString(),
Priority = (dto.Priority ?? WorkOrderPriority.Medium).ToString(),
LocationId = dto.LocationId,
AssignTo = dto.AssignTo,
DueDate = dto.DueDate,
Customer = string.IsNullOrWhiteSpace(dto.Customer) ? null : dto.Customer.Trim(),
CreatedDate = DateTime.UtcNow
};
}
}
public class UpdateWorkOrderDTO
{
public string? WorkerOrderTitle { get; set; }
public string? Description { get; set; }
public WorkOrderStatus? Status { get; set; }
public WorkOrderPriority? Priority { get; set; }
public int? LocationId { get; set; }
public string? AssignTo { get; set; }
public DateTime? DueDate { get; set; }
public DateTime? CompletedDate { get; set; }
public static void UpdateEntity(UpdateWorkOrderDTO dto, WorkOrder entity)
{
if (dto == null || entity == null) return;
if (dto.WorkerOrderTitle != null) entity.WorkerOrderTitle = dto.WorkerOrderTitle;
if (dto.Description != null) entity.Description = dto.Description;
if (dto.Status.HasValue) entity.Status = dto.Status.ToString()!;
if (dto.Priority.HasValue) entity.Priority = dto.Priority.ToString()!;
if (dto.LocationId.HasValue) entity.LocationId = dto.LocationId;
if (dto.AssignTo != null) entity.AssignTo = dto.AssignTo;
if (dto.DueDate.HasValue) entity.DueDate = dto.DueDate;
if (dto.CompletedDate.HasValue) entity.CompletedDate = dto.CompletedDate;
entity.LastModificationTime = DateTime.UtcNow;
}
}
}