public List <QuickbooksDeposit> GetDepositsByDateRange(DateTime startDate, DateTime endDate)
        {
            var converter = new QBXMLConverter();

            string xml = converter.ConvertDepositQuery(startDate, endDate);

            string queryResponseXml = ProcessRequest(xml);

            DepositQueryResponse response = converter.ConvertDepositQueryResponse(queryResponseXml);

            var results = new List <QuickbooksDeposit>();

            if (response.Status.Code == 0)
            {
                results = response.Deposits;
            }

            return(results);
        }
        public DepositQueryResponse ConvertDepositQueryResponse(string xml)
        {
            var response = new DepositQueryResponse();

            var xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(xml);

            XmlNodeList responseNode = xmlDoc.GetElementsByTagName("DepositQueryRs");

            XmlNodeList depositNodes = xmlDoc.GetElementsByTagName("DepositRet");

            response.Status = new QuickbooksStatus()
            {
                Code     = int.Parse(responseNode[0].Attributes["statusCode"].Value),
                Severity = responseNode[0].Attributes["statusSeverity"].Value,
                Message  = responseNode[0].Attributes["statusMessage"].Value
            };

            response.Deposits = new List <QuickbooksDeposit>();

            foreach (XmlNode depositNode in depositNodes)
            {
                XmlNodeList childNodes = depositNode.ChildNodes;

                var deposit = new QuickbooksDeposit()
                {
                    TxnId        = depositNode["TxnID"]?.InnerText,
                    TimeCreated  = DateTime.Parse(depositNode["TimeCreated"]?.InnerText),
                    TimeModified = DateTime.Parse(depositNode["TimeModified"]?.InnerText),
                    EditSequence = long.Parse(depositNode["EditSequence"]?.InnerText),
                    TxnNumber    = int.Parse(depositNode["TxnNumber"]?.InnerText),
                    TxnDate      = DateTime.Parse(depositNode["TxnDate"]?.InnerText),
                    Memo         = depositNode["Memo"]?.InnerText,
                    DepositTotal = decimal.Parse(depositNode["DepositTotal"]?.InnerText),

                    Lines = new List <DepositLine>(),

                    DepositAccount = new QuickbooksAccount()
                    {
                        ListId   = depositNode["DepositToAccountRef"]["ListID"]?.InnerText,
                        FullName = depositNode["DepositToAccountRef"]["FullName"]?.InnerText
                    }
                };

                if (childNodes != null)
                {
                    foreach (XmlNode lineNode in childNodes)
                    {
                        if (lineNode.Name != "DepositLineRet")
                        {
                            continue;
                        }

                        if (lineNode["Memo"] == null)
                        {
                            //probably just skipped a line
                            if (lineNode["Amount"] == null && lineNode["AccountRef"] == null && lineNode["EntityRef"] == null)
                            {
                                continue;
                            }

                            if (lineNode["CheckNumber"] != null)
                            {
                                throw new Exception("Error: deposit for check number " + lineNode["CheckNumber"]?.InnerText + " is missing a memo.");
                            }
                            else
                            {
                                throw new Exception("Error: a deposit without a check number is missing a memo.");
                            }
                        }

                        deposit.Lines.Add(new DepositLine()
                        {
                            TxnType     = lineNode["TxnType"]?.InnerText,
                            TxnLineId   = lineNode["TxnLineID"]?.InnerText,
                            Memo        = lineNode["Memo"]?.InnerText,
                            CheckNumber = lineNode["CheckNumber"]?.InnerText,
                            Amount      = decimal.Parse(lineNode["Amount"]?.InnerText),
                            DepositDate = depositNode["TxnDate"]?.InnerText,
                            Account     = new QuickbooksAccount()
                            {
                                ListId   = lineNode["AccountRef"]?["ListID"]?.InnerText,
                                FullName = lineNode["AccountRef"]?["FullName"]?.InnerText
                            },
                            Entity = new QuickbooksEntity()
                            {
                                ListId   = lineNode["EntityRef"]?["ListID"]?.InnerText,
                                FullName = lineNode["EntityRef"]?["FullName"]?.InnerText
                            },
                            Method = new PaymentMethod()
                            {
                                ListId   = lineNode["PaymentMethodRef"]?["ListID"]?.InnerText,
                                FullName = lineNode["PaymentMethodRef"]?["FullName"]?.InnerText
                            }
                        });
                    }
                }
                response.Deposits.Add(deposit);
            }

            return(response);
        }