コード例 #1
0
        public async Task <OperationDataResult <Stream> > GenerateWordDashboard(EFormCasesReportModel reportModel)
        {
            try
            {
                // get core
                var core = await _coreHelper.GetCore();

                //var headerImageName = _dbContext.ConfigurationValues
                //    .Single(x => x.Id == "HeaderSettings:MainText").Value;

                _s3Enabled    = core.GetSdkSetting(Settings.s3Enabled).Result.ToLower() == "true";
                _swiftEnabled = core.GetSdkSetting(Settings.swiftEnabled).Result.ToLower() == "true";
                // Read html and template
                var resourceString = "eFormAPI.Web.Resources.Templates.WordExport.page.html";
                var assembly       = Assembly.GetExecutingAssembly();
                var resourceStream = assembly.GetManifestResourceStream(resourceString);
                using var reader = new StreamReader(resourceStream ?? throw new InvalidOperationException($"{nameof(resourceStream)} is null"));
                var html = await reader.ReadToEndAsync();

                resourceString = "eFormAPI.Web.Resources.Templates.WordExport.file.docx";
                var docxFileResourceStream = assembly.GetManifestResourceStream(resourceString);
                if (docxFileResourceStream == null)
                {
                    throw new InvalidOperationException($"{nameof(docxFileResourceStream)} is null");
                }
                var docxFileStream = new MemoryStream();
                await docxFileResourceStream.CopyToAsync(docxFileStream);

                var basePicturePath = await core.GetSdkSetting(Settings.fileLocationPicture);

                var word = new WordProcessor(docxFileStream);

                var itemsHtml = "";
                //var header = _dbContext.PluginConfigurationValues.Single(x => x.Name == "ItemsPlanningBaseSettings:ReportHeaderName").Value;
                //var subHeader = _dbContext.PluginConfigurationValues.Single(x => x.Name == "ItemsPlanningBaseSettings:ReportSubHeaderName").Value;
                itemsHtml += "<body>";
                itemsHtml += @"<p style='display:flex;align-content:center;justify-content:center;flex-wrap:wrap;'>";
                for (var i = 0; i < 8; i++)
                {
                    itemsHtml += @"<p style='font-size:24px;text-align:center;color:#fff;'>Enter</p>";
                }
                //itemsHtml += $@"<p style='font-size:24px;text-align:center;'>{header}</p>";
                //itemsHtml += $@"<p style='font-size:20px;text-align:center;'>{subHeader}</p>";
                if (reportModel.FromDate != null && reportModel.ToDate != null)
                {
                    itemsHtml +=
                        $@"<p style='font-size:15px;text-align:center;'>{_localizationService.GetString("ReportPeriod")}: "
                        + $@"{reportModel.FromDate} - {reportModel.ToDate}</p>";
                }
                //if (!string.IsNullOrEmpty(headerImageName) && headerImageName != "../../../assets/images/logo.png")
                //{
                //    itemsHtml = await InsertImage(headerImageName, itemsHtml, 150, 150, core, basePicturePath);
                //}
                itemsHtml += @"</p>";
                itemsHtml += @"<div style='page-break-before:always;'>";

                if (reportModel.TextHeaders != null)
                {
                    if (!string.IsNullOrEmpty(reportModel.TextHeaders.Header1))
                    {
                        itemsHtml += $@"<p style='font-size:16pt;color:#2e74b5;'>{reportModel.TextHeaders.Header1}</p>";
                    }


                    if (!string.IsNullOrEmpty(reportModel.TextHeaders.Header2))
                    {
                        itemsHtml += $@"<p style='font-size:13pt;color:#2e74b5;'>{reportModel.TextHeaders.Header2}</p>";
                    }


                    if (!string.IsNullOrEmpty(reportModel.TextHeaders.Header3))
                    {
                        itemsHtml += $@"<p style='font-size:12pt;color:#1f4d78;'>{reportModel.TextHeaders.Header3}</p>";
                    }


                    if (!string.IsNullOrEmpty(reportModel.TextHeaders.Header4))
                    {
                        itemsHtml +=
                            $@"<p style='font-size:11pt;font-style:normal;'>{reportModel.TextHeaders.Header4}</p>";
                    }


                    if (!string.IsNullOrEmpty(reportModel.TextHeaders.Header5))
                    {
                        itemsHtml +=
                            $@"<p style='font-size:10pt;font-style:normal;'>{reportModel.TextHeaders.Header5}</p>";
                    }
                }
                foreach (var description in reportModel.DescriptionBlocks)
                {
                    itemsHtml += $@"<p>{description}</p>";
                }

                //if (!string.IsNullOrEmpty(reportModel.TableName))
                //{
                //    itemsHtml += $@"<p style='padding-bottom: 0;'>{_localizationService.GetString("Table")} {i + 1}: {reportModel.TableName}</p>";
                //}

                itemsHtml += @"<table width=""100%"" border=""1"">";

                // Table header
                itemsHtml += @"<tr style=""background-color:#f5f5f5;font-weight:bold"">";
                itemsHtml += $@"<td>{_localizationService.GetString("CaseId")}</td>";
                itemsHtml += $@"<td>{_localizationService.GetString("CreatedAt")}</td>";
                itemsHtml += $@"<td>{_localizationService.GetString("DoneBy")}</td>";
                //itemsHtml += $@"<td>{_localizationService.GetString("ItemName")}</td>";

                foreach (var itemHeader in reportModel.ItemHeaders)
                {
                    itemsHtml += $@"<td>{itemHeader.Value}</td>";
                }

                itemsHtml += @"</tr>";

                foreach (var dataModel in reportModel.Items)
                {
                    itemsHtml += @"<tr>";
                    itemsHtml += $@"<td>{dataModel.MicrotingSdkCaseId}</td>";

                    itemsHtml += $@"<td>{dataModel.MicrotingSdkCaseDoneAt:dd.MM.yyyy HH:mm:ss}</td>";
                    itemsHtml += $@"<td>{dataModel.DoneBy}</td>";

                    foreach (var dataModelCaseField in dataModel.CaseFields)
                    {
                        itemsHtml += $@"<td>{dataModelCaseField}</td>";
                    }

                    // itemsHtml += $@"<td>{dataModel.ImagesCount}</td>";
                    // itemsHtml += $@"<td>{dataModel.PostsCount}</td>";
                    itemsHtml += @"</tr>";
                }

                itemsHtml += @"</table>";

                itemsHtml += @"<br/>";

                // if (!string.IsNullOrEmpty(reportModel.TemplateName))
                // {
                //    itemsHtml += $@"{reportModel.TemplateName}";
                // }

                // pictures
                foreach (var(key, value) in reportModel.ImageNames)
                {
                    itemsHtml +=
                        $@"<p>{_localizationService.GetString("Picture")}: {key[1]}</p>";

                    itemsHtml = await InsertImage(value[0], itemsHtml, 700, 650, core, basePicturePath);

                    if (!string.IsNullOrEmpty(value[1]))
                    {
                        itemsHtml += $@"<a href=""{value[1]}"">{value[1]}</a>";
                    }
                }

                itemsHtml += @"</div>";
                itemsHtml += "</body>";

                html = html.Replace("{%ItemList%}", itemsHtml);

                word.AddHtml(html);
                word.Dispose();
                docxFileStream.Position = 0;
                return(new OperationDataResult <Stream>(true, docxFileStream));
            }
            catch (Exception e)
            {
                Trace.TraceError(e.Message);
                _logger.LogError(e.Message);
                return(new OperationDataResult <Stream>(
                           false,
                           _localizationService.GetString("ErrorWhileCreatingWordFile")));
            }
        }
