Example #1
0
        public FieldResponse CreateField(Guid entityId, FieldType type, Expando data, string name, string label, Guid? id = null,
                    string placeholderText = "", string helpText = "", string description = "",
                    bool system = false, bool required = false, bool unique = false, bool searchable = false, bool auditable = false)
        {
            Field field = null;

            if (data == null)
                data = new Expando();

            switch (type)
            {
                case FieldType.AutoNumberField:
                    field = new AutoNumberField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((AutoNumberField)field).DefaultValue = (decimal?)data["defaultValue"];
                    if (HasKey(data, "startingNumber") && data["startingNumber"] != null)
                        ((AutoNumberField)field).StartingNumber = (decimal?)data["startingNumber"];
                    if (HasKey(data, "displayFormat") && data["displayFormat"] != null)
                        ((AutoNumberField)field).DisplayFormat = (string)data["displayFormat"];
                    break;
                case FieldType.CheckboxField:
                    field = new CheckboxField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((CheckboxField)field).DefaultValue = (bool?)data["defaultValue"] ?? false;
                    break;
                case FieldType.CurrencyField:
                    field = new CurrencyField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((CurrencyField)field).DefaultValue = (decimal?)data["defaultValue"];
                    if (HasKey(data, "minValue") && data["minValue"] != null)
                        ((CurrencyField)field).MinValue = (decimal?)data["minValue"];
                    if (HasKey(data, "maxValue") && data["maxValue"] != null)
                        ((CurrencyField)field).MaxValue = (decimal?)data["maxValue"];
                    if (HasKey(data, "currency") && data["currency"] != null)
                    {
                        ((CurrencyField)field).Currency = (CurrencyType)data["currency"];
                    }
                    else
                    {
                        ((CurrencyField)field).Currency = new CurrencyType();
                        ((CurrencyField)field).Currency.Code = "USD";
                        ((CurrencyField)field).Currency.DecimalDigits = 2;
                        ((CurrencyField)field).Currency.Name = "US dollar";
                        ((CurrencyField)field).Currency.NamePlural = "US dollars";
                        ((CurrencyField)field).Currency.Rounding = 0;
                        ((CurrencyField)field).Currency.Symbol = "$";
                        ((CurrencyField)field).Currency.SymbolNative = "$";
                        ((CurrencyField)field).Currency.SymbolPlacement = CurrencySymbolPlacement.Before;
                        ((CurrencyField)field).DefaultValue = 1;
                    }
                    break;
                case FieldType.DateField:
                    field = new DateField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((DateField)field).DefaultValue = (DateTime?)data["defaultValue"];
                    if (HasKey(data, "format") && data["format"] != null)
                        ((DateField)field).Format = (string)data["format"];
                    if (HasKey(data, "useCurrentTimeAsDefaultValue") && data["useCurrentTimeAsDefaultValue"] != null)
                        ((DateField)field).UseCurrentTimeAsDefaultValue = (bool?)data["useCurrentTimeAsDefaultValue"];
                    break;
                case FieldType.DateTimeField:
                    field = new DateTimeField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((DateTimeField)field).DefaultValue = (DateTime?)data["defaultValue"];
                    if (HasKey(data, "format") && data["format"] != null)
                        ((DateTimeField)field).Format = (string)data["format"];
                    if (HasKey(data, "useCurrentTimeAsDefaultValue") && data["useCurrentTimeAsDefaultValue"] != null)
                        ((DateTimeField)field).UseCurrentTimeAsDefaultValue = (bool?)data["useCurrentTimeAsDefaultValue"];
                    break;
                case FieldType.EmailField:
                    field = new EmailField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((EmailField)field).DefaultValue = (string)data["defaultValue"];
                    if (HasKey(data, "maxLength") && data["maxLength"] != null)
                        ((EmailField)field).MaxLength = (int?)data["maxLength"];
                    break;
                case FieldType.FileField:
                    field = new FileField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((FileField)field).DefaultValue = (string)data["defaultValue"];
                    break;
                case FieldType.GuidField:
                    field = new GuidField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((GuidField)field).DefaultValue = (Guid?)data["defaultValue"];
                    if (HasKey(data, "generateNewId") && data["generateNewId"] != null)
                        ((GuidField)field).GenerateNewId = (bool?)data["generateNewId"];
                    break;
                case FieldType.HtmlField:
                    field = new HtmlField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((HtmlField)field).DefaultValue = (string)data["defaultValue"];
                    break;
                case FieldType.ImageField:
                    field = new ImageField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((ImageField)field).DefaultValue = (string)data["defaultValue"];
                    break;
                case FieldType.MultiLineTextField:
                    field = new MultiLineTextField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((MultiLineTextField)field).DefaultValue = (string)data["defaultValue"];
                    if (HasKey(data, "maxLength") && data["maxLength"] != null)
                        ((MultiLineTextField)field).MaxLength = (int?)data["maxLength"];
                    if (HasKey(data, "visibleLineNumber") && data["visibleLineNumber"] != null)
                        ((MultiLineTextField)field).VisibleLineNumber = (int?)data["visibleLineNumber"];
                    break;
                case FieldType.MultiSelectField:
                    field = new MultiSelectField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((MultiSelectField)field).DefaultValue = (IEnumerable<string>)data["defaultValue"];
                    if (HasKey(data, "options") && data["options"] != null)
                        ((MultiSelectField)field).Options = (List<MultiSelectFieldOption>)data["options"];
                    break;
                case FieldType.NumberField:
                    field = new NumberField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((NumberField)field).DefaultValue = (int?)data["defaultValue"];
                    if (HasKey(data, "minValue") && data["minValue"] != null)
                        ((NumberField)field).MinValue = (decimal?)data["minValue"];
                    if (HasKey(data, "maxValue") && data["maxValue"] != null)
                        ((NumberField)field).MaxValue = (decimal?)data["maxValue"];
                    if (HasKey(data, "decimalPlaces") && data["decimalPlaces"] != null)
                        ((NumberField)field).DecimalPlaces = (byte?)data["decimalPlaces"];
                    break;
                case FieldType.PasswordField:
                    field = new PasswordField();
                    if (HasKey(data, "maxLength") && data["maxLength"] != null)
                        ((PasswordField)field).MaxLength = (int?)data["maxLength"];
                    if (HasKey(data, "minLength") && data["minLength"] != null)
                        ((PasswordField)field).MinLength = (int?)data["minLength"];
                    if (HasKey(data, "encrypted") && data["encrypted"] != null)
                        ((PasswordField)field).Encrypted = (bool?)data["encrypted"];
                    break;
                case FieldType.PercentField:
                    field = new PercentField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((PercentField)field).DefaultValue = (decimal?)data["defaultValue"]; //0.01m;
                    if (HasKey(data, "minValue") && data["minValue"] != null)
                        ((PercentField)field).MinValue = (decimal?)data["minValue"];
                    if (HasKey(data, "maxValue") && data["maxValue"] != null)
                        ((PercentField)field).MaxValue = (decimal?)data["maxValue"];
                    if (HasKey(data, "decimalPlaces") && data["decimalPlaces"] != null)
                        ((PercentField)field).DecimalPlaces = (byte?)data["decimalPlaces"];
                    break;
                case FieldType.PhoneField:
                    field = new PhoneField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((PhoneField)field).DefaultValue = (string)data["defaultValue"];
                    if (HasKey(data, "format") && data["format"] != null)
                        ((PhoneField)field).Format = (string)data["format"];
                    if (HasKey(data, "maxLength") && data["maxLength"] != null)
                        ((PhoneField)field).DefaultValue = (string)data["maxLength"];
                    break;
                case FieldType.SelectField:
                    field = new SelectField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((SelectField)field).DefaultValue = (string)data["defaultValue"];
                    if (HasKey(data, "options") && data["options"] != null)
                        ((SelectField)field).Options = (List<SelectFieldOption>)data["options"];
                    break;
                case FieldType.TextField:
                    field = new TextField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((TextField)field).DefaultValue = (string)data["defaultValue"];
                    if (HasKey(data, "maxLength") && data["maxLength"] != null)
                        ((TextField)field).MaxLength = (int?)data["maxLength"];
                    break;
                case FieldType.UrlField:
                    field = new UrlField();
                    if (HasKey(data, "defaultValue") && data["defaultValue"] != null)
                        ((UrlField)field).DefaultValue = (string)data["defaultValue"];
                    if (HasKey(data, "maxLength") && data["maxLength"] != null)
                        ((UrlField)field).MaxLength = (int?)data["maxLength"];
                    if (HasKey(data, "openTargetInNewWindow") && data["openTargetInNewWindow"] != null)
                        ((UrlField)field).OpenTargetInNewWindow = (bool?)data["openTargetInNewWindow"];
                    break;
                default:
                    {
                        FieldResponse response = new FieldResponse();
                        response.Timestamp = DateTime.UtcNow;
                        response.Success = false;
                        response.Message = "Not supported field type!";
                        response.Success = false;
                        return response;
                    }
            }

            field.Id = id.HasValue && id.Value != Guid.Empty ? id.Value : Guid.NewGuid();
            field.Name = name;
            field.Label = label;
            field.PlaceholderText = placeholderText;
            field.Description = description;
            field.HelpText = helpText;
            field.Required = required;
            field.Unique = unique;
            field.Searchable = searchable;
            field.Auditable = auditable;
            field.System = system;

            return CreateField(entityId, field.MapTo<InputField>());
        }
