using Sarand.Net.Standard.Base.ItemOptions; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; namespace Sarand.Net.Standard.Base.ItemOptions { //======================================================================= public class SaItemOption : SacsHierarchyItem { //------------------------------------------------------------------- // Columns. public enum Column { Pos = 0, // Item Option properties. ItemType, ItemType_Desc, ItemId, Group, Name, Name_Display, Context, Context_Display, Value, Value_Display, Password, // Common properties. Notes, Status, Status_Desc, Status_Ind, CreateOn_Date, UpdateOn_Date, } //------------------------------------------------------------------- /// Properties other than common. public class DataProperties { public ItemId ItemId { get; set; } = new ItemId(); public String Name { get; set; } = String.Empty; public String Context { get; set; } = String.Empty; public String Value { get; set; } = String.Empty; } //------------------------------------------------------------------- // Data. public new class Data : SacsHierarchyItem.Data { // Data members. private readonly DataProperties data = new DataProperties(); // Construction. public Data () { Status = SaItemOptionMgr.ActiveItemOptionStatus; } // Properties. public ItemId ItemId { get { return data.ItemId; } set { CheckChanged(data.ItemId, value); data.ItemId = value; } } public String Name { get { return data.Name; } set { CheckChanged(data.Name, value); data.Name = value; } } public String Context { get { return data.Context; } set { CheckChanged(data.Context, value); data.Context = value; } } public String Value { get { return data.Value; } set { CheckChanged(data.Value, value); data.Value = value; } } // Population. internal void PopulateFrom (Data data) { ItemId = data.ItemId; Name = data.Name; Context = data.Context; Value = data.Value; base.PopulateFrom(data); } public Data Clone () { Data data = new Data(); data.PopulateFrom(this); return data; } } //------------------------------------------------------------------- // Error field - identify properties with validation error. public new class ErrField : SacsHierarchyItem.ErrField { // Identifies the field that has invalid data. public ValidValue ItemType { get; set; } = ValidValue.Valid; public ValidValue ItemId { get; set; } = ValidValue.Valid; public ValidValue Name { get; set; } = ValidValue.Valid; public ValidValue Context { get; set; } = ValidValue.Valid; public ValidValue Value { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- // Data members. private readonly Data data = new Data(); // Flags. public static readonly Byte Flag_Encrypted = 0x01; //------------------------------------------------------------------- // Construction. public SaItemOption (ItemId itemId, String name, String context) : base() { base.SetData(data); ItemId = itemId; Name = name; // Trim Context as legacy systems (Sapphire, StockMgr, PatientMgr) store a space instead of a blank value. Context = context.TrimAll(); Status = SaItemOptionMgr.ActiveItemOptionStatus; } //------------------------------------------------------------------- // Statuses. private static readonly List validStatuses = new List() { SaStatus.Current, SaStatus.Deleted }; public static SaStatus DefaultStatus { get { return ActiveStatus; } } public static SaStatus ActiveStatus { get { return SaStatus.Current; } } public static List ValidStatuses { get { return new List(validStatuses); } } public static DataValue.TriStateType GetStatusTriState (SaStatus status) { switch (status) { case SaStatus.Current: return DataValue.TriStateType.Green; case SaStatus.Deleted: return DataValue.TriStateType.Purple; } return DataValue.TriStateType.Unknown; } //------------------------------------------------------------------- // Properties. public Data GetData () { return data.Clone(); } public void SetData (Data data) { // Properties that cannot be changed if previously specified. if (ItemId.Type >= 0 && ItemId.Type != data.ItemId.Type) throw new NotSupportedException($"{SysUtil.Fn} Item type cannot be changed"); if (SysId.IsValid(ItemId.Id) && SysId.ToInt(ItemId.Id) != SysId.ToInt(data.ItemId.Id)) throw new NotSupportedException($"{SysUtil.Fn} Item Id cannot be changed"); if (!StringUtil.IsEmpty(Name) && !Name.Equals(data.Name)) throw new NotSupportedException($"{SysUtil.Fn} Name cannot be changed"); if (!StringUtil.IsEmpty(Context) && !Context.Equals(data.Context)) throw new NotSupportedException($"{SysUtil.Fn} Context cannot be changed"); // Populate individual properties to ensure that 'Changed' indicator is kept up to date. this.data.PopulateFrom(data); } public ItemId ItemId { get { return data.ItemId; } protected set { data.ItemId = value; } } public String Name { get { return data.Name; } protected set { data.Name = value; } } public String Context { get { return data.Context; } protected set { data.Context = value; } } public String Value { get { return data.Value; } set { data.Value = value; } } //------------------------------------------------------------------- // Flags. public bool Encrypted { get { return GetFlag(Flag_Encrypted); } set { SetFlag(Flag_Encrypted, value); } } //------------------------------------------------------------------- // List parameters. public enum StatusCat { Any, NotDeleted, CurrentOnly, DeletedOnly, } /// /// Item list parameters. /// public new class Params : SacsHierarchyItem.Params { public List IncludedItemIds { get; } = new List(); public List IncludedNameContexts { get; } = new List(); public StatusCat StatusCat { get; set; } = StatusCat.CurrentOnly; } //------------------------------------------------------------------- /// /// Item option cache - to allow op. /// public class Cache { public Cache () { } public ItemId ItemId { get; private set; } = new ItemId(); public ItemId ItemIdRef { get; private set; } = new ItemId(); public List ItemOptions { get; } = new List(); public void Reset (ItemId itemId, ItemId itemIdRef) { ItemId = itemId != null ? itemId : new ItemId(); ItemIdRef = itemIdRef != null ? itemIdRef : new ItemId(); ItemOptions.Clear(); } public void Clear () { ItemId = new ItemId(); ItemIdRef = new ItemId(); ItemOptions.Clear(); } } //------------------------------------------------------------------- } //======================================================================= /// /// Item Option list utilities. /// public static class SaItemOptionList { /// Does the list include an option for the specified name and context. public static bool IsOptionDefined (this List options, String name, String context) { return options.Exists(item => item.Name.EqualsCI(name) && item.Context.EqualsCI(context) && !item.IsStatusDeleted); } /// Retrieve the list of contexts populated for the specified option name. public static List GetContextsForName (this List options, String name) { List optionContexts = new List(); foreach (SaItemOption itemOption in options.FindAll(item => item.Name.EqualsCI(name) && !item.IsStatusDeleted)) { if (!StringUtil.IsEmpty(itemOption.Context) && !optionContexts.ContainsCI(itemOption.Context)) optionContexts.Add(itemOption.Context); } return optionContexts; } /// Retrieve the option value for the name and context. public static String GetOptionValue (this List options, String name, String context, String defaultValue = "") { SaItemOption itemOption = options.Find(item => item.Name.EqualsCI(name) && item.Context.EqualsCI(context) && !item.IsStatusDeleted); if (itemOption != null) return itemOption.Value; return defaultValue; } } //======================================================================= }