Example #1
0
        public void TimeLogCreateRecordSuccessAction(dynamic data)
        {
            EntityRecord record = (EntityRecord)data.record;

            var commentObject = new EntityRecord();

            commentObject["id"]            = Guid.NewGuid();
            commentObject["attachment_id"] = new Guid(record["id"].ToString());

            if (record.Properties.ContainsKey("comment_content") && record["comment_content"] != null)
            {
                commentObject["content"] = (string)((EntityRecord)data.record)["comment_content"];
            }

            if (record.Properties.ContainsKey("$task_1_n_attachment.id") && record["$task_1_n_attachment.id"] != null)
            {
                commentObject["task_id"] = new Guid(record["$task_1_n_attachment.id"].ToString());
            }

            if (record.Properties.ContainsKey("$bug_1_n_attachment.id") && record["$bug_1_n_attachment.id"] != null)
            {
                commentObject["bug_id"] = new Guid(record["$bug_1_n_attachment.id"].ToString());
            }

            var createResponse = recMan.CreateRecord("wv_project_comment", commentObject);

            if (!createResponse.Success)
            {
                throw new Exception(createResponse.Message);
            }
        }
		public void SaveRole(ErpRole role)
		{
			if (role == null)
				throw new ArgumentNullException(nameof(role));

			RecordManager recMan = new RecordManager();
			EntityRecord record = new EntityRecord();
			var allRoles = GetAllRoles();
			ErpRole existingRole = allRoles.SingleOrDefault(x => x.Id == role.Id);
			ValidationException valEx = new ValidationException();
			
			if (existingRole != null)
			{
				record["id"] = role.Id;
				record["description"] = role.Description;

				if (existingRole.Name != role.Name)
				{
					record["name"] = role.Name;

					if (string.IsNullOrWhiteSpace(role.Name))
						valEx.AddError("name", "Name is required.");
					else if (allRoles.Any(x => x.Name == role.Name))
						valEx.AddError("name", "Role with same name already exists");
				}

				valEx.CheckAndThrow();

				var response = recMan.UpdateRecord("role", record);
				if (!response.Success)
					throw new Exception(response.Message);

			}
			else
			{
				record["id"] = role.Id;
				record["description"] = role.Description;
				record["name"] = role.Name;

				if (string.IsNullOrWhiteSpace(role.Name))
					valEx.AddError("name", "Name is required.");
				else if (allRoles.Any(x => x.Name == role.Name))
					valEx.AddError("name", "Role with same name already exists");

				valEx.CheckAndThrow();

				var response = recMan.CreateRecord("role", record);
				if (!response.Success)
					throw new Exception(response.Message);

			}
		}
Example #3
0
        public void SaveEmail(Email email)
        {
            PrepareEmailXSearch(email);
            RecordManager recMan   = new RecordManager();
            var           response = recMan.Find(new EntityQuery("email", "*", EntityQuery.QueryEQ("id", email.Id)));

            if (response.Object != null && response.Object.Data != null && response.Object.Data.Count != 0)
            {
                recMan.UpdateRecord("email", email.MapTo <EntityRecord>());
            }
            else
            {
                recMan.CreateRecord("email", email.MapTo <EntityRecord>());
            }
        }
Example #4
0
        public void Create(LogType type, string source, string message, string details, LogNotificationStatus notificationStatus = LogNotificationStatus.NotNotified, bool saveDetailsAsJson = false)
        {
            EntityRecord logRecord = new EntityRecord();

            logRecord["id"]                  = Guid.NewGuid();
            logRecord["type"]                = ((int)type).ToString();
            logRecord["source"]              = source;
            logRecord["message"]             = message;
            logRecord["notification_status"] = ((int)notificationStatus).ToString();
            logRecord["details"]             = saveDetailsAsJson ? MakeDetailsJson(details) : details;
            logRecord["created_by"]          = SystemIds.SystemUserId;
            logRecord["last_modified_by"]    = SystemIds.SystemUserId;
            logRecord["created_on"]          = DateTime.UtcNow;
            logRecord["last_modified_on"]    = DateTime.UtcNow;

            RecordManager recMan   = new RecordManager();
            var           response = recMan.CreateRecord("system_log", logRecord);
        }
Example #5
0
        public static void CreateActivity(RecordManager recMan, string label, string subject, string description, Guid projectId, Guid?taskId, Guid?bugId)
        {
            var activityObj = new EntityRecord();

            activityObj["id"]          = Guid.NewGuid();
            activityObj["project_id"]  = projectId;
            activityObj["task_id"]     = taskId;
            activityObj["bug_id"]      = bugId;
            activityObj["label"]       = label;
            activityObj["subject"]     = subject;
            activityObj["description"] = description;

            var createResponse = recMan.CreateRecord("wv_project_activity", activityObj);

            if (!createResponse.Success)
            {
                throw new Exception(createResponse.Message);
            }
        }
Example #6
0
        internal void SaveEmail(Email email)
        {
            PrepareEmailXSearch(email);
            RecordManager recMan   = new RecordManager();
            var           response = recMan.Find(new EntityQuery("email", "*", EntityQuery.QueryEQ("id", email.Id)));

            if (response.Object != null && response.Object.Data != null && response.Object.Data.Count != 0)
            {
                response = recMan.UpdateRecord("email", email.MapTo <EntityRecord>());
            }
            else
            {
                response = recMan.CreateRecord("email", email.MapTo <EntityRecord>());
            }

            if (!response.Success)
            {
                throw new Exception(response.Message);
            }
        }
