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);
        }