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