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); } }
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>()); } }
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); }
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); } }
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); } }
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)); }
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; } } } }
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(); } } } } }
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 } }
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; } } } }
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()); } }
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); } } }
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 } } }