public static InstanceReportColumn LoadFromXml(string xml) { StringReader sr = new StringReader(xml); XmlSerializer xmlReport = new XmlSerializer(typeof(InstanceReportColumn)); InstanceReportColumn ir = (InstanceReportColumn)xmlReport.Deserialize(sr); sr.Close(); return(ir); }
/// <summary> /// Load the calendar columns from the base report. /// </summary> /// <param name="baseReport">The base report to load calendar items /// from.</param> public void LoadCalendarColumns(InstanceReport baseReport) { List <InstanceReportColumn> uniqueCalendars = new List <InstanceReportColumn>(); foreach (InstanceReportColumn baseCol in baseReport.Columns) { if (!ReportUtils.Exists(uniqueCalendars, col => col.ReportingPeriodEquals(baseCol))) { //create a clone so that we can slowly digest this data without affecting other references InstanceReportColumn newCol = (InstanceReportColumn)baseCol.Clone(); uniqueCalendars.Add(newCol); } } uniqueCalendars.Sort(InstanceReport.CompareCalendars); this.DurationCalendars = new List <InstanceReportColumn>(uniqueCalendars); this.InstantCalendars = SplitCalendars(uniqueCalendars); }
private static void VerifyReportColumns(ErrorWriter writer, InstanceReport baseReport, InstanceReport genReport) { if (baseReport.Columns.Count != genReport.Columns.Count) { int differences = Math.Abs(baseReport.Columns.Count - genReport.Columns.Count); List <string> baseColumns = baseReport.Columns.ConvertAll(col => WHITE_SPACE.Replace(col.Label, " ")); List <string> genColumns = genReport.Columns.ConvertAll(col => WHITE_SPACE.Replace(col.Label, " ")); if (baseColumns.Count < genColumns.Count) { writer.StartError("The new rendering generated too MANY columns."); foreach (string commonLabel in baseColumns) { if (genColumns.Contains(commonLabel)) { genColumns.Remove(commonLabel); } } if (genColumns.Count == differences) { foreach (string newLabel in genColumns) { writer.WriteError("\tAdded: " + newLabel); } } else { writer.WriteError("\tSEVERAL LABELS CHANGED"); } writer.EndError(); } else { writer.StartError("The new rendering generated too FEW columns."); foreach (string commonLabel in genColumns) { if (baseColumns.Contains(commonLabel)) { baseColumns.Remove(commonLabel); } } if (baseColumns.Count == differences) { foreach (string newLabel in baseColumns) { writer.WriteError("\tRemoved: " + newLabel); } } else { writer.WriteError("\tSEVERAL LABELS CHANGED"); } writer.EndError(); } } for (int bIdx = 0; bIdx < baseReport.Columns.Count; bIdx++) { InstanceReportColumn baseColumn = baseReport.Columns[bIdx]; string baseLabel = WHITE_SPACE.Replace(baseColumn.Label, " "); InstanceReportColumn genColumn = null; if (genReport.Columns.Count > bIdx) { genColumn = genReport.Columns[bIdx]; } if (genColumn == null) { writer.WriteError("Base column not found in generated report."); continue; } if (WHITE_SPACE.Replace(genColumn.Label, " ") == baseLabel) { continue; } decimal baseSum = 0.0M; Array.ForEach(baseColumn.GetCellArray(baseReport), cell => baseSum += cell.IsNumeric ? cell.NumericAmount : 0.0M); decimal genSum = 0.0M; Array.ForEach(genColumn.GetCellArray(genReport), cell => genSum += cell.IsNumeric ? cell.NumericAmount : 0.0M); if (baseSum == genSum) { writer.WriteError("Label doesn't match base column at index " + bIdx + ":", "\tExpected: " + baseLabel, "\tGenerated: " + WHITE_SPACE.Replace(genColumn.Label, " ")); continue; } genColumn = genReport.Columns.Find(col => WHITE_SPACE.Replace(col.Label, " ") == baseLabel); if (genColumn == null) { writer.WriteError("Base column not found in generated report:", "\t" + baseLabel, "\t***Column Skipped***"); continue; } int gIdx = genReport.Columns.IndexOf(genColumn); if (bIdx != gIdx) { writer.WriteError("Column moved: " + baseLabel, "\tExpected at: " + bIdx.ToString(), "\tGenerated at: " + gIdx.ToString()); } } }
/// <summary> /// Creates and saves a list of unique columns based on their segments and scenarios. /// </summary> /// <param name="baseReport">The base report to load segment scenarios /// from.</param> public void LoadSegmentScenarioColumns(InstanceReport baseReport) { Dictionary <string, Segment> uniqueAdjustments = new Dictionary <string, Segment>(); Dictionary <string, Segment> uniquePrevious = new Dictionary <string, Segment>(); List <InstanceReportColumn> consolidatedColumns = new List <InstanceReportColumn>(); List <InstanceReportColumn> uniqueSegmentColumns = new List <InstanceReportColumn>(); foreach (InstanceReportColumn baseColumn in baseReport.Columns) { //create a clone so that we can digest this data without affecting other references InstanceReportColumn clone = (InstanceReportColumn)baseColumn.Clone(); int index; if (clone.IsAdjusted(this.AdjustedAndPRMemberLookup, out index)) { Segment seg = (Segment)clone.Segments[index]; uniqueAdjustments[seg.DimensionInfo.dimensionId] = seg; clone.RemoveAdjustedPreviouslyReported(this.AdjustedAndPRMemberLookup); clone.RemoveMissingSegmentLabels(); } else if (clone.IsAsPreviouslyReported(this.AdjustedAndPRMemberLookup, out index)) { Segment seg = (Segment)clone.Segments[index]; uniquePrevious[seg.DimensionInfo.dimensionId] = seg; clone.RemoveAdjustedPreviouslyReported(this.AdjustedAndPRMemberLookup); clone.RemoveMissingSegmentLabels(); } bool exists = ReportUtils.Exists(uniqueSegmentColumns, tmp => { if (!tmp.SegmentAndScenarioEquals(clone)) { return(false); } if (!tmp.CurrencyEquals(clone)) { return(false); } return(true); }); if (!exists) { if (clone.Segments == null || clone.Segments.Count == 0) { consolidatedColumns.Add(clone); } uniqueSegmentColumns.Add(clone); } } if (consolidatedColumns != null && consolidatedColumns.Count > 0) { foreach (InstanceReportColumn cCol in consolidatedColumns) { uniqueSegmentColumns.Remove(cCol); uniqueSegmentColumns.Add(cCol); cCol.Labels[0].Label = InstanceReport.EQUITY_TOTAL_HEADER; } } this.EquityCandidate.Columns.AddRange(uniqueSegmentColumns); //now clean off the calendars this.SegmentColumns.ForEach(col => col.ClearReportingPeriod()); //and sort according to presentation this.SegmentColumns.Sort(baseReport.CompareSegments); this.AdjustmentMembers = new List <Segment>(uniqueAdjustments.Values); this.PreviousMembers = new List <Segment>(uniquePrevious.Values); }