diff --git a/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs b/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs index 4e70ed6..1bf3923 100644 --- a/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs +++ b/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs @@ -30,12 +30,19 @@ public class UsageReportViewModel public int TotalBillableActionMinutes { get; set; } public decimal TotalActionMinutesCost { get; set; } public List> ActionsSummary { get; set; } - public List> ActionMinutesByRepository { get; set; } - public List> ActionMinutesByWorkflow { get; set; } + public List ActionMinutesByRepository { get; set; } + public List ActionMinutesByWorkflow { get; set; } public decimal AverageDailyStorage { get; set; } public List> DailyStorageSummary { get; set; } public List> AverageDailyStorageByRepo { get; set; } - public DailyStorageData DailyStorageByRepo { get; set; } } + + public class ActionMinutesItem + { + public string Label { get; set; } + public decimal Minutes { get; set; } + public decimal TotalCost { get; set; } + } + } diff --git a/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs b/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs index 5463387..4c3c26c 100644 --- a/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs +++ b/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs @@ -31,16 +31,30 @@ group x by x.Sku into grp select new KeyValuePair(grp.Key, grp.Sum(i => (int)i.Quantity))) .ToList(); - model.ActionMinutesByRepository = (from x in entries.Where(i => i.Product.Equals(Constants.GitHubProducts.Actions, StringComparison.InvariantCultureIgnoreCase)) + model.ActionMinutesByRepository = (from x in entries.Where(i => + i.Product.Equals(Constants.GitHubProducts.Actions, StringComparison.InvariantCultureIgnoreCase)) group x by x.Repository - into grp - select new KeyValuePair(grp.Key, grp.Sum(i => (int)i.Quantity))).ToList(); + into grp + select new ActionMinutesItem + { + Label = grp.Key, + Minutes = grp.Sum(i => (int)i.Quantity), + TotalCost = grp.Sum(i => i.Quantity.GetValueOrDefault() * i.Multiplier.GetValueOrDefault() * i.PricePer.GetValueOrDefault()) + }).ToList(); + model.ActionMinutesByWorkflow = (from x in entries.Where(i => - i.Product.Equals(Constants.GitHubProducts.Actions, StringComparison.InvariantCultureIgnoreCase)) - group x by new { x.Repository, x.TrimmedWorkflow } - into grp - select new KeyValuePair($"{grp.Key.Repository} - {grp.Key.TrimmedWorkflow}", - grp.Sum(i => (int)i.Quantity))).ToList(); + i.Product.Equals(Constants.GitHubProducts.Actions, StringComparison.InvariantCultureIgnoreCase)) + group x by new { x.Repository, x.TrimmedWorkflow } + into grp + select new ActionMinutesItem + { + Minutes = grp.Sum(i => (int)i.Quantity), + Label = ($"{grp.Key.Repository} - {grp.Key.TrimmedWorkflow}").ToString(), + TotalCost = grp.Sum(i => i.Quantity.GetValueOrDefault() * i.Multiplier.GetValueOrDefault() * i.PricePer.GetValueOrDefault()) + + }).ToList(); + + model.DailyStorageSummary = (from x in entries.Where(i => i.Product.Equals(Constants.GitHubProducts.SharedStorage, StringComparison.InvariantCultureIgnoreCase)) group x by x.Date into grp @@ -73,9 +87,9 @@ into grp private DailyStorageData GenerateStorageByDays(List entries) { var storage = entries.Where(e => e.Product.Equals(Constants.GitHubProducts.SharedStorage, StringComparison.InvariantCultureIgnoreCase)).ToList(); - if(!storage.Any()) + if (!storage.Any()) return new DailyStorageData(); - + var startDate = storage.Min(r => r.Date); var endDate = storage.Max(r => r.Date); @@ -94,7 +108,7 @@ from bd in byDay.DefaultIfEmpty() return new DailyStorageData { - Labels = dayList.Select(d=>d.ToShortDateString()).ToList(), + Labels = dayList.Select(d => d.ToShortDateString()).ToList(), DataSets = results.ToList() }; } diff --git a/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml b/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml index 508a81b..bf664d6 100644 --- a/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml +++ b/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml @@ -61,14 +61,16 @@ Repository Minutes + Estimated Cost @foreach (var item in Model.ActionMinutesByRepository) { - @item.Key - @item.Value minutes + @item.Label + @item.Minutes minutes + $@item.TotalCost } @@ -77,51 +79,53 @@ @@ -164,7 +168,7 @@ tooltips: { enabled: true, callbacks: { - label: function(tooltipItem, data) { + label: function (tooltipItem, data) { var label = data.labels[tooltipItem.index]; var val = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; return label + ':' + val + ' (' + (100 * val / @Html.Raw(Model.ActionsSummary.Sum(d => d.Value))).toFixed(2) + '%)';