using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Internal; using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Data; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { //======================================================================= // Account manager - System Params. //======================================================================= partial class SbmAccountMgr_Dbas { //------------------------------------------------------------------- // Utilities. private List GetLogProperties(SbmSysParam sysParam) { return new List() { new StringPair("Id",SysId.ToString(sysParam.Id)), new StringPair("Status",sysParam.StatusCode) }; } //------------------------------------------------------------------- // Create SysParam. public override SbmSysParam CreateSysParam(Sbm.SysParamCategory sysparamCategory, String sysparamName) { return new SbmSysParam_Dbas(null, sysparamCategory, sysparamName, 0); } private SbmSysParam_Dbas CreateSysParam(SysParam_Db dbSysParam) { ClearErrorState(); SbmSysParam_Dbas sysparam = new SbmSysParam_Dbas(new SysId(dbSysParam._Id), (Sbm.SysParamCategory)dbSysParam._Cat, dbSysParam._Name, (ushort)dbSysParam._Flags); PopulateFrom(dbSysParam, sysparam); return sysparam; } //------------------------------------------------------------------- // Get SysParam. public override SbmSysParam GetSysParam(SbmSysParam.Params prm) { return GetSysParam(GetSysParamQueryFilter(prm).Concat(" AND ", "(", ")")); } private SbmSysParam GetSysParam(String filter) { ClearErrorState(); long count = GetSysParamCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple Sys Params found"); return null; } SbmSysParam sysParam = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SysParam_Db dbSysParam = new SysParam_Db(DbInfo); dbSysParam.PopulateFrom(dbCommand, aliasSysParam, filter); sysParam = CreateSysParam(dbSysParam); } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return sysParam; } //------------------------------------------------------------------- // Validate SysParam. public override bool IsValidSysParamData(SbmSysParam.Data data, SbmSysParam.ErrField errField) { ClearErrorState(); if (!base.IsValidSysParamData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert SysParam. public override bool InsertSysParam(SbmSysParam sysparam, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidSysParam(sysparam)) return false; if (SysId.IsValid(sysparam.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SysParam_Db dbSysParam = new SysParam_Db(DbInfo); PopulateTo(dbSysParam, sysparam, dbUpdateInfo); if (SysParam_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbSysParam._Id = SysId.ToInt(Database.GetNextId("SysParam", dbUpdateInfo)); } dbSysParam.ExecuteInsertCommand(dbCommand); sysparam.Id = new SysId(dbSysParam._Id); sysparam.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. {GetLogProperties(sysparam).Concat(": ").Concat("", "\n\t")}"); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update SysParam. public override bool UpdateSysParam(SbmSysParam sysparam, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidSysParam(sysparam)) return false; if (!SysId.IsValid(sysparam.Id)) return SetErrorState(ErrorMessage.InvalidItemId); if (!sysparam.Changed) { if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. {GetLogProperties(sysparam).Concat(": ").Concat("", "\n\t")}"); return true; } using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve SysParam. dbConnection.Open(); SysParam_Db dbSysParam = new SysParam_Db(DbInfo); dbSysParam.PopulateFrom(dbCommand, aliasSysParam, "Id=" + SysId.ToString(sysparam.Id)); SbmUpdateLogItemMonitor_SysParam updateLogMonitor = new SbmUpdateLogItemMonitor_SysParam(Internals, CreateSysParam(dbSysParam)); // Update properties. PopulateTo(dbSysParam, sysparam, dbUpdateInfo); dbSysParam.ExecuteUpdateCommand(dbCommand); sysparam.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. {GetLogProperties(sysparam).Concat(": ").Concat("", "\n\t")}"); // Record updates. updateLogMonitor.RecordUpdatedValues(sysparam); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete SysParam. public override bool SysParamCanBeDeleted(SbmSysParam sysparam) { ClearErrorState(); if (!base.SysParamCanBeDeleted(sysparam)) return false; return true; } public override bool DeleteSysParam(SbmSysParam sysparam, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!SysParamCanBeDeleted(sysparam)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve SysParam. dbConnection.Open(); SysParam_Db dbSysParam = new SysParam_Db(DbInfo); dbSysParam.PopulateFrom(dbCommand, aliasSysParam, "Id=" + sysparam.Id.ToString()); // Delete SysParam. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SysParam) + " WHERE Id=" + SysId.ToString(sysparam.Id) + ";"; dbCommand.ExecuteNonQuery(); sysparam.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. {GetLogProperties(sysparam).Concat(": ").Concat("", "\n\t")}"); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(SysParam_Db dbSysParam, SbmSysParam sysparam, DbUpdateInfo dbUpdateInfo) { dbSysParam._Id = sysparam.Id.ToInt(); dbSysParam._Cat = (short)sysparam.Category; dbSysParam._Name = sysparam.Name; dbSysParam._Value = sysparam.Value; dbSysParam._AffIdOwner = sysparam.AffiliateIdOwner.ToInt(); dbSysParam._AffIdTarget = sysparam.AffiliateIdTarget.ToInt(); dbSysParam._AssocId = sysparam.AssociationId.ToInt(); // Common properties. //dbSysParam._Notes = sysparam.Notes; dbSysParam._Status = SacsSystem.GetStatusCode(sysparam.Status); dbSysParam._Flags = (short)sysparam.Flags; if (!SysId.IsValid(sysparam.Id)) { dbSysParam._CreateOn = DateTime.UtcNow; dbSysParam._CreateBy = dbUpdateInfo.UserId.ToInt(); dbSysParam._CreateHost = dbUpdateInfo.Host; } dbSysParam._UpdateOn = DateTime.UtcNow; dbSysParam._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbSysParam._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(SysParam_Db dbSysParam, SbmSysParam sysparam) { //sysparam.Id = new SysId(dbSysParam._Id); sysparam.Category = (Sbm.SysParamCategory)dbSysParam._Cat; sysparam.Name = dbSysParam._Name; sysparam.Value = dbSysParam._Value; sysparam.AffiliateIdOwner = new SysId(dbSysParam._AffIdOwner ?? 0); sysparam.AffiliateIdTarget = new SysId(dbSysParam._AffIdTarget ?? 0); sysparam.AssociationId = new SysId(dbSysParam._AssocId ?? 0); // Common properties. //sysparam.Notes = dbSysParam._Notes; sysparam.Status = SacsSystem.GetStatusForCode(dbSysParam._Status); sysparam.SetCreateStamp(dbSysParam._CreateOn ?? default(DateTime), new SysId(dbSysParam._CreateBy ?? 0), dbSysParam._CreateHost); sysparam.SetUpdateStamp(dbSysParam._UpdateOn ?? default(DateTime), new SysId(dbSysParam._UpdateBy ?? 0), dbSysParam._UpdateHost); sysparam.AcceptChanges(); } //------------------------------------------------------------------- // Column definitions. private static readonly String aliasSysParam = "aSysPrm"; // Column definition population. private void SetSysParamColDfn (ColumnDfn col, String caption, int width, SbmDbDfn.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, String alias = "", String prefix = "") { if (String.IsNullOrEmpty(alias) && SbmDbDfn.GetTableForColumn(dbCol) == SbmDbDfn.TableIdx.SysParam) alias = aliasSysParam; col.Set(caption, width, (int)dbCol, prefix + SbmDbDfn.GetColumnName(dbCol, false), SbmDbDfn.GetColumnNameQual(dbCol, alias), dataType, align); if (dataType == DataValue.DataType.String && dbCol != SbmDbDfn.ColumnIdx.Unknown) col.MaxLength = (int)SbmDbDfn.GetColTextLen(dbCol); } //------------------------------------------------------------------- // Getting prmSysParam column definition. public override ColumnDfn GetSysParamColumnDfn(SbmSysParam.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SbmSysParam.Column.Pos: SetSysParamColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SbmSysParam.Column.Id: SetSysParamColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.SysParam_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // SysParam Properties. case SbmSysParam.Column.Category: SetSysParamColDfn(columnDfn, "SysParam Category", 80, SbmDbDfn.ColumnIdx.SysParam_Cat); break; case SbmSysParam.Column.Name: SetSysParamColDfn(columnDfn, "Name", 100, SbmDbDfn.ColumnIdx.SysParam_Name); break; case SbmSysParam.Column.Value: SetSysParamColDfn(columnDfn, "Value", 100, SbmDbDfn.ColumnIdx.SysParam_Value); break; // Derived properties. case SbmSysParam.Column.AffIdOwner: SetSysParamColDfn(columnDfn, "Affiliate Id Owner", 80, SbmDbDfn.ColumnIdx.SysParam_AffIdOwner, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; case SbmSysParam.Column.AffIdTarget: SetSysParamColDfn(columnDfn, "Affiliate Id Target", 80, SbmDbDfn.ColumnIdx.SysParam_AffIdTarget, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; case SbmSysParam.Column.AssocId: SetSysParamColDfn(columnDfn, "Assoc Id", 80, SbmDbDfn.ColumnIdx.SysParam_AssocId, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // Common properties. /*case SbmSysParam.Column.Notes: SetSysParamColDfn(columnDfn, "Notes", 240, SbmDbDfn.ColumnIdx.SysParam_Notes); break;*/ case SbmSysParam.Column.Status: SetSysParamColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SysParam_Status, ColumnAlignment.Center); break; case SbmSysParam.Column.Status_Desc: SetSysParamColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SysParam_Status, ColumnAlignment.Center); break; case SbmSysParam.Column.Status_Ind: SetSysParamColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SysParam_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SbmSysParam.Column.CreateOn_Date: SetSysParamColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.SysParam_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SbmSysParam.Column.UpdateOn_Date: SetSysParamColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.SysParam_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; if (width > 0) columnDfn.Width = width; return columnDfn; } //------------------------------------------------------------------- // SysParam query filter. public override List GetSysParamQueryFilter(SbmSysParam.Params prm) { List filter = new List(); // Param Id. String colSysParam_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Id, aliasSysParam); if (prm.IdsIncluded.HasValidIds()) filter.Add($"{colSysParam_Id} IN ({prm.IdsIncluded.Concat(",")})"); if (prm.IdsExcluded.HasValidIds()) filter.Add($"{colSysParam_Id} NOT IN ({prm.IdsExcluded.Concat(",")})"); // Category. String colSysParam_Cat = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Cat, aliasSysParam); if (prm.Category > 0) filter.Add($"{colSysParam_Cat}={(int)prm.Category}"); // Name. String colSysParam_Name = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Name, aliasSysParam); if (!StringUtil.IsEmpty(prm.Name)) filter.Add($"{colSysParam_Name}='{DbQuery.FormatForCondition(prm.Name)}'"); else if (!StringUtil.IsEmpty(prm.NamePartial)) filter.Add($"{colSysParam_Name} LIKE '%{DbQuery.FormatForLike(prm.NamePartial)}%'"); // Affiliate Owner Id. String colSysParam_AffIdOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_AffIdOwner, aliasSysParam); if (SysId.IsValid(prm.AffIdOwner)) filter.Add($"{colSysParam_AffIdOwner}={SysId.ToLong(prm.AffIdOwner)}"); // Affiliate Target Id. String colSysParam_AffIdTarget = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_AffIdTarget, aliasSysParam); if (SysId.IsValid(prm.AssocId)) filter.Add($"{colSysParam_AffIdTarget}={SysId.ToLong(prm.AssocId)}"); // Association Id. String colSysParam_AssocId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_AssocId, aliasSysParam); if (SysId.IsValid(prm.AssocId)) filter.Add($"{colSysParam_AssocId}={SysId.ToLong(prm.AssocId)}"); // Common Properties /* Notes. String colSysParam_Notes = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Notes, aliasSysParam); if (!StringUtil.IsEmpty(prm.NotesPartial)) filter.Add(colSysParam_Notes + " LIKE '%" + DbQuery.FormatForLike(prm.NotesPartial) + "%'"); // Status. String colSysParam_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Status, aliasSysParam); if (prm.StatusCat == SbmSysParam.StatusCat.ActiveOnly) filter.Add(colSysParam_Status + " = '" + StatusActive + "'");*/ if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } // SysParam sort columns. public List GetSysParamSortColumns(SbmSysParam.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for SysParam columns in case of conflict. String sortCol = String.Empty; if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.SysParam) { sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasSysParam); } else { sortCol = columnDfn.DataName; if (!StringUtil.IsEmpty(columnDfn.SortDataName)) sortCol = columnDfn.SortDataName; } if (!sortCol.IsEmpty()) { DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", ")); } } sortColumnNames.RemoveBlanks(); if (sortColumnNames.IsEmpty()) { // Default sort columns: sortColumnNames.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_AffIdOwner, aliasSysParam) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // SysParam count. private long GetSysParamCount(String filter) { ClearErrorState(); return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SysParam) + " As " + aliasSysParam, filter); } public override long GetSysParamCount(SbmSysParam.Params prm) { ClearErrorState(); return GetSysParamCount(GetSysParamQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // SysParam list. public override List GetSysParamList(SbmSysParam.Params prm) { ClearErrorState(); List sysParams = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SysParam), aliasSysParam); SysParam_Db dbSysParam = new SysParam_Db(DbInfo); qry.Columns.AddRange(dbSysParam.ExistingColumnNames); qry.Filters.AddRange(GetSysParamQueryFilter(prm)); qry.OrderBy.AddRange(GetSysParamSortColumns(prm)); // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging); using (DbDataReader dbDataReader = dbCommand.ExecuteReader()) { while (dbDataReader.Read()) { dbSysParam = new SysParam_Db(DbInfo); dbSysParam.PopulateFrom(dbDataReader); sysParams.Add(CreateSysParam(dbSysParam)); } } } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return sysParams; } //------------------------------------------------------------------- // SysParam query execution. public override DbResultSet ExecuteSysParamQuery(List columns, SbmSysParam.Params prm) { ClearErrorState(); //--------------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SysParam), aliasSysParam); // SysParam Properties - add columns as defined in query list. if (columns.HasId(SbmSysParam.Column.Id)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Id, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.Category)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Cat, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.Name)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Name, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.Value)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Value, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.AffIdOwner)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_AffIdOwner, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.AffIdTarget)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_AffIdTarget, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.AssocId)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_AssocId, aliasSysParam)); // Common Properties /*if (columns.HasId(SbmSysParam.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Notes, aliasSysParam));*/ if (columns.HasId(SbmSysParam.Column.Status) || columns.HasId(SbmSysParam.Column.Status_Desc) || columns.HasId(SbmSysParam.Column.Status_Ind)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_Status, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.CreateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_CreateOn, aliasSysParam)); if (columns.HasId(SbmSysParam.Column.UpdateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SysParam_UpdateOn, aliasSysParam)); //--------------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetSysParamQueryFilter(prm)); if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetSysParamSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------------- //return new DbResultSet_DataTableReader(Database, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging)); } //------------------------------------------------------------------- } //======================================================================= }