public async Task Handle(PushMessage message) { Planning planning = await _dbContext.Plannings.FirstOrDefaultAsync(x => x.Id == message.PlanningId); if (planning != null) { await using MicrotingDbContext microtingDbContext = _sdkCore.DbContextHelper.GetDbContext(); List <PlanningSite> planningSites = await _dbContext.PlanningSites.Where(x => x.PlanningId == message.PlanningId && x.WorkflowState != Constants.WorkflowStates.Removed).ToListAsync(); foreach (PlanningSite planningSite in planningSites) { Site site = await microtingDbContext.Sites.FirstOrDefaultAsync(x => x.Id == planningSite.SiteId); if (site != null) { PlanningNameTranslation planningNameTranslation = await _dbContext.PlanningNameTranslation.FirstAsync(x => x.PlanningId == planning.Id && x.LanguageId == site.LanguageId); var folder = await GetTopFolderName((int)planning.SdkFolderId !, microtingDbContext); string body = ""; if (folder != null) { planning.SdkFolderId = microtingDbContext.Folders.First(y => y.Id == planning.SdkFolderId).Id; FolderTranslation folderTranslation = await microtingDbContext.FolderTranslations.SingleAsync(x => x.FolderId == folder.Id && x.LanguageId == site.LanguageId); body = $"{folderTranslation.Name} ({site.Name};{DateTime.Now:dd.MM.yyyy})"; } PlanningCaseSite planningCaseSite = await _dbContext.PlanningCaseSites.FirstOrDefaultAsync(x => x.PlanningId == planningSite.PlanningId && x.MicrotingSdkSiteId == planningSite.SiteId && x.Status != 100 && x.WorkflowState == Constants.WorkflowStates.Created); Log.LogEvent($"[DBG] ItemsPlanningService PushMessageHandler.Handle : Sending push message body: {body}, title : {planningNameTranslation.Name} to site.id : {site.Id}"); Case @case = await microtingDbContext.Cases.FirstAsync(x => x.Id == planningCaseSite.MicrotingSdkCaseId); await _sdkCore.SendPushMessage(site.Id, planningNameTranslation.Name, body, (int)@case.MicrotingUid !); } } planning.PushMessageSent = true; await planning.Update(_dbContext); } }
public async Task <OperationDataResult <ExcelParseResult> > ImportPlannings(Stream excelStream) { try { var result = new ExcelParseResult(); var core = await _coreService.GetCore(); await using var microtingDbContext = core.DbContextHelper.GetDbContext(); var timeZone = await _userService.GetCurrentUserTimeZoneInfo(); await using var dbContext = core.DbContextHelper.GetDbContext(); var theLanguage = await dbContext.Languages .SingleAsync(x => x.LanguageCode == "da"); var templatesDto = await core.TemplateItemReadAll( false, "", "", false, "", new List <int>(), timeZone, theLanguage); // Parse excel file var fileResult = _planningExcelService.ParsePlanningImportFile(excelStream); // Get planning names list var planningNames = await _dbContext.PlanningNameTranslation .AsNoTracking() .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed && x.LanguageId == theLanguage.Id) .Select(x => x.Name) .ToListAsync(); // Validation var excelErrors = new List <ExcelParseErrorModel>(); List <string> languageCodes = new List <string>() { "da", "en-US", "de-DE" }; foreach (var excelModel in fileResult) { if (string.IsNullOrEmpty(excelModel.EFormName)) { var error = new ExcelParseErrorModel { Col = PlanningImportExcelConsts.EformNameCol, Row = excelModel.ExcelRow, Message = _itemsPlanningLocalizationService.GetString( "EformNameIsEmpty") }; excelErrors.Add(error); } if (string.IsNullOrEmpty(excelModel.PlanningName)) { var error = new ExcelParseErrorModel { Col = PlanningImportExcelConsts.PlanningItemNameCol, Row = excelModel.ExcelRow, Message = _itemsPlanningLocalizationService.GetString( "ItemNameIsEmpty") }; excelErrors.Add(error); } if (!excelModel.Folders.Any()) { var error = new ExcelParseErrorModel { Row = excelModel.ExcelRow, Message = _itemsPlanningLocalizationService.GetString( "FolderNotFound") }; excelErrors.Add(error); } //if (!string.IsNullOrEmpty(planningName)) //{ // var error = new ExcelParseErrorModel // { // Col = PlanningImportExcelConsts.PlanningItemNameCol, // Row = excelModel.ExcelRow, // Message = _itemsPlanningLocalizationService.GetString( // "PlanningWithNameAlreadyExists", // excelModel.PlanningName) // }; // excelErrors.Add(error); //} var templateByName = templatesDto .FirstOrDefault(x => x.Label == excelModel.EFormName); if (templateByName == null) { var error = new ExcelParseErrorModel { Col = PlanningImportExcelConsts.EformNameCol, Row = excelModel.ExcelRow, Message = _itemsPlanningLocalizationService.GetString( "EformNotFound") }; excelErrors.Add(error); } else { excelModel.EFormId = templateByName.Id; } } result.Errors = excelErrors; if (excelErrors.Any()) { return(new OperationDataResult <ExcelParseResult>( true, result)); } // Process plannings //using (var transaction = await _dbContext.Database.BeginTransactionAsync()) //{ try { // Process planning tags var tags = await _dbContext.PlanningTags //.AsNoTracking() .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .Select(x => new { x.Id, Name = x.Name, }).ToListAsync(); // Trim tag names foreach (var excelModel in fileResult) { for (var y = 0; y < excelModel.Tags.Count; y++) { excelModel.Tags[y] = excelModel.Tags[y].Trim(); } } var fileTags = fileResult.SelectMany(x => x.Tags) .GroupBy(x => x) .Select(x => x.Key) .ToList(); foreach (var fileTag in fileTags) { var planningTagExist = tags.FirstOrDefault(x => x.Name == fileTag); if (planningTagExist == null) { var planningTag = new PlanningTag { Name = fileTag, CreatedByUserId = _userService.UserId, UpdatedByUserId = _userService.UserId, }; await planningTag.Create(_dbContext); } } tags = await _dbContext.PlanningTags .AsNoTracking() .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .Select(x => new { x.Id, Name = x.Name, }).ToListAsync(); // Folders var danishLanguage = await dbContext.Languages.SingleOrDefaultAsync(x => x.LanguageCode == "da"); var folders = await dbContext.Folders .Join(dbContext.FolderTranslations, folder => folder.Id, translation => translation.FolderId, (folder, translation) => new { folderWorkflowState = folder.WorkflowState, translationWorkflowState = translation.WorkflowState, folder.Id, translation.Name, translation.Description, folder.ParentId, translation.LanguageId }) .AsNoTracking() .Where(x => x.LanguageId == danishLanguage.Id) .Where(x => x.folderWorkflowState != Constants.WorkflowStates.Removed) .Select(x => new PlanningImportFolderModel { Id = x.Id, Label = x.Name, Description = x.Description, ParentId = x.ParentId, }).ToListAsync(); // Process folders foreach (var excelModel in fileResult) { for (var i = 0; i < excelModel.Folders.Count; i++) { var level = i + 1; var folderModel = excelModel.Folders[i]; if (level == 1) { var mainFolder = folders.FirstOrDefault(x => x.Label == folderModel.Label.Split("|")[0] && x.ParentId == null); if (mainFolder == null) { List <KeyValuePair <string, string> > names = new List <KeyValuePair <string, string> >(); List <KeyValuePair <string, string> > descriptions = new List <KeyValuePair <string, string> >(); var sourceNames = folderModel.Label.Split("|"); var sourceDescriptions = folderModel.Description.Split("|"); names.Add(new KeyValuePair <string, string>("da", sourceNames[0])); descriptions.Add(new KeyValuePair <string, string>("da", sourceDescriptions[0])); if (sourceNames.Length > 1) { names.Add(new KeyValuePair <string, string>("en-US", sourceNames[1])); } else { names.Add(new KeyValuePair <string, string>("en-US", "")); } if (sourceNames.Length > 2) { names.Add(new KeyValuePair <string, string>("de-DE", sourceNames[2])); } else { names.Add(new KeyValuePair <string, string>("de-DE", "")); } if (sourceDescriptions.Length > 1) { descriptions.Add(new KeyValuePair <string, string>("en-US", sourceDescriptions[1])); } else { descriptions.Add(new KeyValuePair <string, string>("en-US", "")); } if (sourceNames.Length > 2) { descriptions.Add(new KeyValuePair <string, string>("de-DE", sourceDescriptions[2])); } else { descriptions.Add(new KeyValuePair <string, string>("de-DE", "")); } folderModel.Id = await core.FolderCreate( names, descriptions, null); } else { folderModel.Id = mainFolder.Id; } folderModel.Description = folderModel.Description.Split("|")[0]; folderModel.Label = folderModel.Label.Split("|")[0]; folders.Add(folderModel); } if (level > 1) { var parentId = excelModel.Folders[i - 1].Id; var sdkFolder = folders.FirstOrDefault(x => x.Label == folderModel.Label.Split("|")[0] && x.ParentId == parentId); if (sdkFolder == null) { List <KeyValuePair <string, string> > names = new List <KeyValuePair <string, string> >(); List <KeyValuePair <string, string> > descriptions = new List <KeyValuePair <string, string> >(); var sourceNames = folderModel.Label.Split("|"); var sourceDescriptions = folderModel.Description.Split("|"); names.Add(new KeyValuePair <string, string>("da", sourceNames[0])); descriptions.Add(new KeyValuePair <string, string>("da", sourceDescriptions[0])); if (sourceNames.Length > 1) { names.Add(new KeyValuePair <string, string>("en-US", sourceNames[1])); } else { names.Add(new KeyValuePair <string, string>("en-US", "")); } if (sourceNames.Length > 2) { names.Add(new KeyValuePair <string, string>("de-DE", sourceNames[2])); } else { names.Add(new KeyValuePair <string, string>("de-DE", "")); } if (sourceDescriptions.Length > 1) { descriptions.Add(new KeyValuePair <string, string>("en-US", sourceDescriptions[1])); } else { descriptions.Add(new KeyValuePair <string, string>("en-US", "")); } if (sourceNames.Length > 2) { descriptions.Add(new KeyValuePair <string, string>("de-DE", sourceDescriptions[2])); } else { descriptions.Add(new KeyValuePair <string, string>("de-DE", "")); } folderModel.Id = await core.FolderCreate( names, descriptions, parentId); } else { folderModel.Id = sdkFolder.Id; } folderModel.ParentId = parentId; folderModel.Description = folderModel.Description.Split("|")[0]; folderModel.Label = folderModel.Label.Split("|")[0]; folders.Add(folderModel); } } } // Process plannings foreach (var excelModel in fileResult) { var tagIds = new List <int>(); if (excelModel.Tags.Any()) { foreach (var tagName in excelModel.Tags) { var planningTagExist = tags.FirstOrDefault(x => x.Name == tagName); if (planningTagExist != null) { tagIds.Add(planningTagExist.Id); } } } var planningNameFromExcelModel = excelModel.PlanningName.Split("|").First(); var sdkFolder = excelModel.Folders.Last(); // Find planning name var planningName = _dbContext.PlanningNameTranslation .Join(_dbContext.Plannings, planningNameTranslation => planningNameTranslation.PlanningId, plannings => plannings.Id, (planningNameTranslation, planning) => new { planning.SdkFolderId, planningNameTranslation.Name, planningNameTranslation.PlanningId, planning.WorkflowState }).FirstOrDefault(x => x.Name == planningNameFromExcelModel && x.SdkFolderId == sdkFolder.Id && x.WorkflowState != Constants.WorkflowStates.Removed); if (planningName != null) { var planningFromDb = await _dbContext.Plannings .Where(x => x.Id == planningName.PlanningId) .FirstAsync(); var planningTranslations = _dbContext.PlanningNameTranslation .Where(x => x.PlanningId == planningFromDb.Id) .ToList(); // create or update name tranlations planning var i = 1; foreach (var translationText in excelModel.PlanningName.Split("|")) { var language = await dbContext.Languages.SingleAsync(x => x.Id == i); var planningNameTranslation = planningTranslations .Where(x => x.PlanningId == planningFromDb.Id) .FirstOrDefault(x => x.LanguageId == i); if (planningNameTranslation == null) { planningNameTranslation = new PlanningNameTranslation { Name = translationText, LanguageId = language.Id, PlanningId = planningFromDb.Id, CreatedByUserId = _userService.UserId, UpdatedByUserId = _userService.UserId, }; await planningNameTranslation.Create(_dbContext); } else { planningNameTranslation.UpdatedByUserId = _userService.UserId; planningNameTranslation.WorkflowState = Constants.WorkflowStates.Created; await planningNameTranslation.Update(_dbContext); } i++; } if (excelModel.DayOfMonth != null && planningFromDb.DayOfMonth != excelModel.DayOfMonth) { planningFromDb.DayOfMonth = excelModel.DayOfMonth; } if (excelModel.DayOfWeek != null && planningFromDb.DayOfWeek != excelModel.DayOfWeek) { planningFromDb.DayOfWeek = excelModel.DayOfWeek; } if (excelModel.RepeatEvery != null && planningFromDb.RepeatEvery != excelModel.RepeatEvery) { planningFromDb.RepeatEvery = (int)excelModel.RepeatEvery; } if (excelModel.RepeatType != null && planningFromDb.RepeatType != excelModel.RepeatType) { planningFromDb.RepeatType = (RepeatType)excelModel.RepeatType; } if (excelModel.RepeatUntil != null && planningFromDb.RepeatUntil != excelModel.RepeatUntil) { planningFromDb.RepeatUntil = excelModel.RepeatUntil; } planningFromDb.UpdatedByUserId = _userService.UserId; planningFromDb.StartDate = DateTime.Now; planningFromDb.WorkflowState = Constants.WorkflowStates.Created; var tagsIdForAddToPlanningTags = planningFromDb.PlanningsTags .Where(x => tagIds.Any(y => x.PlanningTagId != y)).ToList(); var tagsIdForRemoveInPlanningTags = tagIds .Where(x => planningFromDb.PlanningsTags.Any(y => x != y.PlanningTagId)).ToList(); if (tagsIdForAddToPlanningTags.Any()) { foreach (var tagsIdForAddToPlanningTag in tagsIdForAddToPlanningTags) { planningFromDb.PlanningsTags.Add( new PlanningsTags { CreatedByUserId = _userService.UserId, UpdatedByUserId = _userService.UserId, PlanningTagId = tagsIdForAddToPlanningTag.PlanningTagId }); } } if (tagsIdForRemoveInPlanningTags.Any()) { foreach (var tagsIdForAddToPlanningTag in tagsIdForAddToPlanningTags) { await planningFromDb.PlanningsTags .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .FirstOrDefault(x => x.PlanningTagId == tagsIdForAddToPlanningTag.PlanningTagId) .Delete(_dbContext); } } await planningFromDb.Update(_dbContext); } else { sdkFolder = excelModel.Folders.Last(); var newPlanning = new Planning { CreatedByUserId = _userService.UserId, RepeatUntil = excelModel.RepeatUntil, DayOfWeek = excelModel.DayOfWeek, DayOfMonth = excelModel.DayOfMonth, Enabled = true, RelatedEFormId = (int)excelModel.EFormId, RelatedEFormName = excelModel.EFormName, PlanningsTags = new List <PlanningsTags>(), SdkFolderName = sdkFolder?.Label, SdkFolderId = sdkFolder?.Id, StartDate = DateTime.UtcNow, RepeatEvery = excelModel.RepeatEvery ?? 1, RepeatType = excelModel.RepeatType ?? RepeatType.Month, IsLocked = false, IsEditable = true, IsHidden = false }; foreach (var tagId in tagIds) { newPlanning.PlanningsTags.Add( new PlanningsTags { CreatedAt = DateTime.UtcNow, CreatedByUserId = _userService.UserId, UpdatedAt = DateTime.UtcNow, UpdatedByUserId = _userService.UserId, Version = 1, PlanningTagId = tagId }); } await newPlanning.Create(_dbContext); var i = 1; foreach (var translationText in excelModel.PlanningName.Split("|")) { var language = await dbContext.Languages.SingleAsync(x => x.Id == i); var planningNameTranslation = new PlanningNameTranslation() { Name = translationText, LanguageId = language.Id, PlanningId = newPlanning.Id }; await planningNameTranslation.Create(_dbContext); i += 1; } } } } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } result.Message = _itemsPlanningLocalizationService.GetString("ImportCompletedSuccessfully"); return(new OperationDataResult <ExcelParseResult>( true, result)); } catch (Exception e) { Trace.TraceError(e.Message); _logger.LogError(e, e.Message); return(new OperationDataResult <ExcelParseResult>(false, _itemsPlanningLocalizationService.GetString("ErrorWhileImportingExcelFile"))); } }
public async Task Pair(PlanningPnModel planningPnModel, int assignmentSiteId, int relatedEFormId, int planningId) { var sdkCore = await _coreService.GetCore(); await using var sdkDbContext = sdkCore.DbContextHelper.GetDbContext(); var sdkSite = await sdkDbContext.Sites.SingleAsync(x => x.Id == assignmentSiteId); var language = await sdkDbContext.Languages.SingleAsync(x => x.Id == sdkSite.LanguageId); var mainElement = await sdkCore.ReadeForm(relatedEFormId, language); var folder = await sdkDbContext.Folders.SingleAsync(x => x.Id == planningPnModel.Folder.EFormSdkFolderId); var folderId = folder.MicrotingUid.ToString(); var planning = await _dbContext.Plannings.SingleAsync(x => x.Id == planningId); // get planning cases var planningCase = await _dbContext.PlanningCases .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .Where(x => x.WorkflowState != Constants.WorkflowStates.Retracted) .Where(x => x.WorkflowState != Constants.WorkflowStates.Processed) .Where(x => x.PlanningId == planningPnModel.Id) .FirstOrDefaultAsync(x => x.MicrotingSdkeFormId == relatedEFormId); if (planning.RepeatEvery == 0 && planning.RepeatType == RepeatType.Day) { planningCase = new PlanningCase() { PlanningId = planningPnModel.Id, Status = 66, MicrotingSdkeFormId = relatedEFormId }; await planningCase.Create(_dbContext); } if (planningCase == null) { planningCase = new PlanningCase() { PlanningId = planningPnModel.Id, Status = 66, MicrotingSdkeFormId = relatedEFormId }; await planningCase.Create(_dbContext); } var casesToDelete = await _dbContext.PlanningCaseSites .Where(x => x.PlanningId == planningPnModel.Id && x.MicrotingSdkSiteId == assignmentSiteId && x.WorkflowState != Constants.WorkflowStates.Retracted) .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .ToListAsync(); foreach (var caseToDelete in casesToDelete) { var theCase = await sdkDbContext.Cases.SingleOrDefaultAsync(x => x.Id == caseToDelete.MicrotingSdkCaseId); if (theCase != null) { if (theCase.MicrotingUid != null) { await sdkCore.CaseDelete((int)theCase.MicrotingUid); } } else { var checkListSite = await sdkDbContext.CheckListSites.SingleOrDefaultAsync(x => x.Id == caseToDelete.MicrotingCheckListSitId); if (checkListSite != null) { await sdkCore.CaseDelete(checkListSite.MicrotingUid); } } caseToDelete.WorkflowState = Constants.WorkflowStates.Retracted; await caseToDelete.Update(_dbContext); } if (planningCase.Status == 100) { var planningCaseSite = await _dbContext.PlanningCaseSites.SingleOrDefaultAsync(x => x.PlanningCaseId == planningCase.Id && x.MicrotingSdkSiteId == assignmentSiteId && x.WorkflowState != Constants.WorkflowStates.Removed); if (planningCaseSite == null) { planningCaseSite = new PlanningCaseSite() { MicrotingSdkSiteId = assignmentSiteId, MicrotingSdkeFormId = relatedEFormId, Status = 2, PlanningId = planningPnModel.Id, PlanningCaseId = planningCase.Id }; await planningCaseSite.Create(_dbContext); } planningCaseSite.Status = planningCaseSite.Status == 100 ? planningCaseSite.Status : 2; planningCaseSite.WorkflowState = Constants.WorkflowStates.Retracted; await planningCaseSite.Update(_dbContext); } if (planningCase.Status != 100) { var translation = _dbContext.PlanningNameTranslation .Single(x => x.LanguageId == language.Id && x.PlanningId == planningPnModel.Id).Name; mainElement.Label = string.IsNullOrEmpty(planningPnModel.PlanningNumber) ? "" : planningPnModel.PlanningNumber; if (!string.IsNullOrEmpty(translation)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{translation}" : $" - {translation}"; } if (!string.IsNullOrEmpty(planningPnModel.BuildYear)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{planningPnModel.BuildYear}" : $" - {planningPnModel.BuildYear}"; } if (!string.IsNullOrEmpty(planningPnModel.Type)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{planningPnModel.Type}" : $" - {planningPnModel.Type}"; } if (mainElement.ElementList.Count == 1) { mainElement.ElementList[0].Label = mainElement.Label; } mainElement.CheckListFolderName = folderId; mainElement.StartDate = DateTime.Now.ToUniversalTime(); mainElement.EndDate = DateTime.Now.AddYears(10).ToUniversalTime(); if (planning.RepeatType == RepeatType.Day && planning.RepeatEvery == 0) { mainElement.Repeated = 0; } // mainElement.PushMessageBody = mainElement.Label; // mainElement.PushMessageTitle = folder.Name; // if (folder.ParentId != null) // { // var parentFolder = await sdkDbContext.Folders.SingleAsync(x => x.Id == folder.ParentId); // mainElement.PushMessageTitle = parentFolder.Name; // mainElement.PushMessageBody = $"{folder.Name}\n{mainElement.Label}"; // } var planningCaseSite = await _dbContext.PlanningCaseSites.SingleOrDefaultAsync(x => x.PlanningCaseId == planningCase.Id && x.MicrotingSdkSiteId == assignmentSiteId && x.WorkflowState != Constants.WorkflowStates.Retracted && x.WorkflowState != Constants.WorkflowStates.Removed); if (planningCaseSite == null) { planningCaseSite = new PlanningCaseSite() { MicrotingSdkSiteId = assignmentSiteId, MicrotingSdkeFormId = relatedEFormId, Status = 66, PlanningId = planningPnModel.Id, PlanningCaseId = planningCase.Id }; await planningCaseSite.Create(_dbContext); } if (planningCaseSite.MicrotingSdkCaseDoneAt.HasValue) { var unixTimestamp = (long)(planningCaseSite.MicrotingSdkCaseDoneAt.Value .Subtract(new DateTime(1970, 1, 1))) .TotalSeconds; mainElement.ElementList[0].Description.InderValue = unixTimestamp.ToString(); } if (planningCaseSite.MicrotingSdkCaseId < 1 && planning.StartDate <= DateTime.Now) { // ReSharper disable once PossibleInvalidOperationException if (planning.PushMessageOnDeployment) { string body = ""; folder = await getTopFolderName((int)planning.SdkFolderId, sdkDbContext); if (folder != null) { planning.SdkFolderId = sdkDbContext.Folders .FirstOrDefault(y => y.Id == planning.SdkFolderId) ?.Id; FolderTranslation folderTranslation = await sdkDbContext.FolderTranslations.SingleOrDefaultAsync(x => x.FolderId == folder.Id && x.LanguageId == sdkSite.LanguageId); body = $"{folderTranslation.Name} ({sdkSite.Name};{DateTime.Now:dd.MM.yyyy})"; } PlanningNameTranslation planningNameTranslation = await _dbContext.PlanningNameTranslation.SingleOrDefaultAsync(x => x.PlanningId == planning.Id && x.LanguageId == sdkSite.LanguageId); mainElement.PushMessageBody = body; mainElement.PushMessageTitle = planningNameTranslation.Name; } var caseId = await sdkCore.CaseCreate(mainElement, "", (int)sdkSite.MicrotingUid, null); if (caseId != null) { if (sdkDbContext.Cases.Any(x => x.MicrotingUid == caseId)) { planningCaseSite.MicrotingSdkCaseId = sdkDbContext.Cases.Single(x => x.MicrotingUid == caseId).Id; } else { planningCaseSite.MicrotingCheckListSitId = sdkDbContext.CheckListSites.Single(x => x.MicrotingUid == caseId).Id; } await planningCaseSite.Update(_dbContext); } } var now = DateTime.UtcNow; switch (planning.RepeatType) { case RepeatType.Day: planning.NextExecutionTime = now.AddDays(planning.RepeatEvery); break; case RepeatType.Week: var startOfWeek = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).StartOfWeek( (DayOfWeek)planning.DayOfWeek); planning.NextExecutionTime = startOfWeek.AddDays(planning.RepeatEvery * 7); break; case RepeatType.Month: planning.DayOfMonth ??= 1; if (planning.DayOfMonth == 0) { planning.DayOfMonth = 1; } var startOfMonth = new DateTime(now.Year, now.Month, (int)planning.DayOfMonth, 0, 0, 0); planning.NextExecutionTime = startOfMonth.AddMonths(planning.RepeatEvery); break; } planning.LastExecutedTime = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0); await planning.Update(_dbContext); } }
public async Task <OperationResult> Create(PlanningCreateModel model) { //await using var transaction = await _dbContext.Database.BeginTransactionAsync(); var sdkCore = await _coreService.GetCore(); await using var sdkDbContext = sdkCore.DbContextHelper.GetDbContext(); try { var tagIds = new List <int>(); tagIds.AddRange(model.TagsIds); var localeString = await _userService.GetCurrentUserLocale(); if (string.IsNullOrEmpty(localeString)) { return(new OperationResult( false, _itemsPlanningLocalizationService.GetString("LocaleDoesNotExist"))); } var language = sdkDbContext.Languages.Single(x => x.LanguageCode == localeString); if (model.BoundEform == null) { return(new OperationResult( false, _itemsPlanningLocalizationService.GetString("InfoAboutEformIsNull"))); } var template = await _coreService.GetCore().Result.TemplateItemRead(model.BoundEform.RelatedEFormId, language); if (template == null) { return(new OperationResult( false, _itemsPlanningLocalizationService.GetString("EformNotFound"))); } if (model.Folder == null) { return(new OperationResult( false, _itemsPlanningLocalizationService.GetString("InfoAboutFolderIsNull"))); } var sdkFolder = await sdkDbContext.Folders .Include(x => x.Parent) .FirstOrDefaultAsync(x => x.Id == model.Folder.EFormSdkFolderId); if (sdkFolder == null) { return(new OperationResult( false, _itemsPlanningLocalizationService.GetString("FolderNotFound"))); } var planning = new Planning { Description = model.Description, BuildYear = model.BuildYear, Type = model.Type, LocationCode = model.LocationCode, CreatedByUserId = _userService.UserId, CreatedAt = DateTime.UtcNow, IsLocked = false, IsEditable = true, IsHidden = false, RepeatEvery = model.Reiteration.RepeatEvery, RepeatUntil = model.Reiteration.RepeatUntil, RepeatType = model.Reiteration.RepeatType, DayOfWeek = model.Reiteration.DayOfWeek, DayOfMonth = model.Reiteration.DayOfMonth, Enabled = true, RelatedEFormId = model.BoundEform.RelatedEFormId, RelatedEFormName = template.Label, SdkFolderName = sdkFolder.Name, SdkFolderId = model.Folder.EFormSdkFolderId, PlanningsTags = new List <PlanningsTags>(), DaysBeforeRedeploymentPushMessageRepeat = model.Reiteration.PushMessageEnabled, DaysBeforeRedeploymentPushMessage = model.Reiteration.DaysBeforeRedeploymentPushMessage, PushMessageOnDeployment = model.Reiteration.PushMessageOnDeployment, StartDate = model.Reiteration.StartDate ?? DateTime.UtcNow }; foreach (var tagId in tagIds) { planning.PlanningsTags.Add( new PlanningsTags { CreatedByUserId = _userService.UserId, UpdatedByUserId = _userService.UserId, PlanningTagId = tagId }); } await planning.Create(_dbContext); var languages = await _dbContext.Languages.ToListAsync(); foreach (var translation in model.TranslationsName) { var languageId = languages.Where(x => x.Name == translation.Language || x.LanguageCode == translation.LocaleName) .Select(x => x.Id) .FirstOrDefault(); if (languageId == default) { return(new OperationResult( true, _itemsPlanningLocalizationService.GetString("LocaleDoesNotExist"))); } var planningNameTranslations = new PlanningNameTranslation() { LanguageId = languageId, PlanningId = planning.Id, Name = translation.Name, CreatedByUserId = _userService.UserId, UpdatedByUserId = _userService.UserId }; await planningNameTranslations.Create(_dbContext); } //await transaction.CommitAsync(); return(new OperationResult( true, _itemsPlanningLocalizationService.GetString("ListCreatedSuccessfully"))); } catch (Exception e) { //await transaction.RollbackAsync(); Trace.TraceError(e.Message); return(new OperationResult(false, _itemsPlanningLocalizationService.GetString("ErrorWhileCreatingList"))); } }