using EgwCoreLib.Lux.Data.DbModel.Cost; using EgwCoreLib.Lux.Data.DbModel.Utils; using EgwCoreLib.Lux.Data.DbModel.Sales; using EgwCoreLib.Lux.Data.DbModel.Task; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using EgwCoreLib.Lux.Data.DbModel.Stock; using EgwCoreLib.Lux.Data.DbModel.Items; namespace EgwCoreLib.Lux.Data { public static class ModelBuilderExtensions { #region Public Methods /// /// Estensione per seed iniziale dei dati nel DB /// /// public static void Seed(this ModelBuilder modelBuilder) { // inizializzazione dei valori di default x Ruoli/Tags modelBuilder.Entity().HasData( new TagsModel { TagID = 1, Description = "Tag 01" }, new TagsModel { TagID = 2, Description = "Tag 02" }, new TagsModel { TagID = 3, Description = "Tag 03" }, new TagsModel { TagID = 4, Description = "Tag 04" }, new TagsModel { TagID = 5, Description = "Tag 05" } ); // init classi generiche x gestione liste modelBuilder.Entity().HasData( new GenClassModel { ClassCod = "WoodMat", Description = "Elenco Materiali Legno" }, new GenClassModel { ClassCod = "WoodCol", Description = "Elenco Colori Legno" } ); modelBuilder.Entity().HasData( new GenValueModel { GenValID = 1, Ordinal = 1, ClassCod = "WoodMat", ValString = "Pine" }, new GenValueModel { GenValID = 2, Ordinal = 2, ClassCod = "WoodMat", ValString = "Maple" }, new GenValueModel { GenValID = 3, Ordinal = 1, ClassCod = "WoodCol", ValString = "Legno" }, new GenValueModel { GenValID = 4, Ordinal = 2, ClassCod = "WoodCol", ValString = "Bianco" }, new GenValueModel { GenValID = 5, Ordinal = 3, ClassCod = "WoodCol", ValString = "Rosso" }, new GenValueModel { GenValID = 6, Ordinal = 4, ClassCod = "WoodCol", ValString = "Nero" } ); // valori base classi generiche // inizializzazione dei valori di default x Customer modelBuilder.Entity().HasData( new CustomerModel { CustomerID = 1, FirstName = "Customer A", LastName = "Egalware", VAT = "1234567890123456" }, new CustomerModel { CustomerID = 2, FirstName = "Customer B", LastName = "User", VAT = "1234567890123456" }, new CustomerModel { CustomerID = 3, FirstName = "Customer C", LastName = "User Test", VAT = "1234567890123456" } ); // inizializzazione dei valori di default x Dealer modelBuilder.Entity().HasData( new DealerModel { DealerID = 1, CompanyName = "Company First", FirstName = "Dealer A", LastName = "Egalware", VAT = "9587362514671527" }, new DealerModel { DealerID = 2, CompanyName = "Company First", FirstName = "Dealer B", LastName = "User", VAT = "9587362514671527" }, new DealerModel { DealerID = 3, CompanyName = "Company Second", FirstName = "Dealer C", LastName = "User Test", VAT = "9587362514671527" } ); // inizializzazione dei valori di default x Supplier modelBuilder.Entity().HasData( new SupplierModel { SupplierID = 1, CompanyName = "Company One", FirstName = "Supplier A", LastName = "Egalware", VAT = "7294857103879254" }, new SupplierModel { SupplierID = 2, CompanyName = "Company Two", FirstName = "Supplier B", LastName = "User", VAT = "7294857103879254" }, new SupplierModel { SupplierID = 3, CompanyName = "Company Two", FirstName = "Supplier C", LastName = "User Test", VAT = "7294857103879254" } ); // inizializzazione dei valori di default x gruppi item modelBuilder.Entity().HasData( new ItemGroupModel { CodGroup = "WindowTrunk", Description = "Barre legno per lavorazione" }, new ItemGroupModel { CodGroup = "WindowGlass", Description = "Vetri serramento" }, new ItemGroupModel { CodGroup = "WindowVarnish", Description = "Vernici per legno" }, new ItemGroupModel { CodGroup = "WindowHardware", Description = "Ferramenta serramento" } ); // inizializzazione tipo mov mag modelBuilder.Entity().HasData( new MovTypeModel { MovCod = "CAR", Description = "Carico a magazzino" }, new MovTypeModel { MovCod = "MOV", Description = "Movimento interno (spostamento)" }, new MovTypeModel { MovCod = "ND", Description = "Non Definito" }, new MovTypeModel { MovCod = "OFOR", Description = "Ordine Fornitore" }, new MovTypeModel { MovCod = "RETT", Description = "Rettifica magazzino" }, new MovTypeModel { MovCod = "SCAR", Description = "Scarico da magazzino" } ); // inizializzazione dei valori di default x Item di magazzino modelBuilder.Entity().HasData( // barre grezzo new ItemModel { ItemID = 1, CodGroup = "WindowTrunk", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 1001, Description = "BARRA-60x80 generica", SupplCode = "BARR.001", Cost = 20, Margin = 0.3, UM = "#" }, new ItemModel { ItemID = 2, CodGroup = "WindowTrunk", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 1002, ExtItemCode = "BARRA-60x80x12000", SupplCode = "ABC.00123.12000", Description = "Barra 60x80, lunghezza 12m", Cost = 16.5, Margin = 0.21, UM = "#" }, new ItemModel { ItemID = 3, CodGroup = "WindowTrunk", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 1003, ExtItemCode = "BARRA-60x80x8000", SupplCode = "ABC.00123.8000", Description = "Barra 60x80, lunghezza 8m", Cost = 17.5, Margin = 0.22, UM = "#" }, new ItemModel { ItemID = 4, CodGroup = "WindowTrunk", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 1004, ExtItemCode = "BARRA-60x80x16000", SupplCode = "ABC.00123.16000", Description = "Barra 60x80, lunghezza 16m", Cost = 15.5, Margin = 0.2, UM = "#" }, // vetri new ItemModel { ItemID = 5, CodGroup = "WindowGlass", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 2001, ExtItemCode = "VETRO-3L-THERMO-800x1000", SupplCode = "V3T.800.1000", Description = "Vetro triplo, basso indice termico, 800x1000", Cost = 300, Margin = 0.20, UM = "m2" }, new ItemModel { ItemID = 6, CodGroup = "WindowGlass", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 2002, ExtItemCode = "VETRO-2L-800x1000", SupplCode = "V2.800.1000", Description = "Vetro doppio, 800x1000", Cost = 200, Margin = 0.15, UM = "m2" }, new ItemModel { ItemID = 7, CodGroup = "WindowGlass", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 2003, ExtItemCode = "VETRO-3L-800x1000", SupplCode = "V3.800.1000", Description = "Vetro triplo, 800x1000", Cost = 250, Margin = 0.18, UM = "m2" }, // vernici new ItemModel { ItemID = 8, CodGroup = "WindowVarnish", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 3001, ExtItemCode = "VERN-TRASP", SupplCode = "VT.STD", Description = "Vernice trasparente", Cost = 20, Margin = 0.20, UM = "l" }, // ferramenta new ItemModel { ItemID = 9, CodGroup = "WindowHardware", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 5001, ExtItemCode = "KIT-001", SupplCode = "AGB-KIT-001", Description = "Kit standard completo AGB tipo 001", Cost = 65, Margin = 0.20, UM = "#" }, new ItemModel { ItemID = 10, CodGroup = "WindowHardware", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 5002, ExtItemCode = "CERN-001", SupplCode = "AGB-CERN-001", Description = "Cerniera AGB tipo 001", Cost = 10, Margin = 0.20, UM = "#" }, new ItemModel { ItemID = 11, CodGroup = "WindowHardware", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 5003, ExtItemCode = "SERR-001", SupplCode = "AGB-SERR-001", Description = "Serratura AGB tipo 001", Cost = 15, Margin = 0.20, UM = "#" }, new ItemModel { ItemID = 12, CodGroup = "WindowHardware", ItemType = Core.Enums.ItemClassType.Buy, IsService = false, ItemCode = 5004, ExtItemCode = "MAN-001", SupplCode = "AGB-MAN-001", Description = "Maniglia AGB tipo 001", Cost = 25, Margin = 0.20, UM = "#" } ); // inizializzazione dei valori di default x Item di giacenza modelBuilder.Entity().HasData( // giacenza barre grezzo new StockStatusModel { StockStatusId = 1, ItemID = 1, QtyAvail = 5, IsDeleted = false, IsRemn = false, Location = "B001-001-003" }, new StockStatusModel { StockStatusId = 2, ItemID = 2, QtyAvail = 8, IsDeleted = false, IsRemn = false, Location = "B001-001-002" }, new StockStatusModel { StockStatusId = 3, ItemID = 3, QtyAvail = 5, IsDeleted = false, IsRemn = false, Location = "B001-001-001" }, // giacenza vetri new StockStatusModel { StockStatusId = 4, ItemID = 4, QtyAvail = 1, IsDeleted = false, IsRemn = false, Location = "V002-001-001" }, new StockStatusModel { StockStatusId = 5, ItemID = 5, QtyAvail = 10, IsDeleted = false, IsRemn = false, Location = "V001-001-002" }, new StockStatusModel { StockStatusId = 6, ItemID = 6, QtyAvail = 1, IsDeleted = false, IsRemn = false, Location = "V001-001-003" }, // giacenza vernici new StockStatusModel { StockStatusId = 7, ItemID = 8, QtyAvail = 50, IsDeleted = false, IsRemn = false, Location = "V001-001-003" }, // giacenza ferramenta new StockStatusModel { StockStatusId = 8, ItemID = 11, QtyAvail = 1, IsDeleted = false, IsRemn = false, Location = "S001-002-001" }, new StockStatusModel { StockStatusId = 9, ItemID = 9, QtyAvail = 1, IsDeleted = false, IsRemn = false, Location = "S001-002-001" }, new StockStatusModel { StockStatusId = 10, ItemID = 10, QtyAvail = 1, IsDeleted = false, IsRemn = false, Location = "S001-001-001" } ); // inizializzazione dei valori di default x movimenti giacenze magazzino modelBuilder.Entity().HasData( // giacenza barre grezzo new StockMovModel { StockMovID = 1, StockStatusId = 1, QtyRec = 5, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, new StockMovModel { StockMovID = 2, StockStatusId = 2, QtyRec = 8, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, new StockMovModel { StockMovID = 3, StockStatusId = 3, QtyRec = 5, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, // giacenza vetri new StockMovModel { StockMovID = 4, StockStatusId = 4, QtyRec = 1, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, new StockMovModel { StockMovID = 5, StockStatusId = 5, QtyRec = 10, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, new StockMovModel { StockMovID = 6, StockStatusId = 6, QtyRec = 1, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, // giacenza vernici new StockMovModel { StockMovID = 7, StockStatusId = 7, QtyRec = 50, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, // giacenza ferramenta new StockMovModel { StockMovID = 8, StockStatusId = 8, QtyRec = 1, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, new StockMovModel { StockMovID = 9, StockStatusId = 9, QtyRec = 1, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" }, new StockMovModel { StockMovID = 10, StockStatusId = 10, QtyRec = 1, MovCod = "CAR", UserId = "samuele.locatelli@egalware.com", Note = "DEMO" } ); // init cost drivers modelBuilder.Entity().HasData( // Risorsa principale di calcolo produttività/costi new CostDriverModel() { CostDriverID = 1, Name = "WorkHour", Unit = "h", Descript = "Ore lavorate per step/fase" }, new CostDriverModel() { CostDriverID = 2, Name = "Meter", Unit = "m", Descript = "Metri prodotti per step/fase" }, new CostDriverModel() { CostDriverID = 3, Name = "Unit", Unit = "#", Descript = "Numero unità prodotte (lavorate) per step/fase" } ); // inizializzazione risorse modelBuilder.Entity().HasData( new ResourceModel { ResourceID = 1, Name = "Sezionatrice", FixedCost = 12000, VariableCost = 6000, OverHeadCost = 5000, CostDriverID = 1, CostDriverBudget = 220 * 4, LaborCost = 30, OverHeadPerc = 0.15M, EBTPerc = 0.15M }, new ResourceModel { ResourceID = 2, Name = "Linea SAOMAD WoodPecker Just 3500", FixedCost = 100000, VariableCost = 30000, OverHeadCost = 15000, CostDriverID = 1, CostDriverBudget = 220 * 8, LaborCost = 40, OverHeadPerc = 0.15M, EBTPerc = 0.15M }, new ResourceModel { ResourceID = 3, Name = "Linea Pantografo", FixedCost = 24000, VariableCost = 6000, OverHeadCost = 5000, CostDriverID = 1, CostDriverBudget = 220 * 8, LaborCost = 35, OverHeadPerc = 0.15M, EBTPerc = 0.15M }, new ResourceModel { ResourceID = 4, Name = "Stazione Verniciatura", FixedCost = 24000, VariableCost = 6000, OverHeadCost = 3000, CostDriverID = 1, CostDriverBudget = 220 * 4, LaborCost = 30, OverHeadPerc = 0.15M, EBTPerc = 0.15M }, new ResourceModel { ResourceID = 5, Name = "Verniciatura Manuale", FixedCost = 6000, VariableCost = 2000, OverHeadCost = 3000, CostDriverID = 1, CostDriverBudget = 220 * 1, LaborCost = 30, OverHeadPerc = 0.15M, EBTPerc = 0.15M }, new ResourceModel { ResourceID = 6, Name = "Montaggio Manuale", FixedCost = 500, VariableCost = 500, OverHeadCost = 500, CostDriverID = 1, CostDriverBudget = 220 * 8 * 2, LaborCost = 30, OverHeadPerc = 0.15M, EBTPerc = 0.15M }, new ResourceModel { ResourceID = 7, Name = "Installatore", FixedCost = 0, VariableCost = 3000, OverHeadCost = 0, CostDriverID = 1, CostDriverBudget = 220 * 8 * 2, LaborCost = 40, OverHeadPerc = 0.15M, EBTPerc = 0.15M } ); // inizializzazione fasi modelBuilder.Entity().HasData( new PhaseModel { PhaseID = 1, Description = "Taglio tronchetti" }, new PhaseModel { PhaseID = 2, Description = "Lavorazione pezzi serramento" }, new PhaseModel { PhaseID = 3, Description = "Verniciatura" }, new PhaseModel { PhaseID = 4, Description = "Assemblaggio completo" }, new PhaseModel { PhaseID = 5, Description = "Assemblaggio Ferramenta" }, new PhaseModel { PhaseID = 6, Description = "Installazione e posa in opera" } ); // inizializzazione cicli di lavoro modelBuilder.Entity().HasData( new JobModel { JobID = 1, Description = "Rivendita / servizi" }, new JobModel { JobID = 2, Description = "Serramento Completo Legno su linea Saomad e installatore interno" }//, //new JobModel { JobID = 2, Name = "Serramento Completo Legno/Alluminio" }, //new JobModel { JobID = 3, Name = "Persiana Legno" }, //new JobModel { JobID = 4, Name = "restauro Persiana Esistente" } ); // init righe ciclo (fasi di ciclo) modelBuilder.Entity().HasData( // per fare 1 finestra singola/semplice taglio 4 tronchetti telaio + 4 tronchetti finestra, considero 1 perché mi arriva dal sistema preventivo/motore new JobStepModel { JobStepID = 1, JobID = 2, Index = 1, CostDriverID = 3, PhaseID = 1, ProductivityRate = 1, ResourceID = 1 }, // taglio profilo su linea saomad, considero 1 perché mi arriva dal sistema preventivo/motore new JobStepModel { JobStepID = 2, JobID = 2, Index = 2, CostDriverID = 2, PhaseID = 2, ProductivityRate = 1, ResourceID = 2 }, // verniciatura automatica, considero 1 perché mi arriva dal sistema preventivo/motore new JobStepModel { JobStepID = 3, JobID = 2, Index = 3, CostDriverID = 3, PhaseID = 3, ProductivityRate = 1, ResourceID = 4 }, // assemblaggio new JobStepModel { JobStepID = 4, JobID = 2, Index = 4, CostDriverID = 3, PhaseID = 4, ProductivityRate = 1, ResourceID = 6 }, // installazione new JobStepModel { JobStepID = 5, JobID = 2, Index = 5, CostDriverID = 3, PhaseID = 6, ProductivityRate = 1, ResourceID = 7 } ); // init item righe ciclo (articoli + prodotti delle fasi del ciclo) modelBuilder.Entity().HasData( // eventuale scarto del materiale tra grezzo e finito--> porta ad un numero >1 (QUI NON USATO, ho il valore calcolato dal motore) new JobStepItemModel { JobStepItemID = 1, JobStepID = 1, Index = 1, ItemID = 1, Qty = 1, Description = "Grezzo legno abete" }, // 1/10 litro di vernice per metro lineare prodotto new JobStepItemModel { JobStepItemID = 2, JobStepID = 3, Index = 2, ItemID = 8, Qty = 0.1, Description = "Vernice trasparente standard 1L" }, // uso un KIT intero (vs specifico n prodotti singoli) x questo modello; se dal preventivo arrivano n pezzi spcifici, qui li esplodiamo new JobStepItemModel { JobStepItemID = 3, JobStepID = 4, Index = 3, ItemID = 9, Qty = 1, Description = "Ferramenta AGB - rif. AGFD.00000.00000" } ); // inizializzazione dei valori di default x SellingItem modelBuilder.Entity().HasData( new SellingItemModel { SellingItemID = 1, IsService = false, Description = "Finestra anta Singola", Cost = 820, Margin = 0.2, JobID = 2 }, new SellingItemModel { SellingItemID = 2, IsService = false, Description = "Persiana anta singola", Cost = 150, Margin = 0.1, JobID = 1 }, new SellingItemModel { SellingItemID = 3, IsService = true, Description = "Installazione", Cost = 200, Margin = 0.3, JobID = 1 } ); // inizializzazione dei valori di default x Offer modelBuilder.Entity().HasData( new OfferModel { OfferID = 1, RefYear = 2024, RefNum = 1, RefRev = 1, Description = "Offerta per tre serramenti", CustomerID = 2, DealerID = 2 } //new OfferModel { OfferID = 2, RefYear = 2025, RefNum = 2, RefRev = 1, Name = "Offerta per un serramento + installazione", CustomerID = 1, DealerID = 1 }, //new OfferModel { OfferID = 3, RefYear = 2025, RefNum = 3, RefRev = 1, Name = "Offerta per tre serramenti", CustomerID = 2, DealerID = 1 }, //new OfferModel { OfferID = 5, RefYear = 2025, RefNum = 4, RefRev = 2, Name = "Offerta per cinque serramenti + installazione", CustomerID = 3, DealerID = 2 } ); // inizializzazione dei valori di default x OfferRow modelBuilder.Entity().HasData( new OfferRowModel { OfferRowID = 1, OfferID = 1, OfferRowUID = $"OFF{DateTime.Today:yy}0000000001", Inserted = DateTime.Now, Modified = DateTime.Now, BomCost = 900, BomPrice = 950, SellingItemID = 1, Qty = 3, RowNum = 1, SerStruct = "{}", Note = "Finestra anta singola 2025", ItemSteps = "{}", BomOk = true, ItemOk = true }, new OfferRowModel { OfferRowID = 2, OfferID = 1, OfferRowUID = $"OFF{DateTime.Today:yy}0000000002", Inserted = DateTime.Now, Modified = DateTime.Now, BomCost = 160, BomPrice = 200, SellingItemID = 2, Qty = 3, RowNum = 2, SerStruct = "{}", Note = "Persiana per Finestra anta singola 2025", ItemSteps = "{}", BomOk = true, ItemOk = true }, new OfferRowModel { OfferRowID = 3, OfferID = 1, OfferRowUID = $"OFF{DateTime.Today:yy}0000000003", Inserted = DateTime.Now, Modified = DateTime.Now, BomCost = 200, BomPrice = 250, SellingItemID = 3, Qty = 3, RowNum = 3, SerStruct = "{}", Note = "Installazione serramento", ItemSteps = "{}", BomOk = true, ItemOk = true } ); } #endregion Public Methods } }