diff --git a/server/biz/GlobalBizSettingsBiz.cs b/server/biz/GlobalBizSettingsBiz.cs index 10ecddf..d607dff 100644 --- a/server/biz/GlobalBizSettingsBiz.cs +++ b/server/biz/GlobalBizSettingsBiz.cs @@ -298,108 +298,165 @@ namespace Sockeye.Biz #endregion customers - #region CASES - log.LogInformation("RFImport Cases"); - //case projects to be tags - List CaseProjectList = new List(); + #region VENDOR NOTIFICATIONS + log.LogInformation("RFImport Vendor notifications"); { - res = await client.GetAsync($"{URL_ROCKFISH}api/rfcaseproject"); + + res = await client.GetAsync($"{URL_ROCKFISH}api/vendor-notifications/list"); responseText = await res.Content.ReadAsStringAsync(); + var jaVendorNotificationList = JArray.Parse(responseText); - var jaRFCaseProjectList = JArray.Parse(responseText); - foreach (JObject jRFCaseProject in jaRFCaseProjectList) + foreach (JObject jVendorNotificationItem in jaVendorNotificationList) { - CaseProjectList.Add(new NameIdItem() { Name = jRFCaseProject["name"].Value(), Id = jRFCaseProject["id"].Value() }); + /*[] + "{\n \"creation_date\": \"2022-12-28T20:20:24Z\",\n \ + "id\": 356247074,\n \ + "order_notification\": {\n \ + "purchase\": {\n \"customer_data\": {\n \"billing_contact\": {\n \"address\": {\n \"city\": \"Alpharetta\",\n \"country\": \"USA\",\n \"country_id\": \"US\",\n + \"postal_code\": \"30009\",\n \"state\": \"Georgia\",\n \"state_id\": \"GA\",\n \"street1\": \"11675 Rainwater Dr., Suite 350\"\n }, + \n …tart\": \"\",\n \"renewal_type\": \"auto\",\n \"retention_discount_count\": \"\",\n \"retention_discount_percent\": \"\",\n \ + "start_date\": \"2022-12-28T00:00:00\",\n \"status\": \"ToProcess\",\n \"status_id\": \"TOP\"\n },\n \ + "vat_pct\": 0.0,\n \"your_product_id\": \"perpetual\"\n }\n ],\n + \"purchase_origin\": \"online\",\n \"sequential_invoice_no\": \"e5-US-2022-00001637070\"\n }\n }\n}" - } + { + "id": 25, + "dtCreated": 1670375661, + "vendor": "shareit", + "data": "{\n \"creation_date\": \"2022-12-07T01:14:19Z\",\n \"id\": 354935062,\n \"order_notification\": {\n \"purchase\": {\n \"customer_data\": {\n \"billing_contact\": {\n \"address\": {\n \"city\": \"Abbotsford\",\n \"country\": \"Canada\",\n \"country_id\": \"CA\",\n \"postal_code\": \"V2S 8M1\",\n \"state\": \"British Columbia\",\n \"state_id\": \"BC\",\n \"street1\": \"35355 McKee Rd\"\n },\n \"company\": \"Adtech Systems Inc.\",\n \"email\": \"erling@myadtech.com\",\n \"first_name\": \"Erling\",\n \"last_name\": \"Lassesen\"\n },\n \"customer_payment_data\": {\n \"currency\": \"USD\",\n \"payment_method\": \"PayPal\"\n },\n \"delivery_contact\": {\n \"address\": {\n \"city\": \"Abbotsford\",\n \"country\": \"Canada\",\n \"country_id\": \"CA\",\n \"postal_code\": \"V2S 8M1\",\n \"state\": \"British Columbia\",\n \"state_id\": \"BC\",\n \"street1\": \"35355 McKee Rd\"\n },\n \"company\": \"Adtech Systems Inc.\",\n \"email\": \"erling@myadtech.com\",\n \"first_name\": \"Erling\",\n \"last_name\": \"Lassesen\"\n },\n \"language\": \"English\",\n \"language_iso\": \"en\",\n \"reg_name\": \"Adtech Systems Inc.\",\n \"shopper_id\": \"50862261\",\n \"subscribe_newsletter\": true,\n \"user_id\": \"erling@adtech-systems.com-4\"\n },\n \"is_test\": false,\n \"payment_complete_date\": \"2022-12-07T01:14:19Z\",\n \"payment_status\": \"complete\",\n \"payment_status_id\": \"PCA\",\n \"purchase_date\": \"2022-12-07T01:14:16Z\",\n \"purchase_id\": 833707313,\n \"purchase_item\": [\n {\n \"accounting\": {\n \"currency\": \"USD\",\n \"product_net\": 55.65,\n \"discount\": 0.0,\n \"product_vat\": 6.68,\n \"shipping\": 0.0,\n \"shipping_vat\": 0.0,\n \"eu_vat\": -6.68,\n \"margin_net\": -5.44,\n \"your_revenue\": 50.21\n },\n \"additional_information\": [\n {\n \"additional_id\": \"ADDITIONAL1\",\n \"additional_value\": \"YES\"\n },\n {\n \"additional_id\": \"ADDITIONAL2\",\n \"additional_value\": \"YES\"\n },\n {\n \"additional_id\": \"ADDITIONAL3\",\n \"additional_value\": \"YES\"\n }\n ],\n \"currency\": \"USD\",\n \"delivery_type\": \"Electronically\",\n \"discount\": 0.0,\n \"extended_download_price\": 0.0,\n \"manual_order_price\": 0.0,\n \"notification_no\": 7926,\n \"product_id\": 300740315,\n \"product_name\": \"Single AyaNova schedulable resource 1 year subscription license\",\n \"product_single_price\": 55.65,\n \"purchase_item_key\": [],\n \"quantity\": 1,\n \"running_no\": 1,\n \"shipping_price\": 0.0,\n \"shipping_vat_pct\": 0.0,\n \"subscription\": {\n \"expiration_date\": \"2023-12-07T17:28:16Z\",\n \"id\": \"550286373-1\",\n \"interval\": \"Yearly without end\",\n \"original_notification_no\": \"6872\",\n \"original_purchase_id\": \"550286373\",\n \"original_running_no\": \"1\",\n \"renewal_discount_count\": \"\",\n \"renewal_discount_start\": \"\",\n \"renewal_type\": \"auto\",\n \"retention_discount_count\": \"\",\n \"retention_discount_percent\": \"\",\n \"start_date\": \"2017-12-07T00:00:00\",\n \"status\": \"ToProcess\",\n \"status_id\": \"TOP\"\n },\n \"vat_pct\": 12.0\n }\n ],\n \"purchase_origin\": \"Subscription\",\n \"sequential_invoice_no\": \"e5-DE-2022-00002647549\"\n }\n }\n}", + "dtProcessed": null, + "processed": false + }, + */ - } - { - res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/list"); - responseText = await res.Content.ReadAsStringAsync(); - var jaRFCaseList = JArray.Parse(responseText); - //some cases are missing the start date so substitute a close other case date (not critical but sb at least in the ballpark for list viewing purposes) - DateTime dtTempCreated = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc); - foreach (JObject jRFCase in jaRFCaseList) - { - - var g = new GZCase(); - g.CaseId = jRFCase["id"].Value(); - g.Closed = DateUtil.EpochToDateNullIsNull(jRFCase["dtClosed"].Value()); - //NOTE: closed in rockfish was the date at midnight in GMT - //so to be in the same day as here need to add a few hours, let's say 8 am for each so add 8 hours - if (g.Closed != null) + var jData = JObject.Parse(jVendorNotificationItem["data"].Value()); + var salesOrderNumber = jData["order_notification"]["purchase"]["purchase_id"].Value(); + var p = await ct.Purchase.FirstOrDefaultAsync(z => z.SalesOrderNumber == salesOrderNumber); + if (p == null) { - g.Closed = ((DateTime)g.Closed).AddHours(16); - } - - //fuckery to try to insert a at least semi close date when created date is missing - DateTime? dtTemp = DateUtil.EpochToDateNullIsNull(jRFCase["dtCreated"].Value()); - if (dtTemp == null) - { - dtTemp = dtTempCreated; + log.LogError($"RFImport Vendor notifications can't match sales order number {salesOrderNumber}"); + log.LogError(jData["order_notification"].ToString()); } else { - dtTempCreated = (DateTime)dtTemp; - } - g.Created = (DateTime)dtTemp; - g.Name = jRFCase["title"].Value(); - g.Notes = jRFCase["notes"].Value(); + if (!string.IsNullOrWhiteSpace(p.VendorData)) + p.VendorData += ",\n"; + p.VendorData += jVendorNotificationItem["data"].Value(); + await ct.SaveChangesAsync(); + // var biz = PurchaseBiz.GetBiz(ct); + // await biz.PutAsync(p); + } - var ver = jRFCase["releaseVersion"].Value(); - if (!string.IsNullOrWhiteSpace(ver)) - g.Notes += $"\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\nReleased on version:{ver}"; - - var releaseNotes = jRFCase["releaseNotes"].Value(); - if (!string.IsNullOrWhiteSpace(releaseNotes)) - g.Notes += $"\nRelease notes:{releaseNotes}"; - - //Project name to tags - g.Tags.Add(CaseProjectList.FirstOrDefault(z => z.Id == jRFCase["rfCaseProjectId"].Value()).Name.Replace("z_", "legacy-")); - - //priority to tags - g.Tags.Add($"{jRFCase["priority"].Value()}-priority"); - - //check for attachments and just add as a note, don't bother with actual transfer of attachment, there aren't a lot and most are way in the past and not required for anything - //if needed in future can manually xfer it over from the rockfish.sqlite db directly using DB BRowser for sqlite which allows opening the blob from the rfcaseblob table and saving it - res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/{g.CaseId}/attachments"); - responseText = await res.Content.ReadAsStringAsync(); - var jAttachments = JObject.Parse(responseText); - if (jAttachments["attach"].Count() > 0) - { - g.Notes += "\n********\nRockfish attachments\n"; - foreach (JObject jAttachmentRecord in jAttachments["attach"]) - { - g.Notes += $"File: \"{jAttachmentRecord["name"].Value()}\", rfcaseblob table id: {jAttachmentRecord["id"].Value()}\n"; - - } - g.Notes += "\n********\n"; - } - - GZCaseBiz biz = GZCaseBiz.GetBiz(ct); - await biz.CreateAsync(g); - - //attachments example 86400000 - // /api/rfcase/4360/attachments - //{"dlkey":"ZFkAUpo1L0Gi3Q9aO5szkA","attach":[{"id":259,"name":"desired weight calcs.txt"}]} - //{"dlkey":"iR6ncD70CkzkozyT0otA","attach":[]} + }// all vendor notifications loop - - - }// all cases loop - - //Start next case with a new sequence caseid of 4444 - using (var command = ct.Database.GetDbConnection().CreateCommand()) - { - command.CommandText = $"ALTER SEQUENCE agzcase_caseid_seq RESTART WITH 4443;"; - await ct.Database.OpenConnectionAsync(); - await command.ExecuteNonQueryAsync(); - await ct.Database.CloseConnectionAsync(); - } } + #endregion vendor notifications + + + #region CASES + + // log.LogInformation("RFImport Cases"); + // //case projects to be tags + // List CaseProjectList = new List(); + // { + // res = await client.GetAsync($"{URL_ROCKFISH}api/rfcaseproject"); + // responseText = await res.Content.ReadAsStringAsync(); + + // var jaRFCaseProjectList = JArray.Parse(responseText); + // foreach (JObject jRFCaseProject in jaRFCaseProjectList) + // { + // CaseProjectList.Add(new NameIdItem() { Name = jRFCaseProject["name"].Value(), Id = jRFCaseProject["id"].Value() }); + + // } + + // } + // { + // res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/list"); + // responseText = await res.Content.ReadAsStringAsync(); + // var jaRFCaseList = JArray.Parse(responseText); + // //some cases are missing the start date so substitute a close other case date (not critical but sb at least in the ballpark for list viewing purposes) + // DateTime dtTempCreated = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc); + // foreach (JObject jRFCase in jaRFCaseList) + // { + + // var g = new GZCase(); + // g.CaseId = jRFCase["id"].Value(); + // g.Closed = DateUtil.EpochToDateNullIsNull(jRFCase["dtClosed"].Value()); + // //NOTE: closed in rockfish was the date at midnight in GMT + // //so to be in the same day as here need to add a few hours, let's say 8 am for each so add 8 hours + // if (g.Closed != null) + // { + // g.Closed = ((DateTime)g.Closed).AddHours(16); + // } + + // //fuckery to try to insert a at least semi close date when created date is missing + // DateTime? dtTemp = DateUtil.EpochToDateNullIsNull(jRFCase["dtCreated"].Value()); + // if (dtTemp == null) + // { + // dtTemp = dtTempCreated; + // } + // else + // { + // dtTempCreated = (DateTime)dtTemp; + // } + // g.Created = (DateTime)dtTemp; + // g.Name = jRFCase["title"].Value(); + // g.Notes = jRFCase["notes"].Value(); + + // var ver = jRFCase["releaseVersion"].Value(); + // if (!string.IsNullOrWhiteSpace(ver)) + // g.Notes += $"\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\nReleased on version:{ver}"; + + // var releaseNotes = jRFCase["releaseNotes"].Value(); + // if (!string.IsNullOrWhiteSpace(releaseNotes)) + // g.Notes += $"\nRelease notes:{releaseNotes}"; + + // //Project name to tags + // g.Tags.Add(CaseProjectList.FirstOrDefault(z => z.Id == jRFCase["rfCaseProjectId"].Value()).Name.Replace("z_", "legacy-")); + + // //priority to tags + // g.Tags.Add($"{jRFCase["priority"].Value()}-priority"); + + // //check for attachments and just add as a note, don't bother with actual transfer of attachment, there aren't a lot and most are way in the past and not required for anything + // //if needed in future can manually xfer it over from the rockfish.sqlite db directly using DB BRowser for sqlite which allows opening the blob from the rfcaseblob table and saving it + // res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/{g.CaseId}/attachments"); + // responseText = await res.Content.ReadAsStringAsync(); + // var jAttachments = JObject.Parse(responseText); + // if (jAttachments["attach"].Count() > 0) + // { + // g.Notes += "\n********\nRockfish attachments\n"; + // foreach (JObject jAttachmentRecord in jAttachments["attach"]) + // { + // g.Notes += $"File: \"{jAttachmentRecord["name"].Value()}\", rfcaseblob table id: {jAttachmentRecord["id"].Value()}\n"; + + // } + // g.Notes += "\n********\n"; + // } + + // GZCaseBiz biz = GZCaseBiz.GetBiz(ct); + // await biz.CreateAsync(g); + + // //attachments example 86400000 + // // /api/rfcase/4360/attachments + // //{"dlkey":"ZFkAUpo1L0Gi3Q9aO5szkA","attach":[{"id":259,"name":"desired weight calcs.txt"}]} + // //{"dlkey":"iR6ncD70CkzkozyT0otA","attach":[]} + + + + + // }// all cases loop + + // //Start next case with a new sequence caseid of 4444 + // using (var command = ct.Database.GetDbConnection().CreateCommand()) + // { + // command.CommandText = $"ALTER SEQUENCE agzcase_caseid_seq RESTART WITH 4443;"; + // await ct.Database.OpenConnectionAsync(); + // await command.ExecuteNonQueryAsync(); + // await ct.Database.CloseConnectionAsync(); + // } + // } #endregion cases @@ -615,60 +672,6 @@ namespace Sockeye.Biz } #endregion trial requests - #region VENDOR NOTIFICATIONS - log.LogInformation("RFImport Vendor notifications"); - { - - res = await client.GetAsync($"{URL_ROCKFISH}api/vendor-notifications/list"); - responseText = await res.Content.ReadAsStringAsync(); - var jaVendorNotificationList = JArray.Parse(responseText); - - foreach (JObject jVendorNotificationItem in jaVendorNotificationList) - { - /*[] - "{\n \"creation_date\": \"2022-12-28T20:20:24Z\",\n \ - "id\": 356247074,\n \ - "order_notification\": {\n \ - "purchase\": {\n \"customer_data\": {\n \"billing_contact\": {\n \"address\": {\n \"city\": \"Alpharetta\",\n \"country\": \"USA\",\n \"country_id\": \"US\",\n - \"postal_code\": \"30009\",\n \"state\": \"Georgia\",\n \"state_id\": \"GA\",\n \"street1\": \"11675 Rainwater Dr., Suite 350\"\n }, - \n …tart\": \"\",\n \"renewal_type\": \"auto\",\n \"retention_discount_count\": \"\",\n \"retention_discount_percent\": \"\",\n \ - "start_date\": \"2022-12-28T00:00:00\",\n \"status\": \"ToProcess\",\n \"status_id\": \"TOP\"\n },\n \ - "vat_pct\": 0.0,\n \"your_product_id\": \"perpetual\"\n }\n ],\n - \"purchase_origin\": \"online\",\n \"sequential_invoice_no\": \"e5-US-2022-00001637070\"\n }\n }\n}" - - { - "id": 25, - "dtCreated": 1670375661, - "vendor": "shareit", - "data": "{\n \"creation_date\": \"2022-12-07T01:14:19Z\",\n \"id\": 354935062,\n \"order_notification\": {\n \"purchase\": {\n \"customer_data\": {\n \"billing_contact\": {\n \"address\": {\n \"city\": \"Abbotsford\",\n \"country\": \"Canada\",\n \"country_id\": \"CA\",\n \"postal_code\": \"V2S 8M1\",\n \"state\": \"British Columbia\",\n \"state_id\": \"BC\",\n \"street1\": \"35355 McKee Rd\"\n },\n \"company\": \"Adtech Systems Inc.\",\n \"email\": \"erling@myadtech.com\",\n \"first_name\": \"Erling\",\n \"last_name\": \"Lassesen\"\n },\n \"customer_payment_data\": {\n \"currency\": \"USD\",\n \"payment_method\": \"PayPal\"\n },\n \"delivery_contact\": {\n \"address\": {\n \"city\": \"Abbotsford\",\n \"country\": \"Canada\",\n \"country_id\": \"CA\",\n \"postal_code\": \"V2S 8M1\",\n \"state\": \"British Columbia\",\n \"state_id\": \"BC\",\n \"street1\": \"35355 McKee Rd\"\n },\n \"company\": \"Adtech Systems Inc.\",\n \"email\": \"erling@myadtech.com\",\n \"first_name\": \"Erling\",\n \"last_name\": \"Lassesen\"\n },\n \"language\": \"English\",\n \"language_iso\": \"en\",\n \"reg_name\": \"Adtech Systems Inc.\",\n \"shopper_id\": \"50862261\",\n \"subscribe_newsletter\": true,\n \"user_id\": \"erling@adtech-systems.com-4\"\n },\n \"is_test\": false,\n \"payment_complete_date\": \"2022-12-07T01:14:19Z\",\n \"payment_status\": \"complete\",\n \"payment_status_id\": \"PCA\",\n \"purchase_date\": \"2022-12-07T01:14:16Z\",\n \"purchase_id\": 833707313,\n \"purchase_item\": [\n {\n \"accounting\": {\n \"currency\": \"USD\",\n \"product_net\": 55.65,\n \"discount\": 0.0,\n \"product_vat\": 6.68,\n \"shipping\": 0.0,\n \"shipping_vat\": 0.0,\n \"eu_vat\": -6.68,\n \"margin_net\": -5.44,\n \"your_revenue\": 50.21\n },\n \"additional_information\": [\n {\n \"additional_id\": \"ADDITIONAL1\",\n \"additional_value\": \"YES\"\n },\n {\n \"additional_id\": \"ADDITIONAL2\",\n \"additional_value\": \"YES\"\n },\n {\n \"additional_id\": \"ADDITIONAL3\",\n \"additional_value\": \"YES\"\n }\n ],\n \"currency\": \"USD\",\n \"delivery_type\": \"Electronically\",\n \"discount\": 0.0,\n \"extended_download_price\": 0.0,\n \"manual_order_price\": 0.0,\n \"notification_no\": 7926,\n \"product_id\": 300740315,\n \"product_name\": \"Single AyaNova schedulable resource 1 year subscription license\",\n \"product_single_price\": 55.65,\n \"purchase_item_key\": [],\n \"quantity\": 1,\n \"running_no\": 1,\n \"shipping_price\": 0.0,\n \"shipping_vat_pct\": 0.0,\n \"subscription\": {\n \"expiration_date\": \"2023-12-07T17:28:16Z\",\n \"id\": \"550286373-1\",\n \"interval\": \"Yearly without end\",\n \"original_notification_no\": \"6872\",\n \"original_purchase_id\": \"550286373\",\n \"original_running_no\": \"1\",\n \"renewal_discount_count\": \"\",\n \"renewal_discount_start\": \"\",\n \"renewal_type\": \"auto\",\n \"retention_discount_count\": \"\",\n \"retention_discount_percent\": \"\",\n \"start_date\": \"2017-12-07T00:00:00\",\n \"status\": \"ToProcess\",\n \"status_id\": \"TOP\"\n },\n \"vat_pct\": 12.0\n }\n ],\n \"purchase_origin\": \"Subscription\",\n \"sequential_invoice_no\": \"e5-DE-2022-00002647549\"\n }\n }\n}", - "dtProcessed": null, - "processed": false - }, - */ - - var jData = JObject.Parse(jVendorNotificationItem["data"].Value()); - var salesOrderNumber = jData["order_notification"]["purchase"]["purchase_id"].Value(); - var p = await ct.Purchase.FirstOrDefaultAsync(z => z.SalesOrderNumber == salesOrderNumber); - if (p == null) - { - log.LogError($"RFImport Vendor notifications can't match sales order number {salesOrderNumber}"); - } - else - { - if (!string.IsNullOrWhiteSpace(p.VendorData)) - p.VendorData += ",\n"; - p.VendorData += jVendorNotificationItem["data"].Value(); - - var biz = PurchaseBiz.GetBiz(ct); - await biz.PutAsync(p); - } - - }// all vendor notifications loop - - - } - #endregion vendor notifications - } catch (Exception ex)