From 2f8e5db01c3df13ca46355ca5bd1e8d4e82a2179 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Tue, 5 Jul 2022 22:03:08 +0000 Subject: [PATCH] --- AyaNovaQBI/util.cs | 319 +++++++++++++++++++++++++-------------------- 1 file changed, 177 insertions(+), 142 deletions(-) diff --git a/AyaNovaQBI/util.cs b/AyaNovaQBI/util.cs index 7085201..c725425 100644 --- a/AyaNovaQBI/util.cs +++ b/AyaNovaQBI/util.cs @@ -564,7 +564,7 @@ namespace AyaNovaQBI //PFC - get global setttings for use inventory and others await window.$gz.api.get("global-biz-setting/client"); r = await GetAsync("global-biz-setting/client"); - USE_INVENTORY=r.ObjectResponse["data"]["UseInventory"].Value(); + USE_INVENTORY = r.ObjectResponse["data"]["UseInventory"].Value(); //return object for future reference //var ret = new //{ @@ -3258,7 +3258,7 @@ namespace AyaNovaQBI //v8NOTE apparently this was changed in the api so if it fails need to dig in docs but it's a close match so suspect they just "improved" upon it with a breaking change //iq.ORListQuery.ListIDList.Add(QBListID); iq.ORListQueryWithOwnerIDAndClass.ListIDList.Add(QBListID); - + @@ -3296,7 +3296,7 @@ namespace AyaNovaQBI } catch (Exception ex) { - await IntegrationLog("PopulateQBItems: Failed with exception:" + ex.Message); + await IntegrationLog("PopulateQBItems: Failed with exception:" + ex.Message); if (booSessionBegun) { sessionManager.EndSession(); @@ -3539,7 +3539,7 @@ namespace AyaNovaQBI var r = await GetAsync($"customer/{id}"); var c = r.ObjectResponse["data"].ToObject(); RefreshAyaNovaClientFromQB(c); - r=await PutAsync($"customer", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + r = await PutAsync($"customer", Newtonsoft.Json.JsonConvert.SerializeObject(c)); } catch { }; } @@ -3549,7 +3549,7 @@ namespace AyaNovaQBI public static async void RefreshAyaNovaClientFromQB(Customer c) { await PopulateQBClientCacheAsync(); - IntegrationItem im = util.QBIntegration.Items.FirstOrDefault(z => z.ObjectId == c.Id && z.AType == AyaType.Customer); + IntegrationItem im = util.QBIntegration.Items.FirstOrDefault(z => z.ObjectId == c.Id && z.AType == AyaType.Customer); if (im == null) return;//this client is not linked DataRow dr = _dtQBClients.Rows.Find(im.IntegrationItemId); @@ -3558,8 +3558,7 @@ namespace AyaNovaQBI CopyQBCustomerInfoToAyaNovaClient(dr, c); string sName = dr["FullName"].ToString(); - if (sName.Length > 255) - sName = sName.Substring(0, 255); + c.Name = sName; @@ -3610,13 +3609,13 @@ namespace AyaNovaQBI CopyQBCustomerInfoToAyaNovaClient(dr, c); //Try to save and return errors if not in alerrors - r=await PostAsync($"customer", Newtonsoft.Json.JsonConvert.SerializeObject(c)); - long newCustomerId=IdFromResponse(r); + r = await PostAsync($"customer", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + long newCustomerId = IdFromResponse(r); //Link var m = new IntegrationItem { AType = AyaType.Customer, IntegrationItemName = sName, IntegrationItemId = QuickBooksID, LastSync = DateTime.Now, ObjectId = newCustomerId }; QBIntegration.Items.Add(m); - await util.SaveIntegrationObject(); + await SaveIntegrationObject(); //IntegrationMap m = QBI.Maps.Add(QBI); //m.Name = sName; //m.RootObjectID = c.ID; @@ -3754,11 +3753,10 @@ namespace AyaNovaQBI c.PostCode = a.Postal; a = (Address)dr["StreetAddress"]; - c.GoToAddress.DeliveryAddress = a.DeliveryAddress; - c.GoToAddress.City = a.City; - c.GoToAddress.StateProv = a.StateProv; - c.GoToAddress.Country = a.Country; - c.GoToAddress.Postal = a.Postal; + c.Address = a.DeliveryAddress; + c.City = a.City; + c.Region = a.StateProv; + c.Country = a.Country; //Contact cn=c.Contacts.Add(RootObjectTypes.Vendor,c.ID); @@ -3819,7 +3817,7 @@ namespace AyaNovaQBI //Email field if (dr["Email"].ToString() != "") { - c.Email = dr["Email"].ToString(); + c.EmailAddress = dr["Email"].ToString(); } //Account number @@ -3828,23 +3826,32 @@ namespace AyaNovaQBI c.AccountNumber = dr["Account"].ToString(); } - if (!c.IsSavable) - { - alErrors.Add("ImportQBVendor: AyaNova won't allow import of " + c.Name + "\r\n" + - "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); - return; - } + //Try to save and return errors if not in alerrors + var r = await PostAsync($"vendor", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + long newId = IdFromResponse(r); - - c = (Vendor)c.Save(); //Link - IntegrationMap m = QBI.Maps.Add(QBI); - m.Name = sName; - m.RootObjectID = c.ID; - m.RootObjectType = RootObjectTypes.Vendor; - m.LastSync = DateTime.Now; - m.ForeignID = QuickBooksID; - QBI = (Integration)QBI.Save(); + var m = new IntegrationItem { AType = AyaType.Vendor, IntegrationItemName = sName, IntegrationItemId = QuickBooksID, LastSync = DateTime.Now, ObjectId = newId }; + QBIntegration.Items.Add(m); + await util.SaveIntegrationObject(); + + //if (!c.IsSavable) + //{ + // alErrors.Add("ImportQBVendor: AyaNova won't allow import of " + c.Name + "\r\n" + + // "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); + // return; + //} + + + //c = (Vendor)c.Save(); + ////Link + //IntegrationMap m = QBI.Maps.Add(QBI); + //m.Name = sName; + //m.RootObjectID = c.ID; + //m.RootObjectType = RootObjectTypes.Vendor; + //m.LastSync = DateTime.Now; + //m.ForeignID = QuickBooksID; + //QBI = (Integration)QBI.Save(); } catch (Exception ex) { @@ -3876,59 +3883,69 @@ namespace AyaNovaQBI } string sName = dr["FullName"].ToString(); - if (sName.Length > 255) - { - alErrors.Add("ImportQBRate: QuickBooks Rate name exceeds 255 character limit for AyaNova\r\n" + - "Name: " + dr["FullName"].ToString() + "\r\n" + - "was imported as: " + sName); - sName = sName.Substring(0, 255); - } + //if (sName.Length > 255) + //{ + // alErrors.Add("ImportQBRate: QuickBooks Rate name exceeds 255 character limit for AyaNova\r\n" + + // "Name: " + dr["FullName"].ToString() + "\r\n" + + // "was imported as: " + sName); + // sName = sName.Substring(0, 255); + //} try { //already a Rate by that name - if (Rate.Exists(Guid.Empty, dr["FullName"].ToString())) + //if (Rate.Exists(Guid.Empty, dr["FullName"].ToString())) + if (QBIntegration.Items.Any(z => z.AType == AyaType.ServiceRate && z.IntegrationItemName == dr["FullName"].ToString())) { - alErrors.Add("ImportQBRate: " + dr["FullName"].ToString() + " already exists in AyaNova"); + alErrors.Add("ImportQBServiceRate: " + dr["FullName"].ToString() + " already exists in AyaNova"); return; } //Import seems safe... - Rates rates = Rates.GetItems(false); - Rate c = rates.Add(); - c.RateType = AsRateType; + //Rates rates = Rates.GetItems(false); + //Rate c = rates.Add(); + //c.RateType = AsRateType; + ServiceRate c = new ServiceRate(); + c.Name = sName; c.Charge = (decimal)dr["Price"]; - c.ContractRate = false; + //c.ContractRate = false; c.Cost = (decimal)dr["Cost"]; - c.Description = T(255, dr["SalesDesc"].ToString()); + c.Notes = T(255, dr["SalesDesc"].ToString()); // c.RateUnitChargeDescriptionID = MostLikelyRateUnitChargeDescriptionID; - if (!c.IsSavable) - { - alErrors.Add("ImportQBRate: AyaNova won't allow import of " + c.Name + "\r\n" + - "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); - return; - } + //if (!c.IsSavable) + //{ + // alErrors.Add("ImportQBRate: AyaNova won't allow import of " + c.Name + "\r\n" + + // "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); + // return; + //} - rates = (Rates)rates.Save(); + //rates = (Rates)rates.Save(); + ////Link + //IntegrationMap m = QBI.Maps.Add(QBI); + //m.Name = sName; + //m.RootObjectID = c.ID; + //m.RootObjectType = RootObjectTypes.Rate; + //m.LastSync = DateTime.Now; + //m.ForeignID = QuickBooksID; + //QBI = (Integration)QBI.Save(); + var r = await PostAsync($"service-rate", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + long newId = IdFromResponse(r); + //Link - IntegrationMap m = QBI.Maps.Add(QBI); - m.Name = sName; - m.RootObjectID = c.ID; - m.RootObjectType = RootObjectTypes.Rate; - m.LastSync = DateTime.Now; - m.ForeignID = QuickBooksID; - QBI = (Integration)QBI.Save(); + var m = new IntegrationItem { AType = AyaType.ServiceRate, IntegrationItemName = sName, IntegrationItemId = QuickBooksID, LastSync = DateTime.Now, ObjectId = newId }; + QBIntegration.Items.Add(m); + await util.SaveIntegrationObject(); } catch (Exception ex) { //crack the exception in case it's a generic dataportal one //and it is if it's got an inner exception of any kind if (ex.InnerException != null) ex = ex.InnerException; - alErrors.Add("ImportQBRate: AyaNova won't allow import / link of " + sName + "\r\n" + + alErrors.Add("ImportQBServiceRate: AyaNova won't allow import / link of " + sName + "\r\n" + "Due to the following error:\r\n" + ex.Message); } @@ -3953,59 +3970,69 @@ namespace AyaNovaQBI } string sName = dr["FullName"].ToString(); - if (sName.Length > 255) - { - alErrors.Add("ImportQBRate: QuickBooks Rate name exceeds 255 character limit for AyaNova\r\n" + - "Name: " + dr["FullName"].ToString() + "\r\n" + - "was imported as: " + sName); - sName = sName.Substring(0, 255); - } + //if (sName.Length > 255) + //{ + // alErrors.Add("ImportQBRate: QuickBooks Rate name exceeds 255 character limit for AyaNova\r\n" + + // "Name: " + dr["FullName"].ToString() + "\r\n" + + // "was imported as: " + sName); + // sName = sName.Substring(0, 255); + //} try { //already a Rate by that name - if (Rate.Exists(Guid.Empty, dr["FullName"].ToString())) + //if (Rate.Exists(Guid.Empty, dr["FullName"].ToString())) + if (QBIntegration.Items.Any(z => z.AType == AyaType.TravelRate && z.IntegrationItemName == dr["FullName"].ToString())) { - alErrors.Add("ImportQBRate: " + dr["FullName"].ToString() + " already exists in AyaNova"); + alErrors.Add("ImportQBTravelRate: " + dr["FullName"].ToString() + " already exists in AyaNova"); return; } //Import seems safe... - Rates rates = Rates.GetItems(false); - Rate c = rates.Add(); - c.RateType = AsRateType; + //Rates rates = Rates.GetItems(false); + //Rate c = rates.Add(); + //c.RateType = AsRateType; + TravelRate c = new TravelRate(); c.Name = sName; c.Charge = (decimal)dr["Price"]; - c.ContractRate = false; + //c.ContractRate = false; c.Cost = (decimal)dr["Cost"]; - c.Description = T(255, dr["SalesDesc"].ToString()); + c.Notes = T(255, dr["SalesDesc"].ToString()); // c.RateUnitChargeDescriptionID = MostLikelyRateUnitChargeDescriptionID; - if (!c.IsSavable) - { - alErrors.Add("ImportQBRate: AyaNova won't allow import of " + c.Name + "\r\n" + - "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); - return; - } + //if (!c.IsSavable) + //{ + // alErrors.Add("ImportQBRate: AyaNova won't allow import of " + c.Name + "\r\n" + + // "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); + // return; + //} - rates = (Rates)rates.Save(); + //rates = (Rates)rates.Save(); + ////Link + //IntegrationMap m = QBI.Maps.Add(QBI); + //m.Name = sName; + //m.RootObjectID = c.ID; + //m.RootObjectType = RootObjectTypes.Rate; + //m.LastSync = DateTime.Now; + //m.ForeignID = QuickBooksID; + //QBI = (Integration)QBI.Save(); + + var r = await PostAsync($"travel-rate", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + long newId = IdFromResponse(r); + //Link - IntegrationMap m = QBI.Maps.Add(QBI); - m.Name = sName; - m.RootObjectID = c.ID; - m.RootObjectType = RootObjectTypes.Rate; - m.LastSync = DateTime.Now; - m.ForeignID = QuickBooksID; - QBI = (Integration)QBI.Save(); + var m = new IntegrationItem { AType = AyaType.TravelRate, IntegrationItemName = sName, IntegrationItemId = QuickBooksID, LastSync = DateTime.Now, ObjectId = newId }; + QBIntegration.Items.Add(m); + await util.SaveIntegrationObject(); } catch (Exception ex) { //crack the exception in case it's a generic dataportal one //and it is if it's got an inner exception of any kind if (ex.InnerException != null) ex = ex.InnerException; - alErrors.Add("ImportQBRate: AyaNova won't allow import / link of " + sName + "\r\n" + + alErrors.Add("ImportQBTravelRate: AyaNova won't allow import / link of " + sName + "\r\n" + "Due to the following error:\r\n" + ex.Message); } @@ -4014,39 +4041,38 @@ namespace AyaNovaQBI - public static void RefreshAyaNovaPartFromQB(List objectIDList) + public static async Task RefreshAyaNovaPartFromQB(List objectIDList) { - PopulateQBItemCache(); - foreach (Guid g in objectIDList) + await PopulateQBItemCache(); + foreach (long id in objectIDList) { try { - Part c = Part.GetItem(g); - RefreshAyaNovaPartFromQB(c); - if (c.IsSavable) - c.Save(); + var r = await GetAsync($"part/{id}"); + var c = r.ObjectResponse["data"].ToObject(); + await RefreshAyaNovaPartFromQB(c); + r = await PutAsync($"part", Newtonsoft.Json.JsonConvert.SerializeObject(c)); } catch { }; } } - public static void RefreshAyaNovaPartFromQB(Part c) + public static async Task RefreshAyaNovaPartFromQB(Part c) { - PopulateQBItemCache(); - IntegrationMap im = QBI.Maps[c.ID]; + await PopulateQBItemCache(); + IntegrationItem im = util.QBIntegration.Items.FirstOrDefault(z => z.ObjectId == c.Id && z.AType == AyaType.Part); if (im == null) return;//this part is not linked - DataRow dr = _dtQBItems.Rows.Find(im.ForeignID); + DataRow dr = _dtQBItems.Rows.Find(im.IntegrationItemId); if (dr == null) return; //QBListID not found in part list? string sName = dr["FullName"].ToString(); - if (sName.Length > 255) - sName = sName.Substring(0, 255); - c.PartNumber = sName; - c.Name = T(255, dr["SalesDesc"].ToString()); - c.WholesalerID = AyaVendorForQBItem(im.ForeignID); + c.Name = sName; + + c.Description = T(255, dr["SalesDesc"].ToString()); + c.WholeSalerId = AyaVendorForQBItem(im.ForeignID); c.Retail = (decimal)dr["Price"]; c.Cost = (decimal)dr["Cost"]; @@ -4074,52 +4100,61 @@ namespace AyaNovaQBI } string sName = dr["FullName"].ToString(); - if (sName.Length > 255) - { - alErrors.Add("ImportQBPart: QuickBooks Part name exceeds 255 character limit for AyaNova part number\r\n" + - "Name: " + dr["FullName"].ToString() + "\r\n" + - "was imported as: " + sName); - sName = sName.Substring(0, 255); - } + //if (sName.Length > 255) + //{ + // alErrors.Add("ImportQBPart: QuickBooks Part name exceeds 255 character limit for AyaNova part number\r\n" + + // "Name: " + dr["FullName"].ToString() + "\r\n" + + // "was imported as: " + sName); + // sName = sName.Substring(0, 255); + //} try { //already a Part by that number? - if (Part.Exists(Guid.Empty, dr["FullName"].ToString())) + if (QBIntegration.Items.Any(z => z.AType == AyaType.Part && z.IntegrationItemName == dr["FullName"].ToString())) { - alErrors.Add("ImportQBPart: Part number " + dr["FullName"].ToString() + " already exists in AyaNova"); + alErrors.Add("ImportQBPart: Part name " + dr["FullName"].ToString() + " already exists in AyaNova"); return; } //Import seems safe... - Part c = Part.NewItem(); + Part c = new Part(); - c.PartNumber = sName; - c.Name = T(255, dr["SalesDesc"].ToString()); - c.WholesalerID = AyaVendorForQBItem(QuickBooksID); + c.Name = sName; + c.Description = T(255, dr["SalesDesc"].ToString()); + c.WholeSalerId = AyaVendorForQBItem(QuickBooksID); c.Retail = (decimal)dr["Price"]; c.Cost = (decimal)dr["Cost"]; - if (!c.IsSavable) - { - alErrors.Add("ImportQBPart: AyaNova won't allow import of " + c.Name + "\r\n" + - "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); - return; - } + //if (!c.IsSavable) + //{ + // alErrors.Add("ImportQBPart: AyaNova won't allow import of " + c.Name + "\r\n" + + // "Due to the following broken rules:\r\n" + c.GetBrokenRulesString()); + // return; + //} - //Save and get ready to provide the ID - c = (Part)c.Save(); + ////Save and get ready to provide the ID + //c = (Part)c.Save(); + + ////Link + //IntegrationMap m = QBI.Maps.Add(QBI); + //m.Name = sName; + //m.RootObjectID = c.ID; + //m.RootObjectType = RootObjectTypes.Part; + //m.LastSync = DateTime.Now; + //m.ForeignID = QuickBooksID; + //QBI = (Integration)QBI.Save(); + + //Try to save and return errors if not in alerrors + var r = await PostAsync($"part", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + long newId = IdFromResponse(r); //Link - IntegrationMap m = QBI.Maps.Add(QBI); - m.Name = sName; - m.RootObjectID = c.ID; - m.RootObjectType = RootObjectTypes.Part; - m.LastSync = DateTime.Now; - m.ForeignID = QuickBooksID; - QBI = (Integration)QBI.Save(); + var m = new IntegrationItem { AType = AyaType.Customer, IntegrationItemName = sName, IntegrationItemId = QuickBooksID, LastSync = DateTime.Now, ObjectId = newId }; + QBIntegration.Items.Add(m); + await SaveIntegrationObject(); } catch (Exception ex) { @@ -4829,8 +4864,8 @@ namespace AyaNovaQBI } ca.VendorAddress.City.SetValue(T(31, c.PostCity)); ca.VendorAddress.Country.SetValue(T(31, c.PostCountry)); - ca.VendorAddress.PostalCode.SetValue(T(13, c.PostCode)); - ca.VendorAddress.State.SetValue(T(21, c.PostRegion)); + ca.VendorAddress.PostalCode.SetValue(T(13, c.PostCode)); + ca.VendorAddress.State.SetValue(T(21, c.PostRegion)); ca.AccountNumber.SetValue(T(99, c.AccountNumber)); @@ -4942,7 +4977,7 @@ namespace AyaNovaQBI DataRow dr = _dtQBItems.Rows.Find(im.IntegrationItemId); if (dr == null) return; //QBListID not found in part list? - + string sName = c.Name; if (sName.Length > 31) sName = sName.Substring(0, 31); @@ -4992,7 +5027,7 @@ namespace AyaNovaQBI //dr["ReorderPoint"] = 0; dr["Modified"] = DateTime.Now; dr["VendorID"] = c.WholeSalerId.ToString(); - + //Set the QB item identification and edit sequence ca.ListID.SetValue(im.IntegrationItemId); ca.EditSequence.SetValue(sEditSequence); @@ -5220,13 +5255,13 @@ namespace AyaNovaQBI ca.SalesPrice.SetValue((double)c.Retail); ca.PurchaseCost.SetValue((double)c.Cost); - + if (USE_INVENTORY) { var rstocklevel = await GetAsync($"part/stock-levels/{c.Id}"); - var partstocklevel= rstocklevel.ObjectResponse["data"].ToObject(); + var partstocklevel = rstocklevel.ObjectResponse["data"].ToObject(); var rinventorylevel = await GetAsync($"part/latest-inventory/{c.Id}"); - var partinventories = rstocklevel.ObjectResponse["data"].ToObject< List>(); + var partinventories = rstocklevel.ObjectResponse["data"].ToObject>(); ca.QuantityOnHand.SetValue((double)partinventories.Sum(z => z.Balance)); ca.ReorderPoint.SetValue((double)partstocklevel.MinimumQuantity); @@ -5317,7 +5352,7 @@ namespace AyaNovaQBI /// /// /// An arraylist to hold strings indicating errors on fail - public static async Task ImportAyaServiceRate(long RateID, ArrayList alErrors) + public static async Task ImportAyaServiceRate(long RateID, ArrayList alErrors) { if (!AyaServiceRateList.Any(z => z.Id == RateID)) @@ -5330,7 +5365,7 @@ namespace AyaNovaQBI var r = await GetAsync($"service-rate/{RateID}"); var c = r.ObjectResponse["data"].ToObject(); - + string sName = c.Name; if (sName.Length > 31) {