namespace Domain.Dtos.Stock
{
///
/// Ítem de expedición para lectura en UI e impresión (detalle ya resuelto).
/// Contiene la información mínima y suficiente para mostrar/emitir la nota de entrega.
///
public sealed class ExpeditionItemDto
{
///
/// Identificador interno del renglón (detalle) de la expedición.
/// Útil para acciones sobre el ítem (eliminar, editar cantidad, etc.).
///
public int Id { get; set; }
///
/// Identificador del producto en el catálogo maestro (FK a PhLSM_Product.Id).
/// No es necesariamente visible en impresión; se usa para joins y trazabilidad.
///
public int ProductId { get; set; }
///
/// Código de producto definido por la fábrica o fabricante.
/// Puede variar según proveedor, presentación o país de origen.
/// Recomendado como código “principal” a mostrar en la nota.
///
public string FactoryCode { get; set; } = string.Empty;
///
/// Nombre del producto tal como figura en el catálogo (técnico o comercial).
/// Se utiliza para la descripción en la tabla de ítems de la impresión.
///
public string ProductName { get; set; } = string.Empty;
///
/// Cantidad a expedir para este ítem.
/// Para productos con trazabilidad por unidad/serial, suele ser 1 por línea.
/// Para productos por lote (batch), puede ser una cantidad agregada.
///
public decimal Quantity { get; set; }
///
/// Lote del producto (GS1 AI 10).
/// Aplica a productos con trazabilidad por lote; puede ser null si no corresponde.
///
public string? Batch { get; set; }
///
/// Serial/Número de serie del producto (GS1 AI 21).
/// Aplica a productos con trazabilidad por unidad; puede ser null si no corresponde.
///
public string? Serial { get; set; }
///
/// Fecha de vencimiento (GS1 AI 17) en precisión de día.
/// Es null cuando el tipo de trazabilidad no requiere fecha.
///
public DateOnly? Expiration { get; set; }
///
/// Identificador de la ubicación/depósito desde donde se despacha (FK a StockLocation).
/// Puede ser null si no aplica o no se registró en el momento de la expedición.
///
public int? LocationId { get; set; }
///
/// Nombre legible de la ubicación/depósito (resuelto por join).
/// Se usa para impresión y visualización sin pedir más datos al front.
///
public string? LocationName { get; set; }
}
}