public async Task <OperationDataResult <EformReportFullModel> > GetEformReport(int templateId) { try { var result = new EformReportFullModel(); var core = await _coreHelper.GetCore(); await using var dbContext = core.DbContextHelper.GetDbContext(); var localeString = await _userService.GetCurrentUserLocale(); var language = dbContext.Languages.Single(x => x.LanguageCode == localeString); var template = await core.ReadeForm(templateId, language); if (template == null) { return(new OperationDataResult <EformReportFullModel>(false, _localizationService.GetString("TemplateNotFound"))); } var eformReport = await _dbContext.EformReports .FirstOrDefaultAsync(x => x.TemplateId == templateId); if (eformReport == null) { eformReport = new EformReport { TemplateId = template.Id, IsDateVisible = true, IsWorkerNameVisible = true, }; _dbContext.EformReports.Add(eformReport); await _dbContext.SaveChangesAsync(); } var reportElements = await _dbContext.EformReportElements .Include(x => x.DataItems) .ThenInclude(x => x.NestedDataItems) .Include(x => x.NestedElements) .ThenInclude(x => x.DataItems) .ThenInclude(x => x.NestedDataItems) .Where(x => x.EformReportId == eformReport.Id) .ToListAsync(); var reportElementsOrdered = new List <EformReportElementModel>(); foreach (var templateElement in template.ElementList) { var reportElement = reportElements .FirstOrDefault(p => p.ElementId == templateElement.Id); if (reportElement == null) { reportElement = new EformReportElement() { EformReportId = eformReport.Id, ElementId = templateElement.Id, }; _dbContext.EformReportElements.Add(reportElement); await _dbContext.SaveChangesAsync(); reportElement = await _dbContext.EformReportElements .Include(x => x.DataItems) .ThenInclude(x => x.NestedDataItems) .Include(x => x.NestedElements) .ThenInclude(x => x.DataItems) .ThenInclude(x => x.NestedDataItems) .Where(x => x.EformReportId == eformReport.Id && x.ElementId == templateElement.Id) .FirstOrDefaultAsync(); } var element = new EformReportElementModel() { Id = reportElement.Id, ElementId = reportElement.ElementId, Label = templateElement.Label, }; if (templateElement.GetType() == typeof(DataElement)) { var item = (DataElement)templateElement; var dataItemList = GetReportDataItemList(_dbContext, reportElement, null, item.DataItemList.Select(x => (object)x).ToList()); element.DataItemList = dataItemList; } if (templateElement.GetType() == typeof(GroupElement)) { var item = (GroupElement)templateElement; var elementList = GetReportElementsList(_dbContext, reportElement, item.ElementList.Select(x => (object)x).ToList()); element.ElementList = elementList; } reportElementsOrdered.Add(element); } result.EformMainElement = new EformMainElement() { Id = template.Id, Label = template.Label, ElementList = reportElementsOrdered }; var eformReportModel = new EformReportModel() { Id = eformReport.Id, TemplateId = eformReport.TemplateId, Description = eformReport.Description, HeaderImage = eformReport.HeaderImage == null ? string.Empty : Encoding.UTF8.GetString(eformReport.HeaderImage), HeaderVisibility = eformReport.HeaderVisibility, IsDateVisible = eformReport.IsDateVisible, IsWorkerNameVisible = eformReport.IsWorkerNameVisible, }; result.EformReport = eformReportModel; result.EformMainElement = new EformReportHelper().AddPageBreaks(result.EformMainElement); return(new OperationDataResult <EformReportFullModel>(true, result)); } catch (Exception e) { _logger.LogCritical(e, e.Message); return(new OperationDataResult <EformReportFullModel>(false, _localizationService.GetString("ErrorWhileObtainingReportInfo"))); } }
private static List <EformReportElementModel> GetReportElementsList(BaseDbContext dbContext, EformReportElement parent, List <object> elementList) { if (elementList == null) { elementList = new List <object>(); } var elements = new List <Element>(); var dataElements = new List <DataElement>(); var groupElements = new List <GroupElement>(); var item = elementList.FirstOrDefault(); if (item != null) { var itemType = item.GetType(); foreach (var element in elementList) { elements.Add((Element)element); } foreach (var element in elements) { var eformReportElement = parent.NestedElements.FirstOrDefault(x => x.ElementId == element.Id); if (eformReportElement == null) { eformReportElement = new EformReportElement() { EformReportId = parent.EformReportId, ElementId = element.Id, ParentId = parent.Id, }; dbContext.EformReportElements.Add(eformReportElement); dbContext.SaveChanges(); } parent.NestedElements.Add(eformReportElement); } if (itemType == typeof(DataElement)) { foreach (var element in elementList) { dataElements.Add((DataElement)element); } } if (itemType == typeof(GroupElement)) { foreach (var element in elementList) { groupElements.Add((GroupElement)element); } } } return(parent.NestedElements .Where(c => c.ParentId == parent.Id) .Select(x => new EformReportElementModel() { Id = x.Id, ElementId = x.ElementId, Label = elements.Where(y => y.Id == x.ElementId) .Select(y => y.Label) .FirstOrDefault(), ElementList = GetReportElementsList(dbContext, x, groupElements.Where(y => y.Id == x.ElementId) .Select(y => new List <object>(y.ElementList)) .FirstOrDefault()), DataItemList = GetReportDataItemList(dbContext, x, null, dataElements.Where(y => y.Id == x.ElementId) .Select(y => new List <object>(y.DataItemList)) .FirstOrDefault()), }).ToList()); }
private static List <EformReportDataItemModel> GetReportDataItemList(BaseDbContext dbContext, EformReportElement parentElement, EformReportDataItem parentDataItem, List <object> dataItemsList) { if (dataItemsList == null) { dataItemsList = new List <object>(); } var parentItems = new List <EformReportDataItem>(); if (parentElement != null) { parentItems.AddRange(parentElement.DataItems); } if (parentDataItem != null) { parentItems.AddRange(parentDataItem.NestedDataItems); } foreach (var dataItemObject in dataItemsList) { var item = (DataItem)dataItemObject; var eformReportDataItem = parentItems.FirstOrDefault(x => x.DataItemId == item.Id); if (eformReportDataItem == null) { eformReportDataItem = new EformReportDataItem() { DataItemId = item.Id, Visibility = true, }; if (parentElement != null) { eformReportDataItem.EformReportElementId = parentElement.Id; } if (parentDataItem != null) { eformReportDataItem.ParentId = parentDataItem.ParentId; } dbContext.EformReportDataItems.Add(eformReportDataItem); dbContext.SaveChanges(); eformReportDataItem = dbContext.EformReportDataItems .Include(x => x.NestedDataItems) .ThenInclude(x => x.NestedDataItems) .FirstOrDefault(x => x.Id == eformReportDataItem.Id); parentItems.Add(eformReportDataItem); } } var result = new List <EformReportDataItemModel>(); foreach (var dataItem in parentItems.OrderBy(c => c.Position)) { var model = new EformReportDataItemModel { Id = dataItem.Id, DataItemId = dataItem.DataItemId, Position = dataItem.Position, Visibility = dataItem.Visibility, }; foreach (var dataItemObject in dataItemsList) { var type = dataItemObject.GetType(); if (type == typeof(FieldContainer)) { var item = (FieldContainer)dataItemObject; if (item.Id == dataItem.DataItemId) { model.FieldType = type.ToString().Remove(0, 10); model.Label = item.Label; model.DataItemList = GetReportDataItemList(dbContext, null, dataItem, item.DataItemList.Select(x => (object)x).ToList()); } } if (type == typeof(MultiSelect)) { var item = (MultiSelect)dataItemObject; if (item.Id == dataItem.DataItemId) { model.FieldType = type.ToString().Remove(0, 10); model.Label = item.Label; foreach (var keyValuePair in item.KeyValuePairList) { model.KeyValuePairList.Add(new EformKeyValuePairModel() { Key = keyValuePair.Key, Value = keyValuePair.Value, DisplayOrder = keyValuePair.DisplayOrder, Selected = keyValuePair.Selected, }); } } } if (type == typeof(SingleSelect)) { var item = (SingleSelect)dataItemObject; if (item.Id == dataItem.DataItemId) { model.FieldType = type.ToString().Remove(0, 10); model.Label = item.Label; foreach (var keyValuePair in item.KeyValuePairList) { model.KeyValuePairList.Add(new EformKeyValuePairModel() { Key = keyValuePair.Key, Value = keyValuePair.Value, DisplayOrder = keyValuePair.DisplayOrder, Selected = keyValuePair.Selected, }); } } } // Common fields if (type == typeof(Audio) || type == typeof(Comment) || type == typeof(Date) || type == typeof(EntitySearch) || type == typeof(EntitySelect) || type == typeof(None) || type == typeof(Number) || type == typeof(NumberStepper) || type == typeof(Picture) || type == typeof(ShowPdf) || type == typeof(SaveButton) || type == typeof(Signature) || type == typeof(Text) || type == typeof(Timer) || type == typeof(CheckBox)) { var item = (DataItem)dataItemObject; if (item.Id == dataItem.DataItemId) { model.FieldType = type.ToString().Remove(0, 10); model.Label = item.Label; } } } result.Add(model); } return(result); }