Example #7
0
        public IActionResult CreateTask([FromBody] JObject submitObj, Guid?projectId = null)
        {
            var response = new ResponseModel();
            var task     = new EntityRecord();

            task["id"] = Guid.NewGuid();
            if (projectId != null)
            {
                task["project_id"] = projectId;
            }
            #region << ConvertObject >>

            try
            {
                foreach (var prop in submitObj.Properties())
                {
                    switch (prop.Name.ToLower())
                    {
                    case "subject":
                        task["subject"] = (string)prop.Value;
                        break;

                    case "description":
                        task["description"] = (string)prop.Value;
                        break;

                    case "$project_1_n_task.id":
                        task["project_id"] = (Guid)prop.Value;
                        break;

                    case "start_date":
                        task["start_date"] = ((DateTime)prop.Value).ToUniversalTime();
                        break;

                    case "end_date":
                        task["end_date"] = ((DateTime)prop.Value).ToUniversalTime();
                        break;

                    case "priority":
                        task["priority"] = (string)prop.Value;
                        break;

                    case "status":
                        task["status"] = (string)prop.Value;
                        break;

                    case "owner_id":
                        //will be init in the below
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                response.Success   = false;
                response.Errors    = new List <ErrorModel>();
                response.Timestamp = DateTime.UtcNow;
                response.Message   = "Validation error : " + ex.Message;
                response.Object    = null;
                return(Json(response));
            }
            #endregion

            #region << Validation >>
            var validationErrors = new List <ErrorModel>();
            var validationError  = new ErrorModel();
            if (!task.Properties.ContainsKey("subject") || string.IsNullOrWhiteSpace((string)task["subject"]))
            {
                validationError         = new ErrorModel();
                validationError.Key     = "subject";
                validationError.Message = "subject is required";
                validationError.Value   = "";
                validationErrors.Add(validationError);
            }

            if (!task.Properties.ContainsKey("project_id") || string.IsNullOrWhiteSpace((string)task["project_id"]))
            {
                validationError         = new ErrorModel();
                validationError.Key     = "project_id";
                validationError.Message = "project_id is required";
                validationError.Value   = "";
                validationErrors.Add(validationError);
            }

            if (!task.Properties.ContainsKey("status") || string.IsNullOrWhiteSpace((string)task["status"]))
            {
                validationError         = new ErrorModel();
                validationError.Key     = "status";
                validationError.Message = "status is required";
                validationError.Value   = "";
                validationErrors.Add(validationError);
            }

            if (!task.Properties.ContainsKey("priority") || string.IsNullOrWhiteSpace((string)task["priority"]))
            {
                validationError         = new ErrorModel();
                validationError.Key     = "priority";
                validationError.Message = "priority is required";
                validationError.Value   = "";
                validationErrors.Add(validationError);
            }


            if (validationErrors.Count > 0)
            {
                response.Success   = false;
                response.Timestamp = DateTime.UtcNow;
                response.Errors    = validationErrors;
                response.Message   = "Validation error occurred!";
                response.Object    = null;
                return(Json(response));
            }

            #endregion

            #region << Get project owner and set as ticket owner >>
            EntityRecord projectObject = null;
            {
                var filterObj = EntityQuery.QueryEQ("id", (Guid)task["project_id"]);
                var query     = new EntityQuery("wv_project", "*", filterObj, null, null, null);
                var result    = recMan.Find(query);
                if (!result.Success)
                {
                    response.Success   = false;
                    response.Timestamp = DateTime.UtcNow;
                    response.Message   = "Error getting the project: " + result.Message;
                    response.Object    = null;
                    return(Json(response));
                }
                else if (result.Object == null || result.Object.Data == null || !result.Object.Data.Any())
                {
                    response.Success   = false;
                    response.Timestamp = DateTime.UtcNow;
                    response.Message   = "Project not found";
                    response.Object    = null;
                    return(Json(response));
                }
                projectObject    = result.Object.Data[0];
                task["owner_id"] = (Guid)result.Object.Data[0]["owner_id"];
            }
            #endregion

            //Create transaction
            using (var connection = DbContext.Current.CreateConnection())
            {
                try
                {
                    connection.BeginTransaction();
                    //Update project tasks counters
                    {
                        var patchObject = new EntityRecord();
                        patchObject["id"] = (Guid)projectObject["id"];
                        switch ((string)task["status"])
                        {
                        case "not started":
                            patchObject["x_tasks_not_started"] = (decimal)projectObject["x_tasks_not_started"] + 1;
                            break;

                        case "in progress":
                            patchObject["x_tasks_in_progress"] = (decimal)projectObject["x_tasks_in_progress"] + 1;
                            break;

                        case "completed":
                            patchObject["x_tasks_completed"] = (decimal)projectObject["x_tasks_completed"] + 1;
                            break;
                        }
                        var updateResponse = recMan.UpdateRecord("wv_project", patchObject);
                        if (!updateResponse.Success)
                        {
                            throw new Exception(updateResponse.Message);
                        }
                    }
                    //Create task
                    {
                        var createResponse = recMan.CreateRecord("wv_task", task);
                        if (!createResponse.Success)
                        {
                            throw new Exception(createResponse.Message);
                        }
                    }
                    connection.CommitTransaction();
                }
                catch (Exception ex)
                {
                    connection.RollbackTransaction();
                    response.Success   = false;
                    response.Timestamp = DateTime.UtcNow;
                    response.Message   = "Error saving the task: " + ex.Message;
                    response.Object    = null;
                    return(Json(response));
                }
            }
            response.Success   = true;
            response.Timestamp = DateTime.UtcNow;
            response.Message   = "My projects successfully read";
            response.Object    = null;

            return(Json(response));
        }
Example #8
0
        public void Start(PluginStartArguments pluginStartArgs)
        {
            //initialize static context
            StaticContext.Initialize(pluginStartArgs.Plugin, pluginStartArgs.ServiceProvider);

            var entMan = new EntityManager();
            var relMan = new EntityRelationManager();
            var recMan = new RecordManager();
            var storeSystemSettings = DbContext.Current.SettingsRepository.Read();
            var systemSettings      = new SystemSettings(storeSystemSettings);

            using (SecurityContext.OpenSystemScope())
            {
                //Create transaction
                using (var connection = DbContext.Current.CreateConnection())
                {
                    try
                    {
                        connection.BeginTransaction();

                        //Here we need to initialize or update the environment based on the plugin requirements.
                        //The default place for the plugin data is the "plugin_data" entity -> the "data" text field, which is used to store stringified JSON
                        //containing the plugin settings or version

                        #region << 1.Get the current ERP database version and checks for other plugin dependencies >>
                        if (systemSettings.Version > 0)
                        {
                            //Do something if database version is not what you expect
                        }

                        //This plugin needs the webvella-crm plugin to be installed, so we will check this here
                        var installedPlugins = new PluginService().Plugins;
                        var crmPluginFound   = false;
                        foreach (var plugin in installedPlugins)
                        {
                            switch (plugin.Name)
                            {
                            case "webvella-crm":
                                crmPluginFound = true;
                                break;

                            default:
                                break;
                            }
                        }

                        if (!crmPluginFound)
                        {
                            throw new Exception("'webvella-crm' plugin is required for the 'webvella-project' to operate");
                        }

                        #endregion

                        #region << 2.Get the current plugin settings from the database >>
                        var         currentPluginSettings   = new PluginSettings();
                        QueryObject pluginDataQueryObject   = EntityQuery.QueryEQ("name", WEBVELLA_PROJECT_PLUGIN_NAME);
                        var         pluginDataQuery         = new EntityQuery("plugin_data", "*", pluginDataQueryObject);
                        var         pluginDataQueryResponse = recMan.Find(pluginDataQuery);
                        if (!pluginDataQueryResponse.Success)
                        {
                            throw new Exception("plugin 'webvella-project' failed to get its settings due to: " + pluginDataQueryResponse.Message);
                        }

                        if (pluginDataQueryResponse.Object == null || !pluginDataQueryResponse.Object.Data.Any() || pluginDataQueryResponse.Object.Data[0]["data"] == DBNull.Value)
                        {
                            //plugin was not installed
                            currentPluginSettings.Version = 20160429;
                            {
                                string json = JsonConvert.SerializeObject(currentPluginSettings);
                                var    settingsEntityRecord = new EntityRecord();
                                settingsEntityRecord["id"]   = WEBVELLA_PROJECT_PLUGIN_ID;
                                settingsEntityRecord["name"] = WEBVELLA_PROJECT_PLUGIN_NAME;
                                settingsEntityRecord["data"] = json;
                                var settingsSaveReponse = recMan.CreateRecord("plugin_data", settingsEntityRecord);
                                if (!settingsSaveReponse.Success)
                                {
                                    throw new Exception("plugin 'webvella-project' failed to save its settings in the database due to: " + pluginDataQueryResponse.Message);
                                }
                            }
                        }
                        else
                        {
                            string json = (string)((List <EntityRecord>)pluginDataQueryResponse.Object.Data)[0]["data"];
                            currentPluginSettings = JsonConvert.DeserializeObject <PluginSettings>(json);
                        }
                        #endregion

                        #region << 3. Run methods based on the current installed version of the plugin >>
                        if (currentPluginSettings.Version < 20160430)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20160430;
                                Patch160430(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        if (currentPluginSettings.Version < 20160610)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20160610;
                                Patch160610(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        if (currentPluginSettings.Version < 20160613)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20160613;
                                Patch160613(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        if (currentPluginSettings.Version < 20160627)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20160627;
                                Patch160627(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        if (currentPluginSettings.Version < 20160707)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20160707;
                                Patch160707(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        if (currentPluginSettings.Version < 20161118)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20161118;
                                Patch161118(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        if (currentPluginSettings.Version < 20161119)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20161119;
                                Patch161119(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        if (currentPluginSettings.Version < 20170119)
                        {
                            try
                            {
                                currentPluginSettings.Version = 20170119;
                                Patch170119(entMan, relMan, recMan, createSampleRecords);
                            }
                            catch (Exception ex)
                            {
                                var exception = ex;
                                throw ex;
                            }
                        }

                        #endregion

                        #region << 4. Save needed changes to the plugin setting data >>
                        {
                            string json = JsonConvert.SerializeObject(currentPluginSettings);
                            var    settingsEntityRecord = new EntityRecord();
                            settingsEntityRecord["id"]   = WEBVELLA_PROJECT_PLUGIN_ID;
                            settingsEntityRecord["name"] = WEBVELLA_PROJECT_PLUGIN_NAME;
                            settingsEntityRecord["data"] = json;
                            var settingsUpdateReponse = recMan.UpdateRecord("plugin_data", settingsEntityRecord);
                            if (!settingsUpdateReponse.Success)
                            {
                                throw new Exception("plugin 'webvella-project' failed to update its settings in the database due to: " + pluginDataQueryResponse.Message);
                            }
                        }
                        #endregion


                        connection.CommitTransaction();
                    }
                    catch (Exception ex)
                    {
                        connection.RollbackTransaction();
                        throw ex;
                    }
                }
            }
        }
Example #9
0
        private static void RecordHookSample()
        {
            //you need to create manually database context
            using (var dbCtx = DbContext.CreateContext(ErpSettings.ConnectionString))
            {
                //create connection
                using (var connection = dbCtx.CreateConnection())
                {
                    //create security context - in this sample we use OpenSystemScope method,
                    //which used system user with all privileges and rights to erp data
                    using (var scope = SecurityContext.OpenSystemScope())
                    {
                        try
                        {
                            connection.BeginTransaction();

                            RecordManager recMan = new RecordManager();

                            //list all records from role entity
                            var existingRoles = new EqlCommand("SELECT * FROM role").Execute();
                            Console.WriteLine();
                            Console.WriteLine($"=== existing roles ===");
                            foreach (var rec in existingRoles)
                            {
                                Console.WriteLine($"name:{rec["name"]}");
                            }

                            //create new role record to triger record hook
                            EntityRecord newRec = new EntityRecord();
                            newRec["id"]   = Guid.NewGuid();
                            newRec["name"] = "New Role";
                            var result = recMan.CreateRecord("role", newRec);
                            if (!result.Success)
                            {
                                throw new Exception(result.Message);
                            }

                            Console.WriteLine($"=== roles after create ===");
                            existingRoles = new EqlCommand("SELECT * FROM role").Execute();
                            foreach (var rec in existingRoles)
                            {
                                Console.WriteLine($"name:{rec["name"]}");
                            }


                            newRec["name"] = "New changed Role";
                            result         = recMan.UpdateRecord("role", newRec);
                            if (!result.Success)
                            {
                                throw new Exception(result.Message);
                            }

                            Console.WriteLine($"=== roles after update ===");
                            existingRoles = new EqlCommand("SELECT * FROM role").Execute();
                            foreach (var rec in existingRoles)
                            {
                                Console.WriteLine($"name:{rec["name"]}");
                            }

                            result = recMan.DeleteRecord("role", (Guid)newRec["id"]);
                            if (!result.Success)
                            {
                                throw new Exception(result.Message);
                            }

                            Console.WriteLine($"=== roles after delete ===");
                            existingRoles = new EqlCommand("SELECT * FROM role").Execute();
                            foreach (var rec in existingRoles)
                            {
                                Console.WriteLine($"name:{rec["name"]}");
                            }
                        }
                        finally
                        {
                            //we allways rollback transaction - this method is only for presentation how hooks are triggered from console app
                            connection.RollbackTransaction();
                        }
                    }
                }
            }
        }
Example #10
0
        private static void Patch160430(EntityManager entMan, EntityRelationManager relMan, RecordManager recMan, bool createSampleRecords = false)
        {
            #region << Create CRM admin area >>
            //The areas are the main object for navigation for the user. You can attach entities and URLs later to them
            {
                var area = new EntityRecord();
                area["id"]        = CRM_ADMIN_AREA_ID;
                area["name"]      = "crm_admin";
                area["label"]     = "CRM Admin";
                area["icon_name"] = "users";
                area["color"]     = "pink";
                area["folder"]    = "Admin";
                area["weight"]    = 100;
                var areaRoles = new List <Guid>();
                areaRoles.Add(SystemIds.AdministratorRoleId);
                area["roles"] = JsonConvert.SerializeObject(areaRoles);
                var createAreaResult = recMan.CreateRecord("area", area);
                if (!createAreaResult.Success)
                {
                    throw new Exception("System error 10060. Area create with name : project_admin. Message:" + createAreaResult.Message);
                }
            }
            #endregion

            #region << wv_customer >>
            {
                #region << entity >>
                {
                    InputEntity entity = new InputEntity();
                    entity.Id                          = CUSTOMER_ENTITY_ID;
                    entity.Name                        = CUSTOMER_ENTITY_NAME;
                    entity.Label                       = "Customer";
                    entity.LabelPlural                 = "Customers";
                    entity.System                      = true;
                    entity.IconName                    = "building-o";
                    entity.Weight                      = 2;
                    entity.RecordPermissions           = new RecordPermissions();
                    entity.RecordPermissions.CanCreate = new List <Guid>();
                    entity.RecordPermissions.CanRead   = new List <Guid>();
                    entity.RecordPermissions.CanUpdate = new List <Guid>();
                    entity.RecordPermissions.CanDelete = new List <Guid>();
                    //Create
                    entity.RecordPermissions.CanCreate.Add(SystemIds.AdministratorRoleId);
                    entity.RecordPermissions.CanCreate.Add(SystemIds.RegularRoleId);
                    //READ
                    entity.RecordPermissions.CanRead.Add(SystemIds.AdministratorRoleId);
                    entity.RecordPermissions.CanRead.Add(SystemIds.RegularRoleId);
                    //UPDATE
                    entity.RecordPermissions.CanUpdate.Add(SystemIds.AdministratorRoleId);
                    entity.RecordPermissions.CanUpdate.Add(SystemIds.RegularRoleId);
                    //System fields and relations Ids should be hardcoded for the compare/change code generation to work later on correctly
                    var systemItemIdDictionary = new Dictionary <string, Guid>();
                    systemItemIdDictionary["id"]                           = new Guid("e8564a56-9917-4c45-a264-4c080f2d2b31");
                    systemItemIdDictionary["created_on"]                   = new Guid("1ca9c660-0042-47b3-91c7-e0f2b817633c");
                    systemItemIdDictionary["created_by"]                   = new Guid("12c29d6a-b5e5-4293-9e8a-91475d10dac9");
                    systemItemIdDictionary["last_modified_on"]             = new Guid("b6a172aa-b50a-403f-a178-f923a0d7576f");
                    systemItemIdDictionary["last_modified_by"]             = new Guid("6aab2af3-6909-4f8d-8c54-6a2403d6a25a");
                    systemItemIdDictionary["user_wv_customer_created_by"]  = new Guid("2d2045f4-0553-4ffd-bd12-cbef17aea14a");
                    systemItemIdDictionary["user_wv_customer_modified_by"] = new Guid("2ba6c8c5-2550-4f26-8611-f397c529a61c");
                    {
                        var response = entMan.CreateEntity(entity, false, false, systemItemIdDictionary);
                        if (!response.Success)
                        {
                            throw new Exception("System error 10050. Entity: " + CUSTOMER_ENTITY_NAME + " Field: entity creation" + " Message:" + response.Message);
                        }
                    }
                }
                #endregion

                #region << name >>
                {
                    InputTextField textboxField = new InputTextField();
                    textboxField.Id                    = new Guid("7fb95d0f-ab59-421d-974d-ab357e28a1f9");
                    textboxField.Name                  = "name";
                    textboxField.Label                 = "Name";
                    textboxField.PlaceholderText       = "";
                    textboxField.Description           = "";
                    textboxField.HelpText              = "";
                    textboxField.Required              = true;
                    textboxField.Unique                = false;
                    textboxField.Searchable            = true;
                    textboxField.Auditable             = false;
                    textboxField.System                = true;
                    textboxField.DefaultValue          = string.Empty;
                    textboxField.MaxLength             = null;
                    textboxField.EnableSecurity        = true;
                    textboxField.Permissions           = new FieldPermissions();
                    textboxField.Permissions.CanRead   = new List <Guid>();
                    textboxField.Permissions.CanUpdate = new List <Guid>();
                    //READ
                    textboxField.Permissions.CanRead.Add(SystemIds.AdministratorRoleId);
                    textboxField.Permissions.CanRead.Add(SystemIds.RegularRoleId);
                    //UPDATE
                    textboxField.Permissions.CanUpdate.Add(SystemIds.AdministratorRoleId);
                    {
                        var response = entMan.CreateField(CUSTOMER_ENTITY_ID, textboxField, false);
                        if (!response.Success)
                        {
                            throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Field: name" + " Message:" + response.Message);
                        }
                    }
                }
                #endregion
            }
            #endregion

            #region << View name: admin_details >>
            {
                var createViewEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                var createViewInput  = new InputRecordView();
                var viewRegion       = new InputRecordViewRegion();
                var viewSection      = new InputRecordViewSection();
                var viewRow          = new InputRecordViewRow();
                var viewColumn       = new InputRecordViewColumn();
                var viewItem         = new InputRecordViewFieldItem();

                #region << details >>
                createViewInput.Id                  = new Guid("3a0e1319-5357-49ec-9e85-8d9be2363fcf");
                createViewInput.Type                = "hidden";
                createViewInput.Name                = "admin_details";
                createViewInput.Label               = "Details";
                createViewInput.Title               = "";
                createViewInput.Default             = false;
                createViewInput.System              = true;
                createViewInput.Weight              = 15;
                createViewInput.CssClass            = null;
                createViewInput.IconName            = "building-o";
                createViewInput.DynamicHtmlTemplate = null;
                createViewInput.DataSourceUrl       = null;
                createViewInput.ServiceCode         = null;
                createViewInput.Regions             = new List <InputRecordViewRegion>();
                #endregion

                #region << Header Region >>
                viewRegion          = new InputRecordViewRegion();
                viewRegion.Name     = "header";
                viewRegion.Label    = "Header";
                viewRegion.Render   = true;
                viewRegion.Weight   = 1;
                viewRegion.CssClass = "";
                viewRegion.Sections = new List <InputRecordViewSection>();

                #region << Section >>
                viewSection           = new InputRecordViewSection();
                viewSection.Id        = new Guid("201882a6-c1f8-4f84-878d-fddfacdcb2d7");
                viewSection.Name      = "details";
                viewSection.Label     = "Details";
                viewSection.ShowLabel = false;
                viewSection.CssClass  = "";
                viewSection.Collapsed = false;
                viewSection.TabOrder  = "left-right";
                viewSection.Weight    = 1;
                viewSection.Rows      = new List <InputRecordViewRow>();

                #region << Row >>
                viewRow         = new InputRecordViewRow();
                viewRow.Id      = new Guid("ce09fdad-bb23-4f7f-b64b-190fec656711");
                viewRow.Weight  = 1;
                viewRow.Columns = new List <InputRecordViewColumn>();

                #region << Column 1 >>
                viewColumn = new InputRecordViewColumn();
                viewColumn.GridColCount = 12;
                viewColumn.Items        = new List <InputRecordViewItemBase>();


                #region << name >>
                {
                    viewItem            = new InputRecordViewFieldItem();
                    viewItem.EntityId   = CUSTOMER_ENTITY_ID;
                    viewItem.EntityName = CUSTOMER_ENTITY_NAME;
                    viewItem.FieldId    = createViewEntity.Fields.Single(x => x.Name == "name").Id;
                    viewItem.FieldName  = "name";
                    viewItem.Type       = "field";
                    viewColumn.Items.Add(viewItem);
                }
                #endregion


                //Save column
                viewRow.Columns.Add(viewColumn);
                #endregion

                //Save row
                viewSection.Rows.Add(viewRow);
                #endregion

                //Save section
                viewRegion.Sections.Add(viewSection);
                #endregion

                //Save region
                createViewInput.Regions.Add(viewRegion);
                #endregion

                #region << relation options >>
                createViewInput.RelationOptions = new List <EntityRelationOptionsItem>();
                #endregion

                #region << Sidebar >>
                createViewInput.Sidebar          = new InputRecordViewSidebar();
                createViewInput.Sidebar.CssClass = "";
                createViewInput.Sidebar.Render   = true;
                createViewInput.Sidebar.Render   = true;
                createViewInput.Sidebar.Items    = new List <InputRecordViewSidebarItemBase>();
                #endregion

                #region << action items >>
                createViewInput.ActionItems = new List <ActionItem>();
                var actionItem = new ActionItem();
                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_record_delete";
                    actionItem.Menu     = "page-title-dropdown";
                    actionItem.Weight   = 1;
                    actionItem.Template = "" +
                                          @"<a href=""javascript:void(0)"" confirmed-click=""ngCtrl.deleteRecord(ngCtrl)"" ng-confirm-click=""Are you sure?""
										ng-if=""::ngCtrl.userHasRecordPermissions('canDelete')"">
									<i class=""fa fa-trash go-red""></i> Delete Record
								</a>"                                ;
                    createViewInput.ActionItems.Add(actionItem);
                }
                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_back_button";
                    actionItem.Menu     = "sidebar-top";
                    actionItem.Weight   = 1;
                    actionItem.Template = "" +
                                          @"<a class=""back clearfix"" href=""javascript:void(0)"" ng-click=""sidebarData.goBack()""><i class=""fa fa-fw fa-arrow-left""></i> <span class=""text"">Back</span></a>";
                    createViewInput.ActionItems.Add(actionItem);
                }
                #endregion

                {
                    var response = entMan.CreateRecordView(CUSTOMER_ENTITY_ID, createViewInput);
                    if (!response.Success)
                    {
                        throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Updated view: admin_details" + " Message:" + response.Message);
                    }
                }
            }
            #endregion

            #region << View name: admin_create >>
            {
                var createViewEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                var createViewInput  = new InputRecordView();
                var viewRegion       = new InputRecordViewRegion();
                var viewSection      = new InputRecordViewSection();
                var viewRow          = new InputRecordViewRow();
                var viewColumn       = new InputRecordViewColumn();
                var viewItem         = new InputRecordViewFieldItem();

                #region << details >>
                createViewInput.Id                  = new Guid("93043954-ae70-41a3-b4b7-665531a23a76");
                createViewInput.Type                = "create";
                createViewInput.Name                = "admin_create";
                createViewInput.Label               = "Create customer";
                createViewInput.Title               = "";
                createViewInput.Default             = false;
                createViewInput.System              = true;
                createViewInput.Weight              = 25;
                createViewInput.CssClass            = null;
                createViewInput.IconName            = "building-o";
                createViewInput.DynamicHtmlTemplate = null;
                createViewInput.DataSourceUrl       = null;
                createViewInput.ServiceCode         = null;
                createViewInput.Regions             = new List <InputRecordViewRegion>();
                #endregion

                #region << Header Region >>
                viewRegion          = new InputRecordViewRegion();
                viewRegion.Name     = "header";
                viewRegion.Label    = "Header";
                viewRegion.Render   = true;
                viewRegion.Weight   = 1;
                viewRegion.CssClass = "";
                viewRegion.Sections = new List <InputRecordViewSection>();

                #region << Section >>
                viewSection           = new InputRecordViewSection();
                viewSection.Id        = new Guid("8d82e33e-139a-4c80-99ac-3721138bdc65");
                viewSection.Name      = "details";
                viewSection.Label     = "Details";
                viewSection.ShowLabel = false;
                viewSection.CssClass  = "";
                viewSection.Collapsed = false;
                viewSection.TabOrder  = "left-right";
                viewSection.Weight    = 1;
                viewSection.Rows      = new List <InputRecordViewRow>();

                #region << Row >>
                viewRow         = new InputRecordViewRow();
                viewRow.Id      = new Guid("cdc2da04-f92a-47e1-9259-6526816fe84d");
                viewRow.Weight  = 1;
                viewRow.Columns = new List <InputRecordViewColumn>();

                #region << Column 1 >>
                viewColumn = new InputRecordViewColumn();
                viewColumn.GridColCount = 12;
                viewColumn.Items        = new List <InputRecordViewItemBase>();


                #region << name >>
                {
                    viewItem            = new InputRecordViewFieldItem();
                    viewItem.EntityId   = CUSTOMER_ENTITY_ID;
                    viewItem.EntityName = CUSTOMER_ENTITY_NAME;
                    viewItem.FieldId    = createViewEntity.Fields.Single(x => x.Name == "name").Id;
                    viewItem.FieldName  = "name";
                    viewItem.Type       = "field";
                    viewColumn.Items.Add(viewItem);
                }
                #endregion


                //Save column
                viewRow.Columns.Add(viewColumn);
                #endregion

                //Save row
                viewSection.Rows.Add(viewRow);
                #endregion

                //Save section
                viewRegion.Sections.Add(viewSection);
                #endregion

                //Save region
                createViewInput.Regions.Add(viewRegion);
                #endregion

                #region << relation options >>
                createViewInput.RelationOptions = new List <EntityRelationOptionsItem>();
                #endregion

                #region << Sidebar >>
                createViewInput.Sidebar          = new InputRecordViewSidebar();
                createViewInput.Sidebar.CssClass = "";
                createViewInput.Sidebar.Render   = true;
                createViewInput.Sidebar.Render   = true;
                createViewInput.Sidebar.Items    = new List <InputRecordViewSidebarItemBase>();
                #endregion

                #region << action items >>
                createViewInput.ActionItems = new List <ActionItem>();
                var actionItem = new ActionItem();

                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_create_and_list";
                    actionItem.Menu     = "create-bottom";
                    actionItem.Weight   = 1;
                    actionItem.Template = "" +
                                          @"<a class=""btn btn-primary"" ng-click='ngCtrl.create(""default"")' ng-if=""ngCtrl.createViewRegion != null"">Create</a>";
                    createViewInput.ActionItems.Add(actionItem);
                }
                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_create_and_details";
                    actionItem.Menu     = "create-bottom";
                    actionItem.Weight   = 2;
                    actionItem.Template = "" +
                                          @"<a class=""btn btn-default btn-outline"" ng-click='ngCtrl.create(""details"")' ng-if=""ngCtrl.createViewRegion != null"">Create & Details</a>";
                    createViewInput.ActionItems.Add(actionItem);
                }
                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_create_cancel";
                    actionItem.Menu     = "create-bottom";
                    actionItem.Weight   = 3;
                    actionItem.Template = "" +
                                          @"<a class=""btn btn-default btn-outline"" ng-click=""ngCtrl.cancel()"">Cancel</a>";
                    createViewInput.ActionItems.Add(actionItem);
                }
                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_back_button";
                    actionItem.Menu     = "sidebar-top";
                    actionItem.Weight   = 1;
                    actionItem.Template = "" +
                                          @"<a class=""back clearfix"" href=""javascript:void(0)"" ng-click=""sidebarData.goBack()""><i class=""fa fa-fw fa-arrow-left""></i> <span class=""text"">Back</span></a>";
                    createViewInput.ActionItems.Add(actionItem);
                }
                #endregion
                {
                    var response = entMan.CreateRecordView(CUSTOMER_ENTITY_ID, createViewInput);
                    if (!response.Success)
                    {
                        throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Updated view: admin_create" + " Message:" + response.Message);
                    }
                }
            }
            #endregion

            #region << List name: admin >>
            {
                var createListEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                var createListInput  = new InputRecordList();
                var listItem         = new InputRecordListFieldItem();
                var listSort         = new InputRecordListSort();
                var listQuery        = new InputRecordListQuery();

                #region << details >>
                createListInput.Id                  = new Guid("ff15f200-8e68-4683-8576-4c8244405ca9");
                createListInput.Type                = "hidden";
                createListInput.Name                = "admin";
                createListInput.Label               = "Customers";
                createListInput.Weight              = 11;
                createListInput.Default             = false;
                createListInput.System              = true;
                createListInput.CssClass            = null;
                createListInput.IconName            = "building-o";
                createListInput.VisibleColumnsCount = 7;
                createListInput.ColumnWidthsCSV     = null;
                createListInput.PageSize            = 10;
                createListInput.DynamicHtmlTemplate = null;
                createListInput.DataSourceUrl       = null;
                createListInput.ServiceCode         = null;
                #endregion

                #region << action items >>
                createListInput.ActionItems = new List <ActionItem>();
                var actionItem = new ActionItem();
                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_record_details";
                    actionItem.Menu     = "record-row";
                    actionItem.Weight   = 1;
                    actionItem.Template = "" +
                                          @"<a class=""btn btn-default btn-outline"" ng-href=""{{::ngCtrl.getRecordDetailsUrl(record, ngCtrl)}}"">
							<i class=""fa fa-fw fa-eye""></i>
							</a>"                            ;
                    createListInput.ActionItems.Add(actionItem);
                }
                {
                    actionItem          = new ActionItem();
                    actionItem.Name     = "wv_create_record";
                    actionItem.Menu     = "page-title";
                    actionItem.Weight   = 1;
                    actionItem.Template = "" +
                                          @"<a class=""btn btn-default btn-outline hidden-xs"" ng-show=""::ngCtrl.userHasRecordPermissions('canCreate')"" 
    ng-href=""{{::ngCtrl.getRecordCreateUrl(ngCtrl)}}"">Add New</a>";
                    createListInput.ActionItems.Add(actionItem);
                }
                #endregion

                #region << Columns >>
                createListInput.Columns = new List <InputRecordListItemBase>();
                #region << name >>
                {
                    var fieldName = "name";
                    listItem            = new InputRecordListFieldItem();
                    listItem.EntityId   = CUSTOMER_ENTITY_ID;
                    listItem.EntityName = CUSTOMER_ENTITY_NAME;
                    listItem.FieldId    = createListEntity.Fields.Single(x => x.Name == fieldName).Id;
                    listItem.FieldName  = fieldName;
                    listItem.Type       = "field";
                    createListInput.Columns.Add(listItem);
                }
                #endregion

                #endregion

                #region << relation options >>
                createListInput.RelationOptions = new List <EntityRelationOptionsItem>();
                #endregion

                #region << query >>
                listQuery = new InputRecordListQuery();
                #endregion

                #region << Sort >>
                listSort = new InputRecordListSort();
                #endregion
                {
                    var response = entMan.CreateRecordList(CUSTOMER_ENTITY_ID, createListInput);
                    if (!response.Success)
                    {
                        throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Updated List: admin" + " Message:" + response.Message);
                    }
                }
            }
            #endregion

            #region << area add subscription: CRM Admin -> Customer >>
            {
                var updatedAreaId    = CRM_ADMIN_AREA_ID;
                var updateAreaResult = Helpers.UpsertEntityAsAreaSubscription(entMan, recMan, updatedAreaId, CUSTOMER_ENTITY_NAME, "admin_details", "admin_create", "admin");
                if (!updateAreaResult.Success)
                {
                    throw new Exception("System error 10060. Area update with id : " + updatedAreaId + " Message:" + updateAreaResult.Message);
                }
            }
            #endregion

            #region << customer lookup list >>
            {
                var createListEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                var createListInput  = new InputRecordList();
                var listItem         = new InputRecordListFieldItem();
                var listSort         = new InputRecordListSort();
                var listQuery        = new InputRecordListQuery();

                //General list details
                createListInput.Id                  = new Guid("2287d4dc-0e9e-4c00-a1d4-cc2b8bf0f315");
                createListInput.Name                = "lookup";
                createListInput.Label               = "Lookup";
                createListInput.Type                = "lookup";
                createListInput.Default             = true;
                createListInput.VisibleColumnsCount = 5;
                createListInput.System              = true;
                createListInput.Weight              = 10;
                createListInput.CssClass            = null;
                createListInput.IconName            = "list";
                createListInput.Columns             = new List <InputRecordListItemBase>();
                //Fields
                #region << name >>
                listItem            = new InputRecordListFieldItem();
                listItem.EntityId   = CUSTOMER_ENTITY_ID;
                listItem.EntityName = "customer";
                listItem.FieldId    = createListEntity.Fields.Single(x => x.Name == "name").Id;
                listItem.FieldName  = "name";
                listItem.Type       = "field";
                createListInput.Columns.Add(listItem);
                #endregion

                //Query
                #region << query descr >>
                listQuery = new InputRecordListQuery();
                #endregion


                //Sort
                #region << Sort >>
                createListInput.Sorts = new List <InputRecordListSort>();
                listSort           = new InputRecordListSort();
                listSort.FieldName = "name";
                listSort.SortType  = "ascending";
                createListInput.Sorts.Add(listSort);
                #endregion

                var newActionItemList = new List <ActionItem>();
                {
                    var actionItem = new ActionItem();
                    actionItem.Name     = "wv_create_record";
                    actionItem.Menu     = "page-title";
                    actionItem.Template = "<a class=\"btn btn-default btn-outline hidden-xs\" ng-show=\"::ngCtrl.userHasRecordPermissions('canCreate')\" \n    ng-href=\"{{::ngCtrl.getRecordCreateUrl()}}\">Add New</a>";
                    actionItem.Weight   = 1;
                    newActionItemList.Add(actionItem);
                }
                {
                    var actionItem = new ActionItem();
                    actionItem.Name     = "wv_record_details";
                    actionItem.Menu     = "record-row";
                    actionItem.Template = "<a class=\"btn btn-default btn-outline\" ng-href=\"{{::ngCtrl.getRecordDetailsUrl(record)}}\">\n    <i class=\"fa fa-fw fa-eye\"></i>\n</a>";
                    actionItem.Weight   = 1;
                    newActionItemList.Add(actionItem);
                }

                createListInput.ActionItems = newActionItemList;

                {
                    var responseObject = entMan.CreateRecordList(CUSTOMER_ENTITY_ID, createListInput);
                    if (!responseObject.Success)
                    {
                        throw new Exception("System error 10060. Entity: " + "user" + " Updated List: list_name" + " Message:" + responseObject.Message);
                    }
                }
            }
            #endregion

            if (createSampleRecords)
            {
                #region << Create Sample Customer >>
                {
                    var sampleRecord = new EntityRecord();
                    sampleRecord["id"]   = new Guid("fb06213f-7632-495b-bb8d-ed5ff07dc515");
                    sampleRecord["name"] = "Buckley Miller & Wright";
                    var createSampleRecordResult = recMan.CreateRecord(CUSTOMER_ENTITY_NAME, sampleRecord);
                    if (!createSampleRecordResult.Success)
                    {
                        throw new Exception("System error 10060. Create sample record. Message:" + createSampleRecordResult.Message);
                    }
                }
                #endregion

                #region << Create Sample Customer User >>
                {
                    var sampleRecord = new EntityRecord();
                    sampleRecord["id"]         = new Guid("307fe376-a1c6-495e-a7c0-2a78797565f2");
                    sampleRecord["first_name"] = "Sample";
                    sampleRecord["last_name"]  = "Customer";
                    sampleRecord["username"]   = "******";
                    sampleRecord["email"]      = "*****@*****.**";
                    sampleRecord["password"]   = "******";
                    sampleRecord["enabled"]    = true;
                    sampleRecord["verified"]   = true;
                    sampleRecord["image"]      = "/plugins/webvella-core/assets/avatar-deep-purple.png";
                    var createSampleRecordResult = recMan.CreateRecord(SystemIds.UserEntityId, sampleRecord);
                    if (!createSampleRecordResult.Success)
                    {
                        throw new Exception("System error 10060. Create sample customer record. Message:" + createSampleRecordResult.Message);
                    }
                }
                #endregion

                #region << Create Sample User Role>>
                {
                    var sampleRecord = new EntityRecord();
                    sampleRecord["id"]          = new Guid("27745245-09bd-4adb-8831-3870bcae46fe");
                    sampleRecord["name"]        = "crm_customer";
                    sampleRecord["description"] = "Sample Customer role for CRM application";
                    var createSampleRecordResult = recMan.CreateRecord(SystemIds.RoleEntityId, sampleRecord);
                    if (!createSampleRecordResult.Success)
                    {
                        throw new Exception("System error 10060. Create sample role record. Message:" + createSampleRecordResult.Message);
                    }
                }
                #endregion

                #region << Create relation between sample customer and role >>
                {
                    var createRelationNtoNResponse = recMan.CreateRelationManyToManyRecord(new Guid("0c4b119e-1d7b-4b40-8d2c-9e447cc656ab"), new Guid("27745245-09bd-4adb-8831-3870bcae46fe"), new Guid("307fe376-a1c6-495e-a7c0-2a78797565f2"));
                    if (!createRelationNtoNResponse.Success)
                    {
                        throw new Exception("Could not create item image relation" + createRelationNtoNResponse.Message);
                    }
                }
                #endregion

                #region << Create relation between sample customer and regular role >>
                {
                    var createRelationNtoNResponse = recMan.CreateRelationManyToManyRecord(new Guid("0c4b119e-1d7b-4b40-8d2c-9e447cc656ab"), new Guid("f16ec6db-626d-4c27-8de0-3e7ce542c55f"), new Guid("307fe376-a1c6-495e-a7c0-2a78797565f2"));
                    if (!createRelationNtoNResponse.Success)
                    {
                        throw new Exception("Could not create item image relation" + createRelationNtoNResponse.Message);
                    }
                }
                #endregion
            }
        }
Example #11
0
        public void Start()
        {
            var entMan = new EntityManager();
            var relMan = new EntityRelationManager();
            var recMan = new RecordManager();
            var storeSystemSettings = DbContext.Current.SettingsRepository.Read();
            var systemSettings      = new SystemSettings(storeSystemSettings);

            //Open scope with a user we will use for the operations further ahead
            var user = new SecurityManager().GetUser(SystemIds.FirstUserId);

            using (SecurityContext.OpenScope(user))
            {
                //Create transaction
                using (var connection = DbContext.Current.CreateConnection())
                {
                    try
                    {
                        connection.BeginTransaction();
                        //Here we need to initialize or update the environment based on the plugin requirements.
                        //The default place for the plugin data is the "plugin_data" entity -> the "data" text field, which is used to store stringified JSON
                        //containing the plugin settings or version

                        #region << 1.Get the current ERP database version and checks for other plugin dependencies >>

                        if (systemSettings.Version > 0)
                        {
                            //Do something if database version is not what you expect
                        }

                        //This plugin needs the webvella-crm plugin to be installed, so we will check this here
                        var installedPlugins = new PluginService().Plugins;
                        var corePluginFound  = false;
                        foreach (var plugin in installedPlugins)
                        {
                            if (plugin.Name == "webvella-core")
                            {
                                corePluginFound = true;
                                break;
                            }
                        }

                        if (!corePluginFound)
                        {
                            throw new Exception("'webvella-core' plugin is required for the 'webvella-crm' to operate");
                        }

                        #endregion

                        #region << 2.Get the current plugin settings from the database >>
                        var         currentPluginSettings   = new PluginSettings();
                        QueryObject pluginDataQueryObject   = EntityQuery.QueryEQ("name", WEBVELLA_CRM_PLUGIN_NAME);
                        var         pluginDataQuery         = new EntityQuery("plugin_data", "*", pluginDataQueryObject);
                        var         pluginDataQueryResponse = recMan.Find(pluginDataQuery);
                        if (!pluginDataQueryResponse.Success)
                        {
                            throw new Exception("plugin 'webvella-project' failed to get its settings due to: " + pluginDataQueryResponse.Message);
                        }

                        if (pluginDataQueryResponse.Object == null || !pluginDataQueryResponse.Object.Data.Any() || pluginDataQueryResponse.Object.Data[0]["data"] == DBNull.Value)
                        {
                            //plugin was not installed
                            currentPluginSettings.Version = 20160429;
                            {
                                string json = JsonConvert.SerializeObject(currentPluginSettings);
                                var    settingsEntityRecord = new EntityRecord();
                                settingsEntityRecord["id"]   = WEBVELLA_CRM_PLUGIN_ID;
                                settingsEntityRecord["name"] = WEBVELLA_CRM_PLUGIN_NAME;
                                settingsEntityRecord["data"] = json;
                                var settingsSaveReponse = recMan.CreateRecord("plugin_data", settingsEntityRecord);
                                if (!settingsSaveReponse.Success)
                                {
                                    throw new Exception("plugin 'webvella-project' failed to save its settings in the database due to: " + pluginDataQueryResponse.Message);
                                }
                            }
                        }
                        else
                        {
                            string json = (string)((List <EntityRecord>)pluginDataQueryResponse.Object.Data)[0]["data"];
                            currentPluginSettings = JsonConvert.DeserializeObject <PluginSettings>(json);
                        }
                        #endregion

                        #region << 3. Run methods based on the current installed version of the plugin >>
                        if (currentPluginSettings.Version < 20160430)
                        {
                            currentPluginSettings.Version = 20160430;

                            #region << Create CRM admin area >>
                            //The areas are the main object for navigation for the user. You can attach entities and URLs later to them
                            {
                                var area = new EntityRecord();
                                area["id"]        = CRM_ADMIN_AREA_ID;
                                area["name"]      = "crm_admin";
                                area["label"]     = "CRM Admin";
                                area["icon_name"] = "users";
                                area["color"]     = "pink";
                                area["folder"]    = "Admin";
                                area["weight"]    = 100;
                                var areaRoles = new List <Guid>();
                                areaRoles.Add(SystemIds.AdministratorRoleId);
                                area["roles"] = JsonConvert.SerializeObject(areaRoles);
                                var createAreaResult = recMan.CreateRecord("area", area);
                                if (!createAreaResult.Success)
                                {
                                    throw new Exception("System error 10060. Area create with name : project_admin. Message:" + createAreaResult.Message);
                                }
                            }
                            #endregion

                            #region << wv_customer >>
                            {
                                #region << entity >>
                                {
                                    InputEntity entity = new InputEntity();
                                    entity.Id                          = CUSTOMER_ENTITY_ID;
                                    entity.Name                        = CUSTOMER_ENTITY_NAME;
                                    entity.Label                       = "Customer";
                                    entity.LabelPlural                 = "Customers";
                                    entity.System                      = true;
                                    entity.IconName                    = "building-o";
                                    entity.Weight                      = 2;
                                    entity.RecordPermissions           = new RecordPermissions();
                                    entity.RecordPermissions.CanCreate = new List <Guid>();
                                    entity.RecordPermissions.CanRead   = new List <Guid>();
                                    entity.RecordPermissions.CanUpdate = new List <Guid>();
                                    entity.RecordPermissions.CanDelete = new List <Guid>();
                                    //Create
                                    entity.RecordPermissions.CanCreate.Add(SystemIds.AdministratorRoleId);
                                    entity.RecordPermissions.CanCreate.Add(SystemIds.RegularRoleId);
                                    //READ
                                    entity.RecordPermissions.CanRead.Add(SystemIds.AdministratorRoleId);
                                    entity.RecordPermissions.CanRead.Add(SystemIds.RegularRoleId);
                                    //UPDATE
                                    entity.RecordPermissions.CanUpdate.Add(SystemIds.AdministratorRoleId);
                                    entity.RecordPermissions.CanUpdate.Add(SystemIds.RegularRoleId);

                                    {
                                        var response = entMan.CreateEntity(entity);
                                        if (!response.Success)
                                        {
                                            throw new Exception("System error 10050. Entity: " + CUSTOMER_ENTITY_NAME + " Field: entity creation" + " Message:" + response.Message);
                                        }
                                    }
                                }
                                #endregion

                                #region << name >>
                                {
                                    InputTextField textboxField = new InputTextField();
                                    textboxField.Id                    = new Guid("7fb95d0f-ab59-421d-974d-ab357e28a1f9");
                                    textboxField.Name                  = "name";
                                    textboxField.Label                 = "Name";
                                    textboxField.PlaceholderText       = "";
                                    textboxField.Description           = "";
                                    textboxField.HelpText              = "";
                                    textboxField.Required              = true;
                                    textboxField.Unique                = false;
                                    textboxField.Searchable            = true;
                                    textboxField.Auditable             = false;
                                    textboxField.System                = true;
                                    textboxField.DefaultValue          = string.Empty;
                                    textboxField.MaxLength             = null;
                                    textboxField.EnableSecurity        = true;
                                    textboxField.Permissions           = new FieldPermissions();
                                    textboxField.Permissions.CanRead   = new List <Guid>();
                                    textboxField.Permissions.CanUpdate = new List <Guid>();
                                    //READ
                                    textboxField.Permissions.CanRead.Add(SystemIds.AdministratorRoleId);
                                    textboxField.Permissions.CanRead.Add(SystemIds.RegularRoleId);
                                    //UPDATE
                                    textboxField.Permissions.CanUpdate.Add(SystemIds.AdministratorRoleId);
                                    {
                                        var response = entMan.CreateField(CUSTOMER_ENTITY_ID, textboxField, false);
                                        if (!response.Success)
                                        {
                                            throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Field: name" + " Message:" + response.Message);
                                        }
                                    }
                                }
                                #endregion
                            }
                            #endregion

                            #region << View name: admin_details >>
                            {
                                var createViewEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                                var createViewInput  = new InputRecordView();
                                var viewRegion       = new InputRecordViewRegion();
                                var viewSection      = new InputRecordViewSection();
                                var viewRow          = new InputRecordViewRow();
                                var viewColumn       = new InputRecordViewColumn();
                                var viewItem         = new InputRecordViewFieldItem();

                                #region << details >>
                                createViewInput.Id                  = new Guid("3a0e1319-5357-49ec-9e85-8d9be2363fcf");
                                createViewInput.Type                = "hidden";
                                createViewInput.Name                = "admin_details";
                                createViewInput.Label               = "Details";
                                createViewInput.Default             = false;
                                createViewInput.System              = false;
                                createViewInput.Weight              = 15;
                                createViewInput.CssClass            = null;
                                createViewInput.IconName            = "building-o";
                                createViewInput.DynamicHtmlTemplate = null;
                                createViewInput.DataSourceUrl       = null;
                                createViewInput.ServiceCode         = null;
                                createViewInput.Regions             = new List <InputRecordViewRegion>();
                                #endregion

                                #region << Header Region >>
                                viewRegion          = new InputRecordViewRegion();
                                viewRegion.Name     = "header";
                                viewRegion.Label    = "Header";
                                viewRegion.Render   = true;
                                viewRegion.Weight   = 1;
                                viewRegion.CssClass = "";
                                viewRegion.Sections = new List <InputRecordViewSection>();

                                #region << Section >>
                                viewSection           = new InputRecordViewSection();
                                viewSection.Id        = Guid.NewGuid();
                                viewSection.Name      = "details";
                                viewSection.Label     = "Details";
                                viewSection.ShowLabel = false;
                                viewSection.CssClass  = "";
                                viewSection.Collapsed = false;
                                viewSection.TabOrder  = "left-right";
                                viewSection.Weight    = 1;
                                viewSection.Rows      = new List <InputRecordViewRow>();

                                #region << Row >>
                                viewRow         = new InputRecordViewRow();
                                viewRow.Id      = Guid.NewGuid();
                                viewRow.Weight  = 1;
                                viewRow.Columns = new List <InputRecordViewColumn>();

                                #region << Column 1 >>
                                viewColumn = new InputRecordViewColumn();
                                viewColumn.GridColCount = 12;
                                viewColumn.Items        = new List <InputRecordViewItemBase>();


                                #region << name >>
                                {
                                    viewItem            = new InputRecordViewFieldItem();
                                    viewItem.EntityId   = CUSTOMER_ENTITY_ID;
                                    viewItem.EntityName = CUSTOMER_ENTITY_NAME;
                                    viewItem.FieldId    = createViewEntity.Fields.Single(x => x.Name == "name").Id;
                                    viewItem.FieldName  = "name";
                                    viewItem.Type       = "field";
                                    viewColumn.Items.Add(viewItem);
                                }
                                #endregion


                                //Save column
                                viewRow.Columns.Add(viewColumn);
                                #endregion

                                //Save row
                                viewSection.Rows.Add(viewRow);
                                #endregion

                                //Save section
                                viewRegion.Sections.Add(viewSection);
                                #endregion

                                //Save region
                                createViewInput.Regions.Add(viewRegion);
                                #endregion

                                #region << relation options >>
                                createViewInput.RelationOptions = new List <EntityRelationOptionsItem>();
                                #endregion

                                #region << Sidebar >>
                                createViewInput.Sidebar          = new InputRecordViewSidebar();
                                createViewInput.Sidebar.CssClass = "";
                                createViewInput.Sidebar.Render   = true;
                                createViewInput.Sidebar.Render   = true;
                                createViewInput.Sidebar.Items    = new List <InputRecordViewSidebarItemBase>();
                                #endregion

                                #region << action items >>
                                createViewInput.ActionItems = new List <ActionItem>();
                                var actionItem = new ActionItem();
                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_record_delete";
                                    actionItem.Menu     = "page-title-dropdown";
                                    actionItem.Weight   = 1;
                                    actionItem.Template = "" +
                                                          @"<a href=""javascript:void(0)"" confirmed-click=""ngCtrl.deleteRecord(ngCtrl)"" ng-confirm-click=""Are you sure?""
										ng-if=""ngCtrl.userHasRecordPermissions('canDelete')"">
									<i class=""fa fa-trash go-red""></i> Delete Record
								</a>"                                ;
                                    createViewInput.ActionItems.Add(actionItem);
                                }
                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_back_button";
                                    actionItem.Menu     = "sidebar-top";
                                    actionItem.Weight   = 1;
                                    actionItem.Template = "" +
                                                          @"<a class=""back clearfix"" href=""javascript:void(0)"" ng-click=""sidebarData.goBack()""><i class=""fa fa-fw fa-arrow-left""></i> <span class=""text"">Back</span></a>";
                                    createViewInput.ActionItems.Add(actionItem);
                                }
                                #endregion

                                {
                                    var response = entMan.CreateRecordView(CUSTOMER_ENTITY_ID, createViewInput);
                                    if (!response.Success)
                                    {
                                        throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Updated view: admin_details" + " Message:" + response.Message);
                                    }
                                }
                            }
                            #endregion

                            #region << View name: admin_create >>
                            {
                                var createViewEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                                var createViewInput  = new InputRecordView();
                                var viewRegion       = new InputRecordViewRegion();
                                var viewSection      = new InputRecordViewSection();
                                var viewRow          = new InputRecordViewRow();
                                var viewColumn       = new InputRecordViewColumn();
                                var viewItem         = new InputRecordViewFieldItem();

                                #region << details >>
                                createViewInput.Id                  = new Guid("93043954-ae70-41a3-b4b7-665531a23a76");
                                createViewInput.Type                = "create";
                                createViewInput.Name                = "admin_create";
                                createViewInput.Label               = "Create customer";
                                createViewInput.Default             = false;
                                createViewInput.System              = false;
                                createViewInput.Weight              = 25;
                                createViewInput.CssClass            = null;
                                createViewInput.IconName            = "building-o";
                                createViewInput.DynamicHtmlTemplate = null;
                                createViewInput.DataSourceUrl       = null;
                                createViewInput.ServiceCode         = null;
                                createViewInput.Regions             = new List <InputRecordViewRegion>();
                                #endregion

                                #region << Header Region >>
                                viewRegion          = new InputRecordViewRegion();
                                viewRegion.Name     = "header";
                                viewRegion.Label    = "Header";
                                viewRegion.Render   = true;
                                viewRegion.Weight   = 1;
                                viewRegion.CssClass = "";
                                viewRegion.Sections = new List <InputRecordViewSection>();

                                #region << Section >>
                                viewSection           = new InputRecordViewSection();
                                viewSection.Id        = Guid.NewGuid();
                                viewSection.Name      = "details";
                                viewSection.Label     = "Details";
                                viewSection.ShowLabel = false;
                                viewSection.CssClass  = "";
                                viewSection.Collapsed = false;
                                viewSection.TabOrder  = "left-right";
                                viewSection.Weight    = 1;
                                viewSection.Rows      = new List <InputRecordViewRow>();

                                #region << Row >>
                                viewRow         = new InputRecordViewRow();
                                viewRow.Id      = Guid.NewGuid();
                                viewRow.Weight  = 1;
                                viewRow.Columns = new List <InputRecordViewColumn>();

                                #region << Column 1 >>
                                viewColumn = new InputRecordViewColumn();
                                viewColumn.GridColCount = 12;
                                viewColumn.Items        = new List <InputRecordViewItemBase>();


                                #region << name >>
                                {
                                    viewItem            = new InputRecordViewFieldItem();
                                    viewItem.EntityId   = CUSTOMER_ENTITY_ID;
                                    viewItem.EntityName = CUSTOMER_ENTITY_NAME;
                                    viewItem.FieldId    = createViewEntity.Fields.Single(x => x.Name == "name").Id;
                                    viewItem.FieldName  = "name";
                                    viewItem.Type       = "field";
                                    viewColumn.Items.Add(viewItem);
                                }
                                #endregion


                                //Save column
                                viewRow.Columns.Add(viewColumn);
                                #endregion

                                //Save row
                                viewSection.Rows.Add(viewRow);
                                #endregion

                                //Save section
                                viewRegion.Sections.Add(viewSection);
                                #endregion

                                //Save region
                                createViewInput.Regions.Add(viewRegion);
                                #endregion

                                #region << relation options >>
                                createViewInput.RelationOptions = new List <EntityRelationOptionsItem>();
                                #endregion

                                #region << Sidebar >>
                                createViewInput.Sidebar          = new InputRecordViewSidebar();
                                createViewInput.Sidebar.CssClass = "";
                                createViewInput.Sidebar.Render   = true;
                                createViewInput.Sidebar.Render   = true;
                                createViewInput.Sidebar.Items    = new List <InputRecordViewSidebarItemBase>();
                                #endregion

                                #region << action items >>
                                createViewInput.ActionItems = new List <ActionItem>();
                                var actionItem = new ActionItem();

                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_create_and_list";
                                    actionItem.Menu     = "create-bottom";
                                    actionItem.Weight   = 1;
                                    actionItem.Template = "" +
                                                          @"<a class=""btn btn-primary"" ng-click='ngCtrl.create(""list"")' ng-if=""ngCtrl.createViewRegion != null"">Create & List</a>";
                                    createViewInput.ActionItems.Add(actionItem);
                                }
                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_create_and_details";
                                    actionItem.Menu     = "create-bottom";
                                    actionItem.Weight   = 2;
                                    actionItem.Template = "" +
                                                          @"<a class=""btn btn-default btn-outline"" ng-click='ngCtrl.create(""details"")' ng-if=""ngCtrl.createViewRegion != null"">Create & Details</a>";
                                    createViewInput.ActionItems.Add(actionItem);
                                }
                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_create_cancel";
                                    actionItem.Menu     = "create-bottom";
                                    actionItem.Weight   = 3;
                                    actionItem.Template = "" +
                                                          @"<a class=""btn btn-default btn-outline"" ng-click=""ngCtrl.cancel()"">Cancel</a>";
                                    createViewInput.ActionItems.Add(actionItem);
                                }
                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_back_button";
                                    actionItem.Menu     = "sidebar-top";
                                    actionItem.Weight   = 1;
                                    actionItem.Template = "" +
                                                          @"<a class=""back clearfix"" href=""javascript:void(0)"" ng-click=""sidebarData.goBack()""><i class=""fa fa-fw fa-arrow-left""></i> <span class=""text"">Back</span></a>";
                                    createViewInput.ActionItems.Add(actionItem);
                                }
                                #endregion
                                {
                                    var response = entMan.CreateRecordView(CUSTOMER_ENTITY_ID, createViewInput);
                                    if (!response.Success)
                                    {
                                        throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Updated view: admin_create" + " Message:" + response.Message);
                                    }
                                }
                            }
                            #endregion

                            #region << List name: admin >>
                            {
                                var createListEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                                var createListInput  = new InputRecordList();
                                var listItem         = new InputRecordListFieldItem();
                                var listSort         = new InputRecordListSort();
                                var listQuery        = new InputRecordListQuery();

                                #region << details >>
                                createListInput.Id                  = new Guid("ff15f200-8e68-4683-8576-4c8244405ca9");
                                createListInput.Type                = "hidden";
                                createListInput.Name                = "admin";
                                createListInput.Label               = "Customers";
                                createListInput.Weight              = 11;
                                createListInput.Default             = false;
                                createListInput.System              = true;
                                createListInput.CssClass            = null;
                                createListInput.IconName            = "building-o";
                                createListInput.VisibleColumnsCount = 7;
                                createListInput.ColumnWidthsCSV     = null;
                                createListInput.PageSize            = 10;
                                createListInput.DynamicHtmlTemplate = null;
                                createListInput.DataSourceUrl       = null;
                                createListInput.ServiceCode         = null;
                                #endregion

                                #region << action items >>
                                createListInput.ActionItems = new List <ActionItem>();
                                var actionItem = new ActionItem();
                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_record_details";
                                    actionItem.Menu     = "record-row";
                                    actionItem.Weight   = 1;
                                    actionItem.Template = "" +
                                                          @"<a class=""btn btn-default btn-outline"" ng-href=""{{ngCtrl.getRecordDetailsUrl(record, ngCtrl)}}"">
							<i class=""fa fa-fw fa-eye""></i>
							</a>"                            ;
                                    createListInput.ActionItems.Add(actionItem);
                                }
                                {
                                    actionItem          = new ActionItem();
                                    actionItem.Name     = "wv_create_record";
                                    actionItem.Menu     = "page-title";
                                    actionItem.Weight   = 1;
                                    actionItem.Template = "" +
                                                          @"<a class=""btn btn-default btn-outline hidden-xs"" ng-show=""ngCtrl.userHasRecordPermissions('canCreate')"" 
    ng-href=""{{ngCtrl.getRecordCreateUrl(ngCtrl)}}"">
	<i class=""fa fa-fw fa-plus""></i> Add New
</a>";
                                    createListInput.ActionItems.Add(actionItem);
                                }
                                #endregion

                                #region << Columns >>
                                createListInput.Columns = new List <InputRecordListItemBase>();
                                #region << name >>
                                {
                                    var fieldName = "name";
                                    listItem            = new InputRecordListFieldItem();
                                    listItem.EntityId   = CUSTOMER_ENTITY_ID;
                                    listItem.EntityName = CUSTOMER_ENTITY_NAME;
                                    listItem.FieldId    = createListEntity.Fields.Single(x => x.Name == fieldName).Id;
                                    listItem.FieldName  = fieldName;
                                    listItem.Type       = "field";
                                    createListInput.Columns.Add(listItem);
                                }
                                #endregion

                                #endregion

                                #region << relation options >>
                                createListInput.RelationOptions = new List <EntityRelationOptionsItem>();
                                #endregion

                                #region << query >>
                                listQuery = new InputRecordListQuery();
                                #endregion

                                #region << Sort >>
                                listSort = new InputRecordListSort();
                                #endregion
                                {
                                    var response = entMan.CreateRecordList(CUSTOMER_ENTITY_ID, createListInput);
                                    if (!response.Success)
                                    {
                                        throw new Exception("System error 10060. Entity: " + CUSTOMER_ENTITY_NAME + " Updated List: admin" + " Message:" + response.Message);
                                    }
                                }
                            }
                            #endregion

                            #region << area add subscription: CRM Admin -> Customer >>
                            {
                                var updatedAreaId    = CRM_ADMIN_AREA_ID;
                                var updateAreaResult = Helpers.UpsertEntityAsAreaSubscription(entMan, recMan, updatedAreaId, CUSTOMER_ENTITY_NAME, "admin_details", "admin_create", "admin");
                                if (!updateAreaResult.Success)
                                {
                                    throw new Exception("System error 10060. Area update with id : " + updatedAreaId + " Message:" + updateAreaResult.Message);
                                }
                            }
                            #endregion

                            #region << customer lookup list >>
                            {
                                var updateListEntity = entMan.ReadEntity(CUSTOMER_ENTITY_ID).Object;
                                var updateList       = updateListEntity.RecordLists.Single(x => x.Name == "lookup");
                                var updateListInput  = new InputRecordList();
                                var listItem         = new InputRecordListFieldItem();
                                var listSort         = new InputRecordListSort();
                                var listQuery        = new InputRecordListQuery();

                                //Convert recordList to recordListInput
                                updateListInput = updateList.DynamicMapTo <InputRecordList>();

                                //General list details
                                //updateListInput.IconName = "";

                                //Fields
                                #region << name >>
                                listItem            = new InputRecordListFieldItem();
                                listItem.EntityId   = CUSTOMER_ENTITY_ID;
                                listItem.EntityName = "customer";
                                listItem.FieldId    = updateListEntity.Fields.Single(x => x.Name == "name").Id;
                                listItem.FieldName  = "name";
                                listItem.Type       = "field";
                                updateListInput.Columns.Add(listItem);
                                #endregion

                                //Query
                                #region << query descr >>
                                listQuery = new InputRecordListQuery();
                                #endregion


                                //Sort
                                #region << Sort >>
                                listSort           = new InputRecordListSort();
                                listSort.FieldName = "name";
                                listSort.SortType  = "ascending";
                                updateListInput.Sorts.Add(listSort);
                                #endregion
                                {
                                    var responseObject = entMan.UpdateRecordList(CUSTOMER_ENTITY_ID, updateListInput);
                                    if (!responseObject.Success)
                                    {
                                        throw new Exception("System error 10060. Entity: " + "user" + " Updated List: list_name" + " Message:" + responseObject.Message);
                                    }
                                }
                            }
                            #endregion

                            if (createSampleRecords)
                            {
                                #region << Create Sample Customer >>
                                {
                                    var sampleRecord = new EntityRecord();
                                    sampleRecord["id"]   = new Guid("fb06213f-7632-495b-bb8d-ed5ff07dc515");
                                    sampleRecord["name"] = "Buckley Miller & Wright";
                                    var createSampleRecordResult = recMan.CreateRecord(CUSTOMER_ENTITY_NAME, sampleRecord);
                                    if (!createSampleRecordResult.Success)
                                    {
                                        throw new Exception("System error 10060. Create sample record. Message:" + createSampleRecordResult.Message);
                                    }
                                }
                                #endregion

                                #region << Create Sample Customer User >>
                                {
                                    var sampleRecord = new EntityRecord();
                                    sampleRecord["id"]         = new Guid("307fe376-a1c6-495e-a7c0-2a78797565f2");
                                    sampleRecord["first_name"] = "Sample";
                                    sampleRecord["last_name"]  = "Customer";
                                    sampleRecord["username"]   = "******";
                                    sampleRecord["email"]      = "*****@*****.**";
                                    sampleRecord["password"]   = "******";
                                    sampleRecord["enabled"]    = true;
                                    sampleRecord["verified"]   = true;
                                    sampleRecord["image"]      = "/plugins/webvella-core/assets/avatar-deep-purple.png";
                                    var createSampleRecordResult = recMan.CreateRecord(SystemIds.UserEntityId, sampleRecord);
                                    if (!createSampleRecordResult.Success)
                                    {
                                        throw new Exception("System error 10060. Create sample customer record. Message:" + createSampleRecordResult.Message);
                                    }
                                }
                                #endregion

                                #region << Create Sample User Role>>
                                {
                                    var sampleRecord = new EntityRecord();
                                    sampleRecord["id"]          = new Guid("27745245-09bd-4adb-8831-3870bcae46fe");
                                    sampleRecord["name"]        = "crm_customer";
                                    sampleRecord["description"] = "Sample Customer role for CRM application";
                                    var createSampleRecordResult = recMan.CreateRecord(SystemIds.RoleEntityId, sampleRecord);
                                    if (!createSampleRecordResult.Success)
                                    {
                                        throw new Exception("System error 10060. Create sample role record. Message:" + createSampleRecordResult.Message);
                                    }
                                }
                                #endregion

                                #region << Create relation between sample customer and role >>
                                {
                                    var createRelationNtoNResponse = recMan.CreateRelationManyToManyRecord(new Guid("0c4b119e-1d7b-4b40-8d2c-9e447cc656ab"), new Guid("27745245-09bd-4adb-8831-3870bcae46fe"), new Guid("307fe376-a1c6-495e-a7c0-2a78797565f2"));
                                    if (!createRelationNtoNResponse.Success)
                                    {
                                        throw new Exception("Could not create item image relation" + createRelationNtoNResponse.Message);
                                    }
                                }
                                #endregion

                                #region << Create relation between sample customer and regular role >>
                                {
                                    var createRelationNtoNResponse = recMan.CreateRelationManyToManyRecord(new Guid("0c4b119e-1d7b-4b40-8d2c-9e447cc656ab"), new Guid("f16ec6db-626d-4c27-8de0-3e7ce542c55f"), new Guid("307fe376-a1c6-495e-a7c0-2a78797565f2"));
                                    if (!createRelationNtoNResponse.Success)
                                    {
                                        throw new Exception("Could not create item image relation" + createRelationNtoNResponse.Message);
                                    }
                                }
                                #endregion
                            }
                        }
                        #endregion

                        #region << 4. Save needed changes to the plugin setting data >>
                        {
                            string json = JsonConvert.SerializeObject(currentPluginSettings);
                            var    settingsEntityRecord = new EntityRecord();
                            settingsEntityRecord["id"]   = WEBVELLA_CRM_PLUGIN_ID;
                            settingsEntityRecord["name"] = WEBVELLA_CRM_PLUGIN_NAME;
                            settingsEntityRecord["data"] = json;
                            var settingsUpdateReponse = recMan.UpdateRecord("plugin_data", settingsEntityRecord);
                            if (!settingsUpdateReponse.Success)
                            {
                                throw new Exception("plugin 'webvella-project' failed to update its settings in the database due to: " + pluginDataQueryResponse.Message);
                            }
                        }
                        #endregion

                        connection.CommitTransaction();
                    }
                    catch (Exception ex)
                    {
                        connection.RollbackTransaction();
                        throw ex;
                    }
                }
            }
        }
