public BasicMonthlyBarchart Get(DateTime from, DateTime to)
        {
            // Format dates
            from = new DateTime(from.Year, from.Month, 1);
            to   = new DateTime(to.Year, to.Month + 1, 1).AddDays(-1);

            // Init return value
            var chart = new BasicMonthlyBarchart();

            chart.From     = from;
            chart.To       = to;
            chart.MaxValue = 0;

            // Get transactions
            var transactions = new TransactionRepository().Get().ToList();

            if (transactions.Count == 0)
            {
                return(chart);
            }

            // Order transactions
            transactions = transactions.OrderBy(x => x.Date).ToList();

            // Fill up starting dates (if needed)
            this.FillInDateGaps(chart.Bars, from, transactions.First().Date.Value.AddMonths(-1));

            foreach (var tr in transactions)
            {
                if (tr.Date < chart.From || tr.Date > chart.To)
                {
                    continue;
                }

                if (tr.Date > chart.To)
                {
                    break;
                }

                BasicMonthlyBar currentMonthBar = null;

                if (chart.Bars.Count > 0)
                {
                    currentMonthBar = GetLast(chart.Bars);
                }

                if (currentMonthBar == null || !this.IsSameMonth(currentMonthBar.Date, tr.Date.Value))
                {
                    // Check for last item's localmax
                    this.CheckForMaxValue(chart);

                    // Fill in date gaps
                    if (currentMonthBar != null) // validated with !IsSameMonth
                    {
                        this.FillInDateGaps(chart.Bars, currentMonthBar.Date.AddMonths(1), tr.Date.Value.AddMonths(-1));
                    }

                    // New item
                    currentMonthBar      = new BasicMonthlyBar();
                    currentMonthBar.Date = new DateTime(tr.Date.Value.Year, tr.Date.Value.Month, 1);

                    // Add
                    chart.Bars.Add(currentMonthBar);
                }

                currentMonthBar.Flow += tr.Sum.Value;

                if (tr.Sum.Value < 0)
                {
                    currentMonthBar.Expense += tr.Sum.Value;
                }
                else
                {
                    currentMonthBar.Income += tr.Sum.Value;
                }

                currentMonthBar.Transactions.Add(tr);
            }

            this.CheckForMaxValue(chart);

            // Fill up ending dates (if needed)
            this.FillInDateGaps(chart.Bars, GetLast(chart.Bars).Date.AddMonths(1), to);

            return(chart);
        }
 decimal GetLocalMax(BasicMonthlyBar currentMonthBar) =>
 currentMonthBar != null?
 Math.Max(currentMonthBar.Income, Math.Abs(currentMonthBar.Expense)) :
     0;