From 564e24fac81ff3c4c027a5e7b44fa1d4b1f7754e Mon Sep 17 00:00:00 2001 From: nivedithaskywalk Date: Fri, 16 Feb 2024 12:45:17 +0530 Subject: [PATCH 1/2] Show pricing per repository #28 --- .../Models/UsageReportViewModel.cs | 15 +++- .../Processor/GithubUsageProcessor.cs | 36 ++++++--- .../Views/Home/_ActionDetail.cshtml | 80 ++++++++++--------- 3 files changed, 79 insertions(+), 52 deletions(-) diff --git a/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs b/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs index 4e70ed6..c2b7aaf 100644 --- a/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs +++ b/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs @@ -30,12 +30,21 @@ 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 Repository { get; set; } + public decimal Minutes { get; set; } + public decimal TotalCost { get; set; } + public string Workflow { get; set; } + } + + } diff --git a/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs b/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs index 5463387..37a69c6 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 + { + Repository = 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), + Workflow = ($"{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..166906c 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.Repository + @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) + '%)'; From 4251eb270bf49fb016c2898bad7d307513f6166b Mon Sep 17 00:00:00 2001 From: nivedithaskywalk Date: Fri, 16 Feb 2024 14:16:20 +0530 Subject: [PATCH 2/2] reviews comment - change the property name - Done --- src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs | 4 +--- .../Processor/GithubUsageProcessor.cs | 4 ++-- .../Views/Home/_ActionDetail.cshtml | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs b/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs index c2b7aaf..1bf3923 100644 --- a/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs +++ b/src/GitHubCostVisualizer.Web/Models/UsageReportViewModel.cs @@ -40,11 +40,9 @@ public class UsageReportViewModel public class ActionMinutesItem { - public string Repository { get; set; } + public string Label { get; set; } public decimal Minutes { get; set; } public decimal TotalCost { get; set; } - public string Workflow { get; set; } } - } diff --git a/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs b/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs index 37a69c6..4c3c26c 100644 --- a/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs +++ b/src/GitHubCostVisualizer.Web/Processor/GithubUsageProcessor.cs @@ -37,7 +37,7 @@ group x by x.Repository into grp select new ActionMinutesItem { - Repository = grp.Key, + Label = grp.Key, Minutes = grp.Sum(i => (int)i.Quantity), TotalCost = grp.Sum(i => i.Quantity.GetValueOrDefault() * i.Multiplier.GetValueOrDefault() * i.PricePer.GetValueOrDefault()) }).ToList(); @@ -49,7 +49,7 @@ into grp select new ActionMinutesItem { Minutes = grp.Sum(i => (int)i.Quantity), - Workflow = ($"{grp.Key.Repository} - {grp.Key.TrimmedWorkflow}").ToString(), + Label = ($"{grp.Key.Repository} - {grp.Key.TrimmedWorkflow}").ToString(), TotalCost = grp.Sum(i => i.Quantity.GetValueOrDefault() * i.Multiplier.GetValueOrDefault() * i.PricePer.GetValueOrDefault()) }).ToList(); diff --git a/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml b/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml index 166906c..bf664d6 100644 --- a/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml +++ b/src/GitHubCostVisualizer.Web/Views/Home/_ActionDetail.cshtml @@ -68,7 +68,7 @@ @foreach (var item in Model.ActionMinutesByRepository) { - @item.Repository + @item.Label @item.Minutes minutes $@item.TotalCost @@ -90,7 +90,7 @@ backgroundColor: getColors(@Model.ActionMinutesByRepository.Count, 'primary', 'dark', 'secondary', 'light') } ], - labels: [@Html.Raw(String.Join(", ", Model.ActionMinutesByRepository.Select(m => $"'{m.Repository}'")))] + labels: [@Html.Raw(String.Join(", ", Model.ActionMinutesByRepository.Select(m => $"'{m.Label}'")))] }, options: { tooltips: { @@ -121,7 +121,7 @@ @foreach (var item in Model.ActionMinutesByWorkflow) { - @item.Workflow + @item.Label @item.Minutes minutes $@item.TotalCost