This commit is contained in:
2019-10-01 20:32:14 +00:00
parent e513cae74a
commit 17320e714b

View File

@@ -128,14 +128,14 @@ namespace AyaNova.PlugIn.QBOI
public static Dictionary<string, string> QCompOtherPrefs = new Dictionary<string, string>();
//whether the QB company supports inventory or not
//In testing AU, CA, UK and US all support inventory if OfferingSku is "Quickbooks online plus" and not if any other value
// public static bool QBSupportsInventory = false;
// public static bool QBSupportsInventory = false;
public static string QOfferingSku = "";
//case 1062
public static bool bMainWindowOpen = false;
/// <summary>
/// The official and unchanging integration ID for
/// QBOI
@@ -294,6 +294,12 @@ namespace AyaNova.PlugIn.QBOI
const string KAT = "xZ\v\nQ\a(\fN\nX\0\a}\vO[\vZTV_\fWQ,\vV\v-";
const string KOACS = "Y?,V\f1^\0\r+\v!<0-1$\n7-9\fV\0?%#3";
const string Q2_CLIENT_ID = "ABj70Wv5gDauFd9KgKFwuvpQjfzTwEgodEG8tnBbS8mSQhNrZJ";
const string Q2_CLIENT_SECRET = "XUmJyvEcEuwQuyhARUAm0a8G3gzbEAeMiATCLyFZ";
const string Q2_REDIRECT_URL = "https://qboauth.ayanova.com/redirect";
const string Q2_ENVIRONMENT = "Sandbox";
//simple xor encryption
private static string Ec(string text, string key)
@@ -307,99 +313,163 @@ namespace AyaNova.PlugIn.QBOI
}
//OAUTH 1.x code, unchanged.
// static ServiceContext SC = null;
// static DesktopIppOAuth.OAuthConnector CN;
// //case 3671
// //Modify the below code to instead work with a static tokens obtained from qBridge (just for initial testing)
////then test that all ops work witha fresh company connection
// static public void StartAuthorization()
// {
// //case 3669
// //https://help.developer.intuit.com/s/question/0D50f00005gFeqpCAC/how-do-i-suddenly-get-there-was-an-error-while-communicating-with-the-ids-server
// System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; //Add this just to be sure to use TLS1.2
// //#if(DEBUG)
// // string KEY_APP_TOKEN_ENCRYPTED = Ec(KEY_APP_TOKEN, "Invoice");
// // string KEY_O_AUTH_CONSUMER_ENCRYPTED = Ec(KEY_O_AUTH_CONSUMER, "Invoice");
// // string KEY_O_AUTH_CONSUMER_SECRET_ENCRYPTED = Ec(KEY_O_AUTH_CONSUMER_SECRET, "Invoice");
// //#endif
// SC = null;
// CN = new OAuthConnector();
// CN.IppOAuthResultEvent += _authResultEvent;
// //CN.Connect(KEY_O_AUTH_CONSUMER, KEY_O_AUTH_CONSUMER_SECRET, "http://www.ayanova.com");
// CN.Connect(Ec(KOAC, "Invoice"), Ec(KOACS, "Invoice"), "http://www.ayanova.com");
// }
static ServiceContext SC = null;
static DesktopIppOAuth.OAuthConnector CN;
//static DesktopIppOAuth.OAuthConnector CN;
//case 3671
//Modify the below code to instead work with a static tokens obtained from qBridge (just for initial testing)
//then test that all ops work witha fresh company connection
//then test that all ops work witha fresh company connection
static public void StartAuthorization()
{
Intuit.Ipp.OAuth2PlatformClient.OAuth2Client oac = new OAuth2Client(Q2_CLIENT_ID,Q2_CLIENT_SECRET,Q2_REDIRECT_URL, Q2_ENVIRONMENT);
//case 3669
//https://help.developer.intuit.com/s/question/0D50f00005gFeqpCAC/how-do-i-suddenly-get-there-was-an-error-while-communicating-with-the-ids-server
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; //Add this just to be sure to use TLS1.2
//#if(DEBUG)
// string KEY_APP_TOKEN_ENCRYPTED = Ec(KEY_APP_TOKEN, "Invoice");
// string KEY_O_AUTH_CONSUMER_ENCRYPTED = Ec(KEY_O_AUTH_CONSUMER, "Invoice");
// string KEY_O_AUTH_CONSUMER_SECRET_ENCRYPTED = Ec(KEY_O_AUTH_CONSUMER_SECRET, "Invoice");
//#endif
SC = null;
CN = new OAuthConnector();
CN.IppOAuthResultEvent += _authResultEvent;
//CN.Connect(KEY_O_AUTH_CONSUMER, KEY_O_AUTH_CONSUMER_SECRET, "http://www.ayanova.com");
CN.Connect(Ec(KOAC, "Invoice"), Ec(KOACS, "Invoice"), "http://www.ayanova.com");
string ACCESS_TOKEN = "";
string REFRESH_TOKEN = "";
string REALM_ID = "";
}
Intuit.Ipp.Security.OAuth2RequestValidator validator = new Intuit.Ipp.Security.OAuth2RequestValidator(ACCESS_TOKEN);
SC = new Intuit.Ipp.Core.ServiceContext(REALM_ID, Intuit.Ipp.Core.IntuitServicesType.QBO, validator);
SC.IppConfiguration.Logger.RequestLog.EnableRequestResponseLogging = true;
SC.IppConfiguration.Logger.RequestLog.ServiceRequestLoggingLocation = "c:\\temp\\qblogs\\";
/// <summary>
/// Process auth event
/// </summary>
/// <param name="accessToken"></param>
/// <param name="accessTokenSecret"></param>
/// <param name="realmId"></param>
/// <param name="dataSource"></param>
static void _authResultEvent(
string accessToken,
string accessTokenSecret,
string realmId,
string dataSource)
{
//Intuit.Ipp.Security.OAuthRequestValidator oauthValidator =
// new Intuit.Ipp.Security.OAuthRequestValidator(
// accessToken,
// accessTokenSecret,
// KEY_O_AUTH_CONSUMER,
// KEY_O_AUTH_CONSUMER_SECRET);
Intuit.Ipp.Security.OAuthRequestValidator oauthValidator =
new Intuit.Ipp.Security.OAuthRequestValidator(
accessToken,
accessTokenSecret,
Ec(KOAC, "Invoice"),
Ec(KOACS, "Invoice"));
//' Common setting for both ServiceContexts:
SC = new ServiceContext(accessToken, realmId, IntuitServicesType.QBO, oauthValidator);
SC.IppConfiguration.MinorVersion.Qbo = "23";
//TODO: set up a proper retry policy look into it
//https://developer.intuit.com/docs/0100_quickbooks_online/0400_tools/0005_sdks/0010.net_tools/0050_retries
SC.IppConfiguration.BaseUrl.Qbo = "https://sandbox-quickbooks.api.intuit.com/";
//FOr now retry every 10 seconds for 3 times for total of a 30 seconds.
#if(!DEBUG)
//Can't do this because I lose the exception and the end user never sees it.
// SC.IppConfiguration.RetryPolicy = new Intuit.Ipp.Retry.IntuitRetryPolicy(3, new TimeSpan(0, 0, 10));
#endif
//' Serialization Format Json or xml
#if(DEBUG)
SC.IppConfiguration.Message.Request.SerializationFormat = Intuit.Ipp.Core.Configuration.SerializationFormat.Json;
//DANGER DANGER!!! If a retry is specified then the only exception error seen during dev is BadRequest
//and not the actual error.
//Have a case on the go about it:
//https://help.developer.intuit.com/s/case/5000f00001Bu1umAAB
SC.IppConfiguration.Message.Response.SerializationFormat = Intuit.Ipp.Core.Configuration.SerializationFormat.Json;
//SC.IppConfiguration.RetryPolicy = new Intuit.Ipp.Retry.IntuitRetryPolicy(3, new TimeSpan(0, 0, 10));
//SC.IppConfiguration.Logger.RequestLog.EnableRequestResponseLogging = true;
//SC.IppConfiguration.Logger.RequestLog.ServiceRequestLoggingLocation = @"C:\temp\QBOLOGS";
#endif
//Notify that we are authenticated
_AuthenticationCompleted = true;
//todo what happens if we don't login??
//' Compression Format can be GZip or Deflate:
//test case 3515
//System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; //Add this just to be sure to use TLS1.2
SC.IppConfiguration.Message.Request.CompressionFormat = Intuit.Ipp.Core.Configuration.CompressionFormat.GZip;
SC.IppConfiguration.Message.Response.CompressionFormat = Intuit.Ipp.Core.Configuration.CompressionFormat.GZip;
//var result = string.Empty;
//using (var webClient = new System.Net.WebClient())
//{
// result = webClient.DownloadString("https://tlstest.intuit.com");
//}
//' Retry 5 times at an interval of 1 Second if service fails. Note that RetryPolicy moved from Intuit.Ipp.Retry to Intuit.Ipp.Core.
TimeSpan retryInterval = new TimeSpan(0, 0, 0, 1);
SC.IppConfiguration.RetryPolicy = new Intuit.Ipp.Core.IntuitRetryPolicy(5, retryInterval);
//' For data updates, create DataService:
Intuit.Ipp.DataService.DataService loDataService = new Intuit.Ipp.DataService.DataService(SC);
_AuthenticationCompleted=true;
}
//
// /// <summary>
// /// Process auth event
// /// </summary>
// /// <param name="accessToken"></param>
// /// <param name="accessTokenSecret"></param>
// /// <param name="realmId"></param>
// /// <param name="dataSource"></param>
// static void _authResultEvent(
// string accessToken,
// string accessTokenSecret,
// string realmId,
// string dataSource)
// {
// //Intuit.Ipp.Security.OAuthRequestValidator oauthValidator =
// // new Intuit.Ipp.Security.OAuthRequestValidator(
// // accessToken,
// // accessTokenSecret,
// // KEY_O_AUTH_CONSUMER,
// // KEY_O_AUTH_CONSUMER_SECRET);
// Intuit.Ipp.Security.OAuthRequestValidator oauthValidator =
// new Intuit.Ipp.Security.OAuthRequestValidator(
// accessToken,
// accessTokenSecret,
// Ec(KOAC, "Invoice"),
// Ec(KOACS, "Invoice"));
// SC = new ServiceContext(accessToken, realmId, IntuitServicesType.QBO, oauthValidator);
// //TODO: set up a proper retry policy look into it
// //https://developer.intuit.com/docs/0100_quickbooks_online/0400_tools/0005_sdks/0010.net_tools/0050_retries
// //FOr now retry every 10 seconds for 3 times for total of a 30 seconds.
//#if(!DEBUG)
// //Can't do this because I lose the exception and the end user never sees it.
// // SC.IppConfiguration.RetryPolicy = new Intuit.Ipp.Retry.IntuitRetryPolicy(3, new TimeSpan(0, 0, 10));
//#endif
//#if(DEBUG)
// //DANGER DANGER!!! If a retry is specified then the only exception error seen during dev is BadRequest
// //and not the actual error.
// //Have a case on the go about it:
// //https://help.developer.intuit.com/s/case/5000f00001Bu1umAAB
// //SC.IppConfiguration.RetryPolicy = new Intuit.Ipp.Retry.IntuitRetryPolicy(3, new TimeSpan(0, 0, 10));
// //SC.IppConfiguration.Logger.RequestLog.EnableRequestResponseLogging = true;
// //SC.IppConfiguration.Logger.RequestLog.ServiceRequestLoggingLocation = @"C:\temp\QBOLOGS";
//#endif
// //Notify that we are authenticated
// _AuthenticationCompleted = true;
// //todo what happens if we don't login??
// //test case 3515
// //System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; //Add this just to be sure to use TLS1.2
// //var result = string.Empty;
// //using (var webClient = new System.Net.WebClient())
// //{
// // result = webClient.DownloadString("https://tlstest.intuit.com");
// //}
// }
#endregion authentication
#region Pre flight check
@@ -748,13 +818,13 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
//case 3520
if (QCompOtherPrefs.ContainsKey(i.Name))
{
dupeKeyFoundInCompanyInfo = true;
dupeKeyFoundInCompanyInfo = true;
}
else
{
QCompOtherPrefs.Add(i.Name, i.Value);
}
//get the exact type of QB Online
if (i.Name == "OfferingSku")
{
@@ -780,7 +850,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
//this is current as of 7/27/2017
// wrong wrong wrong apparently, need to use preferences.ProductAndServicesPrefs.QuantityOnHand is true instead
// QBSupportsInventory = (QOfferingSku == "QuickBooks Online Plus" || QOfferingSku == "QuickBooks Online");
// QBSupportsInventory = (QOfferingSku == "QuickBooks Online Plus" || QOfferingSku == "QuickBooks Online");
QCountry = comp[0].Country;//In testing it was CA for canada and US for US, GB for UK, AU for australia
@@ -794,7 +864,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
{
IntegrationLog.Log(QBID, "PFC: Failed with exception:" + CrackException(ex));
//clean connection
CN.Clean();
//CN.Clean();//removed as part of oauth2 switch
throw;
}
}
@@ -1270,7 +1340,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
#endregion
#region ToBePrinted
//No validation possible
//so prompt only if not setup yet
@@ -1343,7 +1413,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
TBEMOK:
#endregion
#region SetMemoField
//No validation possible
//so prompt only if not setup yet
@@ -1387,7 +1457,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
SETMEMOOK:
#endregion
#region SetAutoCloseField Case 7
//No validation possible
//so prompt only if not setup yet
@@ -2043,7 +2113,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
sTaxCode
});
}
@@ -2536,7 +2606,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
// }
//}
///// <summary>
///// Populate the cached qb data
///// </summary>
@@ -3302,7 +3372,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
#region Export to QB
//this code is called from AyaNova via plugin command menu on selected clients
public static void ImportAyaClient(List<Guid> objectIDList)
{
@@ -3311,7 +3381,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
//WARNING: BEFORE MAKING CHANGES HERE SEE
//MAP.CS line 1606 same code
//AND QBOI.CS single client command code line 378
//Only USA uses one tax code for the whole customer
//other regions are taxed by item and set with items
if (Util.QUSA)
@@ -4460,7 +4530,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
//Example of how to make an invoice using .net api
//https://gist.github.com/IntuitDeveloperRelations/6500373
if (alWorkorders.Count == 0) return;
try
@@ -4661,7 +4731,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
#region Part charges
//case 3296
PartDisplayFormats defaultPartDisplayFormat = AyaBizUtils.GlobalSettings.DefaultPartDisplayFormat;
PartDisplayFormats defaultPartDisplayFormat = AyaBizUtils.GlobalSettings.DefaultPartDisplayFormat;
foreach (WorkorderItem it in w.WorkorderItems)
{
@@ -5174,7 +5244,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
//Get item from cache
DataRow drItemCacheData = _dtQBItems.Rows.Find(QBListID);
DataRow drItemCacheData = _dtQBItems.Rows.Find(QBListID);
//case 3296
//Line item DESCRIPTION
@@ -5186,7 +5256,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
{
line.Description = OverrideDescriptionText;
}
//TAXES
@@ -5237,7 +5307,7 @@ KEY: AssignedTime, VALUE: 12/08/2017 18:52:04
};
lineList.Add(line);
//QBO MAY BE RELEVANT: For Invoice objects in global locales: when updating Amount, remove the TxnTaxDetail element in the object before submitting it in the update request payload.
}