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, // Cost per base-UOM unit. Null on a PO line falls back to the PO line's unit cost; null on a direct line is 0. decimal? UnitCost = null, // Null falls back to the GRN-wide percentage. decimal? DiscountPercent = null, decimal? VatPercent = null, // Free-issue units: stocked but not costed. Serial/batch entries must cover accepted + free. int FreeQuantity = 0, // Ignored when NBT is disabled in configuration; null falls back to the GRN-wide percentage. decimal? NbtPercent = 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, // GRN-wide defaults for lines that don't set their own. decimal? DiscountPercent = null, decimal? VatPercent = null, decimal? NbtPercent = 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, decimal? DiscountPercent = null, decimal? VatPercent = null, decimal? NbtPercent = 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, decimal? DiscountPercent = null, decimal? VatPercent = null, decimal? NbtPercent = 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, decimal UnitCost, decimal DiscountPercent, decimal VatPercent, // Accepted qty x unit cost, before discount. decimal GrossAmount, decimal DiscountAmount, decimal VatAmount, // Gross - discount + VAT. decimal LineTotal, int FreeQuantity, decimal NbtPercent, decimal NbtAmount); public record GrnResponse( Guid Id, Guid? PurchaseOrderId, Guid ReceivedByUserId, Guid WarehouseId, string WarehouseName, Guid? SupplierId, string? SupplierName, DateTime ReceivedAt, DateTime CreatedAt, List Items, decimal DiscountPercent, decimal VatPercent, // Sum of line gross amounts. decimal SubTotal, decimal DiscountAmount, // SubTotal - DiscountAmount (the base NBT is charged on; VAT is charged on this plus NBT). decimal TaxableAmount, decimal VatAmount, decimal TotalAmount, decimal NbtPercent, decimal NbtAmount);