public OutageReport Generate(ReportOptions options)
        {
            List <Specification <OutageEntity> > specs = new List <Specification <OutageEntity> >();

            if (options.ElementId.HasValue)
            {
                specs.Add(new OutageElementIdQuery(options.ElementId.Value));
            }

            if (options.StartDate.HasValue)
            {
                specs.Add(new OutageStartDateQuery(options.StartDate.Value));
            }

            if (options.EndDate.HasValue)
            {
                specs.Add(new OutageEndDateQuery(options.EndDate.Value));
            }

            IEnumerable <OutageEntity> outages;

            if (specs.Count > 1)
            {
                AndSpecification <OutageEntity> andQuery = new AndSpecification <OutageEntity>(specs);
                outages = _outageRepository.Find(andQuery.IsSatisfiedBy).ToList();
            }
            else if (specs.Count == 1)
            {
                outages = _outageRepository.Find(specs[0].IsSatisfiedBy).ToList();
            }
            else
            {
                outages = _outageRepository.GetAll().ToList();
            }

            var type = DateHelpers.GetType(options.StartDate, options.EndDate);

            var outageReportGrouping = outages.GroupBy(o => type == "Monthly" ? o.ReportTime.Month : o.ReportTime.Year).Select(o => o).ToList();

            var reportData = new Dictionary <string, float>();

            foreach (var outage in outageReportGrouping)
            {
                reportData.Add(type == "Monthly" ? DateHelpers.Months[outage.Key] : outage.Key.ToString(), outage.Count());
            }

            return(new OutageReport
            {
                Type = type,
                Data = reportData
            });
        }
Example #2
0
        public OutageReport Generate(ReportOptions options)
        {
            bool isScope = false;
            List <Specification <ConsumerHistorical> > specs = new List <Specification <ConsumerHistorical> >();

            if (options.StartDate.HasValue)
            {
                specs.Add(new HistoricalConsumerStartDateQuery(options.StartDate.Value));
            }

            if (options.EndDate.HasValue)
            {
                specs.Add(new HistoricalConsumerEndDateQuery(options.EndDate.Value));
            }

            if (options.ElementId != null)
            {
                specs.Add(new HistoricalConsumerElementIdQuery((long)options.ElementId));
                isScope = true;
            }

            specs.Add(new HistoricalConsumerOperationQuery(DatabaseOperation.DELETE));

            IEnumerable <ConsumerHistorical> outages;

            if (specs.Count > 1)
            {
                AndSpecification <ConsumerHistorical> andQuery = new AndSpecification <ConsumerHistorical>(specs);
                outages = _outageRepository.Find(andQuery.IsSatisfiedBy).ToList();
            }
            else if (specs.Count == 1)
            {
                outages = _outageRepository.Find(specs[0].IsSatisfiedBy).ToList();
            }
            else
            {
                outages = _outageRepository.GetAll().ToList();
            }

            var type = DateHelpers.GetType(options.StartDate, options.EndDate);
            var outageReportGrouping = outages.GroupBy(o => type == "Monthly" ? o.OperationTime.Month : o.OperationTime.Year).Select(o => o).ToList();

            var numOfConsumers = 1;

            if (!isScope)
            {
                numOfConsumers = _consumerRepository.GetAll().Count();
            }

            var reportData = new Dictionary <string, float>();

            foreach (var outage in outageReportGrouping)
            {
                var outageCount = outage.Count();
                reportData.Add(type == "Monthly" ? DateHelpers.Months[outage.Key] : outage.Key.ToString(), (float)outageCount / (float)numOfConsumers);;
            }

            return(new OutageReport
            {
                Type = type,
                Data = reportData
            });
        }