Example #12
0
        public IActionResult OnPost()
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    throw new Exception("Antiforgery check failed.");
                }
                Init();
                if (ErpRequestContext.Page == null)
                {
                    return(NotFound());
                }

                //Standard Page functionality
                var PostObject = (EntityRecord) new PageService().ConvertFormPostToEntityRecord(PageContext.HttpContext, entity: ErpRequestContext.Entity);

                if (!PostObject.Properties.ContainsKey("id"))
                {
                    PostObject["id"] = Guid.NewGuid();
                }

                DataModel.SetRecord(PostObject);

                var globalHookInstances = HookManager.GetHookedInstances <IPageHook>(HookKey);
                foreach (IPageHook inst in globalHookInstances)
                {
                    var result = inst.OnPost(this);
                    if (result != null)
                    {
                        return(result);
                    }
                }

                //record submission validates required fields and auto number - these fields are validated in recordmanager
                //ValidateRecordSubmission(PostObject, ErpRequestContext.Entity, Validation);
                if (Validation.Errors.Count == 0)
                {
                    using (var connection = DbContext.Current.CreateConnection())
                    {
                        try
                        {
                            connection.BeginTransaction();


                            var hookInstances = HookManager.GetHookedInstances <IRecordRelatedRecordCreatePageHook>(HookKey);

                            //pre create hooks
                            foreach (IRecordRelatedRecordCreatePageHook inst in hookInstances)
                            {
                                List <ValidationError> errors = new List <ValidationError>();
                                var result = inst.OnPreCreateRecord(PostObject, ErpRequestContext.Entity, this, errors);
                                if (result != null)
                                {
                                    connection.RollbackTransaction();
                                    return(result);
                                }
                                if (errors.Any())
                                {
                                    connection.RollbackTransaction();
                                    Validation.Errors.AddRange(errors);
                                    BeforeRender();
                                    return(Page());
                                }
                            }
                            var recMan = new RecordManager();

                            var createResponse = recMan.CreateRecord(ErpRequestContext.Entity.MapTo <Entity>(), PostObject);
                            if (!createResponse.Success)
                            {
                                connection.RollbackTransaction();

                                Validation.Message = createResponse.Message;
                                foreach (var error in createResponse.Errors)
                                {
                                    Validation.Errors.Add(new ValidationError(error.Key, error.Message));
                                }

                                BeforeRender();
                                return(Page());
                            }

                            var relation = new EntityRelationManager().Read().Object.Single(x => x.Id == RelationId.Value);
                            if (relation.OriginEntityId == this.ErpRequestContext.ParentEntity.Id)
                            {
                                recMan.CreateRelationManyToManyRecord(relation.Id, ParentRecordId.Value, (Guid)createResponse.Object.Data[0]["id"]);
                            }
                            else
                            {
                                recMan.CreateRelationManyToManyRecord(relation.Id, (Guid)createResponse.Object.Data[0]["id"], ParentRecordId.Value);
                            }

                            connection.CommitTransaction();

                            //post create hook
                            foreach (IRecordRelatedRecordCreatePageHook inst in hookInstances)
                            {
                                var result = inst.OnPostCreateRecord(PostObject, ErpRequestContext.Entity, this);
                                if (result != null)
                                {
                                    return(result);
                                }
                            }

                            if (string.IsNullOrWhiteSpace(ReturnUrl))
                            {
                                return(Redirect($"/{ErpRequestContext.App.Name}/{ErpRequestContext.SitemapArea.Name}/{ErpRequestContext.SitemapNode.Name}/r/{ErpRequestContext.ParentRecordId}/rl/{ErpRequestContext.RelationId}/r/{createResponse.Object.Data[0]["id"]}"));
                            }
                            else
                            {
                                return(Redirect(ReturnUrl));
                            }
                        }
                        catch
                        {
                            connection.RollbackTransaction();
                        }
                    }
                }
                BeforeRender();
                return(Page());
            }
            catch (ValidationException valEx)
            {
                Validation.Message = valEx.Message;
                Validation.Errors.AddRange(valEx.Errors);
                BeforeRender();
                return(Page());
            }
            catch (Exception ex)
            {
                new Log().Create(LogType.Error, "RecordRelatedRecordCreatePageModel Error on POST", ex);
                Validation.Message = ex.Message;
                BeforeRender();
                return(Page());
            }
        }
