Example #1
0
 public DetailInfo(string ico, KIndexData.Annual data, KIndexParts part)
 {
     this.AnnualData = data;
     this.Part       = part;
     this.Ico        = ico;
     Init();
 }
Example #2
0
 private KIndexData CalculateSourceData(bool forceCalculateAllYears)
 {
     this.InitData();
     foreach (var year in Consts.CalculationYears)
     {
         KIndexData.Annual data_rok = CalculateForYear(year, forceCalculateAllYears);
         kindex.roky.Add(data_rok);
     }
     return(kindex);
 }
        public static string KIndexCommentForPart(KIndexParts part, KIndexData.Annual data, bool html = false)
        {
            var txt = data.Info(part).ShortComment;

            if (html)
            {
                return(txt);
            }
            else
            {
                return(Devmasters.TextUtil.RemoveHTML(txt));
            }
        }
Example #4
0
        public KIndexData.Annual FinalCalculationKIdx(KIndexData.Annual ret, bool forceCalculateAllYears)
        {
            decimal smlouvyZaRok = (decimal)urad.StatistikaRegistruSmluv()[ret.Rok].PocetSmluv;

            CalculateKIndex(ret);

            if (
                ret.Statistika.PocetSmluvSeSoukromymSubj >= Consts.MinSmluvPerYear
                ||
                ret.Statistika.CelkovaHodnotaSmluvSeSoukrSubj >= Consts.MinSumSmluvPerYear
                ||
                (ret.Statistika.CelkovaHodnotaSmluvSeSoukrSubj + ret.Statistika.PrumernaHodnotaSmluvSeSoukrSubj * ret.Statistika.PocetSmluvBezCenySeSoukrSubj) >= Consts.MinSumSmluvPerYear
                )
            {
                ret.KIndexReady  = true;
                ret.KIndexIssues = null;
            }
            else if (Firmy.Get(this.Ico).MusiPublikovatDoRS() == false)
            {
                if (forceCalculateAllYears == false)
                {
                    ret.KIndexReady  = false;
                    ret.KIndexIssues = new string[] { $"K-Index spočítán, ale organizace ze zákona nemusí do registru smluv publikovat. Publikuje pouze dobrovolně, proto K-Index nezveřejňujeme." };
                }
                else
                {
                    ret.KIndexReady  = true;
                    ret.KIndexIssues = new string[] { $"Organizace ze zákona nemusí do registru smluv publikovat. Publikuje pouze dobrovolně, nad rámec zákona." };
                }
            }
            else
            {
                if (forceCalculateAllYears == false)
                {
                    ret.KIndexReady  = false;
                    ret.KIndexIssues = new string[] { $"K-Index nespočítán. Méně než {Consts.MinSmluvPerYear} smluv za rok nebo malý objem smluv." };
                }
                else
                {
                    ret.KIndexReady  = true;
                    ret.KIndexIssues = new string[] { $"Organizace má méně smluv nebo objem smluv než určuje metodika. Pro výpočet a publikaci byla aplikována výjimka." };
                }
            }


            ret.LastUpdated = DateTime.Now;

            return(ret);
        }
Example #5
0
        public KIndexData.Annual FinalCalculationKIdx(KIndexData.Annual ret, bool forceCalculateAllYears)
        {
            decimal smlouvyZaRok = (decimal)urad.StatistikaRegistruSmluv()[ret.Rok].PocetSmluv;

            CalculateKIndex(ret);

            if (
                ret.Statistika.PocetSmluvSeSoukromymSubj >= Consts.MinSmluvPerYear
                ||
                ret.Statistika.CelkovaHodnotaSmluvSeSoukrSubj >= Consts.MinSumSmluvPerYear
                ||
                (ret.Statistika.CelkovaHodnotaSmluvSeSoukrSubj + ret.Statistika.PrumernaHodnotaSmluvSeSoukrSubj * ret.Statistika.PocetSmluvBezCenySeSoukrSubj) >= Consts.MinSumSmluvPerYear
                )
            {
                ret.KIndexReady  = true;
                ret.KIndexIssues = null;
            }
            else
            {
                if (forceCalculateAllYears == false)
                {
                    ret.KIndexReady  = false;
                    ret.KIndexIssues = new string[] { $"K-Index nespočítán. Méně než {Consts.MinSmluvPerYear} smluv za rok nebo malý objem smluv." };
                }
                else
                {
                    ret.KIndexReady  = true;
                    ret.KIndexIssues = new string[] { $"Organizace má méně smluv nebo objem smluv než určuje metodika. Pro výpočet a publikaci byla aplikována výjimka." };
                }
            }


            ret.LastUpdated = DateTime.Now;

            return(ret);
        }
