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 Handle(PlanningCaseSingleCreate message) { var planning = await _dbContext.Plannings.FirstAsync(x => x.Id == message.PlanningId); var siteId = message.PlanningSiteId; await using MicrotingDbContext sdkDbContext = _sdkCore.DbContextHelper.GetDbContext(); var sdkSite = await sdkDbContext.Sites.FirstAsync(x => x.Id == siteId); Language language = await sdkDbContext.Languages.FirstAsync(x => x.Id == sdkSite.LanguageId); var mainElement = await _sdkCore.ReadeForm(message.RelatedEFormId, language); var folder = await sdkDbContext.Folders.FirstAsync(x => x.Id == planning.SdkFolderId); var folderId = folder.MicrotingUid.ToString(); var planningCase = await _dbContext.PlanningCases .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .Where(x => x.PlanningId == planning.Id) .Where(x => x.Status == 66) .Where(x => x.MicrotingSdkeFormId == message.RelatedEFormId) .FirstOrDefaultAsync(); if (planningCase == null) { planningCase = new PlanningCase() { PlanningId = planning.Id, Status = 66, MicrotingSdkeFormId = message.RelatedEFormId }; await planningCase.Create(_dbContext); } var casesToDelete = await _dbContext.PlanningCaseSites .Where(x => x.PlanningId == planning.Id && x.MicrotingSdkSiteId == siteId && x.WorkflowState != Constants.WorkflowStates.Retracted) .ToListAsync(); Log.LogEvent( $"ItemCaseCreateHandler.Task: Found {casesToDelete.Count} PlanningCaseSites, which has not yet been retracted, so retracting now."); foreach (var caseToDelete in casesToDelete) { Log.LogEvent($"ItemCaseCreateHandler.Task: Trying to retract the case with Id: {caseToDelete.Id}"); var caseDto = await _sdkCore.CaseLookupCaseId(caseToDelete.MicrotingSdkCaseId); if (caseDto.MicrotingUId != null) { await _sdkCore.CaseDelete((int)caseDto.MicrotingUId); } caseToDelete.WorkflowState = Constants.WorkflowStates.Retracted; await caseToDelete.Update(_dbContext); } var translation = _dbContext.PlanningNameTranslation .Single(x => x.LanguageId == language.Id && x.PlanningId == planning.Id).Name; mainElement.Label = string.IsNullOrEmpty(planning.PlanningNumber) ? "" : planning.PlanningNumber; if (!string.IsNullOrEmpty(translation)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{translation}" : $" - {translation}"; } if (!string.IsNullOrEmpty(planning.BuildYear)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{planning.BuildYear}" : $" - {planning.BuildYear}"; } if (!string.IsNullOrEmpty(planning.Type)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{planning.Type}" : $" - {planning.Type}"; } mainElement.ElementList[0].Label = mainElement.Label; mainElement.CheckListFolderName = folderId; mainElement.StartDate = DateTime.Now.ToUniversalTime(); mainElement.EndDate = (DateTime)planning.NextExecutionTime !; var planningCaseSite = await _dbContext.PlanningCaseSites.FirstOrDefaultAsync(x => x.PlanningCaseId == planningCase.Id && x.MicrotingSdkSiteId == siteId); if (planningCaseSite == null) { planningCaseSite = new PlanningCaseSite() { MicrotingSdkSiteId = siteId, MicrotingSdkeFormId = message.RelatedEFormId, Status = 66, PlanningId = planning.Id, PlanningCaseId = planningCase.Id }; await planningCaseSite.Create(_dbContext); } if (planningCaseSite.MicrotingSdkCaseDoneAt.HasValue) { long unixTimestamp = (long)(planningCaseSite.MicrotingSdkCaseDoneAt.Value .Subtract(new DateTime(1970, 1, 1))) .TotalSeconds; mainElement.ElementList[0].Description.InderValue = unixTimestamp.ToString(); } if (planningCaseSite.MicrotingSdkCaseId < 1) { var caseId = await _sdkCore.CaseCreate(mainElement, "", (int)sdkSite.MicrotingUid !, null); if (caseId != null) { var caseDto = await _sdkCore.CaseLookupMUId((int)caseId); if (caseDto?.CaseId != null) { planningCaseSite.MicrotingSdkCaseId = (int)caseDto.CaseId; } await planningCaseSite.Update(_dbContext); } } }
public async Task Handle(ItemCaseCreate message) { var item = await _dbContext.Items.SingleOrDefaultAsync(x => x.Id == message.ItemId); await using MicrotingDbContext dbContext = _sdkCore.dbContextHelper.GetDbContext(); if (item != null) { var planning = await _dbContext.Plannings .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .SingleOrDefaultAsync(x => x.Id == message.PlanningId); var siteIds = planning.PlanningSites .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) .Select(x => x.SiteId) .ToList(); var mainElement = await _sdkCore.TemplateRead(message.RelatedEFormId); var folderId = dbContext.folders.Single(x => x.Id == item.eFormSdkFolderId).MicrotingUid.ToString(); var planningCase = await _dbContext.PlanningCases.SingleOrDefaultAsync(x => x.ItemId == item.Id && x.WorkflowState != Constants.WorkflowStates.Retracted); if (planningCase != null) { planningCase.WorkflowState = Constants.WorkflowStates.Retracted; await planningCase.Update(_dbContext); } planningCase = new PlanningCase() { ItemId = item.Id, Status = 66, MicrotingSdkeFormId = message.RelatedEFormId }; await planningCase.Create(_dbContext); foreach (var siteId in siteIds) { var casesToDelete = await _dbContext.PlanningCaseSites. Where(x => x.ItemId == item.Id && x.MicrotingSdkSiteId == siteId && x.WorkflowState != Constants.WorkflowStates.Retracted).ToListAsync(); foreach (var caseToDelete in casesToDelete) { var caseDto = await _sdkCore.CaseLookupCaseId(caseToDelete.MicrotingSdkCaseId); if (caseDto.MicrotingUId != null) { await _sdkCore.CaseDelete((int)caseDto.MicrotingUId); } caseToDelete.WorkflowState = Constants.WorkflowStates.Retracted; await caseToDelete.Update(_dbContext); } mainElement.Label = string.IsNullOrEmpty(item.ItemNumber) ? "" : item.ItemNumber; if (!string.IsNullOrEmpty(item.Name)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{item.Name}" : $" - {item.Name}"; } if (!string.IsNullOrEmpty(item.BuildYear)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{item.BuildYear}" : $" - {item.BuildYear}"; } if (!string.IsNullOrEmpty(item.Type)) { mainElement.Label += string.IsNullOrEmpty(mainElement.Label) ? $"{item.Type}" : $" - {item.Type}"; } mainElement.ElementList[0].Label = mainElement.Label; mainElement.CheckListFolderName = folderId; mainElement.StartDate = DateTime.Now.ToUniversalTime(); mainElement.EndDate = DateTime.Now.AddYears(10).ToUniversalTime(); var planningCaseSite = await _dbContext.PlanningCaseSites.SingleOrDefaultAsync(x => x.PlanningCaseId == planningCase.Id && x.MicrotingSdkSiteId == siteId); if (planningCaseSite == null) { planningCaseSite = new PlanningCaseSite() { MicrotingSdkSiteId = siteId, MicrotingSdkeFormId = message.RelatedEFormId, Status = 66, ItemId = item.Id, PlanningCaseId = planningCase.Id }; await planningCaseSite.Create(_dbContext); } if (planningCaseSite.MicrotingSdkCaseId >= 1) { continue; } await using var sdkDbContext = _sdkCore.dbContextHelper.GetDbContext(); var sdkSite = await sdkDbContext.sites.SingleAsync(x => x.Id == siteId); var caseId = await _sdkCore.CaseCreate(mainElement, "", (int)sdkSite.MicrotingUid, null); if (caseId != null) { var caseDto = await _sdkCore.CaseLookupMUId((int)caseId); if (caseDto?.CaseId != null) { planningCaseSite.MicrotingSdkCaseId = (int)caseDto.CaseId; } await planningCaseSite.Update(_dbContext); } } } }
public async Task <OperationResult> Update(ReplyRequest model) { var checkListValueList = new List <string>(); var fieldValueList = new List <string>(); var core = await _coreHelper.GetCore(); var language = await _userService.GetCurrentUserLanguage(); var currentUser = await _userService.GetCurrentUserAsync(); try { model.ElementList.ForEach(element => { checkListValueList.AddRange(CaseUpdateHelper.GetCheckList(element)); fieldValueList.AddRange(CaseUpdateHelper.GetFieldList(element)); }); } catch (Exception ex) { Log.LogException(ex.Message); Log.LogException(ex.StackTrace); return(new OperationResult(false, $"{_localizationService.GetString("CaseCouldNotBeUpdated")} Exception: {ex.Message}")); } try { await core.CaseUpdate(model.Id, fieldValueList, checkListValueList); await core.CaseUpdateFieldValues(model.Id, language); var sdkDbContext = core.DbContextHelper.GetDbContext(); var foundCase = await sdkDbContext.Cases .Where(x => x.Id == model.Id && x.WorkflowState != Constants.WorkflowStates.Removed) .FirstOrDefaultAsync(); if (foundCase != null) { if (foundCase.DoneAt != null) { var newDoneAt = new DateTime(model.DoneAt.Year, model.DoneAt.Month, model.DoneAt.Day, foundCase.DoneAt.Value.Hour, foundCase.DoneAt.Value.Minute, foundCase.DoneAt.Value.Second); foundCase.DoneAtUserModifiable = newDoneAt; } // foundCase.SiteId = sdkDbContext.Sites // .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed) // .Single(x => x.Name == $"{currentUser.FirstName} {currentUser.LastName}").Id; foundCase.Status = 100; await foundCase.Update(sdkDbContext); var planningCase = await _dbContext.PlanningCases.SingleAsync(x => x.MicrotingSdkCaseId == model.Id); var planningCaseSite = await _dbContext.PlanningCaseSites.SingleOrDefaultAsync(x => x.MicrotingSdkCaseId == model.Id && x.PlanningCaseId == planningCase.Id); if (planningCaseSite == null) { planningCaseSite = new PlanningCaseSite() { MicrotingSdkCaseId = model.Id, PlanningCaseId = planningCase.Id, MicrotingSdkeFormId = planningCase.MicrotingSdkeFormId, PlanningId = planningCase.PlanningId, Status = 100, MicrotingSdkSiteId = (int)foundCase.SiteId }; await planningCaseSite.Create(_dbContext); } planningCaseSite.MicrotingSdkCaseDoneAt = foundCase.DoneAtUserModifiable; planningCaseSite = await SetFieldValue(planningCaseSite, foundCase.Id, language); await planningCaseSite.Update(_dbContext); planningCase.MicrotingSdkCaseDoneAt = foundCase.DoneAtUserModifiable; planningCase = await SetFieldValue(planningCase, foundCase.Id, language); await planningCase.Update(_dbContext); } else { return(new OperationResult(false, _localizationService.GetString("CaseNotFound"))); } return(new OperationResult(true, _localizationService.GetString("CaseHasBeenUpdated"))); } catch (Exception ex) { Log.LogException(ex.Message); Log.LogException(ex.StackTrace); return(new OperationResult(false, _localizationService.GetString("CaseCouldNotBeUpdated") + $" Exception: {ex.Message}")); } }