protected async Task <IActionResult> ListInternalAsync(string tagType, string viewName = "TagList")
        {
            var topleveltags = await _api.GetAsync <IEnumerable <dto.Model.Tag> >($"tagtypes/{tagType.ToCleanQuery()}/topleveltags");

            var list = await _api.GetAsync <IEnumerable <dto.Model.Tag> >($"tags/{tagType.ToCleanQuery()}");

            var request = new TagStatisticsRequest
            {
                Range          = EDateRange.Range,
                DateStart      = new DateTime(DateTime.Today.Year - 1, DateTime.Today.Month, 1).AddMonths(1),
                DateEnd        = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(1).AddMilliseconds(-1),
                IncludeSubTags = true,
                ReturnSubTags  = false
            };

            var chart = new ChartModel();

            int colorId = 0;

            foreach (var top in topleveltags)
            {
                var stats = await _api.PostAsync <IEnumerable <dto.Model.TagStatisticsModel> >($"tags/{tagType.ToCleanQuery()}/{top.Key.ToCleanQuery()}/statistics", System.Text.Json.JsonSerializer.Serialize(request), "application/json");

                var total = stats.SingleOrDefault()?.Total;

                if (total > 0)
                {
                    continue;
                }

                chart.Labels.Add(top.Caption ?? top.Key);
                chart.Series.Add(new ChartSerieModel
                {
                    BackgroundColor = ChartModel.DefaultColors[colorId++],
                    Values          = { total ?? 0m },
                });

                if (colorId == ChartModel.DefaultColors.Count())
                {
                    colorId = 0;
                }
            }

            return(View(viewName, new TagListModel
            {
                TagType = tagType,
                Tags = list.OrderBy(t => t.Key),
                Chart = chart,
            }));
        }
        protected async Task <IActionResult> DetailsInternalAsync <T>(string tagType, string tag, string viewName = "TagDetails") where T : TagModel, new()
        {
            var details = await _api.GetAsync <dto.Model.TagDetails>($"tags/{tagType.ToCleanQuery()}/{tag.ToCleanQuery()}");

            var transactions = await _api.GetAsync <IEnumerable <dto.Model.Transaction> >($"transactions/tag/{tagType.ToCleanQuery()}/{tag.ToCleanQuery()}");

            var request = new TagStatisticsRequest
            {
                Range          = EDateRange.Months,
                DateStart      = new DateTime(DateTime.Today.Year - 1, DateTime.Today.Month, 1).AddMonths(1),
                DateEnd        = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(1).AddMilliseconds(-1),
                IncludeSubTags = true,
                ReturnSubTags  = true,
            };

            var stats = await _api.PostAsync <IEnumerable <dto.Model.TagStatisticsModel> >($"tags/{tagType.ToCleanQuery()}/{tag.ToCleanQuery()}/statistics", System.Text.Json.JsonSerializer.Serialize(request), "application/json");

            var dicStats = stats.ToDictionary(s => (Year: s.Year, Month: s.Month.Value));

            var statsWithEmptyMonthsFilled = new List <dto.Model.TagStatisticsModel>();

            // --- Initialisation des données du tableau
            var chart     = new ChartModel();
            var dicSeries = new Dictionary <string, ChartSerieModel>();

            var serie = new ChartSerieModel {
                Id = "total", Label = "Total", Type = "line"
            };

            dicSeries.Add(serie.Id, serie);
            chart.Series.Add(serie);

            serie = new ChartSerieModel {
                Id = "average", Label = "Moyenne", Type = "line"
            };
            dicSeries.Add(serie.Id, serie);
            chart.Series.Add(serie);

            serie = new ChartSerieModel {
                Id = $"tag:{details.Key}", Label = details.Caption ?? details.Key, Group = "main", BackgroundColor = ChartModel.DefaultColors[0]
            };
            dicSeries.Add(serie.Id, serie);
            chart.Series.Add(serie);

            var first = stats.FirstOrDefault();

            if (first != null)
            {
                int colorId = 1;

                foreach (var subTagTotal in first.SubTagTotals)
                {
                    serie = new ChartSerieModel {
                        Id = $"tag:{subTagTotal.Tag.Key}", Label = subTagTotal.Tag.Caption ?? subTagTotal.Tag.Key, Group = "main", BackgroundColor = ChartModel.DefaultColors[colorId++]
                    };
                    dicSeries.Add(serie.Id, serie);
                    chart.Series.Add(serie);
                }
            }

            var average = stats.Average(s => s.Total);

            // --- Initialisation des données du tableau
            for (var date = request.DateStart.Value; date <= request.DateEnd.Value; date = date.AddMonths(1))
            {
                chart.Labels.Add(date.ToString("MMM yy"));

                if (dicStats.TryGetValue((date.Year, date.Month), out TagStatisticsModel stat))
                {
                    dicSeries["total"].Values.Add(stat.Total);
                    dicSeries["average"].Values.Add(average);
                    dicSeries[$"tag:{details.Key}"].Values.Add(stat.TagTotal);

                    foreach (var subTagTotal in stat.SubTagTotals)
                    {
                        dicSeries[$"tag:{subTagTotal.Tag.Key}"].Values.Add(subTagTotal.Amount);
                    }
                }