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 Sales { get; set; } public DbSet Orders { get; set; } public DbSet OrderItems { get; set; } public DbSet Invoices { 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 RideCancelRequests { 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; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // OrderItem uses its inherited Template.Id as PK (no composite key on // {FK_OrderId, FK_ItemId}) so that editing a PO's items can soft-delete the current // row and insert a fresh one for the same item — versioning per order_invoice_lifecycle.md. modelBuilder.Entity() .HasIndex(oi => oi.FK_OrderId); 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() .HasOne(u => u.ReportsTo) .WithMany() .HasForeignKey(u => u.FK_ReportsToUserId) .OnDelete(DeleteBehavior.Restrict); 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(o => o.FK_SaleId) .IsUnique(); modelBuilder.Entity() .HasIndex(dp => dp.FK_UserId) .IsUnique(); modelBuilder.Entity() .HasOne() .WithMany() .HasForeignKey(nameof(Vehicle.DefaultWarehouseId)) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); modelBuilder.Entity() .HasOne(r => r.SourceWarehouse) .WithMany() .HasForeignKey(r => r.FK_SourceWarehouseId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(r => r.DriverProfile) .WithMany() .HasForeignKey(r => r.FK_DriverProfileId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(s => s.Store) .WithMany() .HasForeignKey(s => s.FK_StoreId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(s => s.CreatedByUser) .WithMany() .HasForeignKey(s => s.CreatedByUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(s => s.Ride) .WithMany() .HasForeignKey(s => s.FK_RideId) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); modelBuilder.Entity() .HasOne(o => o.Sale) .WithMany() .HasForeignKey(o => o.FK_SaleId) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); modelBuilder.Entity() .HasOne(o => o.CreatedByUser) .WithMany() .HasForeignKey(o => o.CreatedByUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(o => o.ConfirmedByUser) .WithMany() .HasForeignKey(o => o.ConfirmedByUserId) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); // Order.InvoiceId is a plain column with no DB-level FK constraint — deliberately // unmapped as a relationship, per order_invoice_lifecycle.md. modelBuilder.Entity() .Property(o => o.InvoiceId) .HasColumnName("InvoiceId"); modelBuilder.Entity() .HasOne(i => i.Order) .WithMany() .HasForeignKey(i => i.FK_OrderId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.CreatedByUser) .WithMany() .HasForeignKey(i => i.CreatedByUserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.PrintedByUser) .WithMany() .HasForeignKey(i => i.PrintedByUserId) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); modelBuilder.Entity() .HasOne(i => i.FinalizedByUser) .WithMany() .HasForeignKey(i => i.FinalizedByUserId) .OnDelete(DeleteBehavior.Restrict) .IsRequired(false); modelBuilder.Entity() .HasOne(r => r.Scheme) .WithMany(s => s.Redemptions) .HasForeignKey(r => r.FK_SchemeId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(r => r.Order) .WithMany() .HasForeignKey(r => r.FK_OrderId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(r => r.FreeItem) .WithMany() .HasForeignKey(r => r.FK_FreeItemId) .OnDelete(DeleteBehavior.Restrict); 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(); modelBuilder.Entity() .HasOne(s => s.SourceWarehouse) .WithMany() .HasForeignKey(s => s.FK_SourceWarehouseId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(s => s.Ride) .WithMany() .HasForeignKey(s => s.FK_RideId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(i => i.Item) .WithMany() .HasForeignKey(i => i.FK_ItemId) .OnDelete(DeleteBehavior.Restrict); 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() .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() .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_PurchaseOrderId); modelBuilder.Entity() .HasIndex(i => i.FK_GoodsReceiptId); modelBuilder.Entity() .HasIndex(i => i.FK_PurchaseOrderItemId); modelBuilder.Entity() .HasIndex(i => i.FK_PurchaseReturnId); modelBuilder.Entity() .HasOne(r => r.Order) .WithMany() .HasForeignKey(r => r.FK_OrderId) .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); modelBuilder.Entity() .HasOne(n => n.SaleReturn) .WithMany() .HasForeignKey(n => n.FK_SaleReturnId) .OnDelete(DeleteBehavior.Restrict); 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); modelBuilder.Entity() .HasOne(t => t.Ride) .WithMany() .HasForeignKey(t => t.FK_RideId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(t => t.Order) .WithMany() .HasForeignKey(t => t.FK_OrderId) .OnDelete(DeleteBehavior.Restrict); 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(); Seed.RoleAndPermissionSeed.Apply(modelBuilder); Seed.MasterDataSeed.Apply(modelBuilder); Seed.OperationsDataSeed.Apply(modelBuilder); Seed.ProcurementSeed.Apply(modelBuilder); Seed.CommerceSeed.Apply(modelBuilder); Seed.OperationsExtrasSeed.Apply(modelBuilder); } }