using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; using System.Threading.Tasks; using Sarand.Core.App; using Sarand.Core.Base; using Sarand.Core.Bus; using Sarand.Core.Dbas.Base; using Sarand.Win.Dbas.Base; using Sarand.PatientMgr.Core.App; using Sarand.PatientMgr.Core.Bus; using Sarand.PatientMgr.Core.Mgr; using Sarand.PatientMgr.Win.Dbas.Bus; using Sarand.PatientMgr.Win.Dbas.Internal; //using Sarand.PatientMgr.Win.Dbas.UpdateLog; using Sarand.Win.Dbas.Data; namespace Sarand.PatientMgr.Win.Dbas.Mgr { //======================================================================= internal partial class SpmInstitutionMgr_Dbas : SpmInstitutionMgr { //******************************************************************* // I n s t i t u t i o n //******************************************************************* // Utilities. //------------------------------------------------------------------- // Create Institution. public override SpmInstitution CreateInstitution () { return new SpmInstitution_Dbas(UserContext, null, 0); } private SpmInstitution_Dbas CreateInstitution (SwmInstitution_Db dbInstitution) { ClearErrorState(); SpmInstitution_Dbas institution = new SpmInstitution_Dbas(UserContext, new SysId(dbInstitution._Id), (ushort)dbInstitution._Flags); PopulateFrom(dbInstitution, institution); return institution; } //------------------------------------------------------------------- // Get Institution. public override SpmInstitution GetInstitution () { ClearErrorState(); SpmInstitution.Params prmInstitution = new SpmInstitution.Params(); prmInstitution.StatusCat = SpmInstitution.StatusCat.Any; if (GetInstitutionCount(prmInstitution) == 0) { SetErrorState("No institution available."); Logger.Warn("GetInstitution " + ErrorStateMessage); return null; } if (GetInstitutionCount(prmInstitution) > 1) { SetErrorState("Multiple institutions available."); Logger.Warn("GetInstitution " + ErrorStateMessage); return null; } return GetInstitution(prmInstitution); } public override SpmInstitution GetInstitution (SpmInstitution.Params prm) { return GetInstitution(GetInstitutionQueryFilter(prm).Concat(" AND ", "(", ")")); } private SpmInstitution GetInstitution (String filter) { ClearErrorState(); long count = GetInstitutionCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple Institutiones found"); return null; } SpmInstitution institution = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SwmInstitution_Db dbInstitution = new SwmInstitution_Db(DbInfo); dbInstitution.PopulateFrom(dbCommand, aliasInstitution, filter); institution = CreateInstitution(dbInstitution); } catch (Exception exc) { SetErrorState("Database query exception"); Logger.Warn(GetType().Name + ".GetInstitution\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message); } } return institution; } //------------------------------------------------------------------- // Validate Institution. public override bool IsValidInstitutionData (SpmInstitution.Data data, SpmInstitution.ErrField errField) { ClearErrorState(); if (!base.IsValidInstitutionData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert Institution. public override bool InsertInstitution (SpmInstitution institution, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidInstitution(institution)) return false; if (SysId.IsValid(institution.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SwmInstitution_Db dbInstitution = new SwmInstitution_Db(DbInfo); PopulateTo(dbInstitution, institution, dbUpdateInfo); if (SwmInstitution_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbInstitution._Id = SysId.ToInt(Database.GetNextId("Institution", dbUpdateInfo)); } dbInstitution.ExecuteInsertCommand(dbCommand); institution.Id = new SysId(dbInstitution._Id); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update Institution. public override bool UpdateInstitution (SpmInstitution institution, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidInstitution(institution)) return false; if (!SysId.IsValid(institution.Id)) return SetErrorState(ErrorMessage.InvalidItemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Institution. dbConnection.Open(); SwmInstitution_Db dbInstitution = new SwmInstitution_Db(DbInfo); dbInstitution.PopulateFrom(dbCommand, aliasInstitution, "Id=" + SysId.ToString(institution.Id)); //SpmUpdateLogItemMonitor_Institution updateLogMonitor = new SpmUpdateLogItemMonitor_Institution(UserContext, CreateInstitution(dbInstitution)); // Update properties. PopulateTo(dbInstitution, institution, dbUpdateInfo); dbInstitution.ExecuteUpdateCommand(dbCommand); /* Record updates. updateLogMonitor.RecordUpdatedValues(institution); updateLogMonitor.LogUpdates();*/ } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete Institution. public override bool InstitutionCanBeDeleted (SpmInstitution institution) { ClearErrorState(); if (!base.InstitutionCanBeDeleted(institution)) return false; return true; } public override bool DeleteInstitution (SpmInstitution institution, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!InstitutionCanBeDeleted(institution)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Institution. dbConnection.Open(); SwmInstitution_Db dbInstitution = new SwmInstitution_Db(DbInfo); dbInstitution.PopulateFrom(dbCommand, aliasInstitution, "Id=" + institution.Id.ToString()); // Delete Institution. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmInstitution) + " WHERE Id=" + SysId.ToString(institution.Id) + ";"; dbCommand.ExecuteNonQuery(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo (SwmInstitution_Db dbInstitution, SpmInstitution institution, DbUpdateInfo dbUpdateInfo) { dbInstitution._Id = institution.Id.ToInt(); dbInstitution._Name = institution.Name; dbInstitution._Notes = institution.Notes; dbInstitution._Status = SacsSystem.GetStatusCode(institution.Status); dbInstitution._Flags = (short)institution.Flags; if (!SysId.IsValid(institution.Id)) { dbInstitution._CreateOn = DateTime.UtcNow; dbInstitution._CreateBy = dbUpdateInfo.UserId.ToInt(); dbInstitution._CreateHost = dbUpdateInfo.Host; } dbInstitution._UpdateOn = DateTime.UtcNow; dbInstitution._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbInstitution._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom (SwmInstitution_Db dbInstitution, SpmInstitution institution) { institution.Id = new SysId(dbInstitution._Id); institution.Name = dbInstitution._Name; institution.Notes = dbInstitution._Notes; institution.Status = SacsSystem.GetStatusForCode(dbInstitution._Status); institution.SetCreateStamp(dbInstitution._CreateOn, new SysId(dbInstitution._CreateBy), dbInstitution._CreateHost); institution.SetUpdateStamp(dbInstitution._UpdateOn, new SysId(dbInstitution._UpdateBy), dbInstitution._UpdateHost); institution.AcceptChanges(); } //------------------------------------------------------------------- // Institution column definitions. private static readonly String aliasInstitution = "aInst"; private void SetInstitutionColDfn (ColumnDfn col, String caption, int width, SpmDbDfn.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, String alias = "", String prefix = "") { if (String.IsNullOrEmpty(alias) && SpmDbDfn.GetTableForColumn(dbCol) == SpmDbDfn.TableIdx.SwmInstitution) alias = aliasInstitution; col.Set(caption, width, (int)dbCol, prefix + SpmDbDfn.GetColumnName(dbCol, false), SpmDbDfn.GetColumnNameQual(dbCol, alias), dataType, align); if (dataType == DataValue.DataType.String && dbCol != SpmDbDfn.ColumnIdx.Unknown) col.MaxLength = (int)SpmDbDfn.GetColTextLen(dbCol); } //------------------------------------------------------------------- // Getting prmInstitution column definition. public override ColumnDfn GetInstitutionColumnDfn (SpmInstitution.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SpmInstitution.Column.Pos: SetInstitutionColDfn(columnDfn, "Pos", 42, SpmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SpmInstitution.Column.Id: SetInstitutionColDfn(columnDfn, "Id", 40, SpmDbDfn.ColumnIdx.SwmInstitution_Id, ColumnAlignment.Right, DataValue.DataType.Long, aliasInstitution); columnDfn.ReadOnly = true; break; // Institution Properties. case SpmInstitution.Column.Name: SetInstitutionColDfn(columnDfn, "Name", 60, SpmDbDfn.ColumnIdx.SwmInstitution_Name, ColumnAlignment.Default, DataValue.DataType.String, aliasInstitution); break; // Common properties. case SpmInstitution.Column.Notes: SetInstitutionColDfn(columnDfn, "Notes", 200, SpmDbDfn.ColumnIdx.SwmInstitution_Notes); break; case SpmInstitution.Column.Status: SetInstitutionColDfn(columnDfn, "Status", 50, SpmDbDfn.ColumnIdx.SwmInstitution_Status, ColumnAlignment.Center); break; case SpmInstitution.Column.Status_Desc: SetInstitutionColDfn(columnDfn, "Status", 50, SpmDbDfn.ColumnIdx.SwmInstitution_Status, ColumnAlignment.Center); break; case SpmInstitution.Column.Status_Ind: SetInstitutionColDfn(columnDfn, "Status", 50, SpmDbDfn.ColumnIdx.SwmInstitution_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SpmInstitution.Column.CreateOn_Date: SetInstitutionColDfn(columnDfn, "Created", 65, SpmDbDfn.ColumnIdx.SwmInstitution_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SpmInstitution.Column.UpdateOn_Date: SetInstitutionColDfn(columnDfn, "Updated", 65, SpmDbDfn.ColumnIdx.SwmInstitution_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; } //------------------------------------------------------------------- // Institution query filter. public override List GetInstitutionQueryFilter (SpmInstitution.Params prm) { List filter = new List(); // Institution Id. String includedIds = prm.IncludedIds.Concat(","); if (!includedIds.IsEmpty()) filter.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Id, aliasInstitution) + " IN (" + includedIds + ")"); String excludedIds = prm.ExcludedIds.Concat(","); if (!excludedIds.IsEmpty()) filter.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Id, aliasInstitution) + " NOT IN (" + excludedIds + ")"); // Name. String colInstitution_Name = SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Name, aliasInstitution); if (!StringUtil.IsEmpty(prm.Name)) filter.Add(colInstitution_Name + "='" + DbQuery.FormatForCondition(prm.Name) + "'"); if (!StringUtil.IsEmpty(prm.NamePartial)) filter.Add(colInstitution_Name + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%'"); // Notes. String colInstitution_Notes = SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Notes, aliasInstitution); if (!StringUtil.IsEmpty(prm.NotesPartial)) filter.Add(colInstitution_Notes + " LIKE '%" + DbQuery.FormatForLike(prm.NotesPartial) + "%'"); // Status. if (prm.StatusCat != SpmInstitution.StatusCat.Any) { //filter.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Status, aliasInstitution) + " = '" + SacsSystem.GetStatusCode(SaStatus.Active) + "'"); } if (filter.Count < 1) filter.Add("1=1"); return filter; } //------------------------------------------------------------------- // Institution sort columns. public List GetInstitutionSortColumns (SpmInstitution.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for Institution columns in case of conflict. String sortCol = String.Empty; if (SpmDbDfn.GetTableForColumn((SpmDbDfn.ColumnIdx)columnDfn.DbColumn) == SpmDbDfn.TableIdx.SwmInstitution) { sortCol = SpmDbDfn.GetColumnNameQual((SpmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasInstitution); } 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(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Type, aliasInstitution) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // Institution count. private long GetInstitutionCount (String filter) { ClearErrorState(); return Database.GetRowCount(SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmInstitution) + " As " + aliasInstitution, filter); } public override long GetInstitutionCount (SpmInstitution.Params prm) { ClearErrorState(); return GetInstitutionCount(GetInstitutionQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Institution list. public override List GetInstitutionList (SpmInstitution.Params prm) { List Institutiones = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmInstitution), aliasInstitution); qry.Columns.AddRange(SwmInstitution_Db.Fields); qry.Filters.AddRange(GetInstitutionQueryFilter(prm)); // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); dbCommand.CommandText = qry.BuildQuery(); using (DbDataReader dbDataReader = dbCommand.ExecuteReader()) { while (dbDataReader.Read()) { SwmInstitution_Db dbInstitution = new SwmInstitution_Db(DbInfo); dbInstitution.PopulateFrom(dbDataReader); Institutiones.Add(CreateInstitution(dbInstitution)); } } } catch (Exception exc) { Logger.Warn(GetType().Name + ".GetInstitutionList\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message); } } return Institutiones; } //------------------------------------------------------------------- // Institution query execution. public override DbResultSet ExecuteInstitutionQuery (List columns, SpmInstitution.Params prm) { ClearErrorState(); //--------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmInstitution), aliasInstitution); // Institution Properties - add columns as defined in query list. if (columns.HasId((int)SpmInstitution.Column.Id)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Id, aliasInstitution)); if (columns.HasId((int)SpmInstitution.Column.Name)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Name, aliasInstitution)); // Common Properties if (columns.HasId((int)SpmInstitution.Column.Notes)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Notes, aliasInstitution)); if (columns.HasId((int)SpmInstitution.Column.Status) || columns.HasId((int)SpmInstitution.Column.Status_Desc) || columns.HasId((int)SpmInstitution.Column.Status_Ind)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_Status, aliasInstitution)); if (columns.HasId((int)SpmInstitution.Column.CreateOn_Date)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_CreateOn, aliasInstitution)); if (columns.HasId((int)SpmInstitution.Column.UpdateOn_Date)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmInstitution_UpdateOn, aliasInstitution)); //--------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetInstitutionQueryFilter(prm)); if (prm.IncludedIds.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetInstitutionSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------- //return new DbResultSet_DataTableReader(Database, query.BuildQuery()); return new Sarand.Win.Dbas.Data.DbResultSet_DataReader(Database, query.BuildQuery()); } //------------------------------------------------------------------- } //======================================================================= }