Add GRN batch and serial tracking

This commit is contained in:
2026-10-06 13:26:17 +05:30
parent d578cbad20
commit a8725bc473
9 changed files with 427 additions and 49 deletions
+8 -2
View File
@@ -4,9 +4,15 @@ namespace Distribution.Models
{
public class GoodsReceipt : Template
{
public Guid FK_PurchaseOrderId { get; set; }
/// <summary>Null for a direct receipt (goods received without a purchase order).</summary>
public Guid? FK_PurchaseOrderId { get; set; }
[ForeignKey("FK_PurchaseOrderId")]
public PurchaseOrder PurchaseOrder { get; set; }
public PurchaseOrder? PurchaseOrder { get; set; }
/// <summary>Optional supplier for a direct receipt; for PO receipts the supplier comes from the PO.</summary>
public Guid? FK_SupplierId { get; set; }
[ForeignKey("FK_SupplierId")]
public Supplier? Supplier { get; set; }
public Guid FK_ReceivedByUserId { get; set; }
+14 -2
View File
@@ -8,14 +8,26 @@ namespace Distribution.Models
[ForeignKey("FK_GoodsReceiptId")]
public GoodsReceipt GoodsReceipt { get; set; }
public Guid FK_PurchaseOrderItemId { get; set; }
/// <summary>Null for a direct receipt line (no purchase order); FK_ItemId is set instead.</summary>
public Guid? FK_PurchaseOrderItemId { get; set; }
[ForeignKey("FK_PurchaseOrderItemId")]
public PurchaseOrderItem PurchaseOrderItem { get; set; }
public PurchaseOrderItem? PurchaseOrderItem { get; set; }
/// <summary>Set for direct receipt lines. PO-based lines resolve the item through PurchaseOrderItem.</summary>
public Guid? FK_ItemId { get; set; }
[ForeignKey("FK_ItemId")]
public Item? Item { get; set; }
/// <summary>Added to warehouse stock.</summary>
public int AcceptedQuantity { get; set; }
/// <summary>Damaged/short at receipt, not added to stock.</summary>
public int RejectedQuantity { get; set; } = 0;
/// <summary>Populated when the received item tracks batches and/or expiry dates.</summary>
public ICollection<GoodsReceiptItemBatch> Batches { get; set; } = [];
/// <summary>Populated when the received item tracks serial numbers.</summary>
public ICollection<GoodsReceiptItemSerial> Serials { get; set; } = [];
}
}
@@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
/// <summary>One row per batch/expiry-lot split within a single GRN line.</summary>
public class GoodsReceiptItemBatch : Template
{
public Guid FK_GoodsReceiptItemId { get; set; }
[ForeignKey("FK_GoodsReceiptItemId")]
public GoodsReceiptItem GoodsReceiptItem { get; set; }
public Guid FK_ItemBatchId { get; set; }
[ForeignKey("FK_ItemBatchId")]
public ItemBatch ItemBatch { get; set; }
public int Quantity { get; set; }
}
}
@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
/// <summary>One row per serial number received within a single GRN line.</summary>
public class GoodsReceiptItemSerial : Template
{
public Guid FK_GoodsReceiptItemId { get; set; }
[ForeignKey("FK_GoodsReceiptItemId")]
public GoodsReceiptItem GoodsReceiptItem { get; set; }
public Guid FK_ItemSerialNumberId { get; set; }
[ForeignKey("FK_ItemSerialNumberId")]
public ItemSerialNumber ItemSerialNumber { get; set; }
}
}