diff --git a/AyaNovaQBI/Map.cs b/AyaNovaQBI/Map.cs index 78df197..ec48fd4 100644 --- a/AyaNovaQBI/Map.cs +++ b/AyaNovaQBI/Map.cs @@ -71,6 +71,20 @@ namespace AyaNovaQBI "Are you sure?", "Import AyaNova objects", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; await ImportToQuickBooks(); + switch (_Type) + { + case AyaType.Customer: + await util.PopulateQBClientCacheAsync(); + break; + case AyaType.Vendor: + await util.PopulateQBVendorCacheAsync(); + break; + case AyaType.ServiceRate: + case AyaType.TravelRate: + case AyaType.Part: + await util.PopulateQBItemCacheAsync(); + break; + } } else { @@ -1029,28 +1043,39 @@ namespace AyaNovaQBI long AyaId = (long)r.Cells[1].Value; //only linked items can be updated - IntegrationItem m = util.QBIntegration.Items.FirstOrDefault(z => z.ObjectId == AyaId && z.AType == _Type); - if (m != null) + IntegrationItem im = util.QBIntegration.Items.FirstOrDefault(z => z.ObjectId == AyaId && z.AType == _Type); + if (im != null) { switch (_Type) { - case AyaType.Customer: - sType = "Customers"; + await util.RefreshAyaNovaCustomerFromQBAsync(im); break; case AyaType.Vendor: - sType = "Vendors"; + await util.RefreshAyaNovaVendorFromQBAsync(im); break; case AyaType.Part: - await util.RefreshAyaNovaPartFromQB(AyaId, PricesOnly); + await util.RefreshAyaNovaPartFromQBAsync(im, PricesOnly); break; } SaveIntegration = true; - } } + switch (_Type) + { + + case AyaType.Customer: + await util.PopulateAyaClientList(); + break; + case AyaType.Vendor: + await util.PopulateAyaVendorList(); + break; + case AyaType.Part: + await util.PopulateAyaPartList(); + break; + } @@ -1058,45 +1083,47 @@ namespace AyaNovaQBI } else { - #region QB GRID - //################ - //QB GRID - // + #region QB GRID - if (gridQB.SelectedRows.Count > 1) + foreach (DataGridViewRow r in gridQB.SelectedRows) { - MessageBox.Show("You can not link more than one QuickBooks\r\n" + - "object to a single AyaNova object", "Not supported", MessageBoxButtons.OK, MessageBoxIcon.Information); - return; + // var QBItemName = gridQB.SelectedRows[0].Cells[0].Value.ToString(); + var QBItemId = gridQB.SelectedRows[0].Cells[1].Value.ToString(); + + //only linked items can be updated + IntegrationItem im = util.QBIntegration.Items.FirstOrDefault(z => z.IntegrationItemId == QBItemId && z.AType == _Type); + if (im != null) + { + switch (_Type) + { + + case AyaType.Customer: + await util.RefreshQBCustomerFromAyaNova(im); + break; + case AyaType.Vendor: + await util.RefreshQVendorFromAyaNova(im); + break; + case AyaType.Part: + await util.RefreshQBPartFromAyaNova(im, PricesOnly); + break; + } + SaveIntegration = true; + } } - var QBItemName = gridQB.SelectedRows[0].Cells[0].Value.ToString(); - var QBItemId = gridQB.SelectedRows[0].Cells[1].Value.ToString(); - - MapSelectAyaNovaItem s = new MapSelectAyaNovaItem(); - s.Items = _aya; - if (s.ShowDialog() == DialogResult.Cancel) - return; - - var AyaId = s.SelectedItemId; - s.Dispose(); - - //This way is a one to one mapping so only one iteration and two potential things to do, add or change link - //Is it already present? - IntegrationItem m = util.QBIntegration.Items.FirstOrDefault(z => z.ObjectId == AyaId && z.AType == _Type); - if (m != null) + switch (_Type) { - m.IntegrationItemId = QBItemId; - m.IntegrationItemName = QBItemName; - m.LastSync = System.DateTime.Now; - SaveIntegration = true; - } - else - { - //not already present, so add it - m = new IntegrationItem { AType = _Type, IntegrationItemName = QBItemName, IntegrationItemId = QBItemId, LastSync = System.DateTime.Now, ObjectId = AyaId }; - util.QBIntegration.Items.Add(m); - SaveIntegration = true; + case AyaType.Customer: + await util.PopulateQBClientCacheAsync(); + break; + case AyaType.Vendor: + await util.PopulateQBVendorCacheAsync(); + break; + case AyaType.ServiceRate: + case AyaType.TravelRate: + case AyaType.Part: + await util.PopulateQBItemCacheAsync(); + break; } #endregion qb grid diff --git a/AyaNovaQBI/util.cs b/AyaNovaQBI/util.cs index 7c24c6f..b9a5369 100644 --- a/AyaNovaQBI/util.cs +++ b/AyaNovaQBI/util.cs @@ -3542,39 +3542,20 @@ namespace AyaNovaQBI #region Import / refresh to AyaNova - //public static async Task RefreshAyaNovaClientFromQB(List objectIDList) - //{ - // await PopulateQBClientCacheAsync(); - // foreach (long id in objectIDList) - // { - // try - // { - // var r = await GetAsync($"customer/{id}"); - // var c = r.ObjectResponse["data"].ToObject(); - // RefreshAyaNovaClientFromQB(c); - // r = await PutAsync($"customer", Newtonsoft.Json.JsonConvert.SerializeObject(c)); - // } - // catch { }; - // } - - //} - - public static async void RefreshAyaNovaClientFromQB(Customer c) + public static async Task RefreshAyaNovaCustomerFromQBAsync(IntegrationItem im) { - await PopulateQBClientCacheAsync(); - IntegrationItem im = util.QBIntegration.Items.FirstOrDefault(z => z.ObjectId == c.Id && z.AType == AyaType.Customer); - if (im == null) return;//this client is not linked + if (im == null) return;//this object is not linked + var r = await GetAsync($"customer/{im.ObjectId}"); + var c = r.ObjectResponse["data"].ToObject(); + if (c == null) return; DataRow dr = _dtQBClients.Rows.Find(im.IntegrationItemId); if (dr == null) return; //QBListID not found in client list? - CopyQBCustomerInfoToAyaNovaClient(dr, c); - string sName = dr["FullName"].ToString(); - - c.Name = sName; - + await PutAsync($"customer", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + im.LastSync = DateTime.Now; } @@ -3718,6 +3699,52 @@ namespace AyaNovaQBI } + public static async Task RefreshAyaNovaVendorFromQBAsync(IntegrationItem im) + { + if (im == null) return;//this object is not linked + var r = await GetAsync($"vendor/{im.ObjectId}"); + var c = r.ObjectResponse["data"].ToObject(); + if (c == null) return; + + DataRow dr = _dtQBClients.Rows.Find(im.IntegrationItemId); + if (dr == null) return; //QBListID not found in client list? + + //CopyQBVendorInfoToAyaNovaVendor(dr, c); + Address a = (Address)dr["MailAddress"]; + c.PostAddress = a.DeliveryAddress; + c.PostCity = a.City; + c.PostRegion = a.StateProv; + c.PostCountry = a.Country; + c.PostCode = a.Postal; + + a = (Address)dr["StreetAddress"]; + c.Address = a.DeliveryAddress; + c.City = a.City; + c.Region = a.StateProv; + c.Country = a.Country; + + c.Contact = dr["Contact"].ToString(); + if (dr["Phone"].ToString() != "") + c.Phone1 = dr["Phone"].ToString(); + + if (dr["Fax"].ToString() != "") + c.Phone2 = dr["Fax"].ToString(); + + if (dr["AltPhone"].ToString() != "") + c.Phone3 = dr["AltPhone"].ToString(); + + if (dr["Email"].ToString() != "") + c.EmailAddress = dr["Email"].ToString(); + + if (dr["Account"].ToString() != "") + c.AccountNumber = dr["Account"].ToString(); + + string sName = dr["FullName"].ToString(); + c.Name = sName; + await PutAsync($"vendor", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + im.LastSync = DateTime.Now; + } + /// /// Import the indicated Vendor /// to an AyaNova vendor record @@ -3773,73 +3800,23 @@ namespace AyaNovaQBI c.Region = a.StateProv; c.Country = a.Country; - - //Contact cn=c.Contacts.Add(RootObjectTypes.Vendor,c.ID); - c.Contact = dr["Contact"].ToString(); - ////if it's completely empty we'll substitute the word Contact instead - //if(qbcontact=="") - // cn.FirstName="Contact"; - //else - //{ - // //default it first - // cn.FirstName=qbcontact; - - // string [] contactnames=null; - // if(qbcontact.IndexOf(" ")!=-1) - // contactnames=qbcontact.Replace(",","").Split(' ');//replace any commas if present - // else - // if(qbcontact.IndexOf(",")!=-1) - // contactnames=qbcontact.Split(','); - - // //Quickbooks just has one field for contact so - // //we'll assume the english speaking tradition of firstname space lastname - // //if there is a space otherwise we'll assume it's just a first name if there are no spaces in it - // if(contactnames!=null && contactnames.GetLength(0)>1) - // { - // cn.FirstName=contactnames[0]; - // cn.LastName=contactnames[1]; - // } - - //} - - //Phone field + if (dr["Phone"].ToString() != "") - { - //ContactPhone cp=cn.Phones.Add(cn); - //cp.ContactPhoneType=ContactPhoneTypes.Business; c.Phone1 = dr["Phone"].ToString(); - //case 124 - //cp.PhoneDefault=true; - } - - //Fax field + if (dr["Fax"].ToString() != "") - { - //ContactPhone cp=cn.Phones.Add(cn); - //cp.ContactPhoneType=ContactPhoneTypes.Fax; c.Phone2 = dr["Fax"].ToString(); - } - - //AltPhone field + if (dr["AltPhone"].ToString() != "") - { - //ContactPhone cp=cn.Phones.Add(cn); - //cp.ContactPhoneType=ContactPhoneTypes.Business; - c.Phone3 = dr["AltPhone"].ToString(); - } - - //Email field - if (dr["Email"].ToString() != "") - { + c.Phone3 = dr["AltPhone"].ToString(); + + if (dr["Email"].ToString() != "") c.EmailAddress = dr["Email"].ToString(); - } - - //Account number - if (dr["Account"].ToString() != "") - { + + if (dr["Account"].ToString() != "") c.AccountNumber = dr["Account"].ToString(); - } + //Try to save and return errors if not in alerrors var r = await PostAsync($"vendor", Newtonsoft.Json.JsonConvert.SerializeObject(c)); @@ -4058,44 +4035,29 @@ namespace AyaNovaQBI - //public static async Task RefreshAyaNovaPartFromQB(List objectIDList) - //{ - // await PopulateQBItemCache(); - // foreach (long id in objectIDList) - // { - // try - // { - // 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 async Task RefreshAyaNovaPartFromQB(long PartId, bool pricesOnly = false) + public static async Task RefreshAyaNovaPartFromQBAsync(IntegrationItem im, bool pricesOnly = false) { - var r = await GetAsync($"part/{PartId}"); + if (im == null) return;//this part is not linked + var r = await GetAsync($"part/{im.ObjectId}"); var c = r.ObjectResponse["data"].ToObject(); if (c == null) return; - 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.IntegrationItemId); if (dr == null) return; //QBListID not found in part list? - string sName = dr["FullName"].ToString(); - - c.Name = sName; - - c.Description = T(255, dr["SalesDesc"].ToString()); - c.WholeSalerId = AyaVendorForQBItem(im.IntegrationItemId); + if (!pricesOnly) + { + string sName = dr["FullName"].ToString(); + c.Name = sName; + c.Description = T(255, dr["SalesDesc"].ToString()); + c.WholeSalerId = AyaVendorForQBItem(im.IntegrationItemId); + } c.Retail = (decimal)dr["Price"]; c.Cost = (decimal)dr["Cost"]; - + await PutAsync($"part", Newtonsoft.Json.JsonConvert.SerializeObject(c)); + im.LastSync = DateTime.Now; } @@ -4975,17 +4937,18 @@ namespace AyaNovaQBI /// Refresh the indicated AyaNova part /// to it's linked QuickBooks item record /// - public static async Task RefreshQBPartFromAyaNova(long PartId, bool pricesOnly = false) + public static async Task RefreshQBPartFromAyaNova(IntegrationItem im, bool pricesOnly = false) { - var r = await GetAsync($"part/{PartId}"); + if (im == null) return;//this object is not linked + var r = await GetAsync($"part/{im.ObjectId}"); var c = r.ObjectResponse["data"].ToObject(); + if (c == null) return; - IntegrationItem im = 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.IntegrationItemId); if (dr == null) return; //QBListID not found in part list? + string sName = c.Name; if (sName.Length > 31) sName = sName.Substring(0, 31); @@ -5083,6 +5046,8 @@ namespace AyaNovaQBI booSessionBegun = false; sessionManager.CloseConnection(); im.LastSync = DateTime.Now; + if (!pricesOnly) + im.IntegrationItemName = sName; } catch (Exception ex)