Beispiel #1
0
        /// <summary>
        /// Retrieve a statement for a single bank account. Includes transaction details.
        /// </summary>
        /// <param name="account">The bank account to retrieve statement data for</param>
        /// <param name="startDate">Start of date range for transactions</param>
        /// <param name="endDate">End of date range for transactions</param>
        /// <returns>List of statements containing the requested data.</returns>
        public async Task <Tuple <IEnumerable <Statement>, string> > GetStatement(Types.BankAccount account, DateTimeOffset startDate, DateTimeOffset endDate)
        {
            // Ensure service catalog is populated
            await PopulateServiceProfiles();

            // Retrieve request profile for this message set
            var requestProfile = GetMessageSetRequestProfile(typeof(BankMessageSetV1));

            // Form specification of the account to retrieve information for
            var bankAccount = getOFXBankAccount(account);

            // Form transaction inclusion specification for date range. Always include transaction details
            var transactionInclusion = new IncTransaction
            {
                DTSTART = OFXUtils.DateToOFX(startDate),
                DTEND   = OFXUtils.DateToOFX(endDate),
                INCLUDE = BooleanType.Y
            };

            // Wrap in statement request
            var statementRequest = new StatementRequest
            {
                BANKACCTFROM = bankAccount,
                INCTRAN      = transactionInclusion
            };

            // Wrap in transaction
            var transactionRequest = new StatementTransactionRequest
            {
                TRNUID = GetNextTransactionId(),
                STMTRQ = statementRequest
            };

            // Wrap in messageset
            var messageSet = new BankRequestMessageSetV1 {
                Items = new AbstractRequest[1] {
                    transactionRequest
                }
            };

            // 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
            string errorMessage;

            // Extract statement data and return
            return(Tuple.Create(Statement.CreateFromOFXResponse(response, out errorMessage), errorMessage));
        }
Beispiel #2
0
        async Task <AccountTransactions> GetBankAccountTransactions(Account account, TransactionsFilter filter)
        {
            var transactionsRequest = new BankRequestMessageSetV1()
            {
                Items = new AbstractRequest[]
                {
                    new StatementTransactionRequest()
                    {
                        TRNUID = _utils.GenerateTransactionId(),
                        STMTRQ = new StatementRequest()
                        {
                            BANKACCTFROM = new BankAccount()
                            {
                                ACCTID   = account.Id,
                                BANKID   = account.BankId,
                                ACCTTYPE = (AccountEnum)Enum.Parse(typeof(AccountEnum), account.Type.ToString(), true)
                            },
                            INCTRAN = new IncTransaction()
                            {
                                DTEND   = _utils.DateToString(filter.EndDate),
                                DTSTART = _utils.DateToString(filter.StartDate),
                                INCLUDE = BooleanType.Y
                            }
                        }
                    }
                }
            };

            var messageSet =
                await ExecuteRequest <BankRequestMessageSetV1, BankResponseMessageSetV1>(transactionsRequest);

            var transactionsResponse =
                messageSet.Items.FirstOrDefault(_ => _ is StatementTransactionResponse) as
                StatementTransactionResponse;

            if (transactionsResponse == null)
            {
                throw new OfxResponseException("Required response is not present in message set.");
            }

            var transList = transactionsResponse.STMTRS.BANKTRANLIST.STMTTRN != null
                ? transactionsResponse.STMTRS.BANKTRANLIST.STMTTRN.Select(MapToModel).ToList()
                : new List <Transaction>();

            decimal amount;

            if (!decimal.TryParse(transactionsResponse.STMTRS.AVAILBAL.BALAMT, out amount))
            {
                amount = 0;
            }

            return(new AccountTransactions(amount, transList));
        }