444 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			444 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.ComponentModel;
 | |
| using System.Xml;
 | |
| using System.Linq;
 | |
| using System.Data.SqlClient;
 | |
| using System.Data;
 | |
| using Csla.Data;
 | |
| using static VEPROMS.CSLA.Library.ROFSTLookup;
 | |
| 
 | |
| namespace VEPROMS.CSLA.Library
 | |
| {
 | |
|     //C2025-023 - Electronic Procedures - Modifications to PROMS
 | |
|     // class to handle storage and access of EPFormatFile and EPFormatFile details
 | |
|     #region EPFormatFiles
 | |
|     [TypeConverter(typeof(vlnListConverter<EPFormatFiles, EPFormatFile>))]
 | |
|     public class EPFormatFiles : vlnFormatList<EPFormatFile>
 | |
|     {
 | |
|         public EPFormatFiles(XmlNodeList xmlNodeList) : base(xmlNodeList) { }
 | |
|     }
 | |
|     #endregion
 | |
|     #region EPFormatFile
 | |
|     public class EPFormatFile : vlnFormatItem
 | |
|     {
 | |
|         #region Constructor
 | |
|         public EPFormatFile(XmlNode xmlNode) : base(xmlNode) { }
 | |
|         public EPFormatFile() : base() { }
 | |
|         #endregion
 | |
|         #region Business Fields
 | |
|         // Name of the EP Viewer Format File
 | |
|         private LazyLoad<string> _Name;
 | |
|         [DisplayName("Name")]
 | |
|         [Description("EP Viewer File Name")]
 | |
|         public string Name
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _Name, "@Name");
 | |
|             }
 | |
|         }
 | |
|         // Name of the EP Viewer Format File
 | |
|         private LazyLoad<string> _Description;
 | |
|         [DisplayName("Description")]
 | |
|         [Description("EP Viewer Description")]
 | |
|         public string Description
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _Description, "@Description");
 | |
|             }
 | |
|         }
 | |
|         // Id of Annotation Type Associated with this file
 | |
|         private LazyLoad<int?> _AnnotationTypeID;
 | |
|         [DisplayName("AnnotationTypeID")]
 | |
|         [Description("Id of Annotation Type Associated with this file")]
 | |
|         public int? AnnotationTypeID
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _AnnotationTypeID, "@AnnotationTypeID");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Return Name of Annotation that EP Format File is Attached to
 | |
|         public string AnnotationName()
 | |
|         {
 | |
|             return AnnotationTypeInfo.Get((int) AnnotationTypeID).Name;
 | |
|         }
 | |
| 
 | |
|         //if xml value is blank, should element export?
 | |
|         //defaults to true
 | |
|         private LazyLoad<bool> _exportblank;
 | |
|         [DisplayName("exportblank")]
 | |
|         [Description("if xml value is blank, should element export?")]
 | |
|         public bool exportblank
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _exportblank, "@exportblank");
 | |
|             }
 | |
|         }
 | |
|         // returns a list of fields that are defined in the EP format's structure
 | |
|         private EPFields _FieldList;
 | |
|         public EPFields FieldList
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 XmlDocument xd = GetEPFormatData(Name);
 | |
|                 return _FieldList ?? (_FieldList = new EPFields(xd.SelectNodes("/EPFormat/EPField")));
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
|         #region Business Methods
 | |
|         // update all in-use annotation types that have Electronic Procedures
 | |
|         public static void UpdateAllInUseEPAnnotationTypes()
 | |
