public async Task <HttpResponseMessage> FinancesChartAsync(MonthComparisonChartRequestDTO request)
        {
            var dictionary = new Dictionary <string, MonthComparisonChartVM[]>
            {
                { "Finances Breakdown", (await financeService.GetFinanceTotalsByMonth(request)).ToArray() }
            };

            var results = dictionary.Values.ToList();

            var summaries = new List <ChartSummaryVM>
            {
                new ChartSummaryVM
                {
                    Title           = "Finances Breakdown",
                    AveragedDaily   = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Daily),
                    AveragedMonthly = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Monthly),
                    TotalSpent      = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Total),
                }
            };

            return(Request.CreateResponse(HttpStatusCode.OK, new ChartVM
            {
                Labels = Utils.ChartLabels(results),
                Summary = summaries,
                Data = dictionary
            }));
        }
        public async Task <HttpResponseMessage> IncomesByCategoryChart(MonthComparisonChartRequestDTO request)
        {
            var isSecondCat = request.SecondCatId.HasValue && request.SecondCatId != 0 && request.SecondCatId != 9999 ? true : false;
            var catId       = isSecondCat ? request.SecondCatId.Value : request.CatId;
            var catName     = await baseService.GetCategoryName(catId);

            var dictionary = new Dictionary <string, MonthComparisonChartVM[]>()
            {
                { catName, (await incomeService.GetIncomesByCategoryAndMonthAsync(request.DateFilter, catId, isSecondCat)).ToArray() }
            };

            var results = dictionary.Values.ToList();

            if (!results[0].Any())
            {
                return(Request.CreateResponse(HttpStatusCode.BadRequest, "No results"));
            }

            string secondCategory = string.IsNullOrEmpty(results[0].First().SecondCategory) ? "" : $"- ({results[0].First().SecondCategory})";

            var summary = new List <ChartSummaryVM>()
            {
                new ChartSummaryVM
                {
                    Title           = string.Format("{0} Chart for {1} {2}", "Incomes", results[0].First().Category, secondCategory),
                    AveragedDaily   = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Daily),
                    AveragedMonthly = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Monthly),
                    TotalSpent      = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Total)
                }
            };

            if (request.SecondCatId.HasValue && request.SecondCatId.Value == 9999)
            {
                int secondTypeId = await baseService.GetSecondTypeId(catId);

                var categories = await baseService.GetAllCategories((CategoryType)secondTypeId, false);

                if (categories.Any())
                {
                    foreach (var cat in categories)
                    {
                        dictionary.Add(cat.Name, (await incomeService.GetIncomesByCategoryAndMonthAsync(request.DateFilter, cat.Id, isSecondCat: true)).ToArray());
                    }
                }

                dictionary.Remove(catName);
            }

            return(Request.CreateResponse(HttpStatusCode.OK,
                                          new ChartVM
            {
                Summary = summary,
                Labels = Utils.ChartLabels(results),
                Data = dictionary
            }));
        }
        public async Task <HttpResponseMessage> IncomeExpenseComparisonChart(MonthComparisonChartRequestDTO request)
        {
            var summaries = new List <ChartSummaryVM>()
            {
                new ChartSummaryVM {
                    Title = "Spending Summary"
                },
                new ChartSummaryVM {
                    Title = "Income Summary"
                },
                new ChartSummaryVM {
                    Title = "Savings Summary"
                }
            };

            var datasets = new Dictionary <string, MonthComparisonChartVM[]>
            {
                { summaries[0].Title, (await financeService.GetIncomeExpenseTotalsByMonth(request.DateFilter)).Where(x => x.Type == CategoryType.Spendings).ToArray() },
                { summaries[1].Title, (await financeService.GetIncomeExpenseTotalsByMonth(request.DateFilter)).Where(x => x.Type == CategoryType.Income).ToArray() },
                { summaries[2].Title, (await financeService.GetIncomeExpenseTotalsByMonth(request.DateFilter)).Where(x => x.Type == CategoryType.Savings).ToArray() }
            };

            var results = datasets.Values.ToList();
            var labels  = Utils.ChartLabels(results);

            int idx = 0;

            foreach (var summary in summaries)
            {
                summaries[idx].AveragedDaily   = Utils.ChartsHeaderTitle(results[idx], ChartHeaderTitleType.Daily);
                summaries[idx].AveragedMonthly = Utils.ChartsHeaderTitle(results[idx], ChartHeaderTitleType.Monthly);
                summaries[idx].TotalSpent      = Utils.ChartsHeaderTitle(results[idx], ChartHeaderTitleType.Total);
                idx++;
            }
            ;


            return(Request.CreateResponse(HttpStatusCode.OK,
                                          new ChartVM
            {
                Labels = labels,
                Summary = summaries,
                Data = datasets
            }));
        }
        public async Task <IEnumerable <MonthComparisonChartVM> > GetFinanceTotalsByMonth(MonthComparisonChartRequestDTO request)
        {
            string sqlTxt = $@"
                SELECT 
	                CONVERT(CHAR(7), Date, 120) as YearMonth, 
	                DATENAME(month, Date) AS MonthName, SUM(Amount) as 'Total'
                FROM 
                    Spendings s
                INNER JOIN 
                    {TABLE} f 
                ON 
                    f.Id = s.FinanceId
                WHERE 
                    {Utils.FilterDateSql(request.DateFilter)}
                GROUP BY 
                    CONVERT(CHAR(7), Date, 120) , DATENAME(month, Date)
                ORDER BY 
                    YearMonth";

            using (var sql = dbConnectionFactory())
            {
                return((await sql.QueryAsync <MonthComparisonChartVM>(sqlTxt)).ToArray());
            }
        }
        public async Task <HttpResponseMessage> SpendingsByCategoryChart(MonthComparisonChartRequestDTO request)
        {
            var isSecondCat = request.SecondCatId.HasValue && !request.IsFinance && request.SecondCatId != 0 && request.SecondCatId != 9999 ? true : false;
            var catId       = isSecondCat ? request.SecondCatId.Value : request.CatId;

            var catName = request.IsFinance
                ? (await financeService.GetAsync(catId)).Name
                : await baseService.GetCategoryName(catId);

            var dictionary = new Dictionary <string, MonthComparisonChartVM[]>
            {
                { catName, (await spendingService.GetSpendingsByCategoryAndMonthAsync(request.DateFilter, catId, isSecondCat, request.IsFinance)).ToArray() }
            };

            var results = dictionary.Values.ToList();

            if (!results[0].Any())
            {
                return(Request.CreateResponse(HttpStatusCode.BadRequest, "No results"));
            }


            string secondCategory = !isSecondCat ? "" : $"- ({results[0].First().SecondCategory})";

            var summaries = new List <ChartSummaryVM>
            {
                new ChartSummaryVM
                {
                    Title           = string.Format("{0} Chart for {1} {2}", "Spendings", results[0].First().Category, secondCategory),
                    AveragedDaily   = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Daily),
                    AveragedMonthly = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Monthly),
                    TotalSpent      = Utils.ChartsHeaderTitle(results[0], ChartHeaderTitleType.Total)
                }
            };


            // make subcats datasets
            if (request.SecondCatId.HasValue && request.SecondCatId.Value == 9999)
            {
                int secondTypeId = await baseService.GetSecondTypeId(catId);

                var categories = await baseService.GetAllCategories((CategoryType)secondTypeId, false);

                if (categories.Any())
                {
                    foreach (var cat in categories)
                    {
                        dictionary.Add(cat.Name, (await spendingService.GetSpendingsByCategoryAndMonthAsync(request.DateFilter, cat.Id, isSecondCat: true, isFinance: false)).ToArray());
                    }
                }

                dictionary.Remove(catName);
            }

            // if fuel cat then check fuel in ds2
            if (request.CatId == 1 && request.SecondCatId == 28)
            {
                request.DateFilter.DateField = "PayDate";
                string amzVanFuelInLabel = "AMZ Fleet Van Fuel In";

                dictionary.Add(amzVanFuelInLabel, (await cnwService.GetFuelInByMonthAsync(request.DateFilter)).ToArray());

                summaries.Add(new ChartSummaryVM
                {
                    Title           = amzVanFuelInLabel,
                    AveragedDaily   = Utils.ChartsHeaderTitle(dictionary[amzVanFuelInLabel], ChartHeaderTitleType.Daily),
                    AveragedMonthly = Utils.ChartsHeaderTitle(dictionary[amzVanFuelInLabel], ChartHeaderTitleType.Monthly),
                    TotalSpent      = Utils.ChartsHeaderTitle(dictionary[amzVanFuelInLabel], ChartHeaderTitleType.Total)
                });
            }

            return(Request.CreateResponse(HttpStatusCode.OK,
                                          new ChartVM
            {
                Labels = Utils.ChartLabels(results),
                Summary = summaries,
                Data = dictionary
            }
                                          ));
        }
 public async Task <IEnumerable <MonthComparisonChartVM> > GetFinanceTotalsByMonth(MonthComparisonChartRequestDTO request)
 {
     return(await financeRepository.GetFinanceTotalsByMonth(request));
 }