using System; using System.Collections.Generic; using System.Text; using VEPROMS.CSLA.Library; using iTextSharp.text.pdf; using iTextSharp.text; using System.IO; using System.Text.RegularExpressions; namespace Volian.Print.Library { public class PDFChronologyReport { private static Dictionary _AnnotationLookup; public static Dictionary AnnotationLookup { get { if (_AnnotationLookup == null) { _AnnotationLookup = new Dictionary(); AnnotationTypeInfoList atil = AnnotationTypeInfoList.Get(); foreach (AnnotationTypeInfo ati in atil) _AnnotationLookup.Add(ati.TypeID, ati.Name); } return _AnnotationLookup; } } private string _FileName; public string FileName { get { return _FileName; } set { _FileName = value; } } private ProcedureInfo _MyProc; public ProcedureInfo MyProc { get { return _MyProc; } set { _MyProc = value; } } private ContentAuditInfoList _AuditList; public ContentAuditInfoList AuditList { get { return _AuditList; } set { _AuditList = value; } } private AnnotationAuditInfoList _AnnotationList; public AnnotationAuditInfoList AnnotationList { get { return _AnnotationList; } set { _AnnotationList = value; } } public PDFChronologyReport(string fileName, ProcedureInfo myProc, ContentAuditInfoList auditList, AnnotationAuditInfoList annotationList) { _FileName = fileName; _MyProc = myProc; _AuditList = auditList; _AnnotationList = annotationList; } public void BuildChronology() { Rectangle paperSize = PDFPageSize.UsePaperSize(MyProc.ActiveFormat.PlantFormat.FormatData.PDFPageSize.PaperSize);// C2020-002 paper size is now set in the format files iTextSharp.text.Document document = new iTextSharp.text.Document(paperSize, 36, 36, 36, 36); if (!CreateResultsPDF(document)) return; try { BuildChronologyReport(document); } catch (Exception ex) { StringBuilder msg = new StringBuilder(); document.Add(new Paragraph("Error:")); while (ex != null) { document.Add(new Paragraph(ex.GetType().Name)); document.Add(new Paragraph(ex.Message)); ex = ex.InnerException; } } finally { if (document.IsOpen()) { document.Close(); System.Diagnostics.Process.Start(_FileName); } } } public void BuildSummary() { BuildSummary(true); } public void BuildSummary(bool openReport) { bool hasData = false; Rectangle paperSize = PDFPageSize.UsePaperSize(MyProc.ActiveFormat.PlantFormat.FormatData.PDFPageSize.PaperSize); // C2020-002 paper size is now set in the format files iTextSharp.text.Document document = new iTextSharp.text.Document(paperSize, 36, 36, 36, 36); if (!CreateResultsPDF(document)) return; try { BuildSummaryReport(document); //BuildSummaryReport2(document); } catch (Exception ex) { StringBuilder msg = new StringBuilder(); document.Add(new Paragraph("Error:")); while (ex != null) { document.Add(new Paragraph(ex.GetType().Name)); document.Add(new Paragraph(ex.Message)); ex = ex.InnerException; } } finally { if (document.IsOpen()) { document.Close(); if(openReport) System.Diagnostics.Process.Start(_FileName); } } } private bool CreateResultsPDF(iTextSharp.text.Document document) { bool result = false; string suffix = ""; int i = 0; // just for safety, the while loop expects to find a file extension // so make sure it has one before going into the loop if (!_FileName.ToUpper().EndsWith(".PDF")) _FileName += ".pdf"; // Try to open a file for creating the PDF. while (result == false) { string fileName = _FileName; // Bug fix: B2013-086 // the folder path part of _FileName contained a folder name with a period // resulting is an invalid file location/file name. // Changed the IndexOf call to the LastIndexOf //int loc = fileName.IndexOf("."); int loc = fileName.LastIndexOf("."); if (loc > -1) { string fname = fileName.Substring(0, loc); fileName = fname + suffix + ".pdf"; } else fileName = fileName + suffix + ".pdf"; // string fileName = _FileName.ToLower().Replace(".pdf", suffix + ".pdf"); try { PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create)); //C2017-017 add a footer consisting of the page number and date printed to summary/chronology of changes report // This is the same Page Event used for Search reports (search results print) and is defined in PDFReport.cs writer.PageEvent = new MyPageHelper("Procedure Changes"); document.SetMargins(36, 36, 36, 36); document.Open(); _FileName = fileName; result = true; } catch (System.IO.IOException exIO) { if (exIO.Message.Contains("because it is being used by another process")) suffix = string.Format("_{0}", ++i);// If this file is in use, increment the suffix and try again else // If some other error, display a message and don't print the results { ShowException(exIO); return false; } } catch (Exception ex) { ShowException(ex); return false; // Could not open the output file } } return true; } private static void ShowException(Exception ex) { Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message); StringBuilder msg = new StringBuilder(); string sep = ""; string indent = ""; while (ex != null) { msg.Append(string.Format("{0}{1}{2}:\r\n{1}{3}", sep, indent, ex.GetType().Name, ex.Message)); ex = ex.InnerException; sep = "\r\n"; indent += " "; } System.Windows.Forms.MessageBox.Show(msg.ToString(), "Error during PDF creation for search:", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); } private PdfPCell BlankCell(int colSpan) { PdfPCell c = new PdfPCell(); c.Colspan = colSpan; c.Border = 0; return c; } private void BuildChronologyReport(iTextSharp.text.Document doc) { int lastAnnotationID = 0; int cols = 5; int borders = 0; int paddingBottom = 6; PdfPTable t = new PdfPTable(cols); t.HeaderRows = 4; t.DefaultCell.Padding = 4; t.WidthPercentage = 100; float[] widths = new float[] { 1f, 1f, 1f, 1f, 4f }; t.SetWidths(widths); //t.HorizontalAlignment = 0; // C2017-036 get best available proportional font for symbols that looks close to Arial // Note that Microsoft no longer supplies Arial Unicode MS as of Word16 iTextSharp.text.Font f1 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 14, 1, Color.BLACK); iTextSharp.text.Font f2 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 10, 0, Color.BLACK); iTextSharp.text.Font f3 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 9, 0, Color.BLACK); iTextSharp.text.Font f4 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 9, 1, Color.BLACK); //report title Phrase h = new Phrase(); h.Font = f1; h.Add("Chronology of Changes Report"); PdfPCell c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); //procedure title h = new Phrase(); h.Font = f2; h.Add(string.Format("{0} - {1}", MyProc.DisplayNumber, MyProc.DisplayText)); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); string section = string.Empty; string stepnum = string.Empty; DateTime maxDTS = DateTime.MinValue; int lastID = 0; ContentAuditInfo oldCAI = null; string oldText = string.Empty; string oldTypeName = string.Empty; // Dictionary processedAAI = new Dictionary(); Dictionary processedAAI = new Dictionary(); foreach (ContentAuditInfo cai in AuditList) { //raw path string[] NewPath = SplitPath(cai.Path); if (NewPath[0] != section) { AddStepAnnotation(ref lastAnnotationID, cols, paddingBottom, t, f3, f4, ref h, ref c, oldCAI, processedAAI); section = NewPath[0]; h = new Phrase(); h.Font = f4; h.Add(section); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); } //step if (NewPath[1] != stepnum) { AddStepAnnotation(ref lastAnnotationID, cols, paddingBottom, t, f3, f4, ref h, ref c, oldCAI, processedAAI); oldCAI = cai; oldText = cai.Text; oldTypeName = cai.TypeName; stepnum = NewPath[1]; string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); stepnum2 = stepnum2.Replace("RNO.", "RNO"); // check to see if we have step number to output // if not just put in a blank cell. // this cleans up the report so that we don't have "Step" without anything after it. // This was happening when we were reporting change information of a section number/title if (stepnum2 != "") { h = new Phrase(); h.Font = f3; h.Add(string.Format("Step {0}", stepnum2)); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_RIGHT; c.PaddingBottom = paddingBottom; c.PaddingRight = 10; //c.Border = borders; t.AddCell(c); } else t.AddCell(BlankCell(1)); } else t.AddCell(BlankCell(1)); //what if (cai.ContentID != lastID) maxDTS = DateTime.MinValue; h = new Phrase(); h.Font = f3; string actionWhat = (cai.ActionWhat == "Added" && cai.DTS <= MyProc.ChangeBarDate) ? "Original" : cai.ActionWhat != "Changed" ? cai.ActionWhat : cai.DTS <= maxDTS ? "Restored" : cai.DTS > MyProc.ChangeBarDate ? cai.ActionWhat : "Original"; if (actionWhat == "Deleted" || actionWhat == "Restored") h.Add(actionWhat + "\r\n" + (cai.ActionWhen < cai.DTS ? cai.DTS.ToString("M/dd/yyyy") : cai.ActionWhen.ToString())); else h.Add(actionWhat); if (cai.DTS > maxDTS) maxDTS = cai.DTS; lastID = cai.ContentID; c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(cai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(cai.DTS.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text //h.Add(cai.Text); if (cai.Type == 20008) { GridAuditInfoList gail = GridAuditInfoList.Get(cai.ContentID); bool addedInfo = false; if (gail.Count > 0) { GridAuditInfo gai = gail[0]; System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); xd.LoadXml(gai.Data); //int grows = int.Parse(xd.SelectSingleNode("C1FlexGrid/RowInfo/Count").InnerText); int gcols = int.Parse(xd.SelectSingleNode("C1FlexGrid/ColumnInfo/Count").InnerText); string data = ItemInfo.ConvertToDisplayText(cai.Text); PdfPTable gtbl = new PdfPTable(gcols); while (data.Length > 0) { int indx = data.IndexOf(";"); // B2022-079: error on chronology report (data missing ';' so couldn't parse out report info) if (indx > 0) { addedInfo = true; string val = data.Substring(0, data.IndexOf(";")); data = data.Substring(data.IndexOf(";") + 1); Phrase hh = new Phrase(); hh.Font = f4; hh.Add(val); PdfPCell cc = new PdfPCell(hh); gtbl.AddCell(cc); } else data = ""; // couldn't find separator ';', don't continue to loop } // If added info above, i.e. no error, put out the cell if (addedInfo) { c = new PdfPCell(gtbl); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; t.AddCell(c); } } if (!addedInfo) // Didn't add info, report that data not available { h = new Phrase(); h.Font = f4; c = new PdfPCell(h); h.Add("No Audit Details Available"); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; t.AddCell(c); } } else { h = new Phrase(); h.Font = f4; if (cai.Text != oldText && cai.TypeName != oldTypeName) h.Add(string.Format("[Type Change {0} to {1}] - {2}", oldTypeName, cai.TypeName, ItemInfo.ConvertToDisplayText(cai.Text)));// + " to " + cai.TypeName); else if (cai.Text == oldText && cai.TypeName != oldTypeName) h.Add(oldTypeName + " to " + cai.TypeName); else { string txt = null; if ((cai.Text==null || cai.Text=="") && (cai.Type == 20036 || cai.Type == 20037 || cai.Type == 20038 || cai.Type == 20039)) txt = "Embedded Image"; else if (cai.Type > 20099) // B2020-054: Always put out 'Equation' (removed checking for null text) txt = "Equation"; else txt = ItemInfo.ConvertToDisplayText(cai.Text).Replace("Go to \u25cf", "Go to ?"); if (MyProc.MyDocVersion.MultiUnitCount > 1) { System.Xml.XmlNode nd; if (cai.Config == string.Empty) nd = null; else { System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); xd.LoadXml(cai.Config); nd = xd.SelectSingleNode("//MasterSlave"); } if (nd == null) txt += "\r\n\r\nApplicable to all units"; else { nd = nd.Attributes.GetNamedItem("Applicability"); if (nd.InnerText == "0") txt += "\r\n\r\nApplicable to no units"; else { int k = MyProc.MyDocVersion.DocVersionConfig.SelectedSlave; string[] myss = nd.InnerText.Split(",".ToCharArray()); string un = "\r\n\r\nApplicable to "; string sep = string.Empty; foreach (string ss in myss) { MyProc.MyDocVersion.DocVersionConfig.SelectedSlave = int.Parse(ss); un += sep + MyProc.MyDocVersion.DocVersionConfig.Unit_Name; sep = ","; } txt += un; MyProc.MyDocVersion.DocVersionConfig.SelectedSlave = k; } } } h.Add(txt); } oldCAI = cai; oldText = cai.Text; oldTypeName = cai.TypeName; c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } ////old text //t.AddCell(BlankCell(3)); //h = new Phrase(); //h.Font = f4; //h.Add("Old text: " + cai.OldText); //c = new PdfPCell(h); //c.Colspan = 7; //c.Border = 0; //t.AddCell(c); } //see if any annotations for old stepnum here and add them foreach (AnnotationAuditInfo aai in AnnotationList) { if (oldCAI != null && aai.IContentID == oldCAI.ContentID) { //add annotation to minilist // processedAAI.Add(aai.AnnotationID, aai); if (!processedAAI.ContainsKey(aai)) // bug fix, only add to the processed list if it is not already in the list processedAAI.Add(aai, aai); //write row to table t.AddCell(BlankCell(1)); h = new Phrase(); h.Font = f3; if (aai.AnnotationID != lastAnnotationID) { lastAnnotationID = aai.AnnotationID; h.Add(AnnotationLookup[aai.TypeID] + " " + aai.ActionWhat); } else h.Add(aai.ActionWhat); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(aai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(aai.ActionWhen.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } } bool annotationHeader = false; section = string.Empty; stepnum = string.Empty; foreach (AnnotationAuditInfo aai in AnnotationList) { // if (!processedAAI.ContainsKey(aai.AnnotationID)) if (!processedAAI.ContainsKey(aai)) { if (!annotationHeader) { t.AddCell(BlankCell(cols)); h = new Phrase(); h.Font = f4; h.Add("ANNOTATIONS"); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); annotationHeader = true; } string[] NewPath = GetNewPath(AuditList, aai.IContentID); if (NewPath[0] != section) { section = NewPath[0]; stepnum = string.Empty; h = new Phrase(); h.Font = f4; h.Add(section); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } if (NewPath[1] != stepnum) { stepnum = NewPath[1]; string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); stepnum2 = stepnum2.Replace("RNO.", "RNO"); h = new Phrase(); h.Font = f3; h.Add(string.Format("Step {0}", stepnum2)); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_RIGHT; c.PaddingBottom = paddingBottom; c.PaddingRight = 10; //c.Border = borders; t.AddCell(c); } else { t.AddCell(BlankCell(1)); } //what h = new Phrase(); h.Font = f3; if (aai.AnnotationID != lastAnnotationID) { lastAnnotationID = aai.AnnotationID; h.Add(AnnotationLookup[aai.TypeID] + " " + aai.ActionWhat); } else h.Add(aai.ActionWhat); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(aai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(aai.ActionWhen.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } } if (t.Rows.Count == t.HeaderRows) { c = new PdfPCell(new Phrase("No changes to report")); c.Colspan = cols; t.AddCell(c); } doc.Add(t); } private void AddStepAnnotation(ref int lastAnnotationID, int cols, int paddingBottom, PdfPTable t, iTextSharp.text.Font f3, iTextSharp.text.Font f4, ref Phrase h, ref PdfPCell c, ContentAuditInfo oldCAI, Dictionary processedAAI) { //see if any annotations for old stepnum here and add them foreach (AnnotationAuditInfo aai in AnnotationList) { if (oldCAI != null && aai.IContentID == oldCAI.ContentID) { //add annotation to minilist // processedAAI.Add(aai.AnnotationID, aai); if(processedAAI.ContainsKey(aai)) return; processedAAI.Add(aai, aai); //write row to table t.AddCell(BlankCell(1)); h = new Phrase(); h.Font = f3; if (aai.AnnotationID != lastAnnotationID) { lastAnnotationID = aai.AnnotationID; h.Add(AnnotationLookup[aai.TypeID] + " " + aai.ActionWhat); } else h.Add(aai.ActionWhat); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(aai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(aai.ActionWhen.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } } } private static string[] SplitPath(string path) { // Remove Procedure Number and Title string sectionAndStep = Regex.Replace(path + "\x7\x7\x7", "^.+?\\u0007", ""); //sectionAndStep = sectionAndStep.Replace("\x11", sectionAndStep[0] == '\x11' ? "" : " - "); sectionAndStep = sectionAndStep.Replace("\x11", sectionAndStep[0] == '\x11' ? "" : " "); sectionAndStep = sectionAndStep.Replace("\\u160?", " "); // replace a hardspace with a space // Split Section frrom Steps return sectionAndStep.Split("\x7".ToCharArray()); } private string[] GetNewPath(ContentAuditInfoList AuditList, int contentID) { foreach (ContentAuditInfo cai in AuditList) { if(cai.ContentID == contentID) return SplitPath(cai.Path); } ItemInfoList iil = ItemInfoList.GetByContentID(contentID); if (iil.Count > 0) { return SplitPath(iil[0].SearchPath); } return "Section\x7Step".Split("\x7".ToCharArray()); } private void BuildSummaryReport2(iTextSharp.text.Document doc) { string section = string.Empty; string stepnum = string.Empty; ContentAuditInfo firstCAI = null; ContentAuditInfo nextCAI = null; ContentAuditInfo lastCAI = null; List auditList = new List(); foreach (ContentAuditInfo cai in AuditList) { string[] NewPath = SplitPath(cai.Path); if (NewPath[1] != stepnum) { stepnum = NewPath[1]; if (firstCAI != null) { if (lastCAI == null) { auditList.Add(firstCAI); } else if (lastCAI.ActionWhat == "Deleted" && firstCAI.DTS < MyProc.ChangeBarDate) { auditList.Add(lastCAI); } else if (lastCAI.ActionWhat == "Changed" && lastCAI.Text != firstCAI.Text) { auditList.Add(firstCAI); auditList.Add(lastCAI); } else if (lastCAI.ActionWhat == "Changed" && firstCAI.ActionWhat == "Added" && lastCAI.Text == firstCAI.Text) { auditList.Add(firstCAI); } else if (lastCAI == null && firstCAI.ActionWhat == "Added") { auditList.Add(firstCAI); } lastCAI = null; } firstCAI = cai; } else { lastCAI = cai; } } if (firstCAI != null) auditList.Add(firstCAI); if (lastCAI != null) auditList.Add(lastCAI); #region annotations AnnotationAuditInfo firstAAI = null; AnnotationAuditInfo nextAAI = null; AnnotationAuditInfo lastAAI = null; int icontentID = 0; List annotationList = new List(); foreach (AnnotationAuditInfo aai in AnnotationList) { if (aai.IContentID != icontentID) { icontentID = aai.IContentID; if (firstAAI != null) { if (lastAAI == null) { annotationList.Add(firstAAI); } else if (lastAAI.ActionWhat == "Deleted" && firstAAI.DTS < MyProc.ChangeBarDate) { annotationList.Add(lastAAI); } else if (lastAAI.ActionWhat == "Changed" && lastAAI.SearchText != firstAAI.SearchText) { annotationList.Add(firstAAI); annotationList.Add(lastAAI); } else if (lastAAI.ActionWhat == "Changed" && firstAAI.ActionWhat == "Added" && lastAAI.SearchText == firstAAI.SearchText) { annotationList.Add(firstAAI); } else if (lastAAI == null && firstAAI.ActionWhat == "Added") { annotationList.Add(firstAAI); } lastAAI = null; } firstAAI = aai; } else lastAAI = aai; } if (firstAAI != null) annotationList.Add(firstAAI); if (lastAAI != null) annotationList.Add(lastAAI); #endregion int cols = 5; int borders = 0; int paddingBottom = 6; PdfPTable t = new PdfPTable(cols); t.HeaderRows = 4; t.DefaultCell.Padding = 4; t.WidthPercentage = 100; float[] widths = new float[] { 1f, 1f, 1f, 1f, 4f }; t.SetWidths(widths); //t.HorizontalAlignment = 0; // C2017-036 get best available proportional font for symbols that looks close to Arial. // Note that Microsoft no longer supplies Arial Unicode MS as of Word16 iTextSharp.text.Font f1 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 14, 1, Color.BLACK); iTextSharp.text.Font f2 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 10, 0, Color.BLACK); iTextSharp.text.Font f3 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 9, 0, Color.BLACK); iTextSharp.text.Font f4 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 9, 1, Color.BLACK); //report title Phrase h = new Phrase(); h.Font = f1; h.Add("Summary of Changes Report"); PdfPCell c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); //procedure title h = new Phrase(); h.Font = f2; h.Add(string.Format("{0} - {1}", MyProc.DisplayNumber, MyProc.DisplayText)); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); foreach (ContentAuditInfo cai in auditList) { //raw path string[] NewPath = SplitPath(cai.Path); if (NewPath[0] != section) { section = NewPath[0]; h = new Phrase(); h.Font = f4; h.Add(section); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); } //step if (NewPath[1] != stepnum) { firstCAI = cai; stepnum = NewPath[1]; string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); stepnum2 = stepnum2.Replace("RNO.", "RNO"); h = new Phrase(); h.Font = f3; h.Add(string.Format("Step {0}", stepnum2)); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_RIGHT; c.PaddingBottom = paddingBottom; c.PaddingRight = 10; //c.Border = borders; t.AddCell(c); } else { t.AddCell(BlankCell(1)); nextCAI = cai; } //what h = new Phrase(); h.Font = f3; h.Add(cai.ActionWhen > MyProc.ChangeBarDate ? cai.ActionWhat : "Original"); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(cai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(cai.ActionWhen.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); h.Add(ItemInfo.ConvertToDisplayText(cai.Text)); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); ////old text //t.AddCell(BlankCell(3)); //h = new Phrase(); //h.Font = f4; //h.Add("Old text: " + cai.OldText); //c = new PdfPCell(h); //c.Colspan = 7; //c.Border = 0; //t.AddCell(c); } t.AddCell(BlankCell(cols)); h = new Phrase(); h.Font = f4; h.Add("ANNOTATIONS"); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); stepnum = string.Empty; foreach (AnnotationAuditInfo aai in annotationList) { foreach (ContentAuditInfo cai in auditList) { if (cai.ContentID == aai.IContentID) { string[] NewPath = SplitPath(cai.Path); if (NewPath[1] != stepnum) { stepnum = NewPath[1]; string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); stepnum2 = stepnum2.Replace("RNO.", "RNO"); h = new Phrase(); h.Font = f3; h.Add(string.Format("Step {0}", stepnum2)); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_RIGHT; c.PaddingBottom = paddingBottom; c.PaddingRight = 10; //c.Border = borders; t.AddCell(c); break; } else { t.AddCell(BlankCell(1)); break; } } } //what h = new Phrase(); h.Font = f3; h.Add(aai.ActionWhat); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(aai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(aai.ActionWhen.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } doc.Add(t); } private void BuildSummaryReport(iTextSharp.text.Document doc) { int lastAnnotationID = 0; string section = string.Empty; string stepnum = string.Empty; int contentID = 0; ContentAuditInfo firstCAI = null; ContentAuditInfo nextCAI = null; ContentAuditInfo lastCAI = null; List auditList1 = new List(); foreach (ContentAuditInfo cai in AuditList) { if (MyProc.MyLookup == null || (cai.ActionWhat == "Deleted" && !MyProc.MyLookup.ContainsKey(cai.ItemID))// B2021-019, if step was deleted, it won't be in the MyLookup || MyProc.MyLookup.ContainsKey(cai.ItemID)) { if (cai.ContentID != contentID) //new content { if (firstCAI != null) //not first row { if (lastCAI == null) { auditList1.Add(firstCAI); firstCAI = null; } else { if (lastCAI.DTS > firstCAI.DTS) { if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat != "Deleted") { if (firstCAI.DTS > MyProc.ChangeBarDate) lastCAI.ActionWhat = firstCAI.ActionWhat; //this step was originally commented out, then jcb un commented it, but we saw a summary report that had 2 added rows //for the same step which is highly undesirable, so we commented it out again 1/17/2012 //for example we added 2 steps, then make a change to 1st step added\ // // RHM 12/4/2015 It appears that the following line is toggling between being commented-out // and included. // 12/4/2015 - D.C. Cook, If a new procedure is added, every new section and step was appearing in the list twice. // First when added, then with the final text. It should only appear once with the action "Added" and with the latest // Date Time and User as well as the latest text. // B2019-051: Missing information in Change Summary report: if (!(firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat == "Added")) auditList1.Add(firstCAI); auditList1.Add(lastCAI); firstCAI = null; lastCAI = null; } else if (firstCAI.ActionWhat == lastCAI.ActionWhat) { auditList1.Add(firstCAI); auditList1.Add(lastCAI); firstCAI = null; lastCAI = null; } else { firstCAI = null; lastCAI = null; } } else if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat == "Deleted" && firstCAI.DTS == lastCAI.DTS) { //auditList.Add(lastCAI); firstCAI = null; lastCAI = null; } else if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat == "Changed" && firstCAI.DTS > MyProc.ChangeBarDate) { lastCAI.ActionWhat = firstCAI.ActionWhat; auditList1.Add(lastCAI); firstCAI = null; lastCAI = null; } //added by jcb //else if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat == "Changed" && firstCAI.DTS == lastCAI.DTS) //{ // auditList.Add(firstCAI); // auditList.Add(lastCAI); // firstCAI = null; // lastCAI = null; //} } } firstCAI = cai; lastCAI = null; contentID = cai.ContentID; } else lastCAI = cai; } } if (lastCAI == null) { if (firstCAI != null) auditList1.Add(firstCAI); firstCAI = null; } else { if (lastCAI.DTS > firstCAI.DTS) { if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat != "Deleted") { if (firstCAI.DTS > MyProc.ChangeBarDate) lastCAI.ActionWhat = firstCAI.ActionWhat; auditList1.Add(firstCAI); auditList1.Add(lastCAI); firstCAI = null; lastCAI = null; } else if (firstCAI.ActionWhat == lastCAI.ActionWhat) { auditList1.Add(firstCAI); auditList1.Add(lastCAI); firstCAI = null; lastCAI = null; } else { firstCAI = null; lastCAI = null; } } else if (firstCAI.ActionWhat == "Added") { if (lastCAI.ActionWhat == "Deleted" && firstCAI.DTS == lastCAI.DTS) { //auditList.Add(lastCAI); firstCAI = null; lastCAI = null; } else if (lastCAI.ActionWhat != "Deleted") { lastCAI.ActionWhat = firstCAI.ActionWhat; auditList1.Add(lastCAI); lastCAI = null; } } } #region annotations commented out AnnotationAuditInfo firstAAI = null; AnnotationAuditInfo nextAAI = null; AnnotationAuditInfo lastAAI = null; int annotationID = 0; List annotationList = new List(); foreach (AnnotationAuditInfo aai in AnnotationList) { if (MyProc.MyLookup == null || MyProc.MyLookup.ContainsKey(aai.ItemID)) { if (aai.AnnotationID != annotationID) { annotationID = aai.AnnotationID; if (firstAAI != null) { if (lastAAI == null) { annotationList.Add(firstAAI); } else if (lastAAI.ActionWhat == "Deleted" && firstAAI.DTS < MyProc.ChangeBarDate) { annotationList.Add(lastAAI); } else if (lastAAI.ActionWhat == "Changed" && firstAAI.ActionWhat != "Added") // && lastAAI.SearchText != firstAAI.SearchText) { annotationList.Add(firstAAI); annotationList.Add(lastAAI); } else if (lastAAI.ActionWhat == "Changed" && firstAAI.ActionWhat == "Added") // && lastAAI.SearchText != firstAAI.SearchText) { lastAAI.ActionWhat = firstAAI.ActionWhat; annotationList.Add(lastAAI); firstAAI = null; lastAAI = null; } else if (lastAAI.ActionWhat == "Restored" && firstAAI.ActionWhat == "Added") // && lastAAI.SearchText != firstAAI.SearchText) { lastAAI.ActionWhat = firstAAI.ActionWhat; annotationList.Add(lastAAI); firstAAI = null; lastAAI = null; } else if (lastAAI == null && firstAAI.ActionWhat == "Added") { annotationList.Add(firstAAI); } lastAAI = null; } firstAAI = aai; } else lastAAI = aai; } } if (firstAAI != null) { if (lastAAI == null) { annotationList.Add(firstAAI); } else if (lastAAI.ActionWhat == "Deleted" && firstAAI.DTS < MyProc.ChangeBarDate) { annotationList.Add(lastAAI); } else if (lastAAI.ActionWhat == "Changed" && firstAAI.ActionWhat != "Added") // && lastAAI.SearchText != firstAAI.SearchText) { annotationList.Add(firstAAI); annotationList.Add(lastAAI); } else if (lastAAI.ActionWhat == "Changed" && firstAAI.ActionWhat == "Added") // && lastAAI.SearchText != firstAAI.SearchText) { lastAAI.ActionWhat = firstAAI.ActionWhat; annotationList.Add(lastAAI); firstAAI = null; lastAAI = null; } else if (lastAAI.ActionWhat == "Restored" && firstAAI.ActionWhat == "Added") // && lastAAI.SearchText != firstAAI.SearchText) { lastAAI.ActionWhat = firstAAI.ActionWhat; annotationList.Add(lastAAI); firstAAI = null; lastAAI = null; } else if (lastAAI == null && firstAAI.ActionWhat == "Added") { annotationList.Add(firstAAI); } } //if (firstAAI != null) // annotationList.Add(firstAAI); //if (lastAAI != null) // annotationList.Add(lastAAI); #endregion //new final cleanup List auditList2 = new List(); ContentAuditInfo caiFirst = null; foreach (ContentAuditInfo cai in auditList1) { if (caiFirst == null) caiFirst = cai; else { if (cai.ContentID == caiFirst.ContentID && cai.Text != caiFirst.Text) { if (caiFirst.ActionWhat == "Added" && (cai.ActionWhat == "Added" || cai.ActionWhat == "Restored")) { auditList2.Add(cai); caiFirst = null; } else { auditList2.Add(caiFirst); auditList2.Add(cai); caiFirst = null; } } else { if(caiFirst.Text != string.Empty && !(caiFirst.UserID.Contains("Renumber") || cai.UserID.Contains("Renumber"))) auditList2.Add(caiFirst); caiFirst = cai; } } } if (caiFirst != null) //ciaFirst could end up being null at the end of the above foreach loop auditList2.Add(caiFirst); int cols = 5; int borders = 0; int paddingBottom = 6; PdfPTable t = new PdfPTable(cols); t.HeaderRows = 4; t.DefaultCell.Padding = 4; t.WidthPercentage = 100; float[] widths = new float[] { 1f, 1f, 1f, 1f, 4f }; t.SetWidths(widths); //t.HorizontalAlignment = 0; // C2017-036 get best available proportional font for symbols that looks close to Arial // Note that Microsoft no longer supplies Arial Unicode MS as of Word16 iTextSharp.text.Font f1 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 14, 1, Color.BLACK); iTextSharp.text.Font f2 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 10, 0, Color.BLACK); iTextSharp.text.Font f3 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 9, 0, Color.BLACK); iTextSharp.text.Font f4 = pdf.GetFont(Volian.Base.Library.vlnFont.ReportsFont, 9, 1, Color.BLACK); //report title Phrase h = new Phrase(); h.Font = f1; h.Add("Summary of Changes Report"); PdfPCell c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); //procedure title h = new Phrase(); h.Font = f2; h.Add(string.Format("{0} - {1}", MyProc.DisplayNumber, MyProc.DisplayText)); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); ContentAuditInfo oldCAI = null; string oldText = string.Empty; string oldTypeName = string.Empty; // Dictionary processedAAI = new Dictionary(); Dictionary processedAAI = new Dictionary(); foreach (ContentAuditInfo cai in auditList2) { //raw path string[] NewPath = SplitPath(cai.Path); if (NewPath[0] != section) { AddStepAnnotation(ref lastAnnotationID, cols, paddingBottom, t, f3, f4, ref h, ref c, oldCAI, processedAAI); section = NewPath[0]; h = new Phrase(); h.Font = f4; h.Add(section); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); } //step if (NewPath[1] != stepnum) { AddStepAnnotation(ref lastAnnotationID, cols, paddingBottom, t, f3, f4, ref h, ref c, oldCAI, processedAAI); ////see if any annotations for old stepnum here and add them //foreach (AnnotationAuditInfo aai in annotationList) //{ // if (oldCAI != null && aai.IContentID == oldCAI.ContentID) // { // //add annotation to minilist // // processedAAI.Add(aai.AnnotationID, aai); // processedAAI.Add(aai, aai); // //write row to table // t.AddCell(BlankCell(1)); // h = new Phrase(); // h.Font = f3; // h.Add(AnnotationLookup[aai.TypeID] + " " + aai.ActionWhat); // c = new PdfPCell(h); // c.Colspan = 1; // c.HorizontalAlignment = Element.ALIGN_CENTER; // c.PaddingBottom = paddingBottom; // //c.Border = borders; // t.AddCell(c); // //who // h = new Phrase(); // h.Font = f3; // h.Add(aai.UserID); // c = new PdfPCell(h); // c.Colspan = 1; // c.HorizontalAlignment = Element.ALIGN_CENTER; // c.PaddingBottom = paddingBottom; // //c.Border = borders; // t.AddCell(c); // //when // h = new Phrase(); // h.Font = f3; // h.Add(aai.ActionWhen.ToString()); // c = new PdfPCell(h); // c.Colspan = 1; // c.HorizontalAlignment = Element.ALIGN_CENTER; // c.PaddingBottom = paddingBottom; // //c.Border = borders; // t.AddCell(c); // //new text // h = new Phrase(); // h.Font = f4; // //h.Add(cai.Text); // h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); // c = new PdfPCell(h); // c.Colspan = cols - 4; // c.HorizontalAlignment = Element.ALIGN_LEFT; // c.PaddingBottom = paddingBottom; // //c.Border = borders; // t.AddCell(c); // } //} oldCAI = cai; oldText = cai.Text; oldTypeName = cai.TypeName; firstCAI = cai; stepnum = NewPath[1]; string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); stepnum2 = stepnum2.Replace("RNO.", "RNO"); // check to see if we have step number to output // if not just put in a blank cell. // this cleans up the report so that we don't have "Step" without anything after it. // This was happening when we were reporting change information of a section number/title if (stepnum2 != "") { h = new Phrase(); h.Font = f3; h.Add(string.Format("Step {0}", stepnum2)); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_RIGHT; c.PaddingBottom = paddingBottom; c.PaddingRight = 10; //c.Border = borders; t.AddCell(c); } else t.AddCell(BlankCell(1)); } else { t.AddCell(BlankCell(1)); nextCAI = cai; } //what h = new Phrase(); h.Font = f3; // h.Add(cai.ActionWhen > MyProc.DTS ? cai.ActionWhat : "Original"); string actionWhat = ((cai.ActionWhat == "Added" || cai.ActionWhat == "Changed") && cai.DTS <= MyProc.ChangeBarDate) ? "Original" : cai.ActionWhat; //(cai.ActionWhat == "Added" && cai.DTS <= MyProc.DTS) ? "Original" : cai.ActionWhat != "Changed" ? cai.ActionWhat : cai.DTS <= maxDTS ? "Restored" : cai.DTS > MyProc.DTS ? cai.ActionWhat : "Original"; if (actionWhat == "Deleted" || actionWhat == "Restored") h.Add(actionWhat + "\r\n" + (cai.ActionWhen < cai.DTS ? cai.DTS.ToString("M/dd/yyyy") : cai.ActionWhen.ToString())); else h.Add(actionWhat); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(cai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(cai.DTS.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); //h.Add(ItemInfo.ConvertToDisplayText(cai.Text)); if (cai.Type == 20008) { GridAuditInfoList gail = GridAuditInfoList.Get(cai.ContentID); bool addedInfo = false; if (gail.Count > 0) { GridAuditInfo gai = gail[0]; System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); xd.LoadXml(gai.Data); //int grows = int.Parse(xd.SelectSingleNode("C1FlexGrid/RowInfo/Count").InnerText); int gcols = int.Parse(xd.SelectSingleNode("C1FlexGrid/ColumnInfo/Count").InnerText); string data = ItemInfo.ConvertToDisplayText(cai.Text); PdfPTable gtbl = new PdfPTable(gcols); while (data.Length > 0) { int indx = data.IndexOf(";"); // B2022-111: error on summary report (data missing ';' so couldn't parse out report info) if (indx > 0) { addedInfo = true; string val = data.Substring(0, data.IndexOf(";")); data = data.Substring(data.IndexOf(";") + 1); Phrase hh = new Phrase(); hh.Font = f4; hh.Add(val); PdfPCell cc = new PdfPCell(hh); gtbl.AddCell(cc); } else data = ""; // couldn't find separator ';', don't continue to loop } if (addedInfo) { c = new PdfPCell(gtbl); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; //c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } } // B2017-058: The following was added to handle when there are no grid audits, just put a message. Without // adding this cell to the output, the columns get out of sync for rest of report. else { h = new Phrase(); h.Font = f4; h.Add( "No change in table text found."); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; t.AddCell(c); } } else { h = new Phrase(); h.Font = f4; if (cai.Text != oldText && cai.TypeName != oldTypeName) h.Add(string.Format("[Type Change {0} to {1}] - {2}", oldTypeName, cai.TypeName, ItemInfo.ConvertToDisplayText(cai.Text)));// + " to " + cai.TypeName); else if (cai.Text == oldText && cai.TypeName != oldTypeName) h.Add(oldTypeName + " to " + cai.TypeName); else { string txt = null; if ((cai.Text == null || cai.Text == "") && (cai.Type == 20036 || cai.Type == 20037 || cai.Type == 20038 || cai.Type == 20039)) txt = "Embedded Image"; // B2020-054: Always put out 'Equation' for equations in the summary report else if (cai.Type > 20099) txt = "Equation"; else txt = ItemInfo.ConvertToDisplayText(cai.Text).Replace("Go to \u25cf", "Go to ?"); // Add Parent/Child information if applicable // We were doing this for the Chronology report so I added the same logic here for the Summary report if (MyProc.MyDocVersion.MultiUnitCount > 1) { System.Xml.XmlNode nd; if (cai.Config == string.Empty) nd = null; else { System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); xd.LoadXml(cai.Config); nd = xd.SelectSingleNode("//MasterSlave"); } if (nd == null) txt += "\r\n\r\nApplicable to all units"; else { nd = nd.Attributes.GetNamedItem("Applicability"); if (nd.InnerText == "0") txt += "\r\n\r\nApplicable to no units"; else { int k = MyProc.MyDocVersion.DocVersionConfig.SelectedSlave; string[] myss = nd.InnerText.Split(",".ToCharArray()); string un = "\r\n\r\nApplicable to "; string sep = string.Empty; foreach (string ss in myss) { MyProc.MyDocVersion.DocVersionConfig.SelectedSlave = int.Parse(ss); un += sep + MyProc.MyDocVersion.DocVersionConfig.Unit_Name; sep = ","; } txt += un; MyProc.MyDocVersion.DocVersionConfig.SelectedSlave = k; } } } h.Add(txt); } oldText = cai.Text; oldTypeName = cai.TypeName; // h.Add(ItemInfo.ConvertToDisplayText(cai.Text) + " " + cai.TypeName); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } //c = new PdfPCell(h); //c.Colspan = cols - 4; //c.HorizontalAlignment = Element.ALIGN_LEFT; //c.PaddingBottom = paddingBottom; ////c.Border = borders; //t.AddCell(c); ////old text //t.AddCell(BlankCell(3)); //h = new Phrase(); //h.Font = f4; //h.Add("Old text: " + cai.OldText); //c = new PdfPCell(h); //c.Colspan = 7; //c.Border = 0; //t.AddCell(c); } //see if any annotations for old stepnum here and add them foreach (AnnotationAuditInfo aai in annotationList) { if (oldCAI != null && aai.IContentID == oldCAI.ContentID && !processedAAI.ContainsKey(aai)) { //add annotation to minilist // processedAAI.Add(aai.AnnotationID, aai); processedAAI.Add(aai, aai); //write row to table t.AddCell(BlankCell(1)); h = new Phrase(); h.Font = f3; h.Add(AnnotationLookup[aai.TypeID] + " " + aai.ActionWhat); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(aai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(aai.ActionWhen.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } } bool annotationHeader = false; //t.AddCell(BlankCell(cols)); //h = new Phrase(); //h.Font = f4; //h.Add("ANNOTATIONS"); //c = new PdfPCell(h); //c.Colspan = cols; //c.HorizontalAlignment = Element.ALIGN_LEFT; //c.PaddingBottom = paddingBottom; ////c.Border = borders; //t.AddCell(c); //t.AddCell(BlankCell(cols)); section = string.Empty; stepnum = string.Empty; foreach (AnnotationAuditInfo aai in annotationList) { // if (!processedAAI.ContainsKey(aai.AnnotationID)) if (!processedAAI.ContainsKey(aai)) { if (!annotationHeader) { t.AddCell(BlankCell(cols)); h = new Phrase(); h.Font = f4; h.Add("ANNOTATIONS"); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); t.AddCell(BlankCell(cols)); annotationHeader = true; } string[] NewPath = GetNewPath(AuditList, aai.IContentID); if (NewPath[0] != section) { section = NewPath[0]; stepnum = string.Empty; h = new Phrase(); h.Font = f4; h.Add(section); c = new PdfPCell(h); c.Colspan = cols; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } if (NewPath[1] != stepnum) { stepnum = NewPath[1]; string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); stepnum2 = stepnum2.Replace("RNO.", "RNO"); h = new Phrase(); h.Font = f3; h.Add(string.Format("Step {0}", stepnum2)); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_RIGHT; c.PaddingBottom = paddingBottom; c.PaddingRight = 10; //c.Border = borders; t.AddCell(c); } else { t.AddCell(BlankCell(1)); } //what h = new Phrase(); h.Font = f3; h.Add(AnnotationLookup[aai.TypeID] + " " + aai.ActionWhat); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //who h = new Phrase(); h.Font = f3; h.Add(aai.UserID); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //when h = new Phrase(); h.Font = f3; h.Add(aai.ActionWhen.ToString()); c = new PdfPCell(h); c.Colspan = 1; c.HorizontalAlignment = Element.ALIGN_CENTER; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); //new text h = new Phrase(); h.Font = f4; //h.Add(cai.Text); h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); c = new PdfPCell(h); c.Colspan = cols - 4; c.HorizontalAlignment = Element.ALIGN_LEFT; c.PaddingBottom = paddingBottom; //c.Border = borders; t.AddCell(c); } } if (t.Rows.Count == t.HeaderRows) { c = new PdfPCell(new Phrase("No changes to report")); c.Colspan = cols; t.AddCell(c); } doc.Add(t); } } }