protected XlsxImportResult <TModel> ImportModels <TModel>(Stream stream, string[] prop, Func <XlsxImportResult <TModel>, Row, TModel> readModel) { var importResult = new XlsxImportResult <TModel>(); var xlsxDoc = new XlsxDoc(prop.Length); if (!xlsxDoc.TryLoad(stream)) { return(CreateXlsxImportResult <TModel>(LocalizationService.GetLocalizedError(ValidationError.WrongFileFormat))); } if (xlsxDoc.HeaderRow.Cells.Any(c => c.IsEmpty)) { return(CreateXlsxImportResult <TModel>(LocalizationService.GetLocalizedError(ValidationError.MissignHeader))); } XlsxImportResult <TModel> headerRowError = GetModelHeaderRowError <TModel>(xlsxDoc, prop); if (headerRowError != null) { return(headerRowError); } foreach (var row in xlsxDoc.DataMatrix) { importResult.ModelInfos.Add(new ModelInfo <TModel>(readModel(importResult, row), row.RowNumber)); } if (importResult.HasError) { importResult.ModelInfos.Clear(); } return(importResult); }
protected XlsxImportResult <TModel> CreateXlsxImportResult <TModel>(string errorMessage) { var xlsxImportResult = new XlsxImportResult <TModel>(); xlsxImportResult.ErrorList.Add(errorMessage); return(xlsxImportResult); }
protected ZustandsabschnittImportModel ReadZustandsabschnittImportModel(XlsxImportResult <ZustandsabschnittImportModel> importResult, Row row) { var model = new ZustandsabschnittImportModel { Id = Guid.NewGuid(), Strassenname = ParseNullableString(row.Cells[0]), StrassennameBezeichnungVon = ParseNullableString(row.Cells[1]), StrassennameBezeichnungBis = ParseNullableString(row.Cells[2]), ExternalId = ParseNullableString(row.Cells[3]), Abschnittsnummer = TryParseNullableInt(row.Cells[4], importResult), BezeichnungVon = ParseNullableString(row.Cells[5]), BezeichnungBis = ParseNullableString(row.Cells[6]), Laenge = TryParseDecimal(row.Cells[7], importResult), Zustandsindex = TryParseDecimal(row.Cells[8], importResult), ZustandsindexTrottoirLinks = TryParseEnum <ZustandsindexTyp>(row.Cells[9], importResult), ZustandsindexTrottoirRechts = TryParseEnum <ZustandsindexTyp>(row.Cells[10], importResult), Aufnahmedatum = TryParseDateTime(row.Cells[11], importResult), Aufnahmeteam = ParseNullableString(row.Cells[12]), Wetter = TryParseEnum <WetterTyp>(row.Cells[13], importResult), Bemerkung = ParseNullableString(row.Cells[14]), DringlichkeitFahrbahn = TryParseEnum <DringlichkeitTyp>(row.Cells[16], importResult), DringlichkeitTrottoirLinks = TryParseEnum <DringlichkeitTyp>(row.Cells[18], importResult), DringlichkeitTrottoirRechts = TryParseEnum <DringlichkeitTyp>(row.Cells[20], importResult), }; var strassenabschnitt = strassenabschnittService.GetStrassenabschnitt(model.Strassenname, model.StrassennameBezeichnungVon, model.StrassennameBezeichnungBis); if (strassenabschnitt == null) { importResult.ErrorList.Add(string.Format(LocalizationService.GetLocalizedError(ValidationError.StrassenabschnittDoesNotExistsError), model.Strassenname, model.StrassennameBezeichnungVon, model.StrassennameBezeichnungBis, row.RowNumber)); return(model); } var belastungskategorieTyp = strassenabschnitt.BelastungskategorieTyp; model.Strassenabschnitt = strassenabschnitt.Id; model.MassnahmenvorschlagFahrbahnId = TryGetMassnahmenvorschlagKatalog(row.Cells[15], MassnahmenvorschlagKatalogTyp.Fahrbahn, belastungskategorieTyp, importResult); model.MassnahmenvorschlagTrottoirLinksId = TryGetMassnahmenvorschlagKatalog(row.Cells[17], MassnahmenvorschlagKatalogTyp.Trottoir, belastungskategorieTyp, importResult); model.MassnahmenvorschlagTrottoirRechtsId = TryGetMassnahmenvorschlagKatalog(row.Cells[19], MassnahmenvorschlagKatalogTyp.Trottoir, belastungskategorieTyp, importResult); return(model); }
private StrassenabschnittImportModel ReadStrassenabschnittImportModel(XlsxImportResult <StrassenabschnittImportModel> importResult, Row row) { var i = 0; var model = new StrassenabschnittImportModel { Id = Guid.NewGuid(), Strassenname = ParseNullableString(row.Cells[i++]), BezeichnungVon = ParseNullableString(row.Cells[i++]), BezeichnungBis = ParseNullableString(row.Cells[i++]), ExternalId = ParseNullableString(row.Cells[i++]), Abschnittsnummer = TryParseNullableInt(row.Cells[i++], importResult), Strasseneigentuemer = TryParseEnum <EigentuemerTyp>(row.Cells[i++], importResult), Ortsbezeichnung = ParseNullableString(row.Cells[i++]), Belastungskategorie = TryGetBelastungskategorie(row.Cells[i++], importResult), Belag = TryParseEnum <BelagsTyp>(row.Cells[i++], importResult), BreiteFahrbahn = TryParseDecimal(row.Cells[i++], importResult), Laenge = TryParseDecimal(row.Cells[i++], importResult), Trottoir = TryParseEnum <TrottoirTyp>(row.Cells[i++], importResult), BreiteTrottoirLinks = TryParseNullableDecimal(row.Cells[i++], importResult), BreiteTrottoirRechts = TryParseNullableDecimal(row.Cells[i], importResult) }; return(model); }
protected ImportResultModel <TImportModel, TImportOverviewModel> GetImportResultModel <TImportModel, TImportOverviewModel>(XlsxImportResult <TImportModel> importResult, List <TImportModel> allImportModel, Func <TImportModel, TImportModel, bool> areEqual, Func <TImportModel, TImportModel, bool> isExternalIdEqual, List <string> warnings) where TImportModel : IExternalIdHolder { if (importResult.HasError) { return(new ImportResultModel <TImportModel, TImportOverviewModel>(importResult.ErrorList, warnings)); } var validator = validatorFactory.GetValidator <TImportModel>(); var errorList = new List <string>(); foreach (var modelInfo in importResult.ModelInfos) { ValidationResult validationResult = validator.Validate(modelInfo.Model); errorList.AddRange(validationResult.Errors.Select(e => e.ErrorMessage + string.Format(LocalizationService.GetLocalizedError(ValidationError.RowN), modelInfo.RowNumber))); } LogImportEreigniss(errorList.Count); if (errorList.Any()) { return(new ImportResultModel <TImportModel, TImportOverviewModel>(errorList, warnings)); } var resultModel = new ImportResultModel <TImportModel, TImportOverviewModel>(null, warnings); foreach (var importModel in importResult.ModelInfos.ToList()) { var model = importModel.Model; //case a ExtrnalID matches -> Update if ((allImportModel.FirstOrDefault(m => isExternalIdEqual(m, model))) != null) { model.Id = allImportModel.FirstOrDefault(m => isExternalIdEqual(m, model)).Id; resultModel.UpdateImportModels.Add(model); resultModel.UpdateImportOverviewModels.Add(Translate <TImportModel, TImportOverviewModel>(model)); } else { var firstOrDefaultImprotModel = allImportModel.FirstOrDefault(m => areEqual(m, model)); //we found an entity with if (firstOrDefaultImprotModel != null) { if (string.IsNullOrEmpty(model.ExternalId) || string.IsNullOrEmpty(firstOrDefaultImprotModel.ExternalId)) { model.Id = firstOrDefaultImprotModel.Id; resultModel.UpdateImportModels.Add(model); resultModel.UpdateImportOverviewModels.Add( Translate <TImportModel, TImportOverviewModel>(model)); } //non of the ExternalIds is null but they are not qual B/2 case -> error else { errorList.Add( string.Format( LocalizationService.GetLocalizedError(ValidationError.NonMatchingExternalId), importModel.RowNumber)); } } //we cannot find it by enternalid or by natural key case C -> create else { allImportModel.Add(model); resultModel.CreateImportModels.Add(model); resultModel.CreateImportOverviewModels.Add(Translate <TImportModel, TImportOverviewModel>(model)); } } } if (errorList.Any()) { return(new ImportResultModel <TImportModel, TImportOverviewModel>(errorList, warnings)); } return(resultModel); }