public static void Run(ILogger logger) { OnlineClient client = Bootstrap.Client(logger); logger.LogInformation("Executing create test object function to API"); TestObjectCreate create = new TestObjectCreate() { Name = "hello world", }; Task <OnlineResponse> createTask = client.Execute(create); createTask.Wait(); OnlineResponse createResponse = createTask.Result; Result createResult = createResponse.Results[0]; try { int recordNo = int.Parse(createResult.Data[0].Element("id").Value); Console.WriteLine("Created record ID " + recordNo.ToString()); } catch (NullReferenceException e) { logger.LogDebug("No response in Data. {0}", e); } finally { LogManager.Flush(); } }
public async Task ExecuteTest() { string xml = @"<?xml version=""1.0"" encoding=""utf-8""?> <response> <control> <status>success</status> <senderid>testsenderid</senderid> <controlid>requestUnitTest</controlid> <uniqueid>false</uniqueid> <dtdversion>3.0</dtdversion> </control> <operation> <authentication> <status>success</status> <userid>testuser</userid> <companyid>testcompany</companyid> <sessiontimestamp>2015-12-06T15:57:08-08:00</sessiontimestamp> </authentication> <result> <status>success</status> <function>getAPISession</function> <controlid>func1UnitTest</controlid> <data> <api> <sessionid>unittest..</sessionid> <endpoint>https://unittest.intacct.com/ia/xml/xmlgw.phtml</endpoint> </api> </data> </result> </operation> </response>"; HttpResponseMessage mockResponse1 = new HttpResponseMessage() { StatusCode = System.Net.HttpStatusCode.OK, Content = new StringContent(xml) }; List <HttpResponseMessage> mockResponses = new List <HttpResponseMessage> { mockResponse1, }; MockHandler mockHandler = new MockHandler(mockResponses); ClientConfig clientConfig = new ClientConfig { SenderId = "testsender", SenderPassword = "******", SessionId = "testsession..", MockHandler = mockHandler, }; OnlineClient client = new OnlineClient(clientConfig); OnlineResponse response = await client.Execute(new ApiSessionCreate("func1UnitTest")); Assert.Equal("requestUnitTest", response.Control.ControlId); }
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); }
public static void Run(ILogger logger) { OnlineClient client = Bootstrap.Client(logger); Read read = new Read() { ObjectName = "CUSTOMER", Fields = { "RECORDNO", "CUSTOMERID", "NAME", }, Keys = { 33 // Replace with the record number of a customer in your company } }; Task <OnlineResponse> task = client.Execute(read); task.Wait(); OnlineResponse response = task.Result; Result result = response.Results[0]; dynamic json = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result.Data)); try { string jsonString = json.ToString(); logger.LogDebug( "Read successful [ Company ID={0}, User ID={1}, Request control ID={2}, Function control ID={3}, Total count={4}, Data={5}]", response.Authentication.CompanyId, response.Authentication.UserId, response.Control.ControlId, result.ControlId, result.TotalCount, jsonString ); Console.WriteLine("Success! Found these customers: " + json); } catch (NullReferenceException e) { logger.LogDebug("No response in Data. {0}", e); } finally { LogManager.Flush(); } }
/// <summary> /// Sends a Hours Journal to the Intacct STATISTIC System /// </summary> /// <param name="client"></param> /// <param name="Org"></param> /// <param name="lines"></param> /// <param name="PostingDate"></param> /// <param name="ReferenceNumber"></param> /// <param name="JournalSymbol"></param> /// <param name="Description"></param> /// <param name="HistoryComment"></param> /// <param name="AsDraft"></param> /// <returns></returns> private async Task SendStatHoursJournalCmd(OnlineClient client, int Org, IEnumerable <IntacctStatHours> lines, DateTime PostingDate, string ReferenceNumber, string JournalSymbol, string Description, string HistoryComment, bool AsDraft) { StatisticalJournalEntryCreate create = new StatisticalJournalEntryCreate(); create.JournalSymbol = JournalSymbol; create.ReferenceNumber = ReferenceNumber; create.PostingDate = PostingDate; create.Description = Description; create.HistoryComment = HistoryComment; if (AsDraft) { create.CustomFields.Add("STATE", "Draft"); } foreach (var item in lines) { StatisticalJournalEntryLineCreate line = new StatisticalJournalEntryLineCreate { StatAccountNumber = item.Account, Amount = decimal.Parse(item.Hours.ToString("F2")), Memo = $"Part of Practice Engine Batch #{item.BatchID}" }; if (!String.IsNullOrWhiteSpace(item.EmployeeID)) { line.EmployeeId = item.EmployeeID; } if (!String.IsNullOrWhiteSpace(item.ProjectID)) { line.ProjectId = item.ProjectID; } if (!String.IsNullOrWhiteSpace(item.IntacctCustomerID)) { line.CustomerId = item.IntacctCustomerID; } if (!String.IsNullOrWhiteSpace(item.IntacctDepartment)) { line.DepartmentId = item.IntacctDepartment; } if (!String.IsNullOrWhiteSpace(item.IntacctLocation)) { line.LocationId = item.IntacctLocation; } create.Lines.Add(line); } OnlineResponse onlineResponse = await client.Execute(create); foreach (var result in onlineResponse.Results) { result.EnsureStatusSuccess(); } }
/// <summary> /// Sends a Journal to the Intacct GL System /// </summary> /// <param name="client"></param> /// <param name="Org"></param> /// <param name="lines"></param> /// <param name="PostingDate"></param> /// <param name="ReferenceNumber"></param> /// <param name="JournalSymbol"></param> /// <param name="Description"></param> /// <param name="HistoryComment"></param> /// <param name="AsDraft"></param> /// <returns></returns> private async Task SendJournalCmd(OnlineClient client, int Org, IEnumerable <JournalExtract> lines, DateTime PostingDate, string ReferenceNumber, string JournalSymbol, string Description, string HistoryComment, bool AsDraft) { JournalEntryCreate create = new JournalEntryCreate(); create.JournalSymbol = JournalSymbol; create.ReferenceNumber = ReferenceNumber; create.PostingDate = PostingDate; create.Description = Description; create.HistoryComment = HistoryComment; if (AsDraft) { create.CustomFields.Add("STATE", "Draft"); } foreach (var item in lines) { JournalEntryLineCreate line = new JournalEntryLineCreate { GlAccountNumber = item.AccountCode, TransactionAmount = decimal.Parse(item.NomAmount.ToString("F2")), Memo = String.IsNullOrWhiteSpace(item.NomTransRef) ? item.NomNarrative : item.NomNarrative + " (" + item.NomTransRef + ")" }; if (!String.IsNullOrWhiteSpace(item.IntacctCustomerID)) { line.CustomerId = item.IntacctCustomerID; } if (!String.IsNullOrWhiteSpace(item.IntacctEmployeeID)) { line.EmployeeId = item.IntacctEmployeeID; } if (!String.IsNullOrWhiteSpace(item.IntacctProjectID)) { line.ProjectId = item.IntacctProjectID; } if (!String.IsNullOrWhiteSpace(item.IntacctDepartment)) { line.DepartmentId = item.IntacctDepartment; } if (!String.IsNullOrWhiteSpace(item.IntacctLocation)) { line.LocationId = item.IntacctLocation; } create.Lines.Add(line); } OnlineResponse onlineResponse = await client.Execute(create); foreach (var result in onlineResponse.Results) { result.EnsureStatusSuccess(); } }
/// <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))); }
/// <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 async Task ExecuteResultExceptionTest() { string xml = @"<?xml version=""1.0"" encoding=""utf-8""?> <response> <control> <status>success</status> <senderid>testsenderid</senderid> <controlid>requestUnitTest</controlid> <uniqueid>false</uniqueid> <dtdversion>3.0</dtdversion> </control> <operation> <authentication> <status>success</status> <userid>testuser</userid> <companyid>testcompany</companyid> <locationid></locationid> <sessiontimestamp>2015-12-06T15:57:08-08:00</sessiontimestamp> </authentication> <result> <status>failure</status> <function>getAPISession</function> <controlid>func1UnitTest</controlid> <errormessage> <error> <errorno>Get API Session Failed</errorno> <description></description> <description2>Something went wrong</description2> <correction></correction> </error> </errormessage> </result> </operation> </response>"; HttpResponseMessage mockResponse1 = new HttpResponseMessage() { StatusCode = System.Net.HttpStatusCode.OK, Content = new StringContent(xml) }; List <HttpResponseMessage> mockResponses = new List <HttpResponseMessage> { mockResponse1, }; MockHandler mockHandler = new MockHandler(mockResponses); ClientConfig clientConfig = new ClientConfig { SenderId = "testsender", SenderPassword = "******", SessionId = "testsession..", MockHandler = mockHandler, }; OnlineClient client = new OnlineClient(clientConfig); var ex = await Record.ExceptionAsync(() => client.Execute(new ApiSessionCreate("func1UnitTest"))); Assert.IsType <ResultException>(ex); Assert.Equal("Result status: failure for Control ID: func1UnitTest - Get API Session Failed Something went wrong", ex.Message); }
public async Task LoggerTest() { string xml = @"<?xml version=""1.0"" encoding=""utf-8""?> <response> <control> <status>success</status> <senderid>testsenderid</senderid> <controlid>requestUnitTest</controlid> <uniqueid>false</uniqueid> <dtdversion>3.0</dtdversion> </control> <operation> <authentication> <status>success</status> <userid>testuser</userid> <companyid>testcompany</companyid> <locationid></locationid> <sessiontimestamp>2015-12-06T15:57:08-08:00</sessiontimestamp> </authentication> <result> <status>success</status> <function>readByQuery</function> <controlid>func1UnitTest</controlid> <data listtype=""customer"" count=""1"" totalcount=""1"" numremaining=""0"" resultId=""""> <customer> <CUSTOMERID>C0001</CUSTOMERID> <NAME>Intacct Corporation</NAME> </customer> </data> </result> </operation> </response>"; HttpResponseMessage mockResponse1 = new HttpResponseMessage() { StatusCode = System.Net.HttpStatusCode.OK, Content = new StringContent(xml) }; List <HttpResponseMessage> mockResponses = new List <HttpResponseMessage> { mockResponse1, }; MockHandler mockHandler = new MockHandler(mockResponses); var guid = Guid.NewGuid().ToString(); MemoryTarget target = new MemoryTarget { Name = guid, Layout = "${message}" }; SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug); ClientConfig config = new ClientConfig { SenderId = "testsender", SenderPassword = "******", SessionId = "testsession..", MockHandler = mockHandler, Logger = LogManager.GetLogger(guid), }; OnlineClient client = new OnlineClient(config); OnlineResponse response = await client.Execute(new ReadByQuery("func1UnitTest")); Assert.True(true); // TODO fix this test from randomly failing //Assert.Contains("<password>REDACTED</password>", target.Logs[0]); }
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 void Run(ILogger logger) { OnlineClient client = Bootstrap.Client(logger); List <IFilter> filterList = new List <IFilter>(); filterList.Add((new Filter("CUSTOMERID")).SetLike("c%")); filterList.Add((new Filter("CUSTOMERID")).SetLike("1%")); OrOperator filter = new OrOperator(filterList); OrderBuilder orderBuilder = new OrderBuilder(); IOrder[] orders = orderBuilder.Descending("CUSTOMERID").GetOrders(); SelectBuilder selectBuilder = new SelectBuilder(); ISelect[] fields = selectBuilder. Fields(new[] { "CUSTOMERID", "CUSTOMERNAME" }). Sum("TOTALDUE"). GetFields(); QueryFunction query = new QueryFunction() { SelectFields = fields, FromObject = "ARINVOICE", Filter = filter, CaseInsensitive = true, PageSize = 100, OrderBy = orders }; logger.LogInformation("Executing query to Intacct API"); Task <OnlineResponse> task = client.Execute(query); task.Wait(); OnlineResponse response = task.Result; Result result = response.Results[0]; dynamic json = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result.Data)); if (json != null && json.First != null) { Console.WriteLine("Success! Number of ARINVOICE objects found: " + result.TotalCount); Console.WriteLine("First ARINVOICE result found"); Console.WriteLine("CUSTOMERID: " + json.First["ARINVOICE"]["CUSTOMERID"].Value); Console.WriteLine("CUSTOMERNAME: " + json.First["ARINVOICE"]["CUSTOMERNAME"].Value); Console.WriteLine("SUM.TOTALDUE: " + json.First["ARINVOICE"]["SUM.TOTALDUE"].Value); Console.WriteLine("See the log file (logs/intacct.log) for the complete list of results."); } else { Console.WriteLine("The query executed, but no ARINVOICE objects met the query criteria."); Console.WriteLine("Either modify the filter or comment it out from the query."); Console.WriteLine("See the log file (logs/intacct.log) for the XML request."); } try { string jsonString = json.ToString(); logger.LogDebug( "Query successful [ Company ID={0}, User ID={1}, Request control ID={2}, Function control ID={3}, Total count={4}, Data={5} ]", response.Authentication.CompanyId, response.Authentication.UserId, response.Control.ControlId, result.ControlId, result.TotalCount, jsonString ); } catch (NullReferenceException e) { logger.LogDebug("No response in Data. {0}", e); } finally { LogManager.Flush(); } }
public static void Run(ILogger logger) { OnlineClient client = Bootstrap.Client(logger); logger.LogInformation("Executing CRUD customer functions to API"); CustomerCreate create = new CustomerCreate() { CustomerName = "Joshua Granley", Active = false, }; Task <OnlineResponse> createTask = client.Execute(create); createTask.Wait(); OnlineResponse createResponse = createTask.Result; Result createResult = createResponse.Results[0]; string customerId = createResult.Data[0].Element("CUSTOMERID").Value; int recordNo = int.Parse(createResult.Data[0].Element("RECORDNO").Value); Console.WriteLine("Created inactive customer ID " + customerId); CustomerUpdate update = new CustomerUpdate() { CustomerId = customerId, Active = true, }; Task <OnlineResponse> updateTask = client.Execute(update); updateTask.Wait(); Console.WriteLine("Updated customer ID " + customerId + " to active"); Read read = new Read() { ObjectName = "CUSTOMER", Fields = { "RECORDNO", "CUSTOMERID", "STATUS", }, Keys = { recordNo, } }; Task <OnlineResponse> readTask = client.Execute(read); readTask.Wait(); Console.WriteLine("Read customer ID " + customerId); CustomerDelete delete = new CustomerDelete() { CustomerId = customerId, }; Task <OnlineResponse> deleteTask = client.Execute(delete); deleteTask.Wait(); Console.WriteLine("Deleted customer ID " + customerId); LogManager.Flush(); }