コード例 #1
0
        public ActionResult GetRule(int ruleId)
        {
            using (var q = new FinancialQueries())
            {
                var rule = q.GetRule(ruleId);
                var mdr  = new ModuleDepositRules()
                {
                    id     = rule.Id,
                    nome   = rule.Name,
                    regras = new regra[rule.DistributionPercentages.Count]
                };

                for (int i = 0; i < rule.DistributionPercentages.Count; i++)
                {
                    var   p = rule.DistributionPercentages.ElementAt(i);
                    regra r = new regra()
                    {
                        id    = p.ID,
                        fundo = new fundo()
                        {
                            id = p.FundID.Value, text = p.Fund.Name
                        },
                        objetivo = new objetivo()
                        {
                            id = p.ReserveID, text = p.Reserve.Name
                        },
                        porcentagem = p.Percentage * 100
                    };
                    mdr.regras[i] = r;
                }

                return(Json(mdr));
            }
        }
コード例 #2
0
        public PartialViewResult RulesPartial()
        {
            List <DistributionRule> ruleList    = null;
            List <SelectListItem>   fundList    = null;
            List <SelectListItem>   reserveList = null;

            using (var queries = new FinancialQueries())
            {
                ruleList = queries.GetDistributionRules(User.Identity.Name);
                var funds    = queries.GetFunds(User.Identity.Name);
                var reserves = queries.GetReserves(User.Identity.Name);
                fundList    = Helper.GetListItem(funds);
                reserveList = Helper.GetListItem(reserves);
            }

            RulesViewModel rvm = new RulesViewModel()
            {
                RuleList      = ruleList,
                RuleViewModel = new DistributionRuleViewModel()
            };

            rvm.RuleViewModel.Rule = new DistributionRule()
            {
                DistributionPercentages = new List <DistributionPercentage>()
            };
            rvm.RuleViewModel.Funds    = fundList;
            rvm.RuleViewModel.Reserves = reserveList;


            return(PartialView("RulesPartial", rvm));
        }
コード例 #3
0
        public PartialViewResult RulesPercentagePartial(int ruleId)
        {
            List <DistributionPercentage> percentageList = null;
            List <Fund>    fundList    = null;
            List <Reserve> reserveList = null;

            using (var queries = new FinancialQueries())
            {
                fundList       = queries.GetFunds(User.Identity.Name);
                reserveList    = queries.GetReserves(User.Identity.Name);
                percentageList = queries.GetPercentageList(ruleId);
            }

            PercentageRuleViewModel prvm = new PercentageRuleViewModel()
            {
                DistributionPercentageList = percentageList,
                DistributionPercentage     = new DistributionPercentage(),
                FundsList    = Helper.GetListItem(fundList, "NONE"),
                ReservesList = Helper.GetListItem(reserveList)
            };

            prvm.DistributionPercentage.DistributionRuleId = ruleId;

            return(PartialView("RulesPercentagePartial", prvm));
        }
コード例 #4
0
 public PartialViewResult SimulatorPartial()
 {
     using (var q = new FinancialQueries())
     {
         var reserves = q.GetReserves(User.Identity.Name).OrderByDescending(r => r.DateToWithdraw).ToList();
         return(PartialView("SimulatorPartial", reserves));
     }
 }
コード例 #5
0
        public ActionResult UpdateBalance(UpdateBalanceViewModel ubvm)
        {
            using (var fo = new FinancialOperations())
                using (var fq = new FinancialQueries())
                {
                    var fundBal = fq.GetBalance(ubvm.Date, User.Identity.Name, ubvm.SelectedFundId);
                    fo.UpdateBalance(ubvm.Value - fundBal, ubvm.SelectedFundId, ubvm.Date, User.Identity.Name);
                }

            return(SavingsAccountPartial());
        }
コード例 #6
0
        //
        // GET: /Funds/
        public PartialViewResult FundsPartial()
        {
            FundsViewModel fvm = new FundsViewModel();

            using (FinancialQueries fq = new FinancialQueries())
            {
                fvm.FundList     = fq.GetFunds(User.Identity.Name);
                fvm.Fund         = new Fund();
                fvm.FundTypeList = Helper.GetDescriptions(typeof(EFundType));
            }

            return(PartialView("FundsPartial", fvm));
        }
コード例 #7
0
        public ActionResult GetFundsFromDepositRule(int depositRuleId)
        {
            using (FinancialQueries fq = new FinancialQueries())
            {
                if (depositRuleId != -1)
                {
                    int[] funds = fq.GetDistributionRule(depositRuleId).DistributionPercentages.Where(dp => dp.FundID != null).Select(dp => dp.FundID.Value).Distinct().ToArray();
                    return(Json(funds));
                }
            }

            return(Json(new { }));
        }