Example #2
0
        private List<Field> CreateTestFieldCollection(Entity entity)
        {
            List<Field> fields = new List<Field>();

            AutoNumberField autoNumberField = new AutoNumberField();

            autoNumberField.Id = Guid.NewGuid();
            autoNumberField.Name = "AutoNumberField";
            autoNumberField.Label = "AutoNumber field";
            autoNumberField.PlaceholderText = "AutoNumber field placeholder text";
            autoNumberField.Description = "AutoNumber field description";
            autoNumberField.HelpText = "AutoNumber field help text";
            autoNumberField.Required = true;
            autoNumberField.Unique = true;
            autoNumberField.Searchable = true;
            autoNumberField.Auditable = true;
            autoNumberField.System = true;
            autoNumberField.DefaultValue = 0;

            autoNumberField.DisplayFormat = "A{0000}";
            autoNumberField.StartingNumber = 10;

            fields.Add(autoNumberField);

            CheckboxField checkboxField = new CheckboxField();

            checkboxField.Id = Guid.NewGuid();
            checkboxField.Name = "CheckboxField";
            checkboxField.Label = "Checkbox field";
            checkboxField.PlaceholderText = "Checkbox field placeholder text";
            checkboxField.Description = "Checkbox field description";
            checkboxField.HelpText = "Checkbox field help text";
            checkboxField.Required = true;
            checkboxField.Unique = true;
            checkboxField.Searchable = true;
            checkboxField.Auditable = true;
            checkboxField.System = true;
            checkboxField.DefaultValue = false;

            fields.Add(checkboxField);

            CurrencyField currencyField = new CurrencyField();

            currencyField.Id = Guid.NewGuid();
            currencyField.Name = "CurrencyField";
            currencyField.Label = "Currency field";
            currencyField.PlaceholderText = "Currency field placeholder text";
            currencyField.Description = "Currency field description";
            currencyField.HelpText = "Currency field help text";
            currencyField.Required = true;
            currencyField.Unique = true;
            currencyField.Searchable = true;
            currencyField.Auditable = true;
            currencyField.System = true;
            currencyField.DefaultValue = 0;

            currencyField.MinValue = 1;
            currencyField.MaxValue = 35;
            currencyField.Currency = new CurrencyType();
            currencyField.Currency.Name = "US Dollar";
            currencyField.Currency.NamePlural = "US Dollars";
            currencyField.Currency.Symbol = "$";
            currencyField.Currency.SymbolNative = "$";
            currencyField.Currency.SymbolPlacement = CurrencySymbolPlacement.Before;
            currencyField.Currency.Code = "USD";
            currencyField.Currency.DecimalDigits = 2;
            currencyField.Currency.Rounding = 0;

            fields.Add(currencyField);

            DateField dateField = new DateField();

            dateField.Id = Guid.NewGuid();
            dateField.Name = "DateField";
            dateField.Label = "Date field";
            dateField.PlaceholderText = "Date field placeholder text";
            dateField.Description = "Date field description";
            dateField.HelpText = "Date field help text";
            dateField.Required = true;
            dateField.Unique = true;
            dateField.Searchable = true;
            dateField.Auditable = true;
            dateField.System = true;
            dateField.DefaultValue = DateTime.MinValue;

            dateField.Format = "dd MMM yyyy";

            fields.Add(dateField);

            DateTimeField dateTimeField = new DateTimeField();

            dateTimeField.Id = Guid.NewGuid();
            dateTimeField.Name = "DateTimeField";
            dateTimeField.Label = "DateTime field";
            dateTimeField.PlaceholderText = "DateTime field placeholder text";
            dateTimeField.Description = "DateTime field description";
            dateTimeField.HelpText = "DateTime field help text";
            dateTimeField.Required = true;
            dateTimeField.Unique = true;
            dateTimeField.Searchable = true;
            dateTimeField.Auditable = true;
            dateTimeField.System = true;
            dateTimeField.DefaultValue = DateTime.MinValue;

            dateTimeField.Format = "dd MMM yyyy HH:mm";

            fields.Add(dateTimeField);

            EmailField emailField = new EmailField();

            emailField.Id = Guid.NewGuid();
            emailField.Name = "EmailField";
            emailField.Label = "Email field";
            emailField.PlaceholderText = "Email field placeholder text";
            emailField.Description = "Email field description";
            emailField.HelpText = "Email field help text";
            emailField.Required = true;
            emailField.Unique = true;
            emailField.Searchable = true;
            emailField.Auditable = true;
            emailField.System = true;
            emailField.DefaultValue = "";

            emailField.MaxLength = 255;

            fields.Add(emailField);

            FileField fileField = new FileField();

            fileField.Id = Guid.NewGuid();
            fileField.Name = "FileField";
            fileField.Label = "File field";
            fileField.PlaceholderText = "File field placeholder text";
            fileField.Description = "File field description";
            fileField.HelpText = "File field help text";
            fileField.Required = true;
            fileField.Unique = true;
            fileField.Searchable = true;
            fileField.Auditable = true;
            fileField.System = true;
            fileField.DefaultValue = "";

            fields.Add(fileField);

            //FormulaField formulaField = new FormulaField();

            //formulaField.Id = Guid.NewGuid();
            //formulaField.Name = "Formula field";
            //formulaField.Label = "Formula field";
            //formulaField.PlaceholderText = "Formula field placeholder text";
            //formulaField.Description = "Formula field description";
            //formulaField.HelpText = "Formula field help text";
            //formulaField.Required = true;
            //formulaField.Unique = true;
            //formulaField.Searchable = true;
            //formulaField.Auditable = true;
            //formulaField.System = true;

            //formulaField.ReturnType = Api.FormulaFieldReturnType.Number;
            //formulaField.FormulaText = "2 + 5";
            //formulaField.DecimalPlaces = 2;

            //fields.Add(formulaField);

            HtmlField htmlField = new HtmlField();

            htmlField.Id = Guid.NewGuid();
            htmlField.Name = "HtmlField";
            htmlField.Label = "Html field";
            htmlField.PlaceholderText = "Html field placeholder text";
            htmlField.Description = "Html field description";
            htmlField.HelpText = "Html field help text";
            htmlField.Required = true;
            htmlField.Unique = true;
            htmlField.Searchable = true;
            htmlField.Auditable = true;
            htmlField.System = true;
            htmlField.DefaultValue = "";

            fields.Add(htmlField);

            ImageField imageField = new ImageField();

            imageField.Id = Guid.NewGuid();
            imageField.Name = "ImageField";
            imageField.Label = "Image field";
            imageField.PlaceholderText = "Image field placeholder text";
            imageField.Description = "Image field description";
            imageField.HelpText = "Image field help text";
            imageField.Required = true;
            imageField.Unique = true;
            imageField.Searchable = true;
            imageField.Auditable = true;
            imageField.System = true;
            imageField.DefaultValue = "";

            fields.Add(imageField);

            MultiLineTextField multiLineTextField = new MultiLineTextField();

            multiLineTextField.Id = Guid.NewGuid();
            multiLineTextField.Name = "MultiLineTextField";
            multiLineTextField.Label = "MultiLineText field";
            multiLineTextField.PlaceholderText = "MultiLineText field placeholder text";
            multiLineTextField.Description = "MultiLineText field description";
            multiLineTextField.HelpText = "MultiLineText field help text";
            multiLineTextField.Required = true;
            multiLineTextField.Unique = true;
            multiLineTextField.Searchable = true;
            multiLineTextField.Auditable = true;
            multiLineTextField.System = true;
            multiLineTextField.DefaultValue = "";

            multiLineTextField.MaxLength = 500;
            multiLineTextField.VisibleLineNumber = 10;

            fields.Add(multiLineTextField);

            MultiSelectField multiSelectField = new MultiSelectField();

            multiSelectField.Id = Guid.NewGuid();
            multiSelectField.Name = "MultiSelectField";
            multiSelectField.Label = "MultiSelect field";
            multiSelectField.PlaceholderText = "MultiSelect field placeholder text";
            multiSelectField.Description = "MultiSelect field description";
            multiSelectField.HelpText = "MultiSelect field help text";
            multiSelectField.Required = true;
            multiSelectField.Unique = true;
            multiSelectField.Searchable = true;
            multiSelectField.Auditable = true;
            multiSelectField.System = true;
            multiSelectField.DefaultValue = new string[] { "itemKey1", "itemKey4" };

            multiSelectField.Options = new List<MultiSelectFieldOption>();
            multiSelectField.Options.Add(new MultiSelectFieldOption("itemKey1", "itemValue1"));
            multiSelectField.Options.Add(new MultiSelectFieldOption("itemKey2", "itemValue2"));
            multiSelectField.Options.Add(new MultiSelectFieldOption("itemKey3", "itemValue3"));
            multiSelectField.Options.Add(new MultiSelectFieldOption("itemKey4", "itemValue4"));
            multiSelectField.Options.Add(new MultiSelectFieldOption("itemKey5", "itemValue5"));
            multiSelectField.Options.Add(new MultiSelectFieldOption("itemKey6", "itemValue6"));

            fields.Add(multiSelectField);

            NumberField numberField = new NumberField();

            numberField.Id = Guid.NewGuid();
            numberField.Name = "NumberField";
            numberField.Label = "Number field";
            numberField.PlaceholderText = "Number field placeholder text";
            numberField.Description = "Number field description";
            numberField.HelpText = "Number field help text";
            numberField.Required = true;
            numberField.Unique = true;
            numberField.Searchable = true;
            numberField.Auditable = true;
            numberField.System = true;
            numberField.DefaultValue = 0;

            numberField.MinValue = 1;
            numberField.MaxValue = 100;
            numberField.DecimalPlaces = 3;

            fields.Add(numberField);

            PasswordField passwordField = new PasswordField();

            passwordField.Id = Guid.NewGuid();
            passwordField.Name = "PasswordField";
            passwordField.Label = "Password field";
            passwordField.PlaceholderText = "Password field placeholder text";
            passwordField.Description = "Password field description";
            passwordField.HelpText = "Password field help text";
            passwordField.Required = true;
            passwordField.Unique = true;
            passwordField.Searchable = true;
            passwordField.Auditable = true;
            passwordField.System = true;

            passwordField.MaxLength = 24;
            passwordField.MinLength = 6;

            fields.Add(passwordField);

            PercentField percentField = new PercentField();

            percentField.Id = Guid.NewGuid();
            percentField.Name = "PercentField";
            percentField.Label = "Percent field";
            percentField.PlaceholderText = "Percent field";
            percentField.Description = "Percent field description";
            percentField.HelpText = "Percent field help text";
            percentField.Required = true;
            percentField.Unique = true;
            percentField.Searchable = true;
            percentField.Auditable = true;
            percentField.System = true;
            percentField.DefaultValue = 0;

            percentField.MinValue = 1;
            percentField.MaxValue = 100;
            percentField.DecimalPlaces = 3;

            fields.Add(percentField);

            PhoneField phoneField = new PhoneField();

            phoneField.Id = Guid.NewGuid();
            phoneField.Name = "PhoneField";
            phoneField.Label = "Phone field";
            phoneField.PlaceholderText = "Phone field";
            phoneField.Description = "Phone field description";
            phoneField.HelpText = "Phone field help text";
            phoneField.Required = true;
            phoneField.Unique = true;
            phoneField.Searchable = true;
            phoneField.Auditable = true;
            phoneField.System = true;
            phoneField.DefaultValue = "";

            phoneField.Format = "{0000}-{000}-{000}";
            phoneField.MaxLength = 10;

            fields.Add(phoneField);

            GuidField primaryKeyField = new GuidField();

            primaryKeyField.Id = Guid.NewGuid();
            primaryKeyField.Name = "PrimaryKeyField";
            primaryKeyField.Label = "PrimaryKey field";
            primaryKeyField.PlaceholderText = "PrimaryKey field placeholder text";
            primaryKeyField.Description = "PrimaryKey field description";
            primaryKeyField.HelpText = "PrimaryKey field help text";
            primaryKeyField.Required = true;
            primaryKeyField.Unique = true;
            primaryKeyField.Searchable = true;
            primaryKeyField.Auditable = true;
            primaryKeyField.System = true;
            primaryKeyField.DefaultValue = Guid.Empty;

            fields.Add(primaryKeyField);

            SelectField selectField = new SelectField();

            selectField.Id = Guid.NewGuid();
            selectField.Name = "SelectField";
            selectField.Label = "Select field";
            selectField.PlaceholderText = "Select field placeholder text";
            selectField.Description = "Select field description";
            selectField.HelpText = "Select field help text";
            selectField.Required = true;
            selectField.Unique = true;
            selectField.Searchable = true;
            selectField.Auditable = true;
            selectField.System = true;
            selectField.DefaultValue = "itemKey2";

            selectField.Options = new List<SelectFieldOption>();
            selectField.Options.Add(new SelectFieldOption("itemKey1", "itemValue1"));
            selectField.Options.Add(new SelectFieldOption("itemKey2", "itemValue2"));
            selectField.Options.Add(new SelectFieldOption("itemKey3", "itemValue3"));
            selectField.Options.Add(new SelectFieldOption("itemKey4", "itemValue4"));
            selectField.Options.Add(new SelectFieldOption("itemKey5", "itemValue5"));
            selectField.Options.Add(new SelectFieldOption("itemKey6", "itemValue6"));

            fields.Add(selectField);

            TextField textField = new TextField();

            textField.Id = Guid.NewGuid();
            textField.Name = "TextField";
            textField.Label = "Text field";
            textField.PlaceholderText = "Text field placeholder text";
            textField.Description = "Text field description";
            textField.HelpText = "Text field help text";
            textField.Required = true;
            textField.Unique = true;
            textField.Searchable = true;
            textField.Auditable = true;
            textField.System = true;
            textField.DefaultValue = "";

            textField.MaxLength = 200;

            UrlField urlField = new UrlField();

            urlField.Id = Guid.NewGuid();
            urlField.Name = "UrlField";
            urlField.Label = "Url field";
            urlField.PlaceholderText = "Url field placeholder text";
            urlField.Description = "Url field description";
            urlField.HelpText = "Url field help text";
            urlField.Required = true;
            urlField.Unique = true;
            urlField.Searchable = true;
            urlField.Auditable = true;
            urlField.System = true;
            urlField.DefaultValue = "";

            urlField.MaxLength = 200;
            urlField.OpenTargetInNewWindow = true;

            fields.Add(urlField);

            return fields;
        }
        public ResponseModel EvaluateImportEntityRecordsFromCsv(string entityName, JObject postObject, bool enableWebHooks = true, object controller = null)
        {
            ResponseModel response = new ResponseModel();
            response.Message = "Records successfully evaluated";
            response.Timestamp = DateTime.UtcNow;
            response.Success = true;
            response.Object = null;

            List<EntityRelation> relations = relMan.Read().Object;
            EntityListResponse entitiesResponse = entMan.ReadEntities();
            List<Entity> entities = entitiesResponse.Object;
            Entity entity = entities.FirstOrDefault(e => e.Name == entityName);
            if (entity == null)
            {
                response.Success = false;
                response.Message = "Entity not found";
                return response;
            }

            var entityFields = entity.Fields;
            string fileTempPath = "";
            string clipboard = "";
            string generalCommand = "evaluate";
            EntityRecord commands = new EntityRecord();
            if (!postObject.IsNullOrEmpty() && postObject.Properties().Any(p => p.Name == "fileTempPath"))
            {
                fileTempPath = postObject["fileTempPath"].ToString();
            }

            if (!postObject.IsNullOrEmpty() && postObject.Properties().Any(p => p.Name == "clipboard"))
            {
                clipboard = postObject["clipboard"].ToString();
            }

            if (!postObject.IsNullOrEmpty() && postObject.Properties().Any(p => p.Name == "general_command"))
            {
                generalCommand = postObject["general_command"].ToString(); //could be "evaluate" & "evaluate-import" the first will just evaluate, the second one will evaluate and import if all is fine
            }

            if (!postObject.IsNullOrEmpty() && generalCommand == "evaluate-import" &&
                postObject.Properties().Any(p => p.Name == "commands") && !((JToken)postObject["commands"]).IsNullOrEmpty())
            {
                var commandsObject = postObject["commands"].Value<JObject>();
                if (!commandsObject.IsNullOrEmpty() && commandsObject.Properties().Any())
                {
                    foreach (var property in commandsObject.Properties())
                    {
                        commands[property.Name] = ((JObject)property.Value).ToObject<EntityRecord>();
                    }
                }
            }

            //VALIDATE:
            if (fileTempPath == "" && clipboard == "")
            {
                response.Success = false;
                response.Message = "Both clipboard and file CSV sources are empty!";
                return response;
            }

            CsvReader csvReader = null;
            string csvContent = "";
            bool usingClipboard = false;
            //CASE: 1 If fileTempPath != "" -> get the csv from the file
            if (fileTempPath != "")
            {
                if (fileTempPath.StartsWith("/fs"))
                    fileTempPath = fileTempPath.Remove(0, 3);

                if (!fileTempPath.StartsWith("/"))
                    fileTempPath = "/" + fileTempPath;

                fileTempPath = fileTempPath.ToLowerInvariant();

                DbFileRepository fs = new DbFileRepository();
                DbFile file = fs.Find(fileTempPath);

                if (file == null)
                {
                    response.Timestamp = DateTime.UtcNow;
                    response.Success = false;
                    response.Message = "Import failed! File does not exist!";
                    response.Errors.Add(new ErrorModel("fileTempPath", fileTempPath, "Import failed! File does not exist!"));
                    return response;
                }

                byte[] fileBytes = file.GetBytes();
                MemoryStream fileStream = new MemoryStream(fileBytes);
                TextReader reader = new StreamReader(fileStream);
                csvReader = new CsvReader(reader);
            }
            //CASE: 2 If fileTempPath == "" -> get the csv from the clipboard
            else
            {
                csvContent = clipboard;
                usingClipboard = true;
                csvReader = new CsvReader(new StringReader(csvContent));
            }

            csvReader.Configuration.HasHeaderRecord = true;
            csvReader.Configuration.IsHeaderCaseSensitive = false;
            if (usingClipboard)
            {
                csvReader.Configuration.Delimiter = "\t";
            }
            //The evaluation object has two properties - errors and warnings. Both are objects
            //The error validation object should return arrays by field name ex. {field_name:[null,null,"error message"]}
            //The warning validation object should return arrays by field name ex. {field_name:[null,null,"warning message"]}
            var evaluationObj = new EntityRecord();
            evaluationObj["errors"] = new EntityRecord();
            evaluationObj["warnings"] = new EntityRecord();
            evaluationObj["records"] = new List<EntityRecord>();
            evaluationObj["commands"] = new EntityRecord(); // the commands is object with properties the fieldNames and the following object as value {command: "to_create" | "no_import" | "to_update", fieldType: 14, fieldName: "name", fieldLabel: "label"}
            var statsObject = new EntityRecord();
            statsObject["to_create"] = 0;
            statsObject["no_import"] = 0;
            statsObject["to_update"] = 0;
            statsObject["errors"] = 0;
            statsObject["warnings"] = 0;
            evaluationObj["stats"] = statsObject;
            evaluationObj["general_command"] = generalCommand;

            csvReader.Read();
            List<string> columnNames = csvReader.FieldHeaders.ToList();
            foreach (var columnName in columnNames)
            {
                //Init the error list for this field
                if (!((EntityRecord)evaluationObj["errors"]).GetProperties().Any(p => p.Key == columnName))
                {
                    ((EntityRecord)evaluationObj["errors"])[columnName] = new List<string>();
                }
                //Init the warning list for this field
                var warningList = new List<string>();
                if (!((EntityRecord)evaluationObj["warnings"]).GetProperties().Any(p => p.Key == columnName))
                {
                    ((EntityRecord)evaluationObj["warnings"])[columnName] = new List<string>();
                }

                bool existingField = false;

                Field currentFieldMeta = null;
                Field relationEntityFieldMeta = null;
                Field relationFieldMeta = null;
                Entity relationEntity = null;
                string direction = "origin-target";
                EntityRelationType relationType = EntityRelationType.OneToMany;
                string fieldEnityName = entity.Name;
                string fieldRelationName = string.Empty;

                if (!commands.GetProperties().Any(p => p.Key == columnName))
                {
                    commands[columnName] = new EntityRecord();
                    ((EntityRecord)commands[columnName])["command"] = "no_import";
                    ((EntityRecord)commands[columnName])["entityName"] = fieldEnityName;
                    ((EntityRecord)commands[columnName])["fieldType"] = FieldType.TextField;
                    ((EntityRecord)commands[columnName])["fieldName"] = columnName;
                    ((EntityRecord)commands[columnName])["fieldLabel"] = columnName;
                }

                if (columnName.Contains(RELATION_SEPARATOR))
                {
                    var relationData = columnName.Split(RELATION_SEPARATOR).Select(x => x.Trim()).Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
                    if (relationData.Count > 2)
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("The specified field name '{0}' is incorrect. Only first level relation can be specified.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }

                    string relationName = relationData[0];
                    string relationFieldName = relationData[1];

                    if (string.IsNullOrWhiteSpace(relationName) || relationName == "$" || relationName == "$$")
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. The relation name is not specified.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }
                    else if (!relationName.StartsWith("$"))
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. The relation name is not correct.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }
                    else
                        relationName = relationName.Substring(1);

                    //check for target priority mark $$
                    if (relationName.StartsWith("$"))
                    {
                        relationName = relationName.Substring(1);
                        direction = "target-origin";
                    }

                    if (string.IsNullOrWhiteSpace(relationFieldName))
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. The relation field name is not specified.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }

                    var relation = relations.SingleOrDefault(x => x.Name == relationName);
                    if (relation == null)
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. The relation does not exist.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }

                    if (relation.TargetEntityId != entity.Id && relation.OriginEntityId != entity.Id)
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. The relation field belongs to entity that does not relate to current entity.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }

                    if (relation.OriginEntityId == relation.TargetEntityId)
                    {
                        if (direction == "origin-target")
                        {
                            relationEntity = entity;
                            relationEntityFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Id == relation.TargetFieldId);
                            currentFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Name == relationFieldName);
                            relationFieldMeta = entity.Fields.FirstOrDefault(f => f.Id == relation.OriginFieldId);
                        }
                        else
                        {
                            relationEntity = entity;
                            relationEntityFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Id == relation.OriginFieldId);
                            currentFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Name == relationFieldName);
                            relationFieldMeta = entity.Fields.FirstOrDefault(f => f.Id == relation.TargetFieldId);
                        }
                    }
                    else if (relation.OriginEntityId == entity.Id)
                    {
                        //direction doesn't matter
                        relationEntity = entities.FirstOrDefault(e => e.Id == relation.TargetEntityId);
                        relationEntityFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Id == relation.TargetFieldId);
                        currentFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Name == relationFieldName);
                        relationFieldMeta = entity.Fields.FirstOrDefault(f => f.Id == relation.OriginFieldId);
                    }
                    else
                    {
                        //direction doesn't matter
                        relationEntity = entities.FirstOrDefault(e => e.Id == relation.OriginEntityId);
                        relationEntityFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Id == relation.OriginFieldId);
                        currentFieldMeta = relationEntity.Fields.FirstOrDefault(f => f.Name == relationFieldName);
                        relationFieldMeta = entity.Fields.FirstOrDefault(f => f.Id == relation.TargetFieldId);
                    }

                    if (currentFieldMeta == null)
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. Fields with such name does not exist.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }

                    if (currentFieldMeta.GetFieldType() == FieldType.MultiSelectField || currentFieldMeta.GetFieldType() == FieldType.TreeSelectField)
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. Fields from Multiselect and Treeselect types can't be used as relation fields.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }

                    if (relation.RelationType == EntityRelationType.OneToOne &&
                        ((relation.TargetEntityId == entity.Id && relationFieldMeta.Name == "id") || (relation.OriginEntityId == entity.Id && relationEntityFieldMeta.Name == "id")))
                    {
                        ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. Can't use relations when relation field is id field.", columnName));
                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        continue;
                    }

                    fieldEnityName = relationEntity.Name;
                    fieldRelationName = relationName;
                    relationType = relation.RelationType;
                }
                else
                {
                    currentFieldMeta = entity.Fields.FirstOrDefault(f => f.Name == columnName);
                }

                if (currentFieldMeta != null)
                {
                    existingField = true;
                }

                if (!existingField && !string.IsNullOrWhiteSpace(fieldRelationName))
                {
                    ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Creation of a new relation field is not allowed.", columnName));
                    ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                }

                #region << Commands >>
                //we need to init the command for this column - if it is new field the default is do nothing, if it is existing the default is update
                if (existingField)
                {
                    if (generalCommand == "evaluate")
                    {
                        ((EntityRecord)commands[columnName])["command"] = "to_update";
                        ((EntityRecord)commands[columnName])["relationName"] = fieldRelationName;
                        ((EntityRecord)commands[columnName])["relationDirection"] = direction;
                        ((EntityRecord)commands[columnName])["relationType"] = relationType;
                        ((EntityRecord)commands[columnName])["entityName"] = fieldEnityName;
                        ((EntityRecord)commands[columnName])["fieldType"] = currentFieldMeta.GetFieldType();
                        ((EntityRecord)commands[columnName])["fieldName"] = currentFieldMeta.Name;
                        ((EntityRecord)commands[columnName])["fieldLabel"] = currentFieldMeta.Label;

                        bool hasPermisstion = SecurityContext.HasEntityPermission(EntityPermission.Update, entity);
                        if (!hasPermisstion)
                        {
                            ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add($"Access denied. Trying to update record in entity '{entity.Name}' with no update access.");
                            ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        }
                    }

                    ((EntityRecord)commands[columnName])["currentFieldMeta"] = currentFieldMeta;
                    ((EntityRecord)commands[columnName])["relationEntityFieldMeta"] = relationEntityFieldMeta;
                    ((EntityRecord)commands[columnName])["relationFieldMeta"] = relationFieldMeta;
                }
                else
                {
                    if (generalCommand == "evaluate")
                    {
                        //we need to check wheather the property of the command match the fieldName
                        ((EntityRecord)commands[columnName])["command"] = "to_create";
                        ((EntityRecord)commands[columnName])["entityName"] = fieldEnityName;
                        ((EntityRecord)commands[columnName])["fieldType"] = FieldType.TextField;
                        ((EntityRecord)commands[columnName])["fieldName"] = columnName;
                        ((EntityRecord)commands[columnName])["fieldLabel"] = columnName;

                        bool hasPermisstion = SecurityContext.HasEntityPermission(EntityPermission.Create, entity);
                        if (!hasPermisstion)
                        {
                            ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add($"Access denied. Trying to create record in entity '{entity.Name}' with no create access.");
                            ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        }
                    }
                }
                #endregion
            }

            evaluationObj["commands"] = commands;

            do
            {
                Dictionary<string, EntityRecord> fieldsFromRelationList = new Dictionary<string, EntityRecord>();
                Dictionary<string, string> rowRecordData = new Dictionary<string, string>();

                foreach (var columnName in columnNames)
                {
                    string fieldValue = csvReader.GetField<string>(columnName);
                    rowRecordData[columnName] = fieldValue;

                    EntityRecord commandRecords = ((EntityRecord)commands[columnName]);
                    Field currentFieldMeta = new TextField();
                    if (commandRecords.GetProperties().Any(p => p.Key == "currentFieldMeta"))
                        currentFieldMeta = (Field)commandRecords["currentFieldMeta"];

                    if (columnName.Contains(RELATION_SEPARATOR))
                    {
                        string relationName = (string)((EntityRecord)commands[columnName])["relationName"];
                        string relationDirection = (string)((EntityRecord)commands[columnName])["relationDirection"];
                        string relationEntityName = (string)((EntityRecord)commands[columnName])["entityName"];

                        EntityRelationType relationType = (EntityRelationType)Enum.Parse(typeof(EntityRelationType), (((EntityRecord)commands[columnName])["relationType"]).ToString());
                        Field relationEntityFieldMeta = (Field)((EntityRecord)commands[columnName])["relationEntityFieldMeta"];
                        Field relationFieldMeta = (Field)((EntityRecord)commands[columnName])["relationFieldMeta"];

                        var relation = relations.SingleOrDefault(x => x.Name == relationName);

                        string relationFieldValue = "";
                        if (columnNames.Any(c => c == relationFieldMeta.Name))
                            relationFieldValue = csvReader.GetField<string>(relationFieldMeta.Name);

                        QueryObject filter = null;
                        if ((relationType == EntityRelationType.OneToMany && relation.OriginEntityId == relation.TargetEntityId && relationDirection == "origin-target") ||
                            (relationType == EntityRelationType.OneToMany && relation.OriginEntityId != relation.TargetEntityId && relation.OriginEntityId == entity.Id) ||
                            relationType == EntityRelationType.ManyToMany)
                        {
                            //expect array of values
                            if (!columnNames.Any(c => c == relationFieldMeta.Name) || string.IsNullOrEmpty(relationFieldValue))
                            {
                                ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. Relation field does not exist into input record data or its value is null.", columnName));
                                ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                            }

                            List<string> values = new List<string>();
                            if (relationFieldValue.StartsWith("[") && relationFieldValue.EndsWith("]"))
                            {
                                values = JsonConvert.DeserializeObject<List<string>>(relationFieldValue);
                            }
                            if (values.Count < 1)
                                continue;

                            List<QueryObject> queries = new List<QueryObject>();
                            foreach (var val in values)
                            {
                                queries.Add(EntityQuery.QueryEQ(currentFieldMeta.Name, val));
                            }

                            filter = EntityQuery.QueryOR(queries.ToArray());
                        }
                        else
                        {
                            filter = EntityQuery.QueryEQ(currentFieldMeta.Name, DbRecordRepository.ExtractFieldValue(fieldValue, currentFieldMeta, true));
                        }

                        EntityRecord fieldsFromRelation = new EntityRecord();

                        if (fieldsFromRelationList.Any(r => r.Key == relation.Name))
                        {
                            fieldsFromRelation = fieldsFromRelationList[relationName];
                        }
                        else
                        {
                            fieldsFromRelation["columns"] = new List<string>();
                            fieldsFromRelation["queries"] = new List<QueryObject>();
                            fieldsFromRelation["direction"] = relationDirection;
                            fieldsFromRelation["relationEntityName"] = relationEntityName;
                        }

                        ((List<string>)fieldsFromRelation["columns"]).Add(columnName);
                        ((List<QueryObject>)fieldsFromRelation["queries"]).Add(filter);
                        fieldsFromRelationList[relationName] = fieldsFromRelation;
                    }
                }

                foreach (var fieldsFromRelation in fieldsFromRelationList)
                {
                    EntityRecord fieldsFromRelationValue = fieldsFromRelation.Value;
                    List<string> columnList = (List<string>)fieldsFromRelationValue["columns"];
                    List<QueryObject> queries = (List<QueryObject>)fieldsFromRelationValue["queries"];
                    string relationDirection = (string)fieldsFromRelationValue["direction"];
                    string relationEntityName = (string)fieldsFromRelationValue["relationEntityName"];
                    QueryObject filter = EntityQuery.QueryAND(queries.ToArray());

                    var relation = relations.SingleOrDefault(r => r.Name == fieldsFromRelation.Key);

                    //get related records
                    QueryResponse relatedRecordResponse = recMan.Find(new EntityQuery(relationEntityName, "*", filter, null, null, null));

                    if (!relatedRecordResponse.Success || relatedRecordResponse.Object.Data.Count < 1)
                    {
                        foreach (var columnName in columnList)
                        {
                            ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. The relation record does not exist.", columnName));
                            ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        }
                    }
                    else if (relatedRecordResponse.Object.Data.Count > 1 && ((relation.RelationType == EntityRelationType.OneToMany && relation.OriginEntityId == relation.TargetEntityId && relationDirection == "target-origin") ||
                        (relation.RelationType == EntityRelationType.OneToMany && relation.OriginEntityId != relation.TargetEntityId && relation.TargetEntityId == entity.Id) ||
                        relation.RelationType == EntityRelationType.OneToOne))
                    {
                        //there can be no more than 1 records
                        foreach (var columnName in columnList)
                        {
                            ((List<string>)((EntityRecord)evaluationObj["errors"])[columnName]).Add(string.Format("Invalid relation '{0}'. There are multiple relation records matching this value.", columnName));
                            ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                        }
                    }

                    fieldsFromRelationList[fieldsFromRelation.Key]["relatedRecordResponse"] = relatedRecordResponse;
                }

                var rowRecord = new EntityRecord();
                if ((int)statsObject["errors"] == 0)
                {
                    foreach (var columnName in columnNames)
                    {
                        string fieldValue = rowRecordData[columnName];
                        EntityRecord commandRecords = ((EntityRecord)commands[columnName]);
                        Field currentFieldMeta = new TextField();
                        if (commandRecords.GetProperties().Any(p => p.Key == "currentFieldMeta"))
                            currentFieldMeta = (Field)commandRecords["currentFieldMeta"];
                        string fieldEnityName = (string)commandRecords["entityName"];
                        string command = (string)commandRecords["command"];

                        bool existingField = false;
                        if (command == "to_update")
                            existingField = true;

                        if (existingField)
                        {
                            #region << Validation >>

                            var errorsList = (List<string>)((EntityRecord)evaluationObj["errors"])[columnName];
                            var warningList = (List<string>)((EntityRecord)evaluationObj["warnings"])[columnName];

                            if (columnName.Contains(RELATION_SEPARATOR))
                            {
                                string relationName = (string)((EntityRecord)commands[columnName])["relationName"];
                                string relationDirection = (string)((EntityRecord)commands[columnName])["relationDirection"];
                                string relationEntityName = (string)((EntityRecord)commands[columnName])["entityName"];

                                EntityRelationType relationType = (EntityRelationType)Enum.Parse(typeof(EntityRelationType), (((EntityRecord)commands[columnName])["relationType"]).ToString());
                                Field relationEntityFieldMeta = (Field)((EntityRecord)commands[columnName])["relationEntityFieldMeta"];
                                Field relationFieldMeta = (Field)((EntityRecord)commands[columnName])["relationFieldMeta"];

                                var relation = relations.SingleOrDefault(x => x.Name == relationName);

                                QueryResponse relatedRecordResponse = (QueryResponse)fieldsFromRelationList[relationName]["relatedRecordResponse"];

                                var relatedRecords = relatedRecordResponse.Object.Data;
                                List<Guid> relatedRecordValues = new List<Guid>();
                                foreach (var relatedRecord in relatedRecords)
                                {
                                    relatedRecordValues.Add((Guid)relatedRecord[relationEntityFieldMeta.Name]);
                                }

                                string relationFieldValue = "";
                                if (columnNames.Any(c => c == relationFieldMeta.Name))
                                    relationFieldValue = rowRecordData[relationFieldMeta.Name];

                                if (relation.RelationType == EntityRelationType.OneToOne &&
                                    ((relation.OriginEntityId == relation.TargetEntityId && relationDirection == "origin-target") || relation.OriginEntityId == entity.Id))
                                {
                                    if (!columnNames.Any(c => c == relationFieldMeta.Name) || string.IsNullOrWhiteSpace(relationFieldValue))
                                    {
                                        errorsList.Add(string.Format("Invalid relation '{0}'. Relation field does not exist into input record data or its value is null.", columnName));
                                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                    }
                                }
                                else if (relation.RelationType == EntityRelationType.OneToMany &&
                                    ((relation.OriginEntityId == relation.TargetEntityId && relationDirection == "origin-target") || relation.OriginEntityId == entity.Id))
                                {
                                    if (!columnNames.Any(c => c == relationFieldMeta.Name) || string.IsNullOrWhiteSpace(relationFieldValue))
                                    {
                                        errorsList.Add(string.Format("Invalid relation '{0}'. Relation field does not exist into input record data or its value is null.", columnName));
                                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                    }
                                }
                                else if (relation.RelationType == EntityRelationType.ManyToMany)
                                {
                                    foreach (Guid relatedRecordIdValue in relatedRecordValues)
                                    {
                                        Guid relRecordId = Guid.Empty;
                                        if (!Guid.TryParse(relationFieldValue, out relRecordId))
                                        {
                                            errorsList.Add("Invalid record value for field: '" + columnName + "'. Invalid value: '" + fieldValue + "'");
                                            ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                        }
                                    }
                                }

                            }
                            if (string.IsNullOrWhiteSpace(fieldValue))
                            {
                                if (currentFieldMeta.Required && currentFieldMeta.Name != "id")
                                {
                                    errorsList.Add("Field is required. Value can not be empty!");
                                    ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                }
                            }
                            else if (!(fieldValue.StartsWith("[") && fieldValue.EndsWith("]")))
                            {
                                FieldType fType = (FieldType)currentFieldMeta.GetFieldType();
                                switch (fType)
                                {
                                    case FieldType.AutoNumberField:
                                    case FieldType.CurrencyField:
                                    case FieldType.NumberField:
                                    case FieldType.PercentField:
                                        {
                                            decimal decValue;
                                            if (!decimal.TryParse(fieldValue, out decValue))
                                            {
                                                errorsList.Add("Value have to be of decimal type!");
                                                ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                            }
                                        }
                                        break;
                                    case FieldType.CheckboxField:
                                        {
                                            bool bValue;
                                            if (!bool.TryParse(fieldValue, out bValue))
                                            {
                                                errorsList.Add("Value have to be of boolean type!");
                                                ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                            }
                                        }
                                        break;
                                    case FieldType.DateField:
                                    case FieldType.DateTimeField:
                                        {
                                            DateTime dtValue;
                                            if (!DateTime.TryParse(fieldValue, out dtValue))
                                            {
                                                errorsList.Add("Value have to be of datetime type!");
                                                ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                            }
                                        }
                                        break;
                                    case FieldType.MultiSelectField:
                                        {

                                        }
                                        break;
                                    case FieldType.SelectField:
                                        {
                                            if (!((SelectField)currentFieldMeta).Options.Any(o => o.Key == fieldValue))
                                            {
                                                errorsList.Add("Value does not exist in select field options!");
                                                ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                            }
                                        }
                                        break;
                                    case FieldType.TreeSelectField:
                                        {

                                        }
                                        break;
                                    case FieldType.GuidField:
                                        {
                                            Guid gValue;
                                            if (!Guid.TryParse(fieldValue, out gValue))
                                            {
                                                errorsList.Add("Value have to be of guid type!");
                                                ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                            }

                                        }
                                        break;
                                }
                            }

                            ((EntityRecord)evaluationObj["errors"])[columnName] = errorsList;

                            //validate the value for warnings
                            ((EntityRecord)evaluationObj["warnings"])[columnName] = warningList;
                            #endregion
                        }

                        #region << Data >>
                        //Submit row data

                        if (!(command == "no_import" && generalCommand == "evaluate-import"))
                            rowRecord[columnName] = fieldValue;
                        #endregion
                    }

                    if (enableWebHooks && generalCommand == "evaluate-import")
                    {
                        #region << WebHook Filters >>

                        Guid? recordId = null;
                        if (rowRecord.GetProperties().Any(p => p.Key == "id") && !string.IsNullOrWhiteSpace((string)rowRecord["id"]))
                        {
                            Guid id;
                            if (Guid.TryParse((string)rowRecord["id"], out id))
                                recordId = id;
                        }
                        //////////////////////////////////////////////////////////////////////////////////////
                        //WEBHOOK FILTERS << create_record_input_filter >> AND << update_record_input_filter >>
                        //////////////////////////////////////////////////////////////////////////////////////
                        #region
                        try
                        {
                            dynamic hookFilterObj = new ExpandoObject();
                            hookFilterObj.record = rowRecord;
                            hookFilterObj.recordId = recordId;
                            hookFilterObj.controller = controller;
                            string webHookName = (!recordId.HasValue || recordId.Value == Guid.Empty) ? SystemWebHookNames.CreateRecordInput : SystemWebHookNames.UpdateRecordInput;
                            hookFilterObj = hooksService.ProcessFilters(webHookName, entityName, hookFilterObj);
                            rowRecord = hookFilterObj.record;
                        }
                        catch (Exception ex)
                        {
                            response.Success = false;
                            response.Object = evaluationObj;
                            response.Timestamp = DateTime.UtcNow;
                            response.Message = (!recordId.HasValue || recordId.Value == Guid.Empty) ?
                                "Plugin error in web hook create_record_input_filter: " + ex.Message :
                                "Plugin error in web hook update_record_input_filter: " + ex.Message;
                            return response;
                            //throw new Exception("Plugin error in web hook update_record_input_filter: " + ex.Message);
                        }// <<<
                        #endregion

                        var validationErrors = new List<ErrorModel>();

                        //////////////////////////////////////////////////////////////////////////////////////
                        //WEBHOOK FILTER << update_record_validation_errors_filter >>
                        //////////////////////////////////////////////////////////////////////////////////////
                        #region
                        try
                        {
                            dynamic hookFilterObj = new ExpandoObject();
                            hookFilterObj.errors = validationErrors;
                            hookFilterObj.record = rowRecord;
                            hookFilterObj.recordId = recordId;
                            hookFilterObj.controller = controller;
                            string webHookName = (!recordId.HasValue || recordId.Value == Guid.Empty) ? SystemWebHookNames.CreateRecordValidationErrors : SystemWebHookNames.UpdateRecordValidationErrors;
                            hookFilterObj = hooksService.ProcessFilters(SystemWebHookNames.UpdateRecordValidationErrors, entityName, hookFilterObj);
                            validationErrors = hookFilterObj.errors;
                        }
                        catch (Exception ex)
                        {
                            response.Success = false;
                            response.Object = evaluationObj;
                            response.Timestamp = DateTime.UtcNow;
                            response.Message = (!recordId.HasValue || recordId.Value == Guid.Empty) ?
                                "Plugin error in web hook create_record_validation_errors_filter: " + ex.Message :
                                "Plugin error in web hook update_record_validation_errors_filter: " + ex.Message;
                            return response;
                            //throw new Exception ("Plugin error in web hook update_record_validation_errors_filter: " + ex.Message));
                        }// <<<
                        #endregion

                        if (validationErrors.Count > 0)
                        {
                            List<string> errorsList = (List<string>)((EntityRecord)evaluationObj["errors"])["id"];
                            foreach (var validationError in validationErrors)
                            {
                                errorsList.Add(validationError.Message);
                                ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;
                                continue;
                            }
                        }

                        #endregion
                    }
                }
                else
                {
                    foreach (var columnName in columnNames)
                    {
                        EntityRecord commandRecords = ((EntityRecord)commands[columnName]);
                        string command = (string)commandRecords["command"];

                        string fieldValue = csvReader.GetField<string>(columnName);
                        if (!(command == "no_import" && generalCommand == "evaluate-import"))
                            rowRecord[columnName] = fieldValue;
                    }
                }

                ((List<EntityRecord>)evaluationObj["records"]).Add(rowRecord);

            }
            while (csvReader.Read());

            foreach (var columnName in columnNames)
            {
                if (commands.GetProperties().Any(p => p.Key == columnName))
                {
                    ((EntityRecord)commands[columnName]).Properties.Remove("currentFieldMeta");
                    ((EntityRecord)commands[columnName]).Properties.Remove("relationEntityFieldMeta");
                    ((EntityRecord)commands[columnName]).Properties.Remove("relationFieldMeta");
                }
            }

            if ((int)statsObject["errors"] > 0)
            {
                if (generalCommand == "evaluate-import")
                {
                    response.Success = false;
                    //evaluationObj["general_command"] = "evaluate";
                }
                response.Object = evaluationObj;
                return response;
            }

            if (generalCommand == "evaluate-import")
            {
                using (DbConnection connection = DbContext.Current.CreateConnection())
                {
                    connection.BeginTransaction();

                    try
                    {
                        int fieldCreated = 0;
                        foreach (var columnName in columnNames)
                        {
                            string command = (string)((EntityRecord)commands[columnName])["command"];

                            if (command == "to_create")
                            {
                                FieldType fieldType = (FieldType)Enum.Parse(typeof(FieldType), (((EntityRecord)commands[columnName])["fieldType"]).ToString());
                                string fieldName = (string)((EntityRecord)commands[columnName])["fieldName"];
                                string fieldLabel = (string)((EntityRecord)commands[columnName])["fieldLabel"];
                                var result = entMan.CreateField(entity.Id, fieldType, null, fieldName, fieldLabel);

                                if (!result.Success)
                                {
                                    string message = result.Message;
                                    if (result.Errors.Count > 0)
                                    {
                                        foreach (ErrorModel error in result.Errors)
                                            message += " " + error.Message;
                                    }
                                    throw new Exception(message);
                                }
                                fieldCreated++;
                            }
                        }

                        int successfullyCreatedRecordsCount = 0;
                        int successfullyUpdatedRecordsCount = 0;

                        List<EntityRecord> records = (List<EntityRecord>)evaluationObj["records"];
                        foreach (EntityRecord record in records)
                        {
                            EntityRecord newRecord = record;
                            QueryResponse result;
                            if (!newRecord.GetProperties().Any(x => x.Key == "id") || newRecord["id"] == null || string.IsNullOrEmpty(newRecord["id"].ToString()))
                            {
                                newRecord["id"] = Guid.NewGuid();
                                if (enableWebHooks)
                                {
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    //WEBHOOK FILTER << create_record_pre_save_filter >>
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    #region
                                    try
                                    {
                                        dynamic hookFilterObj = new ExpandoObject();
                                        hookFilterObj.record = newRecord;
                                        hookFilterObj.recordId = (Guid)newRecord["id"];
                                        hookFilterObj.controller = controller;
                                        hookFilterObj = hooksService.ProcessFilters(SystemWebHookNames.CreateRecordPreSave, entityName, hookFilterObj);
                                        newRecord = hookFilterObj.record;
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new Exception("Plugin error in web hook create_record_pre_save_filter: " + ex.Message);
                                    }// <<<
                                    #endregion
                                }

                                result = recMan.CreateRecord(entityName, newRecord);

                                if (result.Success)
                                    successfullyCreatedRecordsCount++;

                                if (result.Success && enableWebHooks)
                                {
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    //WEBHOOK ACTION << create_record >>
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    #region
                                    try
                                    {
                                        dynamic hookActionObj = new ExpandoObject();
                                        hookActionObj.record = result.Object.Data[0];
                                        hookActionObj.result = result;
                                        hookActionObj.controller = controller;
                                        hooksService.ProcessActions(SystemWebHookNames.CreateRecordAction, entityName, hookActionObj);
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new Exception("Plugin error in web hook create_record_success_action: " + ex.Message);
                                    }// <<<
                                    #endregion
                                }
                            }
                            else
                            {
                                if (enableWebHooks)
                                {
                                    Guid id;
                                    if (Guid.TryParse((string)newRecord["id"], out id))
                                        newRecord["id"] = id;
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    //WEBHOOK FILTER << update_record_pre_save_filter >>
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    #region
                                    try
                                    {
                                        dynamic hookFilterObj = new ExpandoObject();
                                        hookFilterObj.record = newRecord;
                                        hookFilterObj.recordId = new Guid(newRecord["id"].ToString());
                                        hookFilterObj.controller = controller;
                                        hookFilterObj = hooksService.ProcessFilters(SystemWebHookNames.UpdateRecordPreSave, entityName, hookFilterObj);
                                        newRecord = hookFilterObj.record;
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new Exception("Plugin error in web hook update_record_pre_save_filter: " + ex.Message);
                                    }// <<<
                                    #endregion
                                }
                                result = recMan.UpdateRecord(entityName, newRecord);

                                if (result.Success)
                                    successfullyUpdatedRecordsCount++;

                                if (result.Success && enableWebHooks)
                                {
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    //WEBHOOK ACTION << update_record_success_action >>
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    #region
                                    try
                                    {
                                        dynamic hookActionObj = new ExpandoObject();
                                        hookActionObj.record = result.Object.Data[0];
                                        hookActionObj.oldRecord = newRecord;
                                        hookActionObj.result = result;
                                        hookActionObj.recordId = result.Object.Data[0]["id"];
                                        hookActionObj.controller = controller;
                                        hooksService.ProcessActions(SystemWebHookNames.UpdateRecordAction, entityName, hookActionObj);
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new Exception("Plugin error in web hook update_record_success_action: " + ex.Message);
                                    }// <<<
                                    #endregion
                                }
                            }

                            if (!result.Success)
                            {
                                string message = result.Message;
                                if (result.Errors.Count > 0)
                                {
                                    foreach (ErrorModel error in result.Errors)
                                        message += " " + error.Message;
                                }
                                throw new Exception(message);
                            }
                        }

                        ((EntityRecord)evaluationObj["stats"])["to_create"] = successfullyCreatedRecordsCount;
                        ((EntityRecord)evaluationObj["stats"])["to_update"] = successfullyUpdatedRecordsCount;
                        ((EntityRecord)evaluationObj["stats"])["total_records"] = records.Count;
                        ((EntityRecord)evaluationObj["stats"])["fields_created"] = fieldCreated;

                        connection.CommitTransaction();
                    }
                    catch (Exception e)
                    {
                        //WebVella.ERP.Api.Cache.ClearEntities();

                        connection.RollbackTransaction();

                        ((EntityRecord)evaluationObj["stats"])["errors"] = (int)((EntityRecord)evaluationObj["stats"])["errors"] + 1;

                        response.Success = false;
                        response.Object = evaluationObj;
                        response.Timestamp = DateTime.UtcNow;
            #if DEBUG
                        response.Message = e.Message + e.StackTrace;
            #else
                            response.Message = "Import failed! An internal error occurred!";
            #endif
                    }
                }

                Cache.ClearEntities();
                response.Object = evaluationObj;
                return response;
            }

            response.Object = evaluationObj;
            return response;
        }