Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
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);
            }
        }