コード例 #8
0
        //
        // GET: /Reserve/
        public PartialViewResult ReservesPartial()
        {
            ReserveViewModel rvm = new ReserveViewModel();

            using (FinancialQueries fq = new FinancialQueries())
            {
                rvm.ReserveList = fq.GetReserves(User.Identity.Name);
            }
            rvm.Reserve = new Reserve();
            rvm.Reserve.DateToWithdraw = DateTime.Today;
            rvm.TimeUnitList           = Helper.GetDescriptions(typeof(ETimeUnit));

            return(PartialView("ReservesPartial", rvm));
        }
コード例 #9
0
        public ActionResult GetTransationList(int?fundId, int?reserveId = null)
        {
            if (fundId == -1)
            {
                fundId = null;
            }
            if (reserveId == -1)
            {
                reserveId = null;
            }
            using (FinancialQueries queries = new FinancialQueries())
            {
                List <Transaction> transactionList = queries.GetTransactions(
                    fundId, reserveId, DateTime.Today, User.Identity.Name);

                var ops     = transactionList.GroupBy(t => t.Operation);
                var opsList = new List <OperationVM>();

                foreach (var op in ops)
                {
                    var opVW = new OperationVM()
                    {
                        Date        = op.Key.Date,
                        Description = op.Key.Type != EOperationType.BalanceUpdate ? op.Key.Description : "Rendimento",
                        Value       = op.Where(o =>
                                               (reserveId == null || o.ReserveID == reserveId) &&
                                               (fundId == null || o.FundID == fundId))
                                      .Sum(o => o.Value),
                        Reserves = op.Select(o => o.ReserveID).Distinct().Count() == 1
                            ? op.FirstOrDefault().Reserve.Name
                            : String.Concat(op.Select(o => o.Reserve.NameAbbreviation + "/").Distinct()).Trim('/'),
                        Funds = op.Select(o => o.FundID).Distinct().Count() == 1
                            ? op.FirstOrDefault().Fund.Name
                            : String.Concat(op.Select(o => o.Fund.NameAbbreviation + "/").Distinct()).Trim('/')
                    };
                    opsList.Add(opVW);
                }

                return(Json(new
                {
                    balance = transactionList.Sum(t => t.Value).ToString("0.00"),
                    transactionList = Helper.RenderPartialViewToString("TransactionListPartial", opsList, ControllerContext, ViewData, TempData)
                }));
            }
        }
コード例 #10
0
        public ActionResult SubmitRule(ModuleDepositRules mdr)
        {
            DistributionRule dr = null;
            var percsToRemove   = new List <DistributionPercentage>();

            if (mdr.id == 0)
            {
                dr = new DistributionRule()
                {
                    Name = mdr.nome, UserId = User.Identity.Name, DistributionPercentages = new List <DistributionPercentage>()
                };

                foreach (var perc in mdr.regras)
                {
                    var dp = new DistributionPercentage()
                    {
                        FundID     = perc.fundo.id,
                        ReserveID  = perc.objetivo.id,
                        Percentage = perc.porcentagem / 100,
                    };
                    dr.DistributionPercentages.Add(dp);
                }

                using (var o = new FinancialOperations())
                    o.AddRule(dr);
            }
            else
            {
                using (var q = new FinancialQueries())
                {
                    dr = q.GetDistributionRule(mdr.id.Value);
                    for (int i = 0; i < dr.DistributionPercentages.Count; i++)
                    {
                        var currPerc = dr.DistributionPercentages.ElementAt(i);
                        if (mdr.regras.Any(r => r.fundo.id == currPerc.FundID && r.objetivo.id == currPerc.ReserveID) == false)
                        {
                            percsToRemove.Add(currPerc);
                        }
                    }

                    dr.Name = mdr.nome;
                    foreach (var perc in mdr.regras)
                    {
                        var dp = dr.DistributionPercentages.SingleOrDefault(p => p.FundID == perc.fundo.id && p.ReserveID == perc.objetivo.id);
                        if (dp == null)
                        {
                            dp = new DistributionPercentage()
                            {
                                FundID     = perc.fundo.id,
                                ReserveID  = perc.objetivo.id,
                                Percentage = perc.porcentagem / 100
                            };
                            dr.DistributionPercentages.Add(dp);
                        }
                        else
                        {
                            dp.FundID     = perc.fundo.id;
                            dp.ReserveID  = perc.objetivo.id;
                            dp.Percentage = perc.porcentagem;
                        }
                    }

                    using (var o = new FinancialOperations(q.Context))
                        o.UpdateRule(dr, percsToRemove);
                }
            }

            return(RulesPartial());
        }
