Example #1
0
        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);
        }
Example #2
0
        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)));
        }
Example #8
0
        public void GetXmlTest()
        {
            string expected = @"<?xml version=""1.0"" encoding=""utf-8""?>
<function controlid=""unittest"">
    <readByQuery>
        <object>CLASS</object>
        <query>RECORDNO &lt; 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 &lt; 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);
        }
Example #13
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 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);
        }