private YodleeCashFlowReportModel CreateYodleeCashFlowModel(YodleeModel model, int mpId, Customer customer, IEnumerable <string> directors, out YodleeSearchWordsModel yodleeSearchWordsModel, out YodleeRunningBalanceModel yodleeRunningBalanceModel)
        {
            var yodleeCashFlowReportModelBuilder = new YodleeCashFlowReportModelBuilder(_session);
            var yodleeSearchWordsModelBuilder    = new YodleeSearchWordsModelBuilder(_session, customer, directors);
            var yodleeRunningBalanceModelBuilder = new YodleeRunningBalanceModelBuilder();

            foreach (var bank in model.banks)
            {
                if (bank.overdraftProtection.HasValue && bank.transactions.Any())
                {
                    yodleeRunningBalanceModelBuilder.SetBankFrame(bank.overdraftProtection.Value);
                }

                if (bank.asOfDate.HasValue)
                {
                    yodleeCashFlowReportModelBuilder.SetAsOfDate(bank.asOfDate.Value);
                    yodleeRunningBalanceModelBuilder.SetAsOfDate(bank.asOfDate.Value);
                }
                yodleeRunningBalanceModelBuilder.SetAccountCurrentBalance(bank.accountNumber, bank.currentBalance.HasValue ? bank.currentBalance.Value : 0);
                foreach (var transaction in bank.transactions)
                {
                    yodleeCashFlowReportModelBuilder.Add(transaction);
                    yodleeSearchWordsModelBuilder.Add(transaction);
                    yodleeRunningBalanceModelBuilder.Add(transaction, bank.accountNumber);
                }
            }

            yodleeCashFlowReportModelBuilder.AddMissingAndSort();
            yodleeSearchWordsModelBuilder.AddMissing();

            yodleeSearchWordsModel = yodleeSearchWordsModelBuilder.GetModel();
            yodleeRunningBalanceModelBuilder.CalculateMergedRunningBalace();

            yodleeRunningBalanceModel    = yodleeRunningBalanceModelBuilder.GetModel();
            model.BankStatementDataModel = yodleeCashFlowReportModelBuilder.GetBankStatementDataModel();
            if (model.banks.Any() && model.banks.SelectMany(x => x.transactions).Any())
            {
                model.BankStatementDataModel.DateFrom = model.banks.SelectMany(x => x.transactions).Min(x => x.transactionDate);
                model.BankStatementDataModel.DateTo   = model.banks.Max(x => x.asOfDate);
                model.BankStatementAnnualizedModel    =
                    yodleeCashFlowReportModelBuilder.GetAnualizedBankStatementDataModel(model.BankStatementDataModel);

                Log.Debug("Yodlee data for customer {0} mp {1}: \nDate from:{2} Date to:{3} num of transactions: {4} Revenues:{5} Annualized Revenues: {6}",
                          customer.Id, mpId, model.BankStatementDataModel.DateFrom,
                          model.BankStatementDataModel.DateTo,
                          model.banks.SelectMany(x => x.transactions).Count(),
                          model.BankStatementDataModel.Revenues,
                          model.BankStatementAnnualizedModel.Revenues);
            }
            else
            {
                model.BankStatementAnnualizedModel = new BankStatementDataModel();
                Log.Debug("Yodlee data for customer {0} mp {1}: no data retrieved", customer.Id, mpId);
            }
            return(yodleeCashFlowReportModelBuilder.GetModel());
        }
