From ffdf5070b415a66107096ea4f8ff809208b3eba9 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 23 Jan 2023 22:25:54 +0000 Subject: [PATCH] --- server/Startup.cs | 3 +- server/biz/GlobalBizSettingsBiz.cs | 659 +++++++++--------- .../SockBotProcessVendorNotifications.cs | 10 +- todo.txt | 20 + 4 files changed, 365 insertions(+), 327 deletions(-) diff --git a/server/Startup.cs b/server/Startup.cs index 47c4942..8eecb4f 100644 --- a/server/Startup.cs +++ b/server/Startup.cs @@ -666,8 +666,7 @@ namespace Sockeye if (ServerBootConfig.SOCKEYE_PERMANENTLY_ERASE_DATABASE) { _newLog.LogWarning("SOCKEYE_PERMANENTLY_ERASE_DATABASE has been set - IMPORTING ROCKFISH"); - GlobalBizSettingsBiz biz = GlobalBizSettingsBiz.GetBiz(dbContext); - biz.ImportRockfish(dbContext, _newLog).Wait(); + GlobalBizSettingsBiz.ImportRockfish(_newLog).Wait(); _newLog.LogInformation("IMPORT COMPLETED"); } } diff --git a/server/biz/GlobalBizSettingsBiz.cs b/server/biz/GlobalBizSettingsBiz.cs index 55467cc..12daba0 100644 --- a/server/biz/GlobalBizSettingsBiz.cs +++ b/server/biz/GlobalBizSettingsBiz.cs @@ -129,7 +129,7 @@ namespace Sockeye.Biz //IMPORT FROM ROCKFISH - public async Task ImportRockfish(AyContext ct, ILogger log) + public static async Task ImportRockfish(ILogger log) { log.LogInformation("Start import from rockfish, authenticating"); ApiServerState apiServerState = (ApiServerState)ServiceProviderProvider.Provider.GetService(typeof(ApiServerState)); @@ -193,49 +193,53 @@ namespace Sockeye.Biz foreach (JObject jSite in jaSiteList) { - var CustomerName = jCustomer["name"].Value(); - if (multiSite) - { - CustomerName += " - " + jSite["name"].Value(); - log.LogInformation($"RFImport MULTISITE CUSTOMER: {CustomerName}"); - } long CurrentCustomerId = 0; - - //Create customer if we don't have one already - if (await ct.Customer.AnyAsync(z => z.Name == CustomerName)) - continue;//already have this one so no need to process it again + using (AyContext ct = ServiceProviderProvider.DBContext) { - //CREATE CUSTOMER - Customer c = new Customer(); - c.Active = jCustomerListItem["active"].Value(); - c.Name = CustomerName; - c.Country = jSite["country"].Value(); - c.Region = jSite["stateProvince"].Value(); - c.DoNotContact = jCustomer["doNotContact"].Value(); - c.Notes = jCustomer["notes"].Value(); - c.DbId = jSite["dbId"].Value(); - if (c.DbId == "v7_no_dbid") + var CustomerName = jCustomer["name"].Value(); + if (multiSite) { - c.DbId = null; - c.Tags.Add("v7"); + CustomerName += " - " + jSite["name"].Value(); + log.LogInformation($"RFImport MULTISITE CUSTOMER: {CustomerName}"); } - else - c.Tags.Add("raven"); - if (jSite["hosted"].Value() == true) - c.Tags.Add("hosted"); - //In rockfish there were support emails that were people allowed to be contacting us on behalf of the customer - var supportEmail = jCustomer["supportEmail"].Value(); - if (!string.IsNullOrWhiteSpace(supportEmail)) - c.Notes += "\nSupport Emails: " + supportEmail; - //in Rockfish the admin email is the main license related contact and technically the only person responsible to contact us - //usually the same as the purchase email - c.EmailAddress = jCustomer["adminEmail"].Value(); - CustomerBiz biz = CustomerBiz.GetBiz(ct); - var NewObject = await biz.CreateAsync(c); - CurrentCustomerId = NewObject.Id; - }//customer creation + //Create customer if we don't have one already + if (await ct.Customer.AnyAsync(z => z.Name == CustomerName)) + continue;//already have this one so no need to process it again + { + //CREATE CUSTOMER + Customer c = new Customer(); + c.Active = jCustomerListItem["active"].Value(); + c.Name = CustomerName; + c.Country = jSite["country"].Value(); + c.Region = jSite["stateProvince"].Value(); + c.DoNotContact = jCustomer["doNotContact"].Value(); + c.Notes = jCustomer["notes"].Value(); + c.DbId = jSite["dbId"].Value(); + if (c.DbId == "v7_no_dbid") + { + c.DbId = null; + c.Tags.Add("v7"); + } + else + c.Tags.Add("raven"); + + if (jSite["hosted"].Value() == true) + c.Tags.Add("hosted"); + + //In rockfish there were support emails that were people allowed to be contacting us on behalf of the customer + var supportEmail = jCustomer["supportEmail"].Value(); + if (!string.IsNullOrWhiteSpace(supportEmail)) + c.Notes += "\nSupport Emails: " + supportEmail; + //in Rockfish the admin email is the main license related contact and technically the only person responsible to contact us + //usually the same as the purchase email + c.EmailAddress = jCustomer["adminEmail"].Value(); + CustomerBiz biz = CustomerBiz.GetBiz(ct); + var NewObject = await biz.CreateAsync(c); + CurrentCustomerId = NewObject.Id; + }//customer creation + }//context //SITE PURCHASES @@ -244,63 +248,65 @@ namespace Sockeye.Biz foreach (JObject jPurchase in jaPurchaseList) { - //create product if not exist then import - //Get product id if exists - var ProductName = jPurchase["name"].Value(); - ProductName = ProductName.Replace("- Renewal", "").Replace(" Renewal", "").Replace(" RENEWAL", "").Replace("CANCELLED ", "").Replace("CANCELED ", ""); - var p = await ct.Product.AsNoTracking().FirstOrDefaultAsync(z => z.VendorCode == jPurchase["productCode"].Value()); - - - if (p == null) + using (AyContext ct = ServiceProviderProvider.DBContext) { + //create product if not exist then import + //Get product id if exists + var ProductName = jPurchase["name"].Value(); + ProductName = ProductName.Replace("- Renewal", "").Replace(" Renewal", "").Replace(" RENEWAL", "").Replace("CANCELLED ", "").Replace("CANCELED ", ""); + var p = await ct.Product.AsNoTracking().FirstOrDefaultAsync(z => z.VendorCode == jPurchase["productCode"].Value()); - //Create it here - p = new Product(); - p.Name = ProductName; - p.Active = true;//not entirely true but we can always deactivate there aren't many products - p.VendorId = 1; - p.OurCode = p.VendorCode = jPurchase["productCode"].Value(); - p.PGroup = ProductBiz.ProductGroupFromProductCode(p.OurCode); - if (p.VendorCode == "301028468")//subscription yearly + if (p == null) { - p.LicenseInterval = new TimeSpan(365, 0, 0, 0); //actual length, in license is where I pad to cover them + + //Create it here + p = new Product(); + p.Name = ProductName; + p.Active = true;//not entirely true but we can always deactivate there aren't many products + p.VendorId = 1; + p.OurCode = p.VendorCode = jPurchase["productCode"].Value(); + p.PGroup = ProductBiz.ProductGroupFromProductCode(p.OurCode); + + if (p.VendorCode == "301028468")//subscription yearly + { + p.LicenseInterval = new TimeSpan(365, 0, 0, 0); //actual length, in license is where I pad to cover them + } + + if (p.VendorCode == "301028467")//subscription monthly + { + p.LicenseInterval = new TimeSpan(31, 0, 0, 0);//there is no concept beyond days for timespan so a month is 31 days max + p.MaintInterval = new TimeSpan(31, 0, 0, 0);//the only product less than one year of maintenance save the ones with no maintenance which can be edited manually later as there are so few of them + } + else + p.MaintInterval = new TimeSpan(365, 0, 0, 0); + + ProductBiz biz = ProductBiz.GetBiz(ct); + p = await biz.CreateAsync(p); } - if (p.VendorCode == "301028467")//subscription monthly + //Now we can add the sale that we have the product + if (!await ct.Purchase.AnyAsync(z => z.SalesOrderNumber == jPurchase["salesOrderNumber"].Value())) { - p.LicenseInterval = new TimeSpan(31, 0, 0, 0);//there is no concept beyond days for timespan so a month is 31 days max - p.MaintInterval = new TimeSpan(31, 0, 0, 0);//the only product less than one year of maintenance save the ones with no maintenance which can be edited manually later as there are so few of them + var s = new Purchase(); + s.VendorId = 1; + s.ProductId = p.Id; + s.PGroup = p.PGroup; + s.CustomerId = CurrentCustomerId; + s.CancelDate = DateUtil.EpochToDateNullIsNull(jPurchase["cancelDate"].Value()); + s.CouponCode = jPurchase["couponCode"].Value(); + s.ExpireDate = DateUtil.EpochToDateNullIsNull(jPurchase["expireDate"].Value()); + s.Name = p.Name; + s.Processed = true; + s.PurchaseDate = DateUtil.EpochToDateNullIsMin(jPurchase["purchaseDate"].Value()); + s.Quantity = jPurchase["quantity"].Value(); + s.RenewNoticeSent = jPurchase["renewNoticeSent"].Value(); + s.SalesOrderNumber = jPurchase["salesOrderNumber"].Value(); + s.Notes = jPurchase["notes"].Value(); + PurchaseBiz biz = PurchaseBiz.GetBiz(ct); + await biz.CreateAsync(s); } - else - p.MaintInterval = new TimeSpan(365, 0, 0, 0); - - ProductBiz biz = ProductBiz.GetBiz(ct); - p = await biz.CreateAsync(p); - } - - //Now we can add the sale that we have the product - if (!await ct.Purchase.AnyAsync(z => z.SalesOrderNumber == jPurchase["salesOrderNumber"].Value())) - { - var s = new Purchase(); - s.VendorId = 1; - s.ProductId = p.Id; - s.PGroup = p.PGroup; - s.CustomerId = CurrentCustomerId; - s.CancelDate = DateUtil.EpochToDateNullIsNull(jPurchase["cancelDate"].Value()); - s.CouponCode = jPurchase["couponCode"].Value(); - s.ExpireDate = DateUtil.EpochToDateNullIsNull(jPurchase["expireDate"].Value()); - s.Name = p.Name; - s.Processed = true; - s.PurchaseDate = DateUtil.EpochToDateNullIsMin(jPurchase["purchaseDate"].Value()); - s.Quantity = jPurchase["quantity"].Value(); - s.RenewNoticeSent = jPurchase["renewNoticeSent"].Value(); - s.SalesOrderNumber = jPurchase["salesOrderNumber"].Value(); - s.Notes = jPurchase["notes"].Value(); - PurchaseBiz biz = PurchaseBiz.GetBiz(ct); - await biz.CreateAsync(s); - } - + }//context } @@ -341,21 +347,23 @@ namespace Sockeye.Biz "processed": false }, */ + using (AyContext ct = ServiceProviderProvider.DBContext) + { + var vn = new VendorNotification(); + vn.Created = DateUtil.EpochToDateNullIsMin(jVendorNotificationItem["dtCreated"].Value()); + vn.VendorId = 1; + vn.VendorData = jVendorNotificationItem["data"].Value(); + vn.Processed = vn.Created;//indicate it's been processed + await ct.SaveChangesAsync(); - var vn = new VendorNotification(); - vn.Created = DateUtil.EpochToDateNullIsMin(jVendorNotificationItem["dtCreated"].Value()); - vn.VendorId = 1; - vn.VendorData = jVendorNotificationItem["data"].Value(); - vn.Processed = vn.Created;//indicate it's been processed - await ct.SaveChangesAsync(); #if (DEBUG) - //Test dev stuff + //Test dev stuff #warning DEV TEST ORDER PROCESSING REMOVE THIS WHEN DONE - if (!string.IsNullOrWhiteSpace(vn.VendorData)) - await SockBotProcessVendorNotifications.ParseVendorNotificationData(vn, ct, log); + if (!string.IsNullOrWhiteSpace(vn.VendorData)) + await SockBotProcessVendorNotifications.ParseVendorNotificationData(vn, ct, log); #endif - + } }// all vendor notifications loop } @@ -379,6 +387,8 @@ namespace Sockeye.Biz // } // { + // using (AyContext ct = ServiceProviderProvider.DBContext) + // { // res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/list"); // responseText = await res.Content.ReadAsStringAsync(); // var jaRFCaseList = JArray.Parse(responseText); @@ -387,6 +397,7 @@ namespace Sockeye.Biz // foreach (JObject jRFCase in jaRFCaseList.Reverse()) // { + // var g = new GZCase(); // g.CaseId = jRFCase["id"].Value(); // g.Closed = DateUtil.EpochToDateNullIsNull(jRFCase["dtClosed"].Value()); @@ -462,6 +473,7 @@ namespace Sockeye.Biz // await command.ExecuteNonQueryAsync(); // await ct.Database.CloseConnectionAsync(); // } + // }//end of context // } #endregion cases @@ -477,166 +489,168 @@ namespace Sockeye.Biz DateTime dtTempCreated = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc); foreach (JObject jLicenseListItem in jaLicenseList.Reverse()) { - - res = await client.GetAsync($"{URL_ROCKFISH}api/license/{jLicenseListItem["id"].Value()}"); - responseText = await res.Content.ReadAsStringAsync(); - var jLicense = JObject.Parse(responseText); - // log.LogInformation($"Importing license:{responseText}"); - /* - {"regTo":"PDI Technologies","customerName":"PDI Technologies","dtcreated":1672261044,"email":"jberkel@pdisoftware.com","code":"na","fetched":true,"dtfetched":1672262347,"fetchFrom":null, - "key":"[KEY\n{\n \"Key\": {\n \"LicenseFormat\": \"8\",\n \"Id\": \"1672261044\",\n \"RegisteredTo\": \"PDI Technologies\",\n \"DBID\": \"R6U37uNUN2hSQideG6Gg+MqoQY8vuUeyHFI6Kv7VDsE=\",\n \"Perpetual\": true,\n \"LicenseExpiration\": \"5555-01-01T00:00:00\",\n \"MaintenanceExpiration\": \"2023-12-28T00:00:00\",\n \"Features\": [\n {\n \"Name\": \"ActiveInternalUsers\",\n \"Count\": 5\n }\n ]\n }\n}\nKEY]\n[SIGNATURE\nkzVs8GH0MSIfsR7ZYQ5x+5wdVDJqpfOYvTfBCx32Vs+zqP7h89uUKI17jTx5rMvkOYX40GyJt0pTWOzltljzf+MaoTzoSvTsSPkWtdVWv8ZGOXUUdaZhzMoTJGxTg0JHka/8S5tLkTiuct3x+voiLAKXuFCp9TSZo4+UnejB6U2Bp6MfdZxLtKVZ/1RLu/h4SnP8ZbczuwbQReB1z4k4IRwjh5GHnUUm6YqZg/04m1X9FEeKQZQfGZk/qZ788jONbLQb4CLnq0/ZmIteeocDDBz59TYaC9BHwHp73y8jyPfEugVfyH2AE0J8ZILiFiozYQ7meP5X4ZOmd1nhTA8MkA==\nSIGNATURE]\n" - } - */ - var l = new License(); - l.Active = true; - l.RegTo = jLicense["regTo"].Value(); - - //try to match customer; rockfish didn't track customer id in the license so this is a bit wishy washy - Customer cust = null; - cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.Name == jLicense["customerName"].Value()); - if (cust == null)//email? - cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.EmailAddress.Contains(jLicense["email"].Value())); - if (cust != null) - l.CustomerId = cust.Id; - - - - var KeyText = jLicense["key"].Value(); - - l.Key = KeyText; - LicenseBiz.ParseKeySetDTOFields(l); - if (KeyText.Contains("AyaNovaLicenseKey")) + using (AyContext ct = ServiceProviderProvider.DBContext) { - //v7 key - /* - [KEY - { - "AyaNovaLicenseKey": { - "SchemaVersion": "7", - "Id": "1517418112", - "Created": "2018-01-31T09:01:52.1878494-08:00", - "Sub": "true", - "RegisteredTo": "Direct Telecom Services", - "EmailAddress": "chrisw@dts.solutions", - "FetchCode": "AgYuDnjDyQ", - "Source": "5246494432", - "InstallableUntil": "2019-01-31T09:01:52.089767-08:00", - "TotalScheduleableUsers": "15", - "Expires": "2019-01-31T00:00:00", - "RequestedTrial": "False", - "Plugins": { - "Plugin": [ - { - "Item": "MBI - Minimal browser interface", - "SubscriptionExpires": "2018-06-13T00:00:00" - }, - { - "Item": "WBI - Web browser interface", - "SubscriptionExpires": "2018-06-13T00:00:00" - }, - { - "Item": "OutlookSchedule", - "SubscriptionExpires": "2018-06-13T00:00:00" - }, - { - "Item": "AyaNovaOLI", - "SubscriptionExpires": "2018-06-13T00:00:00" - }, - { - "Item": "RI - Responsive Interface", - "SubscriptionExpires": "2018-06-13T00:00:00" - } - ] - } - } - } - KEY] - [SIGNATURE - uBjnooIDd6MOiqT/z4tDQfeafkQiWDBtxDHXOxhZ7av1oWS72yPoe8BrAnDZiYbxE4+cHR3C0sPCgEVva5miV1foyi7P6YKkxkKQMxTUR5IssgWVHM59KnO1lR2ndCHWaqH3gHgSsb/sdvYfuHg8luTl1RgjNDZRdQqbPl4NLMcGGW86LoXjpLjsRRxImckBEJFnntd+aXCRmQjXEZWmfxDVW84qa6h+ZCOwL3KYJHuPQDcCmhcpp3MIR3OHoeYhmNG7TWuELsJ4hrsROcqSbEC/CdZD8hoZwtrysu/ZvNZOKchwFsiBaN47+DxK0K/fL/X8CDcG+w3iqgH/x5ipIw== - SIGNATURE] + res = await client.GetAsync($"{URL_ROCKFISH}api/license/{jLicenseListItem["id"].Value()}"); + responseText = await res.Content.ReadAsStringAsync(); + var jLicense = JObject.Parse(responseText); + // log.LogInformation($"Importing license:{responseText}"); + /* + {"regTo":"PDI Technologies","customerName":"PDI Technologies","dtcreated":1672261044,"email":"jberkel@pdisoftware.com","code":"na","fetched":true,"dtfetched":1672262347,"fetchFrom":null, + "key":"[KEY\n{\n \"Key\": {\n \"LicenseFormat\": \"8\",\n \"Id\": \"1672261044\",\n \"RegisteredTo\": \"PDI Technologies\",\n \"DBID\": \"R6U37uNUN2hSQideG6Gg+MqoQY8vuUeyHFI6Kv7VDsE=\",\n \"Perpetual\": true,\n \"LicenseExpiration\": \"5555-01-01T00:00:00\",\n \"MaintenanceExpiration\": \"2023-12-28T00:00:00\",\n \"Features\": [\n {\n \"Name\": \"ActiveInternalUsers\",\n \"Count\": 5\n }\n ]\n }\n}\nKEY]\n[SIGNATURE\nkzVs8GH0MSIfsR7ZYQ5x+5wdVDJqpfOYvTfBCx32Vs+zqP7h89uUKI17jTx5rMvkOYX40GyJt0pTWOzltljzf+MaoTzoSvTsSPkWtdVWv8ZGOXUUdaZhzMoTJGxTg0JHka/8S5tLkTiuct3x+voiLAKXuFCp9TSZo4+UnejB6U2Bp6MfdZxLtKVZ/1RLu/h4SnP8ZbczuwbQReB1z4k4IRwjh5GHnUUm6YqZg/04m1X9FEeKQZQfGZk/qZ788jONbLQb4CLnq0/ZmIteeocDDBz59TYaC9BHwHp73y8jyPfEugVfyH2AE0J8ZILiFiozYQ7meP5X4ZOmd1nhTA8MkA==\nSIGNATURE]\n" + } + */ + var l = new License(); + l.Active = true; + l.RegTo = jLicense["regTo"].Value(); + //try to match customer; rockfish didn't track customer id in the license so this is a bit wishy washy + Customer cust = null; + cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.Name == jLicense["customerName"].Value()); + if (cust == null)//email? + cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.EmailAddress.Contains(jLicense["email"].Value())); + if (cust != null) + l.CustomerId = cust.Id; + + + + var KeyText = jLicense["key"].Value(); + + l.Key = KeyText; + LicenseBiz.ParseKeySetDTOFields(l); + if (KeyText.Contains("AyaNovaLicenseKey")) + { + //v7 key + /* + [KEY + { + "AyaNovaLicenseKey": { + "SchemaVersion": "7", + "Id": "1517418112", + "Created": "2018-01-31T09:01:52.1878494-08:00", + "Sub": "true", + "RegisteredTo": "Direct Telecom Services", + "EmailAddress": "chrisw@dts.solutions", + "FetchCode": "AgYuDnjDyQ", + "Source": "5246494432", + "InstallableUntil": "2019-01-31T09:01:52.089767-08:00", + "TotalScheduleableUsers": "15", + "Expires": "2019-01-31T00:00:00", + "RequestedTrial": "False", + "Plugins": { + "Plugin": [ + { + "Item": "MBI - Minimal browser interface", + "SubscriptionExpires": "2018-06-13T00:00:00" + }, + { + "Item": "WBI - Web browser interface", + "SubscriptionExpires": "2018-06-13T00:00:00" + }, + { + "Item": "OutlookSchedule", + "SubscriptionExpires": "2018-06-13T00:00:00" + }, + { + "Item": "AyaNovaOLI", + "SubscriptionExpires": "2018-06-13T00:00:00" + }, + { + "Item": "RI - Responsive Interface", + "SubscriptionExpires": "2018-06-13T00:00:00" + } + ] + } + } + } + KEY] + [SIGNATURE + uBjnooIDd6MOiqT/z4tDQfeafkQiWDBtxDHXOxhZ7av1oWS72yPoe8BrAnDZiYbxE4+cHR3C0sPCgEVva5miV1foyi7P6YKkxkKQMxTUR5IssgWVHM59KnO1lR2ndCHWaqH3gHgSsb/sdvYfuHg8luTl1RgjNDZRdQqbPl4NLMcGGW86LoXjpLjsRRxImckBEJFnntd+aXCRmQjXEZWmfxDVW84qa6h+ZCOwL3KYJHuPQDcCmhcpp3MIR3OHoeYhmNG7TWuELsJ4hrsROcqSbEC/CdZD8hoZwtrysu/ZvNZOKchwFsiBaN47+DxK0K/fL/X8CDcG+w3iqgH/x5ipIw== + SIGNATURE] + + */ + string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(KeyText, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); + var jKey = JObject.Parse(keyNoWS); + + //In v7 the license expires is an optional property set called "LockDate" + l.LicenseExpire = null; + if (jKey["AyaNovaLicenseKey"]["LockDate"] != null) + l.LicenseExpire = jKey["AyaNovaLicenseKey"]["LockDate"].Value().ToUniversalTime(); + + l.MaintenanceExpire = jKey["AyaNovaLicenseKey"]["Expires"].Value().ToUniversalTime(); + //l.Users=jKey["AyaNovaLicenseKey"]["TotalScheduleableUsers"].Value(); + l.PGroup = ProductGroup.AyaNova7; + l.FetchCode = jLicense["code"].Value(); + + } + else if (KeyText.Contains("AyaNovaLiteLicenseKey")) + { + /* + "[KEY\n{\n \"AyaNovaLiteLicenseKey\": {\n \"SchemaVersion\": \"7\",\n \"Id\": \"1648506791\",\n \"Created\": \"2022-03-28T15:33:11.6010225-07:00\",\n + \"Sub\": \"true\",\n \"RegisteredTo\": \"Duncan Electric\",\n \"EmailAddress\": \"sandrajod@att.net\",\n + \"FetchCode\": \"hGAmScqYcU\",\n \"Source\": \"5246494431\",\n \"InstallableUntil\": \"2023-03-28T15:33:11.6009851-07:00\",\n + \"TotalScheduleableUsers\": \"1\",\n \"Expires\": \"2023-03-29T00:00:00\",\n \"RequestedTrial\": \"False\",\n \"Plugins\": {\n + \"Plugin\": []\n }\n }\n}\nKEY]\n + [SIGNATURE\nKuOF/SpBL1d8AFebvm2lipmKeGdbR6WzbhN68fun+ffVGRjXNX1jWI3rbf9P/shs2/M8gHqW/B7T0vVovGqosmNsGtvaYo30TKlZj9Eicr2+zDf7ojwZiBCeEnFzXr9+7aZrsZSvN20Pqof0xf/J4BVp1T66ecuZywMzH0NGsXXZtXhWYhGvLAZAR1X5/j5gqysSdysmV9j8Euz91zs/BRyfdU0uwwrdQzrJzI4V1MFl+/mIkhMUNcJ5bzjisWS2xeyNYCYnGpMF5oaGPaIcEtmTAdf5fPNNvw3sNhPaZgwlzN8FjfK6T0VgS19PcHCMOA1bTAiLLFNk6wkcjGp2Cw==\nSIGNATURE]\n" */ - string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(KeyText, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); - var jKey = JObject.Parse(keyNoWS); + string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(KeyText, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); + var jKey = JObject.Parse(keyNoWS); + //In v7 the license expires is an optional property set called "LockDate" + l.LicenseExpire = null; + if (jKey["AyaNovaLiteLicenseKey"]["LockDate"] != null) + l.LicenseExpire = jKey["AyaNovaLiteLicenseKey"]["LockDate"].Value().ToUniversalTime(); - //In v7 the license expires is an optional property set called "LockDate" - l.LicenseExpire = null; - if (jKey["AyaNovaLicenseKey"]["LockDate"] != null) - l.LicenseExpire = jKey["AyaNovaLicenseKey"]["LockDate"].Value().ToUniversalTime(); + l.MaintenanceExpire = jKey["AyaNovaLiteLicenseKey"]["Expires"].Value().ToUniversalTime(); - l.MaintenanceExpire = jKey["AyaNovaLicenseKey"]["Expires"].Value().ToUniversalTime(); - //l.Users=jKey["AyaNovaLicenseKey"]["TotalScheduleableUsers"].Value(); - l.PGroup = ProductGroup.AyaNova7; - l.FetchCode = jLicense["code"].Value(); + l.PGroup = ProductGroup.AyaNova7; + l.FetchCode = jLicense["code"].Value(); - } - else if (KeyText.Contains("AyaNovaLiteLicenseKey")) - { - /* - "[KEY\n{\n \"AyaNovaLiteLicenseKey\": {\n \"SchemaVersion\": \"7\",\n \"Id\": \"1648506791\",\n \"Created\": \"2022-03-28T15:33:11.6010225-07:00\",\n - \"Sub\": \"true\",\n \"RegisteredTo\": \"Duncan Electric\",\n \"EmailAddress\": \"sandrajod@att.net\",\n - \"FetchCode\": \"hGAmScqYcU\",\n \"Source\": \"5246494431\",\n \"InstallableUntil\": \"2023-03-28T15:33:11.6009851-07:00\",\n - \"TotalScheduleableUsers\": \"1\",\n \"Expires\": \"2023-03-29T00:00:00\",\n \"RequestedTrial\": \"False\",\n \"Plugins\": {\n - \"Plugin\": []\n }\n }\n}\nKEY]\n - [SIGNATURE\nKuOF/SpBL1d8AFebvm2lipmKeGdbR6WzbhN68fun+ffVGRjXNX1jWI3rbf9P/shs2/M8gHqW/B7T0vVovGqosmNsGtvaYo30TKlZj9Eicr2+zDf7ojwZiBCeEnFzXr9+7aZrsZSvN20Pqof0xf/J4BVp1T66ecuZywMzH0NGsXXZtXhWYhGvLAZAR1X5/j5gqysSdysmV9j8Euz91zs/BRyfdU0uwwrdQzrJzI4V1MFl+/mIkhMUNcJ5bzjisWS2xeyNYCYnGpMF5oaGPaIcEtmTAdf5fPNNvw3sNhPaZgwlzN8FjfK6T0VgS19PcHCMOA1bTAiLLFNk6wkcjGp2Cw==\nSIGNATURE]\n" - */ - string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(KeyText, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); - var jKey = JObject.Parse(keyNoWS); - //In v7 the license expires is an optional property set called "LockDate" - l.LicenseExpire = null; - if (jKey["AyaNovaLiteLicenseKey"]["LockDate"] != null) - l.LicenseExpire = jKey["AyaNovaLiteLicenseKey"]["LockDate"].Value().ToUniversalTime(); - - l.MaintenanceExpire = jKey["AyaNovaLiteLicenseKey"]["Expires"].Value().ToUniversalTime(); - - l.PGroup = ProductGroup.AyaNova7; - l.FetchCode = jLicense["code"].Value(); - - l.Tags.Add("lite"); - } - else - { - //RAVEN KEY - /* - {{ - "Key": { - "LicenseFormat": "8", - "Id": "1672261044", - "RegisteredTo": "PDI Technologies", - "DBID": "R6U37uNUN2hSQideG6Gg+MqoQY8vuUeyHFI6Kv7VDsE=", - "Perpetual": true, - "LicenseExpiration": "5555-01-01T00:00:00", - "MaintenanceExpiration": "2023-12-28T00:00:00", - "Features": [ - { - "Name": "ActiveInternalUsers", - "Count": 5 - } - ] - } -}} - */ - string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(KeyText, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); - var jKey = JObject.Parse(keyNoWS); - l.DbId = jKey["Key"]["DBID"].Value(); - l.LicenseExpire = jKey["Key"]["LicenseExpiration"].Value().ToUniversalTime(); - //if (jKey["Key"]["Perpetual"].Value()) - if ((bool?)jKey["Key"]["Perpetual"] ?? true) - l.PGroup = ProductGroup.RavenPerpetual; + l.Tags.Add("lite"); + } else - l.PGroup = ProductGroup.RavenSubscription; - l.MaintenanceExpire = jKey["Key"]["MaintenanceExpiration"].Value().ToUniversalTime(); - } + { + //RAVEN KEY + /* + {{ + "Key": { + "LicenseFormat": "8", + "Id": "1672261044", + "RegisteredTo": "PDI Technologies", + "DBID": "R6U37uNUN2hSQideG6Gg+MqoQY8vuUeyHFI6Kv7VDsE=", + "Perpetual": true, + "LicenseExpiration": "5555-01-01T00:00:00", + "MaintenanceExpiration": "2023-12-28T00:00:00", + "Features": [ + { + "Name": "ActiveInternalUsers", + "Count": 5 + } + ] + } + }} + */ + string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(KeyText, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); + var jKey = JObject.Parse(keyNoWS); + l.DbId = jKey["Key"]["DBID"].Value(); + l.LicenseExpire = jKey["Key"]["LicenseExpiration"].Value().ToUniversalTime(); + //if (jKey["Key"]["Perpetual"].Value()) + if ((bool?)jKey["Key"]["Perpetual"] ?? true) + l.PGroup = ProductGroup.RavenPerpetual; + else + l.PGroup = ProductGroup.RavenSubscription; + l.MaintenanceExpire = jKey["Key"]["MaintenanceExpiration"].Value().ToUniversalTime(); + } - l.Created = (DateTime)DateUtil.EpochToDateNullIsNull(jLicense["dtcreated"].Value()); - l.FetchedOn = DateUtil.EpochToDateNullIsNull(jLicense["dtfetched"].Value()); - l.FetchEmail = jLicense["email"].Value(); - // l.Key = jLicense["key"].Value(); + l.Created = (DateTime)DateUtil.EpochToDateNullIsNull(jLicense["dtcreated"].Value()); + l.FetchedOn = DateUtil.EpochToDateNullIsNull(jLicense["dtfetched"].Value()); + l.FetchEmail = jLicense["email"].Value(); + // l.Key = jLicense["key"].Value(); - l.Active = true;//active here means it's been fully prepared and is viable for use, all prior licenses fit this description so all are active - l.NotificationSent = true; - LicenseBiz biz = LicenseBiz.GetBiz(ct); - await biz.CreateAsync(l, true); + l.Active = true;//active here means it's been fully prepared and is viable for use, all prior licenses fit this description so all are active + l.NotificationSent = true; + LicenseBiz biz = LicenseBiz.GetBiz(ct); + await biz.CreateAsync(l, true); + }//context }// all licenses loop @@ -676,96 +690,97 @@ namespace Sockeye.Biz }, */ - - //Save Key first then can set keyid on tlr - long? TrialKeyId = null; + using (AyContext ct = ServiceProviderProvider.DBContext) { - string sKey = jTrialRequestItem["key"].Value(); - if (!string.IsNullOrWhiteSpace(sKey)) + //Save Key first then can set keyid on tlr + long? TrialKeyId = null; { - License l = new License(); - l.TrialMode = true; - - l.Key = sKey; - //get number of users count and features etc - LicenseBiz.ParseKeySetDTOFields(l); - - //Parse key as we need the expiry dates and they are only stored in the key not the trial request - string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(l.Key, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); - var jKey = JObject.Parse(keyNoWS); - - - l.RegTo = jKey["Key"]["RegisteredTo"].Value(); - - //try to match customer; rockfish didn't track customer id in the license so this is a bit wishy washy - Customer cust = null; - cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.Name == l.RegTo); - if (cust == null)//email? - cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.EmailAddress.Contains(jTrialRequestItem["email"].Value())); - if (cust != null) - l.CustomerId = cust.Id; - - - l.DbId = jKey["Key"]["DBID"].Value(); - l.LicenseExpire = jKey["Key"]["LicenseExpiration"].Value().ToUniversalTime(); - if ((bool?)jKey["Key"]["Perpetual"] ?? true) - l.PGroup = ProductGroup.RavenPerpetual; - else - l.PGroup = ProductGroup.RavenSubscription; - l.MaintenanceExpire = jKey["Key"]["MaintenanceExpiration"].Value().ToUniversalTime(); - l.Created = DateUtil.EpochToDateNullIsMin(jTrialRequestItem["dtProcessed"].Value()); - l.FetchedOn = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtFetched"].Value()); - l.FetchEmail = jTrialRequestItem["email"].Value(); - - l.Active = true;//active here means it's been fully prepared and is viable for use, all prior licenses fit this description so all are active - l.NotificationSent = true; - //workaround sketchy old testing licenses - if (l.PGroup == ProductGroup.RavenSubscription) + string sKey = jTrialRequestItem["key"].Value(); + if (!string.IsNullOrWhiteSpace(sKey)) { - if (l.MaxDataGB == null || l.MaxDataGB == 0) - l.MaxDataGB = 20; + License l = new License(); + l.TrialMode = true; - if (l.CustomerUsers == null || l.CustomerUsers == 0) - l.CustomerUsers = 250; + l.Key = sKey; + //get number of users count and features etc + LicenseBiz.ParseKeySetDTOFields(l); + + //Parse key as we need the expiry dates and they are only stored in the key not the trial request + string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(l.Key, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); + var jKey = JObject.Parse(keyNoWS); - } + l.RegTo = jKey["Key"]["RegisteredTo"].Value(); + + //try to match customer; rockfish didn't track customer id in the license so this is a bit wishy washy + Customer cust = null; + cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.Name == l.RegTo); + if (cust == null)//email? + cust = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.EmailAddress.Contains(jTrialRequestItem["email"].Value())); + if (cust != null) + l.CustomerId = cust.Id; + + + l.DbId = jKey["Key"]["DBID"].Value(); + l.LicenseExpire = jKey["Key"]["LicenseExpiration"].Value().ToUniversalTime(); + if ((bool?)jKey["Key"]["Perpetual"] ?? true) + l.PGroup = ProductGroup.RavenPerpetual; + else + l.PGroup = ProductGroup.RavenSubscription; + l.MaintenanceExpire = jKey["Key"]["MaintenanceExpiration"].Value().ToUniversalTime(); + l.Created = DateUtil.EpochToDateNullIsMin(jTrialRequestItem["dtProcessed"].Value()); + l.FetchedOn = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtFetched"].Value()); + l.FetchEmail = jTrialRequestItem["email"].Value(); + + l.Active = true;//active here means it's been fully prepared and is viable for use, all prior licenses fit this description so all are active + l.NotificationSent = true; + //workaround sketchy old testing licenses + if (l.PGroup == ProductGroup.RavenSubscription) + { + if (l.MaxDataGB == null || l.MaxDataGB == 0) + l.MaxDataGB = 20; + + if (l.CustomerUsers == null || l.CustomerUsers == 0) + l.CustomerUsers = 250; + + + } - LicenseBiz lbiz = LicenseBiz.GetBiz(ct); - var newLicenseObject = await lbiz.CreateAsync(l, true); + LicenseBiz lbiz = LicenseBiz.GetBiz(ct); + var newLicenseObject = await lbiz.CreateAsync(l, true); #if (DEBUG) - if (newLicenseObject == null) - { - System.Diagnostics.Debugger.Break(); - } + if (newLicenseObject == null) + { + System.Diagnostics.Debugger.Break(); + } #endif - TrialKeyId = newLicenseObject.Id; + TrialKeyId = newLicenseObject.Id; + } } - } - - { - var tlr = new TrialLicenseRequest(); - tlr.DbId = jTrialRequestItem["dbId"].Value(); - tlr.PGroup = (jTrialRequestItem["perpetual"].Value() ? ProductGroup.RavenPerpetual : ProductGroup.RavenSubscription); - tlr.CompanyName = jTrialRequestItem["companyName"].Value(); - tlr.ContactName = jTrialRequestItem["contactName"].Value(); - tlr.Email = jTrialRequestItem["email"].Value(); - tlr.EmailConfirmCode = jTrialRequestItem["emailConfirmCode"].Value(); - tlr.EmailValidated = jTrialRequestItem["emailValidated"].Value(); - tlr.Requested = (DateTime)DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtRequested"].Value()); - tlr.Processed = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtProcessed"].Value()); - tlr.Status = (TrialRequestStatus)jTrialRequestItem["status"].Value(); - tlr.RejectReason = jTrialRequestItem["rejectReason"].Value(); - tlr.LicenseId = TrialKeyId; - var biz = TrialLicenseRequestBiz.GetBiz(ct); - await biz.CreateAsync(tlr, true); - } + { + var tlr = new TrialLicenseRequest(); + tlr.DbId = jTrialRequestItem["dbId"].Value(); + tlr.PGroup = (jTrialRequestItem["perpetual"].Value() ? ProductGroup.RavenPerpetual : ProductGroup.RavenSubscription); + tlr.CompanyName = jTrialRequestItem["companyName"].Value(); + tlr.ContactName = jTrialRequestItem["contactName"].Value(); + tlr.Email = jTrialRequestItem["email"].Value(); + tlr.EmailConfirmCode = jTrialRequestItem["emailConfirmCode"].Value(); + tlr.EmailValidated = jTrialRequestItem["emailValidated"].Value(); + tlr.Requested = (DateTime)DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtRequested"].Value()); + tlr.Processed = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtProcessed"].Value()); + tlr.Status = (TrialRequestStatus)jTrialRequestItem["status"].Value(); + tlr.RejectReason = jTrialRequestItem["rejectReason"].Value(); + tlr.LicenseId = TrialKeyId; + var biz = TrialLicenseRequestBiz.GetBiz(ct); + await biz.CreateAsync(tlr, true); + } + }//context }// all trial requests loop diff --git a/server/generator/SockBotProcessVendorNotifications.cs b/server/generator/SockBotProcessVendorNotifications.cs index ae44a3f..ba32027 100644 --- a/server/generator/SockBotProcessVendorNotifications.cs +++ b/server/generator/SockBotProcessVendorNotifications.cs @@ -105,7 +105,7 @@ namespace Sockeye.Biz if (jData["order_notification"]["purchase"]["is_test"] != null && jData["order_notification"]["purchase"]["is_test"].Value() == true) { - //during debugging allow it to process as a test but normally test orders should stop here + //during debugging allow it to process as a test but normally test orders should stop here #if (!DEBUG) return true; #endif @@ -123,14 +123,18 @@ namespace Sockeye.Biz #region CUSTOMER MAKE OR LOCATED /////////////////////////////////////////////////////////////////////////////////////////// var jCustomerName = jData["order_notification"]["purchase"]["customer_data"]["reg_name"].Value() ?? throw new System.FormatException($"Vendor data empty reg_name:{vn.VendorData}"); - var jCustomerEmail = jData["order_notification"]["purchase"]["customer_data"]["delivery_contact"]["email"].Value() ?? throw new System.FormatException($"Vendor data empty email:{vn.VendorData}"); + if (jData["order_notification"]["purchase"]["customer_data"]["delivery_contact"]["email"] == null)//we can't process orders with no email at all hard no + throw new System.FormatException($"Vendor data empty email:{vn.VendorData}"); + var jCustomerEmail = jData["order_notification"]["purchase"]["customer_data"]["delivery_contact"]["email"].Value(); var jCustomerAccountNumber = jData["order_notification"]["purchase"]["customer_data"]["shopper_id"].Value();//appears to be mycommerce customer id number hopefully static between orders var customerBiz = CustomerBiz.GetBiz(ct); //attempt to match to existing customer //account number is most ideal match, name second but could be multiple in sockeye from rockfish sites so name will start the same, finally email if nothing else - Customer customer = await ct.Customer.FirstOrDefaultAsync(z => z.AccountNumber == jCustomerAccountNumber) ?? await ct.Customer.FirstOrDefaultAsync(z => z.Name.StartsWith(jCustomerName)) ?? await ct.Customer.FirstOrDefaultAsync(z => z.EmailAddress == jCustomerEmail); + Customer customer = await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.AccountNumber == jCustomerAccountNumber) + ?? await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.Name.StartsWith(jCustomerName)) + ?? await ct.Customer.AsNoTracking().FirstOrDefaultAsync(z => z.EmailAddress == jCustomerEmail); if (customer == null) { //New customer diff --git a/todo.txt b/todo.txt index 3ac5c65..a6d1431 100644 --- a/todo.txt +++ b/todo.txt @@ -6,6 +6,26 @@ TODO: - if v7 needs to account for there being a delay sometimes in order completeness maybe just keep adding to the order and refreshing +2023-01-23 12:07:29.9706|INFO|SERVER|RFImport MULTISITE CUSTOMER: AAA TEST DEVELOPMENT - TEMPORARY-HPE d.o.o. +2023-01-23 12:07:30.0367|INFO|SERVER|RFImport MULTISITE CUSTOMER: AAA TEST DEVELOPMENT - TestEvalMartinParsons +2023-01-23 12:07:30.1134|INFO|SERVER|RFImport MULTISITE CUSTOMER: AAA TEST DEVELOPMENT - test.onayanova.com +2023-01-23 12:07:30.1817|INFO|SERVER|RFImport MULTISITE CUSTOMER: AAA TEST DEVELOPMENT - development laptop debug mode +2023-01-23 12:07:30.2467|INFO|SERVER|RFImport MULTISITE CUSTOMER: AAA TEST DEVELOPMENT - test.helloayanova.com +2023-01-23 12:07:30.3152|INFO|SERVER|RFImport MULTISITE CUSTOMER: AAA TEST DEVELOPMENT - main +2023-01-23 12:07:41.4818|INFO|SERVER|RFImport MULTISITE CUSTOMER: Concept Machine Tool - Concept Machine Tool WI +2023-01-23 12:07:42.7496|INFO|SERVER|RFImport MULTISITE CUSTOMER: Concept Machine Tool - Concept Machine Tool Sales +2023-01-23 12:08:12.2217|INFO|SERVER|RFImport MULTISITE CUSTOMER: Morrow Service, Inc. - TestV8TrialExtension +2023-01-23 12:08:12.3234|INFO|SERVER|RFImport MULTISITE CUSTOMER: Morrow Service, Inc. - Morrow Service, Inc. +2023-01-23 12:08:24.8012|INFO|SERVER|RFImport MULTISITE CUSTOMER: Repairtek Technical Services Inc CANCELLED May 2017 - Repairtek Technical Services Inc - Project CPC +2023-01-23 12:08:24.9617|INFO|SERVER|RFImport MULTISITE CUSTOMER: Repairtek Technical Services Inc CANCELLED May 2017 - CANCELED Repairtek Technical Services Inc +2023-01-23 12:08:41.3152|INFO|SERVER|RFImport MULTISITE CUSTOMER: WE Technology Solutions, INC. - main-raven +2023-01-23 12:08:41.4872|INFO|SERVER|RFImport MULTISITE CUSTOMER: WE Technology Solutions, INC. - Main +2023-01-23 12:08:42.2448|INFO|SERVER|RFImport MULTISITE CUSTOMER: Yamaha Music Malaysia May 2017 - Yamaha Music Malaysia Sdn Bhd - ASC2 +2023-01-23 12:08:42.3657|INFO|SERVER|RFImport MULTISITE CUSTOMER: Yamaha Music Malaysia May 2017 - Yamaha Music Malaysia Sdn Bhd - ASC1 +2023-01-23 12:08:42.4901|INFO|SERVER|RFImport MULTISITE CUSTOMER: Yamaha Music Malaysia May 2017 - Yamaha Music Malaysia ASC3 +2023-01-23 12:08:42.6139|INFO|SERVER|RFImport MULTISITE CUSTOMER: Yamaha Music Malaysia May 2017 - Yamaha Music Malaysia ASC4 + + - JOB: make a license from purchases but not active ready to send / in waiting only for approval - if v7 needs to account for there being a delay sometimes in order completeness maybe just keep adding to the order and refreshing