using Zentral.Domain.Entities; using Zentral.Domain.Entities.Warehouse; using Zentral.Domain.Entities.Purchases; using Zentral.Domain.Entities.Sales; using Zentral.Domain.Entities.Production; using Zentral.Domain.Entities.HR; using Zentral.Domain.Entities.Communications; using Microsoft.EntityFrameworkCore; namespace Zentral.Infrastructure.Data; public class ZentralDbContext : DbContext { public ZentralDbContext(DbContextOptions options) : base(options) { } public DbSet Clienti => Set(); public DbSet Location => Set(); public DbSet Eventi => Set(); public DbSet TipiEvento => Set(); public DbSet TipiPasto => Set(); public DbSet TipiOspite => Set(); public DbSet TipiRisorsa => Set(); public DbSet TipiMateriale => Set(); public DbSet CodiciCategoria => Set(); public DbSet Risorse => Set(); public DbSet Articoli => Set(); public DbSet EventiDettaglioOspiti => Set(); public DbSet EventiDettaglioPrelievo => Set(); public DbSet EventiDettaglioRisorse => Set(); public DbSet EventiAcconti => Set(); public DbSet EventiAltriCosti => Set(); public DbSet EventiAllegati => Set(); public DbSet EventiDegustazioni => Set(); public DbSet Configurazioni => Set(); public DbSet Utenti => Set(); public DbSet UserDashboardPreferences => Set(); // Report entities public DbSet ReportTemplates => Set(); public DbSet ReportFonts => Set(); public DbSet ReportImages => Set(); public DbSet VirtualDatasets => Set(); // App system entities public DbSet Apps => Set(); public DbSet AppSubscriptions => Set(); // Auto Code system public DbSet AutoCodes => Set(); // Custom Fields system public DbSet CustomFieldDefinitions => Set(); // Warehouse module entities public DbSet WarehouseLocations => Set(); public DbSet WarehouseArticles => Set(); public DbSet WarehouseArticleCategories => Set(); public DbSet ArticleBatches => Set(); public DbSet ArticleSerials => Set(); public DbSet ArticleBarcodes => Set(); public DbSet StockLevels => Set(); public DbSet StockMovements => Set(); public DbSet StockMovementLines => Set(); public DbSet MovementReasons => Set(); public DbSet StockValuations => Set(); public DbSet StockValuationLayers => Set(); public DbSet InventoryCounts => Set(); public DbSet InventoryCountLines => Set(); // Purchases module entities public DbSet Suppliers => Set(); public DbSet PurchaseOrders => Set(); public DbSet PurchaseOrderLines => Set(); // Sales module entities public DbSet SalesOrders => Set(); public DbSet SalesOrderLines => Set(); // Production module entities public DbSet BillOfMaterials => Set(); public DbSet BillOfMaterialsComponents => Set(); public DbSet ProductionOrders => Set(); public DbSet ProductionOrderComponents => Set(); public DbSet WorkCenters => Set(); public DbSet ProductionCycles => Set(); public DbSet ProductionCyclePhases => Set(); public DbSet ProductionOrderPhases => Set(); public DbSet MrpSuggestions => Set(); // Personale module entities public DbSet Dipendenti => Set(); public DbSet Contratti => Set(); public DbSet Assenze => Set(); public DbSet Pagamenti => Set(); public DbSet Rimborsi => Set(); // Communications module entities public DbSet EmailLogs => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // =============================================== // PERSONALE MODULE ENTITIES // =============================================== modelBuilder.Entity(entity => { entity.ToTable("Dipendenti"); entity.HasIndex(e => e.CodiceFiscale).IsUnique(); }); modelBuilder.Entity(entity => { entity.ToTable("Contratti"); entity.Property(e => e.RetribuzioneLorda).HasPrecision(18, 2); entity.HasOne(e => e.Dipendente) .WithMany(d => d.Contratti) .HasForeignKey(e => e.DipendenteId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { entity.ToTable("Assenze"); entity.HasOne(e => e.Dipendente) .WithMany(d => d.Assenze) .HasForeignKey(e => e.DipendenteId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { entity.ToTable("Pagamenti"); entity.Property(e => e.ImportoNetto).HasPrecision(18, 2); entity.HasOne(e => e.Dipendente) .WithMany(d => d.Pagamenti) .HasForeignKey(e => e.DipendenteId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { entity.ToTable("Rimborsi"); entity.Property(e => e.Importo).HasPrecision(18, 2); entity.HasOne(e => e.Dipendente) .WithMany(d => d.Rimborsi) .HasForeignKey(e => e.DipendenteId) .OnDelete(DeleteBehavior.Cascade); }); // Cliente modelBuilder.Entity(entity => { entity.HasIndex(e => e.RagioneSociale); entity.HasIndex(e => e.PartitaIva); }); // Location modelBuilder.Entity(entity => { entity.HasIndex(e => e.Nome); }); // Evento modelBuilder.Entity(entity => { entity.HasIndex(e => e.DataEvento); entity.HasIndex(e => e.Stato); entity.HasIndex(e => e.Codice); entity.HasOne(e => e.Cliente) .WithMany(c => c.Eventi) .HasForeignKey(e => e.ClienteId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.Location) .WithMany(l => l.Eventi) .HasForeignKey(e => e.LocationId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.TipoEvento) .WithMany(t => t.Eventi) .HasForeignKey(e => e.TipoEventoId) .OnDelete(DeleteBehavior.SetNull); }); // TipoEvento modelBuilder.Entity(entity => { entity.HasOne(e => e.TipoPasto) .WithMany(t => t.TipiEvento) .HasForeignKey(e => e.TipoPastoId) .OnDelete(DeleteBehavior.SetNull); }); // Articolo modelBuilder.Entity(entity => { entity.HasIndex(e => e.Codice).IsUnique(); entity.HasOne(e => e.TipoMateriale) .WithMany(t => t.Articoli) .HasForeignKey(e => e.TipoMaterialeId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.Categoria) .WithMany(c => c.Articoli) .HasForeignKey(e => e.CategoriaId) .OnDelete(DeleteBehavior.SetNull); }); // Risorsa modelBuilder.Entity(entity => { entity.HasOne(e => e.TipoRisorsa) .WithMany(t => t.Risorse) .HasForeignKey(e => e.TipoRisorsaId) .OnDelete(DeleteBehavior.SetNull); }); // EventoDettaglioOspiti modelBuilder.Entity(entity => { entity.HasOne(e => e.Evento) .WithMany(ev => ev.DettagliOspiti) .HasForeignKey(e => e.EventoId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.TipoOspite) .WithMany(t => t.DettagliOspiti) .HasForeignKey(e => e.TipoOspiteId) .OnDelete(DeleteBehavior.Cascade); }); // EventoDettaglioPrelievo modelBuilder.Entity(entity => { entity.HasOne(e => e.Evento) .WithMany(ev => ev.DettagliPrelievo) .HasForeignKey(e => e.EventoId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Articolo) .WithMany(a => a.DettagliPrelievo) .HasForeignKey(e => e.ArticoloId) .OnDelete(DeleteBehavior.Cascade); }); // EventoDettaglioRisorsa modelBuilder.Entity(entity => { entity.HasOne(e => e.Evento) .WithMany(ev => ev.DettagliRisorse) .HasForeignKey(e => e.EventoId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Risorsa) .WithMany(r => r.DettagliRisorse) .HasForeignKey(e => e.RisorsaId) .OnDelete(DeleteBehavior.Cascade); }); // EventoAcconto modelBuilder.Entity(entity => { entity.HasOne(e => e.Evento) .WithMany(ev => ev.Acconti) .HasForeignKey(e => e.EventoId) .OnDelete(DeleteBehavior.Cascade); }); // EventoAltroCosto modelBuilder.Entity(entity => { entity.HasOne(e => e.Evento) .WithMany(ev => ev.AltriCosti) .HasForeignKey(e => e.EventoId) .OnDelete(DeleteBehavior.Cascade); }); // EventoAllegato modelBuilder.Entity(entity => { entity.HasOne(e => e.Evento) .WithMany(ev => ev.Allegati) .HasForeignKey(e => e.EventoId) .OnDelete(DeleteBehavior.Cascade); }); // EventoDegustazione modelBuilder.Entity(entity => { entity.HasOne(e => e.Evento) .WithMany(ev => ev.Degustazioni) .HasForeignKey(e => e.EventoId) .OnDelete(DeleteBehavior.Cascade); }); // Configurazione modelBuilder.Entity(entity => { entity.HasIndex(e => e.Chiave).IsUnique(); }); // Utente modelBuilder.Entity(entity => { entity.HasIndex(e => e.Username).IsUnique(); }); // UserDashboardPreference modelBuilder.Entity(entity => { entity.HasIndex(e => e.UtenteId).IsUnique(); entity.HasOne(e => e.Utente) .WithOne() .HasForeignKey(e => e.UtenteId) .OnDelete(DeleteBehavior.Cascade); }); // ReportTemplate modelBuilder.Entity(entity => { entity.HasIndex(e => e.Nome); entity.HasIndex(e => e.Categoria); }); // ReportFont modelBuilder.Entity(entity => { entity.HasIndex(e => e.FontFamily); }); // ReportImage modelBuilder.Entity(entity => { entity.HasIndex(e => e.Categoria); }); // VirtualDataset modelBuilder.Entity(entity => { entity.HasIndex(e => e.Nome).IsUnique(); entity.HasIndex(e => e.Categoria); }); // App modelBuilder.Entity(entity => { entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.SortOrder); entity.Property(e => e.BasePrice) .HasPrecision(18, 2); entity.Property(e => e.MonthlyMultiplier) .HasPrecision(5, 2); }); // AppSubscription modelBuilder.Entity(entity => { entity.HasIndex(e => e.AppId).IsUnique(); entity.Property(e => e.PaidPrice) .HasPrecision(18, 2); entity.HasOne(e => e.App) .WithOne(m => m.Subscription) .HasForeignKey(e => e.AppId) .OnDelete(DeleteBehavior.Cascade); }); // AutoCode modelBuilder.Entity(entity => { entity.HasIndex(e => e.EntityCode).IsUnique(); entity.HasIndex(e => e.ModuleCode); }); // CustomFieldDefinition modelBuilder.Entity(entity => { entity.HasIndex(e => new { e.EntityName, e.FieldName }).IsUnique(); entity.HasIndex(e => e.EntityName); }); // =============================================== // WAREHOUSE MODULE ENTITIES // =============================================== // WarehouseLocation modelBuilder.Entity(entity => { entity.ToTable("WarehouseLocations"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.IsDefault); entity.HasIndex(e => e.IsActive); }); // WarehouseArticleCategory modelBuilder.Entity(entity => { entity.ToTable("WarehouseArticleCategories"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.ParentCategoryId); entity.HasIndex(e => e.FullPath); entity.HasOne(e => e.ParentCategory) .WithMany(c => c.ChildCategories) .HasForeignKey(e => e.ParentCategoryId) .OnDelete(DeleteBehavior.Restrict); }); // WarehouseArticle modelBuilder.Entity(entity => { entity.ToTable("WarehouseArticles"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.Barcode); entity.HasIndex(e => e.CategoryId); entity.HasIndex(e => e.IsActive); entity.Property(e => e.StandardCost).HasPrecision(18, 4); entity.Property(e => e.LastPurchaseCost).HasPrecision(18, 4); entity.Property(e => e.WeightedAverageCost).HasPrecision(18, 4); entity.Property(e => e.BaseSellingPrice).HasPrecision(18, 4); entity.Property(e => e.MinimumStock).HasPrecision(18, 4); entity.Property(e => e.MaximumStock).HasPrecision(18, 4); entity.Property(e => e.ReorderPoint).HasPrecision(18, 4); entity.Property(e => e.ReorderQuantity).HasPrecision(18, 4); entity.Property(e => e.UnitConversionFactor).HasPrecision(18, 6); entity.Property(e => e.Weight).HasPrecision(18, 4); entity.Property(e => e.Volume).HasPrecision(18, 6); entity.HasOne(e => e.Category) .WithMany(c => c.Articles) .HasForeignKey(e => e.CategoryId) .OnDelete(DeleteBehavior.SetNull); }); // ArticleBatch modelBuilder.Entity(entity => { entity.ToTable("ArticleBatches"); entity.HasIndex(e => new { e.ArticleId, e.BatchNumber }).IsUnique(); entity.HasIndex(e => e.ExpiryDate); entity.HasIndex(e => e.Status); entity.Property(e => e.UnitCost).HasPrecision(18, 4); entity.Property(e => e.InitialQuantity).HasPrecision(18, 4); entity.Property(e => e.CurrentQuantity).HasPrecision(18, 4); entity.Property(e => e.ReservedQuantity).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany(a => a.Batches) .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Cascade); }); // ArticleSerial modelBuilder.Entity(entity => { entity.ToTable("ArticleSerials"); entity.HasIndex(e => new { e.ArticleId, e.SerialNumber }).IsUnique(); entity.HasIndex(e => e.Status); entity.HasIndex(e => e.CurrentWarehouseId); entity.Property(e => e.UnitCost).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany(a => a.Serials) .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Batch) .WithMany(b => b.Serials) .HasForeignKey(e => e.BatchId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.CurrentWarehouse) .WithMany() .HasForeignKey(e => e.CurrentWarehouseId) .OnDelete(DeleteBehavior.SetNull); }); // ArticleBarcode modelBuilder.Entity(entity => { entity.ToTable("ArticleBarcodes"); entity.HasIndex(e => e.Barcode).IsUnique(); entity.HasIndex(e => e.ArticleId); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany(a => a.Barcodes) .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Cascade); }); // StockLevel modelBuilder.Entity(entity => { entity.ToTable("StockLevels"); entity.HasIndex(e => new { e.ArticleId, e.WarehouseId, e.BatchId }).IsUnique(); entity.HasIndex(e => e.WarehouseId); entity.HasIndex(e => e.LocationCode); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.Property(e => e.ReservedQuantity).HasPrecision(18, 4); entity.Property(e => e.OnOrderQuantity).HasPrecision(18, 4); entity.Property(e => e.StockValue).HasPrecision(18, 4); entity.Property(e => e.UnitCost).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany(a => a.StockLevels) .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Warehouse) .WithMany(w => w.StockLevels) .HasForeignKey(e => e.WarehouseId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Batch) .WithMany(b => b.StockLevels) .HasForeignKey(e => e.BatchId) .OnDelete(DeleteBehavior.SetNull); }); // MovementReason modelBuilder.Entity(entity => { entity.ToTable("MovementReasons"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.MovementType); entity.HasIndex(e => e.IsActive); }); // StockMovement modelBuilder.Entity(entity => { entity.ToTable("StockMovements"); entity.HasIndex(e => e.DocumentNumber).IsUnique(); entity.HasIndex(e => e.MovementDate); entity.HasIndex(e => e.Type); entity.HasIndex(e => e.Status); entity.HasIndex(e => e.ExternalReference); entity.Property(e => e.TotalValue).HasPrecision(18, 4); entity.HasOne(e => e.SourceWarehouse) .WithMany(w => w.SourceMovements) .HasForeignKey(e => e.SourceWarehouseId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.DestinationWarehouse) .WithMany(w => w.DestinationMovements) .HasForeignKey(e => e.DestinationWarehouseId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Reason) .WithMany(r => r.Movements) .HasForeignKey(e => e.ReasonId) .OnDelete(DeleteBehavior.SetNull); }); // StockMovementLine modelBuilder.Entity(entity => { entity.ToTable("StockMovementLines"); entity.HasIndex(e => new { e.MovementId, e.LineNumber }).IsUnique(); entity.HasIndex(e => e.ArticleId); entity.HasIndex(e => e.BatchId); entity.HasIndex(e => e.SerialId); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.Property(e => e.UnitCost).HasPrecision(18, 4); entity.Property(e => e.LineValue).HasPrecision(18, 4); entity.HasOne(e => e.Movement) .WithMany(m => m.Lines) .HasForeignKey(e => e.MovementId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Article) .WithMany(a => a.MovementLines) .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Batch) .WithMany(b => b.MovementLines) .HasForeignKey(e => e.BatchId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.Serial) .WithMany(s => s.MovementLines) .HasForeignKey(e => e.SerialId) .OnDelete(DeleteBehavior.SetNull); }); // StockValuation modelBuilder.Entity(entity => { entity.ToTable("StockValuations"); entity.HasIndex(e => new { e.Period, e.ArticleId, e.WarehouseId }).IsUnique(); entity.HasIndex(e => e.ValuationDate); entity.HasIndex(e => e.IsClosed); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.Property(e => e.UnitCost).HasPrecision(18, 4); entity.Property(e => e.TotalValue).HasPrecision(18, 4); entity.Property(e => e.InboundQuantity).HasPrecision(18, 4); entity.Property(e => e.InboundValue).HasPrecision(18, 4); entity.Property(e => e.OutboundQuantity).HasPrecision(18, 4); entity.Property(e => e.OutboundValue).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Warehouse) .WithMany() .HasForeignKey(e => e.WarehouseId) .OnDelete(DeleteBehavior.SetNull); }); // StockValuationLayer modelBuilder.Entity(entity => { entity.ToTable("StockValuationLayers"); entity.HasIndex(e => new { e.ArticleId, e.WarehouseId, e.LayerDate }); entity.HasIndex(e => e.IsExhausted); entity.Property(e => e.OriginalQuantity).HasPrecision(18, 4); entity.Property(e => e.RemainingQuantity).HasPrecision(18, 4); entity.Property(e => e.UnitCost).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Warehouse) .WithMany() .HasForeignKey(e => e.WarehouseId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Batch) .WithMany() .HasForeignKey(e => e.BatchId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.SourceMovement) .WithMany() .HasForeignKey(e => e.SourceMovementId) .OnDelete(DeleteBehavior.SetNull); }); // InventoryCount modelBuilder.Entity(entity => { entity.ToTable("InventoryCounts"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.InventoryDate); entity.HasIndex(e => e.Status); entity.Property(e => e.PositiveDifferenceValue).HasPrecision(18, 4); entity.Property(e => e.NegativeDifferenceValue).HasPrecision(18, 4); entity.HasOne(e => e.Warehouse) .WithMany() .HasForeignKey(e => e.WarehouseId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.Category) .WithMany() .HasForeignKey(e => e.CategoryId) .OnDelete(DeleteBehavior.SetNull); entity.HasOne(e => e.AdjustmentMovement) .WithMany() .HasForeignKey(e => e.AdjustmentMovementId) .OnDelete(DeleteBehavior.SetNull); }); // InventoryCountLine modelBuilder.Entity(entity => { entity.ToTable("InventoryCountLines"); entity.HasIndex(e => new { e.InventoryCountId, e.ArticleId, e.WarehouseId, e.BatchId }).IsUnique(); entity.HasIndex(e => e.ArticleId); entity.Property(e => e.TheoreticalQuantity).HasPrecision(18, 4); entity.Property(e => e.CountedQuantity).HasPrecision(18, 4); entity.Property(e => e.SecondCountQuantity).HasPrecision(18, 4); entity.Property(e => e.UnitCost).HasPrecision(18, 4); entity.HasOne(e => e.InventoryCount) .WithMany(i => i.Lines) .HasForeignKey(e => e.InventoryCountId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Warehouse) .WithMany() .HasForeignKey(e => e.WarehouseId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Batch) .WithMany() .HasForeignKey(e => e.BatchId) .OnDelete(DeleteBehavior.SetNull); }); // =============================================== // PURCHASES MODULE ENTITIES // =============================================== // Supplier modelBuilder.Entity(entity => { entity.ToTable("Suppliers"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.Name); entity.HasIndex(e => e.VatNumber); entity.HasIndex(e => e.IsActive); }); // PurchaseOrder modelBuilder.Entity(entity => { entity.ToTable("PurchaseOrders"); entity.HasIndex(e => e.OrderNumber).IsUnique(); entity.HasIndex(e => e.OrderDate); entity.HasIndex(e => e.SupplierId); entity.HasIndex(e => e.Status); entity.Property(e => e.TotalNet).HasPrecision(18, 4); entity.Property(e => e.TotalTax).HasPrecision(18, 4); entity.Property(e => e.TotalGross).HasPrecision(18, 4); entity.HasOne(e => e.Supplier) .WithMany(s => s.PurchaseOrders) .HasForeignKey(e => e.SupplierId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.DestinationWarehouse) .WithMany() .HasForeignKey(e => e.DestinationWarehouseId) .OnDelete(DeleteBehavior.SetNull); }); // PurchaseOrderLine modelBuilder.Entity(entity => { entity.ToTable("PurchaseOrderLines"); entity.HasIndex(e => e.PurchaseOrderId); entity.HasIndex(e => e.WarehouseArticleId); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.Property(e => e.ReceivedQuantity).HasPrecision(18, 4); entity.Property(e => e.UnitPrice).HasPrecision(18, 4); entity.Property(e => e.TaxRate).HasPrecision(18, 2); entity.Property(e => e.DiscountPercent).HasPrecision(18, 2); entity.Property(e => e.LineTotal).HasPrecision(18, 4); entity.HasOne(e => e.PurchaseOrder) .WithMany(o => o.Lines) .HasForeignKey(e => e.PurchaseOrderId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.WarehouseArticle) .WithMany() .HasForeignKey(e => e.WarehouseArticleId) .OnDelete(DeleteBehavior.Restrict); }); // =============================================== // SALES MODULE ENTITIES // =============================================== // SalesOrder modelBuilder.Entity(entity => { entity.ToTable("SalesOrders"); entity.HasIndex(e => e.OrderNumber).IsUnique(); entity.HasIndex(e => e.OrderDate); entity.HasIndex(e => e.CustomerId); entity.HasIndex(e => e.Status); entity.Property(e => e.TotalNet).HasPrecision(18, 4); entity.Property(e => e.TotalTax).HasPrecision(18, 4); entity.Property(e => e.TotalGross).HasPrecision(18, 4); entity.HasOne(e => e.Customer) .WithMany(c => c.SalesOrders) .HasForeignKey(e => e.CustomerId) .OnDelete(DeleteBehavior.Restrict); }); // SalesOrderLine modelBuilder.Entity(entity => { entity.ToTable("SalesOrderLines"); entity.HasIndex(e => e.SalesOrderId); entity.HasIndex(e => e.WarehouseArticleId); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.Property(e => e.ShippedQuantity).HasPrecision(18, 4); entity.Property(e => e.UnitPrice).HasPrecision(18, 4); entity.Property(e => e.TaxRate).HasPrecision(18, 2); entity.Property(e => e.DiscountPercent).HasPrecision(18, 2); entity.Property(e => e.LineTotal).HasPrecision(18, 4); entity.HasOne(e => e.SalesOrder) .WithMany(o => o.Lines) .HasForeignKey(e => e.SalesOrderId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.WarehouseArticle) .WithMany() .HasForeignKey(e => e.WarehouseArticleId) .OnDelete(DeleteBehavior.Restrict); }); // =============================================== // PRODUCTION MODULE ENTITIES // =============================================== // BillOfMaterials modelBuilder.Entity(entity => { entity.ToTable("BillOfMaterials"); entity.HasIndex(e => e.ArticleId); entity.HasIndex(e => e.IsActive); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Restrict); }); // BillOfMaterialsComponent modelBuilder.Entity(entity => { entity.ToTable("BillOfMaterialsComponents"); entity.HasIndex(e => e.BillOfMaterialsId); entity.HasIndex(e => e.ComponentArticleId); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.Property(e => e.ScrapPercentage).HasPrecision(18, 2); entity.HasOne(e => e.BillOfMaterials) .WithMany(b => b.Components) .HasForeignKey(e => e.BillOfMaterialsId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.ComponentArticle) .WithMany() .HasForeignKey(e => e.ComponentArticleId) .OnDelete(DeleteBehavior.Restrict); }); // ProductionOrder modelBuilder.Entity(entity => { entity.ToTable("ProductionOrders"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.ArticleId); entity.HasIndex(e => e.Status); entity.HasIndex(e => e.StartDate); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Restrict); }); // ProductionOrderComponent modelBuilder.Entity(entity => { entity.ToTable("ProductionOrderComponents"); entity.HasIndex(e => e.ProductionOrderId); entity.HasIndex(e => e.ArticleId); entity.Property(e => e.RequiredQuantity).HasPrecision(18, 4); entity.Property(e => e.ConsumedQuantity).HasPrecision(18, 4); entity.HasOne(e => e.ProductionOrder) .WithMany(o => o.Components) .HasForeignKey(e => e.ProductionOrderId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Restrict); }); // WorkCenter modelBuilder.Entity(entity => { entity.ToTable("WorkCenters"); entity.HasIndex(e => e.Code).IsUnique(); entity.HasIndex(e => e.IsActive); entity.Property(e => e.CostPerHour).HasPrecision(18, 4); }); // ProductionCycle modelBuilder.Entity(entity => { entity.ToTable("ProductionCycles"); entity.HasIndex(e => e.ArticleId); entity.HasIndex(e => e.IsActive); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Restrict); }); // ProductionCyclePhase modelBuilder.Entity(entity => { entity.ToTable("ProductionCyclePhases"); entity.HasIndex(e => e.ProductionCycleId); entity.HasIndex(e => e.WorkCenterId); entity.HasOne(e => e.ProductionCycle) .WithMany(c => c.Phases) .HasForeignKey(e => e.ProductionCycleId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.WorkCenter) .WithMany() .HasForeignKey(e => e.WorkCenterId) .OnDelete(DeleteBehavior.Restrict); }); // ProductionOrderPhase modelBuilder.Entity(entity => { entity.ToTable("ProductionOrderPhases"); entity.HasIndex(e => e.ProductionOrderId); entity.HasIndex(e => e.WorkCenterId); entity.HasIndex(e => e.Status); entity.Property(e => e.QuantityCompleted).HasPrecision(18, 4); entity.Property(e => e.QuantityScrapped).HasPrecision(18, 4); entity.HasOne(e => e.ProductionOrder) .WithMany(o => o.Phases) .HasForeignKey(e => e.ProductionOrderId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.WorkCenter) .WithMany() .HasForeignKey(e => e.WorkCenterId) .OnDelete(DeleteBehavior.Restrict); }); // MrpSuggestion modelBuilder.Entity(entity => { entity.ToTable("MrpSuggestions"); entity.HasIndex(e => e.ArticleId); entity.HasIndex(e => e.CalculationDate); entity.HasIndex(e => e.IsProcessed); entity.Property(e => e.Quantity).HasPrecision(18, 4); entity.HasOne(e => e.Article) .WithMany() .HasForeignKey(e => e.ArticleId) .OnDelete(DeleteBehavior.Cascade); }); // =============================================== // COMMUNICATIONS MODULE ENTITIES // =============================================== modelBuilder.Entity(entity => { entity.ToTable("EmailLogs"); entity.HasIndex(e => e.SentDate); entity.HasIndex(e => e.Status); entity.HasIndex(e => e.Recipient); }); } }