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

491 lines
16 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;
using System.Windows.Forms;
namespace Volian.Print.Library
{
public class PDFConsistencyCheckReport
{
private DocVersionInfo _MyDocVersion;
public DocVersionInfo MyDocVersion
{
get { return _MyDocVersion; }
set { _MyDocVersion = value; }
}
private string _FileName;
public string FileName
{
get { return _FileName; }
set { _FileName = value; }
}
private ItemInfoList _MyItemInfoList;
public ItemInfoList MyItemInfoList
{
get { return _MyItemInfoList; }
set { _MyItemInfoList = value; }
}
public PDFConsistencyCheckReport(string fileName, ItemInfoList myItemInfoList)
{
_FileName = fileName;
_MyItemInfoList = myItemInfoList;
}
public void BuildReport()
{
iTextSharp.text.Document document = new iTextSharp.text.Document(PageSize.LETTER, 36, 36, 36, 36);
if (!CreateResultsPDF(document)) return;
try
{
BuildConsistencyReport(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);
}
}
}
private bool CreateResultsPDF(iTextSharp.text.Document document)
{
bool result = false;
string suffix = "";
int i = 0;
// Try to open a file for creating the PDF.
while (result == false)
{
string fileName = _FileName.ToLower().Replace(".pdf", suffix + ".pdf");
try
{
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create));
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 BuildConsistencyReport(iTextSharp.text.Document doc)
{
iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 12, 1, Color.BLACK);
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 8, 0, Color.BLACK);
iTextSharp.text.Font f4 = pdf.GetFont("Arial Unicode MS", 10, 2, Color.BLACK);
int cols = 5;
int borders = 0;
int paddingBottom = 6;
// float[] widths;
PdfPTable t = CreatePdfPTable(cols);
CreatePageHeader(t, f1, f4, cols, paddingBottom, "Approval Consistency Report", "Procedures currently selected to be approved");
//more stuff
/*
Csla.SortedBindingList<ItemInfo> sortedResults = new Csla.SortedBindingList<ItemInfo>(_SearchResults);
sortedResults.ApplySort(_DisplayMember, ListSortDirection.Ascending);
lbSrchResults.DataSource = sortedResults;
*/
Csla.SortedBindingList<ItemInfo> sortedProcs = new Csla.SortedBindingList<ItemInfo>(MyItemInfoList);
sortedProcs.ApplySort("DisplayNumber", System.ComponentModel.ListSortDirection.Ascending);
foreach (ProcedureInfo pi in sortedProcs)
{
if (pi.IsSelected)
{
PdfPTable tt = new PdfPTable(cols);
tt.KeepTogether = true;
tt.AddCell(AddSubTableCell(pi.DisplayNumber, f2, cols, paddingBottom));
tt.AddCell(AddSubTableCell(pi.MyDifferencesText, f3, cols, paddingBottom));
PdfPCell c = new PdfPCell(tt);
c.Colspan = cols;
t.AddCell(c);
}
}
t.AddCell(BlankCell(cols));
doc.Add(t);
//new page with new table
doc.NewPage();
t = CreatePdfPTable(cols);
CreatePageHeader(t, f1, f4, cols, paddingBottom, "Approval Consistency Report", "Procedures that should be selected to be approved in order to maintain consistency");
foreach (ProcedureInfo pi in MyItemInfoList)
{
if (!pi.IsSelected)
{
PdfPTable tt = new PdfPTable(cols);
tt.KeepTogether = true;
tt.AddCell(AddSubTableCell(pi.DisplayNumber, f2, cols, paddingBottom));
tt.AddCell(AddSubTableCell(pi.MyDifferencesText, f3, cols, paddingBottom));
PdfPCell c = new PdfPCell(tt);
c.Colspan = cols;
t.AddCell(c);
}
}
doc.Add(t);
}
private PdfPCell AddSubTableCell(string text, iTextSharp.text.Font f, int cols, float pb)
{
Phrase h = new Phrase();
h.Font = f;
h.Add(text);
PdfPCell c = new PdfPCell(h);
c.Colspan = cols;
c.HorizontalAlignment = Element.ALIGN_LEFT;
c.PaddingBottom = pb;
return c;
}
private void CreatePageHeader(PdfPTable t, iTextSharp.text.Font f1, iTextSharp.text.Font f2, int cols, float pb, string hdr1, string hdr2)
{
//report title
Phrase h = new Phrase();
h.Font = f1;
h.Add(hdr1);
PdfPCell c = new PdfPCell(h);
c.Colspan = cols;
c.HorizontalAlignment = Element.ALIGN_CENTER;
c.PaddingBottom = pb;
//c.Border = borders;
t.AddCell(c);
h = new Phrase();
h.Font = f2;
h.Add(hdr2);
c = new PdfPCell(h);
c.Colspan = cols;
c.HorizontalAlignment = Element.ALIGN_CENTER;
c.PaddingBottom = pb;
//c.Border = borders;
t.AddCell(c);
t.AddCell(BlankCell(cols));
}
private PdfPTable CreatePdfPTable(int cols)
{
PdfPTable t = new PdfPTable(cols);
t.HeaderRows = 3;
t.DefaultCell.Padding = 4;
t.WidthPercentage = 100;
float[] widths = new float[] { 1f, 1f, 1f, 1f, 4f };
t.SetWidths(widths);
//t.HorizontalAlignment = 0;
return t;
}
public void BuildAllReport(DocVersionInfo dvi)
{
MyDocVersion = dvi;
iTextSharp.text.Document document = new iTextSharp.text.Document(PageSize.LETTER, 36, 36, 36, 36);
if (!CreateResultsPDF(document)) return;
try
{
BuildAllInConsistenciesReport(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);
}
}
}
private void BuildAllInConsistenciesReport(iTextSharp.text.Document doc)
{
iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 12, 1, Color.BLACK);
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 8, 0, Color.BLACK);
iTextSharp.text.Font f4 = pdf.GetFont("Arial Unicode MS", 10, 2, Color.BLACK);
int cols = 3;
int borders = 0;
int paddingBottom = 6;
PdfPTable t = new PdfPTable(cols);
t.HeaderRows = 1;
t.WidthPercentage = 100;
float[] widths = new float[] { 1f, 1f, 10f };
t.SetWidths(widths);
Phrase h = new Phrase();
h.Font = f1;
h.Add("Approved Procedures Inconsistencies Report");
PdfPCell c = new PdfPCell(h);
c.Colspan = cols;
c.HorizontalAlignment = 1;
t.AddCell(c);
Dictionary<int, string> types = new Dictionary<int, string>();
foreach (ProcedureInfo pi in MyItemInfoList)
{
string type = pi.MyDifferences.ROConsistency.MyROChecks.Length > 0 ? "Reference Object Inconsistencies" : "";
if (type != string.Empty && !types.ContainsKey(0))
types.Add(0, type);
type = pi.MyDifferences.TransitionConsistency.MyTransitionChecks.Length > 0 ? "Transition Inconsistencies" : "";
if (type != string.Empty && !types.ContainsKey(1))
types.Add(1, type);
type = pi.MyDifferences.LibDocConsistency.MyLibDocChecks.Length > 0 ? "Library Document Inconsistencies" : "";
if (type != string.Empty && !types.ContainsKey(2))
types.Add(2, type);
}
// types.Clear();
if (types.Count == 0)
{
h = new Phrase();
h.Font = f2;
h.Add("No Inconsistencies");
c = new PdfPCell(h);
c.Colspan = cols;
t.AddCell(c);
}
else
{
// Dictionary<string, List<string>> ros = new Dictionary<string, List<string>>();
Dictionary<string, Dictionary<string, bool>> ros = new Dictionary<string, Dictionary<string, bool>>();
DocVersionInfo dvi = MyItemInfoList[0].MyDocVersion;
ROFstInfo rofst = dvi.DocVersionAssociations[0].MyROFst;
//rofst.docVer = dvi;
// ROFSTLookup lu = MyItemInfoList[0].MyDocVersion.DocVersionAssociations[0].MyROFst.ROFSTLookup;
ROFSTLookup lu = rofst.GetROFSTLookup(dvi);
if (types.ContainsKey(0))
{
foreach (ProcedureInfo pi in MyItemInfoList)
{
foreach (ROCheck roc in pi.MyDifferences.ROConsistency.MyROChecks)
{
ROFSTLookup.rochild rocc = lu.GetRoChild12(roc.ROID);
if (rocc.type == 1)
{
string newROValue = lu.GetRoValue(roc.ROID).Replace('`', '\xb0');
string rotitle = string.Format("{0} - Current Version: {1}", lu.GetROTitle(roc.ROID), lu.GetRoValue(roc.ROID).Replace('`','\xb0'));
if (ros.ContainsKey(rotitle))
{
ros[rotitle].Add(string.Format("Procedure {0} has an ROValue of: {1}", pi.DisplayNumber, roc.ROValue),roc.ROValue == newROValue);
}
else
{
ros.Add(rotitle, new Dictionary<string,bool>());
ros[rotitle].Add(string.Format("Procedure {0} has an ROValue of: {1}", pi.DisplayNumber, roc.ROValue),roc.ROValue == newROValue);
}
}
}
}
}
//jcb
Dictionary<string, Dictionary<string, bool>> trs = new Dictionary<string, Dictionary<string, bool>>();
//Dictionary<string, List<string>> trs = new Dictionary<string, List<string>>();
if (types.ContainsKey(1))
{
foreach (ProcedureInfo pi in MyItemInfoList)
{
foreach (TransitionCheck trc in pi.MyDifferences.TransitionConsistency.MyTransitionChecks)
{
TransitionInfo ti = TransitionInfo.Get(trc.TransitionID);
string fromText = ti.MyContent.Text;
//GO TO \\v <START]\\v0 0POP05\\u8209?EO\\u8209?EO10, LOSS OF REACTOR OR SECONDARY COOLANT, Step 21\\v #Link:Transition:0 1182 1864[END>\\v0
MatchCollection mc = Regex.Matches(fromText, @"\<START.*? (.*?)\\v #Link:Transition:[0-9]+ ([0-9]+) .*?\[END\>");
foreach (Match m in mc)
if (m.Groups[2].Value == ti.TransitionID.ToString())
fromText = ItemInfo.ConvertToDisplayText(m.Groups[1].Value);
string newValue = ti.MyContent.ContentItems[0].Path + "\r\nCurrent Version: " + fromText;
string trtitle = "From Procedure " + newValue;
if (trs.ContainsKey(trtitle))
{
trs[trtitle].Add(string.Format("According to {0} the destination is: {1}", pi.DisplayNumber, ItemInfo.ConvertToDisplayText(trc.TransitionValue)), ItemInfo.ConvertToDisplayText(trc.TransitionValue) == fromText);
}
else
{
trs.Add(trtitle, new Dictionary<string,bool>());
trs[trtitle].Add(string.Format("According to {0} the destination is: {1}", pi.DisplayNumber, ItemInfo.ConvertToDisplayText(trc.TransitionValue)), ItemInfo.ConvertToDisplayText(trc.TransitionValue) == fromText);
}
}
}
}
//end jcb
Dictionary<string, Dictionary<string, bool>> lds = new Dictionary<string, Dictionary<string, bool>>();
//Dictionary<string, List<string>> lds = new Dictionary<string, List<string>>();
if (types.ContainsKey(2))
{
foreach (ProcedureInfo pi in MyItemInfoList)
{
foreach (LibDocCheck ldc in pi.MyDifferences.LibDocConsistency.MyLibDocChecks)
{
DocumentInfo di = DocumentInfo.Get(ldc.DocID);
string newValue = di.DTS.ToString();
string ldtitle = string.Format("{0} - Current Version: {1}", di.DocumentTitle, di.DTS.ToString());
if (lds.ContainsKey(ldtitle))
{
lds[ldtitle].Add(string.Format("Procedure {0} has a Document Date of: {1}", pi.DisplayNumber, ldc.DocDate.ToString()),ldc.DocDate.ToString() == newValue);
}
else
{
lds.Add(ldtitle, new Dictionary<string,bool>());
lds[ldtitle].Add(string.Format("Procedure {0} has a Document Date of: {1}", pi.DisplayNumber, ldc.DocDate.ToString()), ldc.DocDate.ToString() == newValue);
}
}
}
}
Color goodColor = new Color(System.Drawing.Color.PaleGreen);
Color badColor = new Color(System.Drawing.Color.Khaki);
if (types.ContainsKey(0))
{
h = new Phrase();
h.Font = f2;
h.Add(types[0]);
c = new PdfPCell(h);
c.Colspan = cols;
t.AddCell(c);
foreach (string rotitle in ros.Keys)
{
t.AddCell(BlankCell(1));
h = new Phrase();
h.Font = f3;
h.Add(rotitle);
c = new PdfPCell(h);
c.Colspan = cols - 1;
c.BackgroundColor = goodColor;
t.AddCell(c);
foreach (KeyValuePair<string,bool> d in ros[rotitle])
{
t.AddCell(BlankCell(2));
h = new Phrase();
h.Font = f3;
h.Add(d.Key);
c = new PdfPCell(h);
if (d.Value)
c.BackgroundColor = goodColor;
else
c.BackgroundColor = badColor;
t.AddCell(c);
}
}
}
//jcb
if (types.ContainsKey(1))
{
h = new Phrase();
h.Font = f2;
h.Add(types[1]);
c = new PdfPCell(h);
c.Colspan = cols;
t.AddCell(c);
foreach (string trtitle in trs.Keys)
{
t.AddCell(BlankCell(1));
h = new Phrase();
h.Font = f3;
h.Add(trtitle);
c = new PdfPCell(h);
c.Colspan = cols - 1;
c.BackgroundColor = goodColor;
t.AddCell(c);
foreach (KeyValuePair<string, bool> d in trs[trtitle])
{
t.AddCell(BlankCell(2));
h = new Phrase();
h.Font = f3;
h.Add(d.Key);
c = new PdfPCell(h);
if (d.Value)
c.BackgroundColor = goodColor;
else
c.BackgroundColor = badColor;
t.AddCell(c);
}
}
}
//end jcb
if (types.ContainsKey(2))
{
h = new Phrase();
h.Font = f2;
h.Add(types[2]);
c = new PdfPCell(h);
c.Colspan = cols;
t.AddCell(c);
foreach (string ldtitle in lds.Keys)
{
t.AddCell(BlankCell(1));
h = new Phrase();
h.Font = f3;
h.Add(ldtitle);
c = new PdfPCell(h);
c.Colspan = cols - 1;
c.BackgroundColor = goodColor;
t.AddCell(c);
foreach (KeyValuePair<string, bool> d in lds[ldtitle])
{
t.AddCell(BlankCell(2));
h = new Phrase();
h.Font = f3;
h.Add(d.Key);
c = new PdfPCell(h);
if (d.Value)
c.BackgroundColor = goodColor;
else
c.BackgroundColor = badColor;
t.AddCell(c);
}
}
}
}
doc.Add(t);
}
}
}