private async Task <PlanningCase> SetFieldValue(PlanningCase planningCase, int caseId, Language language)
        {
            var planning = await _dbContext.Plannings.FirstOrDefaultAsync(x => x.Id == planningCase.PlanningId).ConfigureAwait(false);

            var caseIds = new List <int> {
                planningCase.MicrotingSdkCaseId
            };
            var fieldValues = await _sdkCore.Advanced_FieldValueReadList(caseIds, language).ConfigureAwait(false);

            if (planning == null)
            {
                return(planningCase);
            }
            if (planning.NumberOfImagesEnabled)
            {
                planningCase.NumberOfImages = 0;
                foreach (var fieldValue in fieldValues)
                {
                    if (fieldValue.FieldType == Constants.FieldTypes.Picture)
                    {
                        if (fieldValue.UploadedData != null)
                        {
                            planningCase.NumberOfImages += 1;
                        }
                    }
                }
            }

            return(planningCase);
        }
        private async Task <PlanningCase> SetFieldValue(PlanningCase itemCase, int caseId)
        {
            var item     = _dbContext.Items.SingleOrDefault(x => x.Id == itemCase.ItemId);
            var planning = _dbContext.Plannings.SingleOrDefault(x => x.Id == item.PlanningId);
            var caseIds  = new List <int>();

            caseIds.Add(itemCase.MicrotingSdkCaseId);
            var fieldValues = await _sdkCore.Advanced_FieldValueReadList(caseIds);

            if (planning == null)
            {
                return(itemCase);
            }
            if (planning.NumberOfImagesEnabled)
            {
                itemCase.NumberOfImages = 0;
                foreach (var fieldValue in fieldValues)
                {
                    if (fieldValue.FieldType == Constants.FieldTypes.Picture)
                    {
                        if (fieldValue.UploadedData != null)
                        {
                            itemCase.NumberOfImages += 1;
                        }
                    }
                }
            }

            return(itemCase);
        }
        public async Task Handle(PlanningCaseCreate message)
        {
            var planning = await _dbContext.Plannings
                           .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                           .FirstOrDefaultAsync(x => x.Id == message.PlanningId);

            await using MicrotingDbContext microtingDbContext = _sdkCore.DbContextHelper.GetDbContext();
            if (planning != null)
            {
                var siteIds = _dbContext.PlanningSites
                              .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed &&
                                     x.PlanningId == planning.Id)
                              .Select(x => x.SiteId)
                              .ToList();

                var planningCases = await _dbContext.PlanningCases
                                    .Where(x => x.PlanningId == planning.Id &&
                                           x.WorkflowState != Constants.WorkflowStates.Retracted &&
                                           x.WorkflowState != Constants.WorkflowStates.Removed)
                                    .ToListAsync();

                foreach (PlanningCase cPlanningCase in planningCases)
                {
                    cPlanningCase.WorkflowState = Constants.WorkflowStates.Retracted;
                    await cPlanningCase.Update(_dbContext);
                }

                PlanningCase planningCase = new PlanningCase()
                {
                    PlanningId          = planning.Id,
                    Status              = 66,
                    MicrotingSdkeFormId = message.RelatedEFormId
                };
                await planningCase.Create(_dbContext);

                foreach (var siteId in siteIds)
                {
                    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 sdkCase = await microtingDbContext.Cases.FirstOrDefaultAsync(x => x.Id == caseToDelete.MicrotingSdkCaseId);

                        if (sdkCase is { MicrotingUid: { } })
Пример #4
0
        public async Task PlanningCase_Save_DoesSave()
        {
            // Arrange
            var planning = new Planning();

            await planning.Create(DbContext);

            var commonTranslationModels = new List <PlanningNameTranslation>()
            {
                new PlanningNameTranslation()
                {
                    Name     = Guid.NewGuid().ToString(),
                    Language = new Language()
                    {
                        LanguageCode = "da", Name = "Danish"
                    },
                    Planning = planning
                }
            };

            foreach (var translationModel in commonTranslationModels)
            {
                await translationModel.Create(DbContext);
            }


            var planningCase = new PlanningCase
            {
                MicrotingSdkSiteId  = 24,
                MicrotingSdkCaseId  = 34,
                MicrotingSdkeFormId = 234,
                Status     = 66,
                PlanningId = planning.Id,
            };

            // Act
            await planningCase.Create(DbContext);

            var planningCases        = DbContext.PlanningCases.AsNoTracking().ToList();
            var planningCaseVersions = DbContext.PlanningCaseVersions.AsNoTracking().ToList();

            // Assert
            Assert.AreEqual(1, planningCases.Count);
            Assert.AreEqual(1, planningCaseVersions.Count);
            Assert.AreEqual(planningCase.MicrotingSdkSiteId, planningCases[0].MicrotingSdkSiteId);
            Assert.AreEqual(planningCase.MicrotingSdkCaseId, planningCases[0].MicrotingSdkCaseId);
            Assert.AreEqual(planningCase.MicrotingSdkeFormId, planningCases[0].MicrotingSdkeFormId);
            Assert.AreEqual(planningCase.Status, planningCases[0].Status);
            Assert.AreEqual(Constants.WorkflowStates.Created, planningCases[0].WorkflowState);
            Assert.AreEqual(planningCase.Id, planningCases[0].Id);
            Assert.AreEqual(planningCase.PlanningId, planningCases[0].PlanningId);
            Assert.AreEqual(1, planningCases[0].Version);

            Assert.AreEqual(planningCase.MicrotingSdkSiteId, planningCaseVersions[0].MicrotingSdkSiteId);
            Assert.AreEqual(planningCase.MicrotingSdkCaseId, planningCaseVersions[0].MicrotingSdkCaseId);
            Assert.AreEqual(planningCase.MicrotingSdkeFormId, planningCaseVersions[0].MicrotingSdkeFormId);
            Assert.AreEqual(planningCase.Status, planningCaseVersions[0].Status);
            Assert.AreEqual(Constants.WorkflowStates.Created, planningCaseVersions[0].WorkflowState);
            Assert.AreEqual(planningCase.Id, planningCaseVersions[0].PlanningCaseId);
            Assert.AreEqual(planningCase.PlanningId, planningCaseVersions[0].PlanningId);
            Assert.AreEqual(1, planningCaseVersions[0].Version);
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        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 Handle(eFormCompleted message)
        {
            await using MicrotingDbContext sdkDbContext = _sdkCore.DbContextHelper.GetDbContext();
            Console.WriteLine($"Checking PlanningCaseSites with MicrotingSdkCaseId == {message.caseId}");
            Console.WriteLine($"Checking Cases with Id == {message.caseId}");
            Console.WriteLine($"Checking Cases with MicrotingCheckUid == {message.CheckId}");
            var planningCaseSite =
                await _dbContext.PlanningCaseSites.FirstOrDefaultAsync(x => x.MicrotingSdkCaseId == message.caseId);

            var dbCase = await sdkDbContext.Cases.FirstOrDefaultAsync(x => x.Id == message.caseId) ?? await sdkDbContext.Cases.FirstOrDefaultAsync(x => x.MicrotingCheckUid == message.CheckId);

            if (planningCaseSite == null)
            {
                Console.WriteLine($"Checking CheckListSites with MicrotingUid == {message.MicrotingUId}");
                var checkListSite = await sdkDbContext.CheckListSites.FirstOrDefaultAsync(x =>
                                                                                          x.MicrotingUid == message.MicrotingUId);

                if (checkListSite != null)
                {
                    Console.WriteLine($"Checking PlanningCaseSites with MicrotingCheckListSitId == {checkListSite.Id}");
                    planningCaseSite =
                        await _dbContext.PlanningCaseSites.FirstOrDefaultAsync(x =>
                                                                               x.MicrotingCheckListSitId == checkListSite.Id);
                }
            }
            if (planningCaseSite != null)
            {
                Planning planning =
                    await _dbContext.Plannings.FirstAsync(x => x.Id == planningCaseSite.PlanningId);

                Site site = await sdkDbContext.Sites.FirstAsync(x => x.Id == dbCase.SiteId);

                Language language = await sdkDbContext.Languages.FirstAsync(x => x.Id == site.LanguageId);

                if (dbCase.MicrotingUid != null && dbCase.MicrotingCheckUid != null)
                {
                    ReplyElement theCase =
                        await _sdkCore.CaseRead((int)dbCase.MicrotingUid, (int)dbCase.MicrotingCheckUid, language);

                    if (planning.RepeatType == RepeatType.Day && planning.RepeatEvery == 0)
                    {
                        var planningCase =
                            await _dbContext.PlanningCases.FirstOrDefaultAsync(x =>
                                                                               x.Id == planningCaseSite.PlanningCaseId);

                        if (planningCase != null && planningCase.Status != 100)
                        {
                            planningCase.Status = 100;
                            planningCase.MicrotingSdkCaseDoneAt = theCase.DoneAt;
                            planningCase.MicrotingSdkCaseId     = dbCase.Id;
                            planningCase.DoneByUserId           = theCase.DoneById;
                            planningCase.DoneByUserName         = site.Name;
                            planningCase.MicrotingSdkeFormId    = (int)dbCase.CheckListId;
                            planningCase.WorkflowState          = Constants.WorkflowStates.Processed;

                            planningCase = await SetFieldValue(planningCase, theCase.Id, language);

                            await planningCase.Update(_dbContext);
                        }
                        else
                        {
                            if (planningCase == null || planningCase.MicrotingSdkCaseId != dbCase.Id)
                            {
                                planningCase = new PlanningCase
                                {
                                    Status = 100,
                                    MicrotingSdkCaseDoneAt = theCase.DoneAt,
                                    MicrotingSdkCaseId     = dbCase.Id,
                                    DoneByUserId           = theCase.DoneById,
                                    DoneByUserName         = site.Name,
                                    WorkflowState          = Constants.WorkflowStates.Processed,
                                    MicrotingSdkeFormId    = (int)dbCase.CheckListId,
                                    PlanningId             = planning.Id
                                };
                                await planningCase.Create(_dbContext);

                                planningCase = await SetFieldValue(planningCase, theCase.Id, language);

                                await planningCase.Update(_dbContext);
                            }
                        }
                    }
                    else
                    {
                        planningCaseSite.Status = 100;
                        planningCaseSite        = await SetFieldValue(planningCaseSite, theCase.Id, language);

                        planningCaseSite.MicrotingSdkCaseDoneAt = theCase.DoneAt;
                        planningCaseSite.DoneByUserId           = theCase.DoneById;
                        var worker = await sdkDbContext.Workers.SingleAsync(x => x.Id == planningCaseSite.DoneByUserId);

                        planningCaseSite.DoneByUserName = $"{worker.FirstName} {worker.LastName}";
                        await planningCaseSite.Update(_dbContext);

                        var planningCase =
                            await _dbContext.PlanningCases.SingleOrDefaultAsync(x =>
                                                                                x.Id == planningCaseSite.PlanningCaseId);

                        if (planningCase.Status != 100)
                        {
                            planningCase.Status = 100;
                            planningCase.MicrotingSdkCaseDoneAt = theCase.DoneAt;
                            planningCase.MicrotingSdkCaseId     = dbCase.Id;
                            planningCase.DoneByUserId           = theCase.DoneById;
                            planningCase.DoneByUserName         = site.Name;
                            planningCase.WorkflowState          = Constants.WorkflowStates.Processed;
                            // planningCase.DoneByUserName = $"{site.Result.FirstName} {site.Result.LastName}";

                            planningCase = await SetFieldValue(planningCase, theCase.Id, language);

                            await planningCase.Update(_dbContext);
                        }

                        planning.DoneInPeriod = true;
                        await planning.Update(_dbContext);

                        await RetractFromMicroting(planningCase.Id);
                    }
                }
            }
        }
        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);
                }
            }
        }