Example #6
0
            public static string SmlouvyQueryForPart(string ico, KIndexData.KIndexParts part, KIndexData.Annual annual, string oborName = null)
            {
                string q = "";

                if (annual is null)
                {
                    return(null);
                }
                string baseQ = $"ico:{ico} AND datumUzavreni:[{annual.Rok}-01-01 TO {annual.Rok + 1}-01-01}}";

                switch (part)
                {
                case KIndexParts.PercentBezCeny:
                    return(baseQ + " AND " + "cena:0");

                case KIndexParts.PercSeZasadnimNedostatkem:
                    return(baseQ + " AND " + "chyby:zasadni");

                case KIndexParts.PercSmlouvySPolitickyAngazovanouFirmou:
                    return(baseQ + " AND " + "hint.smlouvaSPolitickyAngazovanymSubjektem:>0");

                case KIndexParts.CelkovaKoncentraceDodavatelu:
                    q = annual?.CelkovaKoncentraceDodavatelu?.Query ?? "";
                    if (!string.IsNullOrEmpty(q))
                    {
                        return(" hint.vztahSeSoukromymSubjektem:>0 AND " + q);
                    }
                    return(q);

                case KIndexParts.KoncentraceDodavateluBezUvedeneCeny:
                    q = annual?.KoncentraceDodavateluBezUvedeneCeny?.Query ?? "";
                    if (!string.IsNullOrEmpty(q))
                    {
                        return(" hint.vztahSeSoukromymSubjektem:>0 AND " + q);
                    }
                    return(q);

                case KIndexParts.KoncentraceDodavateluObory:
                    q = annual?.KoncetraceDodavateluObory.FirstOrDefault(m => m.OborName == oborName)?.Koncentrace?.Query ?? "";
                    if (!string.IsNullOrEmpty(q))
                    {
                        return(" hint.vztahSeSoukromymSubjektem:>0 AND " + q);
                    }
                    return(q);

                case KIndexParts.KoncentraceDodavateluCenyULimitu:
                    q = annual?.KoncentraceDodavateluCenyULimitu?.Query ?? "";
                    if (!string.IsNullOrEmpty(q))
                    {
                        return(" hint.vztahSeSoukromymSubjektem:>0 AND " + q);
                    }
                    return(q);

                case KIndexParts.PercSmluvUlimitu:
                    return(baseQ + " AND " + "hint.smlouvaULimitu:>0");

                case KIndexParts.PercNovaFirmaDodavatel:
                    return(baseQ + "  AND " + "( hint.pocetDniOdZalozeniFirmy:>-50 AND hint.pocetDniOdZalozeniFirmy:<30 )");

                case KIndexParts.PercUzavrenoOVikendu:
                    return(baseQ + "  AND " + "hint.denUzavreni:>0");

                case KIndexParts.PercSmlouvyPod50kBonus:
                    return(baseQ + "  AND " + " cena:>0 AND cena:<50000");

                default:
                    return(baseQ);
                }
            }