|         {
 | |
|             foreach (int formatid in GetAllInUseFormats())
 | |
|             {
 | |
|                 PlantFormat frmt = FormatInfo.Get(formatid).PlantFormat;
 | |
|                 foreach (EPFormatFile EP in frmt.EPFormatFiles)
 | |
|                 {
 | |
|                     UpdateAnnotationTypeAsEP((int) EP.AnnotationTypeID);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
|         #region Data Access
 | |
|         // static - Load EP Format details - save to db (insert/update)
 | |
|         public static void UpdateEPFormat(string name, string data, string userID)
 | |
|         {
 | |
|             using (SqlConnection cn = Database.VEPROMS_SqlConnection)
 | |
|             {
 | |
|                 using (SqlCommand cm = cn.CreateCommand())
 | |
|                 {
 | |
|                     cm.CommandType = CommandType.StoredProcedure;
 | |
|                     cm.CommandText = "vesp_UpdateEPFormat";
 | |
|                     cm.Parameters.AddWithValue("@name", name);
 | |
|                     cm.Parameters.AddWithValue("@data", data);
 | |
|                     cm.Parameters.AddWithValue("@userID", userID);
 | |
|                     cm.CommandTimeout = Database.DefaultTimeout;
 | |
|                     cm.ExecuteNonQuery();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // load data for getting fieldlist for this EPFormat
 | |
|         public static XmlDocument GetEPFormatData(string name)
 | |
|         {
 | |
|             name = name.Replace(".xml", "");
 | |
| 
 | |
|             using (SqlConnection cn = Database.VEPROMS_SqlConnection)
 | |
|             {
 | |
|                 using (SqlCommand cm = cn.CreateCommand())
 | |
|                 {
 | |
|                     cm.CommandType = CommandType.Text;
 | |
|                     cm.CommandText = "Select Data FROM EPFormats where Name = @Name";
 | |
|                     cm.Parameters.AddWithValue("@Name", name);
 | |
|                     cm.CommandTimeout = Database.DefaultTimeout;
 | |
|                     using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
 | |
|                     {
 | |
|                         if (dr.Read())
 | |
|                         {
 | |
|                             XmlDocument xd = new XmlDocument();
 | |
|                             xd.XmlResolver = null;
 | |
|                             xd.LoadXml(dr.GetString("Data"));
 | |
|                             return xd;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         // Get all in-use formats
 | |
|         public static List<int> GetAllInUseFormats()
 | |
|         {
 | |
|             using (SqlConnection cn = Database.VEPROMS_SqlConnection)
 | |
|             {
 | |
|                 using (SqlCommand cm = cn.CreateCommand())
 | |
|                 {
 | |
|                     cm.CommandType = CommandType.Text;
 | |
|                     cm.CommandText = @"SELECT Distinct Formats.[FormatID]
 | |
| 										FROM 
 | |
| 										(
 | |
| 											 SELECT FormatID FROM Contents
 | |
| 											 UNION 
 | |
| 											 SELECT FormatID FROM DocVersions
 | |
| 											 UNION 
 | |
| 											 SELECT FormatID FROM Folders										
 | |
| 										) inuse
 | |
| 										inner join Formats
 | |
| 										on inuse.FormatID = Formats.FormatID";
 | |
|                     cm.CommandTimeout = Database.DefaultTimeout;
 | |
| 
 | |
|                     using (DataTable dt = new DataTable())
 | |
|                     {
 | |
|                         using (SqlDataAdapter da = new SqlDataAdapter(cm))
 | |
|                         {
 | |
|                             da.Fill(dt);
 | |
|                             return dt.AsEnumerable().Select(x => x.Field<int>("FormatID")).ToList();
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // update an annotation type as an Electronic Procedure Annotation Type
 | |
|         public static void UpdateAnnotationTypeAsEP(int typeID)
 | |
|         {
 | |
|             using (SqlConnection cn = Database.VEPROMS_SqlConnection)
 | |
|             {
 | |
|                 using (SqlCommand cm = cn.CreateCommand())
 | |
|                 {
 | |
|                     cm.CommandType = CommandType.Text;
 | |
|                     cm.CommandText = @"Update AnnotationTypes
 | |
| 										SET IsEPAnnotationType = 1
 | |
| 									    WHERE TypeID = @typeID";
 | |
|                     cm.Parameters.AddWithValue("@typeID", typeID);
 | |
|                     cm.CommandTimeout = Database.DefaultTimeout;
 | |
|                     cm.ExecuteNonQuery();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Returns true if there are any EP Annotation Types
 | |
|         public static bool IsEPAnnotationType()
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 using (SqlConnection cn = Database.VEPROMS_SqlConnection)
 | |
|                 {
 | |
|                     using (SqlCommand cm = cn.CreateCommand())
 | |
|                     {
 | |
|                         cm.CommandType = CommandType.Text;
 | |
|                         cm.CommandText = @"SELECT RESULT = CASE WHEN 
 | |
| 						EXISTS(SELECT 1 FROM AnnotationTypes where IsEPAnnotationType = 1) 
 | |
| 						THEN 1 ELSE 0 END";
 | |
|                         cm.CommandTimeout = Database.DefaultTimeout;
 | |
|                         using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
 | |
|                         {
 | |
|                             if (dr.Read() && dr.GetInt32("RESULT") == 1)
 | |
|                                 return true;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 // EP Support has not yet been added for this DB
 | |
|                 // IsEPAnnotationType does not exist
 | |
|                 // need to run PROMS Fixes
 | |
|                 // until then will ignore EP code
 | |
|                 // instead of crashing for a field not found
 | |
|             }
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| 
 | |
|     public class EPFields : vlnFormatList<EPField>
 | |
|     {
 | |
|         public EPFields()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public EPFields(XmlNodeList xmlNodeList) : base(xmlNodeList) { }
 | |
|     }
 | |
|     // EP field class
 | |
|     public class EPField : vlnFormatItem
 | |
|     {
 | |
|         public EPField(XmlNode xmlNode) : base(xmlNode) { }
 | |
|         public EPField() : base() { }
 | |
|         private LazyLoad<string> _name;
 | |
|         public string name
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _name, "@name");
 | |
|             }
 | |
|         }
 | |
|         private LazyLoad<string> _type;
 | |
|         public string type
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _type, "@type");
 | |
|             }
 | |
|         }
 | |
|         private LazyLoad<string> _label;
 | |
|         public string label
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 string tmp = LazyLoad(ref _label, "@label");
 | |
| 
 | |
|                 if (string.IsNullOrEmpty(tmp))
 | |
|                     return LazyLoad(ref _name, "@name");
 | |
|                 else
 | |
|                     return tmp;
 | |
|             }
 | |
|         }
 | |
|         private LazyLoad<string> _text;
 | |
|         public string text
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _text, "@text");
 | |
|             }
 | |
|         }
 | |
|         //roid of group item that individual sub-items will be the choices for the list/combobox for ROSINGLE and ROMULTI
 | |
|         private LazyLoad<string> _rosource;
 | |
|         public string rosource
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return LazyLoad(ref _rosource, "@rosource");
 | |
|             }
 | |
|         }
 | |
|         //the columns in the RO that will be included in the exports
 | |
|         private LazyLoad<string> _returncols;
 | |
|         public List<string> returncols()
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 string tmp = LazyLoad(ref _returncols, "@returncols");
 | |
| 
 | |
|                 if (string.IsNullOrEmpty(tmp))
 | |
|                     return new List<string>();
 | |
|                 else
 | |
|                     return tmp.Split(',').Select(p => p.Trim()).ToList();
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 throw new ArgumentException($"Error in returncols for EP file, field: {name}");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //number of lines for a multi-line text box to span
 | |
|         private LazyLoad<int?> _numlines;
 | |
|         public int numlines
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 int? tmp = LazyLoad(ref _numlines, "@numlines");
 | |
| 
 | |
|                 if (tmp == null)
 | |
|                     return 1;
 | |
| 
 | |
|                 return (int) tmp;
 | |
|             }
 | |
|         }
 | |
|         //step types that the EPForma Item is valid for (as a list of types)
 | |
|         private LazyLoad<string> _validforsteptypes;
 | |
|         public List<string> validforsteptypes()
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 string tmp = LazyLoad(ref _validforsteptypes, "@validforsteptypes");
 | |
|                 return tmp.Split(',').Select(p => p.Trim()).ToList();
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 throw new ArgumentException($"Error in validforsteptypes for EP file, field: {name}");
 | |
|             }
 | |
|         }
 | |
|         public bool IsValidForStepType(string StepType)
 | |
|         {
 | |
|             List<string> tmp = validforsteptypes();
 | |
|             return tmp.Contains(StepType);
 | |
|         }
 | |
| 
 | |
|         //return a list of items based on the ROsource specified in the EPFormat File
 | |
|         //will return all RO items under the Group that's roid = the rosource
 | |
|         public List<ROListItem> getROList(AnnotationInfo currAnn, bool includeblank)
 | |
|         {
 | |
|             if (string.IsNullOrEmpty(rosource))
 | |
|                 return new List<ROListItem>();
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 DocVersionInfo MyDocVersion = currAnn.MyItem.MyDocVersion;
 | |
| 
 | |
|                 if (MyDocVersion.DocVersionAssociations != null && MyDocVersion.DocVersionAssociations.Any())
 | |
|                 {
 | |
|                     ROFSTLookup lookup = MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MyDocVersion);
 | |
| 
 | |
|                     string roid = FormatRoidKey(rosource, false);
 | |
|                     rochild[] children = lookup.GetRoChildrenByRoid(roid);
 | |
| 
 | |
|                     List<ROListItem> mylist = children.Select(x => new ROListItem(x.title, x.roid.Substring(0, 12))).ToList();
 | |
|                     if (includeblank)
 | |
|                         mylist.Insert(0, new ROListItem("", ""));
 | |
| 
 | |
|                     return mylist;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     return new List<ROListItem>
 | |
|                     {
 | |
|                         new ROListItem("", "")
 | |
|                     };
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 throw new ArgumentException($"Error in rosource for EP file, field: {name}");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //return a list of values for the specified ROID
 | |
|         //given the EP items return columns
 | |
|         //will return all RO items under the Group that's roid = the rosource
 | |
|         public List<string> getROValuesList(AnnotationInfo currAnn, string roid)
 | |
|         {
 | |
|             if (string.IsNullOrEmpty(roid))
 | |
|                 return new List<string>();
 | |
| 
 | |
|             List<string> values = new List<string>();
 | |
|             DocVersionInfo MyDocVersion = currAnn.MyItem.MyDocVersion;
 | |
|             ROFSTLookup lookup = MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MyDocVersion);
 | |
|             rochild ro = lookup.GetRoChild(roid);
 | |
| 
 | |
|             List<string> rtncols = returncols();
 | |
| 
 | |
|             if (rtncols.Count == 0)
 | |
|             {
 | |
|                 values.Add(ro.value);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 foreach (string rcol in rtncols)
 | |
|                 {
 | |
|                     rochild ro_indiv = Array.Find(ro.children, x => x.appid.EndsWith($".{rcol}"));
 | |
|                     if (ro_indiv.value != null) values.Add(ro_indiv.value);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return values;
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
|     //C2025-023 - Electronic Procedures - Modifications to PROMS
 | |
|     // class to handle return of RO Lists
 | |
|     #region EPFormatFiles
 | |
|     public class ROListItem
 | |
|     {
 | |
|         public string Text { get; private set; }
 | |
|         public string Value { get; private set; }
 | |
|         public ROListItem(string _text, string _value)
 | |
|         {
 | |
|             Text = _text; Value = _value;
 | |
|         }
 | |
|     }
 | |
|     #endregion
 | |
| }
 | |
| 
 |