using Distribution.Models; using Microsoft.EntityFrameworkCore; namespace Distribution.Data; public class AppDBContext(DbContextOptions options) : DbContext(options) { public DbSet Regions { get; set; } public DbSet Routes { get; set; } public DbSet Vehicles { get; set; } public DbSet Stores { get; set; } public DbSet Warehouses { get; set; } public DbSet Categories { get; set; } public DbSet SubCategories { get; set; } public DbSet Brands { get; set; } public DbSet Uoms { get; set; } public DbSet UomConversions { get; set; } public DbSet Items { get; set; } public DbSet SaleRoutes { get; set; } public DbSet ShopPOs { get; set; } public DbSet ShopPOItems { get; set; } public DbSet Invoices { get; set; } public DbSet LoadingSheetOrders { get; set; } public DbSet DeliveryRuns { get; set; } public DbSet Users { get; set; } public DbSet Roles { get; set; } public DbSet Permissions { get; set; } public DbSet RolePermissions { get; set; } public DbSet UserRegionScopes { get; set; } public DbSet UserRouteScopes { get; set; } public DbSet UserStoreScopes { get; set; } public DbSet StockBalances { get; set; } public DbSet StockMovements { get; set; } public DbSet StoreKycDocuments { get; set; } public DbSet PriceLists { get; set; } public DbSet PriceListItems { get; set; } public DbSet Suppliers { get; set; } public DbSet DriverProfiles { get; set; } public DbSet DriverComplianceConfigs { get; set; } public DbSet Schemes { get; set; } public DbSet SchemeRedemptions { get; set; } public DbSet SchemeBundleComponents { get; set; } public DbSet LoadingSheets { get; set; } public DbSet LoadingSheetItems { get; set; } public DbSet Payments { get; set; } public DbSet DeliveryTasks { get; set; } public DbSet PurchaseOrders { get; set; } public DbSet PurchaseOrderItems { get; set; } public DbSet GoodsReceipts { get; set; } public DbSet GoodsReceiptItems { get; set; } public DbSet PurchaseReturns { get; set; } public DbSet PurchaseReturnItems { get; set; } public DbSet SaleReturns { get; set; } public DbSet SaleReturnItems { get; set; } public DbSet CreditNotes { get; set; } public DbSet Claims { get; set; } public DbSet SupplierClaims { get; set; } public DbSet SupplierClaimItems { get; set; } public DbSet RegionalTargets { get; set; } public DbSet RegionalBudgets { get; set; } public DbSet RegionAgencyMaps { get; set; } public DbSet RegionalTaxRules { get; set; } public DbSet RouteVisitLogs { get; set; } public DbSet SysConfigs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // --- Composite PKs --- modelBuilder.Entity() .HasKey(rp => new { rp.FK_RoleId, rp.FK_PermissionId }); modelBuilder.Entity() .HasKey(s => new { s.FK_UserId, s.FK_RegionId }); modelBuilder.Entity() .HasKey(s => new { s.FK_UserId, s.FK_RouteId }); modelBuilder.Entity() .HasKey(s => new { s.FK_UserId, s.FK_StoreId }); modelBuilder.Entity() .HasKey(lo => new { lo.FK_LoadingSheetId, lo.FK_ShopPOId }); // --- Unique indexes --- modelBuilder.Entity() .HasIndex(sb => new { sb.FK_ItemId, sb.LocationId }) .IsUnique(); modelBuilder.Entity() .HasIndex(pli => new { pli.FK_PriceListId, pli.FK_ItemId }) .IsUnique(); modelBuilder.Entity() .HasIndex(dp => dp.FK_UserId) .IsUnique(); // --- User --- modelBuilder.Entity() .HasOne(u => u.ReportsTo) .WithMany() .HasForeignKey(u => u.FK_ReportsToUserId) .OnDelete(DeleteBehavior.Restrict); // --- Vehicle --- modelBuilder.Entity() .HasOne() .WithMany() .HasForeignKey(nameof(Vehicle.DefaultWarehouseId)) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); // --- DeliveryRun --- modelBuilder.Entity() .HasOne(r => r.DriverProfile) .WithMany() .HasForeignKey(r => r.FK_DriverProfileId) .OnDelete(DeleteBehavior.Restrict); // --- ShopPO --- modelBuilder.Entity() .HasOne(p => p.Store) .WithMany() .HasForeignKey(p => p.FK_StoreId) .OnDelete(DeleteBehavior.Restrict); // InvoiceId is a plain column — no FK constraint modelBuilder.Entity() .Property(p => p.InvoiceId) .HasColumnName("InvoiceId"); // --- ShopPOItem --- modelBuilder.Entity() .HasOne(i => i.ShopPO) .WithMany(p => p.Items) .HasForeignKey(i => i.FK_ShopPOId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Item) .WithMany() .HasForeignKey(i => i.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); // --- Invoice --- modelBuilder.Entity() .HasOne(i => i.ShopPO) .WithMany() .HasForeignKey(i => i.FK_ShopPOId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasMany(i => i.Payments) .WithOne(p => p.Invoice) .HasForeignKey(p => p.FK_InvoiceId) .OnDelete(DeleteBehavior.Restrict); // --- LoadingSheet --- modelBuilder.Entity() .HasOne(s => s.Ride) .WithMany() .HasForeignKey(s => s.FK_RideId) .OnDelete(DeleteBehavior.Restrict); // --- LoadingSheetOrder --- modelBuilder.Entity() .HasOne(lo => lo.LoadingSheet) .WithMany(s => s.Orders) .HasForeignKey(lo => lo.FK_LoadingSheetId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(lo => lo.ShopPO) .WithMany() .HasForeignKey(lo => lo.FK_ShopPOId) .OnDelete(DeleteBehavior.Restrict); // --- LoadingSheetItem --- modelBuilder.Entity() .HasOne(i => i.LoadingSheet) .WithMany(s => s.Items) .HasForeignKey(i => i.FK_LoadingSheetId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Item) .WithMany() .HasForeignKey(i => i.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Warehouse) .WithMany() .HasForeignKey(i => i.FK_WarehouseId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.ShopPOItem) .WithMany() .HasForeignKey(i => i.FK_ShopPOItemId) .OnDelete(DeleteBehavior.SetNull) .IsRequired(false); // --- SchemeRedemption --- modelBuilder.Entity() .HasOne(r => r.Scheme) .WithMany(s => s.Redemptions) .HasForeignKey(r => r.FK_SchemeId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(r => r.ShopPO) .WithMany() .HasForeignKey(r => r.FK_ShopPOId) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); modelBuilder.Entity() .HasOne(r => r.FreeItem) .WithMany() .HasForeignKey(r => r.FK_FreeItemId) .OnDelete(DeleteBehavior.Restrict); // --- Scheme --- modelBuilder.Entity() .HasOne(s => s.TriggerItem) .WithMany() .HasForeignKey(s => s.FK_TriggerItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(s => s.FreeItem) .WithMany() .HasForeignKey(s => s.FK_FreeItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(c => c.Scheme) .WithMany(s => s.BundleComponents) .HasForeignKey(c => c.FK_SchemeId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(c => c.Item) .WithMany() .HasForeignKey(c => c.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasIndex(c => new { c.FK_SchemeId, c.FK_ItemId }) .IsUnique(); // --- PurchaseOrder --- modelBuilder.Entity() .HasOne(po => po.Supplier) .WithMany() .HasForeignKey(po => po.FK_SupplierId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.PurchaseOrder) .WithMany(po => po.Items) .HasForeignKey(i => i.FK_PurchaseOrderId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Item) .WithMany() .HasForeignKey(i => i.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasIndex(i => i.FK_PurchaseOrderId); // --- GoodsReceipt --- modelBuilder.Entity() .HasOne(gr => gr.PurchaseOrder) .WithMany() .HasForeignKey(gr => gr.FK_PurchaseOrderId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(gr => gr.Warehouse) .WithMany() .HasForeignKey(gr => gr.FK_WarehouseId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.GoodsReceipt) .WithMany(gr => gr.Items) .HasForeignKey(i => i.FK_GoodsReceiptId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.PurchaseOrderItem) .WithMany() .HasForeignKey(i => i.FK_PurchaseOrderItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasIndex(i => i.FK_GoodsReceiptId); modelBuilder.Entity() .HasIndex(i => i.FK_PurchaseOrderItemId); // --- PurchaseReturn --- modelBuilder.Entity() .HasOne(pr => pr.PurchaseOrder) .WithMany() .HasForeignKey(pr => pr.FK_PurchaseOrderId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.PurchaseReturn) .WithMany(pr => pr.Items) .HasForeignKey(i => i.FK_PurchaseReturnId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Item) .WithMany() .HasForeignKey(i => i.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasIndex(i => i.FK_PurchaseReturnId); // --- SaleReturn --- modelBuilder.Entity() .HasOne(r => r.ShopPO) .WithMany() .HasForeignKey(r => r.FK_ShopPOId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(r => r.CreatedByUser) .WithMany() .HasForeignKey(r => r.CreatedByUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.SaleReturn) .WithMany(r => r.Items) .HasForeignKey(i => i.FK_SaleReturnId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Item) .WithMany() .HasForeignKey(i => i.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasIndex(i => i.FK_SaleReturnId); // --- CreditNote --- modelBuilder.Entity() .HasOne(n => n.SaleReturn) .WithMany() .HasForeignKey(n => n.FK_SaleReturnId) .OnDelete(DeleteBehavior.Restrict); // --- Claims --- modelBuilder.Entity() .HasOne(c => c.AgencyUser) .WithMany() .HasForeignKey(c => c.FK_AgencyUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(c => c.SettledByUser) .WithMany() .HasForeignKey(c => c.SettledByUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(c => c.PurchaseOrder) .WithMany() .HasForeignKey(c => c.FK_PurchaseOrderId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(c => c.GoodsReceipt) .WithMany() .HasForeignKey(c => c.FK_GoodsReceiptId) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); modelBuilder.Entity() .HasOne(c => c.RaisedByUser) .WithMany() .HasForeignKey(c => c.RaisedByUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(c => c.ResolvedByUser) .WithMany() .HasForeignKey(c => c.ResolvedByUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.SupplierClaim) .WithMany(c => c.Items) .HasForeignKey(i => i.FK_SupplierClaimId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Item) .WithMany() .HasForeignKey(i => i.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasIndex(i => i.FK_SupplierClaimId); // --- DeliveryTask --- modelBuilder.Entity() .HasOne(t => t.Ride) .WithMany() .HasForeignKey(t => t.FK_RideId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(t => t.ShopPO) .WithMany() .HasForeignKey(t => t.FK_ShopPOId) .OnDelete(DeleteBehavior.Restrict); // --- Regional --- modelBuilder.Entity() .HasIndex(t => new { t.FK_RegionId, t.Period }) .IsUnique(); modelBuilder.Entity() .HasIndex(b => new { b.FK_RegionId, b.Period }) .IsUnique(); modelBuilder.Entity() .HasIndex(m => new { m.FK_RegionId, m.FK_AgencyUserId }) .IsUnique(); modelBuilder.Entity() .HasOne(m => m.AgencyUser) .WithMany() .HasForeignKey(m => m.FK_AgencyUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasIndex(r => r.FK_RegionId) .IsUnique(); // --- SysConfig --- modelBuilder.Entity() .HasKey(c => c.Key); modelBuilder.Entity() .Property(c => c.Key) .HasMaxLength(100); modelBuilder.Entity().HasData( new SysConfig { Key = "InvoiceCreationMode", Value = "ModeB", UpdatedAt = new DateTime(2026, 9, 17), UpdatedBy = null } ); Seed.RoleAndPermissionSeed.Apply(modelBuilder); Seed.MasterDataSeed.Apply(modelBuilder); Seed.OperationsDataSeed.Apply(modelBuilder); Seed.ProcurementSeed.Apply(modelBuilder); Seed.CommerceSeed.Apply(modelBuilder); Seed.OperationsExtrasSeed.Apply(modelBuilder); } }