Example #7
0
        //todo: dalo by se ještě refaktorovat, aby se vše bralo ze statistiky
        private KIndexData.Annual CalculateForYear(int year, bool forceCalculateAllYears)
        {
            decimal smlouvyZaRok = (decimal)urad.StatistikaRegistruSmluv()[year].PocetSmluv;

            KIndexData.Annual ret = new KIndexData.Annual(year);
            var fc = new FinanceDataCalculator(this.Ico, year);

            ret.FinancniUdaje = fc.GetData();

            //tohle by se dalo brát ze statistiky komplet...
            ret.PercSeZasadnimNedostatkem = smlouvyZaRok == 0 ? 0m : (decimal)_calc_Stat[year].PocetSmluvSeZasadnimNedostatkem / smlouvyZaRok;
            ret.PercSmlouvySPolitickyAngazovanouFirmou = _calc_Stat[year].PercentSmluvPolitiky;  //this.urad.StatistikaRegistruSmluv()[year].PercentSmluvPolitiky;

            ret.PercNovaFirmaDodavatel = smlouvyZaRok == 0 ? 0m : (decimal)_calc_Stat[year].PocetSmluvNovaFirma / smlouvyZaRok;
            ret.PercSmluvUlimitu       = smlouvyZaRok == 0 ? 0m : (decimal)_calc_Stat[year].PocetSmluvULimitu / smlouvyZaRok;
            ret.PercUzavrenoOVikendu   = smlouvyZaRok == 0 ? 0m : (decimal)_calc_Stat[year].PocetSmluvOVikendu / smlouvyZaRok;

            var stat = this.urad.StatistikaRegistruSmluv()[year];

            //todo: tenhle objekt by mohl vycházet ze stávajícího nového objektu statistiky
            ret.Statistika = new KIndexData.StatistickeUdaje()
            {
                PocetSmluv                      = stat.PocetSmluv,
                CelkovaHodnotaSmluv             = stat.CelkovaHodnotaSmluv,
                PocetSmluvBezCeny               = stat.PocetSmluvBezCeny,
                PocetSmluvBezSmluvniStrany      = stat.PocetSmluvBezSmluvniStrany,
                PocetSmluvPolitiky              = stat.PocetSmluvPolitiky,
                PercentSmluvBezCeny             = stat.PercentSmluvBezCeny,
                PercentSmluvBezSmluvniStrany    = stat.PercentSmluvBezSmluvniStrany,
                PercentKcBezSmluvniStrany       = stat.PercentKcBezSmluvniStrany,
                PercentKcSmluvPolitiky          = stat.PercentKcSmluvPolitiky,
                PercentSmluvPolitiky            = stat.PercentSmluvPolitiky,
                SumKcSmluvBezSmluvniStrany      = stat.SumKcSmluvBezSmluvniStrany,
                SumKcSmluvPolitiky              = stat.SumKcSmluvPolitiky,
                PocetSmluvULimitu               = stat.PocetSmluvULimitu,
                PocetSmluvOVikendu              = stat.PocetSmluvOVikendu,
                PocetSmluvSeZasadnimNedostatkem = stat.PocetSmluvSeZasadnimNedostatkem,
                PocetSmluvNovaFirma             = stat.PocetSmluvNovaFirma,
            };


            string queryPlatce = $"icoPlatce:{this.Ico} AND datumUzavreni:[{year}-01-01 TO {year + 1}-01-01}}";

            if (smlouvyZaRok >= minPocetSmluvKoncentraceDodavateluProZahajeniVypoctu)
            {
                IEnumerable <Calculator.SmlouvyForIndex> allSmlouvy = GetSmlouvy(queryPlatce);
                ret.Statistika.PocetSmluvSeSoukromymSubj      = allSmlouvy.Count();
                ret.Statistika.PocetSmluvBezCenySeSoukrSubj   = allSmlouvy.Where(m => m.HodnotaSmlouvy == 0).Count();
                ret.Statistika.CelkovaHodnotaSmluvSeSoukrSubj = allSmlouvy.Sum(m => m.HodnotaSmlouvy);
                if (allSmlouvy.Any(m => m.HodnotaSmlouvy > 0))
                {
                    ret.Statistika.PrumernaHodnotaSmluvSeSoukrSubj = allSmlouvy.Where(m => m.HodnotaSmlouvy > 0).Average(m => m.HodnotaSmlouvy);
                }
                else
                {
                    ret.Statistika.PrumernaHodnotaSmluvSeSoukrSubj = 0;
                }

                ret.CelkovaKoncentraceDodavatelu = KoncentraceDodavateluCalculator(allSmlouvy, queryPlatce, "Koncentrace soukromých dodavatelů");
                if (ret.CelkovaKoncentraceDodavatelu != null)
                {
                    if (ret.CelkovaKoncentraceDodavatelu != null)
                    {
                        //ma cenu koncentraci pocitat?
                        //musi byt vice ne 5 smluv a nebo jeden dodavatel musi mit vice nez 1/2 smluv a to vice nez 2
                        if (
                            (allSmlouvy.Where(m => m.HodnotaSmlouvy == 0).Count() > 0)
                            &&
                            (allSmlouvy.Where(m => m.HodnotaSmlouvy == 0).Count() > 5 ||
                             allSmlouvy.Where(m => m.HodnotaSmlouvy == 0)
                             .GroupBy(k => k.Dodavatel, v => v, (k, v) => v.Count())
                             .Max() > 2
                            )
                            )
                        {
                            ret.KoncentraceDodavateluBezUvedeneCeny
                                = KoncentraceDodavateluCalculator(allSmlouvy.Where(m => m.HodnotaSmlouvy == 0), queryPlatce + " AND cena:0",
                                                                  "Koncentrace soukromých dodavatelů u smluv s utajenou cenou",
                                                                  ret.Statistika.PrumernaHodnotaSmluvSeSoukrSubj, 2);

                            ret.KoncentraceDodavateluBezUvedeneCeny.Dodavatele = ret.KoncentraceDodavateluBezUvedeneCeny
                                                                                 .Dodavatele
                                                                                 //jde o smlouvy bez ceny, u souhrnu dodavatelu resetuj ceny na 0
                                                                                 .Select(m => new KoncentraceDodavateluIndexy.Souhrn()
                            {
                                HodnotaSmluv = 0, Ico = m.Ico, PocetSmluv = m.PocetSmluv, Poznamka = m.Poznamka
                            })
                                                                                 .ToArray();
                        }
                    }
                    if (ret.PercSmluvUlimitu > 0)
                    {
                        if (
                            (allSmlouvy.Where(m => m.ULimitu > 0).Count() > 0) &&
                            (
                                allSmlouvy.Where(m => m.ULimitu > 0).Count() > 5 ||
                                allSmlouvy.Where(m => m.ULimitu > 0)
                                .GroupBy(k => k.Dodavatel, v => v, (k, v) => v.Count())
                                .Max() > 2
                            )
                            )
                        {
                            ret.KoncentraceDodavateluCenyULimitu
                                = KoncentraceDodavateluCalculator(allSmlouvy.Where(m => m.ULimitu > 0), queryPlatce + " AND ( hint.smlouvaULimitu:>0 )",
                                                                  "Koncentrace soukromých dodavatelů u smluv s cenou u limitu veřejných zakázek",
                                                                  ret.Statistika.PrumernaHodnotaSmluvSeSoukrSubj, 3);
                        }
                    }
                    Dictionary <int, string> obory = Lib.Data.Smlouva.SClassification
                                                     .AllTypes
                                                     .Where(m => m.MainType)
                                                     .OrderBy(m => m.Value)
                                                     .ToDictionary(k => k.Value, v => v.SearchShortcut);

                    ret.KoncetraceDodavateluObory = new List <KoncentraceDodavateluObor>();

                    Devmasters.Batch.Manager.DoActionForAll <int>(obory.Keys,
                                                                  (oborid) =>
                    {
                        var queryPlatceObor = $"icoPlatce:{this.Ico} AND datumUzavreni:[{year}-01-01 TO {year + 1}-01-01}} AND oblast:{obory[oborid]}";
                        var allSmlouvyObory = allSmlouvy.Where(w => w.ContainsObor(oborid));
                        var k = KoncentraceDodavateluCalculator(allSmlouvyObory,
                                                                queryPlatceObor, "Koncentrace soukromých dodavatelů u oboru " + obory[oborid],
                                                                ret.Statistika.PrumernaHodnotaSmluvSeSoukrSubj);


                        //KoncentraceDodavateluIndexy kbezCeny = null;
                        lock (_koncetraceDodavateluOboryLock)
                        {
                            if (k != null)
                            {
                                ret.KoncetraceDodavateluObory.Add(new KoncentraceDodavateluObor()
                                {
                                    OborId      = oborid,
                                    OborName    = obory[oborid],
                                    Koncentrace = k,
                                    SmluvBezCenyMalusKoeficient = k.PocetSmluvProVypocet == 0 ?
                                                                  1 : (1m + (decimal)k.PocetSmluvBezCenyProVypocet / (decimal)k.PocetSmluvProVypocet)
                                                                  //KoncentraceBezUvedeneCeny = kbezCeny
                                });
                            }
                            ;
                        }
                        return(new Devmasters.Batch.ActionOutputData());
                    }, null, null, !System.Diagnostics.Debugger.IsAttached, maxDegreeOfParallelism: 10     //
                                                                  );
                } // if (ret.CelkovaKoncentraceDodavatelu != null)
            }
            ret.TotalAveragePercSmlouvyPod50k = TotalAveragePercSmlouvyPod50k(ret.Rok);

            ret.PercSmlouvyPod50k      = AveragePercSmlouvyPod50k(this.Ico, ret.Rok, ret.Statistika.PocetSmluv);
            ret.PercSmlouvyPod50kBonus = SmlouvyPod50kBonus(ret.PercSmlouvyPod50k, ret.TotalAveragePercSmlouvyPod50k);


            ret = FinalCalculationKIdx(ret, forceCalculateAllYears);

            return(ret);
        }
