public DataTable RatingModelTable(string tableName, string inputOutputParameters, string ratingModelLabel, string locationIdentifier)
        {
            DataTable ratingModelTable = new DataTable(tableName);

            ratingModelTable.Columns.Add("Identifier", typeof(string));
            ratingModelTable.Columns.Add("InputParameter", typeof(string));
            ratingModelTable.Columns.Add("InputUnitId", typeof(string));
            ratingModelTable.Columns.Add("InputUnitSymbol", typeof(string));
            ratingModelTable.Columns.Add("InputParameterRoundingSpec", typeof(string));
            ratingModelTable.Columns.Add("OutputParameter", typeof(string));
            ratingModelTable.Columns.Add("OutputUnitId", typeof(string));
            ratingModelTable.Columns.Add("OutputUnitSymbol", typeof(string));
            ratingModelTable.Columns.Add("OutputParameterRoundingSpec", typeof(string));
            ratingModelTable.Columns.Add("Description", typeof(string));
            ratingModelTable.Columns.Add("Comment", typeof(string));
            ratingModelTable.Columns.Add("TimeRange", typeof(string));
            ratingModelTable.Columns.Add("RatingModelInfo", typeof(string));

            ratingModelTable.Columns.Add("RatingModelDescriptionObject", typeof(object));

            string ratingModelIdentifier = string.Format("{0}.{1}@{2}", inputOutputParameters, ratingModelLabel, locationIdentifier);

            DataRow ratingModelRow = ratingModelTable.NewRow();

            ratingModelRow["Identifier"] = ratingModelIdentifier;
            ratingModelTable.Rows.Add(ratingModelRow);

            RatingModelDescription ratingModelDescription = _Common.GetRatingModelDescription(ratingModelIdentifier, locationIdentifier);

            ratingModelRow["RatingModelDescriptionObject"] = ratingModelDescription;

            string locationName = _Common.GetLocationDescriptionByIdentifier(locationIdentifier).Name;

            if (ratingModelDescription == null)
            {
                if (string.IsNullOrEmpty(ratingModelLabel) && string.IsNullOrEmpty(inputOutputParameters))
                {
                    ratingModelRow["RatingModelInfo"] = Resources.RatingModelUnspecified;
                }
                else
                {
                    ratingModelRow["RatingModelInfo"] = string.Format(Resources.NoRatingModelFoundWithXYZZ,
                                                                      inputOutputParameters, ratingModelLabel, locationIdentifier, locationName);
                }
            }
            else
            {
                string inputParameterDisplayId  = ratingModelDescription.InputParameter;
                string inputUnitId              = ratingModelDescription.InputUnit;
                string outputParameterDisplayId = ratingModelDescription.OutputParameter;
                string outputUnitId             = ratingModelDescription.OutputUnit;
                string rmDescription            = ratingModelDescription.Description;

                ratingModelRow["InputParameter"]             = inputParameterDisplayId;
                ratingModelRow["InputUnitId"]                = inputUnitId;
                ratingModelRow["InputUnitSymbol"]            = _Common.GetUnitSymbol(inputUnitId);
                ratingModelRow["InputParameterRoundingSpec"] = _Common.GetParameterRoundingSpec(inputParameterDisplayId);

                ratingModelRow["OutputParameter"]             = outputParameterDisplayId;
                ratingModelRow["OutputUnitId"]                = outputUnitId;
                ratingModelRow["OutputUnitSymbol"]            = _Common.GetUnitSymbol(outputUnitId);
                ratingModelRow["OutputParameterRoundingSpec"] = _Common.GetParameterRoundingSpec(outputParameterDisplayId);

                ratingModelRow["Description"] = rmDescription;
                ratingModelRow["Comment"]     = ratingModelDescription.Comment;

                ratingModelRow["RatingModelInfo"] = string.Format(Resources.NoRatingCurvesFoundWithXY,
                                                                  ratingModelIdentifier, locationName);

                RatingCurveListServiceResponse ratingCurveListResponse = _Common.GetRatingCurveList(ratingModelIdentifier);

                if (ratingCurveListResponse != null)
                {
                    ratingModelRow["RatingModelInfo"] = string.Format(Resources.RatingModelInformation,
                                                                      ratingModelIdentifier, locationName,
                                                                      inputParameterDisplayId, _Common.GetUnitSymbol(inputUnitId),
                                                                      outputParameterDisplayId, _Common.GetUnitSymbol(outputUnitId),
                                                                      ratingCurveListResponse.RatingCurves.Count);
                }
            }

            return(ratingModelTable);
        }
        public AllTablesResult LoadAllTables(RatingModelDescription ratingModelDescription, RatingCurveListServiceResponse ratingCurves, double stepSize)
        {
            var result = new AllTablesResult();

            var validTableNumbers = new HashSet <double>(
                ratingCurves
                .RatingCurves
                .Select(c => double.TryParse(c.Id, out var number) ? (double?)number : null)
                .Where(d => d.HasValue)
                .Select(d => d.Value));

            for (var i = 0; i < ratingCurves.RatingCurves.Count; ++i)
            {
                var ratingCurve = ratingCurves.RatingCurves[i];

                if (!double.TryParse(ratingCurve.Id, out var tableNumber))
                {
                    tableNumber = 1.0 + i;

                    while (validTableNumbers.Contains(tableNumber))
                    {
                        tableNumber += ratingCurves.RatingCurves.Count;
                    }
                }

                result.Tables.Add(new Table
                {
                    TableNumber = tableNumber,
                    TableName   = ratingCurve.Id,
                    NumPeriods  = ratingCurve.PeriodsOfApplicability.Count,
                    NumPoints   = ratingCurve.BaseRatingTable.Count
                });

                result.TableDates.AddRange(ratingCurve.PeriodsOfApplicability.Select(p => new TableDate
                {
                    TableNumber = tableNumber,
                    StartDate   = p.StartTime,
                    EndDate     = p.EndTime
                }));

                result.TableValues.AddRange(ratingCurve.BaseRatingTable.Select(p => new TableValue
                {
                    TableNumber = tableNumber,
                    Input       = p.InputValue ?? double.NaN,
                    Output      = p.OutputValue ?? double.NaN
                }));
            }

            return(result);
        }