using System.ComponentModel.DataAnnotations; using LittleShop.Enums; namespace LittleShop.DTOs; public class OrderDto { public Guid Id { get; set; } public Guid? CustomerId { get; set; } public string? IdentityReference { get; set; } public OrderStatus Status { get; set; } // Customer Information (embedded for convenience) public CustomerSummaryDto? Customer { get; set; } public decimal TotalAmount { get; set; } public string Currency { get; set; } = "GBP"; public string ShippingName { get; set; } = string.Empty; public string ShippingAddress { get; set; } = string.Empty; public string ShippingCity { get; set; } = string.Empty; public string ShippingPostCode { get; set; } = string.Empty; public string ShippingCountry { get; set; } = string.Empty; public string? Notes { get; set; } public string? TrackingNumber { get; set; } public DateTime CreatedAt { get; set; } public DateTime UpdatedAt { get; set; } public DateTime? PaidAt { get; set; } // Workflow timestamps public DateTime? AcceptedAt { get; set; } public DateTime? PackingStartedAt { get; set; } public DateTime? DispatchedAt { get; set; } public DateTime? ExpectedDeliveryDate { get; set; } public DateTime? ActualDeliveryDate { get; set; } public DateTime? OnHoldAt { get; set; } // Workflow details public string? AcceptedByUser { get; set; } public string? PackedByUser { get; set; } public string? DispatchedByUser { get; set; } public string? OnHoldReason { get; set; } // Legacy field (for backward compatibility) public DateTime? ShippedAt { get; set; } public List Items { get; set; } = new(); public List Payments { get; set; } = new(); } public class OrderItemDto { public Guid Id { get; set; } public Guid ProductId { get; set; } public Guid? ProductMultiBuyId { get; set; } public string ProductName { get; set; } = string.Empty; public string? ProductMultiBuyName { get; set; } public string? SelectedVariant { get; set; } public int Quantity { get; set; } public decimal UnitPrice { get; set; } public decimal TotalPrice { get; set; } } public class CreateOrderDto { // Either Customer ID (for registered customers) OR Identity Reference (for anonymous) public Guid? CustomerId { get; set; } public string? IdentityReference { get; set; } // Customer Information (collected at checkout for anonymous orders) public CreateCustomerDto? CustomerInfo { get; set; } [Required] public string ShippingName { get; set; } = string.Empty; [Required] public string ShippingAddress { get; set; } = string.Empty; [Required] public string ShippingCity { get; set; } = string.Empty; [Required] public string ShippingPostCode { get; set; } = string.Empty; [Required] public string ShippingCountry { get; set; } = "United Kingdom"; [Required] public List Items { get; set; } = new(); public string? Notes { get; set; } } public class CreateOrderItemDto { [Required] public Guid ProductId { get; set; } public Guid? ProductMultiBuyId { get; set; } // Optional: if specified, use multi-buy pricing public string? SelectedVariant { get; set; } // Optional: variant choice (color/flavor) [Range(1, int.MaxValue)] public int Quantity { get; set; } } public class UpdateOrderStatusDto { public OrderStatus Status { get; set; } public string? TrackingNumber { get; set; } public string? Notes { get; set; } } // New workflow DTOs public class AcceptOrderDto { public string? Notes { get; set; } } public class StartPackingDto { public string? Notes { get; set; } } public class DispatchOrderDto { [Required] [StringLength(100)] public string TrackingNumber { get; set; } = string.Empty; public int EstimatedDeliveryDays { get; set; } = 3; // Default 3 working days public string? Notes { get; set; } } public class PutOnHoldDto { [Required] [StringLength(500)] public string Reason { get; set; } = string.Empty; public string? Notes { get; set; } } public class MarkDeliveredDto { public DateTime? ActualDeliveryDate { get; set; } public string? Notes { get; set; } }