Пример #9
0
        public async Task UploadedData_Update_DoesUpdate()
        {
            // Arrange
            var planning = new Planning();

            await planning.Create(DbContext);

            var commonTranslationModels = new List <PlanningNameTranslation>()
            {
                new PlanningNameTranslation()
                {
                    Name     = Guid.NewGuid().ToString(),
                    Language = new Language()
                    {
                        LanguageCode = "da", Name = "Danish"
                    },
                    Planning = planning
                }
            };

            foreach (var translationModel in commonTranslationModels)
            {
                await translationModel.Create(DbContext);
            }

            var planningCase = new PlanningCase
            {
                MicrotingSdkSiteId  = 24,
                MicrotingSdkCaseId  = 34,
                MicrotingSdkeFormId = 234,
                Status     = 66,
                PlanningId = planning.Id,
            };

            await planningCase.Create(DbContext);

            var uploadedData = new UploadedData
            {
                PlanningCaseId = planningCase.Id,
                Checksum       = Guid.NewGuid().ToString(),
                Extension      = Guid.NewGuid().ToString(),
                CurrentFile    = Guid.NewGuid().ToString(),
                UploaderType   = Guid.NewGuid().ToString(),
                FileLocation   = Guid.NewGuid().ToString(),
                FileName       = Guid.NewGuid().ToString()
            };
            await uploadedData.Create(DbContext);

            var newCheckSum     = Guid.NewGuid().ToString();
            var newExtension    = Guid.NewGuid().ToString();
            var newCurrentFile  = Guid.NewGuid().ToString();
            var newUploaderType = Guid.NewGuid().ToString();
            var newFileLocation = Guid.NewGuid().ToString();
            var newFileName     = Guid.NewGuid().ToString();

            uploadedData.Checksum     = newCheckSum;
            uploadedData.Extension    = newExtension;
            uploadedData.CurrentFile  = newCurrentFile;
            uploadedData.UploaderType = newUploaderType;
            uploadedData.FileLocation = newFileLocation;
            uploadedData.FileName     = newFileName;
            //Act
            await uploadedData.Update(DbContext);

            var dbUploadedData          = DbContext.UploadedDatas.AsNoTracking().First();
            var uploadedDataList        = DbContext.UploadedDatas.AsNoTracking().ToList();
            var uploadedDataVersionList = DbContext.UploadedDataVersions.AsNoTracking().ToList();

            //Assert
            Assert.NotNull(dbUploadedData);

            Assert.AreEqual(1, uploadedDataList.Count);
            Assert.AreEqual(2, uploadedDataVersionList.Count);

            Assert.AreEqual(newCheckSum, dbUploadedData.Checksum);
            Assert.AreEqual(newExtension, dbUploadedData.Extension);
            Assert.AreEqual(newCurrentFile, dbUploadedData.CurrentFile);
            Assert.AreEqual(newUploaderType, dbUploadedData.UploaderType);
            Assert.AreEqual(newFileLocation, dbUploadedData.FileLocation);
            Assert.AreEqual(newFileName, dbUploadedData.FileName);
            Assert.AreEqual(uploadedData.PlanningCaseId, dbUploadedData.PlanningCaseId);
        }