public DetailInfo(string ico, KIndexData.Annual data, KIndexParts part) { this.AnnualData = data; this.Part = part; this.Ico = ico; Init(); }
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)); } }
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); }
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); }
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); } }
//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); }
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; }