namespace Distribution.Features.Grn; /// BatchNumber is null for an expiry-only lot (TracksExpiryDate without TracksBatches). public record GrnBatchLineRequest(string? BatchNumber, DateTime? ExpiryDate, int Quantity); public record GrnItemRequest( // Set for a PO-based receipt; null for a direct receipt (ItemId is used instead). Guid? PurchaseOrderItemId, int AcceptedQuantity, int RejectedQuantity, // Populated only when the item has TracksBatches and/or TracksExpiryDate set. List? Batches = null, // Populated only when the item has TracksSerialNumbers set — must contain exactly AcceptedQuantity entries. List? SerialNumbers = null, // Set for a direct receipt line (no purchase order). Guid? ItemId = null); public record CreateGrnRequest( Guid WarehouseId, List Items, // TEMPORARY: required while auth doesn't resolve a logged-in user server-side — see testbug.md #28. Guid? ReceivedByUserId = null); public record CreateFlatGrnRequest( Guid PurchaseOrderId, Guid WarehouseId, List Items, // TEMPORARY: required while auth doesn't resolve a logged-in user server-side — see testbug.md #28. Guid? ReceivedByUserId = null); /// A goods receipt with no purchase order. SupplierId is optional. public record CreateDirectGrnRequest( Guid WarehouseId, List Items, Guid? SupplierId = null, // TEMPORARY: required while auth doesn't resolve a logged-in user server-side — see testbug.md #28. Guid? ReceivedByUserId = null); public record GrnBatchLineResponse(string? BatchNumber, DateTime? ExpiryDate, int Quantity); public record GrnItemResponse( Guid Id, Guid? PurchaseOrderItemId, Guid ItemId, string Sku, string ItemName, int AcceptedQuantity, int RejectedQuantity, List Batches, List SerialNumbers); public record GrnResponse( Guid Id, Guid? PurchaseOrderId, Guid ReceivedByUserId, Guid WarehouseId, string WarehouseName, Guid? SupplierId, string? SupplierName, DateTime ReceivedAt, DateTime CreatedAt, List Items);