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);
        }
Exemple #3
0
        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);
        }