Example #13
0
        public void SaveUser(ErpUser user)
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            RecordManager         recMan = new RecordManager();
            EntityRelationManager relMan = new EntityRelationManager();
            EntityRecord          record = new EntityRecord();

            ErpUser             existingUser = GetUser(user.Id);
            ValidationException valEx        = new ValidationException();

            if (existingUser != null)
            {
                record["id"] = user.Id;

                if (existingUser.Username != user.Username)
                {
                    record["username"] = user.Username;

                    if (string.IsNullOrWhiteSpace(user.Username))
                    {
                        valEx.AddError("username", "Username is required.");
                    }
                    else if (GetUserByUsername(user.Username) != null)
                    {
                        valEx.AddError("username", "Username is already registered to another user. It must be unique.");
                    }
                }

                if (existingUser.Email != user.Email)
                {
                    record["email"] = user.Email;

                    if (string.IsNullOrWhiteSpace(user.Email))
                    {
                        valEx.AddError("email", "Email is required.");
                    }
                    else if (GetUser(user.Email) != null)
                    {
                        valEx.AddError("email", "Email is already registered to another user. It must be unique.");
                    }
                    else if (!IsValidEmail(user.Email))
                    {
                        valEx.AddError("email", "Email is not valid.");
                    }
                }

                if (existingUser.Password != user.Password && !string.IsNullOrWhiteSpace(user.Password))
                {
                    record["password"] = user.Password;
                }

                if (existingUser.Enabled != user.Enabled)
                {
                    record["enabled"] = user.Enabled;
                }

                if (existingUser.Verified != user.Verified)
                {
                    record["verified"] = user.Verified;
                }

                if (existingUser.FirstName != user.FirstName)
                {
                    record["first_name"] = user.FirstName;
                }

                if (existingUser.LastName != user.LastName)
                {
                    record["last_name"] = user.LastName;
                }

                if (existingUser.Image != user.Image)
                {
                    record["image"] = user.Image;
                }

                record["$user_role.id"] = user.Roles.Select(x => x.Id).ToList();

                valEx.CheckAndThrow();

                var response = recMan.UpdateRecord("user", record);
                if (!response.Success)
                {
                    throw new Exception(response.Message);
                }
            }
            else
            {
                record["id"]          = user.Id;
                record["email"]       = user.Email;
                record["username"]    = user.Username;
                record["first_name"]  = user.FirstName;
                record["last_name"]   = user.LastName;
                record["enabled"]     = user.Enabled;
                record["verified"]    = user.Verified;
                record["image"]       = user.Image;
                record["preferences"] = JsonConvert.SerializeObject(user.Preferences ?? new ErpUserPreferences());

                if (string.IsNullOrWhiteSpace(user.Username))
                {
                    valEx.AddError("username", "Username is required.");
                }
                else if (GetUserByUsername(user.Username) != null)
                {
                    valEx.AddError("username", "Username is already registered to another user. It must be unique.");
                }

                if (string.IsNullOrWhiteSpace(user.Email))
                {
                    valEx.AddError("email", "Email is required.");
                }
                else if (GetUser(user.Email) != null)
                {
                    valEx.AddError("email", "Email is already registered to another user. It must be unique.");
                }
                else if (!IsValidEmail(user.Email))
                {
                    valEx.AddError("email", "Email is not valid.");
                }

                if (string.IsNullOrWhiteSpace(user.Password))
                {
                    valEx.AddError("password", "Password is required.");
                }
                else
                {
                    record["password"] = user.Password;
                }

                record["$user_role.id"] = user.Roles.Select(x => x.Id).ToList();

                valEx.CheckAndThrow();

                var response = recMan.CreateRecord("user", record);
                if (!response.Success)
                {
                    throw new Exception(response.Message);
                }
            }
        }
