diff --git a/server/AyaNova/models/Unit.cs b/server/AyaNova/models/Unit.cs index 00807cba..b826f05e 100644 --- a/server/AyaNova/models/Unit.cs +++ b/server/AyaNova/models/Unit.cs @@ -49,6 +49,9 @@ namespace AyaNova.Models public string WarrantyTerms { get; set; } public bool UsesBanking { get; set; } public long? ContractId { get; set; } + [NotMapped] + public string ContractViz { get; set; } + public DateTime? ContractExpires { get; set; } public bool Metered { get; set; } public bool LifeTimeWarranty { get; set; } public string Text1 { get; set; } diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 792d0405..bdf37fe2 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -798,7 +798,8 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); + "serial TEXT NOT NULL, customerid BIGINT NOT NULL REFERENCES acustomer(id), parentunitid BIGINT NULL REFERENCES aunit(id), " + "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, contractid BIGINT NULL REFERENCES acontract, usesbanking BOOL, metered BOOL, lifetimewarranty BOOL, " + + "overridemodelwarranty BOOL, warrantylength INTEGER NULL, warrantyterms TEXT NULL, contractid BIGINT NULL REFERENCES acontract, " + + "contractexpires TIMESTAMP NULL, usesbanking BOOL, metered BOOL, lifetimewarranty BOOL, " + "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 e856a601..ff3a9fb9 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -8,6 +8,7 @@ using Bogus; using AyaNova.Api.ControllerHelpers; using System.Diagnostics; using Microsoft.EntityFrameworkCore; +using System.Linq; namespace AyaNova.Util @@ -553,6 +554,123 @@ namespace AyaNova.Util await SeedUserAsync(log, 1, AuthorizationRoles.OpsAdminLimited, UserType.NotService, false, "TEST_INACTIVE", "TEST_INACTIVE", 0, KnownUserTags); #endif + + ///////////////////////////////////////////////////// + //CONTRACTS + { + await SeedTravelRateAsync(log, 1, "Bronze travel rate", true);//1 + await SeedTravelRateAsync(log, 1, "Silver travel rate", true);//2 + await SeedTravelRateAsync(log, 1, "Gold travel rate", true);//3 + await SeedServiceRateAsync(log, 1, "Bronze service rate", true);//1 + await SeedServiceRateAsync(log, 1, "Silver service rate", true);//2 + await SeedServiceRateAsync(log, 1, "Gold service rate", true);//3 + + { + Contract c = new Contract(); + c.Name = "Bronze"; + c.Active = true; + c.Notes = "These are notes providing additional information when users view the contract"; + c.AlertNotes = "These are alert notes displayed on workorders about this contract"; + c.PartsOverride = .05m; + c.PartsOverrideType = ContractOverrideType.PriceDiscount; + c.ServiceRatesOverride = 0m; + c.ServiceRatesOverrideType = ContractOverrideType.PriceDiscount; + c.TravelRatesOverride = 0; + c.TravelRatesOverrideType = ContractOverrideType.PriceDiscount; + c.ResponseTime = TimeSpan.Zero; + c.ContractServiceRatesOnly = true; + c.ServiceRateItems.Add(new ContractServiceRate() { ServiceRateId = 1 }); + c.ContractTravelRatesOnly = true; + c.TravelRateItems.Add(new ContractTravelRate() { TravelRateId = 1 }); + c.ContractServiceRateOverrideItems.Add(new ContractServiceRateOverride() { Tags = new string[] { "blue" }.ToList(), Override = .05m, OverrideType = ContractOverrideType.PriceDiscount }); + c.ContractTravelRateOverrideItems.Add(new ContractTravelRateOverride() { Tags = new string[] { "blue" }.ToList(), Override = .05m, OverrideType = ContractOverrideType.PriceDiscount }); + c.ContractPartOverrideItems.Add(new ContractPartOverride() { Tags = new string[] { "blue" }.ToList(), Override = .01m, OverrideType = ContractOverrideType.PriceDiscount }); + + using (AyContext ct = ServiceProviderProvider.DBContext) + { + ContractBiz biz = ContractBiz.GetBiz(ct); + var NewObject = await biz.CreateAsync(c); + + if (NewObject == null) + { + var err = $"Seeder::SeedKnownObjects error creating Bronze contract\r\n{biz.GetErrorsAsString()}"; + log.LogError(err); + throw new System.Exception(err); + } + } + } + + { + Contract c = new Contract(); + c.Name = "Silver"; + c.Active = true; + c.Notes = "These are notes providing additional information when users view the contract"; + c.AlertNotes = "These are alert notes displayed on workorders about this contract"; + c.PartsOverride = .1m; + c.PartsOverrideType = ContractOverrideType.PriceDiscount; + c.ServiceRatesOverride = 0m; + c.ServiceRatesOverrideType = ContractOverrideType.PriceDiscount; + c.TravelRatesOverride = 0; + c.TravelRatesOverrideType = ContractOverrideType.PriceDiscount; + c.ResponseTime = TimeSpan.Zero; + c.ContractServiceRatesOnly = true; + c.ServiceRateItems.Add(new ContractServiceRate() { ServiceRateId = 2 }); + c.ContractTravelRatesOnly = true; + c.TravelRateItems.Add(new ContractTravelRate() { TravelRateId = 2 }); + c.ContractServiceRateOverrideItems.Add(new ContractServiceRateOverride() { Tags = new string[] { "red" }.ToList(), Override = .1m, OverrideType = ContractOverrideType.PriceDiscount }); + c.ContractTravelRateOverrideItems.Add(new ContractTravelRateOverride() { Tags = new string[] { "red" }.ToList(), Override = .1m, OverrideType = ContractOverrideType.PriceDiscount }); + c.ContractPartOverrideItems.Add(new ContractPartOverride() { Tags = new string[] { "red" }.ToList(), Override = .05m, OverrideType = ContractOverrideType.PriceDiscount }); + + using (AyContext ct = ServiceProviderProvider.DBContext) + { + ContractBiz biz = ContractBiz.GetBiz(ct); + var NewObject = await biz.CreateAsync(c); + + if (NewObject == null) + { + var err = $"Seeder::SeedKnownObjects error creating Silver contract\r\n{biz.GetErrorsAsString()}"; + log.LogError(err); + throw new System.Exception(err); + } + } + } + + { + Contract c = new Contract(); + c.Name = "Gold"; + c.Active = true; + c.Notes = "These are notes providing additional information when users view the contract"; + c.AlertNotes = "These are alert notes displayed on workorders about this contract"; + c.PartsOverride = .2m; + c.PartsOverrideType = ContractOverrideType.PriceDiscount; + c.ServiceRatesOverride = .2m; + c.ServiceRatesOverrideType = ContractOverrideType.PriceDiscount; + c.TravelRatesOverride = .2m; + c.TravelRatesOverrideType = ContractOverrideType.PriceDiscount; + c.ResponseTime = new TimeSpan(24, 0, 0);//24 hour response time + c.ContractServiceRatesOnly = false; + c.ServiceRateItems.Add(new ContractServiceRate() { ServiceRateId = 3 }); + c.ContractTravelRatesOnly = false; + c.TravelRateItems.Add(new ContractTravelRate() { TravelRateId = 3 }); + c.ContractServiceRateOverrideItems.Add(new ContractServiceRateOverride() { Tags = new string[] { "green" }.ToList(), Override = .1m, OverrideType = ContractOverrideType.PriceDiscount }); + c.ContractTravelRateOverrideItems.Add(new ContractTravelRateOverride() { Tags = new string[] { "green" }.ToList(), Override = .1m, OverrideType = ContractOverrideType.PriceDiscount }); + c.ContractPartOverrideItems.Add(new ContractPartOverride() { Tags = new string[] { "green" }.ToList(), Override = .1m, OverrideType = ContractOverrideType.PriceDiscount }); + + using (AyContext ct = ServiceProviderProvider.DBContext) + { + ContractBiz biz = ContractBiz.GetBiz(ct); + var NewObject = await biz.CreateAsync(c); + + if (NewObject == null) + { + var err = $"Seeder::SeedKnownObjects error creating Gold contract\r\n{biz.GetErrorsAsString()}"; + log.LogError(err); + throw new System.Exception(err); + } + } + } + } + { long HeadOfficeIdForCustomer = 0; @@ -580,6 +698,9 @@ namespace AyaNova.Util ho.EmailAddress = Fake.Internet.ExampleEmail(); + ho.ContractId = 3;//gold contract + ho.ContractExpires = DateTime.UtcNow.AddYears(1); + using (AyContext ct = ServiceProviderProvider.DBContext) { HeadOfficeBiz biz = HeadOfficeBiz.GetBiz(ct); @@ -810,6 +931,8 @@ namespace AyaNova.Util } } + + /////////////////////////////////////////////// } @@ -1212,7 +1335,7 @@ namespace AyaNova.Util ////////////////////////////////////////////////////// //SERVICERATE // - public async Task SeedServiceRateAsync(ILogger log, int count) + public async Task SeedServiceRateAsync(ILogger log, int count, string presetName = null, bool contractOnly = false) { for (int x = 0; x < count; x++) @@ -1220,8 +1343,15 @@ namespace AyaNova.Util ServiceRate o = new ServiceRate(); do { - var color = Fake.Commerce.Color(); - o.Name = $"{char.ToUpper(color[0]) + color.Substring(1)} {Fake.Lorem.Word()}"; + if (!string.IsNullOrWhiteSpace(presetName)) + { + o.Name = presetName; + } + else + { + var color = Fake.Commerce.Color(); + o.Name = $"{char.ToUpper(color[0]) + color.Substring(1)} {Fake.Lorem.Word()}"; + } } while (!HashRateNames.Add(o.Name)); o.AccountNumber = Fake.Finance.Account(); o.Active = true; @@ -1231,6 +1361,7 @@ namespace AyaNova.Util o.Cost = Fake.Random.Decimal(0.25m, 50); o.Charge = o.Cost * 1.55m; o.Unit = "hour"; + o.ContractOnly = contractOnly; //This seems wrong to do in a loop but is 4 times faster this way ?!? @@ -1253,7 +1384,7 @@ namespace AyaNova.Util ////////////////////////////////////////////////////// //TRAVELRATE // - public async Task SeedTravelRateAsync(ILogger log, int count) + public async Task SeedTravelRateAsync(ILogger log, int count, string presetName = null, bool contractOnly = false) { var Units = new[] { "km", "miles", "hours" }; @@ -1262,8 +1393,15 @@ namespace AyaNova.Util TravelRate o = new TravelRate(); do { - var color = Fake.Commerce.Color(); - o.Name = $"{char.ToUpper(color[0]) + color.Substring(1)} {Fake.Lorem.Word()}"; + if (!string.IsNullOrWhiteSpace(presetName)) + { + o.Name = presetName; + } + else + { + var color = Fake.Commerce.Color(); + o.Name = $"{char.ToUpper(color[0]) + color.Substring(1)} {Fake.Lorem.Word()}"; + } } while (!HashRateNames.Add(o.Name)); o.AccountNumber = Fake.Finance.Account(); o.Active = true; @@ -1273,7 +1411,7 @@ namespace AyaNova.Util o.Cost = Fake.Random.Decimal(0.25m, 10); o.Charge = o.Cost * 2m; o.Unit = Fake.PickRandom(Units); - + o.ContractOnly = contractOnly; //This seems wrong to do in a loop but is 4 times faster this way ?!? @@ -1397,6 +1535,14 @@ namespace AyaNova.Util o.PurchasedDate = Fake.Date.Between(seedStartWindow, DateTime.Now).ToUniversalTime(); o.Description = Fake.Commerce.ProductName(); o.ReplacedByUnitId = null; + + //Has unit contract 5% chance (1/20) + if (Fake.Random.Number(1, 20) == 5) + { + o.ContractId = Fake.Random.Number(1, 3); + o.ContractExpires = DateTime.UtcNow.AddYears(1); + } + //for now no banked units in seeds o.UsesBanking = false; o.Metered = false;//for now no meters either