Beispiel #2
0
        public async Task <ActionResult> getYodleeToken(string collectionsId)
        {
            string          authHeader = this.HttpContext.Request.Headers["Authorization"];
            TokenModel      tokenModel = new TokenModel();
            ClaimsPrincipal auth       = tokenModel.GetPrincipal(authHeader);

            if (auth.Identity.IsAuthenticated)
            {
                new ClickTracker("GetYodleeToken", true, false, collectionsId, auth.Identity.Name);
                YodleeModel yodleeModel = new YodleeModel();
                string      token       = await yodleeModel.getToken(collectionsId, auth.Identity.Name);

                return(Ok(token));
            }
            return(Ok(""));
        }
        public YodleeModel BuildYodlee(MP_CustomerMarketPlace mp, DateTime?history)
        {
            DateTime now = history ?? DateTime.UtcNow;
            YodleeOrderDictionary yodleeData = null;
            var directors = new List <string>();

            _timeElapsed = new List <System.Tuple <string, double> >();
            Stopwatch sw = Stopwatch.StartNew();

            if (mp.Marketplace.InternalId == new YodleeServiceInfo().InternalId)
            {
                var ddh = new DatabaseDataHelper(_session);
                yodleeData = ddh.GetAllYodleeOrdersData(now, mp, false, out directors);
            }             // if
            sw.Stop();
            _timeElapsed.Add(new System.Tuple <string, double>("GetAllYodleeOrdersData", sw.Elapsed.TotalMilliseconds));
            if (yodleeData == null)
            {
                Log.Debug("Yodlee model building complete for marketplace {0}: no data.", mp.Stringify());
                return(null);
            }             // if

            var model = new YodleeModel();

            sw.Restart();
            var ruleModelBuilder = new YodleeRuleModelBuilder(_session);

            model.RuleModel = ruleModelBuilder.Build();
            sw.Stop();
            _timeElapsed.Add(new System.Tuple <string, double>("YodleeRuleModel", sw.Elapsed.TotalMilliseconds));
            model.BankStatementDataModel = new BankStatementDataModel();

            var banks   = new List <YodleeBankModel>();
            var yearAgo = new DateTime(now.Year, now.Month, 1).AddYears(-1);

            Log.Debug("Yodlee model is being built for marketplace {0}...", mp.Stringify());
            sw.Restart();
            foreach (var bank in yodleeData.Data.Keys)
            {
                Log.Debug("Yodlee model is being built for marketplace {0}, bank {1}...", mp.Stringify(), bank.customName);

                double?availableBalance    = CurrencyXchg(bank.availableBalance, bank.asOfDate.date);
                double?currentBalance      = CurrencyXchg(bank.currentBalance, bank.asOfDate.date);
                double?overdraftProtection = CurrencyXchg(bank.overdraftProtection, bank.asOfDate.date);

                var yodleeBankModel = new YodleeBankModel {
                    isDeleted           = bank.isDeleted != 0,
                    accountNumber       = bank.accountNumber,
                    accountHolder       = bank.accountHolder,
                    accountType         = bank.acctType,
                    availableBalance    = availableBalance,
                    currentBalance      = currentBalance,
                    accountName         = bank.accountName,
                    routingNumber       = bank.routingNumber,
                    asOfDate            = bank.asOfDate.date,
                    overdraftProtection = overdraftProtection,
                };

                var transactions = new List <YodleeTransactionModel>();

                Log.Debug("Yodlee model is being built for marketplace {0}, bank {1}, going over transactions...", mp.Stringify(), bank.customName);

                foreach (var transaction in yodleeData.Data[bank])
                {
                    DateTime?oDate = transaction.postDate.date ?? transaction.transactionDate.date;
                    if (!oDate.HasValue || oDate.Value < yearAgo)
                    {
                        continue;                        //take only 12 month of data
                    }

                    double?transactionAmount = CurrencyXchg(transaction.transactionAmount, oDate);
                    double?runningBalance    = CurrencyXchg(transaction.runningBalance, oDate);

                    var yodleeTransactionModel = new YodleeTransactionModel {
                        transactionBaseType = transaction.transactionBaseType,
                        transactionType     = transaction.transactionType,
                        transactionDate     = (transaction.postDate.date ?? transaction.transactionDate.date).Value,
                        categoryName        = transaction.memo,
                        categoryType        = transaction.userDescription,
                        transactionAmount   = transactionAmount,
                        description         = transaction.description,
                        runningBalance      = runningBalance,
                        transactionStatus   = transaction.transactionStatus,
                        bankTransactionId   = transaction.bankTransactionId,
                        ezbobGroup          = transaction.siteCategory,
                        ezbobSubGroup       = transaction.siteCategoryType,
                        ezbobGroupPriority  = transaction.customCategoryId ?? 0
                    };

                    transactions.Add(yodleeTransactionModel);
                }                 // for each transaction

                Log.Debug("Yodlee model is being built for marketplace {0}, bank {1}, done going over transactions.", mp.Stringify(), bank.customName);

                yodleeBankModel.transactions = transactions.OrderByDescending(t => t.transactionDate).ToList();

                banks.Add(yodleeBankModel);

                Log.Debug("Yodlee model is being built for marketplace {0}, done with bank {1}.", mp.Stringify(), bank.customName);
            }             // for each bank

            model.banks = banks;
            sw.Stop();
            _timeElapsed.Add(new System.Tuple <string, double>("YodleeTransactionsModel", sw.Elapsed.TotalMilliseconds));

            Log.Debug("Yodlee model is being built for marketplace {0}, done with banks.", mp.Stringify());

            YodleeSearchWordsModel yodleeSearchWordsModel;

            YodleeRunningBalanceModel yodleeRunningBalanceModel;

            sw.Restart();
            model.CashFlowReportModel = CreateYodleeCashFlowModel(model, mp.Id, mp.Customer, directors, out yodleeSearchWordsModel, out yodleeRunningBalanceModel);
            model.SearchWordsModel    = yodleeSearchWordsModel;
            model.RunningBalanceModel = yodleeRunningBalanceModel;
            sw.Stop();
            _timeElapsed.Add(new System.Tuple <string, double>("YodleeCashFlowModel", sw.Elapsed.TotalMilliseconds));

            Log.Debug("Yodlee model is ready for marketplace {0}.", mp.Stringify());
            LogElapsedTimes(mp.Id, mp.Customer.Id);
            return(model);
        }