using Distribution.Models; namespace Distribution.Features.Po; public record PoItemRequest(Guid ItemId, int Quantity, decimal UnitCost); public record CreatePoRequest(Guid SupplierId, List Items); /// /// Update line: PurchaseOrderItemId set = update an existing unreceived line (Quantity/UnitCost), /// null = add a new line to the Po. Only valid while the Po is Issued. /// public record UpdatePoLineRequest(Guid? PurchaseOrderItemId, Guid ItemId, int Quantity, decimal UnitCost); public record UpdatePoRequest(List Items); public record CancelPoRequest(string Reason); public record CancelPoLineRequest(string? Reason); public record PoItemResponse( Guid Id, Guid ItemId, string Sku, string ItemName, int Quantity, decimal UnitCost, int ReceivedQuantity, int CancelledQuantity, bool IsCancelled); public record PoResponse( Guid Id, Guid SupplierId, string SupplierName, Guid CreatedByUserId, PurchaseOrderStatus Status, string? CancelReason, bool IsActive, DateTime CreatedAt, List Items); /// /// Minimal Po-vs-Grn quantity/cost reconciliation. Full 3-way match (Po + Grn + Invoice) activates /// once Finance's Invoice entity (step 19, not yet built) exists — until then this compares only /// PurchaseOrderItem vs GoodsReceiptItem. /// public record InvoiceMatchLineResult(Guid PurchaseOrderItemId, Guid ItemId, int OrderedQuantity, int AcceptedQuantity, decimal UnitCost, bool QuantityMatches); public record InvoiceMatchResult(Guid PurchaseOrderId, Guid? GoodsReceiptId, Guid? InvoiceId, bool IsMatched, List Lines, string Note); public record ResolveInvoiceVarianceRequest(string Variance, string Resolution, decimal? AdjustedUnitCost, Guid? PurchaseOrderItemId); public record InvoiceVarianceResolutionResponse(Guid PurchaseOrderId, string Variance, string Resolution, DateTime ResolvedAt);