SourceCode/PROMS/Volian.Print.Library/PDFChronologyReport.cs

1794 lines
55 KiB
C#

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<int, string> _AnnotationLookup;
public static Dictionary<int, string> AnnotationLookup
{
get
{
if (_AnnotationLookup == null)
{
_AnnotationLookup = new Dictionary<int, string>();
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<long, AnnotationAuditInfo> processedAAI = new Dictionary<long, AnnotationAuditInfo>();
Dictionary<AnnotationAuditInfo, AnnotationAuditInfo> processedAAI = new Dictionary<AnnotationAuditInfo, AnnotationAuditInfo>();
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.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);
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)
{
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);
}
c = new PdfPCell(gtbl);
c.Colspan = cols - 4;
c.HorizontalAlignment = Element.ALIGN_LEFT;
//c.PaddingBottom = paddingBottom;
//c.Border = borders;
t.AddCell(c);
}
else
{
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);
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<AnnotationAuditInfo, AnnotationAuditInfo> 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<ContentAuditInfo> auditList = new List<ContentAuditInfo>();
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<AnnotationAuditInfo> annotationList = new List<AnnotationAuditInfo>();
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<ContentAuditInfo> auditList1 = new List<ContentAuditInfo>();
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<AnnotationAuditInfo> annotationList = new List<AnnotationAuditInfo>();
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<ContentAuditInfo> auditList2 = new List<ContentAuditInfo>();
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<long, AnnotationAuditInfo> processedAAI = new Dictionary<long, AnnotationAuditInfo>();
Dictionary<AnnotationAuditInfo, AnnotationAuditInfo> processedAAI = new Dictionary<AnnotationAuditInfo, AnnotationAuditInfo>();
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.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);
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)
{
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);
}
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);
// 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);
}
}
}