using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.ReferenceData; using Sarand.Net.Standard.Dbas.ReferenceData.Internal; using Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.App; namespace Sarand.Net.Standard.Dbas.ReferenceData { //======================================================================= // Reference Data manager - Currencies. //======================================================================= internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr { //------------------------------------------------------------------- // Create Currency. public override SaCurrency CreateCurrency() { ClearErrorState(); return new SaCurrency_Dbas(null, 0); } private SaCurrency_Dbas CreateCurrency(Currency_Db dbCurrency) { ClearErrorState(); SaCurrency_Dbas currency = new SaCurrency_Dbas(new SysId(dbCurrency._Id), 0); PopulateFrom(dbCurrency, currency); return currency; } private SaCurrency CreateCurrency(DbDataReader dataReader) { Currency_Db dbCurrency = new Currency_Db(DbInfo); dbCurrency.PopulateFrom(dataReader); return CreateCurrency(dbCurrency); } //------------------------------------------------------------------- // Currency exists. public override bool CurrencyExistsById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return false; return GetCurrencyCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Id, aliasCurrency) + "=" + SysId.ToString(id)) == 1; } public override bool CurrencyExistsByCode(string code) { ClearErrorState(); if (StringUtil.IsEmpty(code)) return false; return GetCurrencyCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency) + "='" + DbQuery.FormatForCondition(code) + "'") == 1; } //------------------------------------------------------------------- // Get Currency. public override SaCurrency GetCurrency(SaCurrency.Params prm) { return GetCurrency(GetCurrencyQueryFilter(prm).Concat(" AND ", "(", ")")); } private SaCurrency GetCurrency(String filter) { ClearErrorState(); long count = GetCurrencyCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState(ErrorMessage.MultipleItemsFound); return null; } SaCurrency currency = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Currency_Db dbCurrency = new Currency_Db(DbInfo); dbCurrency.PopulateFrom(dbCommand, aliasCurrency, filter); currency = CreateCurrency(dbCurrency); } catch (Exception exc) { SetErrorState(ErrorMessage.DatabaseQueryException); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return currency; } public override SaCurrency GetCurrencyById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return null; return GetCurrency("Id=" + SysId.ToString(id)); } public override SaCurrency GetCurrencyByCode(string code) { ClearErrorState(); if (StringUtil.IsEmpty(code)) return null; return GetCurrency("Code='" + DbQuery.FormatForCondition(code) + "'"); } //------------------------------------------------------------------- // Validate Currency. public override bool IsValidCurrencyData(SaCurrency.Data data, SaCurrency.ErrField errField) { ClearErrorState(); if (!base.IsValidCurrencyData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert item. public override bool InsertCurrency(SaCurrency currency, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidCurrency(currency)) return false; if (SysId.IsValid(currency.Id)) return SetErrorState(ErrorMessage.ValidItemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Currency_Db dbCurrency = new Currency_Db(DbInfo); PopulateTo(dbCurrency, currency, dbUpdateInfo); if (Currency_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbCurrency._Id = SysId.ToInt(Database.GetNextId("Currency", dbUpdateInfo)); } dbCurrency.ExecuteInsertCommand(dbCommand); currency.Id = new SysId(dbCurrency._Id); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Update item. public override bool UpdateCurrency(SaCurrency currency, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidCurrency(currency)) return false; if (!SysId.IsValid(currency.Id)) return SetErrorState(ErrorMessage.InvalidItemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve item. dbConnection.Open(); Currency_Db dbCurrency = new Currency_Db(DbInfo); dbCurrency.PopulateFrom(dbCommand, aliasCurrency, "Id=" + SysId.ToString(currency.Id)); SaUpdateLogItemMonitor_Currency updateLogMonitor = new SaUpdateLogItemMonitor_Currency(ReferenceDataConsole, CreateCurrency(dbCurrency), dbUpdateInfo); // Update item. PopulateTo(dbCurrency, currency, dbUpdateInfo); dbCurrency.ExecuteUpdateCommand(dbCommand); // Record updates. updateLogMonitor.RecordUpdatedValues(currency); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Delete item. public override bool CurrencyCanBeDeleted(SaCurrency currency) { ClearErrorState(); if (!base.CurrencyCanBeDeleted(currency)) return false; return true; } public override bool DeleteCurrency(SaCurrency currency, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!CurrencyCanBeDeleted(currency)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve item. dbConnection.Open(); Currency_Db dbCurrency = new Currency_Db(DbInfo); dbCurrency.PopulateFrom(dbCommand, aliasCurrency, "Id=" + currency.Id.ToString()); // Delete item. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + ReferenceDataConsole.TableName_Currency + " WHERE Id=" + SysId.ToString(currency.Id) + ";"; dbCommand.ExecuteNonQuery(); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(Currency_Db dbCurrency, SaCurrency currency, DbUpdateInfo dbUpdateInfo) { dbCurrency._Id = currency.Id.ToInt(); dbCurrency._Code = currency.Code; dbCurrency._Name = currency.Name; dbCurrency._Primary = SysId.ToInt(currency.CurrencyIdPrimary); dbCurrency._Division = currency.Division; dbCurrency._Region = SysId.ToInt(currency.RegionId); dbCurrency._Symbol = currency.Symbol; dbCurrency._Suffix = currency.SuffixSymbol; dbCurrency._IncSpace = currency.IncludeSpace; dbCurrency._Decimals = (short)currency.Decimals; // Common properties. /* dbCurrency._Notes = currency.Notes; dbCurrency._Status = SacsSystem.GetStatusCode(currency.Status); dbCurrency._Flags = (short)currency.Flags; */ if (!SysId.IsValid(currency.Id)) { dbCurrency._CreateOn = DateTime.UtcNow; dbCurrency._CreateBy = dbUpdateInfo.UserId.ToInt(); dbCurrency._CreateHost = dbUpdateInfo.Host; } dbCurrency._UpdateOn = DateTime.UtcNow; dbCurrency._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbCurrency._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(Currency_Db dbCurrency, SaCurrency currency) { //currency.Id = new SysId(dbCurrency._Id); currency.Code = dbCurrency._Code; currency.Name = dbCurrency._Name; currency.CurrencyIdPrimary = new SysId(dbCurrency._Primary); currency.Division = dbCurrency._Division; currency.RegionId = new SysId(dbCurrency._Region); currency.Symbol = dbCurrency._Symbol; currency.SuffixSymbol = dbCurrency._Suffix; currency.IncludeSpace = dbCurrency._IncSpace; currency.Decimals = (ushort)dbCurrency._Decimals; // Common properties. /* currency.Notes = dbCurrency._Notes; currency.Status = SacsSystem.GetStatusForCode(dbCurrency._Status); */ currency.SetCreateStamp(dbCurrency._CreateOn, new SysId(dbCurrency._CreateBy), dbCurrency._CreateHost); currency.SetUpdateStamp(dbCurrency._UpdateOn, new SysId(dbCurrency._UpdateBy), dbCurrency._UpdateHost); currency.AcceptChanges(); } //------------------------------------------------------------------- // Currency column definitions. private static readonly String aliasCurrency = "aCur"; private void SetCurrencyColDfn (ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, String alias = "", String prefix = "") { if (String.IsNullOrEmpty(alias) && SaReferenceDataDbDfn.GetTableForColumn(dbCol) == SaReferenceDataDbDfn.TableIdx.Currency) alias = aliasCurrency; col.Set(caption, width, (int)dbCol, prefix + SaReferenceDataDbDfn.GetColumnName(dbCol, false), SaReferenceDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align); if (dataType == DataValue.DataType.String && dbCol != SaReferenceDataDbDfn.ColumnIdx.Unknown) col.MaxLength = (int)SaReferenceDataDbDfn.GetColTextLen(dbCol); } //------------------------------------------------------------------- // Getting currency column definition. public override ColumnDfn GetCurrencyColumnDfn(SaCurrency.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SaCurrency.Column.Pos: SetCurrencyColDfn(columnDfn, "Pos", 45, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SaCurrency.Column.Id: SetCurrencyColDfn(columnDfn, "Id", 60, SaReferenceDataDbDfn.ColumnIdx.Currency_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // Currency Properties. case SaCurrency.Column.Code: SetCurrencyColDfn(columnDfn, "Code", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Code); break; case SaCurrency.Column.Name: SetCurrencyColDfn(columnDfn, "Name", 100, SaReferenceDataDbDfn.ColumnIdx.Currency_Name); break; case SaCurrency.Column.PrimaryCurrencyId: SetCurrencyColDfn(columnDfn, "Primary", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Primary, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.NumDecimals = 3; break; case SaCurrency.Column.Division: SetCurrencyColDfn(columnDfn, "Division", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Division, ColumnAlignment.Center); columnDfn.NumDecimals = 3; break; case SaCurrency.Column.RegionId: SetCurrencyColDfn(columnDfn, "Region Id", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Region, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.NumDecimals = 3; break; case SaCurrency.Column.Symbol: SetCurrencyColDfn(columnDfn, "Symbol", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_Symbol, ColumnAlignment.Center); columnDfn.NumDecimals = 3; break; case SaCurrency.Column.SuffixSymbol_Y: SetCurrencyColDfn(columnDfn, "Suffix", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_Suffix, ColumnAlignment.Center); columnDfn.NumDecimals = 3; break; case SaCurrency.Column.IncludeSpace_Y: SetCurrencyColDfn(columnDfn, "Include Space", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_IncSpace, ColumnAlignment.Center); columnDfn.NumDecimals = 3; break; case SaCurrency.Column.Decimals: SetCurrencyColDfn(columnDfn, "Decimals", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_Decimals, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.NumDecimals = 3; break; // Common properties. case SaCurrency.Column.CreateOn_Date: SetCurrencyColDfn(columnDfn, "Created", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SaCurrency.Column.UpdateOn_Date: SetCurrencyColDfn(columnDfn, "Updated", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_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; } //------------------------------------------------------------------- // Currency query filter. public override List GetCurrencyQueryFilter(SaCurrency.Params prm) { List filter = new List(); // Currency Id. String colCurrency_Id = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Id, aliasCurrency); if (prm.IdsIncluded.HasValidIds()) filter.Add($"{colCurrency_Id} IN ({prm.IdsIncluded.Concat(",")})"); if (prm.IdsExcluded.HasValidIds()) filter.Add($"{colCurrency_Id} NOT IN ({prm.IdsExcluded.Concat(",")})"); // Code. String colCurrency_Code = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency); if (!StringUtil.IsBlank(prm.Code)) filter.Add($"{colCurrency_Code}='{DbQuery.FormatForCondition(prm.Code)}'"); else if (!StringUtil.IsBlank(prm.CodePartial)) filter.Add($"{colCurrency_Code} LIKE '%{DbQuery.FormatForLike(prm.CodePartial)}%'"); // Name. String colCurrency_Name = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Name, aliasCurrency); if (!StringUtil.IsBlank(prm.Name)) filter.Add($"{colCurrency_Name}='{DbQuery.FormatForCondition(prm.Name)}'"); else if (!StringUtil.IsBlank(prm.NamePartial)) filter.Add($"{colCurrency_Name} LIKE '%{DbQuery.FormatForLike(prm.NamePartial)}%'"); // RegionId. String colCurrency_Region = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Region, aliasCurrency); if (SysId.IsValid(prm.RegionId)) filter.Add($"{colCurrency_Region}={SysId.ToLong(prm.RegionId)}"); // Status - no status on currency. if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } // Currency sort columns. public List GetCurrencySortColumns(SaCurrency.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for Currency columns in case of conflict. String sortCol = String.Empty; if (SaReferenceDataDbDfn.GetTableForColumn((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaReferenceDataDbDfn.TableIdx.Currency) { sortCol = SaReferenceDataDbDfn.GetColumnNameQual((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasCurrency); } 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(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // Currency count. private long GetCurrencyCount(String filter) { ClearErrorState(); return Database.GetRowCount($"{ReferenceDataConsole.TableName_Currency} As {aliasCurrency}", filter); } public override long GetCurrencyCount(SaCurrency.Params prm) { ClearErrorState(); return GetCurrencyCount(GetCurrencyQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Currency list. public override List GetCurrencyList(SaCurrency.Params prm) { ClearErrorState(); List currencies = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(ReferenceDataConsole.TableName_Currency, aliasCurrency); // NB Can't use raw columns names as 'Primary' is a reserved word. // So don't add any columns and set default to 'Select * From Currency'. Currency_Db dbCurrency = new Currency_Db(DbInfo); //qry.Columns.AddRange(dbCurrency.ExistingColumnNames); qry.Filters.AddRange(GetCurrencyQueryFilter(prm)); qry.OrderBy.AddRange(GetCurrencySortColumns(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()) currencies.Add(CreateCurrency(dbDataReader)); } } catch (Exception exc) { SetErrorState(ErrorMessage.DatabaseQueryException); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return currencies; } //------------------------------------------------------------------- // Currency query execution. public override DbResultSet ExecuteCurrencyQuery(List columns, SaCurrency.Params prm) { ClearErrorState(); //--------------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(ReferenceDataConsole.TableName_Currency, aliasCurrency); // Currency Properties - add columns as defined in query list. if (columns.HasId(SaCurrency.Column.Id)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Id, aliasCurrency)); if (columns.HasId(SaCurrency.Column.Code)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency)); if (columns.HasId(SaCurrency.Column.Name)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Name, aliasCurrency)); if (columns.HasId(SaCurrency.Column.PrimaryCurrencyId)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnName(SaReferenceDataDbDfn.ColumnIdx.Currency_Primary), aliasCurrency); if (columns.HasId(SaCurrency.Column.Division)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Division, aliasCurrency)); if (columns.HasId(SaCurrency.Column.RegionId)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Region, aliasCurrency)); if (columns.HasId(SaCurrency.Column.Symbol)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Symbol, aliasCurrency)); if (columns.HasId(SaCurrency.Column.SuffixSymbol_Y) || columns.HasId(SaCurrency.Column.SuffixSymbol_Tick)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Suffix, aliasCurrency)); if (columns.HasId(SaCurrency.Column.IncludeSpace_Y) || columns.HasId(SaCurrency.Column.IncludeSpace_Tick)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_IncSpace, aliasCurrency)); if (columns.HasId(SaCurrency.Column.Decimals)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Decimals, aliasCurrency)); // Common Properties. /* if (columns.HasId(SaCurrency.Column.Notes)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Notes, aliasCurrency)); if (columns.HasId(SaCurrency.Column.Status) || columns.HasId(SaCurrency.Column.Status_Desc) || columns.HasId(SaCurrency.Column.Status_Ind)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Status, aliasCurrency)); */ if (columns.HasId(SaCurrency.Column.CreateOn_Date)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_CreateOn, aliasCurrency)); if (columns.HasId(SaCurrency.Column.UpdateOn_Date)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_UpdateOn, aliasCurrency)); //--------------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetCurrencyQueryFilter(prm)); if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetCurrencySortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------------- //return new DbResultSet_DataTableReader(Database, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery()); } //------------------------------------------------------------------- } //======================================================================= }