public void GetAllXmlTest() { string expected = @"<?xml version=""1.0"" encoding=""utf-8""?> <function controlid=""unittest""> <readByQuery> <object>CLASS</object> <query /> <fields>RECORDNO</fields> <pagesize>100</pagesize> <returnFormat>xml</returnFormat> <docparid>255252235</docparid> </readByQuery> </function>"; ReadByQuery record = new ReadByQuery("unittest") { ObjectName = "CLASS", PageSize = 100, Fields = new List <string> { "RECORDNO", }, DocParId = "255252235" }; this.CompareXml(expected, record); }
public void MaxPageSizeTest() { ReadByQuery record = new ReadByQuery("unittest"); var ex = Record.Exception(() => record.PageSize = 1001); Assert.IsType <ArgumentException>(ex); Assert.Equal("Page Size cannot be greater than 1000", ex.Message); }
/// <summary> /// Caches Data about Account Lists for an Orgization /// </summary> /// <param name="Org"></param> /// <returns></returns> private async Task CacheAccountList(int Org) { // Items to build our lists var accountList = new Dictionary <string, GLAccount>(); var accountTypeList = new Dictionary <string, GLType>(); // Perform Priming Read ReadByQuery read = new ReadByQuery { ObjectName = "GLACCOUNT", PageSize = 1000 }; var client = GetClient(Org); var onlineResponse = await client.Execute(read); var xmlResult = onlineResponse.Results.First(); xmlResult.EnsureStatusSuccess(); // Process Results ExtractInfoFromXML(xmlResult.Data, xmlResult.ListType, accountList, accountTypeList); int receivedCount = xmlResult.Count; while (receivedCount < xmlResult.TotalCount) { // Read Additional Pages of Data ReadMore more = new ReadMore(xmlResult.ControlId) { ResultId = xmlResult.ResultId }; onlineResponse = await client.Execute(more); xmlResult = onlineResponse.Results.First(); xmlResult.EnsureStatusSuccess(); // Process Results ExtractInfoFromXML(xmlResult.Data, xmlResult.ListType, accountList, accountTypeList); // Increment the Counter receivedCount += xmlResult.Count; } // Save to Cache _cache.Set(String.Format(cacheTypesFormat, Org), accountTypeList.Values.OrderBy(glt => glt.AccountTypeCode).AsEnumerable(), new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(Math.Max(1, _config.CacheMinutes)) }); _cache.Set(String.Format(cacheNameFormat, Org), accountList.Values.OrderBy(acct => acct.AccountTypeCode).ThenBy(acct => acct.AccountCode).AsEnumerable(), new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(Math.Max(1, _config.CacheMinutes)) }); }
public void InvalidReturnFormatTest() { Stream stream = new MemoryStream(); XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Encoding = Encoding.UTF8; xmlSettings.Indent = true; xmlSettings.IndentChars = " "; IaXmlWriter xml = new IaXmlWriter(stream, xmlSettings); ReadByQuery readByQuery = new ReadByQuery("unittest"); readByQuery.ReturnFormat = "blah"; }
public void MaxPageSizeTest() { Stream stream = new MemoryStream(); XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Encoding = Encoding.UTF8; xmlSettings.Indent = true; xmlSettings.IndentChars = " "; IaXmlWriter xml = new IaXmlWriter(stream, xmlSettings); ReadByQuery readByQuery = new ReadByQuery("unittest"); readByQuery.PageSize = 1001; }
public void ParamOverridesTest() { string expected = @"<?xml version=""1.0"" encoding=""utf-8""?> <function controlid=""unittest""> <readByQuery> <object>CLASS</object> <query /> <fields>RECORDNO</fields> <pagesize>100</pagesize> <returnFormat>xml</returnFormat> <docparid>255252235</docparid> </readByQuery> </function>"; Stream stream = new MemoryStream(); XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Encoding = Encoding.UTF8; xmlSettings.Indent = true; xmlSettings.IndentChars = " "; IaXmlWriter xml = new IaXmlWriter(stream, xmlSettings); ReadByQuery readByQuery = new ReadByQuery("unittest"); readByQuery.ObjectName = "CLASS"; readByQuery.PageSize = 100; readByQuery.ReturnFormat = "xml"; readByQuery.Fields = new List <string> { "RECORDNO", }; readByQuery.DocParId = "255252235"; readByQuery.WriteXml(ref xml); xml.Flush(); stream.Position = 0; StreamReader reader = new StreamReader(stream); Diff xmlDiff = DiffBuilder.Compare(expected).WithTest(reader.ReadToEnd()) .WithDifferenceEvaluator(DifferenceEvaluators.Default) .Build(); Assert.IsFalse(xmlDiff.HasDifferences(), xmlDiff.ToString()); }
/// <summary> /// Returns a list of all known Customer Types from Intacct /// </summary> /// <param name="client"></param> /// <returns></returns> private async Task <IList <string> > GetCustTypes(OnlineClient client, PerformContext context) { // Get Types (assume less than 1000 exist) ReadByQuery read = new ReadByQuery { ObjectName = "CUSTTYPE", PageSize = 1000 }; context.WriteLine("Loading Customer Types from Intacct"); var response = await client.Execute(read); var xmlResult = response.Results.First(); xmlResult.EnsureStatusSuccess(); return(new List <string>(xmlResult.Data.Select(el => el.Element("NAME").Value))); }
public void GetXmlTest() { string expected = @"<?xml version=""1.0"" encoding=""utf-8""?> <function controlid=""unittest""> <readByQuery> <object>CLASS</object> <query>RECORDNO < 2</query> <fields>*</fields> <pagesize>1000</pagesize> <returnFormat>xml</returnFormat> </readByQuery> </function>"; ReadByQuery record = new ReadByQuery("unittest") { ObjectName = "CLASS", Query = new QueryString("RECORDNO < 2"), }; this.CompareXml(expected, record); }
public void DefaultParamsTest() { string expected = @"<?xml version=""1.0"" encoding=""utf-8""?> <function controlid=""unittest""> <readByQuery> <object>CLASS</object> <query>RECORDNO < 2</query> <fields>*</fields> <pagesize>1000</pagesize> <returnFormat>xml</returnFormat> </readByQuery> </function>"; Stream stream = new MemoryStream(); XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Encoding = Encoding.UTF8; xmlSettings.Indent = true; xmlSettings.IndentChars = " "; IaXmlWriter xml = new IaXmlWriter(stream, xmlSettings); ReadByQuery readByQuery = new ReadByQuery("unittest") { ObjectName = "CLASS", Query = "RECORDNO < 2" }; readByQuery.WriteXml(ref xml); xml.Flush(); stream.Position = 0; StreamReader reader = new StreamReader(stream); Diff xmlDiff = DiffBuilder.Compare(expected).WithTest(reader.ReadToEnd()) .WithDifferenceEvaluator(DifferenceEvaluators.Default) .Build(); Assert.IsFalse(xmlDiff.HasDifferences(), xmlDiff.ToString()); }
public static bool InvoiceExists(string invoiceNum, out System.Xml.Linq.XElement invoice) { invoice = null; //Set this justincase the function explodes try { var query = new ReadByQuery { ObjectName = "ARINVOICE", Fields = { "*" }, Query = new AndCondition { Conditions = { new EqualToString { Field = "RECORDID", Value = invoiceNum }, new EqualToString{ Field = "MODULEKEY", Value = "8.SO" } } } //Query = new EqualToString { Field = "RECORDID", Value = invoiceNum } }; var task = Client.Execute(query); task.Wait(); var response = task.Result; if (response.Results.Count == 0 || response.Results[0].Data.Count == 0) { ErrorLogger.LogError(invoiceNum, $"No Invoice Exists with Invoice#: {invoiceNum}"); return(false); } invoice = response.Results[0]?.Data[0]; } catch (Exception e) { ErrorLogger.LogError(invoiceNum, $"Getting Invoice# {invoiceNum} Errored: {e.Message}"); return(false); } return(true); }
/// <summary> /// Returns a Dictionary of all ProjectID (ClientCode.JobCode) to Intacct Records /// </summary> /// <param name="client"></param> /// <returns></returns> private async Task <IDictionary <string, string> > GetProjectIds(OnlineClient client, PerformContext context) { var projectMapping = new Dictionary <string, string>(); ReadByQuery read = new ReadByQuery { ObjectName = "PROJECT", PageSize = 1000 }; read.Fields.Clear(); read.Fields.AddRange(new string[] { "RECORDNO", "PROJECTID" }); context.WriteLine("Loading Project Records from Intacct for comparison"); var response = await client.Execute(read); var xmlResult = response.Results.First(); xmlResult.EnsureStatusSuccess(); var details = xmlResult.Data; foreach (var detail in details) { var custid = detail.Element("PROJECTID"); var rec = detail.Element("RECORDNO"); // Ignore Invalid Data if (custid == null || rec == null) { continue; } if (!projectMapping.ContainsKey(custid.Value)) { projectMapping.Add(custid.Value, rec.Value); } } // Get More Data int receivedCount = xmlResult.Count; while (receivedCount < xmlResult.TotalCount) { // Read Additional Pages of Data ReadMore more = new ReadMore(xmlResult.ControlId) { ResultId = xmlResult.ResultId }; context.WriteLine("Loading Additional Customer Records from Intacct for comparison"); response = await client.Execute(more); xmlResult = response.Results.First(); xmlResult.EnsureStatusSuccess(); // Process Results details = xmlResult.Data; foreach (var detail in details) { var custid = detail.Element("PROJECTID"); var rec = detail.Element("RECORDNO"); // Ignore Invalid Data if (custid == null || rec == null) { continue; } if (!projectMapping.ContainsKey(custid.Value)) { projectMapping.Add(custid.Value, rec.Value); } } // Increment the Counter receivedCount += xmlResult.Count; } // Return the mappings context.WriteLine("Found {0} projects in Intacct", projectMapping.Count); return(projectMapping); }
/// <summary> /// Returns a Dictionary of all Contacts (Names) to Intacct Records /// </summary> /// <param name="client"></param> /// <returns></returns> private async Task <IList <string> > GetContacts(OnlineClient client, PerformContext context) { var nameList = new List <string>(); ReadByQuery read = new ReadByQuery { ObjectName = "CONTACT", PageSize = 1000 }; read.Fields.Clear(); read.Fields.AddRange(new string[] { "CONTACTNAME" }); context.WriteLine("Loading Contact Records from Intacct for comparison"); var response = await client.Execute(read); var xmlResult = response.Results.First(); xmlResult.EnsureStatusSuccess(); var details = xmlResult.Data; foreach (var detail in details) { var contName = detail.Element("CONTACTNAME"); // Ignore Invalid Data if (contName == null) { continue; } if (!nameList.Contains(contName.Value)) { nameList.Add(contName.Value); } } // Get More Data int receivedCount = xmlResult.Count; while (receivedCount < xmlResult.TotalCount) { // Read Additional Pages of Data ReadMore more = new ReadMore(xmlResult.ControlId) { ResultId = xmlResult.ResultId }; context.WriteLine("Loading Additional Contact Records from Intacct for comparison"); response = await client.Execute(more); xmlResult = response.Results.First(); xmlResult.EnsureStatusSuccess(); // Process Results details = xmlResult.Data; foreach (var detail in details) { var contName = detail.Element("CONTACTNAME"); // Ignore Invalid Data if (contName == null) { continue; } if (!nameList.Contains(contName.Value)) { nameList.Add(contName.Value); } } // Increment the Counter receivedCount += xmlResult.Count; } // Return the mappings context.WriteLine("Found {0} contacts in Intacct", nameList.Count); return(nameList); }
public static void Run(ILogger logger) { OnlineClient client = Bootstrap.Client(logger); ReadByQuery query = new ReadByQuery() { ObjectName = "VENDOR", PageSize = 2, // Keep the count to just 2 for the example Fields = { "RECORDNO", "VENDORID", } }; logger.LogInformation("Executing query to Intacct API"); Task <OnlineResponse> task = client.Execute(query); task.Wait(); OnlineResponse response = task.Result; Result result = response.Results[0]; try { dynamic json = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result.Data)); string jsonString = json.ToString(); logger.LogDebug( "Query successful - page 1 [ Total count={0}, Data={1} ]", result.TotalCount, jsonString ); Console.WriteLine("Page 1 success! Number of vendor objects found: " + result.TotalCount + ". Number remaining: " + result.NumRemaining); } catch (NullReferenceException e) { logger.LogDebug("No response in Data. {0}", e); } LogManager.Flush(); int i = 1; while (result.NumRemaining > 0 && i <= 3 && !string.IsNullOrEmpty(result.ResultId)) { i++; ReadMore more = new ReadMore() { ResultId = result.ResultId }; Task <OnlineResponse> taskMore = client.Execute(more); taskMore.Wait(); OnlineResponse responseMore = taskMore.Result; Result resultMore = responseMore.Results[0]; try { dynamic resultMoreJson = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(resultMore.Data)); string resultMoreJsonString = resultMoreJson.ToString(); logger.LogDebug( "Read More successful - page " + i + " [ Total remaining={0}, Data={1} ]", resultMore.NumRemaining, resultMoreJsonString ); Console.WriteLine("Page " + i + " success! Records remaining: " + resultMore.NumRemaining); } catch (NullReferenceException e) { logger.LogDebug("No response in Data. {0}", e); } finally { LogManager.Flush(); } } Console.WriteLine("Successfully read " + i + " pages"); }
public static bool GetInvoice(int invoiceRecordNo, string invoiceNum, out System.Xml.Linq.XElement invoice) { invoice = null; //Set this justincase the function explodes try { var query = new ReadByQuery { ObjectName = "SODOCUMENT", Fields = { "*" }, Query = new EqualToString { Field = "PRRECORDKEY", Value = invoiceRecordNo.ToString() } }; var task = Client.Execute(query); task.Wait(); var response = task.Result; if (response.Results.Count == 0) { ErrorLogger.LogError(invoiceNum, $"No Invoice Exists with RECORDNO: {invoiceRecordNo}"); return(false); } //invoice = response.Results[0]?.Data[0]; var recordNo = response.Results[0]?.Data[0]?.Element("RECORDNO")?.Value; if (recordNo == null) { ErrorLogger.LogError(invoiceNum, "Cannot Find Sales Invoice."); return(false); } var invoiceQuery = new Read { ObjectName = "SODOCUMENT", Fields = { "*" }, Keys = { Convert.ToInt32(recordNo) }, DocParId = "Sales Invoice" }; var invoiceTask = Client.Execute(invoiceQuery); invoiceTask.Wait(); var invoiceResponse = invoiceTask.Result; if (invoiceResponse.Results.Count == 0) { ErrorLogger.LogError(invoiceNum, $"No Sales Invoice Exists with RECORDNO: {invoiceRecordNo}"); return(false); } invoice = invoiceResponse.Results[0]?.Data[0]; } catch (Exception e) { ErrorLogger.LogError(invoiceNum, $"Getting Invoice with RECORDNO: {invoiceRecordNo} Errored: {e.Message}"); return(false); } return(true); }