List <WorkFlowInfo> IManagerWorkFlowSecurity.GetWorkFlowsByUserCode(Guid tenantId, Guid userId, bool isSuperAdmin)
        {
            var workFlowSteps      = _managerWorkFlowStep.GetWorkFlowStepsByUserId(tenantId, userId, isSuperAdmin);
            var workFlows          = _managerWorkFlow.GetWorkFlowsByIds(tenantId, workFlowSteps.Select(p => p.WorkFlowId).Distinct().ToList());
            var workFlowOperations = _managerOperation.GetWorkFlowOperationsByWorkFlowIds(tenantId, workFlows.Select(p => p.WorkFlowId).ToList());

            var workFlowInnerSteps        = _managerInnerStep.GetWorkFlowInnerStep_ByStepIds(tenantId, workFlowSteps.Select(p => p.WorkFlowStepId).ToList());
            var operationOrTransactionIds = new List <Guid>();

            operationOrTransactionIds.AddRange(workFlowOperations.Select(p => p.WorkFlowOperationId).ToList());
            operationOrTransactionIds.AddRange(workFlowInnerSteps.Select(p => p.InnerStepId).ToList());
            var workFlowProcess = _managerWorkFlowProcess.GetWorkFlowProcessByOperationOrTransitionIds(tenantId, operationOrTransactionIds);
            var processTasks    = _managerWorkFlowProcessTask.GetWorkFlowProcessTask_ByProcessIds(tenantId, workFlowProcess.Select(proc => proc.WorkFlowProcessId).ToList());
            var workFlowRoles   = _managerWorkFlowRole.GetWorkFlowRolesByStepIds(tenantId, workFlowSteps.Select(p => p.WorkFlowStepId).ToList());

            foreach (var workFlow in workFlows)
            {
                //get its operations
                workFlow.Operations = (from workFlowOperation in workFlowOperations where workFlowOperation.WorkFlowId == workFlow.WorkFlowId select workFlowOperation).ToList();
                //set process to operation
                foreach (var operation in workFlow.Operations)
                {
                    operation.WorkFlowProcess = (from workFlowPro in workFlowProcess where workFlowPro.OperationOrTransactionId == operation.WorkFlowOperationId &&
                                                 workFlowPro.WorkFlowId == workFlow.WorkFlowId select workFlowPro).ToList();
                    foreach (var process in operation.WorkFlowProcess)
                    {
                        process.WorkFlowProcessTasks = new List <WorkFlowProcessTaskInfo>();
                        if (process.ProcessType == (int)WorkFlowProcessType.PreProcess)
                        {
                            process.WorkFlowProcessTasks.AddRange((from allProcessTask in processTasks
                                                                   where process.WorkFlowProcessId == allProcessTask.WorkFlowProcessId && process.WorkFlowId == workFlow.WorkFlowId
                                                                   orderby allProcessTask.SequenceCode
                                                                   select allProcessTask).ToList());
                        }

                        if (process.ProcessType == (int)WorkFlowProcessType.Process)
                        {
                            process.WorkFlowProcessTasks.AddRange((from allProcessTask in processTasks
                                                                   where process.WorkFlowProcessId == allProcessTask.WorkFlowProcessId && process.WorkFlowId == workFlow.WorkFlowId
                                                                   orderby allProcessTask.SequenceCode
                                                                   select allProcessTask).ToList());
                        }

                        if (process.ProcessType == (int)WorkFlowProcessType.PostProcess)
                        {
                            process.WorkFlowProcessTasks.AddRange((from allProcessTask in processTasks
                                                                   where process.WorkFlowProcessId == allProcessTask.WorkFlowProcessId && process.WorkFlowId == workFlow.WorkFlowId
                                                                   orderby allProcessTask.SequenceCode
                                                                   select allProcessTask).ToList());
                        }
                    }
                }

                //get its steps
                workFlow.Steps = new List <WorkFlowStepInfo>();
                var allSteps         = WorkFlowHelper.GetAllSteps(workFlow.EntityId);
                var itsWorkFlowSteps = (from workFlowStep in workFlowSteps where workFlowStep.WorkFlowId == workFlow.WorkFlowId select workFlowStep).ToList();

                foreach (var itsWorkFlowStep in itsWorkFlowSteps)
                {
                    //filter its role
                    itsWorkFlowStep.Roles = (from workFlowRole in workFlowRoles where workFlowRole.WorkFlowStepId == itsWorkFlowStep.WorkFlowStepId &&
                                             workFlowRole.WorkFlowId == workFlow.WorkFlowId select workFlowRole).ToList();
                    var filteredStep = (from allStep in allSteps where itsWorkFlowStep.TransitionType.Id == allStep.Id select allStep).FirstOrDefault();
                    itsWorkFlowStep.TransitionType.Name = filteredStep.Value;
                    //filter its inner steps
                    var itsInnerSteps = (from workFlowInnerStep in workFlowInnerSteps where workFlowInnerStep.WorkFlowStepId == itsWorkFlowStep.WorkFlowStepId &&
                                         workFlowInnerStep.WorkFlowId == workFlow.WorkFlowId select workFlowInnerStep).ToList();
                    if (itsInnerSteps.Count > 0)
                    {
                        //filter Inner step process
                        foreach (var itsInnerStep in itsInnerSteps)
                        {
                            itsInnerStep.WorkFlowProcess = (from workFlowPro in workFlowProcess where workFlowPro.OperationOrTransactionId == itsInnerStep.InnerStepId &&
                                                            workFlowPro.WorkFlowId == workFlow.WorkFlowId select workFlowPro).ToList();

                            foreach (var process in itsInnerStep.WorkFlowProcess)
                            {
                                process.WorkFlowProcessTasks = new List <WorkFlowProcessTaskInfo>();
                                if (process.ProcessType == (int)WorkFlowProcessType.PreProcess)
                                {
                                    process.WorkFlowProcessTasks.AddRange((from allProcessTask in processTasks
                                                                           where process.WorkFlowProcessId == allProcessTask.WorkFlowProcessId && process.WorkFlowId == workFlow.WorkFlowId
                                                                           orderby allProcessTask.SequenceCode
                                                                           select allProcessTask).ToList());
                                }

                                if (process.ProcessType == (int)WorkFlowProcessType.Process)
                                {
                                    process.WorkFlowProcessTasks.AddRange((from allProcessTask in processTasks
                                                                           where process.WorkFlowProcessId == allProcessTask.WorkFlowProcessId && process.WorkFlowId == workFlow.WorkFlowId
                                                                           orderby allProcessTask.SequenceCode
                                                                           select allProcessTask).ToList());
                                }

                                if (process.ProcessType == (int)WorkFlowProcessType.PostProcess)
                                {
                                    process.WorkFlowProcessTasks.AddRange((from allProcessTask in processTasks
                                                                           where process.WorkFlowProcessId == allProcessTask.WorkFlowProcessId && process.WorkFlowId == workFlow.WorkFlowId
                                                                           orderby allProcessTask.SequenceCode
                                                                           select allProcessTask).ToList());
                                }
                            }
                        }
                        itsWorkFlowStep.InnerSteps = new List <WorkFlowInnerStepInfo>(itsInnerSteps);
                    }
                    workFlow.Steps.Add(itsWorkFlowStep);
                }
            }
            foreach (var workFlow in workFlows)
            {
                workFlow.EntityId = iMetadataManager.GetEntityNameByEntityContext(workFlow.EntityId);
                var subTypes = iMetadataManager.GetSubTypesDetails(workFlow.EntityId);
                foreach (var subType in subTypes)
                {
                    if (subType.Key == workFlow.SubTypeCode)
                    {
                        workFlow.SubTypeCode = subType.Value;
                    }
                }
            }
            return(workFlows);
        }