From eab0a2b989813ee533dd9d8bcb320451fcdc0996 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 21 Feb 2022 20:52:05 +0000 Subject: [PATCH] --- docs/8.0/ayanova/docs/home-password.md | 4 +- server/AyaNova/util/Seeder.cs | 996 +++++++++++++------------ 2 files changed, 504 insertions(+), 496 deletions(-) diff --git a/docs/8.0/ayanova/docs/home-password.md b/docs/8.0/ayanova/docs/home-password.md index 7e78f3a7..52cacac3 100644 --- a/docs/8.0/ayanova/docs/home-password.md +++ b/docs/8.0/ayanova/docs/home-password.md @@ -22,9 +22,9 @@ You can click on the eye icon to conceal your entry from onlookers. Current (2022) security industry best practices around passwords focus entirely on length and not 'complexity' and AyaNova fully supports this by allowing very lengthy passwords and not requiring any special characters. -For the highest security ensure your password is as long as you can comfortably remember without writing it down. +For the highest security ensure your password is **at minimum** 15 characters long or as long as you can comfortably remember without writing it down. -We recommend using a lengthy but easily remembered phrase as a password, for example a song lyric or a line from a poem that is 32 characters or more of words is currently *extremely* difficult to hack by brute force methods. +We recommend using a lengthy but easily remembered phrase as a password, for example a song lyric or a line from a poem that is **at least** 15 characters or more of words is currently *extremely* difficult to hack by brute force methods. There is no security advantage in modern practice to using mixed case, unusual symbols or numbers in your password as brute force hacking techniques try all enterable characters anyway. diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index de36eb30..27814002 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -245,12 +245,12 @@ namespace AyaNova.Util await SeedLoanLoanUnitAsync(log, 5); await SeedCustomerServiceRequestAsync(log, 5); await SeedPartWarehouseAsync(log, 5); - await SeedPartAsync(log, 20, 100); + await SeedPartAsync(log, 20, 1000); await SeedPartAssemblyAsync(log, 5); await SeedPurchaseOrderAsync(log, 10); await SeedQuoteAsync(log, 5); await SeedPMAsync(log, 3); - await SeedWorkOrderAsync(log, 100, slevel); + await SeedWorkOrderAsync(log, slevel); //PERF watch.Stop(); @@ -312,12 +312,12 @@ namespace AyaNova.Util await SeedLoanLoanUnitAsync(log, 10); await SeedCustomerServiceRequestAsync(log, 10); await SeedPartWarehouseAsync(log, 10); - await SeedPartAsync(log, 100, 100); + await SeedPartAsync(log, 100, 1000); await SeedPartAssemblyAsync(log, 5); await SeedPurchaseOrderAsync(log, 30); await SeedQuoteAsync(log, 5); await SeedPMAsync(log, 3); - await SeedWorkOrderAsync(log, 900, slevel); + await SeedWorkOrderAsync(log, slevel); //PERF watch.Stop(); @@ -387,12 +387,12 @@ namespace AyaNova.Util await SeedLoanLoanUnitAsync(log, 20); await SeedCustomerServiceRequestAsync(log, 20); await SeedPartWarehouseAsync(log, 20); - await SeedPartAsync(log, 200, 100); + await SeedPartAsync(log, 200, 1000); await SeedPartAssemblyAsync(log, 5); await SeedPurchaseOrderAsync(log, 50); await SeedQuoteAsync(log, 5); await SeedPMAsync(log, 3); - await SeedWorkOrderAsync(log, 1800, slevel); + await SeedWorkOrderAsync(log, slevel); //PERF watch.Stop(); @@ -462,12 +462,12 @@ namespace AyaNova.Util await SeedLoanLoanUnitAsync(log, 200); await SeedCustomerServiceRequestAsync(log, 200); await SeedPartWarehouseAsync(log, 200); - await SeedPartAsync(log, 10000, 100); + await SeedPartAsync(log, 10000, 1000); await SeedPartAssemblyAsync(log, 500); await SeedPurchaseOrderAsync(log, 1000); await SeedQuoteAsync(log, 10); await SeedPMAsync(log, 3);//DO NOT want too many of these as they affect performance - await SeedWorkOrderAsync(log, 3600, slevel); + await SeedWorkOrderAsync(log, slevel); //PERF watch.Stop(); @@ -2808,7 +2808,8 @@ namespace AyaNova.Util ////////////////////////////////////////////////////// //WORK ORDER // - public async Task SeedWorkOrderAsync(ILogger log, int count, Level.SeedLevel seedLevel) + //public async Task SeedWorkOrderAsync(ILogger log, int count, Level.SeedLevel seedLevel) + public async Task SeedWorkOrderAsync(ILogger log, Level.SeedLevel seedLevel) { //Goal is 5 workorders per day for each level and window //accepting that some days will have way more and some none, it's ok @@ -2829,7 +2830,6 @@ namespace AyaNova.Util case Level.SeedLevel.Large: PastMonthsToSeed = 11; MaximumWorkOrderItemCount = 2; - woItemUnitCount = 1; break; case Level.SeedLevel.Huge: @@ -2842,527 +2842,535 @@ namespace AyaNova.Util DateTime seedStartWindow = DateTime.UtcNow.AddMonths(-PastMonthsToSeed);//goes back based on seed level DateTime seedEndWindow = DateTime.UtcNow.AddMonths(1);//always one month from now - for (int x = 0; x < count; x++) + int totalDays = (int)(seedEndWindow - seedStartWindow).TotalDays; + + + //generate 5 per day starting with oldest seed start window up to seed end window + + for (int x = 0; x < totalDays; x++) { - WorkOrder o = new WorkOrder(); - o.Notes = Fake.Lorem.Sentence(null, 6); - o.Tags = RandomTags(); - if (Fake.Random.Bool())//50% have projects - o.ProjectId = Fake.Random.Long(1, TotalSeededProjects); - var tempDate = Fake.Date.Between(seedStartWindow, seedEndWindow); - var tempHour = Fake.Random.Int(9, 17);//9am to 5 pm (except some times may be in different dst state so this will be out by an hour for example depending on time of year and time zone in question) - var woDate = DesiredTimeInUtc(new DateTime(tempDate.Year, tempDate.Month, tempDate.Day, tempHour, 0, 0, DateTimeKind.Utc)); - bool isPast = (woDate.Subtract(DateTime.UtcNow).TotalDays < -7); - - o.CreatedDate = woDate > DateTime.UtcNow ? DateTime.UtcNow : woDate;//no created dates in future but want a range of past dates to show off age of wo - o.CompleteByDate = woDate.AddDays(5); - // o.CustomerContactName = "contact name here"; - o.CustomerId = GetRandomCustomerId();//Fake.Random.Long(1, TotalSeededCustomers); - - using (AyContext ct = ServiceProviderProvider.DBContext) + for (int perDay = 0; perDay < 4; perDay++) { - var cust = await ct.Customer.AsNoTracking().FirstAsync(z => z.Id == o.CustomerId); - o.Latitude = cust.Latitude; - o.Longitude = cust.Longitude; - o.Address = cust.Address; - o.City = cust.City; - o.Region = cust.Region; - o.Country = cust.Country; + WorkOrder o = new WorkOrder(); + o.Notes = Fake.Lorem.Sentence(null, 6); + o.Tags = RandomTags(); + if (Fake.Random.Bool())//50% have projects + o.ProjectId = Fake.Random.Long(1, TotalSeededProjects); + var tempDate = seedStartWindow.AddDays(x); + var tempHour = Fake.Random.Int(9, 17);//9am to 5 pm (except some times may be in different dst state so this will be out by an hour for example depending on time of year and time zone in question) + var woDate = DesiredTimeInUtc(new DateTime(tempDate.Year, tempDate.Month, tempDate.Day, tempHour, 0, 0, DateTimeKind.Utc)); + bool isPast = (woDate.Subtract(DateTime.UtcNow).TotalDays < -7); + o.CreatedDate = woDate > DateTime.UtcNow ? DateTime.UtcNow : woDate;//no created dates in future but want a range of past dates to show off age of wo + o.CompleteByDate = woDate.AddDays(5); + // o.CustomerContactName = "contact name here"; + o.CustomerId = GetRandomCustomerId();//Fake.Random.Long(1, TotalSeededCustomers); - if (cust.BillHeadOffice && cust.HeadOfficeId != null) + using (AyContext ct = ServiceProviderProvider.DBContext) { - var head = await ct.HeadOffice.AsNoTracking().FirstAsync(z => z.Id == cust.HeadOfficeId); - o.PostAddress = head.PostAddress; - o.PostCity = head.PostCity; - o.PostRegion = head.PostRegion; - o.PostCountry = head.PostCountry; - o.PostCode = head.PostCode; - } - else - { - - o.PostAddress = cust.PostAddress; - o.PostCity = cust.PostCity; - o.PostRegion = cust.PostRegion; - o.PostCountry = cust.PostCountry; - o.PostCode = cust.PostCode; - } - } + var cust = await ct.Customer.AsNoTracking().FirstAsync(z => z.Id == o.CustomerId); + o.Latitude = cust.Latitude; + o.Longitude = cust.Longitude; + o.Address = cust.Address; + o.City = cust.City; + o.Region = cust.Region; + o.Country = cust.Country; - o.CustomerReferenceNumber = "crf-" + Fake.Finance.Account(4); - o.InternalReferenceNumber = "irf-" + Fake.Finance.Account(4); - o.ServiceDate = woDate; - - var actualWorkorderItemCount = Fake.Random.Int(1, MaximumWorkOrderItemCount); - for (int y = 0; y < actualWorkorderItemCount; y++) - { - var woItem = new WorkOrderItem() - { - Sequence = y + 1, - Notes = $"itemnotes - {y} ", - TechNotes = $"technotes - {y}", - RequestDate = woDate.AddMinutes(y), - WorkOrderItemPriorityId = Fake.Random.Long(1, 5),//there are 5 different sample priorities - WorkOrderItemStatusId = Fake.Random.Long(1, 3)//there are 3 different sample woitem status - }; - - //UNITS - for (int a = 0; a < woItemUnitCount; a++) - { - var woItemUnit = new WorkOrderItemUnit() + if (cust.BillHeadOffice && cust.HeadOfficeId != null) { - UnitId = GetNextUnitForCustomer(o.CustomerId), - Notes = Fake.Lorem.Sentence(null, 3) + var head = await ct.HeadOffice.AsNoTracking().FirstAsync(z => z.Id == cust.HeadOfficeId); + o.PostAddress = head.PostAddress; + o.PostCity = head.PostCity; + o.PostRegion = head.PostRegion; + o.PostCountry = head.PostCountry; + o.PostCode = head.PostCode; + } + else + { + + o.PostAddress = cust.PostAddress; + o.PostCity = cust.PostCity; + o.PostRegion = cust.PostRegion; + o.PostCountry = cust.PostCountry; + o.PostCode = cust.PostCode; + } + } + + + o.CustomerReferenceNumber = "crf-" + Fake.Finance.Account(4); + o.InternalReferenceNumber = "irf-" + Fake.Finance.Account(4); + o.ServiceDate = woDate; + + var actualWorkorderItemCount = Fake.Random.Int(1, MaximumWorkOrderItemCount); + for (int y = 0; y < actualWorkorderItemCount; y++) + { + var woItem = new WorkOrderItem() + { + Sequence = y + 1, + Notes = $"itemnotes - {y} ", + TechNotes = $"technotes - {y}", + RequestDate = woDate.AddMinutes(y), + WorkOrderItemPriorityId = Fake.Random.Long(1, 5),//there are 5 different sample priorities + WorkOrderItemStatusId = Fake.Random.Long(1, 3)//there are 3 different sample woitem status }; - woItem.Units.Add(woItemUnit); - } - //SCHEDULED USERS - var actualScheduledUserCount = Fake.Random.Int(1, 2); - for (int a = 0; a < actualScheduledUserCount; a++) - { - var randomStart = Fake.Random.Int(0, 5); - var randomHours = Fake.Random.Int(1, 4); - // var randomDays = Fake.Random.Int(0, 3); - var randomStop = randomStart + randomHours; - var woItemScheduledUser = new WorkOrderItemScheduledUser() + //UNITS + for (int a = 0; a < woItemUnitCount; a++) { - UserId = RandomServiceTechUserId(), - EstimatedQuantity = randomHours, - StartDate = woDate.AddHours(randomStart),//.AddDays(randomDays), - StopDate = woDate.AddHours(randomStop)//.AddDays(randomDays) + var woItemUnit = new WorkOrderItemUnit() + { + UnitId = GetNextUnitForCustomer(o.CustomerId), + Notes = Fake.Lorem.Sentence(null, 3) + }; + woItem.Units.Add(woItemUnit); + } + + //SCHEDULED USERS + var actualScheduledUserCount = Fake.Random.Int(1, 2); + for (int a = 0; a < actualScheduledUserCount; a++) + { + var randomStart = Fake.Random.Int(0, 5); + var randomHours = Fake.Random.Int(1, 4); + // var randomDays = Fake.Random.Int(0, 3); + var randomStop = randomStart + randomHours; + var woItemScheduledUser = new WorkOrderItemScheduledUser() + { + UserId = RandomServiceTechUserId(), + EstimatedQuantity = randomHours, + StartDate = woDate.AddHours(randomStart),//.AddDays(randomDays), + StopDate = woDate.AddHours(randomStop)//.AddDays(randomDays) + }; + woItem.ScheduledUsers.Add(woItemScheduledUser); + } + + // { + // var randomStart = Fake.Random.Int(0, 5); + // var randomHours = Fake.Random.Int(1, 4); + // var randomDays = Fake.Random.Int(0, 3); + // var randomStop = randomStart + randomHours; + // var woItemScheduledUser = new WorkOrderItemScheduledUser() + // { + // UserId = RandomServiceTechUserId(), + // EstimatedQuantity = randomHours, + // StartDate = woDate.AddHours(randomStart).AddDays(randomDays), + // StopDate = woDate.AddHours(randomStop).AddDays(randomDays) + // }; + // woItem.ScheduledUsers.Add(woItemScheduledUser); + // } + + // { + // var randomStart = Fake.Random.Int(0, 5); + // var randomHours = Fake.Random.Int(1, 4); + // var randomDays = Fake.Random.Int(0, 3); + // var randomStop = randomStart + randomHours; + // var woItemScheduledUser = new WorkOrderItemScheduledUser() + // { + // UserId = RandomServiceTechUserId(), + // EstimatedQuantity = randomHours, + // StartDate = woDate.AddHours(randomStart).AddDays(randomDays), + // StopDate = woDate.AddHours(randomStop).AddDays(randomDays) + // }; + // woItem.ScheduledUsers.Add(woItemScheduledUser); + // } + + // { + // var randomStart = Fake.Random.Int(0, 5); + // var randomHours = Fake.Random.Int(1, 4); + // var randomDays = Fake.Random.Int(0, 3); + // var randomStop = randomStart + randomHours; + // var woItemScheduledUser = new WorkOrderItemScheduledUser() + // { + // UserId = RandomServiceTechUserId(), + // EstimatedQuantity = randomHours, + // StartDate = woDate.AddHours(randomStart).AddDays(randomDays), + // StopDate = woDate.AddHours(randomStop).AddDays(randomDays) + // }; + // woItem.ScheduledUsers.Add(woItemScheduledUser); + // } + + // if (y == 1) + // { + // //known tech and subcontractor on every item + // var woItemScheduledUser = new WorkOrderItemScheduledUser() + // { + // UserId = KnownUserTechId, + // EstimatedQuantity = 2, + // StartDate = woDate, + // StopDate = woDate.AddHours(2) + // }; + // woItem.ScheduledUsers.Add(woItemScheduledUser); + + // woItemScheduledUser = new WorkOrderItemScheduledUser() + // { + // UserId = KnownUserSubContractorId, + // EstimatedQuantity = 2, + // StartDate = woDate, + // StopDate = woDate.AddHours(2) + // }; + // woItem.ScheduledUsers.Add(woItemScheduledUser); + // } + + // if (y == 3) + // { + // //known restricted tech and subcontractor on some items + // var woItemScheduledUser = new WorkOrderItemScheduledUser() + // { + // UserId = KnownUserTechRestrictedId, + // EstimatedQuantity = 2, + // StartDate = woDate, + // StopDate = woDate.AddHours(2) + // }; + // woItem.ScheduledUsers.Add(woItemScheduledUser); + + // woItemScheduledUser = new WorkOrderItemScheduledUser() + // { + // UserId = KnownUserSubContractorRestrictedId, + // EstimatedQuantity = 2, + // StartDate = woDate, + // StopDate = woDate.AddHours(2) + // }; + // woItem.ScheduledUsers.Add(woItemScheduledUser); + // } + ///////////////////////////////////////// + + //PARTS + var woItemPart = new WorkOrderItemPart() + { + + Quantity = 1, + PartId = Fake.Random.Long(1, TotalSeededParts), + PartWarehouseId = 1 }; - woItem.ScheduledUsers.Add(woItemScheduledUser); - } + woItem.Parts.Add(woItemPart); - // { - // var randomStart = Fake.Random.Int(0, 5); - // var randomHours = Fake.Random.Int(1, 4); - // var randomDays = Fake.Random.Int(0, 3); - // var randomStop = randomStart + randomHours; - // var woItemScheduledUser = new WorkOrderItemScheduledUser() - // { - // UserId = RandomServiceTechUserId(), - // EstimatedQuantity = randomHours, - // StartDate = woDate.AddHours(randomStart).AddDays(randomDays), - // StopDate = woDate.AddHours(randomStop).AddDays(randomDays) - // }; - // woItem.ScheduledUsers.Add(woItemScheduledUser); - // } - - // { - // var randomStart = Fake.Random.Int(0, 5); - // var randomHours = Fake.Random.Int(1, 4); - // var randomDays = Fake.Random.Int(0, 3); - // var randomStop = randomStart + randomHours; - // var woItemScheduledUser = new WorkOrderItemScheduledUser() - // { - // UserId = RandomServiceTechUserId(), - // EstimatedQuantity = randomHours, - // StartDate = woDate.AddHours(randomStart).AddDays(randomDays), - // StopDate = woDate.AddHours(randomStop).AddDays(randomDays) - // }; - // woItem.ScheduledUsers.Add(woItemScheduledUser); - // } - - // { - // var randomStart = Fake.Random.Int(0, 5); - // var randomHours = Fake.Random.Int(1, 4); - // var randomDays = Fake.Random.Int(0, 3); - // var randomStop = randomStart + randomHours; - // var woItemScheduledUser = new WorkOrderItemScheduledUser() - // { - // UserId = RandomServiceTechUserId(), - // EstimatedQuantity = randomHours, - // StartDate = woDate.AddHours(randomStart).AddDays(randomDays), - // StopDate = woDate.AddHours(randomStop).AddDays(randomDays) - // }; - // woItem.ScheduledUsers.Add(woItemScheduledUser); - // } - - // if (y == 1) - // { - // //known tech and subcontractor on every item - // var woItemScheduledUser = new WorkOrderItemScheduledUser() - // { - // UserId = KnownUserTechId, - // EstimatedQuantity = 2, - // StartDate = woDate, - // StopDate = woDate.AddHours(2) - // }; - // woItem.ScheduledUsers.Add(woItemScheduledUser); - - // woItemScheduledUser = new WorkOrderItemScheduledUser() - // { - // UserId = KnownUserSubContractorId, - // EstimatedQuantity = 2, - // StartDate = woDate, - // StopDate = woDate.AddHours(2) - // }; - // woItem.ScheduledUsers.Add(woItemScheduledUser); - // } - - // if (y == 3) - // { - // //known restricted tech and subcontractor on some items - // var woItemScheduledUser = new WorkOrderItemScheduledUser() - // { - // UserId = KnownUserTechRestrictedId, - // EstimatedQuantity = 2, - // StartDate = woDate, - // StopDate = woDate.AddHours(2) - // }; - // woItem.ScheduledUsers.Add(woItemScheduledUser); - - // woItemScheduledUser = new WorkOrderItemScheduledUser() - // { - // UserId = KnownUserSubContractorRestrictedId, - // EstimatedQuantity = 2, - // StartDate = woDate, - // StopDate = woDate.AddHours(2) - // }; - // woItem.ScheduledUsers.Add(woItemScheduledUser); - // } - ///////////////////////////////////////// - - //PARTS - var woItemPart = new WorkOrderItemPart() - { - - Quantity = 1, - PartId = Fake.Random.Long(1, TotalSeededParts), - PartWarehouseId = 1 - }; - woItem.Parts.Add(woItemPart); - - woItemPart = new WorkOrderItemPart() - { - - Quantity = 1, - PartId = Fake.Random.Long(1, TotalSeededParts), - PartWarehouseId = 1 - }; - woItem.Parts.Add(woItemPart); - - // //PARTREQUESTS - // if (Fake.Random.Bool())//50% - // { - // var woItemPartRequest = new WorkOrderItemPartRequest() - // { - - // Quantity = 1, - // PartId = Fake.Random.Long(1, TotalSeededParts), - // PartWarehouseId = 1, - // PurchaseOrderItemId = Fake.Random.Long(1, TotalSeededPurchaseOrders)//yes it's POITEM vs po but each po has at least one item so this will work - // }; - // woItem.PartRequests.Add(woItemPartRequest); - // } - - - //LOANERS - if (Fake.Random.Bool())//50% - { - var woItemLoan = new WorkOrderItemLoan() + woItemPart = new WorkOrderItemPart() { - OutDate = woDate.AddHours(1), - DueDate = woDate.AddHours(4), - Quantity = 4, - Rate = LoanUnitRateUnit.Hours, - LoanUnitId = Fake.Random.Long(1, TotalSeededLoanUnits) + + Quantity = 1, + PartId = Fake.Random.Long(1, TotalSeededParts), + PartWarehouseId = 1 }; - woItem.Loans.Add(woItemLoan); - } + woItem.Parts.Add(woItemPart); + + // //PARTREQUESTS + // if (Fake.Random.Bool())//50% + // { + // var woItemPartRequest = new WorkOrderItemPartRequest() + // { + + // Quantity = 1, + // PartId = Fake.Random.Long(1, TotalSeededParts), + // PartWarehouseId = 1, + // PurchaseOrderItemId = Fake.Random.Long(1, TotalSeededPurchaseOrders)//yes it's POITEM vs po but each po has at least one item so this will work + // }; + // woItem.PartRequests.Add(woItemPartRequest); + // } - - //LABOR - var techId = RandomServiceTechUserId(); - var woItemLabor = new WorkOrderItemLabor() - { - UserId = techId, - ServiceRateQuantity = 1, - ServiceStartDate = woDate, - ServiceStopDate = woDate.AddHours(1), - ServiceRateId = Fake.Random.Long(1, TotalSeededServiceRates), - ServiceDetails = Fake.Lorem.Sentence(null, 6) - }; - woItem.Labors.Add(woItemLabor); - if (Fake.Random.Bool())//50% - { - woItemLabor = new WorkOrderItemLabor() + //LOANERS + if (Fake.Random.Bool())//50% { - UserId = RandomServiceTechUserId(), - ServiceRateQuantity = 2, + var woItemLoan = new WorkOrderItemLoan() + { + OutDate = woDate.AddHours(1), + DueDate = woDate.AddHours(4), + Quantity = 4, + Rate = LoanUnitRateUnit.Hours, + LoanUnitId = Fake.Random.Long(1, TotalSeededLoanUnits) + }; + woItem.Loans.Add(woItemLoan); + } + + + + //LABOR + var techId = RandomServiceTechUserId(); + var woItemLabor = new WorkOrderItemLabor() + { + UserId = techId, + ServiceRateQuantity = 1, ServiceStartDate = woDate, ServiceStopDate = woDate.AddHours(1), ServiceRateId = Fake.Random.Long(1, TotalSeededServiceRates), ServiceDetails = Fake.Lorem.Sentence(null, 6) }; woItem.Labors.Add(woItemLabor); + if (Fake.Random.Bool())//50% + { + woItemLabor = new WorkOrderItemLabor() + { + UserId = RandomServiceTechUserId(), + ServiceRateQuantity = 2, + ServiceStartDate = woDate, + ServiceStopDate = woDate.AddHours(1), + ServiceRateId = Fake.Random.Long(1, TotalSeededServiceRates), + ServiceDetails = Fake.Lorem.Sentence(null, 6) + }; + woItem.Labors.Add(woItemLabor); + } + + + //TRAVEL + if (Fake.Random.Bool())//50% + { + var woItemTravel = new WorkOrderItemTravel() + { + UserId = techId, + TravelRateQuantity = 1, + TravelStartDate = woDate, + TravelStopDate = woDate.AddHours(1), + TravelRateId = Fake.Random.Long(1, TotalSeededTravelRates), + TravelDetails = Fake.Lorem.Sentence(null, 3), + Distance = Fake.Random.Int(1, 20) + }; + woItem.Travels.Add(woItemTravel); + } + + //TASKS + if (Fake.Random.Int(1, 4) == 2)//25% chance of task + { + var woItemTask = new WorkOrderItemTask() + { + CompletedByUserId = techId, + Task = "Dis-assemble", + Sequence = 1, + Status = WorkOrderItemTaskCompletionType.Complete, + CompletedDate = woDate.AddHours(1) + }; + woItem.Tasks.Add(woItemTask); + + woItemTask = new WorkOrderItemTask() + { + CompletedByUserId = techId, + Task = "Lubricate", + Sequence = 2, + Status = WorkOrderItemTaskCompletionType.NotApplicable, + CompletedDate = woDate.AddHours(1) + }; + woItem.Tasks.Add(woItemTask); + + + woItemTask = new WorkOrderItemTask() + { + CompletedByUserId = techId, + Task = "Repair", + Sequence = 3, + Status = WorkOrderItemTaskCompletionType.Complete, + CompletedDate = woDate.AddHours(1.5) + }; + woItem.Tasks.Add(woItemTask); + + woItemTask = new WorkOrderItemTask() + { + CompletedByUserId = techId, + Task = "Re-assemble", + Sequence = 4, + Status = WorkOrderItemTaskCompletionType.Complete, + CompletedDate = woDate.AddHours(2) + }; + woItem.Tasks.Add(woItemTask); + + woItemTask = new WorkOrderItemTask() + { + CompletedByUserId = techId, + Task = "Test and confirm repair", + Sequence = 5, + Status = WorkOrderItemTaskCompletionType.Complete, + CompletedDate = woDate.AddHours(2) + }; + woItem.Tasks.Add(woItemTask); + } + + + + //EXPENSES + if (Fake.Random.Int(1, 4) == 2)//25% chance + { + var cost = Fake.Random.Decimal(1, 10); + var woItemExpense = new WorkOrderItemExpense() + { + UserId = RandomServiceTechUserId(), + //TotalCost = cost, + ChargeAmount = MoneyUtil.Round(cost * 1.2m), + ChargeToCustomer = true, + ReimburseUser = true, + ChargeTaxCodeId = TCGoods, + Name = Fake.Commerce.ProductName() + + }; + woItem.Expenses.Add(woItemExpense); + + woItemExpense = new WorkOrderItemExpense() + { + UserId = RandomServiceTechUserId(), + // TotalCost = cost * 2m, + ChargeAmount = MoneyUtil.Round(cost * 2.2m), + ChargeToCustomer = true, + ReimburseUser = true, + ChargeTaxCodeId = TCGoods, + Name = Fake.Commerce.ProductName() + + }; + woItem.Expenses.Add(woItemExpense); + } + + + //OUTSIDE SERVICES + if (Fake.Random.Int(1, 10) == 2)//10% chance + { + var ShippingCost = MoneyUtil.Round(Fake.Random.Decimal(5, 20)); + var RepairCost = MoneyUtil.Round(Fake.Random.Decimal(50, 1000)); + var woItemOutsideService = new WorkOrderItemOutsideService() + { + UnitId = GetNextUnitForCustomer(o.CustomerId), + Notes = Fake.Lorem.Sentence(null, 3), + VendorSentToId = Fake.Random.Long(1, TotalSeededVendors), + VendorSentViaId = Fake.Random.Long(1, TotalSeededVendors), + RMANumber = "RMA" + Fake.Finance.Account(6), + TrackingNumber = "TR" + Fake.Finance.Account(8), + RepairCost = RepairCost, + RepairPrice = MoneyUtil.Round(RepairCost * 1.5m), + ShippingCost = ShippingCost, + ShippingPrice = MoneyUtil.Round(ShippingCost * 1.5m), + SentDate = woDate, + ETADate = woDate.AddDays(7), + ReturnDate = woDate.AddDays(8), + TaxCodeId = 1 + }; + woItem.OutsideServices.Add(woItemOutsideService); + } + // ShippingCost = Fake.Random.Decimal(5, 20); + // RepairCost = Fake.Random.Decimal(50, 1000); + // woItemOutsideService = new WorkOrderItemOutsideService() + // { + // UnitId = GetRandomUnitForCustomer(o.CustomerId), + // Notes = Fake.Lorem.Sentence(), + // VendorSentToId = Fake.Random.Long(1, TotalSeededVendors), + // VendorSentViaId = Fake.Random.Long(1, TotalSeededVendors), + // RMANumber = "RMA" + Fake.Finance.Account(6), + // TrackingNumber = "TR" + Fake.Finance.Account(8), + // RepairCost = RepairCost, + // RepairPrice = RepairCost * 1.5m, + // ShippingCost = ShippingCost, + // ShippingPrice = ShippingCost * 1.5m, + // SentDate = woDate, + // ETADate = woDate.AddDays(7), + // ReturnDate = woDate.AddDays(8), + // TaxCodeId = 1 + // }; + // woItem.OutsideServices.Add(woItemOutsideService); + + o.Items.Add(woItem); } - - //TRAVEL - if (Fake.Random.Bool())//50% - { - var woItemTravel = new WorkOrderItemTravel() - { - UserId = techId, - TravelRateQuantity = 1, - TravelStartDate = woDate, - TravelStopDate = woDate.AddHours(1), - TravelRateId = Fake.Random.Long(1, TotalSeededTravelRates), - TravelDetails = Fake.Lorem.Sentence(null, 3), - Distance = Fake.Random.Int(1, 20) - }; - woItem.Travels.Add(woItemTravel); - } - - //TASKS - if (Fake.Random.Int(1, 4) == 2)//25% chance of task - { - var woItemTask = new WorkOrderItemTask() - { - CompletedByUserId = techId, - Task = "Dis-assemble", - Sequence = 1, - Status = WorkOrderItemTaskCompletionType.Complete, - CompletedDate = woDate.AddHours(1) - }; - woItem.Tasks.Add(woItemTask); - - woItemTask = new WorkOrderItemTask() - { - CompletedByUserId = techId, - Task = "Lubricate", - Sequence = 2, - Status = WorkOrderItemTaskCompletionType.NotApplicable, - CompletedDate = woDate.AddHours(1) - }; - woItem.Tasks.Add(woItemTask); - - - woItemTask = new WorkOrderItemTask() - { - CompletedByUserId = techId, - Task = "Repair", - Sequence = 3, - Status = WorkOrderItemTaskCompletionType.Complete, - CompletedDate = woDate.AddHours(1.5) - }; - woItem.Tasks.Add(woItemTask); - - woItemTask = new WorkOrderItemTask() - { - CompletedByUserId = techId, - Task = "Re-assemble", - Sequence = 4, - Status = WorkOrderItemTaskCompletionType.Complete, - CompletedDate = woDate.AddHours(2) - }; - woItem.Tasks.Add(woItemTask); - - woItemTask = new WorkOrderItemTask() - { - CompletedByUserId = techId, - Task = "Test and confirm repair", - Sequence = 5, - Status = WorkOrderItemTaskCompletionType.Complete, - CompletedDate = woDate.AddHours(2) - }; - woItem.Tasks.Add(woItemTask); - } - - - - //EXPENSES + //sample status changes if (Fake.Random.Int(1, 4) == 2)//25% chance { - var cost = Fake.Random.Decimal(1, 10); - var woItemExpense = new WorkOrderItemExpense() { - UserId = RandomServiceTechUserId(), - //TotalCost = cost, - ChargeAmount = MoneyUtil.Round(cost * 1.2m), - ChargeToCustomer = true, - ReimburseUser = true, - ChargeTaxCodeId = TCGoods, - Name = Fake.Commerce.ProductName() + var WoState = new WorkOrderState() + { + WorkOrderStatusId = (long)SeedWOStatus.NeedsToBeAssigned, + UserId = RandomServiceTechUserId(), + Created = ((DateTime)o.ServiceDate).AddMinutes(5) + }; + o.States.Add(WoState); + o.LastStatusId = WoState.WorkOrderStatusId; + } + } - }; - woItem.Expenses.Add(woItemExpense); - - woItemExpense = new WorkOrderItemExpense() + if (Fake.Random.Int(1, 4) == 2)//25% chance + { { - UserId = RandomServiceTechUserId(), - // TotalCost = cost * 2m, - ChargeAmount = MoneyUtil.Round(cost * 2.2m), - ChargeToCustomer = true, - ReimburseUser = true, - ChargeTaxCodeId = TCGoods, - Name = Fake.Commerce.ProductName() + var WoState = new WorkOrderState() + { + WorkOrderStatusId = (long)SeedWOStatus.Scheduled, + UserId = RandomServiceTechUserId(), + Created = ((DateTime)o.ServiceDate).AddHours(1) + }; + o.States.Add(WoState); + o.LastStatusId = WoState.WorkOrderStatusId; + } + } + + if (Fake.Random.Int(1, 4) == 2)//25% chance + { + { + var WoState = new WorkOrderState() + { + WorkOrderStatusId = (long)SeedWOStatus.ManagerApprovalRequired, + UserId = RandomServiceTechUserId(), + Created = ((DateTime)o.ServiceDate).AddHours(1).AddMinutes(5) + }; + o.States.Add(WoState); + o.LastStatusId = WoState.WorkOrderStatusId; + } + } + if (Fake.Random.Int(1, 4) == 2)//25% chance + { + { + var WoState = new WorkOrderState() + { + WorkOrderStatusId = (long)SeedWOStatus.Scheduled, + UserId = RandomServiceTechUserId(), + Created = ((DateTime)o.ServiceDate).AddHours(2) + }; + o.States.Add(WoState); + o.LastStatusId = WoState.WorkOrderStatusId; + + } + } + + //All wo ending status + //if it's in the past tag it with a completed type status + if (isPast) + { + { + var WoState = new WorkOrderState() + { + WorkOrderStatusId = (long)SeedWOStatus.Closed, + UserId = RandomServiceTechUserId(), + Created = ((DateTime)o.ServiceDate).AddHours(2) + }; + o.States.Add(WoState); + o.LastStatusId = WoState.WorkOrderStatusId; + + } + } + else + { + //current-future + //10% chance it's not left in a scheduled state + //this is because we want to have users be generally available to play with appointments in the schedule form + if (Fake.Random.Int(1, 10) == 3) + { + var WoState = new WorkOrderState() + { + WorkOrderStatusId = (long)Fake.Random.Enum(new[] { SeedWOStatus.Scheduled, SeedWOStatus.Closed, SeedWOStatus.ServiceCompleted }), + UserId = RandomServiceTechUserId(), + Created = ((DateTime)o.ServiceDate).AddHours(2) + }; + o.States.Add(WoState); + o.LastStatusId = WoState.WorkOrderStatusId;//simulate if user added state to wo so it gets set + } + - }; - woItem.Expenses.Add(woItemExpense); } - //OUTSIDE SERVICES - if (Fake.Random.Int(1, 10) == 2)//10% chance + + //intentional: tested and faster in loop + using (AyContext ct = ServiceProviderProvider.DBContext) { - var ShippingCost = MoneyUtil.Round(Fake.Random.Decimal(5, 20)); - var RepairCost = MoneyUtil.Round(Fake.Random.Decimal(50, 1000)); - var woItemOutsideService = new WorkOrderItemOutsideService() + WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct); + var NewObject = await biz.WorkOrderCreateAsync(o, false); + TotalSeededWorkOrders++; + if (NewObject == null) { - UnitId = GetNextUnitForCustomer(o.CustomerId), - Notes = Fake.Lorem.Sentence(null, 3), - VendorSentToId = Fake.Random.Long(1, TotalSeededVendors), - VendorSentViaId = Fake.Random.Long(1, TotalSeededVendors), - RMANumber = "RMA" + Fake.Finance.Account(6), - TrackingNumber = "TR" + Fake.Finance.Account(8), - RepairCost = RepairCost, - RepairPrice = MoneyUtil.Round(RepairCost * 1.5m), - ShippingCost = ShippingCost, - ShippingPrice = MoneyUtil.Round(ShippingCost * 1.5m), - SentDate = woDate, - ETADate = woDate.AddDays(7), - ReturnDate = woDate.AddDays(8), - TaxCodeId = 1 - }; - woItem.OutsideServices.Add(woItemOutsideService); - } - // ShippingCost = Fake.Random.Decimal(5, 20); - // RepairCost = Fake.Random.Decimal(50, 1000); - // woItemOutsideService = new WorkOrderItemOutsideService() - // { - // UnitId = GetRandomUnitForCustomer(o.CustomerId), - // Notes = Fake.Lorem.Sentence(), - // VendorSentToId = Fake.Random.Long(1, TotalSeededVendors), - // VendorSentViaId = Fake.Random.Long(1, TotalSeededVendors), - // RMANumber = "RMA" + Fake.Finance.Account(6), - // TrackingNumber = "TR" + Fake.Finance.Account(8), - // RepairCost = RepairCost, - // RepairPrice = RepairCost * 1.5m, - // ShippingCost = ShippingCost, - // ShippingPrice = ShippingCost * 1.5m, - // SentDate = woDate, - // ETADate = woDate.AddDays(7), - // ReturnDate = woDate.AddDays(8), - // TaxCodeId = 1 - // }; - // woItem.OutsideServices.Add(woItemOutsideService); - - o.Items.Add(woItem); - } - - //sample status changes - if (Fake.Random.Int(1, 4) == 2)//25% chance - { - { - var WoState = new WorkOrderState() - { - WorkOrderStatusId = (long)SeedWOStatus.NeedsToBeAssigned, - UserId = RandomServiceTechUserId(), - Created = ((DateTime)o.ServiceDate).AddMinutes(5) - }; - o.States.Add(WoState); - o.LastStatusId = WoState.WorkOrderStatusId; - } - } - - if (Fake.Random.Int(1, 4) == 2)//25% chance - { - { - var WoState = new WorkOrderState() - { - WorkOrderStatusId = (long)SeedWOStatus.Scheduled, - UserId = RandomServiceTechUserId(), - Created = ((DateTime)o.ServiceDate).AddHours(1) - }; - o.States.Add(WoState); - o.LastStatusId = WoState.WorkOrderStatusId; - } - } - - if (Fake.Random.Int(1, 4) == 2)//25% chance - { - { - var WoState = new WorkOrderState() - { - WorkOrderStatusId = (long)SeedWOStatus.ManagerApprovalRequired, - UserId = RandomServiceTechUserId(), - Created = ((DateTime)o.ServiceDate).AddHours(1).AddMinutes(5) - }; - o.States.Add(WoState); - o.LastStatusId = WoState.WorkOrderStatusId; - } - } - if (Fake.Random.Int(1, 4) == 2)//25% chance - { - { - var WoState = new WorkOrderState() - { - WorkOrderStatusId = (long)SeedWOStatus.Scheduled, - UserId = RandomServiceTechUserId(), - Created = ((DateTime)o.ServiceDate).AddHours(2) - }; - o.States.Add(WoState); - o.LastStatusId = WoState.WorkOrderStatusId; - - } - } - - //All wo ending status - //if it's in the past tag it with a completed type status - if (isPast) - { - { - var WoState = new WorkOrderState() - { - WorkOrderStatusId = (long)SeedWOStatus.Closed, - UserId = RandomServiceTechUserId(), - Created = ((DateTime)o.ServiceDate).AddHours(2) - }; - o.States.Add(WoState); - o.LastStatusId = WoState.WorkOrderStatusId; - - } - } - else - { - //current-future - //10% chance it's not left in a scheduled state - //this is because we want to have users be generally available to play with appointments in the schedule form - if (Fake.Random.Int(1, 10) == 3) - { - var WoState = new WorkOrderState() - { - WorkOrderStatusId = (long)Fake.Random.Enum(new[] { SeedWOStatus.Scheduled, SeedWOStatus.Closed, SeedWOStatus.ServiceCompleted }), - UserId = RandomServiceTechUserId(), - Created = ((DateTime)o.ServiceDate).AddHours(2) - }; - o.States.Add(WoState); - o.LastStatusId = WoState.WorkOrderStatusId;//simulate if user added state to wo so it gets set - } - - - } - - - - //intentional: tested and faster in loop - using (AyContext ct = ServiceProviderProvider.DBContext) - { - WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct); - var NewObject = await biz.WorkOrderCreateAsync(o, false); - TotalSeededWorkOrders++; - if (NewObject == null) - { - var err = $"Seeder::SeedWorkOrder error creating {o.Serial}\r\n{biz.GetErrorsAsString()}"; - log.LogError(err); - throw new System.Exception(err); + var err = $"Seeder::SeedWorkOrder error creating {o.Serial}\r\n{biz.GetErrorsAsString()}"; + log.LogError(err); + throw new System.Exception(err); + } } } }