mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 03:43:11 +00:00
The uplift detail modal needs the work order's assigned dispatcher, the requesting vendor's technician and the scheduled date. They now resolve from the same effective work order and vendor as the existing queue row, so the modal no longer depends on a separate work-order fetch that account-scoped staff cannot read.
131 lines
5.5 KiB
C#
131 lines
5.5 KiB
C#
namespace SeaHaven.Services.DTOs
|
|
{
|
|
public class UpliftListItemDTO
|
|
{
|
|
public int Id { get; set; }
|
|
public int DispatchId { get; set; }
|
|
public string? DispatchNumber { get; set; }
|
|
public string? PONumber { get; set; }
|
|
public int? WorkOrderId { get; set; }
|
|
public string? VendorCompanyName { get; set; }
|
|
// Approval queue read contract: flattened work-order context and requester.
|
|
public string? WorkOrderNumber { get; set; }
|
|
public string? WorkOrderSite { get; set; }
|
|
public string? WorkOrderService { get; set; }
|
|
// SH-209: detail modal work-order context.
|
|
public DateTime? WorkOrderScheduledDate { get; set; }
|
|
public string? WorkOrderDispatcherName { get; set; }
|
|
public string? TechnicianName { get; set; }
|
|
public string? RequestedByName { get; set; }
|
|
public string? DecidedByName { get; set; }
|
|
public decimal? CurrentNTE { get; set; }
|
|
public decimal RequestedNTE { get; set; }
|
|
public decimal Delta { get; set; }
|
|
public string? VendorReason { get; set; }
|
|
public int RequiredTier { get; set; }
|
|
public string? Status { get; set; }
|
|
public DateTime? RequestedAt { get; set; }
|
|
public DateTime? DecidedAt { get; set; }
|
|
public string? DecisionNote { get; set; }
|
|
public bool CanDecide { get; set; }
|
|
// SH-101 additions
|
|
public int? EvidenceDocumentId { get; set; }
|
|
public string? EvidenceFileName { get; set; }
|
|
public string? EvidenceContentType { get; set; }
|
|
public long? EvidenceSizeBytes { get; set; }
|
|
public DateTime? ExpiresAt { get; set; }
|
|
public string? NotificationStatus { get; set; }
|
|
public string? NotificationError { get; set; }
|
|
public int AttachmentCount { get; set; }
|
|
public bool WorkOrderClosed { get; set; }
|
|
// Approved-on-WO exposure totals for this item's work order: auto-approved and
|
|
// admin-approved amounts; pending, rejected, cancelled/withdrawn, and revoked
|
|
// requests are excluded.
|
|
public decimal WorkOrderAutoApprovedTotal { get; set; }
|
|
public decimal WorkOrderAdminApprovedTotal { get; set; }
|
|
public decimal WorkOrderApprovedExposureTotal { get; set; }
|
|
}
|
|
|
|
public class UpliftListResultDTO
|
|
{
|
|
public int Total { get; set; }
|
|
public int Page { get; set; }
|
|
public int PageSize { get; set; }
|
|
public decimal PendingExposureTotal { get; set; }
|
|
public IEnumerable<UpliftListItemDTO> Items { get; set; } = Enumerable.Empty<UpliftListItemDTO>();
|
|
}
|
|
|
|
public class UpliftForDispatchDTO
|
|
{
|
|
public int Id { get; set; }
|
|
public int DispatchId { get; set; }
|
|
public decimal? CurrentNTE { get; set; }
|
|
public decimal RequestedNTE { get; set; }
|
|
public decimal Delta { get; set; }
|
|
public string? VendorReason { get; set; }
|
|
public string? Status { get; set; }
|
|
public int RequiredTier { get; set; }
|
|
public string? RequestedByVendorName { get; set; }
|
|
public DateTime? RequestedAt { get; set; }
|
|
public DateTime? DecidedAt { get; set; }
|
|
public string? DecisionNote { get; set; }
|
|
public string? DecidedByName { get; set; }
|
|
public bool CanDecide { get; set; }
|
|
// SH-101 additions
|
|
public int? EvidenceDocumentId { get; set; }
|
|
public string? EvidenceFileName { get; set; }
|
|
public string? EvidenceContentType { get; set; }
|
|
public long? EvidenceSizeBytes { get; set; }
|
|
public bool EvidenceScanPassed { get; set; }
|
|
public DateTime? ExpiresAt { get; set; }
|
|
public string? NotificationStatus { get; set; }
|
|
public string? NotificationError { get; set; }
|
|
}
|
|
|
|
public class UpliftApproveResultDTO
|
|
{
|
|
public int Id { get; set; }
|
|
public string? Status { get; set; }
|
|
public decimal? NTEAmount { get; set; }
|
|
}
|
|
|
|
public class UpliftDecisionResultDTO
|
|
{
|
|
public int Id { get; set; }
|
|
public string? Status { get; set; }
|
|
}
|
|
|
|
// SH-101: deny alias retained for route compatibility; canonical result is Rejected.
|
|
public class UpliftDenyResultDTO
|
|
{
|
|
public int Id { get; set; }
|
|
public string? Status { get; set; }
|
|
}
|
|
|
|
public class UpliftForbiddenException : Exception
|
|
{
|
|
public UpliftForbiddenException(string message) : base(message) { }
|
|
}
|
|
|
|
// SH-101: internal (authorized) download of a Passed UpliftEvidence file linked to a
|
|
// specific uplift request. Outcome-driven so the controller returns 404/423 without
|
|
// exception disclosure. Completion documents are never exposed through this path.
|
|
public sealed class UpliftEvidenceDownloadResultDTO
|
|
{
|
|
public VendorDocumentDownloadOutcome Outcome { get; set; }
|
|
public Stream? Content { get; set; }
|
|
public string? ContentType { get; set; }
|
|
public string? FileName { get; set; }
|
|
|
|
public static UpliftEvidenceDownloadResultDTO Ok(Stream content, string contentType, string fileName) => new()
|
|
{
|
|
Outcome = VendorDocumentDownloadOutcome.Ok,
|
|
Content = content,
|
|
ContentType = contentType,
|
|
FileName = fileName
|
|
};
|
|
|
|
public static UpliftEvidenceDownloadResultDTO Locked() => new() { Outcome = VendorDocumentDownloadOutcome.Locked };
|
|
public static UpliftEvidenceDownloadResultDTO NotFound() => new() { Outcome = VendorDocumentDownloadOutcome.NotFound };
|
|
}
|
|
}
|