public override void MapDataFields(System.Data.DataRow currentRow) { base.MapDataFields(currentRow); workQueueId = (Int64)currentRow["WorkQueueId"]; SecurityAuthorityId = (Int64)currentRow["SecurityAuthorityId"]; UserAccountId = (String)currentRow["UserAccountId"]; UserAccountName = (String)currentRow["UserAccountName"]; UserDisplayName = (String)currentRow["UserDisplayName"]; workQueueViewId = (Int64)currentRow["WorkQueueViewId"]; if (application != null) { securityAuthorityName = application.SecurityAuthorityGetNameById(securityAuthorityId); workQueueView = application.WorkQueueViewGet(workQueueViewId); } return; }
public WorkQueueItem GetWork() { Int64 workQueueItemId = 0; WorkQueueItem workQueueItem = null; WorkQueueGetWorkUserView getWorkUserView = null; WorkQueueView workQueueView = null; List <Data.FilterDescriptor> filters = new List <Data.FilterDescriptor> (); String customFilters = String.Empty; // GET WORK IS DYNAMICALLY CREATED BY WORK QUEUE VIEWS, THIS CANNOT BE DONE IN A STORED PROCEDURE if (!HasWorkPermission) { application.SetLastException(new ApplicationException("Permission Denied. No Work Permissions to Work Queue (\"" + Name + "\").")); return(null); } try { // ATTEMPT TO GET USER SPECIFIC VIEW FIRST getWorkUserView = GetWorkUserView(application.Session.SecurityAuthorityId, application.Session.UserAccountId); if (getWorkUserView != null) { workQueueView = getWorkUserView.WorkQueueView; } // ELSE FALLBACK TO DEFAULT VIEW FOR THE OVERALL WORK QUEUE else { workQueueView = application.WorkQueueViewGet(getWorkViewId); } // 0 VALUE IS HANDLED IN THE GET FUNCTION // FINALLY FALLBACK TO SYSTEM DEFAULT VIEW IF NO VIEW ASSIGNED TO WORK QUEUE if (workQueueView != null) { // APPEND FILTERS THAT ARE FOR STANDARD FIELDS AND NOT CUSTOM FIELDS foreach (Int32 currentFilterKey in workQueueView.FilterDefinitions.Keys) { if (workQueueView.WellKnownFields.ContainsKey(workQueueView.FilterDefinitions[currentFilterKey].PropertyPath)) { filters.Add((Data.FilterDescriptor)workQueueView.FilterDefinitions[currentFilterKey]); } } } StringBuilder selectStatement = new StringBuilder(); selectStatement.Append("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE \r\n\r\n"); selectStatement.Append("BEGIN TRANSACTION \r\n\r\n"); selectStatement.Append(" DECLARE @workQueueItemId AS BIGINT \r\n\r\n"); selectStatement.Append(" DECLARE @itemGroupKey AS VARCHAR (060) \r\n\r\n"); selectStatement.Append(" SELECT @workQueueItemId = WorkQueueItemId, @itemGroupKey = ItemGroupKey \r\n\r\n FROM (\r\n\r\n"); selectStatement.Append(" SELECT \r\n\r\n"); selectStatement.Append(" " + application.WorkQueueItemsGetRowNumberSql(null, workQueueView) + " WorkQueueItemId, ItemGroupKey \r\n\r\n"); selectStatement.Append(" FROM (" + application.WorkQueueItemsGetSqlStatement(filters) + ") AS WorkQueueItem ) AS WorkQueueItemTop1 WHERE RowNumber = 1 \r\n"); if (workQueueView != null) { String customFields = String.Empty; foreach (Core.Work.WorkQueueViewFieldDefinition currentFieldDefinition in workQueueView.FieldDefinitions) { String extendedPropertyField = currentFieldDefinition.SqlSelectList; if (!String.IsNullOrEmpty(extendedPropertyField)) { customFields = customFields + ", " + extendedPropertyField; } } selectStatement.Replace("/*_CUSTOM_FIELD_INSERT_*/", customFields); } String itemFilter = " AND (WorkQueueItem.AssignedToSecurityAuthorityId = 0) AND (CompletionDate IS NULL) \r\n\r\n"; itemFilter = itemFilter + " AND (GETDATE () >= WorkQueueItem.ConstraintDate)\r\n\r\n"; itemFilter = itemFilter + " AND (WorkQueueId = " + Id.ToString() + ")\r\n\r\n"; itemFilter = itemFilter + " AND ((WorkTimeRestrictions IS NULL) \r\n\r\n"; itemFilter = itemFilter + " OR (CAST ((ISNULL (WorkTimeRestrictions.value ('(DayOfWeekTimes/"; itemFilter = itemFilter + "Day[@DayOfWeek=\"" + ((Int32)DateTime.Today.DayOfWeek).ToString() + "\"]/"; itemFilter = itemFilter + "Time[@StartTime <= \"" + DateTime.Now.ToString("hh:mm:ss") + "\""; itemFilter = itemFilter + "and @EndTime >= \"" + DateTime.Now.ToString("hh:mm:ss") + "\"])[1]', 'BIT'), 1) - 1) AS BIT) = 1)) \r\n\r\n"; if (workQueueView != null) { // APPEND FILTERS THAT ARE NOT STANDARD FIELDS foreach (Int32 currentFilterKey in workQueueView.FilterDefinitions.Keys) { if (!workQueueView.WellKnownFields.ContainsKey(workQueueView.FilterDefinitions[currentFilterKey].PropertyPath)) { foreach (Core.Work.WorkQueueViewFieldDefinition currentFieldDefinition in workQueueView.FieldDefinitions) { if (currentFieldDefinition.DisplayName == workQueueView.FilterDefinitions[currentFilterKey].PropertyPath) { Data.FilterDescriptor filterDescriptor = new Data.FilterDescriptor( currentFieldDefinition.SqlDeclaration, workQueueView.FilterDefinitions[currentFilterKey].Operator, workQueueView.FilterDefinitions[currentFilterKey].Parameter.Value); itemFilter = itemFilter + " AND (" + filterDescriptor.SqlCriteriaString(String.Empty) + ")"; } } } } } selectStatement.Replace("/*_CUSTOM_FILTER_INSERT_*/", itemFilter); selectStatement.Append(" IF (@workQueueItemId IS NOT NULL) \r\n\r\n"); selectStatement.Append(" BEGIN \r\n\r\n"); selectStatement.Append(" EXEC WorkQueueItem_AssignTo @workQueueItemId, "); selectStatement.Append(application.Session.SecurityAuthorityId.ToString() + ", "); selectStatement.Append("'" + application.Session.UserAccountId.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserAccountName.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserDisplayName.Replace("'", "''") + "', "); selectStatement.Append("'Get Work', \r\n\r\n"); selectStatement.Append("'" + application.Session.SecurityAuthorityName.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserAccountId.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserAccountName.Replace("'", "''") + "' \r\n\r\n"); if (getWorkUseGrouping) { selectStatement.Append(" IF (LEN (RTRIM (@itemGroupKey)) > 0) \r\n\r\n"); selectStatement.Append(" BEGIN \r\n\r\n"); selectStatement.Append(" DECLARE @currentWorkQueueItemId AS BIGINT \r\n\r\n"); selectStatement.Append(" DECLARE GroupItemsCursor CURSOR FOR \r\n\r\n"); selectStatement.Append(" SELECT WorkQueueItemId FROM WorkQueueItem WHERE (WorkQueueId = " + Id.ToString() + ") AND (ItemGroupKey = @itemGroupKey) AND (WorkQueueItemId <> @workQueueItemId) AND CompletionDate IS NULL AND AssignedToSecurityAuthorityId = 0 \r\n\r\n"); selectStatement.Append(" OPEN GroupItemsCursor \r\n\r\n"); selectStatement.Append(" FETCH NEXT FROM GroupItemsCursor INTO @currentWorkQueueItemId \r\n\r\n"); selectStatement.Append(" WHILE (@@FETCH_STATUS = 0) \r\n\r\n"); selectStatement.Append(" BEGIN \r\n\r\n"); selectStatement.Append(" EXEC WorkQueueItem_AssignTo @currentWorkQueueItemId, "); selectStatement.Append(application.Session.SecurityAuthorityId.ToString() + ", "); selectStatement.Append("'" + application.Session.UserAccountId.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserAccountName.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserDisplayName.Replace("'", "''") + "', "); selectStatement.Append("'Get Work - By Grouping', \r\n\r\n"); selectStatement.Append("'" + application.Session.SecurityAuthorityName.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserAccountId.Replace("'", "''") + "', "); selectStatement.Append("'" + application.Session.UserAccountName.Replace("'", "''") + "' \r\n\r\n"); selectStatement.Append(" FETCH NEXT FROM GroupItemsCursor INTO @currentWorkQueueItemId \r\n\r\n"); selectStatement.Append(" END \r\n\r\n"); selectStatement.Append(" CLOSE GroupItemsCursor \r\n\r\n"); selectStatement.Append(" DEALLOCATE GroupItemsCursor \r\n\r\n"); selectStatement.Append(" END \r\n\r\n"); } selectStatement.Append(" END \r\n\r\n"); selectStatement.Append(" ELSE \r\n\r\n"); selectStatement.Append(" BEGIN \r\n\r\n"); selectStatement.Append(" SET @workQueueItemId = 0 \r\n\r\n"); selectStatement.Append(" END \r\n\r\n"); selectStatement.Append(" SELECT @workQueueItemId \r\n\r\n"); selectStatement.Append("COMMIT TRANSACTION \r\n\r\n"); workQueueItemId = (Int64)application.EnvironmentDatabase.ExecuteScalar(selectStatement.ToString()); workQueueItem = application.WorkQueueItemGet(workQueueItemId); } catch (Exception applicationException) { application.EnvironmentDatabase.ExecuteSqlStatement("ROLLBACK TRANSACTION"); throw applicationException; } finally { } return(workQueueItem); }