using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using DTS.Common.Storage; using DTS.Common.Utilities.Logging; using ISO.Strings; using DTS.Common.Classes.LabratoryDetails; using DTS.Common.Interface.TestMetaData; // ReSharper disable CheckNamespace namespace DTS.Common.ISO { [Serializable()] public class LabratoryDetails : LabratoryDetailsDbRecord //: ISerializableFile { #region enums private enum Fields { Name, LaboratoryName, LaboratoryContactName, LaboratoryContactPhone, LaboratoryContactFax, LaboratoryContactEmail, LaboratoryTestRefNumber, LaboratoryProjectRefNumber, LastModified, LastModifiedBy, LocalOnly, Version }; #endregion enums #region Properties public new string LabratoryContactPhone { get => base.LabratoryContactPhone; set { if (value != string.Empty) { base.LabratoryContactPhone = value; } } } public new string LabratoryContactFax { get => base.LabratoryContactFax; set { if (value != string.Empty) { base.LabratoryContactFax = value; } } } public new string LabratoryContactEmail { get => base.LabratoryContactEmail; set { if (value != string.Empty) { base.LabratoryContactEmail = value; } } } #endregion Properties #region XML public void WriteXML(ref System.Xml.XmlWriter writer) { writer.WriteStartElement("LabDetail"); var fields = Enum.GetValues(typeof(Fields)).Cast().ToArray(); foreach (var field in fields) { writer.WriteStartElement(field.ToString()); switch (field) { case Fields.LaboratoryContactEmail: writer.WriteString(LabratoryContactEmail); break; case Fields.LaboratoryContactFax: writer.WriteString(LabratoryContactFax); break; case Fields.LaboratoryContactName: writer.WriteString(LabratoryContactName); break; case Fields.LaboratoryContactPhone: writer.WriteString(LabratoryContactPhone); break; case Fields.LaboratoryName: writer.WriteString(LabratoryName); break; case Fields.LaboratoryTestRefNumber: writer.WriteString(LabratoryTestRefNumber); break; case Fields.LaboratoryProjectRefNumber: writer.WriteString(LabratoryProjectRefNumber); break; case Fields.LastModified: writer.WriteString(LastModified.ToString(System.Globalization.CultureInfo.InvariantCulture)); break; case Fields.LastModifiedBy: writer.WriteString(LastModifiedBy); break; case Fields.LocalOnly: writer.WriteString(LocalOnly.ToString()); break; case Fields.Name: writer.WriteString(Name); break; case Fields.Version: writer.WriteString(Version.ToString(System.Globalization.CultureInfo.InvariantCulture)); break; default: throw new NotSupportedException("LabratoryDetails::WriteXML unsupported field: " + field.ToString()); } writer.WriteEndElement(); } writer.WriteEndElement(); } public static LabratoryDetails ReadXML(System.Xml.XmlElement root) { var l = new LabratoryDetails(); foreach (var node in root.ChildNodes) { if (node is System.Xml.XmlElement) { ProcessXMLElement(node as System.Xml.XmlElement, ref l); } } return l; } private static void ProcessXMLElement(System.Xml.XmlElement node, ref LabratoryDetails lab) { if (Enum.TryParse(node.Name, out Fields field)) { switch (field) { case Fields.Version: lab.Version = int.Parse(node.InnerText, System.Globalization.CultureInfo.InvariantCulture); break; case Fields.Name: lab.Name = node.InnerText; break; case Fields.LocalOnly: lab.LocalOnly = Convert.ToBoolean(node.InnerText); break; case Fields.LastModifiedBy: lab.LastModifiedBy = node.InnerText; break; case Fields.LastModified: lab.LastModified = DateTime.Parse(node.InnerText, System.Globalization.CultureInfo.InvariantCulture); break; case Fields.LaboratoryTestRefNumber: lab.LabratoryTestRefNumber = node.InnerText; break; case Fields.LaboratoryProjectRefNumber: lab.LabratoryProjectRefNumber = node.InnerText; break; case Fields.LaboratoryName: lab.LabratoryName = node.InnerText; break; case Fields.LaboratoryContactPhone: lab.LabratoryContactPhone = node.InnerText; break; case Fields.LaboratoryContactName: lab.LabratoryContactName = node.InnerText; break; case Fields.LaboratoryContactFax: lab.LabratoryContactFax = node.InnerText; break; case Fields.LaboratoryContactEmail: lab.LabratoryContactEmail = node.InnerText; break; default: throw new NotSupportedException("LabratoryDetails::ProcessXMLElement unsupported field: " + field.ToString()); } } } #endregion XML public static LabratoryDetails GetLabratoryDetails(string name) { try { var errorNumber = DbOperations.LabratoryDetailsGet(name, out ILabratoryDetailsDbRecord[] labratoryDetailsDbRecords); if (0 == errorNumber && null != labratoryDetailsDbRecords && labratoryDetailsDbRecords.Any()) { return new LabratoryDetails(labratoryDetailsDbRecords[0]); } } catch (Exception ex) { APILogger.Log("Failed to retrieve lab details", name, ex); } return null; } public static void DeleteLabratoryDetails() { try { var errorNumber = DbOperations.LabratoryDetailsDelete(null, out string errorMessage); if (errorNumber != 0) { APILogger.Log("Failed to delete labratory details", errorMessage); } } catch (Exception ex) { APILogger.Log("Failed to delete laboratory details", ex); } } public LabratoryDetails() { } public LabratoryDetails(LabratoryDetails copy) { Name = copy.Name; LabratoryName = copy.LabratoryName; LabratoryContactName = copy.LabratoryContactName; LabratoryContactPhone = copy.LabratoryContactPhone; LabratoryContactFax = copy.LabratoryContactFax; LabratoryContactEmail = copy.LabratoryContactEmail; LabratoryTestRefNumber = copy.LabratoryTestRefNumber; LabratoryProjectRefNumber = copy.LabratoryProjectRefNumber; LastModified = copy.LastModified; LastModifiedBy = copy.LastModifiedBy; LocalOnly = copy.LocalOnly; Version = copy.Version; } public LabratoryDetails(ILabratoryDetailsDbRecord labratoryDetailsDbRecord) : base(labratoryDetailsDbRecord) { } public static LabratoryDetails[] GetAllLabratoryDetails() { var labs = new List(); try { var errorNumber = DbOperations.LabratoryDetailsGet(null, out ILabratoryDetailsDbRecord[] labratoryDetailsDbRecords); if (errorNumber == 0) { foreach (var labratoryDetailDbRecord in labratoryDetailsDbRecords) { try { var cd = new LabratoryDetails(labratoryDetailDbRecord); if (!cd.IsInvalidBlank()) { labs.Add(cd); } } catch (Exception ex) { APILogger.Log("failed to get labratory details", ex); } } } } catch (Exception ex) { APILogger.Log("Failed to retreive laboratory details", ex); } return labs.ToArray(); } public void Delete(string user) { try { var errorNumber = DbOperations.LabratoryDetailsDelete(Name, out string errorMessage); if (errorNumber != 0) { APILogger.Log("Failed to delete labratory details", errorMessage); } } catch (Exception ex) { APILogger.Log("failed to update laboratory", Name, ex); } } public void Commit(string user) { try { if (IsInvalidBlank()) { throw new NullReferenceException(StringResources.LabDetails_NullReferenceName); } var labratoryDetailsDbRecord = new LabratoryDetailsDbRecord(this); labratoryDetailsDbRecord.LastModified = DateTime.Now; labratoryDetailsDbRecord.LastModifiedBy = user; var errorNumber = DbOperations.LabratoryDetailsUpdateInsert(labratoryDetailsDbRecord, out string errorMessage); if (errorNumber == 0) return; APILogger.Log("failed to commit laboratory", Name, errorMessage); } catch (Exception ex) { APILogger.Log(StringResources.LabDetails_FailedToCommit, Name, ex); throw ex; } } } }