SourceCode/PROMS/VEPROMS User Interface/dlgApproveProcedure.cs
Rich 9f0e986c7d Added logic to warn the user if they are going to revert from an approved stage to an unapproved stage.
Added code to assure that consistency checks and versions have the same DTS.
2012-04-24 22:51:14 +00:00

1176 lines
40 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using VEPROMS.CSLA.Library;
using Volian.Base.Library;
using Volian.Print.Library;
using System.IO;
using System.Text.RegularExpressions;
using DevComponents.DotNetBar;
namespace VEPROMS
{
public partial class dlgApproveProcedure : Form
{
public event DisplayConsistencyReportEvent ConsistencyPrintRequest;
private void OnConsistencyPrintRequest(ConsistencyReportArgs args)
{
if (ConsistencyPrintRequest != null)
ConsistencyPrintRequest(this, args);
}
private bool CanApprove
{
get { return btnApprove2.Enabled;}
set
{
btnApprove2.Enabled = value;
tsslStatus.ForeColor = Color.Red;
tsslStatus.BackColor = Color.Yellow;
tsslStatus.Text = value ? "" : "Need to correct the Rev Numbers marked with Question Marks";
}
}
private ApprovalInfo _MyApproval = new ApprovalInfo();
private bool _CheckForMore = false;
private DocVersionInfo _MyDocVersion;
public dlgApproveProcedure(DocVersionInfo myDocVersion)
{
this.ConsistencyPrintRequest += new DisplayConsistencyReportEvent(dlgApproveProcedure_ConsistencyPrintRequest);
_MyDocVersion = myDocVersion;
InitializeComponent();
FlexGridAddEvents();
_MyApproval.StatusUpdated += new ApprovalStatusChangeEvent(_MyApproval_StatusUpdated);
SetupComboBoxes();
foreach (ProcedureInfo pi in myDocVersion.Procedures)
_MyApproval.AddProcedure(pi);
SetupMyApproval();
//pnlApprove.LocationChanged += new EventHandler(Panel_LocationChanged);
//pnlSelect.LocationChanged += new EventHandler(Panel_LocationChanged);
pnlApprove.SendToBack();
this.Width = pnlApprove.Width + this.Width - this.ClientSize.Width;
}
private void FlexGridAddEvents()
{
//fgProcs.ChangeEdit += new EventHandler(fgProcs_ChangeEdit);
//Console.WriteLine(fgProcs.ComboBoxEditor.GetType().Name);
//Console.WriteLine(fgProcs.Editor.GetType().Name);
//fgProcs.ImeModeChanged += new EventHandler(fgProcs_ImeModeChanged);
//fgProcs.LeaveEdit += new C1.Win.C1FlexGrid.RowColEventHandler(fgProcs_LeaveEdit);
//fgProcs.SetupEditor += new C1.Win.C1FlexGrid.RowColEventHandler(fgProcs_SetupEditor);
//fgProcs.StartEdit += new C1.Win.C1FlexGrid.RowColEventHandler(fgProcs_StartEdit);
//fgProcs.ValidateEdit += new C1.Win.C1FlexGrid.ValidateEditEventHandler(fgProcs_ValidateEdit);
fgProcs.ComboCloseUp += new C1.Win.C1FlexGrid.RowColEventHandler(fgProcs_ComboCloseUp);
//fgProcs.MouseDown += new MouseEventHandler(fgProcs_MouseDown);
//fgProcs.MouseUp += new MouseEventHandler(fgProcs_MouseUp);
}
void fgProcs_MouseUp(object sender, MouseEventArgs e)
{
C1.Win.C1FlexGrid.HitTestInfo hti = fgProcs.HitTest(e.X, e.Y);
Console.WriteLine("fgProcs_MouseUp X={0},Y={1},Row={2},Col={3}", e.X, e.Y, hti.Row, hti.Column);
}
void fgProcs_MouseDown(object sender, MouseEventArgs e)
{
C1.Win.C1FlexGrid.HitTestInfo hti = fgProcs.HitTest(e.X, e.Y);
Console.WriteLine("fgProcs_MouseDown X={0},Y={1},Row={2},Col={3}", e.X, e.Y,hti.Row,hti.Column);
}
void fgProcs_ComboCloseUp(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
Console.WriteLine("fgProcs_ComboCloseUp e.row={0}, fgprocs.mouserow={1}", e.Row, fgProcs.MouseRow);
if (e.Row == fgProcs.MouseRow)
return;
fgProcs_AfterEdit(sender, e);
//Console.WriteLine("fgProcs_ComboCloseUp row: {0}, col: {1}, val: {2}, etostring: {3}", e.Row, e.Col, fgProcs[e.Row, e.Col], e.ToString());
}
void fgProcs_ValidateEdit(object sender, C1.Win.C1FlexGrid.ValidateEditEventArgs e)
{
Console.WriteLine("fgProcs_ValidateEdit");
}
void fgProcs_StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
object val = fgProcs[e.Row, e.Col];
DateTime dt = (DateTime)val;
if (dt != null)
dt = dt.AddHours(1);
fgProcs[e.Row, e.Col] = dt;
Console.WriteLine("fgProcs_StartEdit val: {0}, dt: {1}",val,dt);
}
void fgProcs_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
Console.WriteLine("fgProcs_SetupEditor");
}
void fgProcs_LeaveEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
object val = fgProcs[e.Row, e.Col];
DateTime dt = (DateTime)val;
if (dt != null && dt.Hour != 0)
dt = dt.AddHours(-1);
fgProcs[e.Row, e.Col] = dt;
Console.WriteLine("fgProcs_LeaveEdit val: {0}, dt: {1}, mouserow={2}, mousecol={3}", val, dt,fgProcs.MouseRow,fgProcs.MouseCol);
}
void fgProcs_ImeModeChanged(object sender, EventArgs e)
{
Console.WriteLine("fgProcs_ImeModeChanged");
}
void fgProcs_ChangeEdit(object sender, EventArgs e)
{
Console.WriteLine("fgProcs_ChangeEdit");
}
void Panel_LocationChanged(object sender, EventArgs e)
{
if (pnlApprove.Location.X == 0 && pnlSelect.Location.X == 0)
return;
if (pnlApprove.Location.X == 0)
{
chkViewPDF.Visible = false;
chkSetAllDates.Visible = true;
if (_MyApproval.MyProcedures.Count == 1)
{
this.Text = "Approve " + _MyApproval.MyProcedures[0].ProcInfo.DisplayNumber;
chkViewPDF.Visible = true;
chkSetAllDates.Visible = false;
}
else if (_MyApproval.MyProcedures.Count == _MyDocVersion.Procedures.Count)
this.Text = "Approve All Procedures";
else
this.Text = "Approve Selected Procedures";
InitializePanelApprove();
}
if (pnlSelect.Location.X == 0)
{
this.Text = "Select Procedures To Approve";
InitializePanelSelect();
}
}
private void InitializePanelSelect()
{
if (clbMore.Items.Count == 0)
{
foreach (ProcedureInfo pi in _MyDocVersion.Procedures)
{
clbMore.Items.Add(pi.DisplayNumber);
tmpProcedures.Add(pi.DisplayNumber, pi);
}
}
for (int i = 0; i < clbMore.Items.Count; i++)
{
ProcedureInfo pi = tmpProcedures[GetDisplayNumberOnly(clbMore.Items[i].ToString())];
clbMore.SetItemChecked(i, _MyApproval.ProcedureExists(pi));
}
}
private void InitializePanelApprove()
{
SetupMyApproval();
}
private Dictionary<string, ProcedureInfo> tmpProcedures = new Dictionary<string, ProcedureInfo>();
public dlgApproveProcedure(DocVersionInfo myDocVersion, bool selectSome)
{
this.ConsistencyPrintRequest += new DisplayConsistencyReportEvent(dlgApproveProcedure_ConsistencyPrintRequest);
_MyDocVersion = myDocVersion;
InitializeComponent();
FlexGridAddEvents();
_MyApproval.StatusUpdated += new ApprovalStatusChangeEvent(_MyApproval_StatusUpdated);
_CheckForMore = false;
//pnlApprove.LocationChanged += new EventHandler(Panel_LocationChanged);
//pnlSelect.LocationChanged += new EventHandler(Panel_LocationChanged);
pnlSelect.SendToBack();
this.Width = pnlSelect.Width + this.Width - this.ClientSize.Width; ;
}
public dlgApproveProcedure(ProcedureInfo myProcedure)
{
this.ConsistencyPrintRequest += new DisplayConsistencyReportEvent(dlgApproveProcedure_ConsistencyPrintRequest);
_MyDocVersion = myProcedure.MyDocVersion;
InitializeComponent();
FlexGridAddEvents();
SetupComboBoxes();
_MyApproval.AddProcedure(myProcedure);
//SetupMyApproval();
//pnlApprove.LocationChanged += new EventHandler(Panel_LocationChanged);
//pnlSelect.LocationChanged += new EventHandler(Panel_LocationChanged);
pnlApprove.SendToBack();
this.Width = pnlApprove.Width;
}
void _MyApproval_StatusUpdated(ApprovalInfo sender, ApprovalMessageArgs e)
{
tsslMsg2.Text = e.MyStatus;
Application.DoEvents();
}
private void SetupMyApproval()
{
approvalInfoBindingSource.DataSource = _MyApproval;
//if(_MyApproval.MyProcedures.Count == 1)
// lblOldRevNumber.Text = _MyApproval.RevNumber;
//else if (_MyApproval.MyProcedures.Count > 1)
// lblMaxRevNumber1.Text = GetMaxRevNumber();
_MyApproval.RevType = (revTypeBindingSource.Current as RevType).TypeID;
_MyApproval.RevStage = (stageInfoBindingSource.Current as StageInfo).StageID;
approvalInfoBindingSource.ResetBindings(false);
approvalProcedureBindingSource.DataSource = _MyApproval.MyProcedures;
approvalProcedureBindingSource.ResetBindings(false);
//this.ConsistencyPrintRequest -= new DisplayConsistencyReportEvent(dlgApproveProcedure_ConsistencyPrintRequest);
}
private string GetMaxRevNumber()
{
string mrn = string.Empty;
foreach (ApprovalProcedure ap in _MyApproval.MyProcedures)
{
int k = _MyApproval.FancyShmancyRevCompare(mrn, ap.RevNumber);
if (k < 0)
mrn = ap.RevNumber;
}
return mrn;
}
void dlgApproveProcedure_ConsistencyPrintRequest(object sender, ConsistencyReportArgs args)
{
foreach (ProcedureInfo pi in args.MyItems)
pi.IsSelected = _MyApproval.ProcedureExists(pi);
PDFConsistencyCheckReport rpt = new PDFConsistencyCheckReport(args.ReportName, args.MyItems);
rpt.BuildReport();
}
private void SetupComboBoxes()
{
RevTypes rt = new RevTypes();
foreach (int i in Enum.GetValues(typeof(Rev_Types)))
{
RevType t = new RevType(i, Enum.GetName(typeof(Rev_Types), i));
rt.Add(t);
}
revTypeBindingSource.DataSource = rt;
stageInfoBindingSource.DataSource = StageInfoList.Get();
}
private void btnApprove_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
if(!_MyApproval.Approve(new Point(Left,Bottom)))
this.DialogResult = DialogResult.None;
this.Cursor = Cursors.Default;
}
private void cmbRevisionType_SelectedIndexChanged(object sender, EventArgs e)
{
RevType rt = cmbRevisionType2.SelectedItem as RevType;
_MyApproval.RevType = rt.TypeID;
}
private void cmbRevisionStage_SelectedIndexChanged(object sender, EventArgs e)
{
StageInfo si = cmbRevisionStage2.SelectedItem as StageInfo;
_MyApproval.RevStage = si.StageID;
}
private void clbMore_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked)
btnOkay.Enabled = true;
else
btnOkay.Enabled = (clbMore.CheckedItems.Count > 1);
btnCheckMore.Enabled = btnOkay.Enabled;
btnReportMore.Enabled = false;
}
private void btnOkay_Click(object sender, EventArgs e)
{
UpdateMyApproval();
//lbProcs.DataSource = null;
//lbProcs.DataSource = _MyApproval.MyProcedures;
//lbProcs.DisplayMember = "DisplayNumber";
approvalProcedureBindingSource.DataSource = _MyApproval.MyProcedures;
approvalProcedureBindingSource.ResetCurrentItem();
pnlApprove.SendToBack();
}
private void UpdateMyApproval()
{
if (clbMore.CheckedItems.Count == 0)
pnlApprove.SendToBack();
SetupComboBoxes();
for (int i = 0; i < clbMore.Items.Count; i++)
{
string xyz = clbMore.Items[i].ToString();
ProcedureInfo pi = tmpProcedures[GetDisplayNumberOnly(clbMore.Items[i].ToString())];
if (clbMore.GetItemChecked(i))
{
if (!_MyApproval.ProcedureExists(pi))
_MyApproval.AddProcedure(pi);
}
else
{
if (_MyApproval.ProcedureExists(pi))
_MyApproval.DeleteProcedure(pi);
}
}
SetupMyApproval();
}
private void btnCheck_Click(object sender, EventArgs e)
{
//if (chkCascade1.Checked || chkCascade2.Checked)
//{
// MessageBox.Show("cascade");
//}
//else
//{
pnlSelect.SendToBack();
UpdateClbMore();
//}
}
private ItemInfoList _MyItemInfoList;
private void UpdateClbMore()
{
int checkedCount = clbMore.CheckedItems.Count;
int z = int.Parse("0" + lblPhase.Text);
z++;
lblPhase.Text = z.ToString();
string oldLabel = lblMore.Text;
pbMore.Visible = true;
pbMore.Maximum = _MyApproval.MyProcedures.Count;
ItemInfoList.ConsistencyCheckUpdated += new ItemInfoListCCEvent(ItemInfoList_ConsistencyCheckUpdated);
List<ProcedureInfo> myProcs = new List<ProcedureInfo>();
foreach (ApprovalProcedure ap in _MyApproval.MyProcedures)
myProcs.Add(ap.ProcInfo);
_MyItemInfoList = ItemInfoList.GetMoreProcedures(myProcs);
ItemInfoList.ConsistencyCheckUpdated -= new ItemInfoListCCEvent(ItemInfoList_ConsistencyCheckUpdated);
lblMore.Text = oldLabel;
pbMore.Visible = false;
//clbMore.Items.Clear();
//tmpProcedures.Clear();
for (int i = 0; i < clbMore.Items.Count; i++)
{
string info = clbMore.Items[i].ToString();
if(info.Contains(" - ("))
clbMore.Items[i] = info.Substring(0, info.IndexOf(" - ("));
}
foreach (ProcedureInfo npi in _MyItemInfoList)
{
string info = string.Format(npi.MyDifferenceReasons.StartsWith("No ") ? "{0}" : "{0} - ({1})", npi.DisplayNumber, npi.MyDifferenceReasons);
//checked list box
//int k = clbMore.Items.Add(info);
for (int i = 0; i < clbMore.Items.Count; i++)
{
if (clbMore.Items[i].ToString().StartsWith(npi.DisplayNumber))
{
clbMore.Items[i] = info;
tmpProcedures[npi.DisplayNumber] = npi;
if (chkCascade2.Checked || chkCascadeMore.Checked)
clbMore.SetItemChecked(i, true);
break;
}
}
}
Application.DoEvents();
clbMore.Enabled = btnAll.Enabled = btnClear.Enabled = true;
//if (clbMore.Items.Count == 0)
//{
// clbMore.Items.Add("None Found");
// clbMore.Enabled = btnAll.Enabled = btnClear.Enabled = false;
//}
lblMore.Text = string.Format("{0} Procedures, {1} Selected", clbMore.Items.Count, clbMore.CheckedItems.Count);
btnReportMore.Enabled = true;
_CheckForMore = true;
if (chkCascade2.Checked || chkCascadeMore.Checked)
{
if (clbMore.CheckedItems.Count > checkedCount)
{
//btnAll_Click(btnAll, new EventArgs());
UpdateMyApproval();
UpdateClbMore();
}
else
lblPhase.Text = "";
}
}
void ItemInfoList_ConsistencyCheckUpdated(object sender, ItemInfoListCCEventArgs args)
{
if (sender != null)
{
pbMore.Value = args.MyCount;
lblMore.Text = args.MyProcedure.DisplayNumber;
}
else
{
pbMore.Value = pbMore.Maximum;
lblMore.Text = "Querying Database";
}
Application.DoEvents();
}
//private void dtiRevisionDate_ValueChanged(object sender, EventArgs e)
//{
// DevComponents.Editors.DateTimeAdv.DateTimeInput dti = sender as DevComponents.Editors.DateTimeAdv.DateTimeInput;
//}
private void btnAll_Click(object sender, EventArgs e)
{
for (int i = 0; i < clbMore.Items.Count; i++)
clbMore.SetItemChecked(i, true);
}
private void btnClear_Click(object sender, EventArgs e)
{
for (int i = 0; i < clbMore.Items.Count; i++)
clbMore.SetItemChecked(i, false);
}
private void btnCancelMore_Click(object sender, EventArgs e)
{
if (!_CheckForMore)
{
this.Close();
return;
}
//if (_MyApproval.MyProcedures.Count == 1)
// pnlOne.SendToBack();
//else
pnlApprove.SendToBack();
}
//private void tsmiRemove_Click(object sender, EventArgs e)
//{
// ApprovalProcedure ap = approvalProcedureBindingSource.Current as ApprovalProcedure;
// _MyApproval.RemoveProcedure(ap.ProcInfo);
// approvalProcedureBindingSource.DataSource = _MyApproval.MyProcedures;
// approvalProcedureBindingSource.ResetCurrentItem();
// //_MyApproval.RemoveProcedure(lbProcs.SelectedItem as ProcedureInfo);
// //lbProcs.DataSource = null;
// //lbProcs.DataSource = _MyApproval.MyProcedures;
// //lbProcs.DisplayMember = "DisplayNumber";
//}
private int _LastIndex = -1;
private void clbMore_MouseMove(object sender, MouseEventArgs e)
{
if (_MyApproval.MyProcedures.Count > 0)
{
int itemIndex = clbMore.IndexFromPoint(new Point(e.X, e.Y));
if (itemIndex == -1)
sttMore.HideTooltip();
if (itemIndex == _LastIndex)
return;
_LastIndex = itemIndex;
if (itemIndex >= 0)
{
if (clbMore.Items[itemIndex] != null)
{
SuperTooltipInfo stti = sttMore.GetSuperTooltip(clbMore);
//string xyz = GetDisplayNumberOnly(clbMore.Items[itemIndex].ToString());
//string headerText = tmpProcedures[xyz].DisplayNumber;
//string bodyText = tmpProcedures[xyz].MyDifferencesText;
stti.HeaderText = tmpProcedures[GetDisplayNumberOnly(clbMore.Items[itemIndex].ToString())].DisplayNumber;
stti.BodyText = tmpProcedures[GetDisplayNumberOnly(clbMore.Items[itemIndex].ToString())].MyDifferencesText;
stti.FooterVisible = false;
using (Graphics g = CreateGraphics())
{
SizeF sf = g.MeasureString(stti.BodyText, this.Font);
stti.CustomSize = new Size(10 + sf.ToSize().Width, 0);
}
sttMore.ShowTooltip(sender);
return;
}
}
}
//sttMore.HideTooltip();
}
private string GetDisplayNumberOnly(string s)
{
int d = s.IndexOf(" - ");
if (d > -1)
s = s.Substring(0, d).Trim();
return s;
}
private void btnCheckMore_Click(object sender, EventArgs e)
{
UpdateMyApproval();
UpdateClbMore();
}
private void btnReportMore_Click(object sender, EventArgs e)
{
OnConsistencyPrintRequest(new ConsistencyReportArgs(Volian.Base.Library.VlnSettings.TemporaryFolder + @"\MyConsistency.pdf", _MyItemInfoList));
}
private void CascadeChecksUpdated(object sender, EventArgs e)
{
DevComponents.DotNetBar.Controls.CheckBoxX cb = sender as DevComponents.DotNetBar.Controls.CheckBoxX;
if (cb != null)
{
chkCascade2.Checked = chkCascadeMore.Checked = cb.Checked;
}
}
private void fgProcs_AfterEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
ApprovalProcedure ap = approvalProcedureBindingSource.Current as ApprovalProcedure;
if (e.Col == 1)
{ //revnumber
ap.RevNumber = fgProcs[e.Row, e.Col].ToString();
_MyApproval.Refresh();
approvalInfoBindingSource.ResetBindings(false);
bool ok = true;
foreach (ApprovalProcedure app in _MyApproval.MyProcedures)
{
ok = ok && !app.RevNumber.Contains(" ?");
}
CanApprove = ok;
}
if (e.Col == 2)
{ //revdate
DateTime dts = DateTime.Parse(fgProcs[e.Row, e.Col].ToString());
Console.WriteLine("fgProcs_AfterEdit e.row={0}, fgprocs.mouserow={1}, ap.revdate={2}, dts={3}", e.Row, fgProcs.MouseRow,ap.RevDate,dts);
int fgmr = fgProcs.MouseRow;
if (e.Row == fgmr && ap.RevDate == dts)
return;
ap.RevDate = dts;
if (chkSetAllDates.Checked)
{
foreach (ApprovalProcedure app in _MyApproval.MyProcedures)
{
app.RevDate = ap.RevDate;
}
Console.WriteLine("updating dates");
approvalProcedureBindingSource.ResetBindings(false);
// tmrRefresh.Enabled = true;
}
}
}
//private void tsmiAddMore_Click(object sender, EventArgs e)
//{
// pnlSelect.SendToBack();
//}
private void btnModifyList_Click(object sender, EventArgs e)
{
pnlSelect.SendToBack();
}
private void btnIncrement_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
string sep = "Procedures that failed to increment\r\n\r\n";
foreach (ApprovalProcedure ap in _MyApproval.MyProcedures)
if (!IncrementRev(ap))
{
sb.Append(sep + ap.DisplayNumber);
sep = "\r\n";
}
approvalProcedureBindingSource.ResetBindings(false);
if (sb.Length > 0)
{
sb.AppendLine(); sb.AppendLine();
sb.AppendLine("These will be marked with a question mark.");
sb.Append("They need to be corrected before Approval can be run.");
MessageBox.Show(sb.ToString(), "Increment Failures", MessageBoxButtons.OK, MessageBoxIcon.Warning);
CanApprove = false;
}
else
CanApprove = true;
}
private bool IncrementRev(ApprovalProcedure ap)
{
bool rv = true;
if (Regex.IsMatch(ap.RevNumber, "^[0-9]+$"))
ap.RevNumber = (int.Parse(ap.RevNumber) + 1).ToString();
else if (Regex.IsMatch(ap.RevNumber, "^[0-9]*[a-yA-Y]+$"))
{
char lastCar = ap.RevNumber[ap.RevNumber.Length - 1];
lastCar++;
ap.RevNumber = ap.RevNumber.Substring(0, ap.RevNumber.Length - 1) + lastCar.ToString();
}
else if (ap.RevNumber == string.Empty)
ap.RevNumber = "1";
else if (Regex.IsMatch(ap.RevNumber, "^[0-9.]+[.][0-9]+$"))
{
string[] parts = ap.RevNumber.Split(".".ToCharArray());
string sep = "";
string lastPart = parts[parts.Length - 1];
int w = lastPart.Length;
lastPart = (int.Parse(lastPart) + 1).ToString();
//if(w > lastPart.Length)
lastPart = lastPart.PadLeft(w, '0');
parts[parts.Length - 1] = lastPart;
StringBuilder sb = new StringBuilder();
foreach (string part in parts)
{
sb.Append(sep + part);
sep = ".";
}
ap.RevNumber = sb.ToString();
}
else if (Regex.IsMatch(ap.RevNumber, "[?]$"))
rv = false; //do nothing
else
{
ap.RevNumber += " ?";
rv = false;
}
return rv;
}
}
public class ApprovalProcedure
{
private ProcedureInfo _ProcInfo;
public ProcedureInfo ProcInfo
{
get { return _ProcInfo; }
set { _ProcInfo = value; }
}
private string _RevNumber;
public string RevNumber
{
get { return _RevNumber; }
set { _RevNumber = value.Trim(); }
}
private DateTime _RevDate;
public DateTime RevDate
{
get { return _RevDate; }
set { _RevDate = value; }
}
public string DisplayNumber
{
get { return _ProcInfo.DisplayNumber; }
}
public override string ToString()
{
return string.Format("{0}\t{1}\t{2:M/d/yyyy}", _ProcInfo.DisplayNumber, _RevNumber, _RevDate);
}
public ApprovalProcedure(ProcedureInfo proc)
{
ProcInfo = proc;
RevNumber = proc.ProcedureConfig.Print_Rev == string.Empty ? "0" : proc.ProcedureConfig.Print_Rev;
DateTime revdate;
string print_revdate = proc.ProcedureConfig.Print_RevDate;
if (print_revdate == string.Empty && DateTime.TryParse(RevNumber, out revdate))
;
else
revdate = DateTime.TryParse(proc.ProcedureConfig.Print_RevDate.Replace("-","/").Replace("00/","01/"), out revdate) ? revdate : DateTime.Now;
RevDate = revdate;
}
}
public class ApprovalMessageArgs : EventArgs
{
public ApprovalMessageArgs(string msg)
{
_MyStatus = msg;
}
private string _MyStatus;
public string MyStatus
{
get { return _MyStatus; }
set { _MyStatus = value; }
}
}
public delegate void ApprovalStatusChangeEvent(ApprovalInfo sender, ApprovalMessageArgs e);
public class ApprovalInfo
{
public event ApprovalStatusChangeEvent StatusUpdated;
public void OnStatusUpdated(ApprovalInfo sender, ApprovalMessageArgs e)
{
if (StatusUpdated != null)
StatusUpdated(sender, e);
}
private int _RevType;
public int RevType
{
get { return _RevType; }
set { _RevType = value; }
}
private string _RevNumber;
public string RevNumber
{
get { return _RevNumber; }
set { _RevNumber = value; }
}
private Nullable<DateTime> _RevDate;
public Nullable<DateTime> RevDate
{
get { return _RevDate == null ? _RevDate : _RevDate.Value; }
set { _RevDate = value; }
}
private int _RevStage;
public int RevStage
{
get { return _RevStage; }
set { _RevStage = value; }
}
private string _RevNote;
public string RevNote
{
get { return _RevNote; }
set { _RevNote = value; }
}
private bool _ViewPDF;
public bool ViewPDF
{
get { return _ViewPDF; }
set { _ViewPDF = value; }
}
private string _MsgNumber;
public string MsgNumber
{
get { return _MsgNumber; }
set { _MsgNumber = value; }
}
private string _MsgDate;
public string MsgDate
{
get { return _MsgDate; }
set { _MsgDate = value; }
}
private bool _CanIncrement;
public bool CanIncrement
{
get { return _CanIncrement; }
set { _CanIncrement = value; }
}
private List<ApprovalProcedure> _MyProcedures;
public List<ApprovalProcedure> MyProcedures
{
get { return _MyProcedures; }
//set { _MyProcedures = value; }
}
public ApprovalInfo()
{
_MyProcedures = new List<ApprovalProcedure>();
}
private static string FormatRev(Match m)
{
return "".PadLeft(5 - m.Groups[1].Value.Length, '0') + m.Groups[1].Value;
}
public void AddProcedure(ProcedureInfo proc)
{
ApprovalProcedure ap = new ApprovalProcedure(proc);
MyProcedures.Add(ap);
Refresh();
}
public void RemoveProcedure(ProcedureInfo pi)
{
ApprovalProcedure apr = null;
foreach (ApprovalProcedure ap in MyProcedures)
{
if (ap.ProcInfo == pi)
{
apr = ap;
break;
}
}
MyProcedures.Remove(apr);
Refresh();
}
public bool ProcedureExists(ProcedureInfo pi)
{
foreach (ApprovalProcedure pp in MyProcedures)
{
if(pp.ProcInfo.ItemID == pi.ItemID)
return true;
}
return false;
}
public void Refresh()
{
bool ok = true;
int rv = 0;
foreach (ApprovalProcedure ap in MyProcedures)
{
ok = ok && int.TryParse(ap.RevNumber, out rv);
}
_CanIncrement = ok;
//if (MyProcedures.Count == 1)
//{
// ProcedureInfo pi = _MyProcedures[0].ProcInfo;
// RevNumber = pi.ProcedureConfig.Print_Rev == string.Empty ? "0" : pi.ProcedureConfig.Print_Rev;
// DateTime revdate = pi.ProcedureConfig.Print_RevDate == string.Empty ? DateTime.Now : DateTime.TryParse(pi.ProcedureConfig.Print_RevDate, out revdate) ? revdate : DateTime.Now;
// RevDate = revdate;
// RevNote = string.Empty;
// ViewPDF = false;
//}
//else if (MyProcedures.Count > 1)
//{
// Regex myRegEx = new Regex("^([0-9]{1,5})");
// SortedList<string, ProcedureInfo> printRevs = new SortedList<string, ProcedureInfo>();
// SortedList<string, ProcedureInfo> printRevDates = new SortedList<string, ProcedureInfo>();
// string printRev = string.Empty;
// foreach (ApprovalProcedure pi in MyProcedures)
// {
// printRev = myRegEx.Replace(pi.RevNumber, new MatchEvaluator(FormatRev));
// printRev = printRev == string.Empty ? "0" : printRev;
// if (printRev != string.Empty)
// if (!printRevs.ContainsKey(printRev))
// printRevs.Add(printRev, pi.ProcInfo);
// if (pi.RevDate != null)
// if (!printRevDates.ContainsKey(pi.RevDate.ToString()))
// printRevDates.Add(pi.RevDate.ToString(), pi.ProcInfo);
// }
// if (printRevs.Count > 1)
// {
// ProcedureInfo pi = printRevs[printRevs.Keys[printRevs.Count - 1]];
// RevNumber = "*";
// MsgNumber = "Multiple Revision Numbers found. Enter asterisk (*) to use current revision numbers or plus sign (+) to increment revision numbers";
// }
// else if (printRevs.Count == 1)
// {
// ProcedureInfo pi = printRevs[printRevs.Keys[printRevs.Count - 1]];
// RevNumber = pi.ProcedureConfig.Print_Rev;
// MsgNumber = string.Empty;
// }
// if (printRevDates.Count > 1)
// {
// RevDate = null;
// MsgDate = "Multiple Revision Dates found. Use current revision dates or manually assign revision date by selecting a date";
// }
// else if (printRevDates.Count == 1)
// {
// ProcedureInfo pi = printRevDates[printRevDates.Keys[printRevDates.Count - 1]];
// RevDate = DateTime.Parse(pi.ProcedureConfig.Print_RevDate);
// MsgDate = string.Empty;
// }
// else if (printRevDates.Count == 0)
// RevDate = DateTime.Now;
//}
}
public void DeleteProcedure(ProcedureInfo pi)
{
ApprovalProcedure tpi = null;
foreach (ApprovalProcedure pii in MyProcedures)
{
if (pii.ProcInfo.ItemID == pi.ItemID)
tpi = pii;
}
if (tpi != null)
{
MyProcedures.Remove(tpi);
Refresh();
}
}
public bool CanApprove
{
get { return _RevType > 0 && _RevNumber != string.Empty && _RevStage > 0; }
}
public int FancyShmancyRevCompare(string s1, string s2)
{
if (s1 == s2)
return 0;
while (s1 != string.Empty && s2 != string.Empty)
{
//look for numbers
Match m1 = Regex.Match(s1, "^[0-9]+");
Match m2 = Regex.Match(s2, "^[0-9]+");
if (m1.Length > 0 && m2.Length > 0)
{
int i1 = int.Parse(m1.Value);
int i2 = int.Parse(m2.Value);
if (i1 < i2)
return -1;
if (i1 > i2)
return 1;
s1 = s1.Substring(m1.Length);
s2 = s2.Substring(m2.Length);
}
else
{
if (m1.Length > 0)
return 1;
if (m2.Length > 0)
return -1;
}
//look for letters
m1 = Regex.Match(s1, "^[A-Za-z]+");
m2 = Regex.Match(s2, "^[A-Za-z]+");
if (m1.Length > 0 && m2.Length > 0)
{
if (m1.Length > m2.Length)
return 1;
if (m1.Length < m2.Length)
return -1;
int c = m1.Value.CompareTo(m2.Value);
if (c != 0)
return c;
s1 = s1.Substring(m1.Length);
s2 = s2.Substring(m2.Length);
}
else
{
if (m1.Length > 0)
return 1;
if (m2.Length > 0)
return -1;
}
//look for symbols
m1 = Regex.Match(s1, "^[^0-9A-Za-z]+");
m2 = Regex.Match(s2, "^[^0-9A-Za-z]+");
if (m1.Length > 0 && m2.Length > 0)
{
int c = m1.Value.CompareTo(m2.Value);
if (c != 0)
return c;
s1 = s1.Substring(m1.Length);
s2 = s2.Substring(m2.Length);
}
else
{
if (m1.Length > 0)
return 1;
if (m2.Length > 0)
return -1;
}
}
return s1.CompareTo(s2);
}
public bool Approve(Point location)
{
ViewPDF = ViewPDF && MyProcedures.Count == 1;
StringBuilder sb = new StringBuilder();
StageInfo nsi = StageInfo.Get(RevStage);
foreach (ApprovalProcedure ap in MyProcedures) //spin thru looking for updating current revision
{
RevisionInfo ric = RevisionInfo.GetCurrentByItemID(ap.ProcInfo.ItemID);
VersionInfo vi = ric.LatestVersion;
if (ap.RevNumber == ric.RevisionNumber && nsi.IsApproved == 0 && vi.MyStage.IsApproved == 1)
sb.AppendLine(string.Format("{0} - '{1}'", ap.ProcInfo.DisplayNumber, vi.MyStage.Name));
}
if (sb.Length > 0)
{
sb.Insert(0, string.Format("The following procedures will be reverted to '{0}'\r\n\r\n", nsi.Name));
sb.AppendLine("\r\nThis will restore change bars and summary of change results!");
sb.AppendLine("\r\nIf you do not want this to occur, answer No to this dialog \r\nand then change the revision number to create a new revision.");
sb.Append(string.Format("\r\nAre you sure you want to revert to '{0}'?",nsi.Name));
if (MessageBox.Show(sb.ToString(),string.Format("Revert to {0}",nsi.Name),MessageBoxButtons.YesNo,MessageBoxIcon.Stop) == DialogResult.No)
return false;
}
foreach (ApprovalProcedure ap in MyProcedures)
{
ProcedureInfo pi = ap.ProcInfo;
OnStatusUpdated(this, new ApprovalMessageArgs(string.Format("Processing {0}", pi.DisplayNumber)));
RevisionInfo ric = RevisionInfo.GetCurrentByItemID(pi.ItemID);
// RevisionInfo rip = RevisionInfo.GetPreviousByItemID(pi.ItemID);
DateTime myDTS = pi.DTS;
if (ric != null && ap.RevNumber == ric.RevisionNumber && ric.LatestVersion.MyStage.IsApproved == 1)
{
myDTS = ric.MyConfig.History_StartDate;
UpdateProcedureDTS(pi, myDTS);
}
string summaryPDF = VlnSettings.TemporaryFolder + @"\MySummary.pdf";
ContentAuditInfoList cail = ContentAuditInfoList.GetSummary(pi.ItemID, pi.ItemID, false);
AnnotationAuditInfoList aail = AnnotationAuditInfoList.GetChronology(pi.ItemID, pi.ItemID);
Volian.Print.Library.PDFChronologyReport myChronoRpt = new Volian.Print.Library.PDFChronologyReport(summaryPDF, pi, cail, aail);
myChronoRpt.BuildSummary(ViewPDF);
FileInfo pdfFile = new FileInfo(summaryPDF);
FileStream fs = pdfFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] summaryBuf = new byte[pdfFile.Length];
fs.Read(summaryBuf, 0, summaryBuf.Length);
fs.Close();
Revision revision = Revision.GetByItemIDAndRevisionNumber(pi.ItemID, ap.RevNumber);
if (revision == null)
{
RevisionConfig cfg = new RevisionConfig();
cfg.History_StartDate = pi.DTS;
//cfg.Save();
revision = Revision.MakeRevision(pi.ItemID, RevType, ap.RevNumber, ap.RevDate, RevNote, cfg.ToString(), DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
// revision.MyConfig.History_StartDate = pi.DTS;
// revision.MyConfig.Save();
// revision = revision.Save();
}
else if (revision.Notes != RevNote || revision.RevisionDate != ap.RevDate)
{
revision.Notes = RevNote;
revision.RevisionDate = ap.RevDate;
revision = revision.Save();
}
DateTime currentDTS = DateTime.Now;
Check check = Check.MakeCheck(revision, Stage.Get(RevStage), RevisionInfo.BuildRevisionChecks(pi), currentDTS, VlnSettings.UserID);
//make pdf with promsprinter and get byte stream
string pdfTmp = string.Format(@"{0}.pdf", pi.DisplayNumber);
string pdfPath = string.Format(@"{0}\{1}", VlnSettings.TemporaryFolder, pdfTmp);
// Moved to end so that Item and Content are saved at the same time
//UpdateProcedureConfig(pi, ap.RevNumber, ap.RevDate, myDTS);
string waterMark = Stage.Get(RevStage).IsApproved > 0 ? null : Stage.Get(RevStage).Name;
frmPDFStatusForm frm = new frmPDFStatusForm(pi, ap.RevNumber, ap.RevDate.ToString("MM/dd/yyyy"), waterMark, false, ViewPDF, true, VlnSettings.TemporaryFolder, new ChangeBarDefinition(), pdfTmp, location);
frm.AllowAllWatermarks = true;
frm.CloseWhenDone = !ViewPDF;
frm.ShowDialog();
pdfFile = new FileInfo(pdfPath);
fs = pdfFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] buf = new byte[pdfFile.Length];
fs.Read(buf, 0, buf.Length);
fs.Close();
VEPROMS.CSLA.Library.Version version = VEPROMS.CSLA.Library.Version.MakeVersion(revision, Stage.Get(RevStage), buf, summaryBuf, currentDTS, VlnSettings.UserID);
StageInfo si = StageInfo.Get(RevStage);
if (si.IsApproved == 1)
UpdateProcedureConfig(pi, ap.RevNumber, ap.RevDate, DateTime.Now);
else
UpdateProcedureConfig(pi, ap.RevNumber, ap.RevDate, myDTS);
//UpdateProcedureDTS(pi, DateTime.Now);
}
return true;
#region old code
//if (MyProcedures.Count == 1)
//{
// ApprovalProcedure ap = MyProcedures[0];
// //string revnum = RevNumber == "*" ? pi.ProcedureConfig.Print_Rev : RevNumber == "+" ? (int.Parse(Regex.Replace(pi.ProcedureConfig.Print_Rev, "^ *([0-9]*)[^0-9]*$", "0$1")) + 1).ToString() : RevNumber;
// //if (FancyShmancyRevCompare(revnum, ric.RevisionNumber) < 0)
// //{
// // MessageBox.Show("Revision Number must be greater than or equal to current revision","Revision Number Error",MessageBoxButtons.OK,MessageBoxIcon.Stop);
// // return false;
// //}
// //jcb add 20111029 chronology report
// //end jcb add 20111029 chronology report
//}
//else
//{
// ViewPDF = false;
// if (RevNumber != "*" && RevNumber != "+")
// {
// //need to check all procedures for adequate rev number
// bool hdr = false;
// StringBuilder msg = new StringBuilder();
// foreach (ApprovalProcedure ap in MyProcedures)
// {
// ProcedureInfo pi = ap.ProcInfo;
// RevisionInfo ri = RevisionInfo.GetCurrentByItemID(pi.ItemID);
// if (FancyShmancyRevCompare(RevNumber, ri.RevisionNumber) < 0)
// {
// if (!hdr)
// {
// msg.Append("Revision Number is not greater than or equal to the current revision for the following procedure(s):");
// msg.AppendLine();
// msg.AppendLine();
// hdr = true;
// }
// msg.Append(string.Format("{0} Revision {1}", pi.DisplayNumber, pi.ProcedureConfig.Print_Rev));
// msg.AppendLine();
// }
// }
// if (msg.Length > 0)
// {
// MessageBox.Show(msg.ToString(), "Revision Number Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
// return false;
// }
// }
// foreach (ApprovalProcedure ap in MyProcedures)
// {
// ProcedureInfo pi = ap.ProcInfo;
// OnStatusUpdated(this,new ApprovalMessageArgs(string.Format("Processing {0}", pi.DisplayNumber)));
// //jcb add 20111029 chronology report
// string summaryPDF = Volian.Base.Library.VlnSettings.TemporaryFolder + @"\MySummary.pdf";
// ContentAuditInfoList cail = ContentAuditInfoList.GetSummary(pi.ItemID, pi.ItemID, false);
// AnnotationAuditInfoList aail = AnnotationAuditInfoList.GetChronology(pi.ItemID, pi.ItemID);
// Volian.Print.Library.PDFChronologyReport myChronoRpt = new Volian.Print.Library.PDFChronologyReport(summaryPDF, pi, cail, aail);
// myChronoRpt.BuildSummary(ViewPDF);
// FileInfo pdfFile = new FileInfo(summaryPDF);
// FileStream fs = pdfFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// byte[] summaryBuf = new byte[pdfFile.Length];
// fs.Read(summaryBuf, 0, summaryBuf.Length);
// fs.Close();
// //end jcb add 20111029 chronology report
// RevisionInfo ric = RevisionInfo.GetCurrentByItemID(pi.ItemID);
// RevisionInfo rip = RevisionInfo.GetPreviousByItemID(pi.ItemID);
// string revnum = RevNumber == "*" ? pi.ProcedureConfig.Print_Rev : RevNumber == "+" ? (int.Parse(Regex.Replace(pi.ProcedureConfig.Print_Rev, "^ *([0-9]*)[^0-9]*$", "0$1")) + 1).ToString() : RevNumber;
// DateTime myDTS = pi.DTS;
// if (ric != null && revnum == ric.RevisionNumber && ric.LatestVersion.MyStage.IsApproved == 1)
// {
// myDTS = rip.DTS;
// UpdateProcedureDTS(pi, myDTS);
// }
// DateTime dts = RevDate == null ? pi.ProcedureConfig.Print_RevDate == string.Empty ? DateTime.Now : DateTime.Parse(pi.ProcedureConfig.Print_RevDate) : RevDate.Value;
// Revision revision = Revision.GetByItemIDAndRevisionNumber(pi.ItemID, revnum);
// if(revision == null)
// revision = Revision.MakeRevision(pi.ItemID, RevType, revnum, dts, RevNote, "", DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
// else if (revision.Notes != RevNote || revision.RevisionDate != dts)
// {
// revision.Notes = RevNote;
// revision.RevisionDate = dts;
// revision = revision.Save();
// }
// Check check = Check.MakeCheck(revision, Stage.Get(RevStage), RevisionInfo.BuildRevisionChecks(pi));
// string pdfTmp = string.Format(@"{0}.pdf", pi.DisplayNumber);
// string pdfPath = string.Format(@"{0}\{1}", VlnSettings.TemporaryFolder, pdfTmp);
// UpdateProcedureConfig(pi, revnum, dts, myDTS);
// string waterMark = Stage.Get(RevStage).Name == "Approved" ? "" : Stage.Get(RevStage).Name;
// frmPDFStatusForm frm = new frmPDFStatusForm(pi, ap.RevNumber, ap.RevDate.ToString(), waterMark, false, ViewPDF, true, VlnSettings.TemporaryFolder, new ChangeBarDefinition(), pdfTmp, location);
// frm.CloseWhenDone = !ViewPDF;
// frm.ShowDialog();
// //PromsPrinter pp = new PromsPrinter(pi, revnum, dts.ToString(), "", false, "", false, true, new ChangeBarDefinition(), pdfTmp);
// //pp.Print(VlnSettings.TemporaryFolder);
// pdfFile = new FileInfo(pdfPath);
// fs = pdfFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// byte[] buf = new byte[pdfFile.Length];
// fs.Read(buf, 0, buf.Length);
// fs.Close();
// VEPROMS.CSLA.Library.Version version = VEPROMS.CSLA.Library.Version.MakeVersion(revision, Stage.Get(RevStage), buf, summaryBuf, DateTime.Now, VlnSettings.UserID);
// StageInfo si = StageInfo.Get(RevStage);
// if(si.IsApproved == 1)
// UpdateProcedureDTS(pi, DateTime.Now);
// //pdfFile.Delete();
// }
// return true;
//}
#endregion
}
private void UpdateProcedureDTS(ProcedureInfo pi, DateTime dts)
{
using (Item itm = Item.Get(pi.ItemID))
{
itm.DTS = dts;
itm.Save();
}
}
private void UpdateProcedureConfig(ProcedureInfo procedureInfo, string revNumber, DateTime revDate, DateTime dts)
{
ProcedureConfig pc = procedureInfo.MyConfig as ProcedureConfig;
if (pc == null) return;
pc.Print_Rev = revNumber;
pc.Print_RevDate = revDate.ToString();
using (Item itm = Item.Get(procedureInfo.ItemID))
{
itm.MyContent.Config = pc.ToString();
itm.DTS = dts;
itm.UserID = Volian.Base.Library.VlnSettings.UserID;
itm.Save();
}
}
}
public class RevType
{
private int _TypeID;
public int TypeID
{
get { return _TypeID; }
set { _TypeID = value; }
}
private string _TypeName;
public string TypeName
{
get { return _TypeName; }
set { _TypeName = value; }
}
public RevType(int i, string s)
{
_TypeID = i;
_TypeName = s;
}
}
public class RevTypes : List<RevType>
{
}
public delegate void DisplayConsistencyReportEvent(object sender, ConsistencyReportArgs args);
public class ConsistencyReportArgs : EventArgs
{
private string _ReportName;
public string ReportName
{
get { return _ReportName; }
set { _ReportName = value; }
}
private ItemInfoList _MyItems;
public ItemInfoList MyItems
{
get { return _MyItems; }
set { _MyItems = value; }
}
public ConsistencyReportArgs(string reportName, ItemInfoList myItems)
{
_ReportName = reportName;
_MyItems = myItems;
}
}
}