示例#1
0
        public DateTimeOffsetInterval FindTimeSeriesTimeRange(Guid timeseriesUniqueId)
        {
            List <TimeSeriesPoint> points = FindAnnualCountPoints(timeseriesUniqueId);

            if (points.Count == 0)
            {
                return(new DateTimeOffsetInterval());
            }

            TimeSpan offset = points[0].Timestamp.Offset;

            int binAdjust = _Common.GetBinAdjustment(timeseriesUniqueId);

            DateTimeOffset FirstYear = new DateTimeOffset(points[0].Timestamp.Year + binAdjust, 1, 1, 0, 0, 0, offset);
            DateTimeOffset LastYear  = new DateTimeOffset(points[points.Count - 1].Timestamp.Year + binAdjust, 1, 1, 0, 0, 0, offset);

            Log.DebugFormat("Found first point is in Year = {0}, last point is in Year = {1}", FirstYear, LastYear);

            points = FindDailyCountPoints(timeseriesUniqueId, FirstYear, FirstYear.AddYears(1).AddDays(1));
            if (points.Count == 0)
            {
                return(new DateTimeOffsetInterval());
            }

            DateTimeOffset firstTime     = FirstNonZeroPoint(points).Timestamp;
            DateTimeOffset queryFromTime = new DateTimeOffset(firstTime.Year, firstTime.Month, firstTime.Day, 0, 0, 0, offset);

            points = _Common.GetTimeSeriesPoints(timeseriesUniqueId, queryFromTime.AddDays(binAdjust), queryFromTime.AddDays(binAdjust + 1));
            if (points.Count == 0)
            {
                return(new DateTimeOffsetInterval());
            }

            firstTime = points[0].Timestamp;
            Log.DebugFormat("Found first point at time = {0}", firstTime.ToString(Common._DateFormat));

            points = FindDailyCountPoints(timeseriesUniqueId, LastYear, LastYear.AddYears(1).AddDays(1));
            if (points.Count == 0)
            {
                return(new DateTimeOffsetInterval(firstTime, null));
            }

            DateTimeOffset lastTime = LastNonZeroPoint(points).Timestamp;

            queryFromTime = new DateTimeOffset(lastTime.Year, lastTime.Month, lastTime.Day, 0, 0, 0, offset);
            points        = _Common.GetTimeSeriesPoints(timeseriesUniqueId, queryFromTime.AddDays(binAdjust), queryFromTime.AddDays(binAdjust + 1));
            if (points.Count == 0)
            {
                return(new DateTimeOffsetInterval(firstTime, null));
            }

            lastTime = points[points.Count - 1].Timestamp;
            Log.DebugFormat("Found last point at time = {0}", lastTime.ToString(Common._DateFormat));

            DateTimeOffsetInterval interval = new DateTimeOffsetInterval(firstTime, lastTime);

            return(interval);
        }
        public DateTimeOffsetInterval GetIntervalOfOverlap(DateTimeOffsetInterval SelectedPeriod, DateTimeOffsetInterval TimeSeriesRange, TimeSpan utcOffset)
        {
            DateTimeOffset?StartTime = null;
            DateTimeOffset?EndTime   = null;

            if (SelectedPeriod.Start.HasValue && TimeSeriesRange.Start.HasValue)
            {
                StartTime = (SelectedPeriod.Start.Value > TimeSeriesRange.Start.Value) ? SelectedPeriod.Start.Value.ToOffset(utcOffset) :
                            (SelectedPeriod.End.HasValue && (SelectedPeriod.End.Value < TimeSeriesRange.Start.Value)) ?
                            SelectedPeriod.End.Value.ToOffset(utcOffset) : TimeSeriesRange.Start.Value;
            }
            else
            {
                StartTime = (SelectedPeriod.Start.HasValue) ? SelectedPeriod.Start.Value.ToOffset(utcOffset) : TimeSeriesRange.Start;
            }

            if (SelectedPeriod.End.HasValue && TimeSeriesRange.End.HasValue)
            {
                EndTime = (SelectedPeriod.End.Value < TimeSeriesRange.End.Value) ? SelectedPeriod.End.Value.ToOffset(utcOffset) : TimeSeriesRange.End.Value;
            }
            else
            {
                EndTime = (SelectedPeriod.End.HasValue) ? SelectedPeriod.End.Value.ToOffset(utcOffset) : TimeSeriesRange.End;
            }

            if (!TimeSeriesRange.Start.HasValue && !TimeSeriesRange.End.HasValue)
            {
                // TimeSeries has no range - no points in it and will be no useful time range therefore collapse time range
                if (StartTime.HasValue)
                {
                    EndTime = StartTime.Value;
                }
                else if (EndTime.HasValue)
                {
                    StartTime = EndTime.Value;
                }
            }

            DateTimeOffset now = DateTimeOffset.Now.ToOffset(utcOffset);

            DateTimeOffset TheStartTime = (StartTime.HasValue) ? StartTime.Value.ToOffset(utcOffset) : now;
            DateTimeOffset TheEndTime   = (EndTime.HasValue) ? EndTime.Value.ToOffset(utcOffset) : now;

            TheEndTime = (TheEndTime > TheStartTime) ? TheEndTime : TheStartTime; // avoid improper interval

            return(new DateTimeOffsetInterval(TheStartTime, TheEndTime));
        }
        public DataTable ReportPeriodsTable(string tableName, TimeSpan reportUtcOffset)
        {
            Log.DebugFormat("Create ReportPeriodsTable {0}", tableName);

            DateTimeOffsetInterval timeRangeToAdjust = _Common.GetPeriodSelectedAdjustedForReport();
            GroupByHandler         groupByHandler    = new GroupByHandler(_Common);

            if ((_RunReportRequest.Inputs != null) && (_RunReportRequest.Inputs.TimeSeriesInputs.Count > 0))
            {
                Guid firstTimeSeriesUniqueId = _RunReportRequest.Inputs.TimeSeriesInputs[0].UniqueId;
                timeRangeToAdjust = groupByHandler.GetIntervalOfOverlap(timeRangeToAdjust, _Common.GetTimeSeriesTimeRange(firstTimeSeriesUniqueId), reportUtcOffset);
                for (int i = 1; i < _RunReportRequest.Inputs.TimeSeriesInputs.Count; i++)
                {
                    Guid timeSeriesUniqueId = _RunReportRequest.Inputs.TimeSeriesInputs[i].UniqueId;
                    timeRangeToAdjust = groupByHandler.GetIntervalOfOverlap(timeRangeToAdjust, _Common.GetTimeSeriesTimeRange(timeSeriesUniqueId), reportUtcOffset);
                }
            }

            DataTable table = new DataTable(tableName);

            table.Columns.Add("GroupByYear", typeof(DateTimeOffsetInterval));
            table.Columns.Add("GroupByWaterYear", typeof(DateTimeOffsetInterval));
            table.Columns.Add("GroupByMonth", typeof(DateTimeOffsetInterval));
            table.Columns.Add("GroupByWeek", typeof(DateTimeOffsetInterval));
            table.Columns.Add("GroupByDay", typeof(DateTimeOffsetInterval));
            table.Columns.Add("NoGroupBy", typeof(DateTimeOffsetInterval));

            DataRow row = table.NewRow();

            row["GroupByYear"]      = groupByHandler.AdjustIntervalToGroupBy(timeRangeToAdjust, "Year");
            row["GroupByWaterYear"] = groupByHandler.AdjustIntervalToGroupBy(timeRangeToAdjust, "WaterYear");
            row["GroupByMonth"]     = groupByHandler.AdjustIntervalToGroupBy(timeRangeToAdjust, "Month");
            row["GroupByWeek"]      = groupByHandler.AdjustIntervalToGroupBy(timeRangeToAdjust, "Week");
            row["GroupByDay"]       = groupByHandler.AdjustIntervalToGroupBy(timeRangeToAdjust, "Day");
            row["NoGroupBy"]        = groupByHandler.AdjustIntervalToGroupBy(timeRangeToAdjust, "NoGroupBy");

            table.Rows.Add(row);

            return(table);
        }
        public static DateTimeOffsetInterval GetTrimmedPeriodSelected(DateTimeOffsetInterval periodSelected)
        {
            DateTimeOffset?endTime = periodSelected.End;

            if (endTime.HasValue)
            {
                if ((endTime.Value.Hour == 0) && (endTime.Value.Minute == 0) && (endTime.Value.Second == 0))
                {
                    endTime = endTime.Value.AddMilliseconds(-1); // avoid having endTime be at exact start of day/month/year
                }
            }
            DateTimeOffset?startTime = periodSelected.Start;

            if (startTime.HasValue)
            {
                startTime = new DateTimeOffset(startTime.Value.Year, startTime.Value.Month, startTime.Value.Day, 0, 0, 0, startTime.Value.Offset);
            }
            if (startTime.HasValue && endTime.HasValue && endTime.Value < startTime.Value)
            {
                endTime = startTime.Value;
            }
            return(new DateTimeOffsetInterval(startTime, endTime));
        }
        public DateTimeOffsetInterval AdjustIntervalToGroupBy(DateTimeOffsetInterval SelectedPeriod, DateTimeOffsetInterval TimeSeriesRange, string GroupBy, TimeSpan timeseriesOffset)
        {
            Log.DebugFormat("AdjustIntervalToGroupBy selected interval = {0}, timeseries range = {1}, groupBy = {2}, tsOffset = {3}",
                            _Common.TimeRangeString(SelectedPeriod), _Common.TimeSeriesRangeString(TimeSeriesRange), GroupBy, timeseriesOffset);

            DateTimeOffsetInterval reportPeriod = SelectedPeriod;

            try
            {
                DateTimeOffsetInterval selectedInterval      = _Common.GetIntervalInUtcOffset(SelectedPeriod, timeseriesOffset);
                DateTimeOffsetInterval trimmedPeriodSelected = GetTrimmedPeriodSelected(selectedInterval);
                DateTimeOffsetInterval overlappedInterval    = GetIntervalOfOverlap(trimmedPeriodSelected, TimeSeriesRange, timeseriesOffset);

                reportPeriod = AdjustIntervalToGroupBy(overlappedInterval, GroupBy);
            }
            catch (Exception exp)
            {
                Log.Error("Error in AdjustIntervalToGroupBy", exp);
            }
            Log.DebugFormat("AdjustIntervalToGroupBy returns report period = {0}", _Common.TimeRangeString(reportPeriod));

            return(reportPeriod);
        }
        public static void AddReportSpecificTables(DataSet dataSet)
        {
            try
            {
                if (dataSet.Tables.Contains("DischargeTimeSeriesFromRatingCurve"))
                {
                    dataSet.Tables["DischargeTimeSeriesFromRatingCurve"].TableName         = "SourceData";
                    dataSet.Tables["DischargeTimeSeriesFromRatingCurveLocation"].TableName = "SourceDataLocation";
                    dataSet.Tables["DischargeTimeSeriesFromRatingCurveLocationExtendedAttributes"].TableName = "SourceDataLocationExtendedAttributes";
                }

                Common common = (Common)dataSet.Tables["RunReportRequest"].Rows[0]["CommonLibrary"];

                DataTable settingsTable = dataSet.Tables["ReportSettings"];
                settingsTable.Columns.Add("ReportTitle", typeof(string));
                settingsTable.Rows[0]["ReportTitle"] = Resources.ContinuousDataProduction;

                DataTable table = new DataTable("ContinuousDataProductionDataTable");

                dataSet.Tables.Add(table);
                RunFileReportRequest runReportRequest = (RunFileReportRequest)dataSet.Tables["RunReportRequest"].Rows[0]["RunReportRequest"];
                IPublishGateway      publish          = runReportRequest.Publish;
                Guid timeSeriesUniqueId = (Guid)dataSet.Tables["SourceData"].Rows[0]["UniqueId"];

                string dllName = (string)dataSet.Tables["RunReportRequest"].Rows[0]["DllName"];
                Log.DebugFormat("{0} - Document GenerateScript input = {1}", dllName, timeSeriesUniqueId);

                ///////////////////////////////////////////////////////////////

                string timeseriesType = (string)dataSet.Tables["SourceData"].Rows[0]["TimeSeriesType"];

                if (timeseriesType != "ProcessorDerived")
                {
                    throw (new Exception("Input is not a derived time-series. Input signal must be a rating curve derived time-series."));
                }

                Server.Services.PublishService.ServiceModel.RequestDtos.UpchainProcessorListByTimeSeriesServiceRequest upchain = new Server.Services.PublishService.ServiceModel.RequestDtos.UpchainProcessorListByTimeSeriesServiceRequest();
                upchain.TimeSeriesUniqueId = timeSeriesUniqueId;
                List <Server.Services.PublishService.ServiceModel.Dtos.Processor> processors = publish.Get(upchain).Processors;

                string ratingModelIdentifier = "";

                foreach (Server.Services.PublishService.ServiceModel.Dtos.Processor processor in processors)
                {
                    if (string.IsNullOrEmpty(processor.InputRatingModelIdentifier))
                    {
                        continue;
                    }

                    if (processor.InputTimeSeriesUniqueIds.Count == 0)
                    {
                        continue;
                    }

                    ratingModelIdentifier = processor.InputRatingModelIdentifier;
                    break;
                }

                if (string.IsNullOrEmpty(ratingModelIdentifier))
                {
                    throw (new Exception("Input is not a rating model derived time-series. Input time-series must be a derived from a rating model."));
                }

                double tableIncrement           = common.GetParameterDouble("TableIncrement", 0.1);
                int    httpRepeatCallLimit      = common.GetParameterInt("HttpRepeatCallLimit", 4);
                int    httpCallLimitSize        = common.GetParameterInt("HttpCallLimitSize", 2000);
                int    httpCallTimeoutInSeconds = common.GetParameterInt("HttpCallTimeoutInSeconds", 30);
                string httpUrlPrefix            = common.GetParameterString("HttpUrlPrefix",
                                                                            @"http://geo.weather.gc.ca/geomet/features/collections/hydrometric-daily-mean/items?f=json&STATION_NUMBER=");

                TimeSpan timezone = TimeSpan.FromHours(common.GetTimeSeriesDescription(timeSeriesUniqueId).UtcOffset);
                DateTimeOffsetInterval selectedInterval = (DateTimeOffsetInterval)dataSet.Tables["ReportData"].Rows[0]["SelectedInterval"];

                DateTimeOffset ReportTime = DateTimeOffset.Now;

                if (selectedInterval.End.HasValue)
                {
                    ReportTime = selectedInterval.End.Value.ToOffset(timezone);
                }
                else
                {
                    ReportTime = DateTimeOffset.Now.ToOffset(timezone);
                }

                string locationIdentifier = common.GetTimeSeriesDescription(timeSeriesUniqueId).LocationIdentifier;

                int numberOfHistoricalPoints = ReportSpecificFunctions.GetNumberOfHistoricalPointsAvailable(
                    httpUrlPrefix, locationIdentifier, httpRepeatCallLimit, httpCallTimeoutInSeconds);

                settingsTable.Columns.Add("NumberOfHistoricalPoints", typeof(int));
                settingsTable.Rows[0]["NumberOfHistoricalPoints"] = numberOfHistoricalPoints;
            }
            catch (Exception exp)
            {
                Log.Error("Error creating report specific data tables ", exp);
                throw exp;
            }
        }
 public static bool TimeRangeOverlaps(DateTimeOffset start, DateTimeOffset?end, DateTimeOffsetInterval interval)
 {
     if (interval.End.HasValue && (start > interval.End.Value))
     {
         return(false);
     }
     if (interval.Start.HasValue && end.HasValue && (end < interval.Start.Value))
     {
         return(false);
     }
     return(true);
 }
        public static void AddReportSpecificTables(DataSet dataSet)
        {
            try
            {
                Common common = (Common)dataSet.Tables["RunReportRequest"].Rows[0]["CommonLibrary"];

                DataTable settingsTable = dataSet.Tables["ReportSettings"];
                settingsTable.Columns.Add("ReportTitle", typeof(string));
                settingsTable.Rows[0]["ReportTitle"] = Resources.BenchmarkHistory;

                DataTable table = new DataTable("BenchmarkHistoryDataTable");
                dataSet.Tables.Add(table);

                RunFileReportRequest runReportRequest = (RunFileReportRequest)dataSet.Tables["RunReportRequest"].Rows[0]["RunReportRequest"];
                IPublishGateway      publish          = runReportRequest.Publish;
                string locationIdentifier             = (string)dataSet.Tables["LocationInput"].Rows[0]["Identifier"];

                string dllName = (string)dataSet.Tables["RunReportRequest"].Rows[0]["DllName"];
                Log.DebugFormat("{0} - Document GenerateScript input location = {1}", dllName, locationIdentifier);

                ///////////////////////////////////////////////////////////////
                DateTimeOffsetInterval reportPeriod = (DateTimeOffsetInterval)dataSet.Tables["ReportPeriods"].Rows[0]["NoGroupBy"];

                int    formatPrecision = common.GetParameterInt("FormatPrecision", 3);
                string formatType      = common.GetParameterString("FormatType", "Fixed");
                bool   formatFixed     = (formatType == "Fixed");

                int groupSizeLimit = 6;

                DataTable benchmarks = dataSet.Tables.Add("Benchmarks");

                benchmarks.Columns.Add("Name", typeof(string));
                benchmarks.Columns.Add("Elevation", typeof(string));
                benchmarks.Columns.Add("DateConstructed", typeof(string));
                benchmarks.Columns.Add("DateRemoved", typeof(string));
                benchmarks.Columns.Add("Status", typeof(string));
                benchmarks.Columns.Add("Description", typeof(string));

                DataTable groupBy = dataSet.Tables.Add("GroupBy");
                groupBy.Columns.Add("GroupNumber", typeof(int));
                for (int i = 0; i < groupSizeLimit; i++)
                {
                    groupBy.Columns.Add("Name" + (i + 1).ToString(), typeof(string));
                }

                DataTable benchmarkHistory = dataSet.Tables.Add("BenchmarkHistory");

                benchmarkHistory.Columns.Add("GroupNumber", typeof(int));
                benchmarkHistory.Columns.Add("DateTime", typeof(string));
                benchmarkHistory.Columns.Add("Party", typeof(string));
                benchmarkHistory.Columns.Add("Comments", typeof(string));
                for (int i = 0; i < groupSizeLimit; i++)
                {
                    benchmarkHistory.Columns.Add("Elevation" + (i + 1).ToString(), typeof(string));
                    benchmarkHistory.Columns.Add("Correction" + (i + 1).ToString(), typeof(string));
                }

                dataSet.Relations.Add("GroupByBenchmarkHistory", groupBy.Columns["GroupNumber"], benchmarkHistory.Columns["GroupNumber"]);

                LocationDataServiceResponse locData = common.GetLocationData(locationIdentifier);

                List <ReferencePoint> refPoints = new List <ReferencePoint>();
                foreach (ReferencePoint refPoint in locData.ReferencePoints)
                {
                    List <ReferencePointPeriod> refPointPeriods = refPoint.ReferencePointPeriods;

                    if (refPointPeriods.Count == 0)
                    {
                        continue;
                    }

                    refPointPeriods.Sort((x, y) => x.ValidFrom.CompareTo(y.ValidFrom));
                    DateTimeOffset validFrom = refPointPeriods[0].ValidFrom;

                    if (ReportSpecificFunctions.TimeRangeOverlaps(validFrom, refPoint.DecommissionedDate, reportPeriod))
                    {
                        refPoints.Add(refPoint);
                    }
                }

                if (refPoints.Count == 0)
                {
                    return;
                }

                Dictionary <Guid, List <ReferencePointPeriod> > refPointHistories = new Dictionary <Guid, List <ReferencePointPeriod> >();
                Dictionary <Guid, int> refPointNumbers = new Dictionary <Guid, int>();

                for (int i = 0; i < refPoints.Count; i++)
                {
                    ReferencePoint refPoint = refPoints[i];

                    refPointNumbers.Add(refPoint.UniqueId, i);

                    DataRow row = benchmarks.NewRow();

                    row["Name"]        = refPoint.Name;
                    row["Description"] = refPoint.Description;

                    if (refPoint.DecommissionedDate.HasValue)
                    {
                        row["DateRemoved"] = refPoint.DecommissionedDate.Value.ToString("yyyy-MM-dd");
                    }

                    string status = (refPoint.DecommissionedDate.HasValue) ? Resources.InactiveLowerCase : Resources.ActiveLowerCase;
                    status += (refPoint.PrimarySinceDate.HasValue) ? " " + Resources.PrimaryLowerCase : "";

                    row["Status"] = status;

                    DateTimeOffset?primarySince = refPoint.PrimarySinceDate;

                    List <ReferencePointPeriod> refPointPeriods = refPoint.ReferencePointPeriods;
                    refPointPeriods.Sort((x, y) => x.ValidFrom.CompareTo(y.ValidFrom));

                    DateTimeOffset validFrom = refPointPeriods[0].ValidFrom;
                    row["DateConstructed"] = validFrom.ToString("yyyy-MM-dd");

                    double elevation = refPointPeriods[refPointPeriods.Count - 1].Elevation;
                    row["Elevation"] = Common.FormatDoubleValue(elevation, formatFixed, formatPrecision, "");

                    refPointPeriods.Reverse();
                    refPointHistories[refPoint.UniqueId] = refPointPeriods;

                    benchmarks.Rows.Add(row);
                }

                int numberOfGroups = (int)Math.Ceiling((double)benchmarks.Rows.Count / groupSizeLimit);

                FieldVisitDataByLocationServiceRequest fdRequest = new FieldVisitDataByLocationServiceRequest();
                fdRequest.LocationIdentifier = locationIdentifier;
                fdRequest.Activities         = new List <ActivityType> {
                    ActivityType.LevelSurvey
                };
                FieldVisitDataByLocationServiceResponse fdResponse = publish.Get(fdRequest);
                List <FieldVisit> fieldVisitData = fdResponse.FieldVisitData;

                try
                {
                    fieldVisitData.Sort((x, y) => y.StartTime.Value.CompareTo(x.StartTime.Value));
                }
                catch { }


                for (int i = 0; i < numberOfGroups; i++)
                {
                    DataRow groupByRow = dataSet.Tables["GroupBy"].NewRow();
                    groupByRow["GroupNumber"] = i;

                    for (int j = 0; j < groupSizeLimit; j++)
                    {
                        int index = (i * groupSizeLimit) + j;
                        if (index < refPoints.Count)
                        {
                            ReferencePoint refPoint = refPoints[index];
                            groupByRow["Name" + (j + 1).ToString()] = refPoint.Name;
                        }
                    }

                    dataSet.Tables["GroupBy"].Rows.Add(groupByRow);
                }

                foreach (FieldVisit fieldVisit in fieldVisitData)
                {
                    if (!ReportSpecificFunctions.TimeRangeOverlaps(fieldVisit.StartTime.Value, fieldVisit.StartTime.Value, reportPeriod))
                    {
                        continue;
                    }

                    string dateTime = fieldVisit.StartTime.Value.ToString("yyyy-MM-dd HH:mm");
                    string comments = fieldVisit.LevelSurveyActivity.Comments;
                    string party    = fieldVisit.LevelSurveyActivity.Party;

                    int fieldVisitFirstRow = dataSet.Tables["BenchmarkHistory"].Rows.Count;

                    for (int i = 0; i < numberOfGroups; i++)
                    {
                        DataRow row = dataSet.Tables["BenchmarkHistory"].NewRow();
                        row["GroupNumber"] = i;
                        row["DateTime"]    = dateTime;
                        row["Party"]       = party;
                        row["Comments"]    = comments;
                        dataSet.Tables["BenchmarkHistory"].Rows.Add(row);
                    }

                    List <LevelSurveyMeasurement> levelMeasurements = fieldVisit.LevelSurveyActivity.LevelMeasurements;

                    foreach (LevelSurveyMeasurement lsm in levelMeasurements)
                    {
                        if (!lsm.MeasuredElevation.Numeric.HasValue)
                        {
                            continue;
                        }

                        Guid id = lsm.ReferencePointUniqueId;

                        if (!refPointNumbers.ContainsKey(id))
                        {
                            continue;
                        }

                        int number         = refPointNumbers[id];
                        int theGroupNumber = (int)Math.Floor((double)number / groupSizeLimit);
                        int thePosition    = (int)(number % groupSizeLimit);

                        double level      = lsm.MeasuredElevation.Numeric.Value;
                        double correction = ReportSpecificFunctions.calculateDifference(lsm, refPointHistories[id]);

                        DataRow row = dataSet.Tables["BenchmarkHistory"].Rows[fieldVisitFirstRow + theGroupNumber];

                        row["Elevation" + (1 + thePosition).ToString()]  = Common.FormatDoubleValue(level, formatFixed, formatPrecision, "");
                        row["Correction" + (1 + thePosition).ToString()] = Common.FormatDoubleValue(correction, formatFixed, formatPrecision, "");
                    }
                }

                List <DataRow> emptyRows = new List <DataRow>();
                for (int i = 0; i < dataSet.Tables["BenchmarkHistory"].Rows.Count; i++)
                {
                    DataRow row = dataSet.Tables["BenchmarkHistory"].Rows[i];

                    int emptyCount = 0;
                    for (int j = 0; j < groupSizeLimit; j++)
                    {
                        bool empty = string.IsNullOrEmpty(row["Elevation" + (j + 1).ToString()].ToString());
                        if (empty)
                        {
                            emptyCount++;
                        }
                    }
                    if (emptyCount == groupSizeLimit)
                    {
                        emptyRows.Add(row);
                    }
                }

                for (int i = 0; i < emptyRows.Count; i++)
                {
                    dataSet.Tables["BenchmarkHistory"].Rows.Remove(emptyRows[i]);
                }
            }
            catch (Exception exp)
            {
                Log.Error("Error creating report specific data tables ", exp);
                throw exp;
            }
        }
        public static void AddReportSpecificTables(DataSet dataSet)
        {
            try
            {
                Common common = (Common)dataSet.Tables["RunReportRequest"].Rows[0]["CommonLibrary"];

                DataTable settingsTable = dataSet.Tables["ReportSettings"];
                settingsTable.Columns.Add("ReportTitle", typeof(string));
                settingsTable.Rows[0]["ReportTitle"] = Resources.Instrumentation;

                DataTable table = new DataTable("InstrumentationDataTable");

                dataSet.Tables.Add(table);

                RunFileReportRequest runReportRequest = (RunFileReportRequest)dataSet.Tables["RunReportRequest"].Rows[0]["RunReportRequest"];
                IPublishGateway      publish          = runReportRequest.Publish;
                string locationIdentifier             = (string)dataSet.Tables["LocationInput"].Rows[0]["Identifier"];

                string dllName = (string)dataSet.Tables["RunReportRequest"].Rows[0]["DllName"];
                Log.DebugFormat("{0} - Document GenerateScript input location = {1}", dllName, locationIdentifier);

                ///////////////////////////////////////////////////////////////
                DateTimeOffsetInterval reportPeriod = (DateTimeOffsetInterval)dataSet.Tables["ReportPeriods"].Rows[0]["NoGroupBy"];

                string sortOrder = common.GetParameterString("SortOrder", "ReverseChronologicalOnMeasurementTime");

                DataTable table1 = dataSet.Tables.Add("Instrumentation");

                table1.Columns.Add("Date", typeof(string));
                table1.Columns.Add("Time", typeof(string));
                table1.Columns.Add("Timezone", typeof(string));
                table1.Columns.Add("ActivityType", typeof(string));
                table1.Columns.Add("Stage", typeof(string));
                table1.Columns.Add("StageUnit", typeof(string));
                table1.Columns.Add("Discharge", typeof(string));
                table1.Columns.Add("DischargeUnit", typeof(string));
                table1.Columns.Add("ControlCondition", typeof(string));
                table1.Columns.Add("ActivityRemarks", typeof(string));
                table1.Columns.Add("FieldVisitComments", typeof(string));
                table1.Columns.Add("Method", typeof(string));
                table1.Columns.Add("InstrumentType", typeof(string));
                table1.Columns.Add("Software", typeof(string));
                table1.Columns.Add("Firmware", typeof(string));
                table1.Columns.Add("SerialNumber", typeof(string));
                table1.Columns.Add("Manufacturer", typeof(string));
                table1.Columns.Add("Model", typeof(string));

                ActiveMetersAndCalibrationsServiceRequest  amcRequest  = new ActiveMetersAndCalibrationsServiceRequest();
                ActiveMetersAndCalibrationsServiceResponse amcResponse = publish.Get(amcRequest);
                List <ActiveMeterDetails> activeMeterDetailsList       = amcResponse.ActiveMeterDetails;

                FieldVisitDataByLocationServiceRequest fdRequest = new FieldVisitDataByLocationServiceRequest();
                fdRequest.LocationIdentifier = locationIdentifier;
                fdRequest.Activities         = new List <ActivityType> {
                    ActivityType.Reading, ActivityType.DischargeSummary, ActivityType.DischargePointVelocity, ActivityType.DischargeAdcp
                };
                fdRequest.ApplyRounding    = true;
                fdRequest.IncludeVerticals = true;
                FieldVisitDataByLocationServiceResponse fdResponse = publish.Get(fdRequest);
                List <FieldVisit> fieldVisitData = fdResponse.FieldVisitData;

                try
                {
                    if (sortOrder != "ReverseChronologicalOnMeasurementTime")
                    {
                        fieldVisitData.Sort((x, y) => x.StartTime.Value.CompareTo(y.StartTime.Value));
                    }
                    else
                    {
                        fieldVisitData.Sort((x, y) => y.StartTime.Value.CompareTo(x.StartTime.Value));
                    }
                }
                catch { }

                foreach (FieldVisit fieldVisit in fieldVisitData)
                {
                    if (!ReportSpecificFunctions.TimeRangeOverlaps(fieldVisit.StartTime.Value, fieldVisit.StartTime.Value, reportPeriod))
                    {
                        continue;
                    }

                    string controlCondition = (fieldVisit.ControlConditionActivity != null) ? fieldVisit.ControlConditionActivity.ControlCondition.ToString() : "";

                    var activities = fieldVisit.DischargeActivities;

                    if (activities != null)
                    {
                        if (sortOrder != "ReverseChronologicalOnMeasurementTime")
                        {
                            activities.Sort((x, y) => x.DischargeSummary.MeasurementTime.CompareTo(y.DischargeSummary.MeasurementTime));
                        }
                        else
                        {
                            activities.Sort((x, y) => y.DischargeSummary.MeasurementTime.CompareTo(x.DischargeSummary.MeasurementTime));
                        }

                        foreach (DischargeActivity dischargeActivity in activities)
                        {
                            DataRow row = table1.NewRow();
                            row["Date"]               = (fieldVisit.StartTime.HasValue) ? fieldVisit.StartTime.Value.ToString("yyyy-MM-dd") : "";
                            row["ControlCondition"]   = controlCondition;
                            row["FieldVisitComments"] = fieldVisit.Remarks;
                            row["ActivityType"]       = Resources.DischargeSummary;
                            row["Method"]             = dischargeActivity.DischargeSummary.DischargeMethod;

                            DischargeSummary dischargeSummary = dischargeActivity.DischargeSummary;
                            row["Time"]     = dischargeSummary.MeasurementTime.ToString("HH:mm");
                            row["Timezone"] = dischargeSummary.MeasurementTime.ToString("zzz");
                            string discharge     = (dischargeSummary.Discharge != null) ? dischargeSummary.Discharge.Numeric.ToString() : "";
                            string dischargeUnit = (dischargeSummary.Discharge != null) ? dischargeSummary.Discharge.Unit : "";
                            if (dischargeUnit != "m^3/s")
                            {
                                discharge += " " + dischargeUnit;
                            }
                            row["Discharge"] = discharge;

                            string stage     = (dischargeSummary.MeanGageHeight != null) ? dischargeSummary.MeanGageHeight.Numeric.ToString() : "";
                            string stageUnit = (dischargeSummary.MeanGageHeight != null) ? dischargeSummary.MeanGageHeight.Unit : "";
                            if (!string.IsNullOrEmpty(stage) && (stageUnit != "m"))
                            {
                                stage += " " + stageUnit;
                            }
                            row["Stage"]           = stage;
                            row["ActivityRemarks"] = dischargeSummary.Comments;

                            string serialNumber   = "";
                            string model          = "";
                            string manufacturer   = "";
                            string instrumentType = "";
                            string software       = "";
                            string firmware       = "";

                            if ((dischargeActivity.PointVelocityDischargeActivities != null) && (dischargeActivity.PointVelocityDischargeActivities.Count > 0))
                            {
                                PointVelocityDischargeActivity pointVelocityDischargeActivity = dischargeActivity.PointVelocityDischargeActivities[0];
                                if ((pointVelocityDischargeActivity.Verticals != null) && (pointVelocityDischargeActivity.Verticals.Count > 0))
                                {
                                    Vertical vertical = pointVelocityDischargeActivity.Verticals[0];
                                    serialNumber = vertical.CurrentMeter.SerialNumber;
                                    model        = vertical.CurrentMeter.Model;
                                    manufacturer = vertical.CurrentMeter.Manufacturer;

                                    foreach (ActiveMeterDetails activeMeterDetails in activeMeterDetailsList)
                                    {
                                        if ((activeMeterDetails.Manufacturer == manufacturer) &&
                                            (activeMeterDetails.SerialNumber == serialNumber) &&
                                            (activeMeterDetails.Model == model))
                                        {
                                            instrumentType = (activeMeterDetails.MeterType.HasValue) ? activeMeterDetails.MeterType.Value.ToString() : "";
                                            software       = activeMeterDetails.SoftwareVersion;
                                            firmware       = activeMeterDetails.FirmwareVersion;

                                            break;
                                        }
                                    }
                                }
                            }

                            if ((dischargeActivity.AdcpDischargeActivities != null) && (dischargeActivity.AdcpDischargeActivities.Count > 0))
                            {
                                AdcpDischargeActivity adcpDischargeActivity = dischargeActivity.AdcpDischargeActivities[0];

                                instrumentType = adcpDischargeActivity.AdcpDeviceType;
                                software       = adcpDischargeActivity.SoftwareVersion;
                                firmware       = adcpDischargeActivity.FirmwareVersion;
                                manufacturer   = adcpDischargeActivity.Manufacturer;
                                serialNumber   = adcpDischargeActivity.SerialNumber;
                                model          = adcpDischargeActivity.Model;

                                Log.DebugFormat("AdcpDischargeActivity: {0}, {1}, {2}", instrumentType, software, firmware);
                            }

                            row["Software"]       = software;
                            row["InstrumentType"] = instrumentType;
                            row["Firmware"]       = firmware;
                            row["Manufacturer"]   = manufacturer;
                            row["Model"]          = model;
                            row["SerialNumber"]   = serialNumber;
                            table1.Rows.Add(row);
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                Log.Error("Error creating report specific data tables ", exp);
                throw exp;
            }
        }
        public static void AddReportSpecificTables(DataSet dataSet)
        {
            try
            {
                Common common = (Common)dataSet.Tables["RunReportRequest"].Rows[0]["CommonLibrary"];

                DataTable settingsTable = dataSet.Tables["ReportSettings"];
                settingsTable.Columns.Add("ReportTitle", typeof(string));
                settingsTable.Rows[0]["ReportTitle"] = "Cross-Section Survey Plot";

                RunFileReportRequest runReportRequest = (RunFileReportRequest)dataSet.Tables["RunReportRequest"].Rows[0]["RunReportRequest"];
                IPublishGateway      publish          = runReportRequest.Publish;
                Common CommonLibrary = (Common)dataSet.Tables["RunReportRequest"].Rows[0]["CommonLibrary"];
                DateTimeOffsetInterval periodSelected = (DateTimeOffsetInterval)dataSet.Tables["ReportData"].Rows[0]["PeriodSelectedAdjustedForReport"];

                DataTable crossSectionSurveyDataTable = new DataTable("CrossSectionSurveyPlotDataTable");
                dataSet.Tables.Add(crossSectionSurveyDataTable);

                string   locIdentifier = (string)dataSet.Tables["InputLocation"].Rows[0]["LocationIdentifier"];
                TimeSpan utcOffset     = (TimeSpan)dataSet.Tables["InputLocation"].Rows[0]["UtcOffset"];

                string relativeLocationFilter = CommonLibrary.GetParameterString("RelativeLocationFilterPartialName", "");
                string channelFilter          = CommonLibrary.GetParameterString("ChannelFilterPartialName", "");
                string partyFilter            = CommonLibrary.GetParameterString("PartyFilterPartialName", "");

                string filterInformationString = Resources.RelativeLocationFilter + ": " + relativeLocationFilter;
                filterInformationString += "        " + Resources.ChannelFilter + ": " + channelFilter;
                filterInformationString += "        " + Resources.PartyFilter + ": " + partyFilter;

                crossSectionSurveyDataTable.Rows.Add(crossSectionSurveyDataTable.NewRow());

                crossSectionSurveyDataTable.Columns.Add("FilterInformationString", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("RelativeLocationColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("ChannelColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("StartingPointColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("StartTimeColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("EndTimeColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("PartyColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("SurveyCommentColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("TotalPointsColumnHeader", typeof(string));
                crossSectionSurveyDataTable.Columns.Add("StageColumnHeader", typeof(string));

                crossSectionSurveyDataTable.Rows[0]["FilterInformationString"] = filterInformationString;

                string sortOrder  = CommonLibrary.GetParameterString("SortOrder", "ReverseChronologicalOnStartTime");
                string dateFormat = CommonLibrary.GetParameterString("DateFormat", "yyyy-MM-dd HH:mm");

                string stageUnitSymbol = "";
                string stageUnitId     = "";

                DataTable activityTable = dataSet.Tables.Add("CrossSectionSurveyActivity");
                activityTable.Columns.Add("ActivityNumber", typeof(int));
                activityTable.Columns.Add("RelativeLocation", typeof(string));
                activityTable.Columns.Add("Channel", typeof(string));
                activityTable.Columns.Add("StartingPoint", typeof(string));
                activityTable.Columns.Add("StartTime", typeof(string));
                activityTable.Columns.Add("EndTime", typeof(string));
                activityTable.Columns.Add("Party", typeof(string));
                activityTable.Columns.Add("SurveyComment", typeof(string));
                activityTable.Columns.Add("TotalPoints", typeof(string));
                activityTable.Columns.Add("Stage", typeof(string));
                activityTable.Columns.Add("DistanceUnitSymbol", typeof(string));
                activityTable.Columns.Add("ElevationUnitSymbol", typeof(string));
                activityTable.Columns.Add("YAxisLabel", typeof(string));
                activityTable.Columns.Add("XAxisLabel", typeof(string));

                DataTable pointsTable = dataSet.Tables.Add("CrossSectionSurveyPoints");
                pointsTable.Columns.Add("ActivityNumber", typeof(int));
                pointsTable.Columns.Add("PointOrder", typeof(string));
                pointsTable.Columns.Add("Distance", typeof(string));
                pointsTable.Columns.Add("Elevation", typeof(string));
                pointsTable.Columns.Add("DistanceUnit", typeof(string));
                pointsTable.Columns.Add("ElevationUnit", typeof(string));
                pointsTable.Columns.Add("DistanceDouble", typeof(double));
                pointsTable.Columns.Add("ElevationDouble", typeof(double));
                pointsTable.Columns.Add("PointComment", typeof(string));

                dataSet.Relations.Add("ActivityPoints", activityTable.Columns["ActivityNumber"], pointsTable.Columns["ActivityNumber"]);

                FieldVisitDataByLocationServiceRequest request = new FieldVisitDataByLocationServiceRequest();
                request.LocationIdentifier = locIdentifier;
                request.ApplyRounding      = true;
                request.Activities         = new List <ActivityType> {
                    ActivityType.CrossSectionSurvey
                };
                request.IncludeCrossSectionSurveyProfile = true;
                request.IncludeInvalidActivities         = false;

                FieldVisitDataByLocationServiceResponse response = publish.Get(request);
                List <FieldVisit> visits = response.FieldVisitData;

                if (sortOrder != "ReverseChronologicalOnStartTime")
                {
                    visits.Sort((x, y) => x.StartTime.Value.CompareTo(y.StartTime.Value));
                }
                else
                {
                    visits.Sort((x, y) => y.StartTime.Value.CompareTo(x.StartTime.Value));
                }

                int activityNumber = 0;
                foreach (FieldVisit visit in visits)
                {
                    if (visit.CrossSectionSurveyActivity == null)
                    {
                        continue;
                    }

                    List <CrossSectionSurveyActivity> activities = visit.CrossSectionSurveyActivity;
                    if (sortOrder != "ReverseChronologicalOnStartTime")
                    {
                        activities.Sort((x, y) => {
                            int ret = x.StartTime.CompareTo(y.StartTime);
                            return((ret != 0) ? ret : string.Compare(x.RelativeLocation, y.RelativeLocation));
                        });
                    }
                    else
                    {
                        activities.Sort((x, y) => {
                            int ret = y.StartTime.CompareTo(x.StartTime);
                            return((ret != 0) ? ret : string.Compare(x.RelativeLocation, y.RelativeLocation));
                        });
                    }

                    foreach (CrossSectionSurveyActivity activity in activities)
                    {
                        if (periodSelected.Start.HasValue && (activity.StartTime < periodSelected.Start.Value))
                        {
                            continue;
                        }
                        if (periodSelected.End.HasValue && (activity.StartTime > periodSelected.End.Value))
                        {
                            continue;
                        }

                        if (!Common.MatchPartialNameFilter(relativeLocationFilter, activity.RelativeLocation))
                        {
                            continue;
                        }
                        if (!Common.MatchPartialNameFilter(channelFilter, activity.Channel))
                        {
                            continue;
                        }
                        if (!Common.MatchPartialNameFilter(partyFilter, activity.Party))
                        {
                            continue;
                        }

                        List <CrossSectionPoint> points = activity.CrossSectionPoints;

                        string distanceUnitId  = "";
                        string elevationUnitId = "";

                        activityNumber++;

                        DataRow activitytRow = activityTable.NewRow();
                        activitytRow["ActivityNumber"]   = activityNumber;
                        activitytRow["RelativeLocation"] = activity.RelativeLocation;
                        activitytRow["Channel"]          = activity.Channel;
                        activitytRow["StartingPoint"]    = activity.StartingPoint.ToString();
                        activitytRow["StartTime"]        = activity.StartTime.ToOffset(utcOffset).ToString(dateFormat);
                        activitytRow["EndTime"]          = activity.EndTime.ToOffset(utcOffset).ToString(dateFormat);
                        activitytRow["Party"]            = activity.Party;
                        activitytRow["SurveyComment"]    = activity.Comments;
                        activitytRow["TotalPoints"]      = (points == null)? "" : points.Count.ToString();

                        if (string.IsNullOrEmpty(stageUnitId))
                        {
                            stageUnitId = activity.Stage.Unit;
                        }
                        string stageUnit = (stageUnitId == activity.Stage.Unit) ? "" : " " + CommonLibrary.GetUnitSymbol(activity.Stage.Unit);
                        activitytRow["Stage"] = activity.Stage.Display + stageUnit;

                        activityTable.Rows.Add(activitytRow);
                        if (points == null)
                        {
                            continue;
                        }

                        points.Sort((x, y) => x.PointOrder.CompareTo(y.PointOrder));

                        for (int i = 0; i < points.Count; i++)
                        {
                            CrossSectionPoint point = points[i];

                            if (string.IsNullOrEmpty(distanceUnitId))
                            {
                                distanceUnitId = point.Distance.Unit;
                            }
                            if (string.IsNullOrEmpty(elevationUnitId))
                            {
                                elevationUnitId = point.Elevation.Unit;
                            }

                            string distanceUnit  = (distanceUnitId == point.Distance.Unit) ? "" : " " + CommonLibrary.GetUnitSymbol(point.Distance.Unit);
                            string elevationUnit = (elevationUnitId == point.Elevation.Unit) ? "" : " " + CommonLibrary.GetUnitSymbol(point.Elevation.Unit);

                            DataRow row = pointsTable.NewRow();

                            row["ActivityNumber"]  = activityNumber;
                            row["PointOrder"]      = point.PointOrder.ToString();
                            row["Distance"]        = point.Distance.Display + distanceUnit;
                            row["Elevation"]       = point.Elevation.Display + elevationUnit;
                            row["DistanceUnit"]    = distanceUnit;
                            row["ElevationUnit"]   = elevationUnit;
                            row["DistanceDouble"]  = (point.Distance.Numeric.HasValue)? point.Distance.Numeric.Value : double.NaN;
                            row["ElevationDouble"] = (point.Elevation.Numeric.HasValue)? +point.Elevation.Numeric.Value : double.NaN;
                            row["PointComment"]    = point.Comments;

                            pointsTable.Rows.Add(row);
                        }

                        string distanceUnitSymbol  = CommonLibrary.GetUnitSymbol(distanceUnitId);
                        string elevationUnitSymbol = CommonLibrary.GetUnitSymbol(elevationUnitId);

                        activitytRow["DistanceUnitSymbol"]  = distanceUnitSymbol;
                        activitytRow["ElevationUnitSymbol"] = elevationUnitSymbol;
                        activitytRow["YAxisLabel"]          = Resources.Elevation + " (" + elevationUnitSymbol + ")";
                        activitytRow["XAxisLabel"]          = Resources.Distance + " (" + distanceUnitSymbol + ")";
                    }

                    stageUnitSymbol = CommonLibrary.GetUnitSymbol(stageUnitId);

                    crossSectionSurveyDataTable.Rows[0]["RelativeLocationColumnHeader"] = Resources.RelativeLocation;
                    crossSectionSurveyDataTable.Rows[0]["ChannelColumnHeader"]          = Resources.Channel;
                    crossSectionSurveyDataTable.Rows[0]["StartingPointColumnHeader"]    = Resources.StartingPoint;
                    crossSectionSurveyDataTable.Rows[0]["StartTimeColumnHeader"]        = Resources.StartTime;
                    crossSectionSurveyDataTable.Rows[0]["EndTimeColumnHeader"]          = Resources.EndTime;
                    crossSectionSurveyDataTable.Rows[0]["PartyColumnHeader"]            = Resources.Party;
                    crossSectionSurveyDataTable.Rows[0]["SurveyCommentColumnHeader"]    = Resources.CrossSectionSurveyComment;
                    crossSectionSurveyDataTable.Rows[0]["TotalPointsColumnHeader"]      = Resources.TotalPoints;
                    crossSectionSurveyDataTable.Rows[0]["StageColumnHeader"]            = Resources.Stage + " (" + stageUnitSymbol + ")";
                }
            }
            catch (Exception exp)
            {
                Log.Error("Error creating report specific data tables ", exp);
                throw exp;
            }
        }
        public DateTimeOffsetInterval AdjustIntervalToGroupBy(DateTimeOffsetInterval timeRange, string GroupBy)
        {
            Log.DebugFormat("Begin GroupBy '{0}' adjustments for interval {1} - {2}", GroupBy, timeRange.Start, timeRange.End);

            if (!timeRange.Start.HasValue || !timeRange.End.HasValue)
            {
                Log.DebugFormat("AdjustIntervalToGroupBy unable to adjust timeRange interval = {0} because start or end has no value, return unadjusted", _Common.TimeRangeString(timeRange));
                return(timeRange);
            }

            try
            {
                DateTimeOffset TheStartTime = timeRange.Start.Value;
                DateTimeOffset TheEndTime   = timeRange.End.Value;
                TimeSpan       tsOffset     = TheStartTime.Offset;

                if (GroupBy == "Year")
                {
                    TheStartTime = new DateTimeOffset(TheStartTime.Year, 1, 1, 0, 0, 0, tsOffset);
                    TheEndTime   = (new DateTimeOffset(TheEndTime.Year, 1, 1, 0, 0, 0, tsOffset)).AddYears(1).AddMilliseconds(-1);
                }
                else if (GroupBy == "WaterYear")
                {
                    int startYear = (TheStartTime.Month >= _WaterYearMonth) ? TheStartTime.Year : TheStartTime.Year - 1;
                    TheStartTime = new DateTimeOffset(startYear, _WaterYearMonth, 1, 0, 0, 0, tsOffset);

                    int endYear = (TheEndTime.Month >= _WaterYearMonth) ? TheEndTime.Year : TheEndTime.Year - 1;
                    TheEndTime = (new DateTimeOffset(endYear, _WaterYearMonth, 1, 0, 0, 0, tsOffset)).AddYears(1).AddMilliseconds(-1);
                }
                else if (GroupBy == "Month")
                {
                    TheStartTime = new DateTimeOffset(TheStartTime.Year, TheStartTime.Month, 1, 0, 0, 0, tsOffset);
                    TheEndTime   = new DateTimeOffset(TheEndTime.Year, TheEndTime.Month, 1, 0, 0, 0, tsOffset).AddMonths(1).AddMilliseconds(-1);
                }
                else if (GroupBy == "Week")
                {
                    int numberOfDays = ((int)Math.Ceiling(((TheEndTime - TheStartTime).TotalDays + 1) / 7.0)) * 7;
                    TheEndTime = TheStartTime.AddDays(numberOfDays);

                    TheStartTime = new DateTimeOffset(TheStartTime.Year, TheStartTime.Month, TheStartTime.Day, 0, 0, 0, tsOffset);
                    TheEndTime   = new DateTimeOffset(TheEndTime.Year, TheEndTime.Month, TheEndTime.Day, 0, 0, 0, tsOffset).AddMilliseconds(-1);
                }
                else if (GroupBy == "Day")
                {
                    TheStartTime = new DateTimeOffset(TheStartTime.Year, TheStartTime.Month, TheStartTime.Day, 0, 0, 0, tsOffset);
                    TheEndTime   = new DateTimeOffset(TheEndTime.Year, TheEndTime.Month, TheEndTime.Day, 0, 0, 0, tsOffset).AddDays(1).AddMilliseconds(-1);
                }
                else
                {
                    TheStartTime = new DateTimeOffset(TheStartTime.Year, TheStartTime.Month, TheStartTime.Day, 0, 0, 0, tsOffset);
                    TheEndTime   = new DateTimeOffset(TheEndTime.Year, TheEndTime.Month, TheEndTime.Day, 0, 0, 0, tsOffset).AddDays(1).AddMilliseconds(-1);
                }

                Log.DebugFormat("End GroupBy '{0}' adjustments for interval {1} - {2}", GroupBy, TheStartTime, TheEndTime);
                timeRange = new DateTimeOffsetInterval(TheStartTime, TheEndTime);
            }
            catch (Exception exp)
            {
                Log.Error("Error in AdjustIntervalToGroupBy", exp);
            }
            Log.DebugFormat("AdjustIntervalToGroupBy returns timeRange interval = {0}", _Common.TimeRangeString(timeRange));

            return(timeRange);
        }
示例#12
0
        public static void AddReportSpecificTables(DataSet dataSet)
        {
            try
            {
                Common common = (Common)dataSet.Tables["RunReportRequest"].Rows[0]["CommonLibrary"];

                DataTable settingsTable = dataSet.Tables["ReportSettings"];
                settingsTable.Columns.Add("ReportTitle", typeof(string));
                settingsTable.Rows[0]["ReportTitle"] = Resources.FieldActivity;

                DataTable table = new DataTable("FieldActivityDataTable");

                dataSet.Tables.Add(table);

                RunFileReportRequest runReportRequest = (RunFileReportRequest)dataSet.Tables["RunReportRequest"].Rows[0]["RunReportRequest"];
                IPublishGateway      publish          = runReportRequest.Publish;
                string locationIdentifier             = (string)dataSet.Tables["LocationInput"].Rows[0]["Identifier"];

                string dllName = (string)dataSet.Tables["RunReportRequest"].Rows[0]["DllName"];
                Log.DebugFormat("{0} - Document GenerateScript input location = {1}", dllName, locationIdentifier);

                ///////////////////////////////////////////////////////////////
                DateTimeOffsetInterval reportPeriod = (DateTimeOffsetInterval)dataSet.Tables["ReportPeriods"].Rows[0]["NoGroupBy"];

                string sortOrder = common.GetParameterString("SortOrder", "ReverseChronologicalOnMeasurementTime");

                DataTable table1 = dataSet.Tables.Add("FieldActivity");

                table1.Columns.Add("Date", typeof(string));
                table1.Columns.Add("Time", typeof(string));
                table1.Columns.Add("Timezone", typeof(string));
                table1.Columns.Add("ActivityType", typeof(string));
                table1.Columns.Add("Stage", typeof(string));
                table1.Columns.Add("StageUnit", typeof(string));
                table1.Columns.Add("Discharge", typeof(string));
                table1.Columns.Add("DischargeUnit", typeof(string));
                table1.Columns.Add("ControlCondition", typeof(string));
                table1.Columns.Add("ActivityRemarks", typeof(string));
                table1.Columns.Add("FieldVisitComments", typeof(string));

                FieldVisitDataByLocationServiceRequest fdRequest = new FieldVisitDataByLocationServiceRequest();
                fdRequest.LocationIdentifier = locationIdentifier;
                fdRequest.ApplyRounding      = true;
                fdRequest.Activities         = new List <ActivityType> {
                    ActivityType.Reading, ActivityType.DischargeSummary, ActivityType.ControlCondition
                };
                FieldVisitDataByLocationServiceResponse fdResponse = publish.Get(fdRequest);
                List <FieldVisit> fieldVisitData = fdResponse.FieldVisitData;

                try
                {
                    if (sortOrder != "ReverseChronologicalOnMeasurementTime")
                    {
                        fieldVisitData.Sort((x, y) => x.StartTime.Value.CompareTo(y.StartTime.Value));
                    }
                    else
                    {
                        fieldVisitData.Sort((x, y) => y.StartTime.Value.CompareTo(x.StartTime.Value));
                    }
                }
                catch { }

                foreach (FieldVisit fieldVisit in fieldVisitData)
                {
                    if (!ReportSpecificFunctions.TimeRangeOverlaps(fieldVisit.StartTime.Value, fieldVisit.StartTime.Value, reportPeriod))
                    {
                        continue;
                    }

                    if (fieldVisit.DischargeActivities != null)
                    {
                        var activities = fieldVisit.DischargeActivities;

                        if (sortOrder != "ReverseChronologicalOnMeasurementTime")
                        {
                            activities.Sort((x, y) => x.DischargeSummary.MeasurementTime.CompareTo(y.DischargeSummary.MeasurementTime));
                        }
                        else
                        {
                            activities.Sort((x, y) => y.DischargeSummary.MeasurementTime.CompareTo(x.DischargeSummary.MeasurementTime));
                        }

                        foreach (DischargeActivity dischargeActivity in activities)
                        {
                            if (dischargeActivity.DischargeSummary == null)
                            {
                                continue;
                            }

                            DataRow row = table1.NewRow();
                            row["Date"]               = (fieldVisit.StartTime.HasValue) ? fieldVisit.StartTime.Value.ToString("yyyy-MM-dd") : "";
                            row["ControlCondition"]   = (fieldVisit.ControlConditionActivity != null) ? fieldVisit.ControlConditionActivity.ControlCondition.ToString() : "";
                            row["FieldVisitComments"] = fieldVisit.Remarks;
                            row["ActivityType"]       = Resources.DischargeSummary;

                            DischargeSummary dischargeSummary = dischargeActivity.DischargeSummary;
                            row["Time"]     = dischargeSummary.MeasurementTime.ToString("HH:mm");
                            row["Timezone"] = dischargeSummary.MeasurementTime.ToString("zzz");
                            string discharge     = (dischargeSummary.Discharge != null) ? dischargeSummary.Discharge.Display : "";
                            string dischargeUnit = (dischargeSummary.Discharge != null) ? dischargeSummary.Discharge.Unit : "";
                            if (dischargeUnit != "m^3/s")
                            {
                                discharge += " " + dischargeUnit;
                            }
                            row["Discharge"] = discharge;

                            string stage     = (dischargeSummary.MeanGageHeight != null) ? dischargeSummary.MeanGageHeight.Display : "";
                            string stageUnit = (dischargeSummary.MeanGageHeight != null) ? dischargeSummary.MeanGageHeight.Unit : "";
                            if (!string.IsNullOrEmpty(stage) && (stageUnit != "m"))
                            {
                                stage += " " + stageUnit;
                            }
                            row["Stage"]           = stage;
                            row["ActivityRemarks"] = dischargeSummary.Comments;

                            table1.Rows.Add(row);
                        }
                    }
                    if ((fieldVisit.InspectionActivity != null) && (fieldVisit.InspectionActivity.Readings != null))
                    {
                        foreach (Reading reading in fieldVisit.InspectionActivity.Readings)
                        {
                            if (!reading.Publish || !reading.IsValid)
                            {
                                continue;
                            }
                            if ("Stage" != reading.Parameter)
                            {
                                continue;
                            }

                            DataRow row = table1.NewRow();
                            row["Date"]               = (fieldVisit.StartTime.HasValue) ? fieldVisit.StartTime.Value.ToString("yyyy-MM-dd") : "";
                            row["ControlCondition"]   = (fieldVisit.ControlConditionActivity != null) ? fieldVisit.ControlConditionActivity.ControlCondition.ToString() : "";
                            row["FieldVisitComments"] = fieldVisit.Remarks;
                            row["ActivityType"]       = Resources.Reading;

                            row["Time"]     = (reading.Time.HasValue) ? reading.Time.Value.ToString("HH:mm") : "";
                            row["Timezone"] = (reading.Time.HasValue) ? reading.Time.Value.ToString("zzz") : "";
                            string stage     = reading.Value.Display;
                            string stageUnit = reading.Unit;
                            if (stageUnit != "m")
                            {
                                stage += " " + stageUnit;
                            }
                            row["Stage"]           = stage;
                            row["ActivityRemarks"] = reading.Comments;

                            table1.Rows.Add(row);
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                Log.Error("Error creating report specific data tables ", exp);
                throw exp;
            }
        }