コード例 #11
0
        public ActionResult GetProjection(string[] checkedRes)
        {
            using (var q = new FinancialQueries())
            {
                var user     = User.Identity.Name;
                var funds    = q.GetFunds(user);
                var reserves = q.GetReserves(user).Where(r => checkedRes.Any(c => c == r.ID.ToString())).OrderByDescending(r => r.DateToWithdraw);
                var today    = DateTime.Today;

                var      labels    = new List <string>();
                DateTime end       = reserves.Max(r => r.DateToWithdraw);
                DateTime currDate1 = today;

                int incr = (int)Math.Ceiling(end.Subtract(today).TotalDays / 1095);

                while (currDate1.Year < end.Year || (currDate1.Year == end.Year && currDate1.Month <= end.Month))
                {
                    labels.Add(GetMonth(currDate1.Month) + "-" + GetYear(currDate1.Year));
                    currDate1 = currDate1.AddMonths(incr);
                }

                var     datasets        = new List <dataset>();
                int     x               = 0;
                decimal totalMonthlyDep = 0;
                foreach (var res in reserves)
                {
                    x++;
                    int monthsToAchieve = 0;
                    var currDate        = today;
                    while (currDate <= res.DateToWithdraw)
                    {
                        monthsToAchieve++;
                        currDate = currDate.AddMonths(1);
                    }

                    // escolhendo fundo
                    decimal?percIncome = null;
                    if (monthsToAchieve < 24)
                    {
                        percIncome = 1.0015m;
                    }
                    else if (monthsToAchieve < 84)
                    {
                        percIncome = 1.002875m;
                    }
                    else
                    {
                        percIncome = 1.0063125m;
                    }

                    var resBal = q.GetBalance(today, user, null, res.ID);

                    decimal monthlyDep = Math.Max(0, res.FinalExpectedValue - resBal);
                    decimal div        = 0;
                    for (int i = 0; i < monthsToAchieve; i++)
                    {
                        div += (decimal)Math.Pow((double)percIncome, i);
                    }
                    monthlyDep /= Math.Max(1, div);

                    var     data    = new List <decimal>();
                    decimal currBal = q.GetBalance(today, user, reserveId: res.ID);
                    int     currIt  = 0;
                    for (int i = 0; i < monthsToAchieve; i++)
                    {
                        currIt++;
                        if (currIt == 1)
                        {
                            data.Add(currBal);
                        }

                        if (currIt == incr)
                        {
                            currIt = 0;
                        }

                        currBal *= percIncome.Value;
                        currBal += monthlyDep;
                    }
                    currIt++;
                    while (currIt != 1)
                    {
                        if (currIt == incr)
                        {
                            currIt = 0;
                        }

                        currBal *= percIncome.Value;
                        currBal += monthlyDep;

                        currIt++;
                    }
                    data.Add(currBal);

                    totalMonthlyDep += monthlyDep;

                    var dataset = new dataset()
                    {
                        reserveId        = res.ID,
                        monthlyDep       = monthlyDep.ToString("0.00"),
                        data             = data,
                        fillColor        = "rgba(151,187,205,0)",
                        strokeColor      = GetColor(x),
                        pointColor       = "rgba(151,187,205,1)",
                        pointStrokeColor = "#fff"
                    };
                    datasets.Add(dataset);
                }

                var simularRes = new simulatorResult()
                {
                    totalMonthlyDep = totalMonthlyDep.ToString("0.00"),
                    labels          = labels,
                    datasets        = datasets
                };
                return(Json(simularRes));
            }
        }
コード例 #12
0
        public void CheckForAutomaticBalanceUpdate(Dictionary <DateTime, decimal> profitIndices)
        {
            using (FinancialQueries queries = new FinancialQueries())
            {
                List <Fund> funds = queries.GetFundsWithAutomaticUpdateBalance(EFundType.Poupanca);

                foreach (var f in funds)
                {
                    var balBaseDays = new Dictionary <int, decimal>();
                    List <Transaction> transactions = queries.GetTransactions(f.ID, null, DateTime.Today, f.UserId);
                    if (transactions.Count == 0)
                    {
                        continue;
                    }

                    DateTime currDate = new DateTime(2014, 1, 1);
                    while (currDate < DateTime.Today)
                    {
                        bool updatedBalance = false;

                        var dayDeposits = transactions.Where(
                            t => t.Operation.Date == currDate &&
                            (t.Operation.Type == EOperationType.Deposit ||
                             t.Operation.Type == EOperationType.BalanceUpdate));

                        if (dayDeposits.Any(t => t.Operation.Type == EOperationType.BalanceUpdate))
                        {
                            updatedBalance = true;
                        }

                        if (!updatedBalance && balBaseDays.ContainsKey(currDate.Day))
                        {
                            balBaseDays[currDate.Day] = AdjustFundBalance(balBaseDays[currDate.Day], currDate, profitIndices[currDate], f);
                        }

                        // deposits
                        foreach (var t in dayDeposits)
                        {
                            int day = Math.Min(28, t.Operation.Date.Day);
                            if (!balBaseDays.ContainsKey(day))
                            {
                                balBaseDays.Add(day, 0);
                            }
                            else if (t.Operation.Type == EOperationType.BalanceUpdate)
                            {
                                updatedBalance = true;
                            }

                            balBaseDays[day] += t.Value;
                        }

                        // withdraws
                        var dayWithdraws = transactions.Where(
                            t => t.Operation.Date == currDate && t.Operation.Type == EOperationType.Withdraw);

                        foreach (var t in dayWithdraws)
                        {
                            decimal value = -t.Value;
                            int     day   = currDate.Day;
                            while (value != 0)
                            {
                                int?nextDay     = null;
                                int?diffNextDay = null;
                                foreach (var d in balBaseDays.Keys)
                                {
                                    if (nextDay == null || (d < day && (day - d) < diffNextDay) ||
                                        (d > day && day + (28 - d) < diffNextDay))
                                    {
                                        if (d < day)
                                        {
                                            diffNextDay = day - d;
                                        }
                                        else if (d > day)
                                        {
                                            diffNextDay = day + (28 - d);
                                        }

                                        nextDay = d;
                                    }
                                }
                                decimal wdValue = Math.Min(value, balBaseDays[nextDay.Value]);
                                balBaseDays[nextDay.Value] -= wdValue;
                                value -= wdValue;
                            }
                        }

                        currDate = currDate.AddDays(1);
                    }
                }
            }
        }
