public void CheckPermissoinToEdit(DR_Requester requester, DR_ResultEdit result, List <QueryItem> allQueryItems)
        {
            BizTableDrivedEntity bizTableDrivedEntity = new BizTableDrivedEntity();
            bool permission = true;

            foreach (var entityGroup in allQueryItems.GroupBy(x => x.TargetEntity.ID))
            {
                if (!bizTableDrivedEntity.DataIsAccessable(requester, entityGroup.Key, new List <SecurityAction>()
                {
                    SecurityAction.EditAndDelete
                }))
                {
                    permission = false;
                    var entity = allQueryItems.First(x => x.TargetEntity.ID == entityGroup.Key).TargetEntity;
                    result.Details.Add(ToResultDetail("عدم دسترسی", "عدم دسترسی ثبت به موجودیت" + " " + entity.Alias, ""));
                }
                else if (bizTableDrivedEntity.DataIsReadonly(requester, entityGroup.Key))
                {
                    permission = false;
                    var entity = allQueryItems.First(x => x.TargetEntity.ID == entityGroup.Key).TargetEntity;
                    result.Details.Add(ToResultDetail("عدم دسترسی", "عدم دسترسی ثبت به موجودیت" + " " + entity.Alias, ""));
                }
            }
            if (permission)
            {
                BizColumn bizColumn = new BizColumn();
                foreach (var query in allQueryItems)
                {
                    foreach (var column in query.EditingProperties)
                    {
                        if (!bizColumn.DataIsAccessable(requester, column.ColumnID))
                        {
                            permission = false;
                            result.Details.Add(ToResultDetail("عدم دسترسی", "عدم دسترسی به ستون" + " " + column.Column.Alias, ""));
                        }
                        else if (column.IsChanged && bizColumn.DataIsReadonly(requester, column.ColumnID))
                        {
                            permission = false;
                            result.Details.Add(ToResultDetail("عدم دسترسی", "عدم دسترسی ثبت به ستون" + " " + column.Column.Alias, ""));
                        }
                    }
                }
            }

            if (permission == false)
            {
                result.Result  = Enum_DR_ResultType.ExceptionThrown;
                result.Message = "خطا در ثبت";
            }
        }
        public DR_ResultEdit Process(DR_EditRequest request)
        {
            DR_ResultEdit result = new DR_ResultEdit();
            var           preEditQueryResults = new List <EditQueryPreItem>();

            foreach (var item in request.EditPackages)
            {
                preEditQueryResults.Add(new EditQueryPreItem(item));
            }

            actionActivityManager.DoBeforeEditActionActivities(request.Requester, preEditQueryResults);
            if (preEditQueryResults.Any(x => x.BeforeSaveActionActivitiesResult == Enum_DR_SimpleResultType.ExceptionThrown))
            {
                var exceptionItem = preEditQueryResults.First(x => x.BeforeSaveActionActivitiesResult == Enum_DR_SimpleResultType.ExceptionThrown);
                result.Result = Enum_DR_ResultType.ExceptionThrown;
                var logResult = bizLogManager.AddLog(GetBeforeSaveExceptionLog(exceptionItem), request.Requester);
                if (!string.IsNullOrEmpty(logResult))
                {
                    result.Details.Add(ToResultDetail("خطا در ثبت لاگ", "", logResult));
                }
                result.Details.Add(ToResultDetail(exceptionItem.DataItem.ViewInfo, "فعالیتهای قبل از ذخیره شدن داده با خطا همراه بود", exceptionItem.BeforeSaveActionActivitiesMessage));
            }
            else
            {
                //var internalResult = GetInternalResult(request as DR_EditRequest);
                var allQueryItems = editQueryItemManager.GetQueryItems(request.Requester, request.EditPackages);
                if (allQueryItems.Any(x => string.IsNullOrEmpty(x.Query)))
                {
                    throw new Exception("sdfsdf");
                }

                CheckPermissoinToEdit(request.Requester, result, allQueryItems);
                if (result.Result == Enum_DR_ResultType.ExceptionThrown)
                {
                    return(result);
                }

                var editQueryResults = new List <EditQueryResultItem>();
                foreach (var item in allQueryItems)
                {
                    editQueryResults.Add(new EditQueryResultItem(item));
                }

                actionActivityManager.DoBeforeDeleteActionActivities(request.Requester, editQueryResults);
                if (editQueryResults.Any(x => x.BeforeSaveActionActivitiesResult == Enum_DR_SimpleResultType.ExceptionThrown))
                {
                    var exceptionItem = editQueryResults.First(x => x.BeforeSaveActionActivitiesResult == Enum_DR_SimpleResultType.ExceptionThrown);
                    result.Result = Enum_DR_ResultType.ExceptionThrown;
                    var logResult = bizLogManager.AddLog(GetBeforeDeleteExceptionLog(exceptionItem), request.Requester);
                    if (!string.IsNullOrEmpty(logResult))
                    {
                        result.Details.Add(ToResultDetail("خطا در ثبت لاگ", "", logResult));
                    }
                    result.Details.Add(ToResultDetail(exceptionItem.QueryItem.DataItem.ViewInfo, "فعالیتهای قبل از ذخیره شدن داده با خطا همراه بود", exceptionItem.BeforeSaveActionActivitiesMessage));
                }
                else
                {
                    var transactionresult = ConnectionManager.ExecuteTransactionalQueryItems(allQueryItems);
                    if (transactionresult.Successful)
                    {
                        actionActivityManager.DoAfterEditActionActivities(request.Requester, editQueryResults);
                        var logResult = bizLogManager.AddLogs(GetUpdateDataSuccessfulLogs(editQueryResults), request.Requester);
                        if (!string.IsNullOrEmpty(logResult))
                        {
                            result.Details.Add(ToResultDetail("خطا در ثبت لاگ", "", logResult));
                        }

                        foreach (var item in request.EditPackages)
                        {
                            var baseData          = new DP_BaseData(item.TargetEntityID, item.TargetEntityAlias);
                            var listKeyProperties = new List <EntityInstanceProperty>();
                            if (item.IsNewItem && item.KeyProperties.Any(x => x.IsIdentity))
                            {
                                var dataItem = editQueryResults.First(x => x.QueryItem.DataItem == item).QueryItem.DataItem;
                                foreach (var key in dataItem.KeyProperties)
                                {
                                    baseData.Properties.Add(key);
                                }
                            }
                            else
                            {
                                foreach (var key in item.KeyProperties)
                                {
                                    baseData.Properties.Add(key);
                                }
                            }
                            result.UpdatedItems.Add(baseData);
                        }

                        if (editQueryResults.Any(x => x.AfterSaveActionActivitiesResult == Enum_DR_SimpleResultType.ExceptionThrown))
                        {
                            result.Result = Enum_DR_ResultType.JustMajorFunctionDone;
                            foreach (var item in editQueryResults.Where(x => x.AfterSaveActionActivitiesResult == Enum_DR_SimpleResultType.ExceptionThrown))
                            {
                                result.Details.Add(ToResultDetail(item.QueryItem.DataItem.ViewInfo, "فعالیتهای بعد از ذخیره شدن داده با خطا همراه بود", item.AfterSaveActionActivitiesMessage));
                            }
                        }
                        else
                        {
                            result.Result = Enum_DR_ResultType.SeccessfullyDone;
                        }
                    }
                    else
                    {
                        result.Result = Enum_DR_ResultType.ExceptionThrown;
                        if (editQueryResults.Any(x => x.DataUpdateResult == Enum_DR_SimpleResultType.ExceptionThrown))
                        {
                            foreach (var item in transactionresult.QueryItems.Where(x => x.Exception != null))
                            {
                                editQueryResults.First(x => x.QueryItem == item.QueryItem).DataUpdateMessage = item.Exception.Message;
                                editQueryResults.First(x => x.QueryItem == item.QueryItem).DataUpdateResult  = Enum_DR_SimpleResultType.ExceptionThrown;
                            }
                            var exceptionItem = editQueryResults.First(x => x.DataUpdateResult == Enum_DR_SimpleResultType.ExceptionThrown);
                            var logResult     = bizLogManager.AddLog(GetUpdateDataExceptionLog(exceptionItem), request.Requester);
                            if (!string.IsNullOrEmpty(logResult))
                            {
                                result.Details.Add(ToResultDetail("خطا در ثبت لاگ", "", logResult));
                            }
                            result.Details.Add(ToResultDetail(exceptionItem.QueryItem.DataItem.ViewInfo, "ذخیره شدن داده با خطا همراه بود", exceptionItem.DataUpdateMessage));
                        }
                        else
                        {
                            result.Details.Add(ToResultDetail("خطای عمومی ثبت", "ذخیره شدن داده با خطا همراه بود", transactionresult.Message));
                        }
                    }
                }
            }
            return(result);
        }