コード例 #2
0
        public async Task <OperationDataResult <EFormCasesReportModel> > GetReportEformCases(
            EFormCaseReportRequest eFormCaseReportRequest)
        {
            var core = await _coreHelper.GetCore();

            var language = await _userService.GetCurrentUserLanguage();

            var sdkDbContext = core.DbContextHelper.GetDbContext();
            var timeZoneInfo = await _userService.GetCurrentUserTimeZoneInfo();

            var template = await core.TemplateItemRead(eFormCaseReportRequest.TemplateId, language);

            if (template == null)
            {
                return(new OperationDataResult <EFormCasesReportModel>(false,
                                                                       _localizationService.GetString("TemplateNotFound")));
            }

            var casesQueryable = sdkDbContext.Cases
                                 .Include(x => x.Worker)
                                 .Where(x => x.DoneAt != null)
                                 .OrderBy(x => x.DoneAt)
                                 .Where(x => x.CheckListId == template.Id)
                                 .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed);

            if (DateTime.TryParse(eFormCaseReportRequest.DateFrom, out var dateFrom))
            {
                casesQueryable = casesQueryable.Where(x => x.DoneAt >= dateFrom);
            }

            if (DateTime.TryParse(eFormCaseReportRequest.DateTo, out var dateTo))
            {
                dateTo         = dateTo.AddHours(23).AddMinutes(59).AddSeconds(59);
                casesQueryable = casesQueryable.Where(x => x.DoneAt <= dateTo);
            }

            if (!casesQueryable.Any()) // if count <= 0
            {
                return(new OperationDataResult <EFormCasesReportModel>(false,
                                                                       _localizationService.GetString("CasesNotFound")));
            }

            var cases = casesQueryable.ToList();

            var casesIds = cases.Select(x => x.Id).ToList();

            // Exclude field types: None, Picture, Audio, Movie, Signature, Show PDF, FieldGroup, SaveButton
            var excludedFieldTypeIds = 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 templateName = sdkDbContext.CheckListTranslations
                               .Single(x => x.CheckListId == template.Id && x.LanguageId == language.Id).Text;
            var result = new EFormCasesReportModel()
            {
                TemplateName = templateName,
                TextHeaders  = new EformReportHeaders()
                {
                    Header1 = template.ReportH1 ?? templateName,
                    Header2 = template.ReportH2 == template.ReportH1 ? null : template.ReportH2,
                    Header3 = template.ReportH3 == template.ReportH2 ? null : template.ReportH3,
                    Header4 = template.ReportH4 == template.ReportH3 ? null : template.ReportH4,
                    Header5 = template.ReportH5 == template.ReportH4 ? null : template.ReportH5,
                },
                DescriptionBlocks = new List <string>(),
                Items             = new List <ReportEformCaseModel>(),
                ImageNames        = new List <KeyValuePair <List <string>, List <string> > >(),
                ItemHeaders       = new List <KeyValuePair <int, string> >(),
                FromDate          = dateFrom,
                ToDate            = dateTo,
            };

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

            foreach (var fieldDto in fields)
            {
                if (fieldDto.FieldType == Constants.FieldTypes.None)
                {
                    result.DescriptionBlocks.Add(fieldDto.Label);
                }

                if (!excludedFieldTypeIds.Contains(fieldDto.FieldType))
                {
                    var kvp = new KeyValuePair <int, string>(fieldDto.Id, fieldDto.Label);

                    result.ItemHeaders.Add(kvp);
                }
            }

            var imagesForEform = await sdkDbContext.FieldValues
                                 .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                                 .Where(x => x.Field.FieldTypeId == 5)
                                 .Where(x => casesIds.Contains((int)x.CaseId))
                                 .OrderBy(x => x.CaseId)
                                 .ToListAsync();

            foreach (var imageField in imagesForEform)
            {
                if (imageField.UploadedDataId != null)
                {
                    var singleCase = cases.Single(x => x.Id == imageField.CaseId);
                    if (singleCase.DoneAt != null)
                    {
                        var doneAt = (DateTime)singleCase.DoneAt;
                        doneAt = TimeZoneInfo.ConvertTimeFromUtc(doneAt, timeZoneInfo);
                        var label  = $"{imageField.CaseId} - {doneAt:yyyy-MM-dd HH:mm:ss};";
                        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>();
                        var uploadedData =
                            await sdkDbContext.UploadedDatas.SingleAsync(x => x.Id == imageField.UploadedDataId);

                        if (!string.IsNullOrEmpty(uploadedData.FileName))
                        {
                            list.Add(uploadedData.FileName);
                            list.Add(geoTag);
                            result.ImageNames.Add(new KeyValuePair <List <string>, List <string> >(keyList, list));
                        }
                    }
                }
            }

            // add cases
            foreach (var caseDto in cases)
            {
                var reportEformCaseModel = new ReportEformCaseModel
                {
                    Id = caseDto.Id,
                    MicrotingSdkCaseId     = caseDto.Id,
                    MicrotingSdkCaseDoneAt = TimeZoneInfo.ConvertTimeFromUtc((DateTime)caseDto.DoneAt, timeZoneInfo),
                    EFormId = caseDto.CheckListId,
                    DoneBy  = $"{caseDto.Worker.FirstName} {caseDto.Worker.LastName}",
                };

                var fieldValues = sdkDbContext.FieldValues
                                  .Where(x => x.CaseId == caseDto.Id)
                                  .Include(x => x.Field)
                                  .Include(x => x.Field.FieldType)
                                  .Include(x => x.Field.FieldOptions)
                                  .AsNoTracking()
                                  .ToList();


                foreach (var itemHeader in result.ItemHeaders)
                {
                    var caseField = fieldValues
                                    .FirstOrDefault(x => x.FieldId == itemHeader.Key);

                    if (caseField != null)
                    {
                        switch (caseField.Field.FieldType.Type)
                        {
                        case Constants.FieldTypes.MultiSelect:
                        {
                            string readableValue = "";
                            foreach (string s in caseField.Value.Split("|"))
                            {
                                FieldOption            fieldOption            = caseField.Field.FieldOptions.Single(x => x.Key == s);
                                FieldOptionTranslation fieldOptionTranslation =
                                    await sdkDbContext.FieldOptionTranslations.SingleAsync(x =>
                                                                                           x.FieldOptionId == fieldOption.Id && x.LanguageId == language.Id);

                                if (!string.IsNullOrEmpty(readableValue))
                                {
                                    readableValue += "<br>";
                                }

                                readableValue += fieldOptionTranslation.Text;
                            }

                            reportEformCaseModel.CaseFields.Add(readableValue);
                            break;
                        }

                        case Constants.FieldTypes.EntitySearch:
                        case Constants.FieldTypes.EntitySelect:
                        {
                            try
                            {
                                if (caseField.Value != "null")
                                {
                                    EntityItem entityItem =
                                        await sdkDbContext.EntityItems.AsNoTracking().SingleOrDefaultAsync(x => x.Id == int.Parse(caseField.Value));

                                    reportEformCaseModel.CaseFields.Add(entityItem.Name);
                                }
                                else
                                {
                                    reportEformCaseModel.CaseFields.Add("");
                                }
                            }
                            catch (Exception exception)
                            {
                                Console.WriteLine(exception.Message);
                            }

                            break;
                        }

                        case Constants.FieldTypes.SingleSelect:
                        {
                            FieldOption fieldOption =
                                caseField.Field.FieldOptions.SingleOrDefault(x => x.Key == caseField.Value);
                            if (fieldOption != null)
                            {
                                FieldOptionTranslation fieldOptionTranslation =
                                    await sdkDbContext.FieldOptionTranslations.SingleAsync(x =>
                                                                                           x.FieldOptionId == fieldOption.Id && x.LanguageId == language.Id);

                                reportEformCaseModel.CaseFields.Add(fieldOptionTranslation.Text);
                            }
                            else
                            {
                                reportEformCaseModel.CaseFields.Add("");
                            }
                            break;
                        }

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

                reportEformCaseModel.ImagesCount = await sdkDbContext.FieldValues
                                                   .Where(x => x.WorkflowState != Constants.WorkflowStates.Removed)
                                                   .Where(x => x.Field.FieldTypeId == 5)
                                                   .Where(x => x.CaseId == caseDto.Id)
                                                   .Select(x => x.Id)
                                                   .CountAsync();

                result.Items.Add(reportEformCaseModel);
            }

            return(new OperationDataResult <EFormCasesReportModel>(true, result));
        }