private void HandleResponse(string response, int serviceLogId, int customerId)
        {
            var xmlDoc = new XmlDocument();

            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.Write(response.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<?xml version=\"1.0\" encoding=\"utf-8\"?>"));
            writer.Flush();
            stream.Position = 0;
            xmlDoc.Load(stream);

            XmlNodeList caisDetailsList = xmlDoc.SelectNodes("//CAISDetails");

            if (caisDetailsList != null)
            {
                log.Info("Found {0} financial account blocks for customer {1}");
                var  financialAccounts = new List <FinancialAccount>();
                bool hadError          = false;
                foreach (XmlElement currentCaisDetails in caisDetailsList)
                {
                    try
                    {
                        FinancialAccount financialAccount = HandleOneCaisDetailsBlock(currentCaisDetails);
                        financialAccounts.Add(financialAccount);
                    }
                    catch (Exception ex)
                    {
                        hadError = true;
                        log.Error("Exception while parsing data for ServiceLogId:{0}. No data will be created. The exception:{1}", serviceLogId, ex);
                    }
                }

                if (!hadError && financialAccounts.Count > 0)
                {
                    UpdateFinancialAccounts(financialAccounts, serviceLogId, customerId);
                }
            }
        }
        private FinancialAccount HandleOneCaisDetailsBlock(XmlElement currentCaisDetails)
        {
            var result = new FinancialAccount();

            XmlNode accountStatusCodeNode = currentCaisDetails.SelectSingleNode("AccountStatus");
            string  accountStatusCode     = null;

            if (accountStatusCodeNode != null)
            {
                accountStatusCode = accountStatusCodeNode.InnerText;
            }

            result.StartDate = ReadDateFromNode(currentCaisDetails.SelectSingleNode("CAISAccStartDate"));

            string dateType;

            result.AccountStatus = GetAccountStatusString(accountStatusCode, out dateType);
            result.DateType      = dateType;

            if (accountStatusCode == "F" || accountStatusCode == "S")
            {
                result.SettlementOrDefaultDate = ReadDateFromNode(currentCaisDetails.SelectSingleNode("SettlementDate"));
            }

            result.LastUpdateDate = ReadDateFromNode(currentCaisDetails.SelectSingleNode("LastUpdatedDate"));

            XmlNode accountStatusCodesNode = currentCaisDetails.SelectSingleNode("AccountStatusCodes");
            string  statusCodes            = string.Empty;

            if (accountStatusCodesNode != null)
            {
                statusCodes = accountStatusCodesNode.InnerText;
            }

            for (int i = 0; i < 12; i++)
            {
                result.StatusCodes.Add(statusCodes.Length > i ? statusCodes.Substring(i, 1) : string.Empty);
            }

            result.CreditLimit           = ReadAmountFromNode(currentCaisDetails.SelectSingleNode("CreditLimit"));
            result.Balance               = ReadAmountFromNode(currentCaisDetails.SelectSingleNode("Balance"));
            result.CurrentDefaultBalance = ReadAmountFromNode(currentCaisDetails.SelectSingleNode("CurrentDefBalance"));

            XmlNode status1To2Node = currentCaisDetails.SelectSingleNode("Status1To2");

            if (status1To2Node != null)
            {
                int status1To2;
                if (int.TryParse(status1To2Node.InnerText, out status1To2))
                {
                    result.Status1To2 = status1To2;
                }
            }

            XmlNode statusTo3Node = currentCaisDetails.SelectSingleNode("StatusTo3");

            if (statusTo3Node != null)
            {
                int statusTo3;
                if (int.TryParse(statusTo3Node.InnerText, out statusTo3))
                {
                    result.StatusTo3 = statusTo3;
                }
            }

            XmlNode worstStatusNode = currentCaisDetails.SelectSingleNode("WorstStatus");

            if (worstStatusNode != null)
            {
                result.WorstStatus = worstStatusNode.InnerText;
            }

            XmlNode accountTypeNode = currentCaisDetails.SelectSingleNode("AccountType");

            if (accountTypeNode != null)
            {
                result.AccountType = accountTypeNode.InnerText;
            }

            return(result);
        }