From 4dcc774745457f779908a746e75e3cb06f721078 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 1 Jan 2021 18:37:05 +0000 Subject: [PATCH] --- .vscode/launch.json | 2 +- server/AyaNova/biz/UnitBiz.cs | 6 ++ server/AyaNova/models/Unit.cs | 8 +++ server/AyaNova/util/AySchema.cs | 4 +- server/AyaNova/util/Seeder.cs | 113 +++++++++++++++++++++++--------- 5 files changed, 98 insertions(+), 35 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 8fd97968..6d395cd7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -54,7 +54,7 @@ "AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles", "AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles", "AYANOVA_SERVER_TEST_MODE": "true", - "AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small", + "AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "huge", "AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7", "AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_13\\bin\\" }, diff --git a/server/AyaNova/biz/UnitBiz.cs b/server/AyaNova/biz/UnitBiz.cs index 53115e3f..52805818 100644 --- a/server/AyaNova/biz/UnitBiz.cs +++ b/server/AyaNova/biz/UnitBiz.cs @@ -214,6 +214,12 @@ namespace AyaNova.Biz .AddText(obj.Text2) .AddText(obj.Text3) .AddText(obj.Text4) + .AddText(obj.Address) + .AddText(obj.City) + .AddText(obj.Region) + .AddText(obj.Country) + .AddText(obj.Latitude) + .AddText(obj.Longitude) .AddCustomFields(obj.CustomFields); } diff --git a/server/AyaNova/models/Unit.cs b/server/AyaNova/models/Unit.cs index 1d21f477..82e43137 100644 --- a/server/AyaNova/models/Unit.cs +++ b/server/AyaNova/models/Unit.cs @@ -45,6 +45,14 @@ namespace AyaNova.Models public string Text3 { get; set; } public string Text4 { get; set; } + //PHYSICAL ADDRESS + public string Address { get; set; } + public string City { get; set; } + public string Region { get; set; } + public string Country { get; set; } + public decimal? Latitude { get; set; } + public decimal? Longitude { get; set; } + public Unit() { Tags = new List(); diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 69a54832..4ec00c2d 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -22,7 +22,7 @@ namespace AyaNova.Util //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!! private const int DESIRED_SCHEMA_LEVEL = 15; - internal const long EXPECTED_COLUMN_COUNT = 614; + internal const long EXPECTED_COLUMN_COUNT = 620; internal const long EXPECTED_INDEX_COUNT = 175; //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!! @@ -731,7 +731,7 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); "unitmodelid bigint null references aunitmodel(id), unithasownaddress bool, boughthere bool, purchasedfromvendorid bigint null references avendor(id), " + "receipt text null, purchaseddate timestamp null, description text null, replacedbyunitid bigint null references aunit(id), " + "overridemodelwarranty bool, warrantylength integer null, warrantyterms text null, usesbanking bool, metered bool, lifetimewarranty bool, " + - "text1 text null, text2 text null, text3 text null, text4 text null, " + + "text1 text null, text2 text null, text3 text null, text4 text null, address text null, city text null, region text null, country text null, latitude decimal(8,6) null, longitude decimal(9,6) null, " + "CONSTRAINT UNQ_UnitSerialModelId UNIQUE (serial, unitmodelid) " + " )"); diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 08ab812d..7be6c99e 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -241,6 +241,9 @@ namespace AyaNova.Util //UNITMODELS await SeedUnitModelAsync(log, 10); + //UNITS + await SeedUnitAsync(log, 500);//5 times the customers or 5 units per customer + //PERF watch.Stop(); @@ -313,6 +316,10 @@ namespace AyaNova.Util //UNITMODELS await SeedUnitModelAsync(log, 25); + + //UNITS + await SeedUnitAsync(log, 2500);//5 times the customers or 5 units per customer + //PERF watch.Stop(); await LogStatusAsync(JobId, LogJob, log, $"MEDIUM level sample data seeded in {watch.ElapsedMilliseconds} ms"); @@ -397,6 +404,10 @@ namespace AyaNova.Util //UNITMODELS await SeedUnitModelAsync(log, 30); + + //UNITS + await SeedUnitAsync(log, 25000);//5 times the customers or 5 units per customer + //PERF watch.Stop(); await LogStatusAsync(JobId, LogJob, log, $"LARGE level sample data seeded in {watch.ElapsedMilliseconds} ms"); @@ -480,6 +491,9 @@ namespace AyaNova.Util //UNITMODELS await SeedUnitModelAsync(log, 40); + + //UNITS + await SeedUnitAsync(log, 100000);//5 times the customers or 5 units per customer //PERF watch.Stop(); @@ -870,7 +884,7 @@ namespace AyaNova.Util public HashSet HashUserNames = new HashSet(); - private int TotalSeededUserCount = 0; + private int TotalSeededUsers = 0; public async Task SeedUserAsync( ILogger log, int count, AuthorizationRoles roles, UserType userType, @@ -910,7 +924,7 @@ namespace AyaNova.Util u.Password = u.Login; u.Roles = roles; u.UserType = userType; - u.EmployeeNumber = "A-" + (454 + TotalSeededUserCount + x).ToString() + "-Y"; + u.EmployeeNumber = "A-" + (454 + TotalSeededUsers + x).ToString() + "-Y"; u.Notes = Fake.Lorem.Sentence(null, 5);//Fake.Lorem.Paragraph(2); //TODO: After have USER and HEADOFFICE and VENDOR, if usertype is subcontractor or client or headoffice it needs to set a corresponding user's parent org record id to go with it //use provided tags or generate them @@ -940,7 +954,7 @@ namespace AyaNova.Util { UserBiz biz = UserBiz.GetBiz(ct); var NewObject = await biz.CreateAsync(u); - TotalSeededUserCount++; + TotalSeededUsers++; if (NewObject == null) { log.LogError($"Seeder::SeedUser error creating {u.Name}\r\n" + biz.GetErrorsAsString()); @@ -982,7 +996,7 @@ namespace AyaNova.Util o.UserType = randomUserType; o.Notes = Fake.Lorem.Sentence(null, 5); o.Tags = RandomTags(); - o.UserId = Fake.Random.Int(1, TotalSeededUserCount); + o.UserId = Fake.Random.Int(1, TotalSeededUsers); //RANDOM CUSTOM FIELD DATA var c1 = DateUtil.UniversalISO8661Format(Fake.Date.Between(DateTime.Now.AddYears(-1), DateTime.Now.AddYears(1))); @@ -1010,7 +1024,7 @@ namespace AyaNova.Util public HashSet HashCompanyNames = new HashSet(); -private int TotalSeededCustomers=0; + private int TotalSeededCustomers = 0; ////////////////////////////////////////////////////// //CUSTOMER @@ -1076,7 +1090,7 @@ private int TotalSeededCustomers=0; } -private int TotalSeededHeadOffices= + private int TotalSeededHeadOffices = 0; ////////////////////////////////////////////////////// //HEADOFFICE // @@ -1118,7 +1132,7 @@ private int TotalSeededHeadOffices= { HeadOfficeBiz biz = HeadOfficeBiz.GetBiz(ct); var NewObject = await biz.CreateAsync(o); - + TotalSeededHeadOffices++; if (NewObject == null) { var err = $"Seeder::SeedHeadOffice error creating {o.Name}\r\n{biz.GetErrorsAsString()}"; @@ -1135,7 +1149,7 @@ private int TotalSeededHeadOffices= } - + private int TotalSeededVendors = 0; ////////////////////////////////////////////////////// //VENDOR // @@ -1176,7 +1190,7 @@ private int TotalSeededHeadOffices= { VendorBiz biz = VendorBiz.GetBiz(ct); var NewObject = await biz.CreateAsync(o); - + TotalSeededVendors++; if (NewObject == null) { var err = $"Seeder::SeedVendor error creating {o.Name}\r\n{biz.GetErrorsAsString()}"; @@ -1191,7 +1205,7 @@ private int TotalSeededHeadOffices= public HashSet HashProjectNames = new HashSet(); - + private int TotalSeededProjects = 0; ////////////////////////////////////////////////////// //PROJECT // @@ -1215,7 +1229,7 @@ private int TotalSeededHeadOffices= o.DateStarted = dtSeed; if (Fake.Random.Number(9) != 5) o.DateCompleted = dtSeed.AddDays(Fake.Random.Long(2, 100)); - o.ProjectOverseerId = Fake.Random.Long(2, 13); + o.ProjectOverseerId = Fake.Random.Long(2, 13);//NOTE: this is exactly 13 not total seeded users because it needs to be inside users and they're seeded first //This seems wrong to do in a loop but is 4 times faster this way ?!? @@ -1223,7 +1237,7 @@ private int TotalSeededHeadOffices= { ProjectBiz biz = ProjectBiz.GetBiz(ct); var NewObject = await biz.CreateAsync(o); - + TotalSeededProjects++; if (NewObject == null) { var err = $"Seeder::SeedProject error creating {o.Name}\r\n{biz.GetErrorsAsString()}"; @@ -1351,7 +1365,7 @@ private int TotalSeededHeadOffices= o.Active = true; o.Notes = Fake.Lorem.Sentence(); o.Tags = RandomTags(); - o.VendorId = Fake.Random.Long(1, 10); + o.VendorId = Fake.Random.Long(1, TotalSeededVendors);//random picks in range Inclusive but sql id's start at 1 so this is kosher (not zero based) o.UPC = Fake.Commerce.Ean13(); o.LifeTimeWarranty = false; o.IntroducedDate = Fake.Date.Between(seedStartWindow, DateTime.Now).ToUniversalTime(); @@ -1378,12 +1392,13 @@ private int TotalSeededHeadOffices= public HashSet HashUnitNames = new HashSet(); + private int TotalSeededUnits = 0; ////////////////////////////////////////////////////// //UNIT // public async Task SeedUnitAsync(ILogger log, int count) { - DateTime seedStartWindow = DateTime.Now.AddYears(-5); + DateTime seedStartWindow = DateTime.Now.AddYears(-10); DateTime seedEndWindow = DateTime.Now.AddYears(1); var WarrantyMonths = new[] { 1, 6, 12, 24, 36 }; var WarrantyTerms = new[] { "Parts only", "Parts and service", "Service only", "Shipping parts and service", "First month parts and service here; after is depot only" }; @@ -1394,35 +1409,69 @@ private int TotalSeededHeadOffices= do { - o.Name = $"{Fake.Vehicle.Model()} {Fake.Commerce.Categories(1)[0]}"; - } while (!HashUnitModelNames.Add(o.Name)); - - do - { - o.Number = Fake.Finance.Account(6); - } while (!HashUnitModelNames.Add(o.Number)); + o.Serial = Fake.Finance.Account(); + } while (!HashUnitNames.Add(o.Serial)); o.Active = true; o.Notes = Fake.Lorem.Sentence(); o.Tags = RandomTags(); - o.VendorId = Fake.Random.Long(1, 10); - o.UPC = Fake.Commerce.Ean13(); - o.LifeTimeWarranty = false; - o.IntroducedDate = Fake.Date.Between(seedStartWindow, DateTime.Now).ToUniversalTime(); - o.Discontinued = false; - o.DiscontinuedDate = null; - o.WarrantyLength = Fake.PickRandom(WarrantyMonths); - o.WarrantyTerms = Fake.PickRandom(WarrantyTerms); + //Override model warranty 5% chance (1/20) + if (Fake.Random.Number(1, 20) == 5) + { + o.OverrideModelWarranty = true; + o.LifeTimeWarranty = false; + o.WarrantyLength = Fake.PickRandom(WarrantyMonths); + o.WarrantyTerms = Fake.PickRandom(WarrantyTerms); + } + + o.CustomerId = Fake.Random.Long(1, TotalSeededCustomers); + o.UnitModelId = Fake.Random.Long(1, TotalSeededUnitModels); + o.BoughtHere = true; + + //Unit bought elsewhere 10% chance (1/10) + if (Fake.Random.Number(1, 10) == 5) + { + o.BoughtHere = false; + o.PurchasedFromVendorId = Fake.Random.Long(1, TotalSeededVendors); + } + + o.Receipt=Fake.Finance.Account(6); + o.PurchasedDate=Fake.Date.Between(seedStartWindow, DateTime.Now).ToUniversalTime(); + o.Description=Fake.Commerce.ProductName(); + o.ReplacedByUnitId=null; + //for now no banked units in seeds + o.UsesBanking=false; + o.Metered=false;//for now no meters either + o.Text1=null; + o.Text2=null; + o.Text3=null; + o.Text4=null; + + //Unit has own address 5% chance (1/20) + if (Fake.Random.Number(1, 20) == 5) + { + o.UnitHasOwnAddress = true; + o.Latitude = (decimal)Fake.Address.Latitude(); + o.Longitude = (decimal)Fake.Address.Longitude(); + o.Address = Fake.Address.StreetAddress(); + o.City = Fake.Address.City(); + o.Region = Fake.Address.State(); + o.Country = Fake.Address.Country(); + } + else + { + o.UnitHasOwnAddress = false; + } //This seems wrong to do in a loop but is 4 times faster this way ?!? using (AyContext ct = ServiceProviderProvider.DBContext) { - UnitModelBiz biz = UnitModelBiz.GetBiz(ct); + UnitBiz biz = UnitBiz.GetBiz(ct); var NewObject = await biz.CreateAsync(o); - + TotalSeededUnits++; if (NewObject == null) { - var err = $"Seeder::SeedUnitModel error creating {o.Name}\r\n{biz.GetErrorsAsString()}"; + var err = $"Seeder::SeedUnit error creating {o.Serial}\r\n{biz.GetErrorsAsString()}"; log.LogError(err); throw new System.Exception(err); }