Пример #1
0
        /// <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);
        }
Пример #2
0
        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());
        }