From 0da2d38bd872502c4d498fb2687e6277753ec2fe Mon Sep 17 00:00:00 2001 From: mschill Date: Mon, 8 Sep 2025 14:38:36 -0400 Subject: [PATCH] C2025-009 Added a report for tracking when a user is added into PROMS / when a user is added to specific PROMS security groups. Report can be run from the V-button->General Tools->Reports. --- PROMS/VEPROMS User Interface/PROMSFixes.Sql | 37 ++++- .../VEPROMS User Interface/VEPROMS_UI.csproj | 4 + PROMS/VEPROMS User Interface/frmGenTools.cs | 142 +++++++++++++++++- .../frmGenTools.designer.cs | 114 +++++++++----- PROMS/VEPROMS User Interface/frmGenTools.resx | 3 + .../Minimal/UserReports.cs | 42 ++++++ .../VEPROMS.CSLA.Library.csproj | 1 + 7 files changed, 302 insertions(+), 41 deletions(-) create mode 100644 PROMS/VEPROMS.CSLA.Library/Minimal/UserReports.cs diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index 5a5e0f2c..7d2f6c38 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -24231,6 +24231,39 @@ GO ========================================================================================================== */ +-- C2025-009 Report for tracking PROMS Users / Security +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[getUserAcessControl]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) + DROP PROCEDURE [getUserAcessControl]; + +GO + +/****** Object: StoredProcedure [dbo].[getUserAcessControl] Script Date: 9/5/2025 6:51:42 AM ******/ + +-- ============================================= +-- Author: Matthew Schill +-- Create date: 09/05/2025 +-- Description: Get Data on When Users were added to PROMS and when they were added to Security Groups +-- ============================================= +CREATE PROCEDURE [dbo].[getUserAcessControl] +AS +BEGIN + SELECT Users.UserID, + WhenUserAddedToPROMS = Users.[DTS], + GroupName = Groups.GroupName, + WhenUserAddedToGroup = Memberships.[DTS], + WhoAddedUserToGroup = CASE WHEN + Memberships.UsrID = Users.UsrID + AND Users.UsrID = Users.UserID + THEN 'INITIAL_SETUP' + ELSE Memberships.UsrID END, + DateUserRemovedFromGroup = Memberships.EndDate + FROM Memberships + inner join Groups on Memberships.GID = Groups.GID + right outer join Users on Users.UID = Memberships.UID + order by UserID, Memberships.[DTS] + RETURN +END + /* --------------------------------------------------------------------------- | ADD New Code Before this Block | @@ -24264,8 +24297,8 @@ BEGIN TRY -- Try Block DECLARE @RevDate varchar(255) DECLARE @RevDescription varchar(255) - set @RevDate = '09/04/2025 7:00 AM' - set @RevDescription = 'Removed stored procedures no longer needed' + set @RevDate = '09/05/2025 7:00 AM' + set @RevDescription = 'Added stored procedure for User Access Control Report' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription diff --git a/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj b/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj index 6b6a4249..b38454be 100644 --- a/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj +++ b/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj @@ -121,6 +121,10 @@ False ..\..\..\..\3rdPartyLibraries\Log4Net\log4net.dll + + + True + diff --git a/PROMS/VEPROMS User Interface/frmGenTools.cs b/PROMS/VEPROMS User Interface/frmGenTools.cs index 238519b6..4d0decc8 100644 --- a/PROMS/VEPROMS User Interface/frmGenTools.cs +++ b/PROMS/VEPROMS User Interface/frmGenTools.cs @@ -9,6 +9,8 @@ using Volian.Controls.Library; using DevComponents.DotNetBar; using JR.Utils.GUI.Forms; using System.Linq; +using System.Data; +using xls = Microsoft.Office.Interop.Excel; namespace VEPROMS { @@ -275,6 +277,13 @@ namespace VEPROMS setupProgessSteps1(); } + //C2025-009 Report for tracking PROMS Users / security + private void sideNavItmReports_Click(object sender, EventArgs e) + { + GenToolType = E_GenToolType.Reports; + setupProgessSteps1(); + } + // C2017-030 new Tools user interface private void sideNavItmExit_Click(object sender, EventArgs e) { @@ -287,7 +296,8 @@ namespace VEPROMS private enum E_GenToolType : int { Check = 0, - Users = 3 + Users = 3, + Reports = 5 }; private E_GenToolType GenToolType = 0; @@ -314,8 +324,8 @@ namespace VEPROMS progressSteps1.Visible = true; progressSteps1.Refresh(); break; - case E_GenToolType.Users: + case E_GenToolType.Reports: splitContainer3.Panel2Collapsed = true; progressSteps1.Visible = false; break; @@ -415,7 +425,133 @@ namespace VEPROMS ClearStepProgress(); } - + + //C2025-009 Report for tracking PROMS Users / security + //UACfilename will hold the filename for cases when scheduled for later + private string UACfilename; + + //C2025-009 Report for tracking PROMS Users / security + private void btnUAC_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(UACfilename)) + { + SaveFileDialog sfd = new SaveFileDialog(); + sfd.Filter = "Excel XLS (*.xlsx)|*.xlsx"; + sfd.FileName = "UACReport.xlsx"; + if (sfd.ShowDialog() == DialogResult.OK) + { + UACfilename = sfd.FileName; + } + } + + if (!CheckProcessLater()) return; // delay processing if set//B2017-221 Allow the batch dialog to close when waiting to process. + + txtProcess.Clear(); + txtResults.Clear(); + + if (!string.IsNullOrEmpty(UACfilename)) + { + Generate_UAC_Report(UACfilename); + } + + UACfilename = null; + + } + + //C2025-009 Report for tracking PROMS Users / security + //Get Datatable of results then loop through outputting into excel + private void Generate_UAC_Report(string filename) + { + this.Cursor = Cursors.WaitCursor; + DateTime pStart = DateTime.Now; + txtProcess.AppendText("Generate User Access Control Report in PROMS"); + txtProcess.AppendText(Environment.NewLine); + txtProcess.AppendText(string.Format("Started: {0}", pStart.ToString("MM/dd/yyyy @ HH:mm"))); + txtProcess.AppendText(Environment.NewLine); + Application.DoEvents(); + txtResults.Clear(); + txtResults.AppendText("Generating User Access Control Report"); + + using (DataTable dt = UserReports.GetUserAccessControlData()) + { + // Start Excel and get Application object. + xls.Application excel = new xls.Application + { + // Make Excel invisible and disable alerts. + Visible = false, + DisplayAlerts = false + }; + + // Create a new Workbook. + xls.Workbook excelworkBook = excel.Workbooks.Add(); + + // Create a Worksheet. + var workSheet = (xls.Worksheet)excelworkBook.ActiveSheet; + workSheet.Name = "UAC Report"; + + // column headings + for (var i = 0; i < dt.Columns.Count; i++) + { + workSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; + } + + // rows + for (var i = 0; i < dt.Rows.Count; i++) + { + for (var j = 0; j < dt.Columns.Count; j++) + { + workSheet.Cells[i + 2, j + 1] = dt.Rows[i][j]; + } + } + + //resize the columns to match the data + workSheet.Columns.AutoFit(); + + //freeze the top row, and highlight those cells + workSheet.Application.ActiveWindow.SplitRow = 1; + workSheet.Application.ActiveWindow.FreezePanes = true; + workSheet.Cells.Range[workSheet.Cells[1, 1], workSheet.Cells[1, dt.Columns.Count]].Interior.Color = xls.XlRgbColor.rgbLightBlue; + + //save the excel file + excelworkBook.SaveAs(filename); + excelworkBook.Close(); + excel.Quit(); + + //release any in use com objects + releaseObject(workSheet); + releaseObject(excelworkBook); + releaseObject(excel); + + } + + DateTime pEnd = DateTime.Now; + txtProcess.AppendText(string.Format("Completed: {0}", pEnd.ToString("MM/dd/yyyy @ HH:mm"))); + Application.DoEvents(); + this.Cursor = Cursors.Default; + MessageBox.Show("Generate User Access Control Report Completed", "User Access Control Report"); + + } + + //C2025-009 Report for tracking PROMS Users / security + //for releasing any Excel com objects still in memory + private void releaseObject(object obj) + { + try + { + System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); + obj = null; + } + catch (Exception ex) + { + obj = null; + MessageBox.Show("Exception Occurred while releasing object " + ex.ToString()); + } + finally + { + GC.Collect(); + } + } + //C2025-011 RO Update Tool Memory Enhancements private void txtProcess_TextChanged(object sender, EventArgs e) { diff --git a/PROMS/VEPROMS User Interface/frmGenTools.designer.cs b/PROMS/VEPROMS User Interface/frmGenTools.designer.cs index 482713c9..995bf751 100644 --- a/PROMS/VEPROMS User Interface/frmGenTools.designer.cs +++ b/PROMS/VEPROMS User Interface/frmGenTools.designer.cs @@ -51,6 +51,9 @@ this.expandableSplitter1 = new DevComponents.DotNetBar.ExpandableSplitter(); this.panelEx1 = new DevComponents.DotNetBar.PanelEx(); this.sideNav1 = new DevComponents.DotNetBar.Controls.SideNav(); + this.sideNavPanel6 = new DevComponents.DotNetBar.Controls.SideNavPanel(); + this.sideNavPanel5 = new DevComponents.DotNetBar.Controls.SideNavPanel(); + this.btn_ShowUsers = new DevComponents.DotNetBar.ButtonX(); this.sideNavPanel1 = new DevComponents.DotNetBar.Controls.SideNavPanel(); this.warningBox3 = new DevComponents.DotNetBar.Controls.WarningBox(); this.labelX7 = new DevComponents.DotNetBar.LabelX(); @@ -62,12 +65,11 @@ this.swCkOrphanDataRecs = new DevComponents.DotNetBar.Controls.SwitchButton(); this.labelX1 = new DevComponents.DotNetBar.LabelX(); this.btnRunCheck = new DevComponents.DotNetBar.ButtonX(); - this.sideNavPanel5 = new DevComponents.DotNetBar.Controls.SideNavPanel(); - this.btn_ShowUsers = new DevComponents.DotNetBar.ButtonX(); this.sideNavItem1 = new DevComponents.DotNetBar.Controls.SideNavItem(); this.separator1 = new DevComponents.DotNetBar.Separator(); this.sideNavItmCheck = new DevComponents.DotNetBar.Controls.SideNavItem(); this.sideNavItmUsers = new DevComponents.DotNetBar.Controls.SideNavItem(); + this.sideNavItmReports = new DevComponents.DotNetBar.Controls.SideNavItem(); this.sideNavItmExit = new DevComponents.DotNetBar.Controls.SideNavItem(); this.panelEx4 = new DevComponents.DotNetBar.PanelEx(); this.progressSteps1 = new DevComponents.DotNetBar.ProgressSteps(); @@ -78,6 +80,7 @@ this.lblAdmToolProgressType = new DevComponents.DotNetBar.LabelX(); this.buttonItem1 = new DevComponents.DotNetBar.ButtonItem(); this.superTooltip1 = new DevComponents.DotNetBar.SuperTooltip(); + this.btnUAC = new DevComponents.DotNetBar.ButtonX(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit(); this.splitContainer3.Panel1.SuspendLayout(); this.splitContainer3.Panel2.SuspendLayout(); @@ -89,8 +92,9 @@ this.pnlLater.SuspendLayout(); this.panelEx1.SuspendLayout(); this.sideNav1.SuspendLayout(); - this.sideNavPanel1.SuspendLayout(); + this.sideNavPanel6.SuspendLayout(); this.sideNavPanel5.SuspendLayout(); + this.sideNavPanel1.SuspendLayout(); this.panelEx4.SuspendLayout(); this.SuspendLayout(); // @@ -416,8 +420,9 @@ // sideNav1 // this.sideNav1.BackColor = System.Drawing.SystemColors.Control; - this.sideNav1.Controls.Add(this.sideNavPanel1); + this.sideNav1.Controls.Add(this.sideNavPanel6); this.sideNav1.Controls.Add(this.sideNavPanel5); + this.sideNav1.Controls.Add(this.sideNavPanel1); this.sideNav1.Dock = System.Windows.Forms.DockStyle.Fill; this.sideNav1.EnableClose = false; this.sideNav1.EnableMaximize = false; @@ -426,6 +431,7 @@ this.separator1, this.sideNavItmCheck, this.sideNavItmUsers, + this.sideNavItmReports, this.sideNavItmExit}); this.sideNav1.Location = new System.Drawing.Point(0, 0); this.sideNav1.Name = "sideNav1"; @@ -434,6 +440,40 @@ this.sideNav1.TabIndex = 3; this.sideNav1.Text = "sideNav1"; // + // sideNavPanel6 + // + this.sideNavPanel6.Controls.Add(this.btnUAC); + this.sideNavPanel6.Dock = System.Windows.Forms.DockStyle.Fill; + this.sideNavPanel6.Location = new System.Drawing.Point(88, 31); + this.sideNavPanel6.Name = "sideNavPanel6"; + this.sideNavPanel6.Size = new System.Drawing.Size(292, 493); + this.sideNavPanel6.TabIndex = 14; + // + // sideNavPanel5 + // + this.sideNavPanel5.Controls.Add(this.btn_ShowUsers); + this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill; + this.sideNavPanel5.Location = new System.Drawing.Point(88, 31); + this.sideNavPanel5.Name = "sideNavPanel5"; + this.sideNavPanel5.Size = new System.Drawing.Size(292, 493); + this.sideNavPanel5.TabIndex = 14; + this.sideNavPanel5.Visible = false; + // + // btn_ShowUsers + // + this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton; + this.btn_ShowUsers.Checked = true; + this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground; + this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37); + this.btn_ShowUsers.Name = "btn_ShowUsers"; + this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23); + this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled; + this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" + + "d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80))); + this.btn_ShowUsers.TabIndex = 0; + this.btn_ShowUsers.Text = "Show Users"; + this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click); + // // sideNavPanel1 // this.sideNavPanel1.Controls.Add(this.warningBox3); @@ -451,6 +491,7 @@ this.sideNavPanel1.Name = "sideNavPanel1"; this.sideNavPanel1.Size = new System.Drawing.Size(292, 493); this.sideNavPanel1.TabIndex = 2; + this.sideNavPanel1.Visible = false; // // warningBox3 // @@ -600,31 +641,6 @@ this.btnRunCheck.Text = "Run Check"; this.btnRunCheck.Click += new System.EventHandler(this.btnRunCheck_Click); // - // sideNavPanel5 - // - this.sideNavPanel5.Controls.Add(this.btn_ShowUsers); - this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill; - this.sideNavPanel5.Location = new System.Drawing.Point(88, 31); - this.sideNavPanel5.Name = "sideNavPanel5"; - this.sideNavPanel5.Size = new System.Drawing.Size(292, 493); - this.sideNavPanel5.TabIndex = 14; - this.sideNavPanel5.Visible = false; - // - // btn_ShowUsers - // - this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton; - this.btn_ShowUsers.Checked = true; - this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground; - this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37); - this.btn_ShowUsers.Name = "btn_ShowUsers"; - this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23); - this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled; - this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" + - "d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80))); - this.btn_ShowUsers.TabIndex = 0; - this.btn_ShowUsers.Text = "Show Users"; - this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click); - // // sideNavItem1 // this.sideNavItem1.IsSystemMenu = true; @@ -644,7 +660,6 @@ // // sideNavItmCheck // - this.sideNavItmCheck.Checked = true; this.sideNavItmCheck.Name = "sideNavItmCheck"; this.sideNavItmCheck.Panel = this.sideNavPanel1; this.sideNavItmCheck.Symbol = ""; @@ -659,6 +674,15 @@ this.sideNavItmUsers.Text = "Users"; this.sideNavItmUsers.Click += new System.EventHandler(this.sideNavItmUsers_Click); // + // sideNavItmReports + // + this.sideNavItmReports.Checked = true; + this.sideNavItmReports.Name = "sideNavItmReports"; + this.sideNavItmReports.Panel = this.sideNavPanel6; + this.sideNavItmReports.Symbol = ""; + this.sideNavItmReports.Text = "Reports"; + this.sideNavItmReports.Click += new System.EventHandler(this.sideNavItmReports_Click); + // // sideNavItmExit // this.sideNavItmExit.Name = "sideNavItmExit"; @@ -761,6 +785,20 @@ this.superTooltip1.DefaultTooltipSettings = new DevComponents.DotNetBar.SuperTooltipInfo("", "", "", null, null, DevComponents.DotNetBar.eTooltipColor.Gray); this.superTooltip1.LicenseKey = "F962CEC7-CD8F-4911-A9E9-CAB39962FC1F"; // + // btnUAC + // + this.btnUAC.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton; + this.btnUAC.Checked = true; + this.btnUAC.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground; + this.btnUAC.Location = new System.Drawing.Point(35, 30); + this.btnUAC.Name = "btnUAC"; + this.btnUAC.Size = new System.Drawing.Size(187, 23); + this.btnUAC.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled; + this.btnUAC.TabIndex = 0; + this.btnUAC.Text = "Run User Access Control Report"; + this.superTooltip1.SetSuperTooltip(this.btnUAC, new DevComponents.DotNetBar.SuperTooltipInfo("UAC Report", "", "This will return a report containing info on when users were added to PROMS and when users were added to specific PROMS security groups.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray)); + this.btnUAC.Click += new System.EventHandler(this.btnUAC_Click); + // // frmGenTools // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -790,15 +828,16 @@ this.panelEx1.ResumeLayout(false); this.sideNav1.ResumeLayout(false); this.sideNav1.PerformLayout(); - this.sideNavPanel1.ResumeLayout(false); + this.sideNavPanel6.ResumeLayout(false); this.sideNavPanel5.ResumeLayout(false); + this.sideNavPanel1.ResumeLayout(false); this.panelEx4.ResumeLayout(false); this.ResumeLayout(false); } - #endregion - private System.Windows.Forms.SplitContainer splitContainer3; + #endregion + private System.Windows.Forms.SplitContainer splitContainer3; private DevComponents.DotNetBar.PanelEx panelEx3; private System.Windows.Forms.TextBox txtResults; private System.Windows.Forms.Panel panel1; @@ -829,11 +868,13 @@ private DevComponents.DotNetBar.ButtonX btnRunCheck; private DevComponents.DotNetBar.Controls.SideNavPanel sideNavPanel5; private DevComponents.DotNetBar.ButtonX btn_ShowUsers; - private DevComponents.DotNetBar.Controls.SideNavItem sideNavItem1; + private DevComponents.DotNetBar.Controls.SideNavPanel sideNavPanel6; + private DevComponents.DotNetBar.Controls.SideNavItem sideNavItem1; private DevComponents.DotNetBar.Separator separator1; private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmCheck; private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmUsers; - private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmExit; + private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmReports; + private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmExit; private DevComponents.DotNetBar.LabelX lblAdmToolProgressType; private DevComponents.DotNetBar.ProgressSteps progressSteps1; private DevComponents.DotNetBar.StepItem stepItem1; @@ -847,7 +888,8 @@ private DevComponents.DotNetBar.PanelEx panelEx4; private DevComponents.DotNetBar.Controls.WarningBox warningBox3; private DevComponents.DotNetBar.ButtonItem buttonItem1; - } + private DevComponents.DotNetBar.ButtonX btnUAC; + } } diff --git a/PROMS/VEPROMS User Interface/frmGenTools.resx b/PROMS/VEPROMS User Interface/frmGenTools.resx index 12f79aef..96245292 100644 --- a/PROMS/VEPROMS User Interface/frmGenTools.resx +++ b/PROMS/VEPROMS User Interface/frmGenTools.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + diff --git a/PROMS/VEPROMS.CSLA.Library/Minimal/UserReports.cs b/PROMS/VEPROMS.CSLA.Library/Minimal/UserReports.cs new file mode 100644 index 00000000..32f1cef3 --- /dev/null +++ b/PROMS/VEPROMS.CSLA.Library/Minimal/UserReports.cs @@ -0,0 +1,42 @@ +using System; +using Csla.Data; +using System.Data; +using System.Data.SqlClient; + +//CSM - C2025-009 - Minimal Class for User based Reports +namespace VEPROMS.CSLA.Library +{ + public static class UserReports + { + + #region Get User Reports + //CSM - C2025-009 Report for tracking PROMS Users / security + public static DataTable GetUserAccessControlData() + { + try + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "getUserAcessControl"; + cm.CommandTimeout = Database.DefaultTimeout; + using (SqlDataAdapter da = new SqlDataAdapter(cm)) + { + DataTable dt = new DataTable(); + da.Fill(dt); + return dt; + } + } + } + } + catch (Exception ex) + { + throw new DbCslaException("Error in getUserAcessControl Report: retrieving data failed", ex); + } + } + #endregion + + } +} diff --git a/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj b/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj index 27379637..bd901c66 100644 --- a/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj +++ b/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj @@ -388,6 +388,7 @@ +