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 SpmDepartmentMgr_Dbas : SpmDepartmentMgr { //******************************************************************* // F a c i l i t y T e m p l a t e //******************************************************************* // Utilities. //------------------------------------------------------------------- // Create FacilityTemplate. public override SpmFacilityTemplate CreateFacilityTemplate(SysId facilityId, Spm.ResourceCategory resourceCategory) { return new SpmFacilityTemplate_Dbas(UserContext, facilityId, resourceCategory, 0); } private SpmFacilityTemplate_Dbas CreateFacilityTemplate(SwmFacilityTemplate_Db dbFacilityTemplate) { ClearErrorState(); SpmFacilityTemplate_Dbas facilityTemplate = new SpmFacilityTemplate_Dbas(UserContext, new SysId(dbFacilityTemplate._FacilityId), (Spm.ResourceCategory)dbFacilityTemplate._Category, (ushort)dbFacilityTemplate._Flags); PopulateFrom(dbFacilityTemplate, facilityTemplate); return facilityTemplate; } //------------------------------------------------------------------- // Get FacilityTemplate. public override SpmFacilityTemplate GetFacilityTemplate(SpmFacilityTemplate.Params prm) { return GetFacilityTemplate(GetFacilityTemplateQueryFilter(prm).Concat(" AND ", "(", ")")); } private SpmFacilityTemplate GetFacilityTemplate(String filter) { ClearErrorState(); long count = GetFacilityTemplateCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple FacilityTemplatees found"); return null; } SpmFacilityTemplate facilityTemplate = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SwmFacilityTemplate_Db dbFacilityTemplate = new SwmFacilityTemplate_Db(DbInfo); dbFacilityTemplate.PopulateFrom(dbCommand, aliasFacilityTemplate, filter); facilityTemplate = CreateFacilityTemplate(dbFacilityTemplate); } catch (Exception exc) { SetErrorState("Database query exception"); Logger.Warn(GetType().Name + ".GetFacilityTemplate\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message); } } return facilityTemplate; } //------------------------------------------------------------------- // Validate FacilityTemplate. public override bool IsValidFacilityTemplateData(SpmFacilityTemplate.Data data, SpmFacilityTemplate.ErrField errField) { ClearErrorState(); if (!base.IsValidFacilityTemplateData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert FacilityTemplate. public override bool InsertFacilityTemplate(SpmFacilityTemplate facilityTemplate, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidFacilityTemplate(facilityTemplate)) return false; if (SysId.IsValid(facilityTemplate.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SwmFacilityTemplate_Db dbFacilityTemplate = new SwmFacilityTemplate_Db(DbInfo); PopulateTo(dbFacilityTemplate, facilityTemplate, dbUpdateInfo); if (SwmFacilityTemplate_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbFacilityTemplate._Id = SysId.ToInt(Database.GetNextId("FacilityTemplate", dbUpdateInfo)); } dbFacilityTemplate.ExecuteInsertCommand(dbCommand); facilityTemplate.Id = new SysId(dbFacilityTemplate._Id); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update FacilityTemplate. public override bool UpdateFacilityTemplate(SpmFacilityTemplate facilityTemplate, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidFacilityTemplate(facilityTemplate)) return false; if (!SysId.IsValid(facilityTemplate.Id)) return SetErrorState(ErrorMessage.InvalidItemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve FacilityTemplate. dbConnection.Open(); SwmFacilityTemplate_Db dbFacilityTemplate = new SwmFacilityTemplate_Db(DbInfo); dbFacilityTemplate.PopulateFrom(dbCommand, aliasFacilityTemplate, "Id=" + SysId.ToString(facilityTemplate.Id)); //SpmUpdateLogItemMonitor_FacilityTemplate updateLogMonitor = new SpmUpdateLogItemMonitor_FacilityTemplate(UserContext, CreateFacilityTemplate(dbFacilityTemplate)); // Update properties. PopulateTo(dbFacilityTemplate, facilityTemplate, dbUpdateInfo); dbFacilityTemplate.ExecuteUpdateCommand(dbCommand); /* Record updates. updateLogMonitor.RecordUpdatedValues(facilityTemplate); updateLogMonitor.LogUpdates();*/ } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete FacilityTemplate. public override bool FacilityTemplateCanBeDeleted(SpmFacilityTemplate facilityTemplate) { ClearErrorState(); if (!base.FacilityTemplateCanBeDeleted(facilityTemplate)) return false; return true; } public override bool DeleteFacilityTemplate(SpmFacilityTemplate facilityTemplate, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!FacilityTemplateCanBeDeleted(facilityTemplate)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve FacilityTemplate. dbConnection.Open(); SwmFacilityTemplate_Db dbFacilityTemplate = new SwmFacilityTemplate_Db(DbInfo); dbFacilityTemplate.PopulateFrom(dbCommand, aliasFacilityTemplate, "Id=" + facilityTemplate.Id.ToString()); // Delete FacilityTemplate. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmFacilityTemplate) + " WHERE Id=" + SysId.ToString(facilityTemplate.Id) + ";"; dbCommand.ExecuteNonQuery(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(SwmFacilityTemplate_Db dbFacilityTemplate, SpmFacilityTemplate facilityTemplate, DbUpdateInfo dbUpdateInfo) { dbFacilityTemplate._Id = facilityTemplate.Id.ToInt(); dbFacilityTemplate._FacilityId = facilityTemplate.FacilityId.ToInt(); dbFacilityTemplate._Category = (short)facilityTemplate.ResourceCategory; dbFacilityTemplate._Type = (short)facilityTemplate.TemplateType; dbFacilityTemplate._Name = facilityTemplate.Name; dbFacilityTemplate._SortCode = facilityTemplate.SortCode; dbFacilityTemplate._Description = facilityTemplate.Desc; dbFacilityTemplate._SessionCode = facilityTemplate.SessionCode; dbFacilityTemplate._Group = facilityTemplate.Group; dbFacilityTemplate._Notes = facilityTemplate.Notes; dbFacilityTemplate._Status = SacsSystem.GetStatusCode(facilityTemplate.Status); dbFacilityTemplate._Flags = (short)facilityTemplate.Flags; if (!SysId.IsValid(facilityTemplate.Id)) { dbFacilityTemplate._CreateOn = DateTime.UtcNow; dbFacilityTemplate._CreateBy = dbUpdateInfo.UserId.ToInt(); dbFacilityTemplate._CreateHost = dbUpdateInfo.Host; } dbFacilityTemplate._UpdateOn = DateTime.UtcNow; dbFacilityTemplate._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbFacilityTemplate._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(SwmFacilityTemplate_Db dbFacilityTemplate, SpmFacilityTemplate facilityTemplate) { facilityTemplate.Id = new SysId(dbFacilityTemplate._Id); facilityTemplate.FacilityId = new SysId(dbFacilityTemplate._FacilityId); facilityTemplate.ResourceCategory = (Spm.ResourceCategory)dbFacilityTemplate._Category; facilityTemplate.TemplateType = (Spm.TemplateType)dbFacilityTemplate._Type; facilityTemplate.Name = dbFacilityTemplate._Name; facilityTemplate.SortCode = dbFacilityTemplate._SortCode; facilityTemplate.Desc = dbFacilityTemplate._Description; facilityTemplate.SessionCode = dbFacilityTemplate._SessionCode; facilityTemplate.Group = dbFacilityTemplate._Group; facilityTemplate.Notes = dbFacilityTemplate._Notes; facilityTemplate.Status = SacsSystem.GetStatusForCode(dbFacilityTemplate._Status); facilityTemplate.SetCreateStamp(dbFacilityTemplate._CreateOn, new SysId(dbFacilityTemplate._CreateBy), dbFacilityTemplate._CreateHost); facilityTemplate.SetUpdateStamp(dbFacilityTemplate._UpdateOn, new SysId(dbFacilityTemplate._UpdateBy), dbFacilityTemplate._UpdateHost); facilityTemplate.AcceptChanges(); } //------------------------------------------------------------------- // FacilityTemplate column definitions. private static readonly String aliasFacilityTemplate = "aFacTemp"; private void SetFacilityTemplateColDfn (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.SwmFacilityTemplate) alias = aliasFacilityTemplate; 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 prmFacilityTemplate column definition. public override ColumnDfn GetFacilityTemplateColumnDfn(SpmFacilityTemplate.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SpmFacilityTemplate.Column.Pos: SetFacilityTemplateColDfn(columnDfn, "Pos", 42, SpmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SpmFacilityTemplate.Column.Id: SetFacilityTemplateColDfn(columnDfn, "Id", 40, SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // FacilityTemplate Properties. // Derived properties. // Common properties. case SpmFacilityTemplate.Column.Notes: SetFacilityTemplateColDfn(columnDfn, "Notes", 200, SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Notes); break; case SpmFacilityTemplate.Column.Status: SetFacilityTemplateColDfn(columnDfn, "Status", 50, SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Status, ColumnAlignment.Center); break; case SpmFacilityTemplate.Column.Status_Desc: SetFacilityTemplateColDfn(columnDfn, "Status", 50, SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Status, ColumnAlignment.Center); break; case SpmFacilityTemplate.Column.Status_Ind: SetFacilityTemplateColDfn(columnDfn, "Status", 50, SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SpmFacilityTemplate.Column.CreateOn_Date: SetFacilityTemplateColDfn(columnDfn, "Created", 65, SpmDbDfn.ColumnIdx.SwmFacilityTemplate_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SpmFacilityTemplate.Column.UpdateOn_Date: SetFacilityTemplateColDfn(columnDfn, "Updated", 65, SpmDbDfn.ColumnIdx.SwmFacilityTemplate_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; } //------------------------------------------------------------------- // FacilityTemplate query filter. public override List GetFacilityTemplateQueryFilter(SpmFacilityTemplate.Params prm) { List filters = new List(); // FacilityTemplate Id. String includedIds = prm.IncludedIds.Concat(","); if (!includedIds.IsEmpty()) filters.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Id, aliasFacilityTemplate) + " IN (" + includedIds + ")"); String excludedIds = prm.ExcludedIds.Concat(","); if (!excludedIds.IsEmpty()) filters.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Id, aliasFacilityTemplate) + " NOT IN (" + excludedIds + ")"); // Applicable dates. DateTime nullDate = new DateTime(1970, 1, 1); String colApplicFrom = SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_ApplicFrom, aliasFacilityTemplate); String colApplicTo = SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_ApplicTo, aliasFacilityTemplate); if (DateUtil.IsValid(prm.Application)) { // Looking for roles that are applicable on the specified date. filters.Add("(" + colApplicFrom + " IS NULL OR " + colApplicFrom + "=" + DbQuery.FormatDateForCondition(nullDate) + " OR " + colApplicFrom + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.Application, 1)) + ")"); filters.Add("(" + colApplicTo + " IS NULL OR " + colApplicTo + "=" + DbQuery.FormatDateForCondition(nullDate) + " OR " + colApplicTo + ">=" + DbQuery.FormatDateForCondition(prm.Application) + ")"); } else if (DateUtil.IsValid(prm.ApplicationFrom) || DateUtil.IsValid(prm.ApplicationTo)) { // Looking for roles that overlap with the specified date range. if (DateUtil.IsValid(prm.ApplicationFrom) && DateUtil.IsValid(prm.ApplicationTo)) { // Both from and to dates specified. filters.Add("(" + colApplicFrom + " IS NULL OR " + colApplicFrom + "=" + DbQuery.FormatDateForCondition(nullDate) + " OR " + colApplicFrom + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.ApplicationTo, 1)) + ")"); filters.Add("(" + colApplicTo + " IS NULL OR " + colApplicTo + "=" + DbQuery.FormatDateForCondition(nullDate) + " OR " + colApplicTo + ">=" + DbQuery.FormatDateForCondition(prm.ApplicationFrom) + ")"); } else if (DateUtil.IsValid(prm.ApplicationFrom)) { // Only 'from' date specified - Matches with ApplicTo not specified or after 'from' date. filters.Add("(" + colApplicTo + " IS NULL OR " + colApplicTo + "=" + DbQuery.FormatDateForCondition(nullDate) + " OR " + colApplicTo + ">=" + DbQuery.FormatDateForCondition(prm.ApplicationFrom) + ")"); String filter = filters[0]; } else if (DateUtil.IsValid(prm.ApplicationTo)) { // Only 'to' date specified - Matches with ApplicFrom not specified or before 'to' date. filters.Add("(" + colApplicFrom + " IS NULL OR " + colApplicFrom + "=" + DbQuery.FormatDateForCondition(nullDate) + " OR " + colApplicFrom + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.ApplicationTo, 1)) + ")"); String filter = filters[0]; } } //--------------------------------------------------------------- // Common Properties. if (filters.Count < 1) filters.Add("1=1"); return filters; } //------------------------------------------------------------------- // FacilityTemplate sort columns. public List GetFacilityTemplateSortColumns(SpmFacilityTemplate.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for FacilityTemplate columns in case of conflict. String sortCol = String.Empty; if (SpmDbDfn.GetTableForColumn((SpmDbDfn.ColumnIdx)columnDfn.DbColumn) == SpmDbDfn.TableIdx.SwmFacilityTemplate) { sortCol = SpmDbDfn.GetColumnNameQual((SpmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasFacilityTemplate); } 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.SwmFacilityTemplate_Type, aliasFacilityTemplate) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // FacilityTemplate count. private long GetFacilityTemplateCount(String filter) { ClearErrorState(); return Database.GetRowCount(SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmFacilityTemplate) + " As " + aliasFacilityTemplate, filter); } public override long GetFacilityTemplateCount(SpmFacilityTemplate.Params prm) { ClearErrorState(); return GetFacilityTemplateCount(GetFacilityTemplateQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // FacilityTemplate list. public override List GetFacilityTemplateList(SpmFacilityTemplate.Params prm) { List FacilityTemplatees = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmFacilityTemplate), aliasFacilityTemplate); qry.Columns.AddRange(SwmFacilityTemplate_Db.Fields); qry.Filters.AddRange(GetFacilityTemplateQueryFilter(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()) { SwmFacilityTemplate_Db dbFacilityTemplate = new SwmFacilityTemplate_Db(DbInfo); dbFacilityTemplate.PopulateFrom(dbDataReader); FacilityTemplatees.Add(CreateFacilityTemplate(dbFacilityTemplate)); } } } catch (Exception exc) { Logger.Warn(GetType().Name + ".GetFacilityTemplateList\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message); } } return FacilityTemplatees; } //------------------------------------------------------------------- // FacilityTemplate query execution. public override DbResultSet ExecuteFacilityTemplateQuery(List columns, SpmFacilityTemplate.Params prm) { ClearErrorState(); //--------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(SpmDbDfn.GetTableName(SpmDbDfn.TableIdx.SwmFacilityTemplate), aliasFacilityTemplate); // FacilityTemplate Properties - add columns as defined in query list. /*if (columns.HasId((int)SpmFacilityTemplate.Column.Id)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Id, aliasFacilityTemplate));*/ // Common Properties if (columns.HasId((int)SpmFacilityTemplate.Column.Notes)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Notes, aliasFacilityTemplate)); if (columns.HasId((int)SpmFacilityTemplate.Column.Status) || columns.HasId((int)SpmFacilityTemplate.Column.Status_Desc) || columns.HasId((int)SpmFacilityTemplate.Column.Status_Ind)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_Status, aliasFacilityTemplate)); if (columns.HasId((int)SpmFacilityTemplate.Column.CreateOn_Date)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_CreateOn, aliasFacilityTemplate)); if (columns.HasId((int)SpmFacilityTemplate.Column.UpdateOn_Date)) query.Columns.Add(SpmDbDfn.GetColumnNameQual(SpmDbDfn.ColumnIdx.SwmFacilityTemplate_UpdateOn, aliasFacilityTemplate)); //--------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetFacilityTemplateQueryFilter(prm)); if (prm.IncludedIds.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetFacilityTemplateSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------- //return new DbResultSet_DataTableReader(Database, query.BuildQuery()); return new Sarand.Win.Dbas.Data.DbResultSet_DataReader(Database, query.BuildQuery()); } //------------------------------------------------------------------- } //======================================================================= }