public ProjectedResourceUsageDTO(ProjectedResourceUsage projection) { this.TenantId = projection.TenantId; this.Resource = projection.Resource; this.BillingPeriodId = projection.Period.BillingPeriodId; this.BillingPeriodStart = projection.Period.PeriodStart; this.BillingPeriodEnd = projection.Period.PeriodEnd; this.ActualUsage = projection.ActualUsage; this.ProjectedUsageTotal = projection.ProjectedUsageTotal; this.DaysRemainingInPeriod = projection.DaysRemainingInPeriod; this.AverageDailyUsage = projection.AverageDailyUsage; this.Rate = projection.Rate; this.CurrentCost = projection.CurrentCost(); this.ProjectedCost = projection.ProjectedCost(); }
public async Task <IEnumerable <ProjectedResourceUsage> > GetProjectedResourceUsages(int tenantId, BillingPeriod period, DateTime now) { var usages = await GetResourceUsage(tenantId, period); var usageRates = await GetResourceUsageRates(period); var projections = new List <ProjectedResourceUsage>(); foreach (var usage in usages) { var sampledDays = (DateTime.Now - period.PeriodStart).TotalDays + 1; var projectedUsageTotal = Util.ResourceProjection.TotalForPeriod(usage.Usage, period.PeriodStart, period.PeriodEnd, now); var rate = usageRates .Where(r => r.ResourceType == usage.ResourceType) .Select(r => r) .FirstOrDefault(); if (rate == null) { continue; } var projected = new ProjectedResourceUsage { TenantId = tenantId, Resource = usage.ResourceType, Period = period, ActualUsage = usage.Usage, ProjectedUsageTotal = projectedUsageTotal, DaysRemainingInPeriod = (period.PeriodEnd - DateTime.Now).TotalDays, AverageDailyUsage = usage.Usage / sampledDays, Rate = rate.Rate, }; projections.Add(projected); } return(projections); }