Add item tracking and warranty settings
This commit is contained in:
@@ -16,6 +16,8 @@ public class AppDBContext(DbContextOptions<AppDBContext> options) : DbContext(op
|
||||
public DbSet<Uom> Uoms { get; set; }
|
||||
public DbSet<UomConversion> UomConversions { get; set; }
|
||||
public DbSet<Item> Items { get; set; }
|
||||
public DbSet<ItemBatch> ItemBatches { get; set; }
|
||||
public DbSet<ItemSerialNumber> ItemSerialNumbers { get; set; }
|
||||
public DbSet<SaleRoute> SaleRoutes { get; set; }
|
||||
public DbSet<ShopPO> ShopPOs { get; set; }
|
||||
public DbSet<ShopPOItem> ShopPOItems { get; set; }
|
||||
@@ -47,6 +49,8 @@ public class AppDBContext(DbContextOptions<AppDBContext> options) : DbContext(op
|
||||
public DbSet<PurchaseOrderItem> PurchaseOrderItems { get; set; }
|
||||
public DbSet<GoodsReceipt> GoodsReceipts { get; set; }
|
||||
public DbSet<GoodsReceiptItem> GoodsReceiptItems { get; set; }
|
||||
public DbSet<GoodsReceiptItemBatch> GoodsReceiptItemBatches { get; set; }
|
||||
public DbSet<GoodsReceiptItemSerial> GoodsReceiptItemSerials { get; set; }
|
||||
public DbSet<PurchaseReturn> PurchaseReturns { get; set; }
|
||||
public DbSet<PurchaseReturnItem> PurchaseReturnItems { get; set; }
|
||||
public DbSet<SaleReturn> SaleReturns { get; set; }
|
||||
@@ -83,8 +87,15 @@ public class AppDBContext(DbContextOptions<AppDBContext> options) : DbContext(op
|
||||
|
||||
// --- Unique indexes ---
|
||||
|
||||
// NOTE: MySQL treats each NULL as distinct in a unique index, so this does not by itself
|
||||
// prevent duplicate rows for untracked items (both FK columns null) — StockRepository's
|
||||
// get-then-update pattern is what keeps those to one row per (Item, Location), same as before.
|
||||
modelBuilder.Entity<StockBalance>()
|
||||
.HasIndex(sb => new { sb.FK_ItemId, sb.LocationId })
|
||||
.HasIndex(sb => new { sb.FK_ItemId, sb.LocationId, sb.FK_ItemBatchId, sb.FK_ItemSerialNumberId })
|
||||
.IsUnique();
|
||||
|
||||
modelBuilder.Entity<ItemSerialNumber>()
|
||||
.HasIndex(s => new { s.FK_ItemId, s.SerialNumber })
|
||||
.IsUnique();
|
||||
|
||||
modelBuilder.Entity<PriceListItem>()
|
||||
@@ -316,6 +327,79 @@ public class AppDBContext(DbContextOptions<AppDBContext> options) : DbContext(op
|
||||
modelBuilder.Entity<GoodsReceiptItem>()
|
||||
.HasIndex(i => i.FK_PurchaseOrderItemId);
|
||||
|
||||
// --- ItemBatch / ItemSerialNumber ---
|
||||
|
||||
modelBuilder.Entity<ItemBatch>()
|
||||
.HasOne(b => b.Item)
|
||||
.WithMany()
|
||||
.HasForeignKey(b => b.FK_ItemId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
|
||||
modelBuilder.Entity<ItemBatch>()
|
||||
.HasIndex(b => new { b.FK_ItemId, b.BatchNumber });
|
||||
|
||||
modelBuilder.Entity<ItemSerialNumber>()
|
||||
.HasOne(s => s.Item)
|
||||
.WithMany()
|
||||
.HasForeignKey(s => s.FK_ItemId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
|
||||
// --- StockBalance / StockMovement batch & serial links ---
|
||||
|
||||
modelBuilder.Entity<StockBalance>()
|
||||
.HasOne(sb => sb.ItemBatch)
|
||||
.WithMany()
|
||||
.HasForeignKey(sb => sb.FK_ItemBatchId)
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired(false);
|
||||
|
||||
modelBuilder.Entity<StockBalance>()
|
||||
.HasOne(sb => sb.ItemSerialNumber)
|
||||
.WithMany()
|
||||
.HasForeignKey(sb => sb.FK_ItemSerialNumberId)
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired(false);
|
||||
|
||||
modelBuilder.Entity<StockMovement>()
|
||||
.HasOne(sm => sm.ItemBatch)
|
||||
.WithMany()
|
||||
.HasForeignKey(sm => sm.FK_ItemBatchId)
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired(false);
|
||||
|
||||
modelBuilder.Entity<StockMovement>()
|
||||
.HasOne(sm => sm.ItemSerialNumber)
|
||||
.WithMany()
|
||||
.HasForeignKey(sm => sm.FK_ItemSerialNumberId)
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired(false);
|
||||
|
||||
// --- GoodsReceiptItemBatch / GoodsReceiptItemSerial ---
|
||||
|
||||
modelBuilder.Entity<GoodsReceiptItemBatch>()
|
||||
.HasOne(b => b.GoodsReceiptItem)
|
||||
.WithMany(i => i.Batches)
|
||||
.HasForeignKey(b => b.FK_GoodsReceiptItemId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
|
||||
modelBuilder.Entity<GoodsReceiptItemBatch>()
|
||||
.HasOne(b => b.ItemBatch)
|
||||
.WithMany()
|
||||
.HasForeignKey(b => b.FK_ItemBatchId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
|
||||
modelBuilder.Entity<GoodsReceiptItemSerial>()
|
||||
.HasOne(s => s.GoodsReceiptItem)
|
||||
.WithMany(i => i.Serials)
|
||||
.HasForeignKey(s => s.FK_GoodsReceiptItemId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
|
||||
modelBuilder.Entity<GoodsReceiptItemSerial>()
|
||||
.HasOne(s => s.ItemSerialNumber)
|
||||
.WithMany()
|
||||
.HasForeignKey(s => s.FK_ItemSerialNumberId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
|
||||
// --- PurchaseReturn ---
|
||||
|
||||
modelBuilder.Entity<PurchaseReturn>()
|
||||
@@ -478,7 +562,13 @@ public class AppDBContext(DbContextOptions<AppDBContext> options) : DbContext(op
|
||||
.HasMaxLength(100);
|
||||
|
||||
modelBuilder.Entity<SysConfig>().HasData(
|
||||
new SysConfig { Key = "InvoiceCreationMode", Value = "ModeB", UpdatedAt = new DateTime(2026, 9, 17), UpdatedBy = null }
|
||||
new SysConfig { Key = "InvoiceCreationMode", Value = "ModeB", UpdatedAt = new DateTime(2026, 9, 17), UpdatedBy = null },
|
||||
new SysConfig { Key = Distribution.Features.SysConfig.SysConfigService.KeySerialNumberTrackingEnabled, Value = "false", UpdatedAt = new DateTime(2026, 10, 1), UpdatedBy = null },
|
||||
new SysConfig { Key = Distribution.Features.SysConfig.SysConfigService.KeyBatchTrackingEnabled, Value = "false", UpdatedAt = new DateTime(2026, 10, 1), UpdatedBy = null },
|
||||
new SysConfig { Key = Distribution.Features.SysConfig.SysConfigService.KeyExpiryDateTrackingEnabled, Value = "false", UpdatedAt = new DateTime(2026, 10, 1), UpdatedBy = null },
|
||||
new SysConfig { Key = Distribution.Features.SysConfig.SysConfigService.KeyWarrantyTrackingEnabled, Value = "false", UpdatedAt = new DateTime(2026, 10, 1), UpdatedBy = null },
|
||||
new SysConfig { Key = Distribution.Features.SysConfig.SysConfigService.KeyCustomWarrantyOverrideEnabled, Value = "false", UpdatedAt = new DateTime(2026, 10, 1), UpdatedBy = null },
|
||||
new SysConfig { Key = Distribution.Features.SysConfig.SysConfigService.KeyDefaultWarrantyPeriodDays, Value = "0", UpdatedAt = new DateTime(2026, 10, 1), UpdatedBy = null }
|
||||
);
|
||||
|
||||
Seed.RoleAndPermissionSeed.Apply(modelBuilder);
|
||||
|
||||
Reference in New Issue
Block a user