From 4ce60133e3b3cb174da60a3f25646eeb526ac59d Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 4 Jul 2022 21:59:05 +0000 Subject: [PATCH] --- AyaNovaQBI/util.cs | 218 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 188 insertions(+), 30 deletions(-) diff --git a/AyaNovaQBI/util.cs b/AyaNovaQBI/util.cs index 534d0fb..e8591a3 100644 --- a/AyaNovaQBI/util.cs +++ b/AyaNovaQBI/util.cs @@ -3122,6 +3122,161 @@ namespace AyaNovaQBI #endregion quickbooks Terms + + #region Change QB Item price + + public static async Task ChangeQBItemPrice(string QBListID, decimal NewPrice) + { + + //Added: 18-Nov-2006 CASE 92 + //check if inventory item as this code only handles price changing for inventory + //items in qb + qbitemtype qtype = (qbitemtype)QBItems.Rows.Find(QBListID)["Type"]; + if (qtype != qbitemtype.Inventory) + { + MessageBox.Show("Only inventory items in QuickBooks can have their price changed\r\n" + + "The current item is of type: " + qtype.ToString()); + return; + } + + //----Get the edit sequence----- + string sEditSequence = GetInventoryItemEditSequence(QBListID); + + //Connect to QB and fill + // IY: Create the session manager object using QBFC + QBSessionManager sessionManager = new QBSessionManager(); + + // IY: We want to know if we begun a session so we can end it if an + // error happens + bool booSessionBegun = false; + + try + { + // IY: Get the RequestMsgSet based on the correct QB Version + IMsgSetRequest requestSet = getLatestMsgSetRequest(sessionManager); + + // IY: Initialize the message set request object + requestSet.Attributes.OnError = ENRqOnError.roeStop; + + + + + + + //------change the price---- + // IY: Add the request to the message set request object + IItemInventoryMod ItemQ = requestSet.AppendItemInventoryModRq(); + + ItemQ.ListID.SetValue(QBListID); + ItemQ.EditSequence.SetValue(sEditSequence); + ItemQ.SalesPrice.SetValue((double)NewPrice); + + //This is intended to be called after already sucessfully connected + //to get version info so no special safety checks here + sessionManager.OpenConnection2("", "AyaNova QBI", ENConnectionType.ctLocalQBDLaunchUI); + sessionManager.BeginSession("", ENOpenMode.omDontCare); + booSessionBegun = true; + + // IY: Do the request and get the response message set object + IMsgSetResponse responseSet = sessionManager.DoRequests(requestSet); + //------------------------- + + + + //-------------- + // IY: Close the session and connection with QuickBooks + sessionManager.EndSession(); + booSessionBegun = false; + sessionManager.CloseConnection(); + QBItems.Rows.Find(QBListID)["Price"] = NewPrice; + + } + catch (Exception ex) + { + await IntegrationLog("ChangeQBItemPrice: Failed with exception:" + ex.Message); + if (booSessionBegun) + { + sessionManager.EndSession(); + sessionManager.CloseConnection(); + } + throw; + } + } + + public static async Task GetInventoryItemEditSequenceAsync(string QBListID) + { + //Connect to QB and fill + // IY: Create the session manager object using QBFC + QBSessionManager sessionManager = new QBSessionManager(); + + // IY: We want to know if we begun a session so we can end it if an + // error happens + bool booSessionBegun = false; + + try + { + // IY: Get the RequestMsgSet based on the correct QB Version + IMsgSetRequest requestSet = getLatestMsgSetRequest(sessionManager); + + // IY: Initialize the message set request object + requestSet.Attributes.OnError = ENRqOnError.roeStop; + + //----Get the edit sequence----- + // IY: Add the request to the message set request object + IItemInventoryQuery iq = requestSet.AppendItemInventoryQueryRq(); + + //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); + + + + + //This is intended to be called after already sucessfully connected + //to get version info so no special safety checks here + sessionManager.OpenConnection2("", "AyaNova QBI", ENConnectionType.ctLocalQBDLaunchUI); + sessionManager.BeginSession("", ENOpenMode.omDontCare); + booSessionBegun = true; + + // IY: Do the request and get the response message set object + IMsgSetResponse responseSet = sessionManager.DoRequests(requestSet); + //------------------------- + IResponse response = responseSet.ResponseList.GetAt(0); + + //Added: 18-Nov-2006 nonzero status codes 500 and higher are serious errors, less than 500 could just mean no matching items in list + if (response.StatusCode > 499) + { + throw new ApplicationException(response.StatusMessage + " Code: " + response.StatusCode); + + } + + + IItemInventoryRetList il = response.Detail as IItemInventoryRetList; + IItemInventoryRet i = il.GetAt(0); + string EditSequence = i.EditSequence.GetValue(); + + + //-------------- + // IY: Close the session and connection with QuickBooks + sessionManager.EndSession(); + booSessionBegun = false; + sessionManager.CloseConnection(); + return EditSequence; + + } + catch (Exception ex) + { + await IntegrationLog("PopulateQBItems: Failed with exception:" + ex.Message); + if (booSessionBegun) + { + sessionManager.EndSession(); + sessionManager.CloseConnection(); + } + throw; + } + } + #endregion + #endregion QB api helper methods end #region AyaNova cached lists @@ -4748,19 +4903,19 @@ namespace AyaNovaQBI public static async Task RefreshQBPartFromAyaNova(Part c) { - IntegrationMap im = QBI.Maps[c.ID]; + 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.ForeignID); + DataRow dr = _dtQBItems.Rows.Find(im.IntegrationItemId); if (dr == null) return; //QBListID not found in part list? - - string sName = c.PartNumber; + + string sName = c.Name; if (sName.Length > 31) sName = sName.Substring(0, 31); - string sDescription = PartPickList.GetOnePart(c.ID)[0].DisplayName(AyaBizUtils.GlobalSettings.DefaultPartDisplayFormat); + string sDescription = c.Description;// PartPickList.GetOnePart(c.ID)[0].DisplayName(AyaBizUtils.GlobalSettings.DefaultPartDisplayFormat); if (sDescription.Length > 4095) sDescription = sDescription.Substring(0, 4095); @@ -4789,7 +4944,7 @@ namespace AyaNovaQBI // IY: Add the request to the message set request object IItemInventoryMod ca = requestSet.AppendItemInventoryModRq(); //Get and set edit sequence - string sEditSequence = GetInventoryItemEditSequence(im.ForeignID); + string sEditSequence = await GetInventoryItemEditSequenceAsync(im.IntegrationItemId); @@ -4802,10 +4957,10 @@ namespace AyaNovaQBI dr["SalesDesc"] = sDescription; //dr["ReorderPoint"] = 0; dr["Modified"] = DateTime.Now; - dr["VendorID"] = c.WholesalerID.ToString(); - + dr["VendorID"] = c.WholeSalerId.ToString(); + //Set the QB item identification and edit sequence - ca.ListID.SetValue(im.ForeignID); + ca.ListID.SetValue(im.IntegrationItemId); ca.EditSequence.SetValue(sEditSequence); @@ -4878,13 +5033,16 @@ namespace AyaNovaQBI // _dtQBItems.Rows.Add(dr); //Link - // IntegrationMap m = QBI.Maps.Add(QBI); - //m.Name = sName; - // m.RootObjectID = c.ID; - // m.RootObjectType = RootObjectTypes.Part; + //// IntegrationMap m = QBI.Maps.Add(QBI); + ////m.Name = sName; + //// m.RootObjectID = c.ID; + //// m.RootObjectType = RootObjectTypes.Part; + //im.LastSync = DateTime.Now; + ////m.ForeignID = sNewID; + //QBI = (Integration)QBI.Save(); + //v8NOTE: name was not set here as you can see above, maybe on purpose? leaving as is, not sure why but safest option to copy what was done before im.LastSync = DateTime.Now; - //m.ForeignID = sNewID; - QBI = (Integration)QBI.Save(); + await SaveIntegrationObject(); } catch (Exception ex) { @@ -4911,15 +5069,15 @@ namespace AyaNovaQBI /// Import a list of ayanova parts to QuickBooks /// /// - public static void ImportAyaPart(List objectIDList) + public static async Task ImportAyaPart(List objectIDList) { ArrayList alErrors = new ArrayList(); - foreach (Guid g in objectIDList) + foreach (long ayid in objectIDList) { try { - ImportAyaPart(g, alErrors); + await ImportAyaPart(ayid, alErrors); } catch { }; @@ -4952,34 +5110,32 @@ namespace AyaNovaQBI /// /// /// An arraylist to hold strings indicating errors on fail - public static void ImportAyaPart(Guid PartID, ArrayList alErrors) + public static async Task ImportAyaPart(long PartID, ArrayList alErrors) { - if (!Part.Exists(PartID, "")) + if (!AyaPartList.Any(z => z.Id == PartID)) { alErrors.Add("ImportAyaPart: Part not found in AyaNova (deleted recently?) (" + PartID.ToString() + ")"); return; } - Part c = Part.GetItem(PartID); + var r = await GetAsync($"part/{PartID}"); + var c = r.ObjectResponse["data"].ToObject(); - - - - string sName = c.PartNumber; + string sName = c.Name; if (sName.Length > 31) { sName = sName.Substring(0, 31); - alErrors.Add("ImportAyaPart: AyaNova part number exceeds 31 character limit for QuickBooks\r\n" + - "Number: " + c.PartNumber + "\r\n" + + alErrors.Add("ImportAyaPart: AyaNova part name exceeds 31 character limit for QuickBooks\r\n" + + "Name: " + c.Name + "\r\n" + "will be imported as: " + sName); } - string sDescription = PartPickList.GetOnePart(c.ID)[0].DisplayName(AyaBizUtils.GlobalSettings.DefaultPartDisplayFormat); + string sDescription = c.Description;//PartPickList.GetOnePart(c.ID)[0].DisplayName(AyaBizUtils.GlobalSettings.DefaultPartDisplayFormat); if (sDescription.Length > 4095) { sDescription = sDescription.Substring(0, 4095); - alErrors.Add("ImportAyaPart: AyaNova part full display name exceeds 4095 character limit for sales description in QuickBooks\r\n" + + alErrors.Add("ImportAyaPart: AyaNova part Description exceeds 4095 character limit for sales description in QuickBooks\r\n" + "will be imported as: " + sDescription); } @@ -5016,7 +5172,7 @@ namespace AyaNovaQBI dr["SalesDesc"] = sDescription; dr["ReorderPoint"] = 0; dr["Modified"] = DateTime.MinValue; - dr["VendorID"] = c.WholesalerID.ToString(); + dr["VendorID"] = c.WholeSalerId.ToString(); //------------------------ //Set the qb item values @@ -5029,6 +5185,8 @@ namespace AyaNovaQBI ca.SalesPrice.SetValue((double)c.Retail); ca.PurchaseCost.SetValue((double)c.Cost); + + HERE TODO NEXT if (AyaBizUtils.GlobalSettings.UseInventory) { PartInventoryValuesFetcher pbw = PartInventoryValuesFetcher.GetItem(c.ID);