private RouteResultData RouteUser(int currentUserId, SchedulerEvent theEvent, QNomyDataService dataService, int delegateId, List <int> servicesInStage, bool callAfterRoute, int?routeId) { RouteResultData result = new RouteResultData(); List <RouteListItem> availableRoutes = Service.GetAvailableRoutes(theEvent.ServiceId); int?transferedFromServiceId = dataService.GetTranseredFromServiceId(theEvent.ProcessId); var routesToStage = new List <RouteListItem>(); var returnToSender = new List <RouteListItem>(); bool skipAddRoute = false; foreach (var rout in availableRoutes) { skipAddRoute = routeId.HasValue && routeId.Value > 0 && routeId.Value != rout.Id; if (!skipAddRoute && transferedFromServiceId.HasValue && rout.TargetType == Route.RouteTargetType.ReturnToSender && servicesInStage.Contains(transferedFromServiceId.Value)) { routesToStage.Add(rout); continue; } if (!skipAddRoute && servicesInStage.Contains(rout.TargetServiceId)) { routesToStage.Add(rout); continue; } } if (routesToStage.Count == 0) { throw new DataException("Route to this stage does not exists."); } if (routesToStage.Count > 1) { result.Selection = new SelectOptionData(); result.Selection.Options = new List <KeyValuePair <int, string> >(); foreach (var item in routesToStage) { result.Selection.Options.Add(new KeyValuePair <int, string>(item.Id, item.Name)); } return(result); } var route = routesToStage[0]; // Route operation. ProcessRouteResults routeResult = Process.Route(theEvent.ProcessId, currentUserId, delegateId, route.Id, route.TargetServiceId, 0, 0, "", false, 0); if (routeResult.Status != ProcessRouteResults.ProcessRouteResultsStatus.Success) { throw new DataException(routeResult.Status.ToString()); } if (routeResult.NewServiceId > 0) { theEvent.ServiceId = routeResult.NewServiceId; } if (routeResult.NewProcessId > 0) { theEvent.ProcessId = routeResult.NewProcessId; } if (callAfterRoute && routeResult.NewEntityStatus == (int)EntityType.EntityStatus.Waiting) { try { CallUser(currentUserId, theEvent, delegateId); } catch (DataException) { } } result.IsRouted = true; return(result); }