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"))); } }
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)); }