public async Task <OperationDataResult <CasePostsCommonModel> > GetCommonPosts(CasePostsRequestCommonModel requestModel)
        {
            try
            {
                var casePostsListModel = new CasePostsCommonModel();
                var casePostsQuery     = _dbContext.CasePosts
                                         .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                                         .AsQueryable();

                if (requestModel.CaseId != null)
                {
                    casePostsQuery = casePostsQuery
                                     .Where(x => x.CaseId == requestModel.CaseId);
                }

                if (requestModel.TemplateId != null)
                {
                    var core = await _coreService.GetCore();

                    await using var microtingDbContext = core.DbContextHelper.GetDbContext();
                    var casesIds = await microtingDbContext.Cases
                                   .Where(x => x.CheckListId == requestModel.TemplateId)
                                   .Select(x => x.Id)
                                   .ToListAsync();

                    casePostsQuery = casePostsQuery
                                     .Where(x => casesIds.Contains(x.CaseId));
                }

                casePostsListModel.Total = await casePostsQuery.CountAsync();

                casePostsQuery = casePostsQuery
                                 .Skip(requestModel.Offset)
                                 .Take(requestModel.PageSize);

                casePostsListModel.Entities = await casePostsQuery
                                              .Select(x => new CasePostCommonModel()
                {
                    CaseId       = x.CaseId,
                    PostId       = x.Id,
                    Subject      = x.Subject,
                    Text         = x.Text,
                    PostDate     = x.PostDate,
                    ToRecipients = x.Recipients
                                   .Select(y => $"{y.EmailRecipient.Name} ({y.EmailRecipient.Email})")
                                   .ToList(),
                    ToRecipientsTags = x.Tags
                                       .Select(y => y.EmailTag.Name)
                                       .ToList(),
                }).ToListAsync();

                return(new OperationDataResult <CasePostsCommonModel>(
                           true,
                           casePostsListModel));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                _logger.LogError(e.Message);
                return(new OperationDataResult <CasePostsCommonModel>(
                           false,
                           _localizationService.GetString("ErrorWhileObtainingPosts")));
            }
        }
        public async Task <OperationDataResult <List <ReportEformModel> > > GenerateReport(GenerateReportModel model, bool isDocx)
        {
            try
            {
                var timeZoneInfo = await _userService.GetCurrentUserTimeZoneInfo();

                var core = await _coreHelper.GetCore();

                await using var sdkDbContext = core.DbContextHelper.GetDbContext();
                //var casesQuery = microtingDbContext.cases
                //    .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                //    .Include(x => x.Site)
                //    .AsQueryable();
                var fromDate = new DateTime(model.DateFrom.Value.Year, model.DateFrom.Value.Month,
                                            model.DateFrom.Value.Day, 0, 0, 0);
                var toDate = new DateTime(model.DateTo.Value.Year, model.DateTo.Value.Month,
                                          model.DateTo.Value.Day, 23, 59, 59);

                var planningCasesQuery = _dbContext.PlanningCases
                                         .Include(x => x.Planning)
                                         .ThenInclude(x => x.PlanningsTags)
                                         .Where(x => x.Status == 100)
                                         .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                                         .AsNoTracking()
                                         .AsQueryable();

                if (model.DateFrom != null)
                {
                    planningCasesQuery = planningCasesQuery.Where(x =>
                                                                  x.MicrotingSdkCaseDoneAt >= fromDate);
                }

                if (model.DateTo != null)
                {
                    planningCasesQuery = planningCasesQuery.Where(x =>
                                                                  x.MicrotingSdkCaseDoneAt <= toDate);
                }

                if (model.TagIds.Count > 0)
                {
                    foreach (var tagId in model.TagIds)
                    {
                        planningCasesQuery = planningCasesQuery.Where(x =>
                                                                      x.Planning.PlanningsTags.Any(y => y.PlanningTagId == tagId && y.WorkflowState != Constants.WorkflowStates.Removed))
                                             .AsNoTracking();
                    }
                }
                var groupedCaseCheckListIds = planningCasesQuery.GroupBy(x => x.MicrotingSdkeFormId)
                                              .Select(x => x.Key)
                                              .ToList();

                List <CheckList> checkLists = new List <CheckList>();

                if (groupedCaseCheckListIds.Count > 0)
                {
                    checkLists = await sdkDbContext.CheckLists
                                 .FromSqlRaw("SELECT * FROM CheckLists WHERE" +
                                             $" Id IN ({string.Join(",", groupedCaseCheckListIds)})" +
                                             "  ORDER BY ReportH1, ReportH2, ReportH3, ReportH4").AsNoTracking().ToListAsync();
                }

                var itemCases = await planningCasesQuery
                                .OrderBy(x => x.Planning.RelatedEFormName)
                                .ToListAsync();

                var groupedCases = itemCases
                                   .GroupBy(x => x.MicrotingSdkeFormId)
                                   .Select(x => new
                {
                    templateId = x.Key,
                    cases      = x.ToList(),
                })
                                   .ToList();


                var result = new List <ReportEformModel>();
                // Exclude field types: None, Picture, Audio, Movie, Signature, Show PDF, FieldGroup, SaveButton
                var excludedFieldTypes = new List <string>()
                {
                    Constants.FieldTypes.None,
                    Constants.FieldTypes.Picture,
                    Constants.FieldTypes.Audio,
                    Constants.FieldTypes.Movie,
                    Constants.FieldTypes.Signature,
                    Constants.FieldTypes.ShowPdf,
                    Constants.FieldTypes.FieldGroup,
                    Constants.FieldTypes.SaveButton
                };
                var localeString = await _userService.GetCurrentUserLocale();

                var language = sdkDbContext.Languages.Single(x => x.LanguageCode == localeString);
                //foreach (var groupedCase in groupedCases)
                foreach (var checkList in checkLists)
                {
                    bool hasChildCheckLists   = sdkDbContext.CheckLists.Any(x => x.ParentId == checkList.Id);
                    var  checkListTranslation = sdkDbContext.CheckListTranslations
                                                .Where(x => x.CheckListId == checkList.Id)
                                                .First(x => x.LanguageId == language.Id).Text;
                    //var template = await sdkDbContext.CheckLists.SingleAsync(x => x.Id == groupedCase.templateId);
                    var groupedCase = groupedCases.SingleOrDefault(x => x.templateId == checkList.Id);

                    if (groupedCase != null)
                    {
                        var reportModel = new ReportEformModel
                        {
                            TemplateName = checkListTranslation,
                            FromDate     = $"{fromDate:yyyy-MM-dd}",
                            ToDate       = $"{toDate:yyyy-MM-dd}",
                            TextHeaders  = new ReportEformTextHeaderModel(),
                            TableName    = checkListTranslation,
                        };
                        // first pass
                        if (result.Count <= 0)
                        {
                            if (checkList.ReportH1 != null)
                            {
                                reportModel.TextHeaders.Header1 = checkList.ReportH1;
                            }
                            else
                            {
                                reportModel.TextHeaders.Header1 = checkListTranslation;
                                // reportModel.TableName = null;
                                // reportModel.TemplateName = null;
                            }
                            reportModel.TextHeaders.Header2 = checkList.ReportH2;
                            reportModel.TextHeaders.Header3 = checkList.ReportH3;
                            reportModel.TextHeaders.Header4 = checkList.ReportH4;
                            reportModel.TextHeaders.Header5 = checkList.ReportH5;
                        }
                        else // other pass
                        {
                            var header1 = result.LastOrDefault(x => x.TextHeaders.Header1 != null)?.TextHeaders.Header1;
                            var header2 = result.LastOrDefault(x => x.TextHeaders.Header2 != null)?.TextHeaders.Header2;
                            var header3 = result.LastOrDefault(x => x.TextHeaders.Header3 != null)?.TextHeaders.Header3;
                            var header4 = result.LastOrDefault(x => x.TextHeaders.Header4 != null)?.TextHeaders.Header4;
                            var header5 = result.LastOrDefault(x => x.TextHeaders.Header5 != null)?.TextHeaders.Header5;

                            // if not find or finded and templateHeader not equal

                            if (header1 == null || checkList.ReportH1 != header1)
                            {
                                reportModel.TextHeaders.Header1 = checkList.ReportH1 ?? "";
                            }

                            if (header2 == null || checkList.ReportH2 != header2)
                            {
                                reportModel.TextHeaders.Header2 = checkList.ReportH2 ?? "";
                            }

                            if (header3 == null || checkList.ReportH3 != header3)
                            {
                                reportModel.TextHeaders.Header3 = checkList.ReportH3 ?? "";
                            }

                            if (header4 == null || checkList.ReportH4 != header4)
                            {
                                reportModel.TextHeaders.Header4 = checkList.ReportH4 ?? "";
                            }

                            if (header5 == null || checkList.ReportH5 != header5)
                            {
                                reportModel.TextHeaders.Header5 = checkList.ReportH5 ?? "";
                            }
                        }

                        var fields = await core.Advanced_TemplateFieldReadAll(
                            checkList.Id, language);

                        foreach (var fieldDto in fields)
                        {
                            if (fieldDto.FieldType == Constants.FieldTypes.None)
                            {
                                var fieldTranslation =
                                    await sdkDbContext.FieldTranslations.FirstAsync(x =>
                                                                                    x.FieldId == fieldDto.Id && x.LanguageId == language.Id);

                                reportModel.DescriptionBlocks.Add(fieldTranslation.Description);
                            }
                            if (!excludedFieldTypes.Contains(fieldDto.FieldType))
                            {
                                var fieldTranslation =
                                    await sdkDbContext.FieldTranslations.FirstAsync(x =>
                                                                                    x.FieldId == fieldDto.Id && x.LanguageId == language.Id);

                                string text = fieldTranslation.Text;
                                if (hasChildCheckLists)
                                {
                                    var clTranslation =
                                        await sdkDbContext.CheckListTranslations.FirstOrDefaultAsync(x =>
                                                                                                     x.CheckListId == fieldDto.CheckListId && x.LanguageId == language.Id);

                                    if (checkListTranslation != clTranslation.Text)
                                    {
                                        text = $"{clTranslation.Text} - {text}";
                                    }
                                }
                                var kvp = new KeyValuePair <int, string>(fieldDto.Id, text);

                                reportModel.ItemHeaders.Add(kvp);
                            }
                        }

                        // images
                        var templateCaseIds = groupedCase.cases.Select(x => (int?)x.MicrotingSdkCaseId).ToArray();
                        var imagesForEform  = await sdkDbContext.FieldValues
                                              .Include(x => x.UploadedData)
                                              .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                                              .Where(x => x.UploadedData.WorkflowState != Constants.WorkflowStates.Removed)
                                              .Where(x => x.Field.FieldTypeId == 5)
                                              .Where(x => templateCaseIds.Contains(x.CaseId))
                                              .Where(x => x.UploadedDataId != null)
                                              .OrderBy(x => x.CaseId)
                                              .ToListAsync();

                        foreach (var imageField in imagesForEform)
                        {
                            var planningCase            = groupedCase.cases.Single(x => x.MicrotingSdkCaseId == imageField.CaseId && x.PlanningId != 0);
                            var planningNameTranslation =
                                await _dbContext.PlanningNameTranslation.SingleOrDefaultAsync(x =>
                                                                                              x.PlanningId == planningCase.PlanningId && x.LanguageId == language.Id);

                            if (planningNameTranslation != null)
                            {
                                var label  = $"{imageField.CaseId}; {planningNameTranslation.Name}";
                                var geoTag = "";
                                if (!string.IsNullOrEmpty(imageField.Latitude))
                                {
                                    geoTag =
                                        $"https://www.google.com/maps/place/{imageField.Latitude},{imageField.Longitude}";
                                }

                                var keyList = new List <string> {
                                    imageField.CaseId.ToString(), label
                                };
                                var list = new List <string>();
                                if (!string.IsNullOrEmpty(imageField.UploadedData.FileName))
                                {
                                    list.Add(isDocx
                                        ? $"{imageField.UploadedData.Id}_700_{imageField.UploadedData.Checksum}{imageField.UploadedData.Extension}"
                                        : imageField.UploadedData.FileName);
                                    list.Add(geoTag);
                                    reportModel.ImageNames.Add(
                                        new KeyValuePair <List <string>, List <string> >(keyList, list));
                                }
                            }
                        }

                        // posts
                        var casePostRequest = new CasePostsRequestCommonModel
                        {
                            Offset     = 0,
                            PageSize   = int.MaxValue,
                            TemplateId = checkList.Id,
                        };

                        var casePostListResult = await _casePostBaseService.GetCommonPosts(casePostRequest);

                        if (!casePostListResult.Success)
                        {
                            return(new OperationDataResult <List <ReportEformModel> >(
                                       false,
                                       casePostListResult.Message));
                        }

                        foreach (var casePostCommonModel in casePostListResult.Model.Entities)
                        {
                            reportModel.Posts.Add(new ReportEformPostModel
                            {
                                CaseId     = casePostCommonModel.CaseId,
                                PostId     = casePostCommonModel.PostId,
                                Comment    = casePostCommonModel.Text,
                                SentTo     = casePostCommonModel.ToRecipients,
                                SentToTags = casePostCommonModel.ToRecipientsTags,
                                PostDate   = casePostCommonModel.PostDate
                            });
                        }

                        // add cases
                        foreach (var planningCase in groupedCase.cases.OrderBy(x => x.MicrotingSdkCaseDoneAt).ToList())
                        {
                            var planningNameTranslation =
                                await _dbContext.PlanningNameTranslation.SingleOrDefaultAsync(x =>
                                                                                              x.PlanningId == planningCase.PlanningId && x.LanguageId == language.Id);

                            if (planningNameTranslation != null)
                            {
                                var item = new ReportEformItemModel
                                {
                                    Id = planningCase.Id,
                                    MicrotingSdkCaseId     = planningCase.MicrotingSdkCaseId,
                                    MicrotingSdkCaseDoneAt = TimeZoneInfo.ConvertTimeFromUtc((DateTime)planningCase.MicrotingSdkCaseDoneAt, timeZoneInfo),
                                    eFormId         = planningCase.MicrotingSdkeFormId,
                                    DoneBy          = planningCase.DoneByUserName,
                                    ItemName        = planningNameTranslation.Name,
                                    ItemDescription = planningCase.Planning.Description,
                                };


                                var caseFields = await core.Advanced_FieldValueReadList(
                                    new List <int>()
                                {
                                    planningCase.MicrotingSdkCaseId
                                }, language);

                                foreach (var caseField in reportModel.ItemHeaders.Select(itemHeader => caseFields
                                                                                         .FirstOrDefault(x => x.FieldId == itemHeader.Key)).Where(caseField => caseField != null))
                                {
                                    switch (caseField.FieldType)
                                    {
                                    case Constants.FieldTypes.MultiSelect:
                                        item.CaseFields.Add(caseField.ValueReadable.Replace("|", "<br>"));
                                        break;

                                    case Constants.FieldTypes.EntitySearch or
                                        Constants.FieldTypes.EntitySelect or
                                        Constants.FieldTypes.SingleSelect:
                                        item.CaseFields.Add(caseField.ValueReadable);
                                        break;

                                    default:
                                        item.CaseFields.Add(caseField.Value);
                                        break;
                                    }
                                }

                                item.ImagesCount = await sdkDbContext.FieldValues
                                                   .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                                                   .Where(x => x.Field.FieldTypeId == 5)
                                                   .Where(x => x.CaseId == planningCase.MicrotingSdkCaseId)
                                                   .Where(x => x.UploadedDataId != null)
                                                   .Select(x => x.Id)
                                                   .CountAsync();

                                item.PostsCount = casePostListResult.Model.Entities
                                                  .Where(x => x.CaseId == planningCase.MicrotingSdkCaseId)
                                                  .Select(x => x.PostId)
                                                  .Count();

                                reportModel.Items.Add(item);
                            }
                        }

                        result.Add(reportModel);
                    }
                }

                var reportEformModel = new ReportEformModel();
                reportEformModel.NameTagsInEndPage.AddRange(_dbContext.PlanningTags
                                                            .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                                                            .Where(x => model.TagIds.Any(y => y == x.Id))
                                                            .Select(x => x.Name));
                result.Add(reportEformModel);

                if (result.Any())
                {
                    return(new OperationDataResult <List <ReportEformModel> >(true, result));
                }

                return(new OperationDataResult <List <ReportEformModel> >(false, _itemsPlanningLocalizationService.GetString("NoDataInSelectedPeriod")));
            }
            catch (Exception e)
            {
                Trace.TraceError(e.Message);
                _logger.LogError(e.Message);
                return(new OperationDataResult <List <ReportEformModel> >(false,
                                                                          _itemsPlanningLocalizationService.GetString("ErrorWhileGeneratingReport")));
            }
        }