Esempio 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);
            }
        }
        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")));
            }
        }
Esempio n. 3
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);
            }
        }
        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")));
            }
        }