コード例 #13
0
        //
        // GET: /Manager/
        public PartialViewResult SavingsAccountPartial()
        {
            var tvm = new TransactionViewModel();

            using (FinancialQueries queries = new FinancialQueries())
            {
                List <Fund>           fundList              = queries.GetFunds(User.Identity.Name);
                List <Reserve>        reserveList           = queries.GetReserves(User.Identity.Name);
                List <SelectListItem> distributionRuleItems = Helper.GetListItem(queries.GetDistributionRules(User.Identity.Name));

                tvm.TransactionList = queries.GetTransactions(null, null, DateTime.Today, User.Identity.Name);

                var ops     = tvm.TransactionList.GroupBy(t => t.Operation);
                var opsList = new List <OperationVM>();

                foreach (var op in ops)
                {
                    var opVW = new OperationVM()
                    {
                        Date        = op.Key.Date,
                        Description = op.Key.Type != EOperationType.BalanceUpdate ? op.Key.Description : "Rendimento",
                        Value       = op.Key.TotalValue,
                        Reserves    = op.Select(o => o.ReserveID).Distinct().Count() == 1
                            ? op.FirstOrDefault().Reserve.Name
                            : String.Concat(op.Select(o => o.Reserve.NameAbbreviation + "/").Distinct()).Trim('/'),
                        Funds = op.Select(o => o.FundID).Distinct().Count() == 1
                            ? op.FirstOrDefault().Fund.Name
                            : String.Concat(op.Select(o => o.Fund.NameAbbreviation + "/").Distinct()).Trim('/')
                    };
                    opsList.Add(opVW);
                }
                tvm.OperationList = opsList;
                tvm.FundList      = Helper.GetListItem(fundList, "TODOS");
                tvm.ReserveList   = Helper.GetListItem(reserveList, "TODOS");
                tvm.Balance       = tvm.TransactionList.Sum(t => t.Value);

                List <UpdateFundToDepositViewModel> fundsBalanceList = new List <UpdateFundToDepositViewModel>();
                fundsBalanceList.AddRange(
                    fundList.Select(
                        f => new UpdateFundToDepositViewModel()
                {
                    FundId = f.ID, FundName = f.Name, CurrentBalance = queries.GetBalance(DateTime.Today, User.Identity.Name, f.ID).ToString("0.00")
                }
                        )
                    );

                DepositViewModel dvm = new DepositViewModel()
                {
                    FundList             = Helper.GetListItem(fundList, "NENHUM"),
                    ReserveList          = Helper.GetListItem(reserveList, "NENHUM"),
                    DistributionRuleList = distributionRuleItems,
                    Date             = DateTime.Today,
                    fundsBalanceList = fundsBalanceList
                };
                tvm.DepositViewModel = dvm;

                WithdrawViewModel wvm = new WithdrawViewModel()
                {
                    FundList    = Helper.GetListItem(fundList),
                    ReserveList = Helper.GetListItem(reserveList),
                    Date        = DateTime.Today
                };
                tvm.WithdrawViewModel = wvm;

                UpdateBalanceViewModel ubvm = new UpdateBalanceViewModel()
                {
                    FundList = Helper.GetListItem(fundList),
                    Date     = DateTime.Today
                };
                tvm.UpdateBalanceViewModel = ubvm;
            }
            ModelState.Clear();
            return(PartialView("SavingsAccountPartial", tvm));
        }