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();
 }
Exemple #2
0
        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);
        }