Example #8
0
        public void CalculateKIndex(KIndexData.Annual datayear)
        {
            KIndexData.VypocetDetail vypocet = new KIndexData.VypocetDetail();
            var vradky = new List <KIndexData.VypocetDetail.Radek>();


            decimal val =
                //r5
                datayear.Statistika.PercentSmluvBezCeny * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercentBezCeny); //=10   C > 1  F > 2,5

            vradky.Add(new KIndexData.VypocetDetail.Radek(
                           KIndexData.KIndexParts.PercentBezCeny,
                           datayear.Statistika.PercentSmluvBezCeny,
                           KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercentBezCeny))
                       );

            //r11
            val += datayear.PercSeZasadnimNedostatkem * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSeZasadnimNedostatkem);  //=20
            vradky.Add(new KIndexData.VypocetDetail.Radek(
                           KIndexData.KIndexParts.PercSeZasadnimNedostatkem,
                           datayear.PercSeZasadnimNedostatkem,
                           KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSeZasadnimNedostatkem))
                       );


            //r13
            val += datayear.CelkovaKoncentraceDodavatelu?.Herfindahl_Hirschman_Modified * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.CelkovaKoncentraceDodavatelu) ?? 0; //=40
            vradky.Add(new KIndexData.VypocetDetail.Radek(
                           KIndexData.KIndexParts.CelkovaKoncentraceDodavatelu,
                           datayear.CelkovaKoncentraceDodavatelu?.Herfindahl_Hirschman_Modified ?? 0,
                           KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.CelkovaKoncentraceDodavatelu))
                       );


            //r15
            decimal r15koef = 1;

            if (datayear.Statistika.PercentSmluvBezCeny < 0.05m)
            {
                r15koef = 2m;
            }
            decimal r15val = datayear.KoncentraceDodavateluBezUvedeneCeny?.Herfindahl_Hirschman_Modified ?? 0;

            r15val = r15val / r15koef;

            val += r15val * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.KoncentraceDodavateluBezUvedeneCeny); //60
            vradky.Add(new KIndexData.VypocetDetail.Radek(
                           KIndexData.KIndexParts.KoncentraceDodavateluBezUvedeneCeny,
                           r15val,
                           KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.KoncentraceDodavateluBezUvedeneCeny))
                       );

            //r17
            val += datayear.PercSmluvUlimitu * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSmluvUlimitu);  //70
            vradky.Add(new KIndexData.VypocetDetail.Radek(
                           KIndexData.KIndexParts.PercSmluvUlimitu,
                           datayear.PercSmluvUlimitu,
                           KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSmluvUlimitu))
                       );

            //r18
            val += datayear.KoncentraceDodavateluCenyULimitu?.Herfindahl_Hirschman_Modified * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.KoncentraceDodavateluCenyULimitu) ?? 0; //80
            vradky.Add(
                new KIndexData.VypocetDetail.Radek(
                    KIndexData.KIndexParts.KoncentraceDodavateluCenyULimitu,
                    datayear.KoncentraceDodavateluCenyULimitu?.Herfindahl_Hirschman_Modified ?? 0,
                    KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.KoncentraceDodavateluCenyULimitu))
                );

            //r19
            val += datayear.PercNovaFirmaDodavatel * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercNovaFirmaDodavatel); //82
            vradky.Add(
                new KIndexData.VypocetDetail.Radek(KIndexData.KIndexParts.PercNovaFirmaDodavatel, datayear.PercNovaFirmaDodavatel, KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercNovaFirmaDodavatel))
                );


            //r21
            val += datayear.PercUzavrenoOVikendu * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercUzavrenoOVikendu); //84
            vradky.Add(
                new KIndexData.VypocetDetail.Radek(KIndexData.KIndexParts.PercUzavrenoOVikendu, datayear.PercUzavrenoOVikendu, KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercUzavrenoOVikendu))
                );


            //r22
            val += datayear.PercSmlouvySPolitickyAngazovanouFirmou * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSmlouvySPolitickyAngazovanouFirmou); //86
            vradky.Add(new KIndexData.VypocetDetail.Radek(
                           KIndexData.KIndexParts.PercSmlouvySPolitickyAngazovanouFirmou, datayear.PercSmlouvySPolitickyAngazovanouFirmou, KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSmlouvySPolitickyAngazovanouFirmou)
                           )
                       );

            if (datayear.KoncetraceDodavateluObory != null)
            {
                //oborova koncentrace
                var oboryKoncentrace = datayear.KoncetraceDodavateluObory
                                       //.Where(m=>m != null)
                                       .Where(m =>
                                              m.Koncentrace.HodnotaSmluvProVypocet > (datayear.Statistika.CelkovaHodnotaSmluv * 0.05m) ||
                                              m.Koncentrace.PocetSmluvProVypocet > (datayear.Statistika.PocetSmluv * 0.05m) ||
                                              (m.Koncentrace.PocetSmluvBezCenyProVypocet > datayear.Statistika.PocetSmluvBezCeny * 0.02m)
                                              )
                                       .ToArray(); //for better debug;

                decimal prumernaCenaSmluv = datayear.Statistika.PrumernaHodnotaSmluvSeSoukrSubj;
                var     oboryVahy         = oboryKoncentrace
                                            .Select(m => new KIndexData.VypocetOboroveKoncentrace.RadekObor()
                {
                    Obor                = m.OborName,
                    Hodnota             = m.Combined_Herfindahl_Hirschman_Modified(),
                    Vaha                = m.Koncentrace.HodnotaSmluvProVypocet > 0 ? m.Koncentrace.HodnotaSmluvProVypocet : 1, // prumerne cenu u nulobych cen uz pocitam u Koncentrace.HodnotaSmluvProVypocet //+ (prumernaCenaSmluv * (decimal)m.Koncentrace.PocetSmluvProVypocet * m.PodilSmluvBezCeny),
                    PodilSmluvBezCeny   = m.PodilSmluvBezCeny,
                    CelkovaHodnotaSmluv = m.Koncentrace.HodnotaSmluvProVypocet,
                    PocetSmluvCelkem    = m.Koncentrace.PocetSmluvProVypocet
                })
                                            .ToArray();
                decimal avg = oboryVahy.WeightedAverage(m => m.Hodnota, w => w.Vaha);
                val += avg * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.KoncentraceDodavateluObory);
                vradky.Add(
                    new KIndexData.VypocetDetail.Radek(KIndexData.KIndexParts.KoncentraceDodavateluObory, avg, KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.KoncentraceDodavateluObory))
                    );
                vypocet.OboroveKoncentrace = new KIndexData.VypocetOboroveKoncentrace();
                vypocet.OboroveKoncentrace.PrumernaCenaSmluv = prumernaCenaSmluv;
                vypocet.OboroveKoncentrace.Radky             = oboryVahy.ToArray();
            }
            //
            //r16 - bonus!
            val -= datayear.PercSmlouvyPod50kBonus * KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSmlouvyPod50kBonus);

            vradky.Add(new KIndexData.VypocetDetail.Radek(
                           KIndexData.KIndexParts.PercSmlouvyPod50kBonus, -1 * datayear.PercSmlouvyPod50kBonus, KIndexData.DetailInfo.DefaultKIndexPartKoeficient(KIndexData.KIndexParts.PercSmlouvyPod50kBonus)
                           )
                       );
            vypocet.Radky = vradky.ToArray();

            if (val < 0)
            {
                val = 0;
            }

            var kontrolniVypocet = vypocet.Vypocet();

            if (val != kontrolniVypocet)
            {
                throw new ApplicationException("Nesedi vypocet");
            }

            vypocet.LastUpdated    = DateTime.Now;
            datayear.KIndexVypocet = vypocet;


            datayear.KIndex = val;
        }