Example #14
0
        public static void SearchIndex(JobContext context)
        {
            using (var dbCtx = DbContext.CreateContext(Settings.ConnectionString))
            {
                using (SecurityContext.OpenSystemScope())
                {
                    var allIndexRecords         = new List <EntityRecord>();
                    var indexDictionary         = new Dictionary <Guid, EntityRecord>();
                    var allTasksRecords         = new List <EntityRecord>();
                    var allBugsRecords          = new List <EntityRecord>();
                    var indexIdsForDeletion     = new List <Guid>();
                    var searchRecordForCreation = new List <EntityRecord>();
                    var recMan = new RecordManager();

                    #region << Get allIndexRecords >>
                    {
                        var fields = "*";
                        var result = recMan.Find(new EntityQuery("search", fields));
                        if (result.Success)
                        {
                            allIndexRecords = result.Object.Data;
                        }
                        else
                        {
                            throw new Exception(result.Message);
                        }
                    }
                    #endregion

                    #region << Get allTasksRecords >>
                    {
                        var fields = "*,$task_1_n_attachment.comment_content,$task_1_n_attachment.file,$task_1_n_comment.content";
                        var result = recMan.Find(new EntityQuery("wv_task", fields));
                        if (result.Success)
                        {
                            allTasksRecords = result.Object.Data;
                        }
                        else
                        {
                            throw new Exception(result.Message);
                        }
                    }
                    #endregion

                    #region << Get allBugsRecords >>
                    {
                        var fields = "*,$bug_1_n_attachment.comment_content,$bug_1_n_attachment.file,$bug_1_n_comment.content";
                        var result = recMan.Find(new EntityQuery("wv_bug", fields));
                        if (result.Success)
                        {
                            allBugsRecords = result.Object.Data;
                        }
                        else
                        {
                            throw new Exception(result.Message);
                        }
                    }
                    #endregion

                    #region << allIndexRecords >>

                    foreach (var record in allIndexRecords)
                    {
                        var recordId = (Guid)record["item_id"];
                        indexDictionary[recordId] = record;
                    }

                    #endregion

                    #region << Process Tasks >>
                    foreach (var record in allTasksRecords)
                    {
                        var          recordId      = (Guid)record["id"];
                        var          indexDate     = (DateTime?)record["indexed_on"];
                        EntityRecord indexedRecord = null;
                        if (indexDictionary.ContainsKey(recordId))
                        {
                            indexedRecord = indexDictionary[recordId];
                        }

                        //new record
                        if (indexedRecord == null)
                        {
                            //new record will be created down
                        }
                        else if (indexedRecord != null && indexDate == null)
                        {
                            //This is a possible problem. Best way is to recreate the the index
                            indexIdsForDeletion.Add((Guid)indexedRecord["id"]);
                        }
                        //updated record
                        else if (indexedRecord != null && (DateTime)indexedRecord["created_on"] < indexDate)
                        {
                            //Mark the old index for deletion
                            indexIdsForDeletion.Add((Guid)indexedRecord["id"]);
                        }
                        // index has the most recent data
                        else
                        {
                            //mark as processed and do nothing
                            indexDictionary.Remove(recordId);
                            continue;
                        }

                        var newIndexRecord = new EntityRecord();
                        newIndexRecord["id"]         = Guid.NewGuid();
                        newIndexRecord["item_id"]    = recordId;
                        newIndexRecord["entity"]     = "task";
                        newIndexRecord["index"]      = "";
                        newIndexRecord["project_id"] = (Guid)record["project_id"];
                        newIndexRecord["title"]      = "[" + (string)record["code"] + "] " + (string)record["subject"];
                        newIndexRecord["snippet"]    = Utils.TextLength(Utils.RemoveHtml((string)record["description"]), "short");
                        newIndexRecord["url"]        = "/#/areas/projects/wv_task/view-general/sb/general/" + recordId;

                        #region << Index >>
                        var searchIndex = "";
                        //Code
                        searchIndex += " " + Utils.RemoveHtml((string)record["code"]) + " ";
                        //Subject
                        searchIndex += " " + Utils.RemoveHtml((string)record["subject"]) + " ";
                        //Description
                        searchIndex += " " + Utils.RemoveHtml((string)record["description"]) + " ";
                        // Attachments
                        var attachments = (List <EntityRecord>)record["$task_1_n_attachment"];
                        foreach (var attachment in attachments)
                        {
                            //Comment Content
                            searchIndex += " " + Utils.RemoveHtml((string)attachment["comment_content"]) + " ";
                            //File name
                            searchIndex += " " + Utils.RemoveHtml((string)attachment["file"]) + " ";
                        }


                        //Comments
                        var comments = (List <EntityRecord>)record["$task_1_n_comment"];
                        foreach (var comment in comments)
                        {
                            //Comment Content
                            searchIndex += " " + Utils.RemoveHtml((string)comment["content"]) + " ";
                        }

                        newIndexRecord["index"] = searchIndex.ToLowerInvariant();
                        #endregion

                        searchRecordForCreation.Add(newIndexRecord);
                    }
                    #endregion

                    #region << Process Bugs >>
                    foreach (var record in allBugsRecords)
                    {
                        var          recordId      = (Guid)record["id"];
                        var          indexDate     = (DateTime?)record["indexed_on"];
                        EntityRecord indexedRecord = null;
                        if (indexDictionary.ContainsKey(recordId))
                        {
                            indexedRecord = indexDictionary[recordId];
                        }

                        //new record
                        if (indexedRecord == null)
                        {
                            //new record will be created down
                        }
                        else if (indexedRecord != null && indexDate == null)
                        {
                            //This is a possible problem. Best way is to recreate the the index
                            indexIdsForDeletion.Add((Guid)indexedRecord["id"]);
                        }
                        //updated record
                        else if (indexedRecord != null && (DateTime)indexedRecord["created_on"] < indexDate)
                        {
                            //Mark the old index for deletion
                            indexIdsForDeletion.Add((Guid)indexedRecord["id"]);
                        }
                        // index has the most recent data
                        else
                        {
                            //mark as processed and do nothing
                            indexDictionary.Remove(recordId);
                            continue;
                        }

                        var newIndexRecord = new EntityRecord();
                        newIndexRecord["id"]         = Guid.NewGuid();
                        newIndexRecord["item_id"]    = recordId;
                        newIndexRecord["entity"]     = "bug";
                        newIndexRecord["index"]      = "";
                        newIndexRecord["project_id"] = (Guid)record["project_id"];
                        newIndexRecord["title"]      = "[" + (string)record["code"] + "] " + (string)record["subject"];
                        newIndexRecord["snippet"]    = Utils.TextLength(Utils.RemoveHtml((string)record["description"]), "short");
                        newIndexRecord["url"]        = "/#/areas/projects/wv_bug/view-general/sb/general/" + recordId;

                        #region << Index >>
                        var searchIndex = "";
                        //Code
                        searchIndex += " " + Utils.RemoveHtml((string)record["code"]) + " ";
                        //Subject
                        searchIndex += " " + Utils.RemoveHtml((string)record["subject"]) + " ";
                        //Description
                        searchIndex += " " + Utils.RemoveHtml((string)record["description"]) + " ";
                        // Attachments
                        var attachments = (List <EntityRecord>)record["$bug_1_n_attachment"];
                        foreach (var attachment in attachments)
                        {
                            //Comment Content
                            searchIndex += " " + Utils.RemoveHtml((string)attachment["comment_content"]) + " ";
                            //File name
                            searchIndex += " " + Utils.RemoveHtml((string)attachment["file"]) + " ";
                        }


                        //Comments
                        var comments = (List <EntityRecord>)record["$bug_1_n_comment"];
                        foreach (var comment in comments)
                        {
                            //Comment Content
                            searchIndex += " " + Utils.RemoveHtml((string)comment["content"]) + " ";
                        }

                        newIndexRecord["index"] = searchIndex.ToLowerInvariant();
                        #endregion

                        searchRecordForCreation.Add(newIndexRecord);
                    }
                    #endregion

                    #region << Delete not needed records >>
                    foreach (var recordId in indexIdsForDeletion)
                    {
                        var result = recMan.DeleteRecord("search", recordId);
                        if (!result.Success)
                        {
                            throw new Exception(result.Message);
                        }
                    }

                    #endregion

                    #region << Add new records >>
                    foreach (var record in searchRecordForCreation)
                    {
                        var result = recMan.CreateRecord("search", record, true);
                        if (!result.Success)
                        {
                            throw new Exception(result.Message);
                        }
                    }

                    #endregion
                }
            }
        }