/// <summary> /// List all accounts available from the service /// </summary> /// <returns></returns> public async Task <IEnumerable <Account> > ListAccounts() { // Ensure service catalog is populated await PopulateServiceProfiles(); // Retrieve request profile for this message set var requestProfile = GetMessageSetRequestProfile(typeof(SignupMessageSetV1)); // Populate the account info request var accountInfoRequest = new AccountInfoRequest { DTACCTUP = "19970101" }; // Use an early date for "last update" so we always retrieve information // Wrap the request in a transaction var transaction = new AccountInfoTransactionRequest { TRNUID = GetNextTransactionId(), ACCTINFORQ = accountInfoRequest }; var messageSet = new SignupRequestMessageSetV1 { Items = new AbstractRequest[1] { transaction } }; // Gather all message sets in the request var requestMessageSets = new List <AbstractTopLevelMessageSet> { CreateSignonRequest(userCredentials, requestProfile), messageSet }; // Send to service and await response Protocol.OFX response = await new Transport(requestProfile.ServiceEndpoint).sendRequestAsync(requestMessageSets.ToArray()); // TODO: Check response for errors // Walk nested elements to find accounts List <Account> accountList = new List <Account>(); foreach (var responseMessageSet in response.Items.Where(item => item.GetType() == typeof(SignupResponseMessageSetV1)).Select(item => (SignupResponseMessageSetV1)item)) { foreach ( var transactionResponse in responseMessageSet.Items.Where(item => item.GetType() == typeof(AccountInfoTransactionResponse)) .Select(item => (AccountInfoTransactionResponse)item)) { // Iterate each account foreach (var accountInfo in transactionResponse.ACCTINFORS.ACCTINFO) { var specificAccountInfo = accountInfo.Items[0]; // Create appropriate account type entry if (specificAccountInfo.GetType() == typeof(BankAccountInfo)) { // There are multiple types of bank accounts we support var bankAccountInfo = (BankAccountInfo)specificAccountInfo; accountList.Add(Account.Create(bankAccountInfo.BANKACCTFROM)); } if (specificAccountInfo.GetType() == typeof(CreditCardAccountInfo)) { var creditAccountInfo = (CreditCardAccountInfo)specificAccountInfo; accountList.Add(Account.Create(creditAccountInfo.CCACCTFROM)); } } } } return(accountList); }
public async Task <Account[]> GetAccounts() { var accountsRequest = new SignupRequestMessageSetV1() { Items = new AbstractRequest[] { new AccountInfoTransactionRequest() { TRNUID = _utils.GenerateTransactionId(), CLTCOOKIE = "4", ACCTINFORQ = new AccountInfoRequest() { DTACCTUP = "19900101000000" } } } }; var messageSet = await ExecuteRequest <SignupRequestMessageSetV1, SignupResponseMessageSetV1>(accountsRequest); var accountsResponse = messageSet.Items.FirstOrDefault(_ => _ is AccountInfoTransactionResponse) as AccountInfoTransactionResponse; if (accountsResponse == null) { throw new OfxResponseException("Required response is not present in message set."); } var result = new List <Account>(); foreach (var accountInfo in accountsResponse.ACCTINFORS.ACCTINFO) { AccountTypeEnum type; string subtype = null; string status = null; string accountId = null; string bankId = null; var bankAccount = accountInfo.Items.FirstOrDefault(_ => _ is BankAccountInfo) as BankAccountInfo; var ccAccount = accountInfo.Items.FirstOrDefault(_ => _ is CreditCardAccountInfo) as CreditCardAccountInfo; if (bankAccount != null) { type = AccountTypeEnum.Checking; accountId = bankAccount.BANKACCTFROM.ACCTID; bankId = bankAccount.BANKACCTFROM.BANKID; subtype = bankAccount.BANKACCTFROM.ACCTTYPE.ToString(); status = bankAccount.SVCSTATUS.ToString(); } else if (ccAccount != null) { type = AccountTypeEnum.Credit; accountId = ccAccount.CCACCTFROM.ACCTID; status = ccAccount.SVCSTATUS.ToString(); } else { continue; } var account = new Account(type, accountId, bankId, accountInfo.DESC, accountInfo.PHONE, subtype, status); result.Add(account); } return(result.ToArray()); }