using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sarand.BusinessMgr.Net.Standard.Base.Bus.Control { //======================================================================= public class SbmcUserAccount : SbmcHierarchyItem { //------------------------------------------------------------------- // Columns. public enum Column { Hidden, Pos, // User Account. Id, EmailAddress, DisplayName, Title, FirstName, LastName, Initials, PhoneMain, PhoneMobile, PhoneAlt, // Security. LastLoginOn, LastLoginAt, LastInvalidLoginOn, LastInvalidLoginAt, InvalidLoginCount, // Common. Notes, Flag, Status, Status_Ind, Status_Desc, CreateOn_Date, UpdateOn_Date, } //------------------------------------------------------------------- /// Properties other than common. public class DataProperties { public String EmailAddress { get; set; } = ""; public String Title { get; set; } = ""; public String FirstName { get; set; } = ""; public String Initials { get; set; } = ""; public String LastName { get; set; } = ""; public String PhoneMain { get; set; } = ""; public String PhoneMobile { get; set; } = ""; public String PhoneAlt { get; set; } = ""; public String PasswordToken { get; set; } public String PasswordHashed { get; set; } = ""; public List PasswordHistory { get; } = new List(); public DateTime? PasswordChangedAt { get; set; } public DateTime? LastLoginAt { get; set; } public DateTime? LastInvalidLoginAt { get; set; } public short InvalidLoginCount { get; set; } } //------------------------------------------------------------------- // Data. public new class Data : SacsHierarchyItem.Data { // Data members. private readonly DataProperties data = new DataProperties(); // Construction. public Data() { //Status = SbmAccountMgr.AffiliateStatusDefault; } public String EmailAddress { get { return data.EmailAddress; } set { CheckChanged(data.EmailAddress, value); data.EmailAddress = value; } } public String Title { get { return data.Title; } set { CheckChanged(data.Title, value); data.Title = value; } } public String FirstName { get { return data.FirstName; } set { CheckChanged(data.FirstName, value); data.FirstName = value; } } public String Initials { get { return data.Initials; } set { CheckChanged(data.Initials, value); data.Initials = value; } } public String LastName { get { return data.LastName; } set { CheckChanged(data.LastName, value); data.LastName = value; } } public String PhoneMain { get { return data.PhoneMain; } set { CheckChanged(data.PhoneMain, value); data.PhoneMain = value; } } public String PhoneMobile { get { return data.PhoneMobile; } set { CheckChanged(data.PhoneMobile, value); data.PhoneMobile = value; } } public String PhoneAlt { get { return data.PhoneAlt; } set { CheckChanged(data.PhoneAlt, value); data.PhoneAlt = value; } } public String PasswordToken { get { return data.PasswordToken; } set { CheckChanged(data.PasswordToken, value); data.PasswordToken = value; } } public String PasswordHashed { get { return data.PasswordHashed; } set { CheckChanged(data.PasswordHashed, value); data.PasswordHashed = value; } } public List PasswordHistory { get { return data.PasswordHistory; } set { CheckChanged(data.PasswordHistory, value); data.PasswordHistory.Clear(); data.PasswordHistory.AddRange((value ?? new List()).FindAll(item => !StringUtil.IsEmpty(StringUtil.TrimAll(item)))); } } public DateTime? PasswordChangedAt { get { return data.PasswordChangedAt; } set { CheckChangedNullable(data.PasswordChangedAt, value); data.PasswordChangedAt = value; } } public DateTime? LastLoginAt { get { return data.LastLoginAt; } set { CheckChangedNullable(data.LastLoginAt, value); data.LastLoginAt = value; } } public DateTime? LastInvalidLoginAt { get { return data.LastInvalidLoginAt; } set { CheckChangedNullable(data.LastInvalidLoginAt, value); data.LastInvalidLoginAt = value; } } public short InvalidLoginCount { get { return data.InvalidLoginCount; } set { CheckChanged(data.InvalidLoginCount, value); data.InvalidLoginCount = value; } } internal void PopulateFrom(Data data) { EmailAddress = data.EmailAddress; Title = data.Title; LastName = data.LastName; Initials = data.Initials; FirstName = data.FirstName; PhoneMain = data.PhoneMain; PhoneMobile = data.PhoneMobile; PhoneAlt = data.PhoneAlt; PasswordToken = data.PasswordToken; PasswordHashed = data.PasswordHashed; PasswordHistory = data.PasswordHistory; PasswordChangedAt = data.PasswordChangedAt; LastLoginAt = data.LastLoginAt; LastInvalidLoginAt = data.LastInvalidLoginAt; InvalidLoginCount = data.InvalidLoginCount; base.PopulateFrom(data); } public Data Clone() { Data data = new Data(); data.PopulateFrom(this); return data; } } public new class ErrField : SacsHierarchyItem.ErrField { // Identifies the field that has invalid data. public ValidValue EmailAddress { get; set; } = ValidValue.Valid; public ValidValue Title { get; set; } = ValidValue.Valid; public ValidValue FirstName { get; set; } = ValidValue.Valid; public ValidValue Initials { get; set; } = ValidValue.Valid; public ValidValue LastName { get; set; } = ValidValue.Valid; public ValidValue PhoneMain { get; set; } = ValidValue.Valid; public ValidValue PhoneMobile { get; set; } = ValidValue.Valid; public ValidValue PhoneAlt { get; set; } = ValidValue.Valid; public ValidValue PasswordToken { get; set; } = ValidValue.Valid; public ValidValue PasswordHashed { get; set; } = ValidValue.Valid; public ValidValue PasswordHistory { get; set; } = ValidValue.Valid; public ValidValue PasswordChangedAt { get; set; } = ValidValue.Valid; public ValidValue LastLoginAt { get; set; } = ValidValue.Valid; public ValidValue LastInvalidLoginAt { get; set; } = ValidValue.Valid; public ValidValue InvalidLoginCount { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- // Data members. private readonly Data data = new Data(); public static readonly String PasswordHistoryDelim = ","; public static readonly Byte Flag_KeepLoggedIn = 0x01; //------------------------------------------------------------------- // Construction. protected SbmcUserAccount(SysId id) : base(id) { base.SetData(data); Status = DefaultStatus; } //------------------------------------------------------------------- // Affiliate status. private static readonly List affiliateStatuses = new List() { SaStatus.Active, SaStatus.Inactive, SaStatus.Deleted, }; public static SaStatus DefaultStatus { get { return SaStatus.Active; } } public static List ValidStatuses { get { return new List(affiliateStatuses); } } public static DataValue.TriStateType GetStatusTriState(SaStatus status) { switch (status) { case SaStatus.Active: return DataValue.TriStateType.Green; case SaStatus.Inactive: return DataValue.TriStateType.Red; case SaStatus.Deleted: return DataValue.TriStateType.Purple; } return DataValue.TriStateType.Unknown; } //------------------------------------------------------------------- // Utilities. //------------------------------------------------------------------- // Properties. public Data GetData() { return data.Clone(); } public void SetData(Data data) { // Properties that cannot be changed if previously specified. if (SysId.IsValid(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id)) throw new NotSupportedException($"{SysUtil.Fn} Id cannot be changed"); // Populate individual properties to ensure that 'Changed' indicator is kept up to date. this.data.PopulateFrom(data); } //------------------------------------------------------------------- // Properties. public String EmailAddress { get { return data.EmailAddress; } set { data.EmailAddress = value; } } // Name. public String Title { get { return data.Title; } set { data.Title = value; } } public String FirstName { get { return data.FirstName; } set { data.FirstName = value; } } public String Initials { get { return data.Initials; } set { data.Initials = value; } } public String LastName { get { return data.LastName; } set { data.LastName = value; } } public String GetFullName(String title, String first, String last) { // <FirstName> <LastName>: List<String> Names = new List<string>(); Names.Add(title); Names.Add(first); Names.Add(last); return Names.Concat(" ", null, null, true, true); } public String GetFullName() { return GetFullName(Title, FirstName, LastName); } public static String GetDisplayName(String firstName, String lastName) { // <LastName>, <FirstName>. List<String> Names = new List<string>(); Names.Add(lastName); Names.Add(firstName); Names.RemoveBlanks(); return Names.Concat(", "); } public String GetDisplayName() { return GetDisplayName(FirstName, LastName); } // Phone numbers. public String PhoneMain { get { return data.PhoneMain; } set { data.PhoneMain = value; } } public String PhoneMobile { get { return data.PhoneMobile; } set { data.PhoneMobile = value; } } public String PhoneAlt { get { return data.PhoneAlt; } set { data.PhoneAlt = value; } } // Security. public String PasswordToken { get { return data.PasswordToken; } set { data.PasswordToken = value; } } public String PasswordHashed { get { return data.PasswordHashed; } set { data.PasswordHashed = value; } } public List<String> PasswordHistory { get { return data.PasswordHistory; } set { data.PasswordHistory = value; } } public DateTime? PasswordChangedAt { get { return data.PasswordChangedAt; } set { data.PasswordChangedAt = value; } } public DateTime? LastLoginAt { get { return data.LastLoginAt; } set { data.LastLoginAt = value; } } public DateTime? LastInvalidLoginAt { get { return data.LastInvalidLoginAt; } set { data.LastInvalidLoginAt = value; } } public short InvalidLoginCount { get { return data.InvalidLoginCount; } set { data.InvalidLoginCount = value; } } //------------------------------------------------------------------- // Flags. public bool KeepLoggedIn { get { return GetFlag(Flag_KeepLoggedIn); } set { SetFlag(Flag_KeepLoggedIn, value); } } //------------------------------------------------------------------- // Associated data. //------------------------------------------------------------------- // List parameters. /// <summary> Status filter options.</summary> public enum StatusCat { Any, ActiveOnly, InactiveOnly, NotDeleted, DeletedOnly, } /// <summary>Parameters - used to define the filters that should be applied to a list of items.</summary> public new class Params : SacsHierarchyItem.Params { // List filtering. public HashSet<SysId> IdsIncluded { get; } = new HashSet<SysId>(); public HashSet<SysId> IdsExcluded { get; } = new HashSet<SysId>(); /// <summary>Generic search value - email, name, phone etc.</summary> public String Search { get; set; } public String Name { get; set; } public String NamePartial { get; set; } public String EmailAddress { get; set; } public String EmailAddressPartial { get; set; } public String NotesPartial { get; set; } /// <summary>Contact status.</summary> public StatusCat StatusCat { get; set; } = StatusCat.NotDeleted; } } //======================================================================= // Item list. public static class SbmcUserAccountList { } //======================================================================= }