public ResponseObjectPackage<List<EventActionParameter>> GetActionParametersByActionsList(RequestObjectPackage<List<EventAction>> request, IDbConnection connectionID)
        {
            List<int> obj = (request.requestData ?? new List<EventAction>() {}).Select(e => e.ID).ToList();
            obj.Add(-1);
            Dictionary<string, string>  mappingDictionary = new Dictionary<string, string>()
            {
                {"ID","ID"},
                {"actionID","ACTION_ID"},
                {"actionParameterTypeID","ACTION_PARAMETER_TYPE_ID"},
                {"controlID","CONTROL_ID"},
                {"name","NAME"},
                {"domainValueTypeID","DOMAIN_VALUE_TYPE_ID"},
            };

            string sql = string.Format(
                "select ap.ID, ap.ACTION_ID, ap.ACTION_PARAMETER_TYPE_ID, ap.CONTROL_ID, apt.NAME, apt.DOMAIN_VALUE_TYPE_ID " + Environment.NewLine +
                "from ACTION_PARAMETERS ap " + Environment.NewLine +
                "inner join ACTION_PARAMETER_TYPES apt on apt.ID = ap.ACTION_PARAMETER_TYPE_ID " + Environment.NewLine +
                "where ap.ACTION_ID in ({0})",
                    string.Join(", ", obj)
            );

            List<EventActionParameter> list = DBOrmUtils.OpenSqlList<EventActionParameter>(sql, mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<EventActionParameter>>() { resultData = list };
        }
        public static ResponsePackage Save(RequestObjectPackage<ActionModel> request, IDbConnection connectionID, IDbTransaction transactionID)
        {
            ActionModel obj = request.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update ACTIONS set EVENT_ID = {0}, ORDER_NUMBER = {1}, ACTION_TYPE_ID = {2} " + Environment.NewLine +
                    " where ID = {3} returning ID",
                    SQL.FromNumber(obj.eventID),
                    SQL.FromNumber(obj.orderNumber),
                    SQL.FromNumber(obj.actionTypeID),
                    SQL.FromNumber(obj.ID)
                );
            }
            else
            {
                sql = string.Format(
                    " insert into ACTIONS (EVENT_ID, ORDER_NUMBER, ACTION_TYPE_ID) " + Environment.NewLine +
                    " values ({0}, {1}, {2}) returning ID",
                    SQL.FromNumber(obj.eventID),
                    SQL.FromNumber(obj.orderNumber),
                    SQL.FromNumber(obj.actionTypeID)
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true, transactionID);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        /// <summary>
        /// Сохранение выходных параметров запроса
        /// </summary>
        /// <param name="package"></param>
        /// <param name="connectionID"></param>
        /// <returns></returns>
        public static ResponsePackage SaveQueryOutParameter(RequestObjectPackage<QueryOutParameterModel> package, IDbConnection connectionID)
        {
            QueryOutParameterModel obj = package.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update QUERY_OUT_PARAMETERS set NAME = '{0}', QUERY_TYPE_ID = {1}, DOMAIN_VALUE_TYPE_ID = {2) " + Environment.NewLine +
                    " where ID = {3} returning ID",
                    obj.name.TrimIfNotNull() ?? "",
                    obj.queryTypeID,
                    obj.domainValueTypeID,
                    obj.ID
                );
            }
            else
            {
                sql = string.Format(
                    " insert into QUERY_OUT_PARAMETERS (NAME, QUERY_TYPE_ID, DOMAIN_VALUE_TYPE_ID) " + Environment.NewLine +
                    " values ('{0}', {1}, {2}) returning ID",
                    obj.name.TrimIfNotNull() ?? "",
                    obj.queryTypeID,
                    obj.domainValueTypeID
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        /// <summary>
        /// Функция сохранения группы типов контролов
        /// </summary>
        /// <param name="request">Объект-оболочка RequestPackage, содержащая в поле requestData нруппу типов контролов</param>
        /// <param name="connectionID">Объект подключения к базе данных</param>
        /// <returns>Объект-оболочка ResponsePackagе</returns>
        public ResponsePackage SaveControlTypeGroup(RequestObjectPackage<ControlTypeGroupModel> request, IDbConnection connectionID)
        {
            ControlTypeGroupModel obj = request.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update control_type_groups set NAME = {0} " +
                    " where id = {1} returning id ",
                    obj.name ?? "",
                    obj.ID
                );
            }
            else
            {
                sql = string.Format(
                    " insert into control_type_groups (NAME) " +
                    " values ({0}) returning id ",
                    obj.name ?? ""
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        /// <summary>
        /// Сохранить маппинг
        /// </summary>
        /// <param name="package"></param>
        /// <param name="connectionID"></param>
        /// <returns></returns>
        public static ResponsePackage SaveControlQueryMapping(RequestObjectPackage<ControlQueryMappingModel> package, IDbConnection connectionID, IDbTransaction transactionID)
        {
            ControlQueryMappingModel obj = package.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                // изменение
                sql = string.Format(
                    " update CONTROL_QUERY_MAPPING set CONTROL_ID = {0), QUERY_OUT_PARAMETER_ID = {1}, QUERY_ID = {2} " + Environment.NewLine +
                    " where ID = {3} returning ID",
                    obj.controlID,
                    obj.queryOutParameterID,
                    obj.queryID,
                    obj.ID
                );
            }
            else
            {
                // сохранение
                sql = string.Format(
                    " insert into CONTROL_QUERY_MAPPING (CONTROL_ID, QUERY_OUT_PARAMETER_ID, QUERY_ID) " + Environment.NewLine +
                    " values ({0}, {1}, {2}) returning ID",
                    obj.controlID,
                    obj.queryOutParameterID,
                    obj.queryID
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true, transactionID);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        public static ResponsePackage SavePrimaryKey(RequestObjectPackage<DictionaryPrimaryKeyModel> request, IDbConnection connectionID, IDbTransaction transactionID)
        {
            DictionaryPrimaryKeyModel obj = request.requestData;
            bool isEdit = obj.ID > 0;

            string sql = null;
            if (isEdit)
            {
                sql = string.Format(
                    "update DICTIONARY_PRIMARY_KEYS " + Environment.NewLine +
                    "set ID = {0}, DICTIONARY_FIELD_ID = {1}, DICTIONARY_ID = {2} " + Environment.NewLine +
                    "where ID = {0} ",
                        SQL.FromNumber(obj.ID),
                        SQL.FromNumber(obj.dictionaryFieldID),
                        SQL.FromNumber(obj.dictionaryID)
                );
            }
            else
            {
                sql = string.Format(
                   "insert into DICTIONARY_PRIMARY_KEYS " + Environment.NewLine +
                   "(DICTIONARY_FIELD_ID, DICTIONARY_ID) " + Environment.NewLine +
                   "values ({0}, {1}) returning ID",
                        SQL.FromNumber(obj.dictionaryFieldID),
                        SQL.FromNumber(obj.dictionaryID)
                );
            }

            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, !isEdit, transactionID);
            res.ThrowExceptionIfError();

            return new ResponsePackage() { resultID = isEdit ? obj.ID : res.resultID };
        }
        public static ResponsePackage SaveOutParam(RequestObjectPackage<FormOutParameterModel> request, IDbConnection connectionID, IDbTransaction transactionID)
        {
            FormOutParameterModel obj = request.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update FORM_OUT_PARAMETERS set NAME = '{0}', CONTROL_ID = {1} " +
                    " where ID = {2} returning id ",
                    obj.name ?? "",
                    obj.controlID,
                    obj.ID
                );
            }
            else
            {
                sql = string.Format(
                    " insert into FORM_OUT_PARAMETERS (NAME, CONTROL_ID) " +
                    " values ('{0}', {1}) returning id ",
                    obj.name ?? "",
                    obj.controlID
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true, transactionID);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        /// <summary>
        /// Функция сохранения типа контрола
        /// </summary>
        /// <param name="request">Объект-оболочка RequestPackage, содержащая в поле requestData тип контрола</param>
        /// <param name="connectionID">Объект подключения к базе данных</param>
        /// <returns>Объект-оболочка ResponsePackagе</returns>
        public ResponsePackage SaveControlType(RequestObjectPackage<ControlTypeModel> request, IDbConnection connectionID)
        {
            ControlTypeModel obj = request.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update control_types set NAME = {0}, CONTROL_TYPE_GROUP_ID = {1}, PATH = {2}, DESCRIPTION = {3} " +
                    " where id = {4} returning id ",
                    obj.component ?? "",
                    obj.controlTypeGroupID,
                    obj.path == null ? "null" : ("'" + obj.path.TrimIfNotNull() + "'"),
                    obj.description == null ? "null" : ("'" + obj.description.TrimIfNotNull() + "'"),
                    obj.ID
                );
            }
            else
            {
                sql = string.Format(
                    " insert into control_types (NAME, CONTROL_TYPE_GROUP_ID, PATH, DESCRIPTION) " +
                    " values ({0}, {1}, {2}, {3}) returning id ",
                    obj.component ?? "",
                    obj.controlTypeGroupID,
                    obj.path == null ? "null" : ("'" + obj.path.TrimIfNotNull() + "'"),
                    obj.description == null ? "null" : ("'" + obj.description.TrimIfNotNull() + "'")
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        public static ResponsePackage Save(RequestObjectPackage<ActionTypePropertyModel> request, IDbConnection connectionID, IDbTransaction transactionID)
        {
            ActionTypePropertyModel obj = request.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update ACTION_TYPE_PROPERTIES set \"VALUE\" = {0}, ACTION_TYPE_ID = {1}, ACTION_KIND_PROPERTY_ID = {2} " + Environment.NewLine +
                    " where ID = {3} returning ID",
                    SQL.FromNumber(obj.ID),
                    SQL.FromNumber(obj.actionTypeID),
                    SQL.FromNumber(obj.actionKindPropertyID),
                    SQL.FromNumber(obj.ID)
                );
            }
            else
            {
                sql = string.Format(
                    " insert into ACTION_TYPE_PROPERTIES (\"VALUE\", ACTION_TYPE_ID, ACTION_KIND_PROPERTY_ID) " + Environment.NewLine +
                    " values ({0}, {1}, {2}) returning ID",
                    SQL.FromNumber(obj.ID),
                    SQL.FromNumber(obj.actionTypeID),
                    SQL.FromNumber(obj.actionKindPropertyID)
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true, transactionID);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        public static ResponsePackage Save(RequestObjectPackage<EventTypeModel> request, IDbConnection connectionID, IDbTransaction transactionID)
        {
            EventTypeModel obj = request.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update EVENT_TYPES set NAME = {0} " + Environment.NewLine +
                    " where ID = {1} returning ID",
                    SQL.FromString(obj.name),
                    SQL.FromNumber(obj.ID)
                );
            }
            else
            {
                sql = string.Format(
                    " insert into EVENT_TYPES (NAME) " + Environment.NewLine +
                    " values ({0}) returning ID",
                    SQL.FromString(obj.name)
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true, transactionID);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
        public static ResponsePackage Save(RequestObjectPackage<ActionParameterModel> request, IDbConnection connectionID, IDbTransaction transactionID)
        {
            ActionParameterModel obj = request.requestData;
            string sql = string.Empty;

            if (obj.ID > 0)
            {
                sql = string.Format(
                    " update ACTION_PARAMETERS set ACTION_ID = {0}, ACTION_PARAMETER_TYPE_ID = {1}, CONTROL_ID = {2} " + Environment.NewLine +
                    " where ID = {3} returning ID",
                    SQL.FromNumber(obj.actionID),
                    SQL.FromNumber(obj.actionParameterTypeID),
                    SQL.FromNumber(obj.controlID),
                    SQL.FromNumber(obj.ID)
                );
            }
            else
            {
                sql = string.Format(
                    " insert into ACTION_PARAMETERS (ACTION_ID, ACTION_PARAMETER_TYPE_ID, CONTROL_ID) " + Environment.NewLine +
                    " values ({0}, {1}, {2}) returning ID",
                    SQL.FromNumber(obj.actionID),
                    SQL.FromNumber(obj.actionParameterTypeID),
                    SQL.FromNumber(obj.controlID)
                );
            }
            ResponseTablePackage res = DBUtils.ExecuteSQL(sql, connectionID, true, transactionID);
            res.ThrowExceptionIfError();
            return new ResponsePackage() { resultID = res.resultID };
        }
 public ResponseObjectPackage<List<DictionaryModel>> GetAllDictionaries()
 {
     RequestObjectPackage<DictionarySearchTemplate> request = new RequestObjectPackage<DictionarySearchTemplate>()
     {
         requestData = new DictionarySearchTemplate()
     };
     ResponseObjectPackage<List<DictionaryModel>> response = new DBUtils().RunSqlAction(DictionariesRepository.GetBySearchTemplate, request);
     return response;
 }
 public ResponseObjectPackage<List<DictionaryFieldModel>> GetDictionaryFieldsByDictionaryID(int dictionaryID)
 {
     RequestObjectPackage<DictionaryFieldSearchTemplate> request = new RequestObjectPackage<DictionaryFieldSearchTemplate>()
     {
         requestData = new DictionaryFieldSearchTemplate()
         {
             dictionaryID = dictionaryID
         }
     };
     ResponseObjectPackage<List<DictionaryFieldModel>> response = new DBUtils().RunSqlAction(DictionaryFieldsRepository.GetBySearchTemplate, request);
     return response;
 }
 public ResponseObjectPackage<List<QueryQueryInParameterModel>> GetQueryQueryInParametersByQueryID(int queryID)
 {
     RequestObjectPackage<QueryQueryInParameterSearchTemplate> request = new RequestObjectPackage<QueryQueryInParameterSearchTemplate>()
     {
         requestData = new QueryQueryInParameterSearchTemplate()
         {
             queryID = queryID
         }
     };
     ResponseObjectPackage<List<QueryQueryInParameterModel>> response = new DBUtils().RunSqlAction(QueryQueryInParametersRepository.GetBySearchTemplate, request);
     return response;
 }
 public ResponseObjectPackage<DictionaryFieldModel> GetDictionaryFieldByID(int dictionaryFieldID)
 {
     RequestObjectPackage<DictionaryFieldSearchTemplate> request = new RequestObjectPackage<DictionaryFieldSearchTemplate>()
     {
         requestData = new DictionaryFieldSearchTemplate()
         {
             ID = dictionaryFieldID
         }
     };
     DictionaryFieldModel response = new DBUtils().RunSqlAction(DictionaryFieldsRepository.GetBySearchTemplate, request).GetDataOrExceptionIfError().First();
     return new ResponseObjectPackage<DictionaryFieldModel>() { resultData = response };
 }
 public ResponseObjectPackage<QueryTypeModel> GetQueryTypeByID(int queryTypeID)
 {
     RequestObjectPackage<QueryTypeSearchTemplate> request = new RequestObjectPackage<QueryTypeSearchTemplate>()
     {
         requestData = new QueryTypeSearchTemplate()
         {
             ID = queryTypeID
         }
     };
     ResponseObjectPackage<List<QueryTypeModel>> response = new DBUtils().RunSqlAction(QueryTypesRepository.GetBySearchTemplate, request);
     QueryTypeModel model = response.GetDataOrExceptionIfError().First();
     return new ResponseObjectPackage<QueryTypeModel>() { resultData = model };
 }
        public static ResponseObjectPackage<List<ActionModel>> GetBySearchTemplate(RequestObjectPackage<ActionSearchTemplate> request, IDbConnection connectionID)
        {
            ActionSearchTemplate obj = request.requestData;
            string sql = string.Format(
                "select ID, EVENT_ID, ORDER_NUMBER, ACTION_TYPE_ID " + Environment.NewLine +
                "from ACTIONS " + Environment.NewLine +
                "where {0}",
                    ToSqlWhere(obj)
            );

            List<ActionModel> list = DBOrmUtils.OpenSqlList<ActionModel>(sql, mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<ActionModel>>() { resultData = list };
        }
 public JsonResult GetHandlerTypeList()
 {
     try
     {
         RequestObjectPackage<ActionTypeSearchTemplate> request = new RequestObjectPackage<ActionTypeSearchTemplate>() { requestData = new ActionTypeSearchTemplate() };
         ResponseObjectPackage<List<ActionTypeModel>> response = new EventEditorLogic().GetHandlerTypeList(request).GetSelfOrExceptionIfError();
         return Json(response);
     }
     catch (Exception ex)
     {
         return this.HandleException(ex);
     }
 }
 public ResponseObjectPackage<DictionaryModel> GetDictionaryByID(int dictionaryID)
 {
     RequestObjectPackage<DictionarySearchTemplate> request = new RequestObjectPackage<DictionarySearchTemplate>()
     {
         requestData = new DictionarySearchTemplate()
         {
             ID = dictionaryID
         }
     };
     ResponseObjectPackage<List<DictionaryModel>> response = new DBUtils().RunSqlAction(DictionariesRepository.GetBySearchTemplate, request);
     DictionaryModel dictionary = response.GetDataOrExceptionIfError().First();
     return new ResponseObjectPackage<DictionaryModel>() { resultData = dictionary };
 }
        public static ResponseObjectPackage<List<EventTypeModel>> GetBySearchTemplate(RequestObjectPackage<EventTypeSearchTemplate> request, IDbConnection connectionID)
        {
            EventTypeSearchTemplate obj = request.requestData;
            string sql = string.Format(
                "select ID, NAME " + Environment.NewLine +
                "from EVENT_TYPES " + Environment.NewLine +
                "where {0}",
                    ToSqlWhere(obj)
            );

            List<EventTypeModel> list = DBOrmUtils.OpenSqlList<EventTypeModel>(sql, mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<EventTypeModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<ActionParameterTypeModel>> GetBySearchTemplate(RequestObjectPackage<ActionParameterTypeSearchTemplate> request, IDbConnection connectionID)
        {
            ActionParameterTypeSearchTemplate obj = request.requestData;
            string sql = string.Format(
                "select ID, NAME, ACTION_TYPE_ID, DOMAIN_VALUE_TYPE_ID " + Environment.NewLine +
                "from ACTION_PARAMETER_TYPES " + Environment.NewLine +
                "where {0}",
                    ToSqlWhere(obj)
            );

            List<ActionParameterTypeModel> list = DBOrmUtils.OpenSqlList<ActionParameterTypeModel>(sql, mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<ActionParameterTypeModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<ActionTypePropertyModel>> GetBySearchTemplate(RequestObjectPackage<ActionTypePropertySearchTemplate> request, IDbConnection connectionID)
        {
            ActionTypePropertySearchTemplate obj = request.requestData;
            string sql = string.Format(
                "select ID, \"VALUE\", ACTION_TYPE_ID, ACTION_KIND_PROPERTY_ID " + Environment.NewLine +
                "from ACTION_TYPE_PROPERTIES " + Environment.NewLine +
                "where {0}",
                    ToSqlWhere(obj)
            );

            List<ActionTypePropertyModel> list = DBOrmUtils.OpenSqlList<ActionTypePropertyModel>(sql, mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<ActionTypePropertyModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<ActionParameterModel>> GetByActionsList(RequestObjectPackage<List<ActionModel>> request, IDbConnection connectionID)
        {
            List<int> obj = (request.requestData ?? new List<ActionModel>()).Select(e => e.ID).ToList();
            obj.Add(-1);
            string sql = string.Format(
                "select ID, ACTION_ID, ACTION_PARAMETER_TYPE_ID, CONTROL_ID " + Environment.NewLine +
                "from ACTION_PARAMETERS " + Environment.NewLine +
                "where ACTION_ID in ({0})",
                    string.Join(", ", obj)
            );

            List<ActionParameterModel> list = DBOrmUtils.OpenSqlList<ActionParameterModel>(sql, mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<ActionParameterModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<ActionModel>> GetByEventsList(RequestObjectPackage<List<EventModel>> request, IDbConnection connectionID)
        {
            List<int> obj = (request.requestData ?? new List<EventModel>()).Select(e => e.ID).ToList();
            obj.Add(-1);
            string sql = string.Format(
                "select ID, EVENT_ID, ORDER_NUMBER, ACTION_TYPE_ID " + Environment.NewLine +
                "from ACTIONS " + Environment.NewLine +
                "where EVENT_ID in({0});",
                    string.Join(", ", obj)
            );

            List<ActionModel> list = DBOrmUtils.OpenSqlList<ActionModel>(sql, mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<ActionModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<DictionaryGruopModel>> GetBySearchTemplate(RequestObjectPackage<DictionaryGroupSearchTemplate> package, IDbConnection connectionID)
        {
            DictionaryGroupSearchTemplate obj = package.requestData;
            string sql = string.Format(
                "select ID, NAME, DICTIONARY_GROUP_ID_PARENT, DICTIONARY_GROUP_ID_ROOT " + Environment.NewLine +
                "from dictionary_groups " + Environment.NewLine +
                "where {0}",
                DictionaryGroupsRepository.ToSqlWhere(obj)
            );
            ResponseTablePackage res = DBUtils.OpenSQL(sql, connectionID);
            res.ThrowExceptionIfError();

            List<DictionaryGruopModel> list = DBOrmUtils.OpenSqlList<DictionaryGruopModel>(sql, DictionaryGroupsRepository.mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<DictionaryGruopModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<FormOutParameterModel>> GetBySearchTemplate(RequestObjectPackage<FormOutParameterSearchTemplate> package, IDbConnection connectionID)
        {
            FormOutParameterSearchTemplate obj = package.requestData;
            string sql = string.Format(
                "select ID, CONTROL_ID, NAME " + Environment.NewLine +
                "from FORM_IN_PARAMETERS " + Environment.NewLine +
                "where {0}",
                FormOutParametersRepository.ToSqlWhere(obj)
            );
            ResponseTablePackage res = DBUtils.OpenSQL(sql, connectionID);
            res.ThrowExceptionIfError();

            List<FormOutParameterModel> list = DBOrmUtils.OpenSqlList<FormOutParameterModel>(sql, FormOutParametersRepository.mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<FormOutParameterModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<DictionaryPrimaryKeyModel>> GetBySearchTemplate(RequestObjectPackage<DictionaryPrimaryKeySearchTemplate> package, IDbConnection connectionID)
        {
            DictionaryPrimaryKeySearchTemplate obj = package.requestData;
            string sql = string.Format(
                "select ID, DICTIONARY_FIELD_ID, DICTIONARY_ID " + Environment.NewLine +
                "from DICTIONARY_PRIMARY_KEYS " + Environment.NewLine +
                "where {0}",
                DictionaryPrimaryKeysRepository.ToSqlWhere(obj)
            );
            ResponseTablePackage res = DBUtils.OpenSQL(sql, connectionID);
            res.ThrowExceptionIfError();

            List<DictionaryPrimaryKeyModel> list = DBOrmUtils.OpenSqlList<DictionaryPrimaryKeyModel>(sql, DictionaryPrimaryKeysRepository.mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<DictionaryPrimaryKeyModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<QueryModel>> GetBySearchTemplate(RequestObjectPackage<QuerySearchTemplate> package, IDbConnection connectionID)
        {
            QuerySearchTemplate obj = package.requestData;
            string sql = string.Format(
                "select ID, QUERY_TYPE_ID " + Environment.NewLine +
                "from QUERIES " + Environment.NewLine +
                "where {0}",
                QueriesRepository.ToSqlWhere(obj)
            );
            ResponseTablePackage res = DBUtils.OpenSQL(sql, connectionID);
            res.ThrowExceptionIfError();

            List<QueryModel> list = DBOrmUtils.OpenSqlList<QueryModel>(sql, QueriesRepository.mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<QueryModel>>() { resultData = list };
        }
        public static ResponseObjectPackage<List<ControlQueryMappingModel>> GetBySearchTemplate(RequestObjectPackage<ControlQueryMappingSearchTemplate> package, IDbConnection connectionID)
        {
            ControlQueryMappingSearchTemplate obj = package.requestData;
            string sql = string.Format(
                "select m.ID, m.CONTROL_ID, m.QUERY_OUT_PARAMETER_ID, m.QUERY_ID, m.QUERY_MAPPING_ROLE_ID " + Environment.NewLine +
                "from CONTROL_QUERY_MAPPING m " + Environment.NewLine +
                "where {0}",
                ControlQueryMappingRepository.ToSqlWhere(obj)
            );
            ResponseTablePackage res = DBUtils.OpenSQL(sql, connectionID);
            res.ThrowExceptionIfError();

            List<ControlQueryMappingModel> list = DBOrmUtils.OpenSqlList<ControlQueryMappingModel>(sql, ControlQueryMappingRepository.mappingDictionary, connectionID);
            return new ResponseObjectPackage<List<ControlQueryMappingModel>>() { resultData = list };
        }
        /// <summary>
        /// Удалить удаленные пользвателем компоненты
        /// </summary>
        /// <param name="package"></param>
        /// <returns></returns>
        public ResponsePackage DeleteOldControls(RequestObjectPackage<SaveControlModel> package)
        {
            // все контролы формы
            List<ControlListEntity> oldControls = new ControlsLogic().GetControlsByFormID(new RequestPackage() { requestID = package.requestID }).GetDataOrExceptionIfError();
            // список свежих ID контролов
            List<int> newIDs = new List<int>();
            Action<SaveControlModel> action = null;
            action = delegate(SaveControlModel current)
            {
                if (current.control.ID > 0)
                {
                    newIDs.Add(current.control.ID);
                }
                if (current.items != null && current.items.Count > 0)
                {
                    foreach (SaveControlModel ctrl in current.items)
                    {
                        action(ctrl);
                    }
                }
            };
            action(package.requestData);
            // Для контролов удалить все евенты
            RequestPackage delEvents = new RequestPackage() { requestID = package.requestID };
            ResponsePackage responseDelEvents = new DBUtils().RunSqlAction(new EventEditorDataCRUD().DeleteAllEvents, delEvents);
            responseDelEvents.ThrowExceptionIfError();
            // ID контролов для удаления
            List<int> IDsToDelete = oldControls.FindAll(x => newIDs.Contains(x.ID) == false).OrderByDescending(x => x.orderNumber).Select(x => x.ID).ToList();
            if (IDsToDelete != null && IDsToDelete.Count > 0)
            {
                foreach (int id in IDsToDelete)
                {
                    RequestPackage req = new RequestPackage() { requestID = id };
                    // Проверить возможность удаления
                    ResponsePackage responseCheck = new DBUtils(new FireBirdConnectionFactory()).RunSqlAction(new ControlsRepository().CheckDeleteControl, req);
                    responseCheck.ThrowExceptionIfError();
                    // Удалить свойства контрола
                    ResponsePackage responseDelProperty = new DBUtils(new FireBirdConnectionFactory()).RunSqlAction(new ControlPropertiesRepository().DeletePropertiesByControlID, req);
                    responseDelProperty.ThrowExceptionIfError();
                    // Удалить контрол
                    ResponsePackage responseDelControl = new DBUtils(new FireBirdConnectionFactory()).RunSqlAction(new ControlsRepository().DeleteControlByID, req);
                    responseDelControl.ThrowExceptionIfError();
                }
            }

            return new ResponsePackage();
        }