private void EnsureJahrInPoLists(JahresInterval jahresInterval)
 {
     if (!diagramPos.ContainsKey(jahresInterval.JahrBis))
     {
         diagramPos[jahresInterval.JahrBis] = new List <DiagramPo>();
     }
     if (!tablePos.ContainsKey(jahresInterval.JahrBis))
     {
         tablePos[jahresInterval.JahrBis] = new List <TablePo>();
     }
 }
 private DiagramPo CreateDiagramPo(ZustandsindexTyp z, JahresInterval jahresInterval)
 {
     return(new DiagramPo
     {
         ZustandsindexTyp = z,
         ZustandsindexTypBezeichnung = LocalizationService.GetLocalizedEnum(z),
         ColorCode = z.ToColorCode(),
         JahrVon = jahresInterval.JahrVon,
         JahrBis = jahresInterval.JahrBis
     });
 }
        private void CalculateTablePos(JahresInterval jahresInterval,
                                       RealisiertenMassnahmenWertverlustZustandsindexProJahrGrafischeDiagramPo diagramPo)
        {
            var currentJahr = ErfassungsPeriodService.GetCurrentErfassungsPeriod().Erfassungsjahr.Year;

            tablePos[jahresInterval.JahrBis].Add(new TablePo
            {
                CurrentJahr  = currentJahr,
                AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
                JahrVon      = jahresInterval.JahrVon,
                JahrBis      = jahresInterval.JahrBis,
                Value        = diagramPo.RealisierteMassnahmen,
                Bezeichnung  = reportLocalizationService.RealisiertenMassnahmen,
                FormatString = FormatStrings.ReportNoDecimalFormat,
                ColorCode    = "#800080",
                LegendUrl    = reportLegendImageService.GetLegendUrl("RM"),
                SortOrder    = 10
            });


            tablePos[jahresInterval.JahrBis].Add(new TablePo
            {
                CurrentJahr  = currentJahr,
                AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
                JahrVon      = jahresInterval.JahrVon,
                JahrBis      = jahresInterval.JahrBis,
                Value        = diagramPo.WertVerlust,
                Bezeichnung  = reportLocalizationService.WV,
                FormatString = FormatStrings.ReportNoDecimalFormat,
                ColorCode    = "#6495ED",
                LegendUrl    = reportLegendImageService.GetLegendUrl("RWV"),
                SortOrder    = 10
            });

            tablePos[jahresInterval.JahrBis].Add(new TablePo
            {
                CurrentJahr  = currentJahr,
                AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
                JahrVon      = jahresInterval.JahrVon,
                JahrBis      = jahresInterval.JahrBis,
                Value        = diagramPo.MittlererZustandindex,
                Bezeichnung  = reportLocalizationService.MittlererZustandsindex,
                ColorCode    = "#FF0000",
                FormatString = FormatStrings.ReportShortDecimalFormat,
                LegendUrl    = reportLegendImageService.GetLegendUrl("Mittlerer"),
                SortOrder    = 20
            });
        }
 private TablePo CreateTablePo(JahresInterval jahresInterval, decimal?decimalValue, Func <decimal?, string> format, string zustandsindexTypBezeichnung, int sortOrder, int currentYear, ZustandsindexTyp zustandsindexTyp = ZustandsindexTyp.Unbekannt)
 {
     return(new TablePo
     {
         CurrentJahr = currentYear,
         AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
         JahrVon = jahresInterval.JahrVon,
         JahrBis = jahresInterval.JahrBis,
         DecimalValue = decimalValue,
         Format = format,
         ZustandsindexTyp = zustandsindexTyp,
         ZustandsindexTypBezeichnung = zustandsindexTypBezeichnung,
         SortOrder = sortOrder,
         LegendImageUrl = reportLegendImageService.GetLegendUrlForEnum(zustandsindexTyp)
     });
 }
        private void CalculatePosForKenngroessenFruehererJahre(ErfassungsPeriod erfassungsPeriod,
                                                               KenngroessenFruehererJahre kenngroessenFruehererJahre,
                                                               JahresInterval jahresInterval)
        {
            var diagramPo = new RealisiertenMassnahmenWertverlustZustandsindexProJahrGrafischeDiagramPo()
            {
                JahrVon               = jahresInterval.JahrVon,
                JahrBis               = jahresInterval.JahrBis,
                WertVerlust           = kenngroessenFruehererJahre.KenngroesseFruehereJahrDetails.Sum(d => (GetWiederbeschaffungswert(d, wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod)) * wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod).AlterungsbeiwertII / 100) / 1000m),
                MittlererZustandindex = kenngroessenFruehererJahre.KenngroesseFruehereJahrDetails.Average(d => d.MittlererZustand) ?? 0,
                RealisierteMassnahmen = kenngroessenFruehererJahre.KostenFuerWerterhaltung / 1000m
            };

            EnsureJahrInPoLists(jahresInterval);
            diagramPos[jahresInterval.JahrBis].Add(diagramPo);
            CalculateTablePos(jahresInterval, diagramPo);
        }
        private void CalculatePosForErfassungsPeriod <TZustandsabschnittBase, TStrassenabschnittBase>(TZustandsabschnittBase[] zustandsabschnittList, JahresInterval jahresInterval, ErfassungsPeriod erfassungsPeriod)
            where TStrassenabschnittBase : StrassenabschnittBase
            where TZustandsabschnittBase : ZustandsabschnittBase
        {
            var zustandsspiegelProJahrGrafischeDiagramPos = Enum.GetValues(typeof(ZustandsindexTyp))
                                                            .OfType <ZustandsindexTyp>()
                                                            .Where(z => z != ZustandsindexTyp.Unbekannt)
                                                            .Select(z => CreateDiagramPo(z, jahresInterval))
                                                            .ToDictionary(po => po.ZustandsindexTyp, po => po);

            decimal totalUnknowZustandsindexTypFlaeche = 0;

            decimal mittlereZustandsindexWithFlaeche = 0;
            decimal mittlererAufnahmedatumTickMultipliedWithFlaeche = 0;

            foreach (var zustandsabschnitt in zustandsabschnittList)
            {
                var zustandsindexTyp = ZustandsindexCalculator.GetTyp(zustandsabschnitt.Zustandsindex);
                zustandsspiegelProJahrGrafischeDiagramPos[zustandsindexTyp].FlaecheFahrbahn += (zustandsabschnitt.FlaecheFahrbahn ?? 0);
                mittlereZustandsindexWithFlaeche += zustandsabschnitt.Zustandsindex * (zustandsabschnitt.FlaecheFahrbahn ?? 0);

                mittlererAufnahmedatumTickMultipliedWithFlaeche += zustandsabschnitt.Aufnahmedatum.Ticks * (zustandsabschnitt.FlaecheFahrbahn ?? 0);
            }

            var currentJahr = ErfassungsPeriodService.GetCurrentErfassungsPeriod().Erfassungsjahr.Year;

            diagramPos[jahresInterval.JahrBis] = zustandsspiegelProJahrGrafischeDiagramPos.Values.ToList();

            var totalKnownZustandsindexTypFlaeche = zustandsspiegelProJahrGrafischeDiagramPos.Values.Sum(po => po.FlaecheFahrbahn);
            var totalFlaeche = totalKnownZustandsindexTypFlaeche + totalUnknowZustandsindexTypFlaeche;

            var totalStrasseFlaeche = transactionScopeProvider.Queryable <TStrassenabschnittBase>()
                                      .Where(z => z.ErfassungsPeriod == erfassungsPeriod)
                                      .Sum(g => g.Laenge * g.BreiteFahrbahn);

            var zustandsspiegelProJahrGrafischeTablePos = zustandsspiegelProJahrGrafischeDiagramPos.Values
                                                          .Select(po => CreateTablePo(jahresInterval, GetPerzent(po.FlaecheFahrbahn, totalKnownZustandsindexTypFlaeche), FormatHelper.ToReportNoDecimalPercentString, LocalizationService.GetLocalizedEnum(po.ZustandsindexTyp), (int)po.ZustandsindexTyp, currentJahr, po.ZustandsindexTyp));

            tablePos[jahresInterval.JahrBis] = zustandsspiegelProJahrGrafischeTablePos.ToList();

            PercentPartitioningCorrector.Corrigate(tablePos[jahresInterval.JahrBis].Cast <IPercentHolder>().ToList());

            var mittlererAufnahmedatum = (mittlererAufnahmedatumTickMultipliedWithFlaeche == 0 || totalFlaeche == 0) ? (decimal?)null : (decimal.Divide(mittlererAufnahmedatumTickMultipliedWithFlaeche, totalFlaeche));

            tablePos[jahresInterval.JahrBis].Add(CreateTablePo(jahresInterval, mittlererAufnahmedatum, d => FormatHelper.ToReportDateTimeString(d, "-"), reportLocalizationService.MittleresAlterDerZustandsaufnahmen, -10, currentJahr));

            var netzAnteil = GetPerzent(totalKnownZustandsindexTypFlaeche, totalStrasseFlaeche);

            tablePos[jahresInterval.JahrBis].Add(CreateTablePo(jahresInterval, netzAnteil, FormatHelper.ToReportNoDecimalPercentString, reportLocalizationService.NetzAnteil, -20, currentJahr));

            var mittlererZustandsindex = (mittlereZustandsindexWithFlaeche == 0 || totalFlaeche == 0) ? 0 : decimal.Divide(mittlereZustandsindexWithFlaeche, totalFlaeche);

            tablePos[jahresInterval.JahrBis].Add(CreateTablePo(jahresInterval, mittlererZustandsindex, FormatHelper.ToReportDecimalString, reportLocalizationService.MittlererZustandsindex, -30, currentJahr));
        }
 private DiagramPo CreateWiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPo(Belastungskategorie belastungskategorie, JahresInterval jahresInterval)
 {
     return(new DiagramPo
     {
         ColorCode = belastungskategorie.ColorCode,
         JahrVon = jahresInterval.JahrVon,
         JahrBis = jahresInterval.JahrBis,
         BelastungskategorieId = belastungskategorie.Id,
         BelastungskategorieBezeichnung = LocalizationService.GetLocalizedBelastungskategorieTyp(belastungskategorie.Typ),
         BelastungskategorieReihenfolge = belastungskategorie.Reihenfolge,
         BelastungskategorieTyp = belastungskategorie.Typ
     });
 }
 private Dictionary <Guid, DiagramPo> GetWiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos(JahresInterval jahresInterval)
 {
     return(belastungskategorieService.AlleBelastungskategorie
            .Select(bk => CreateWiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPo(bk, jahresInterval))
            .ToDictionary(po => po.BelastungskategorieId, po => po));
 }
        private void CalculatePosForJahr <T>(ErfassungsPeriod erfassungsPeriod, List <T> entityList, JahresInterval jahresInterval,
                                             Func <T, WiederbeschaffungswertKatalogModel, decimal> getWiederBeschaffungswert,
                                             Func <T, Belastungskategorie> getBelastungskategorie,
                                             Func <T, decimal> getFlaeche)
        {
            if (!diagramPos.ContainsKey(jahresInterval.JahrBis))
            {
                diagramPos[jahresInterval.JahrBis] = new List <DiagramPo>();
            }
            if (!tablePos.ContainsKey(jahresInterval.JahrBis))
            {
                tablePos[jahresInterval.JahrBis] = new List <TablePo>();
            }

            var wiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos = GetWiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos(jahresInterval);

            foreach (var netzSummarischDetail in entityList)
            {
                var belastungskategorie = getBelastungskategorie(netzSummarischDetail);
                var wieder = wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(belastungskategorie, erfassungsPeriod);
                var wiederbeschaffungswert = getWiederBeschaffungswert(netzSummarischDetail, wieder);

                var diagramPo = wiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos[belastungskategorie.Id];
                //Note: divided by 1 000 (1000m2)
                diagramPo.FlaecheFahrbahn += getFlaeche(netzSummarischDetail) / 1000m;
                //Note: divided by 1 000 000 (Mio. CHF) infro from sample excel
                diagramPo.WiederBeschaffungsWert += wiederbeschaffungswert / 1000000m;
                //Note: divided by 1 000 (kCHF)
                diagramPo.WertVerlust += (wiederbeschaffungswert * wieder.AlterungsbeiwertII / 100) / 1000;
            }

            diagramPos[jahresInterval.JahrBis].AddRange(wiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos.Values);
            var currentJahr = ErfassungsPeriodService.GetCurrentErfassungsPeriod().Erfassungsjahr.Year;
            var wiederbeschaffungswertUndWertverlustProJahrGrafischeTablePos
                = wiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos.Values
                  .Select(po => new TablePo
            {
                CurrentJahr  = currentJahr,
                AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
                JahrVon      = jahresInterval.JahrVon,
                JahrBis      = jahresInterval.JahrBis,
                Value        = po.FlaecheFahrbahn,
                Bezeichnung  = po.BelastungskategorieBezeichnung + " " + reportLocalizationService.TausendQuadratMeter,
                ColorCode    = po.ColorCode,
                LegendUrl    = reportLegendImageService.GetLegendUrl(po.BelastungskategorieTyp),
                SortOrder    = belastungskategorieService.AlleBelastungskategorie.IndexOf(belastungskategorieService.AlleBelastungskategorie.Single(bk => bk.Id == po.BelastungskategorieId))
            });

            tablePos[jahresInterval.JahrBis].AddRange(wiederbeschaffungswertUndWertverlustProJahrGrafischeTablePos);

            tablePos[jahresInterval.JahrBis].Add(new TablePo
            {
                CurrentJahr  = currentJahr,
                AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
                JahrVon      = jahresInterval.JahrVon,
                JahrBis      = jahresInterval.JahrBis,
                Value        = wiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos.Values.Sum(po => po.FlaecheFahrbahn),
                Bezeichnung  = reportLocalizationService.GesamtFlaeche,
                SortOrder    = 10
            });

            tablePos[jahresInterval.JahrBis].Add(new TablePo
            {
                CurrentJahr  = currentJahr,
                AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
                JahrVon      = jahresInterval.JahrVon,
                JahrBis      = jahresInterval.JahrBis,
                Value        = wiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos.Values.Sum(po => po.WertVerlust),
                Bezeichnung  = reportLocalizationService.WV,
                ColorCode    = "#8b0000",
                LegendUrl    = reportLegendImageService.GetLegendUrl("WV"),
                SortOrder    = 20
            });

            tablePos[jahresInterval.JahrBis].Add(new TablePo
            {
                CurrentJahr  = currentJahr,
                AktualString = LocalizationService.GetLocalizedText("CurrentShort"),
                JahrVon      = jahresInterval.JahrVon,
                JahrBis      = jahresInterval.JahrBis,
                Value        = wiederbeschaffungswertUndWertverlustProJahrGrafischeDiagramPos.Values.Sum(po => po.WiederBeschaffungsWert),
                Bezeichnung  = reportLocalizationService.WBW,
                LegendUrl    = reportLegendImageService.GetLegendUrl("WBW"),
                ColorCode    = "#cd48ff",
                SortOrder    = 30
            });
        }
 private void CalculatePosForKenngroessenFruehererJahre(ErfassungsPeriod erfassungsPeriod, KenngroessenFruehererJahre kenngroessenFruehererJahre, JahresInterval jahresInterval)
 {
     CalculatePosForJahr(erfassungsPeriod, kenngroessenFruehererJahre.KenngroesseFruehereJahrDetails.ToList(), jahresInterval, GetWiederbeschaffungswert, kgfjd => kgfjd.Belastungskategorie, kfjd => kfjd.Fahrbahnflaeche);
 }
 private void CalculatePosForSummarischeModus(ErfassungsPeriod erfassungsPeriod, List <NetzSummarischDetail> netzSummarischDetailList, JahresInterval jahresInterval)
 {
     CalculatePosForJahr(erfassungsPeriod, netzSummarischDetailList, jahresInterval, GetWiederbeschaffungswert, nsd => nsd.Belastungskategorie, nsd => nsd.Fahrbahnflaeche);
 }
        private void CalculatePosForStrassenModus <T>(ErfassungsPeriod erfassungsPeriod, IQueryable <T> queryable, Parameter parameter, JahresInterval jahresInterval)
            where T : StrassenabschnittBase
        {
            var strassenabschnittList = filtererFactory
                                        .CreateFilterer <T>(parameter)
                                        .Filter(queryable)
                                        .Fetch(sa => sa.Belastungskategorie)
                                        .ToList();

            CalculatePosForJahr(erfassungsPeriod, strassenabschnittList, jahresInterval, GetWiederbeschaffungswert, sa => sa.Belastungskategorie, sa => sa.FlaecheFahrbahn);
        }
        private void CalculatePosForSummarischeModus(ErfassungsPeriod erfassungsPeriod, JahresInterval jahresInterval)
        {
            var netzSummarischDetailList = netzSummarischDetailService.GetEntitiesBy(erfassungsPeriod).Fetch(nsd => nsd.Belastungskategorie).ToList();

            var diagramPo = new RealisiertenMassnahmenWertverlustZustandsindexProJahrGrafischeDiagramPo()
            {
                JahrVon               = jahresInterval.JahrVon,
                JahrBis               = jahresInterval.JahrBis,
                WertVerlust           = netzSummarischDetailList.Sum(d => (GetWiederbeschaffungswert(d, wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod)) * wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod).AlterungsbeiwertII / 100) / 1000m),
                MittlererZustandindex = netzSummarischDetailList.Average(d => d.MittlererZustand),
                RealisierteMassnahmen = (transactionScopeProvider.Queryable <RealisierteMassnahmeSummarsich>().Where(r => r.ErfassungsPeriod == erfassungsPeriod).Sum(s => s.KostenFahrbahn) ?? 0) / 1000m
            };

            EnsureJahrInPoLists(jahresInterval);
            diagramPos[jahresInterval.JahrBis].Add(diagramPo);
            CalculateTablePos(jahresInterval, diagramPo);
        }
        private void CalculatePosForStrassenModusGIS(ErfassungsPeriod erfassungsPeriod, RealisiertenMassnahmenWertverlustZustandsindexProJahrGrafischeParameter parameter, JahresInterval jahresInterval)
        {
            var strassenabschnittList = filtererFactory
                                        .CreateFilterer <StrassenabschnittGIS>(parameter)
                                        .Filter(transactionScopeProvider.Queryable <StrassenabschnittGIS>().Fetch(s => s.Belastungskategorie)
                                                .Where(e => e.ErfassungsPeriod == erfassungsPeriod))
                                        .Select(s =>
                                                new StrasenabschnittGISReportPO
            {
                Id                   = s.Id,
                Trottoir             = s.Trottoir,
                Laenge               = s.Laenge,
                BreiteFahrbahn       = s.BreiteFahrbahn,
                BreiteTrottoirLinks  = s.BreiteTrottoirLinks,
                BreiteTrottoirRechts = s.BreiteTrottoirRechts,
                Belastungskategorie  = s.Belastungskategorie
            })
                                        .ToList();
            IEnumerable <Guid> strabsIds = strassenabschnittList.Select(i => i.Id).ToArray();
            var zustandabscnitten        = transactionScopeProvider.Queryable <ZustandsabschnittGIS>()
                                           .Where(z => strabsIds.Contains(z.StrassenabschnittGIS.Id))
                                           .Select(s => new
            {
                s.Laenge,
                s.StrassenabschnittGIS.BreiteFahrbahn,
                s.Zustandsindex
            })
                                           .ToArray();

            var diagramPo = new RealisiertenMassnahmenWertverlustZustandsindexProJahrGrafischeDiagramPo()
            {
                JahrVon               = jahresInterval.JahrVon,
                JahrBis               = jahresInterval.JahrBis,
                WertVerlust           = strassenabschnittList.Sum(d => (GetWiederbeschaffungswert(d, wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod)) * wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod).AlterungsbeiwertII / 100) / 1000m),
                MittlererZustandindex = SafeDevide(zustandabscnitten.Sum(d => (d.Laenge * d.BreiteFahrbahn) * d.Zustandsindex), zustandabscnitten.Sum(z => z.Laenge * z.BreiteFahrbahn)),
                RealisierteMassnahmen = (transactionScopeProvider.Queryable <RealisierteMassnahmeGIS>().Where(r => r.ErfassungsPeriod == erfassungsPeriod).ToArray().Sum(s => (s.KostenFahrbahn ?? 0) + (s.KostenTrottoirLinks ?? 0) + (s.KostenTrottoirRechts ?? 0))) / 1000m
            };

            EnsureJahrInPoLists(jahresInterval);
            diagramPos[jahresInterval.JahrBis].Add(diagramPo);
            CalculateTablePos(jahresInterval, diagramPo);
        }
        private void CalculatePosForStrassenModus(ErfassungsPeriod erfassungsPeriod, RealisiertenMassnahmenWertverlustZustandsindexProJahrGrafischeParameter parameter, JahresInterval jahresInterval)
        {
            var strassenabschnittList = filtererFactory
                                        .CreateFilterer <Strassenabschnitt>(parameter)
                                        .Filter(transactionScopeProvider.Queryable <Strassenabschnitt>()
                                                .Where(e => e.ErfassungsPeriod == erfassungsPeriod))
                                        .Fetch(sa => sa.Belastungskategorie)
                                        .FetchMany(sa => sa.Zustandsabschnitten)
                                        .ToList();

            var diagramPo = new RealisiertenMassnahmenWertverlustZustandsindexProJahrGrafischeDiagramPo()
            {
                JahrVon               = jahresInterval.JahrVon,
                JahrBis               = jahresInterval.JahrBis,
                WertVerlust           = strassenabschnittList.Sum(d => (GetWiederbeschaffungswert(d, wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod)) * wiederbeschaffungswertKatalogService.GetWiederbeschaffungswertKatalogModel(d.Belastungskategorie, erfassungsPeriod).AlterungsbeiwertII / 100) / 1000m),
                MittlererZustandindex = SafeDevide(strassenabschnittList.SelectMany(s => s.Zustandsabschnitten).Sum(d => (d.FlaecheFahrbahn ?? 0) * d.Zustandsindex), strassenabschnittList.SelectMany(s => s.Zustandsabschnitten).Sum(z => z.FlaecheFahrbahn) ?? 0m),
                RealisierteMassnahmen = (transactionScopeProvider.Queryable <RealisierteMassnahme>().Where(r => r.ErfassungsPeriod == erfassungsPeriod).ToArray().Sum(s => (s.KostenFahrbahn ?? 0) + (s.KostenTrottoirLinks ?? 0) + (s.KostenTrottoirRechts ?? 0))) / 1000m
            };

            EnsureJahrInPoLists(jahresInterval);
            diagramPos[jahresInterval.JahrBis].Add(diagramPo);
            CalculateTablePos(jahresInterval, diagramPo);
        }