Пример #1
0
        public IEnumerable <Issue> FindIssues(Lib.Data.Smlouva item)
        {
            List <Issue> issues = new List <Issue>();

            if (item.Prilohy != null && item.Prilohy.Count() > 0)
            {
                List <string> files = new List <string>();
                foreach (var p in item.Prilohy)
                {
                    string fn = CheckAttachment(p, item);
                    if (!string.IsNullOrEmpty(fn))
                    {
                        files.Add(fn);
                    }
                }
                if (files.Count > 1)
                {
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.NecitelnostSmlouvy, "Nečitelnost smlouvy",
                                  string.Format("Text příloh {0} není strojově čitelný, ze zákona být musí",
                                                files.Aggregate((f, s) => f + ", " + s)
                                                ))
                        );
                }
                else if (files.Count == 1)
                {
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.NecitelnostSmlouvy, "Nečitelnost smlouvy",
                                  string.Format("Text přílohy {0} není strojově čitelný, ze zákona být musí", files.First()))
                        );
                }
            }
            return(issues);
        }
Пример #2
0
        public static string[] SmlouvyIdSPolitiky(Dictionary <string, List <int> > politicisVazbami, List <FirmaEvent> sponzorujiciFirmy, bool showProgress = false)
        {
            HashSet <string> allIco = new HashSet <string>(
                politicisVazbami.Select(m => m.Key).Union(sponzorujiciFirmy.Select(m => m.ICO)).Distinct()
                );
            //smlouvy s politikama
            Func <int, int, Nest.ISearchResponse <Lib.Data.Smlouva> > searchFunc = null;

            searchFunc = (size, page) =>
            {
                return(Lib.ES.Manager.GetESClient().Search <Lib.Data.Smlouva>(a => a
                                                                              .TrackTotalHits(page * size == 0)
                                                                              .Size(size)
                                                                              .From(page * size)
                                                                              .Source(m => m.Excludes(e => e.Field(o => o.Prilohy)))
                                                                              .Query(q => q.MatchAll())
                                                                              .Scroll("1m")
                                                                              ));
            };


            List <string> smlouvyIds = new List <string>();

            Searching.Tools.DoActionForQuery <Lib.Data.Smlouva>(Lib.ES.Manager.GetESClient(), searchFunc,
                                                                (hit, param) =>
            {
                Lib.Data.Smlouva s = hit.Source;
                if (s.platnyZaznam)
                {
                    if (!string.IsNullOrEmpty(s.Platce.ico) && allIco.Contains(s.Platce.ico))
                    {
                        smlouvyIds.Add(s.Id);
                    }
                    else
                    {
                        foreach (var ss in s.Prijemce)
                        {
                            if (!string.IsNullOrEmpty(ss.ico) && allIco.Contains(ss.ico))
                            {
                                smlouvyIds.Add(s.Id);
                                break;
                            }
                        }
                    }
                }
                return(new Devmasters.Batch.ActionOutputData()
                {
                    CancelRunning = false, Log = null
                });
            }, null,
                                                                showProgress ? Devmasters.Batch.Manager.DefaultOutputWriter : (Action <string>)null,
                                                                showProgress ? new Devmasters.Batch.ActionProgressWriter().Write : (Action <ActionProgressData>)null
                                                                , false
                                                                , prefix: "SmlouvyIdSPolitiky "
                                                                );

            return(smlouvyIds.ToArray());
        }
Пример #3
0
        public void UpdateSmluvniStrany(ref Lib.Data.Smlouva item, Lib.Data.Smlouva.Subjekt platce, Lib.Data.Smlouva.Subjekt[] prijemce)
        {
            item.Enhancements = item.Enhancements.AddOrUpdate(
                new Enhancement("Ruční nastavení smluvních stran", "Ručně nastaven plátce", "item.Platce", Ser(item.Platce), Ser(platce), this)
                );
            item.Platce = platce;

            item.Enhancements = item.Enhancements.AddOrUpdate(
                new Enhancement("Ruční nastavení smluvních stran", "Ručně nastaven příjemce", "item.Prijemce", Ser(item.Prijemce), Ser(prijemce), this)
                );
            item.Prijemce = prijemce;
        }
Пример #4
0
 private string GetNormalizedIco(string ico, string parametrName, ref Lib.Data.Smlouva item)
 {
     if (!string.IsNullOrEmpty(ico))
     {
         var newIco = System.Text.RegularExpressions.Regex.Replace(ico, @"[^0-9]", string.Empty);
         if (newIco != ico && Util.DataValidators.CheckCZICO(newIco))
         {
             item.Enhancements = item.Enhancements.AddOrUpdate(new Enhancement("Normalizováno IČO", "", parametrName, ico, newIco, this));
             return(newIco);
         }
     }
     return(ico);
 }
Пример #5
0
        public bool UpdateSmluvniStrany(ref Lib.Data.Smlouva item, Lib.Data.Smlouva.Subjekt platce, Lib.Data.Smlouva.Subjekt[] prijemce)
        {
            item.Enhancements = item.Enhancements.AddOrUpdate(
                new Enhancement(NastaveniSmluvnichStran, "Ručně nastaven plátce", "item.Platce", Ser(item.Platce), Ser(platce), this)
                );
            item.Platce = platce;

            item.Enhancements = item.Enhancements.AddOrUpdate(
                new Enhancement(NastaveniSmluvnichStran, "Ručně nastaven příjemce", "item.Prijemce", Ser(item.Prijemce), Ser(prijemce), this)
                );
            item.Prijemce = prijemce;

            return(true);
        }
Пример #6
0
        public void Update(ref Lib.Data.Smlouva item)
        {
            if (item.Platce != null)
            {
                item.Platce.ico = GetNormalizedIco(item.Platce.ico, "platce.ico", ref item);
            }

            if (item.Prijemce != null)
            {
                foreach (var p in item.Prijemce)
                {
                    p.ico = GetNormalizedIco(p.ico, "prijemce.ico", ref item);
                }
            }
        }
Пример #7
0
        public bool Update(ref Lib.Data.Smlouva item)
        {
            Base.Logger.Debug("Starting CalculatedPrice for " + item.Id);
            bool changed = false;

            if (item.hodnotaVcetneDph.HasValue && item.hodnotaVcetneDph > 0)
            {
                item.CalculatedPriceWithVATinCZK = item.hodnotaVcetneDph.Value;
                item.CalcutatedPriceQuality      = DataQualityEnum.Exact;
                changed = true;
            }
            else if (item.hodnotaBezDph.HasValue && item.hodnotaBezDph > 0)
            {
                item.CalculatedPriceWithVATinCZK = item.hodnotaBezDph.Value * 1.21m;
                item.CalcutatedPriceQuality      = DataQualityEnum.Calculated;
                changed = true;
            }
            else if (item.ciziMena != null && item.ciziMena.hodnota > 0)
            {
                //preved Menu na CZK
                if (item.ciziMena.mena.ToUpper() == "CZK")
                {
                    item.CalculatedPriceWithVATinCZK = item.ciziMena.hodnota;
                    item.CalcutatedPriceQuality      = DataQualityEnum.Exact;
                    changed = true;
                }
                else
                {
                    DateTime date = item.datumUzavreni;
                    decimal  exr  = GetCNBExchangeRate(date, item.ciziMena.mena);
                    if (exr > 0)
                    {
                        item.CalculatedPriceWithVATinCZK = item.ciziMena.hodnota * exr;
                        item.CalcutatedPriceQuality      = DataQualityEnum.Calculated;
                        item.Enhancements = item.Enhancements.AddOrUpdate(new Enhancement("Dopočítána cena v CZK ze zahraniční měny", "", "", "", "", this));
                        changed           = true;
                    }
                    else
                    {
                        Base.Logger.Warning("Date: " + date.ToShortDateString() + " " + item.ciziMena.mena + " is unknown");
                    }
                }
            }
            return(changed);
        }
Пример #8
0
        private string CheckAttachment(Lib.Data.Smlouva.Priloha p, Lib.Data.Smlouva item)
        {
            List <Issue> issues = new List <Issue>();

            if (
                (!p.EnoughExtractedText || p.PlainTextContentQuality == DataQualityEnum.Estimated) &&
                (p.LastUpdate > historyDate) &&
                item.datumUzavreni > datumUzavreni &&
                p.PlainTextContentQuality != DataQualityEnum.Unknown
                )

            {
                return(p.nazevSouboru);
            }


            return(string.Empty);
        }
Пример #9
0
        public bool Update(ref Lib.Data.Smlouva item)
        {
            if (item.Platce != null)
            {
                item.Platce.ico = GetNormalizedIco(item.Platce.ico, "platce.ico", ref item);
            }

            if (item.VkladatelDoRejstriku != null)
            {
                item.VkladatelDoRejstriku.ico = GetNormalizedIco(item.VkladatelDoRejstriku.ico, "vkladatelDoRejstriku.ico", ref item);
            }

            if (item.Prijemce != null)
            {
                foreach (var p in item.Prijemce)
                {
                    p.ico = GetNormalizedIco(p.ico, "prijemce.ico", ref item);
                }
            }

            return(changed);
        }
Пример #10
0
        //public static Nest.IIndexResponse Save(Person p, ElasticClient client = null)
        //{
        //    p.PrepareBeforeSave();
        //    if (client == null)
        //        client = Lib.ES.Manager.GetESClient();
        //    var res = client
        //        .Index<Lib.Data.Person>(p);
        //    return res;
        //}

        public static Nest.IIndexResponse Save(Lib.Data.Smlouva item, ElasticClient client = null)
        {
            if (item == null)
            {
                return(new Nest.IndexResponse());
            }

            item.PrepareBeforeSave();
            ElasticClient c = client;

            if (c == null)
            {
                if (item.platnyZaznam)
                {
                    c = Lib.ES.Manager.GetESClient();
                }
                else
                {
                    c = Lib.ES.Manager.GetESClient_Sneplatne();
                }
            }
            var res = c
                      //.Update<Lib.Data.Smlouva>()
                      .Index <Lib.Data.Smlouva>(item, m => m.Id(item.Id));

            if (item.platnyZaznam == false && res.IsValid && client == null)
            {
                //zkontroluj zda neni v indexu s platnymi. pokud ano, smaz ho tam
                var cExist = GetESClient();
                var s      = Manager.Load(item.Id, cExist);
                if (s != null)
                {
                    Delete(item.Id, cExist);
                }
            }

            if (res.IsValid)
            {
                try
                {
                    DirectDB.NoResult("exec smlouvaId_save @id,@active, @created, @updated",
                                      new System.Data.SqlClient.SqlParameter("id", item.Id),
                                      new System.Data.SqlClient.SqlParameter("created", item.casZverejneni),
                                      new System.Data.SqlClient.SqlParameter("updated", item.LastUpdate),
                                      new System.Data.SqlClient.SqlParameter("active", item.znepristupnenaSmlouva() ? (int)0 : (int)1)
                                      );
                }
                catch (Exception e)
                {
                    ESLogger.Error("Manager Save", e);
                }



                if (!string.IsNullOrEmpty(item.Platce?.ico))
                {
                    DirectDB.NoResult("exec Firma_IsInRS_Save @ico",
                                      new System.Data.SqlClient.SqlParameter("ico", item.Platce?.ico)
                                      );
                }
                if (!string.IsNullOrEmpty(item.VkladatelDoRejstriku?.ico))
                {
                    DirectDB.NoResult("exec Firma_IsInRS_Save @ico",
                                      new System.Data.SqlClient.SqlParameter("ico", item.VkladatelDoRejstriku?.ico)
                                      );
                }
                foreach (var s in item.Prijemce ?? new Data.Smlouva.Subjekt[] { })
                {
                    if (!string.IsNullOrEmpty(s.ico))
                    {
                        DirectDB.NoResult("exec Firma_IsInRS_Save @ico",
                                          new System.Data.SqlClient.SqlParameter("ico", s.ico)
                                          );
                    }
                }
            }
            return(res);
        }
Пример #11
0
 public void Update(ref Lib.Data.Smlouva item)
 {
 }
Пример #12
0
        public void CheckSubjekt(Lib.Data.Smlouva.Subjekt d, Lib.Data.Smlouva item, ref List <Issue> issues)
        {
            List <Issue> tmpIss = new List <Issue>();

            bool   osoba = false;
            bool   isZahranicniSubjekt = false;
            string lnazev = d.nazev.ToLowerInvariant();

            isZahranicniSubjekt = (lnazev.Contains("ltd.") || lnazev.Contains("inc.") || lnazev.Contains("gmbh"));

            isZahranicniSubjekt = isZahranicniSubjekt || HlidacStatu.Util.DataValidators.IsZahranicniAdresa(d.adresa);

            //zjisti, zda nejde o 340/2015
            string dnazev = Devmasters.TextUtil.RemoveDiacritics(d.nazev).Trim();

            // obchodní tajemství
            string[] obchodni_taj_regex = new string[] {
                "340\\s* / \\s*2015",
                "(obchodni|bankovni|) \\s* (tajemstvi)",
                "nezverejnuje",
                "fyzicka \\s* osoba",
                "§ \\s* 5 \\s* odst.\\s*",
                "vylouceno \\s* z \\s* uverejneni"
            };
            bool obchodni_tajemstvi = false;

            foreach (var r in obchodni_taj_regex)
            {
                if (System.Text.RegularExpressions.Regex.IsMatch(dnazev, r, regexOptions))
                {
                    obchodni_tajemstvi = true;
                    break;
                }
            }


            bool hasIco = false;
            bool hasDS  = false;

            if (string.IsNullOrEmpty(d.ico))
            {
                //tmpIss.Add(new Issue(this,16, "Chybí IČO", string.Format("Neuvedeno IČO u dodavatele '{0}'", d.nazev)));
            }
            else if (Util.DataValidators.CheckCZICO(d.ico) == false && Util.DataValidators.IsZahranicniAdresa(d.ico) == false)
            {
                tmpIss.Add(new Issue(this, (int)IssueType.IssueTypes.Vadne_ICO, "Vadné IČO", string.Format("Subjekt '{0}' má neplatné IČO", d.nazev)));
            }
            else
            {
                hasIco = true;
            }

            if (hasIco && Util.DataValidators.IsZahranicniAdresa(d.ico) == false)
            {
                //check ICO in registers
                Lib.Data.Firma f = Lib.Data.Firma.FromIco(d.ico, true);
                if (!Lib.Data.Firma.IsValid(f))
                {
                    issues.Add(new Issue(this, (int)IssueType.IssueTypes.Neexistujici_ICO, "Neexistující IČO", string.Format("Subjekt '{0}' má neexistující IČO", d.nazev)));
                    hasIco = false;
                }
            }

            if (string.IsNullOrEmpty(d.datovaSchranka))
            {
                //tmpIss.Add(new Issue(this, "Chybí datová schránka", string.Format("Dodavatel '{0}' bez datove schránky", d.nazev)));
            }
            else
            {
                hasDS = true;
            }



            if (hasDS == false && hasIco == false && string.IsNullOrEmpty(d.nazev))
            {
                issues.Add(new Issue(this, (int)IssueType.IssueTypes.Zcela_Chybi_identifikace_smluvni_strany, "Chybí identifikace smluvní strany", "Smluvní strana není nijak identifikována"));
            }
            else if (hasDS == false && hasIco == false && !string.IsNullOrEmpty(d.nazev))
            {
                if (obchodni_tajemstvi)
                {
                    issues.Add(new Issue(this, (int)IssueType.IssueTypes.NeverejnyUdaj, "Identifikace smluvní strany", "Údaj není veřejný na základě § 5 odst. 6 zákona č. 340/2015 Sb., o registru smluv. Utajení smluvní strany je možné pouze v odůvodněných případech, což při této kontrole nehodnotíme."));
                }
                else if (isZahranicniSubjekt)
                {
                    issues.Add(new Issue(this, (int)IssueType.IssueTypes.Firma_Cizi_Stat, "Identifikace smluvní strany", string.Format("Smluvní strana '{0}' bez datove schránky a platného IČO. Jedná se pravděpodobně o zahraniční subjekt", d.nazev)));
                }
                else
                {
                    //zjisti, zda nejde o osobu
                    osoba = Lib.Validators.IsOsoba(dnazev);


                    if (osoba)
                    {
                        issues.Add(new Issue(this, (int)IssueType.IssueTypes.Osoba, "Identifikace smluvní strany", string.Format("Smluvní strana '{0}' bez datove schránky a platného IČO. Jedná se pravděpodobně o fyzickou osobu", d.nazev)));
                    }
                    else
                    {
                        issues.Add(new Issue(this, (int)IssueType.IssueTypes.Chybi_identifikace_smluvni_strany, "Chybí identifikace smluvní strany", string.Format("Smluvní strana '{0}' bez datove schránky a platného IČO.", d.nazev)));
                    }
                }
            }
            else
            {
                issues.AddRange(tmpIss);
            }


            //casove posloupnosti

            //datum vzniku firmy
            HlidacStatu.Lib.Data.Firma firma = null;
            if (hasIco)
            {
                firma = Lib.Data.Firma.FromIco(d.ico, true);
            }
            if (!Lib.Data.Firma.IsValid(firma) && hasDS)
            {
                firma = Lib.Data.Firma.FromDS(d.datovaSchranka, true);
            }

            if (Lib.Data.Firma.IsValid(firma))
            {
                if (firma.IsNespolehlivyPlatceDPH())
                {
                    var nespoleh = firma.NespolehlivyPlatceDPH();
                    if ((nespoleh.FromDate.HasValue && nespoleh.ToDate.HasValue &&
                         nespoleh.FromDate.Value <= item.datumUzavreni && item.datumUzavreni <= nespoleh.ToDate.Value
                         )
                        ||
                        (nespoleh.FromDate.HasValue && nespoleh.ToDate.HasValue == false &&
                         nespoleh.FromDate.Value <= item.datumUzavreni
                        )
                        )
                    {
                        issues.Add(new Issue(this,
                                             (int)IssueType.IssueTypes.SmlouvaUzavrena_s_NespolehlivymPlatcemDPH,
                                             "Smlouva uzavřena s nespolehlivým plátcem DPH.",
                                             string.Format("Smlouva byla uzavřena v den, kdy byl dodavatel {0} v registru nespolehlivých plátců DPH Finanční správy.", d.nazev)));
                    }
                }
            }

            if (Lib.Data.Firma.IsValid(firma) && firma.Datum_Zapisu_OR.HasValue)
            {
                double zalozeniPredPodpisem = (item.datumUzavreni - firma.Datum_Zapisu_OR.Value).TotalDays;

                if (zalozeniPredPodpisem < 0) //zalozeno po podpisu
                {
                    issues.Add(new Issue(this, (int)IssueType.IssueTypes.Firma_vznikla_az_po, "Firma vznikla až po podpisu smlouvy",
                                         string.Format("Firma {0} vznikla {1} dní po podpisu smlouvy", d.nazev, Math.Abs((int)zalozeniPredPodpisem)),
                                         null, new { days = (int)zalozeniPredPodpisem }
                                         ));
                }
                else if (zalozeniPredPodpisem < 60)
                {
                    issues.Add(new Issue(this, (int)IssueType.IssueTypes.Firma_vznikla_kratce_pred, "Firma vznikla krátce před podpisem smlouvy",
                                         string.Format("Firma {0} vznikla {1} dní před podpisem smlouvy", d.nazev, (int)zalozeniPredPodpisem),
                                         null, new { days = (int)zalozeniPredPodpisem }, false
                                         ));
                }
            }
        }
Пример #13
0
        public IEnumerable <Issue> FindIssues(Lib.Data.Smlouva item)
        {
            List <Issue> issues = new List <Issue>();

            if (item.ciziMena != null && item.ciziMena.hodnota > 0)
            {
                return(issues);
            }


            if (item.hodnotaBezDph.HasValue == false && item.hodnotaVcetneDph.HasValue == false)
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Nulova_hodnota_smlouvy, "Nulová hodnota smlouvy", "Smlouva nemá v metadatech uvedenu cenu. Utajení hodnoty smlouvy je možné pouze v odůvodněných případech, což při této kontrole nehodnotíme.")
                    );
            }

            if (item.hodnotaBezDph.HasValue && (item.hodnotaBezDph.HasValue == false || item.hodnotaBezDph == 0))
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Cena_bez_DPH_nulova, "Cena bez DPH nulová", "Smlouva uvádí nulovou cenu bez DPH.", null, new { hodnotaBezDph = item.hodnotaBezDph })
                    );
            }

            if (item.hodnotaVcetneDph.HasValue && (item.hodnotaVcetneDph.HasValue == false || item.hodnotaVcetneDph == 0))
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Cena_s_DPH_nulova, "Cena s DPH nulová", "Smlouva uvádí nulovou cenu s DPH.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph })
                    );
            }

            if (item.hodnotaBezDph < 0)
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Zaporna_cena_bez_DPH, "Záp**ná cena bez DPH", "Záp**ná cena je možná pouze u dodatků smlouvy, pouze se dodatkem snižuje hodnota smlouvy. Jinak jde o neplatnou smlouvu.", null, new { hodnotaBezDph = item.hodnotaBezDph })
                    );
            }
            if (item.hodnotaVcetneDph < 0)
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Zaporna_cena_s_DPH, "Záporna cena s DPH", "Záp**ná cena je možná pouze u dodatků smlouvy, pouze se dodatkem snižuje hodnota smlouvy. Jinak jde o neplatnou smlouvu.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph })
                    );
            }

            if (item.hodnotaBezDph.HasValue && item.hodnotaVcetneDph.HasValue)
            {
                //kontrola vypoctu DPH
                decimal bezDPH = item.hodnotaBezDph.Value;
                decimal sDPH   = item.hodnotaVcetneDph.Value;

                if (bezDPH > sDPH && (bezDPH > 0 && sDPH > 0))
                {
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.Neplatna_cena, "Neplatná cena", "Cena bez DPH je větší než cena s DPH.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph, hodnotaBezDph = item.hodnotaBezDph })
                        );
                }
                else if (bezDPH == sDPH) //stejne DPH
                {
                    //over, zda je v registru platcu DPH
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.bezDPH_x_DPH, "bezDPH = sDPH", "", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph, hodnotaBezDph = item.hodnotaBezDph })
                        );
                }
                else
                {
                    //TODO
                    bool      valid     = false;
                    decimal[] validVats = new decimal[] { 1.21m, 1.15m, 1.10m };
                    foreach (var vat in validVats)
                    {
                        var diff = Math.Round(bezDPH * vat);
                        if (Math.Abs(sDPH - diff) < 5)
                        {
                            valid = true;
                        }
                    }
                    if (valid == false)
                    {
                        issues.Add(
                            new Issue(this, (int)IssueType.IssueTypes.Neplatna_cena_vypocetDPH, "Neplatná cena", "Rozdíl ceny s DPH a bez DPH neodpovídá žádné sazbě DPH.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph, hodnotaBezDph = item.hodnotaBezDph })
                            );
                    }
                }
            }

            return(issues);
        }
Пример #14
0
            public static string GetFileFromPrilohaRepository(HlidacStatu.Lib.Data.Smlouva.Priloha att,
                                                              Lib.Data.Smlouva smlouva)
            {
                var ext = ".pdf";

                try
                {
                    ext = new System.IO.FileInfo(att.nazevSouboru).Extension;
                }
                catch (Exception e)
                {
                    HlidacStatu.Util.Consts.Logger.Warning("invalid file name " + (att?.nazevSouboru ?? "(null)"));
                }


                string localFile = Lib.Init.PrilohaLocalCopy.GetFullPath(smlouva, att);
                var    tmpPath   = System.IO.Path.GetTempPath();

                HlidacStatu.Util.IOTools.DeleteFile(tmpPath);
                if (!System.IO.Directory.Exists(tmpPath))
                {
                    try
                    {
                        System.IO.Directory.CreateDirectory(tmpPath);
                    }
                    catch
                    {
                    }
                }
                string tmpFnSystem = System.IO.Path.GetTempFileName();
                string tmpFn       = tmpFnSystem + HlidacStatu.Lib.OCR.DocTools.PrepareFilenameForOCR(att.nazevSouboru);

                try
                {
                    //System.IO.File.Delete(fn);
                    if (System.IO.File.Exists(localFile))
                    {
                        //do local copy
                        Consts.Logger.Debug($"Copying priloha {att.nazevSouboru} for smlouva {smlouva.Id} from local disk {localFile}");
                        System.IO.File.Copy(localFile, tmpFn, true);
                    }
                    else
                    {
                        try
                        {
                            Consts.Logger.Debug($"Downloading priloha {att.nazevSouboru} for smlouva {smlouva.Id} from URL {att.odkaz}");
                            byte[] data = null;
                            using (Devmasters.Net.Web.URLContent web = new Devmasters.Net.Web.URLContent(att.odkaz))
                            {
                                web.Timeout = web.Timeout * 10;
                                data        = web.GetBinary().Binary;
                                System.IO.File.WriteAllBytes(tmpFn, data);
                            }
                            Consts.Logger.Debug($"Downloaded priloha {att.nazevSouboru} for smlouva {smlouva.Id} from URL {att.odkaz}");
                        }
                        catch (Exception)
                        {
                            try
                            {
                                byte[] data = null;
                                Consts.Logger.Debug($"Second try: Downloading priloha {att.nazevSouboru} for smlouva {smlouva.Id} from URL {att.odkaz}");
                                using (Devmasters.Net.Web.URLContent web = new Devmasters.Net.Web.URLContent(att.odkaz))
                                {
                                    web.Tries                = 5;
                                    web.IgnoreHttpErrors     = true;
                                    web.TimeInMsBetweenTries = 1000;
                                    web.Timeout              = web.Timeout * 20;
                                    data = web.GetBinary().Binary;
                                    System.IO.File.WriteAllBytes(tmpFn, data);
                                }
                                Consts.Logger.Debug($"Second try: Downloaded priloha {att.nazevSouboru} for smlouva {smlouva.Id} from URL {att.odkaz}");
                                return(tmpFn);
                            }
                            catch (Exception e)
                            {
                                HlidacStatu.Util.Consts.Logger.Error(att.odkaz, e);
                                return(null);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    HlidacStatu.Util.Consts.Logger.Error(att.odkaz, e);
                    throw;
                }
                finally
                {
                    HlidacStatu.Util.IOTools.DeleteFile(tmpFnSystem);
                }
                return(tmpFn);
            }
Пример #15
0
        public void Update(ref Lib.Data.Smlouva item)
        {
            if (item.Prilohy != null)
            {
                for (int i = 0; i < item.Prilohy.Count(); i++)
                {
                    var att = item.Prilohy[i];
                    if (!this.forceAlreadyMined && att.LastUpdate > history)
                    {
                        continue;
                    }
                    if (!this.forceAlreadyMined && att.PlainTextContentQuality != DataQualityEnum.Unknown) //already parsed
                    {
                        att.LastUpdate = DateTime.Now.AddDays(-7);
                        continue;
                    }
                    Base.Logger.Debug($"Getting priloha {att.nazevSouboru} for smlouva {item.Id}");
                    string downloadedFile = Lib.Data.Smlouva.Priloha.GetFileFromPrilohaRepository(att, item);
                    Base.Logger.Debug($"Getdone priloha {att.nazevSouboru} for smlouva {item.Id} done.");
                    if (downloadedFile != null)
                    {
                        try
                        {
                            HlidacStatu.Lib.OCR.Api.Client.MiningIntensity intensity = HlidacStatu.Lib.OCR.Api.Client.MiningIntensity.Maximum;
                            if (skipOCR)
                            {
                                intensity = HlidacStatu.Lib.OCR.Api.Client.MiningIntensity.SkipOCR;
                            }

                            Base.Logger.Debug($"STARTING TextMiner Client.TextFromFile Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  skipOCR:{intensity.ToString()}");

                            HlidacStatu.Lib.OCR.Api.Result res = null;
                            if (asyncOCR)
                            {                                //res = HlidacStatu.Lib.OCR.Api.Client.TextFromFile(
                                //    Devmasters.Core.Util.Config.GetConfigValue("OCRServerApiKey"),
                                //    downloadedFile, "TextMiner",
                                //    HlidacStatu.Lib.OCR.Api.Client.TaskPriority.High, intensity
                                //    ); //TODOcallBackData: item.CallbackDataForOCRReq(i) );
                                Base.Logger.Debug($"TextMiner Client.TextFromFile Adding NewTask Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  skipOCR:{intensity.ToString()}");
                                res = Lib.Data.ItemToOcrQueue.AddNewTask(Lib.Data.ItemToOcrQueue.ItemToOcrType.Smlouva, item.Id, priority: this.priority);
                                Base.Logger.Debug($"TextMiner Client.TextFromFile Added NewTask Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  skipOCR:{intensity.ToString()}");
                            }
                            else
                            {
                                Base.Logger.Debug($"TextMiner Client.TextFromFile Doing OCR Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  skipOCR:{intensity.ToString()}");
                                res = HlidacStatu.Lib.OCR.Api.Client.TextFromFile(
                                    Devmasters.Core.Util.Config.GetConfigValue("OCRServerApiKey"),
                                    downloadedFile, "TextMiner",
                                    HlidacStatu.Lib.OCR.Api.Client.TaskPriority.High, intensity);
                                Base.Logger.Debug($"TextMiner Client.TextFromFile Done OCR Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  skipOCR:{intensity.ToString()}");
                            }

                            if (res.IsValid == HlidacStatu.Lib.OCR.Api.Result.ResultStatus.InQueueWithCallback)
                            {
                                Base.Logger.Debug($"Queued TextMiner Client.TextFromFile Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  taskid:{res.Id}");
                            }
                            else if (res.IsValid == HlidacStatu.Lib.OCR.Api.Result.ResultStatus.Invalid)
                            {
                                Base.Logger.Error($"ERROR TextMiner Client.TextFromFile Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  taskid:{res.Id}  error:{res.Error}");
                            }
                            else if (res.IsValid == HlidacStatu.Lib.OCR.Api.Result.ResultStatus.Unknown)
                            {
                                Base.Logger.Error($"UNKNOWN Status TextMiner Client.TextFromFile Id:{item.Id} att:{att.nazevSouboru}  async:{asyncOCR}  taskid:{res.Id}  error:{res.Error}");
                            }
                            else if (res.IsValid == HlidacStatu.Lib.OCR.Api.Result.ResultStatus.Valid)
                            {
                                if (res.Documents.Count > 1)
                                {
                                    Base.Logger.Error("More documents inside attachment");
                                }
                                else if (res.Documents.Count == 1)
                                {
                                    att.PlainTextContent = HlidacStatu.Util.ParseTools.NormalizePrilohaPlaintextText(res.Documents[0].Text);
                                    att.Lenght           = att.PlainTextContent.Length;
                                    att.WordCount        = HlidacStatu.Util.ParseTools.CountWords(att.PlainTextContent);
                                    if (res.Documents[0].UsedOCR)
                                    {
                                        att.PlainTextContentQuality = DataQualityEnum.Estimated;
                                    }
                                    else
                                    {
                                        att.PlainTextContentQuality = DataQualityEnum.Parsed;
                                    }

                                    att.LastUpdate = DateTime.Now;

                                    if (att.EnoughExtractedText)
                                    {
                                        if (att.PlainTextContentQuality == DataQualityEnum.Estimated)
                                        {
                                            item.Enhancements = item.Enhancements.AddOrUpdate(new Enhancement("Text přílohy extrahován z OCR dokumentu ", "", "item.Prilohy[" + i.ToString() + "].PlainTextContent", "", "", this));
                                        }
                                        else
                                        {
                                            item.Enhancements = item.Enhancements.AddOrUpdate(new Enhancement("Text přílohy extrahován z obsahu dokumentu ", "", "item.Prilohy[" + i.ToString() + "].PlainTextContent", "", "", this));
                                        }
                                    }
                                }
                            }

                            Base.Logger.Debug("Done TextMiner Client.TextFromFile Id:" + item.Id + " att:" + att.nazevSouboru);
                        }
                        finally
                        {
                            Base.Logger.Debug($"deleting temporary {downloadedFile} file TextMiner Client.TextFromFile Id:" + item.Id + " att:" + att.nazevSouboru);
                            HlidacStatu.Util.IOTools.DeleteFile(downloadedFile);
                        }
                    }
                }
            }
        }
Пример #16
0
 public bool Update(ref Lib.Data.Smlouva item)
 {
     return(false);
 }
Пример #17
0
        public IEnumerable <Issue> FindIssues(Lib.Data.Smlouva item)
        {
            List <Issue> issues = new List <Issue>();


            if (item.Prijemce == null || item.Prijemce.Count() == 0)
            {
                issues.Add(new Issue(this, (int)IssueType.IssueTypes.Neuveden_dodavatel, "Neuveden dodavatel", "Žádný dodavatel u smlouvy"));
            }
            //datumy
            if (item.datumUzavreni > item.casZverejneni)
            {
                issues.Add(new Issue(this, (int)IssueType.IssueTypes.Budouci_datum_uzavreni, "Budoucí datum uzavření", "Smlouva byla uzavřena až po zveřejnění v rejstříku."));
            }

            if (item.datumUzavreni < DateTime.Now.AddYears(-40))
            {
                issues.Add(new Issue(this, (int)IssueType.IssueTypes.Neplatny_datum_uzavreni_smlouvy, "Neplatný datum uzavření smlouvy", "Údaj o datumu uzavření smlouvy obsahuje nesmyslný datum. Zápis nesplňuje zákonou podmínku platnosti."));
            }

            if (item.spadaPodRS && item.datumUzavreni > DateTime.Now)
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Budouci_datum_uzavreni, "Budoucí datum uzavření smlouvy", "Údaj o datumu uzavření smlouvy obsahuje budoucí datum.")
                {
                    Permanent = false
                }
                    );
            }


            DateTime prvniZverejneni = item.casZverejneni;

            if (item.OtherVersions().Length > 0)
            {
                var newMin = item.OtherVersions().Min(m => m.casZverejneni);
                if (prvniZverejneni > newMin)
                {
                    prvniZverejneni = newMin;
                }
            }

            if (item.spadaPodRS && item.PravniRamec == Lib.Data.Smlouva.PravniRamce.Od072017 &&
                (prvniZverejneni - item.datumUzavreni).TotalDays > 31 &&
                (item.datumUzavreni.AddMonths(3).AddDays(1) > prvniZverejneni)
                )
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.SmlouvaZverejnenaPozde, "Smlouva nebyla zveřejněna do 30 dnů od podpisu", "Smlouva nebyla uveřejněna do 30 dnů od uzavření smlouvy (dle § 5 odst. 2), její účinnost je až odedne uveřejnění")
                    );
            }

            if (item.spadaPodRS && item.PravniRamec == Lib.Data.Smlouva.PravniRamce.Od072017 &&
                (item.datumUzavreni.AddMonths(3).AddDays(1) <= prvniZverejneni)
                )
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.SmlouvaZverejnenaPozdeNezacalaPlatit, "Smlouva nebyla zveřejněna do 3 měsíců od podpisu a nikdy nezačala platit", "Smlouva nebyla uveřejněna do 3 měsíců od uzavření smlouvy (dle § 7 odst. 1) a je tak automaticky zrušena od počátku, nikdy nezačala platit.")
                    );
            }

            //platce
            CheckSubjekt(item.Platce, item, ref issues);

            //Dodavatele
            foreach (var d in item.Prijemce)
            {
                if (d == null)
                {
                    continue;
                }
                CheckSubjekt(d, item, ref issues);
            }


            //simple vztahy
            // publikujici strana = jedina strana smlouvy
            if (
                item.Prijemce.Count() == 1 && item.Prijemce.Any(m => m.ico == item.Platce.ico)
                )
            {
                issues.Add(new Issue(this, (int)IssueType.IssueTypes.Stejne_strany_smlouvy, "Stejné strany smlouvy", string.Format("Dodavatel i objednatel jsou stejní '{0}'", item.Platce.nazev)));
            }
            else if (
                item.Prijemce.Any(m => m.ico == item.Platce.ico)
                )
            {
                issues.Add(new Issue(this, (int)IssueType.IssueTypes.Chybne_strany_smlouvy, "Chybné strany smlouvy", "Objednatel je i na straně dodavatele"));
            }



            //VkladatelDoRejstriku
            //CheckSubjekt(item.VkladatelDoRejstriku, item, ref issues);


            if (string.IsNullOrEmpty(item.predmet))
            {
                issues.Add(new Issue(this, (int)IssueType.IssueTypes.Chybi_predmet_smlouvy, "Chybí předmět smlouvy", "Metadata neobsahují povinný předmět smlouvy"));
            }

            return(issues);
        }
Пример #18
0
        public static AnalysisCalculation.VazbyFiremNaUradyStat UradyObchodujiciSFirmami_s_vazbouNaPolitiky(Relation.AktualnostType aktualnost, bool showProgress = false)
        {
            HlidacStatu.Lib.Data.AnalysisCalculation.VazbyFiremNaPolitiky vazbyNaPolitiky = null;
            List <Lib.Data.FirmaEvent> sponzorujiciFirmy = null;

            QueryContainer qc = null;

            switch (aktualnost)
            {
            case HlidacStatu.Lib.Data.Relation.AktualnostType.Aktualni:
                vazbyNaPolitiky = StaticData.FirmySVazbamiNaPolitiky_aktualni_Cache.Get();
                qc = new QueryContainerDescriptor <HlidacStatu.Lib.Data.Smlouva>().Term(t => t.Field(f => f.SVazbouNaPolitikyAktualni).Value(true));
                sponzorujiciFirmy = StaticData.SponzorujiciFirmy_Nedavne.Get();
                break;

            case HlidacStatu.Lib.Data.Relation.AktualnostType.Nedavny:
                vazbyNaPolitiky = StaticData.FirmySVazbamiNaPolitiky_nedavne_Cache.Get();
                qc = new QueryContainerDescriptor <HlidacStatu.Lib.Data.Smlouva>().Term(t => t.Field(f => f.SVazbouNaPolitikyNedavne).Value(true));
                sponzorujiciFirmy = StaticData.SponzorujiciFirmy_Nedavne.Get();
                break;

            case HlidacStatu.Lib.Data.Relation.AktualnostType.Neaktualni:
            case HlidacStatu.Lib.Data.Relation.AktualnostType.Libovolny:
                vazbyNaPolitiky = StaticData.FirmySVazbamiNaPolitiky_vsechny_Cache.Get();
                qc = new QueryContainerDescriptor <HlidacStatu.Lib.Data.Smlouva>().Term(t => t.Field(f => f.SVazbouNaPolitiky).Value(true));
                sponzorujiciFirmy = StaticData.SponzorujiciFirmy_Vsechny.Get();
                break;
            }


            Func <int, int, Nest.ISearchResponse <Lib.Data.Smlouva> > searchFunc = null;

            searchFunc = (size, page) =>
            {
                return(Lib.ES.Manager.GetESClient().Search <Lib.Data.Smlouva>(a => a
                                                                              .Size(size)
                                                                              .From(page * size)
                                                                              .Source(m => m.Excludes(e => e.Field(o => o.Prilohy)))
                                                                              .Query(q => qc)
                                                                              .Scroll("5m")
                                                                              ));
            };


            //TODO predelat z projeti vsech smluv na hledani pres vsechna ICO  v RS, vybrani statnich firem,
            //a dohlednai jejich statistiky vuci jednotlivym ostatnim firmam v RS
            Dictionary <string, Analysis.BasicDataForSubject <List <Analysis.BasicData <string> > > > uradyStatni = new Dictionary <string, Analysis.BasicDataForSubject <List <Analysis.BasicData <string> > > >();
            Dictionary <string, Analysis.BasicDataForSubject <List <Analysis.BasicData <string> > > > uradySoukr  = new Dictionary <string, Analysis.BasicDataForSubject <List <Analysis.BasicData <string> > > >();
            object lockObj = new object();

            Lib.ES.SearchTools.DoActionForQuery <Lib.Data.Smlouva>(Lib.ES.Manager.GetESClient(), searchFunc,
                                                                   (hit, param) =>
            {
                Lib.Data.Smlouva s = hit.Source;
                List <string> icos = new List <string>();
                try
                {
                    var objednatelIco = s.Platce.ico;
                    if (!string.IsNullOrEmpty(objednatelIco))
                    {
                        Firma ff = Firmy.Get(objednatelIco);
                        if (!ff.Valid || !ff.PatrimStatu())
                        {
                            goto end;
                        }

                        //vsichni prijemci smlouvy statniho subjektu
                        icos.AddRange(s.Prijemce.Select(m => m.ico).Where(m => !string.IsNullOrEmpty(m)).Distinct());

                        lock (lockObj)
                        {
                            foreach (var ico in icos)
                            {
                                if (vazbyNaPolitiky.SoukromeFirmy.ContainsKey(ico) || sponzorujiciFirmy.Any(m => m.ICO == ico))
                                {
                                    if (!uradySoukr.ContainsKey(objednatelIco))
                                    {
                                        uradySoukr.Add(objednatelIco, new Analysis.BasicDataForSubject <List <Analysis.BasicData <string> > >());
                                        uradySoukr[objednatelIco].Ico = objednatelIco;
                                    }
                                    uradySoukr[objednatelIco].Add(1, s.CalculatedPriceWithVATinCZK);
                                    if (!uradySoukr[objednatelIco].Detail.Any(m => m.Item == ico))
                                    {
                                        uradySoukr[objednatelIco].Detail.Add(new Analysis.BasicData <string>()
                                        {
                                            Item = ico, CelkemCena = s.CalculatedPriceWithVATinCZK, Pocet = 1
                                        });
                                    }
                                    else
                                    {
                                        var item = uradySoukr[objednatelIco].Detail.First(m => m.Item == ico);
                                        item.Add(1, s.CalculatedPriceWithVATinCZK);
                                    }
                                }
                                else if (vazbyNaPolitiky.StatniFirmy.ContainsKey(ico))
                                {
                                    if (!uradyStatni.ContainsKey(objednatelIco))
                                    {
                                        uradyStatni.Add(objednatelIco, new Analysis.BasicDataForSubject <List <Analysis.BasicData <string> > >());
                                        uradyStatni[objednatelIco].Ico = objednatelIco;
                                    }
                                    uradyStatni[objednatelIco].Add(1, s.CalculatedPriceWithVATinCZK);
                                    if (!uradyStatni[objednatelIco].Detail.Any(m => m.Item == ico))
                                    {
                                        uradyStatni[objednatelIco].Detail.Add(new Analysis.BasicData <string>()
                                        {
                                            Item = ico, CelkemCena = s.CalculatedPriceWithVATinCZK, Pocet = 1
                                        });
                                    }
                                    else
                                    {
                                        var item = uradyStatni[objednatelIco].Detail.First(m => m.Item == ico);
                                        item.Add(1, s.CalculatedPriceWithVATinCZK);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    HlidacStatu.Util.Consts.Logger.Error("ERROR UradyObchodujiciSFirmami_s_vazbouNaPolitiky", e);
                }

                end:
                return(new Devmasters.Core.Batch.ActionOutputData()
                {
                    CancelRunning = false, Log = null
                });
            }, null,
                                                                   showProgress ? Devmasters.Core.Batch.Manager.DefaultOutputWriter : (Action <string>)null,
                                                                   showProgress ? new Devmasters.Core.Batch.ActionProgressWriter().Write : (Action <ActionProgressData>)null
                                                                   , true
                                                                   , prefix: "UradyObchodujiciSFirmami_s_vazbouNaPolitiky " + aktualnost.ToNiceDisplayName()
                                                                   );


            AnalysisCalculation.VazbyFiremNaUradyStat ret = new VazbyFiremNaUradyStat();
            ret.SoukromeFirmy = uradySoukr
                                .Where(m => m.Value.Pocet > 0)
                                .Select(kv => kv.Value)
                                .OrderByDescending(o => o.Pocet);

            return(ret);
        }
Пример #19
0
        public IEnumerable <Issue> FindIssues(Lib.Data.Smlouva item)
        {
            List <Issue> issues = new List <Issue>();

            if (item.ciziMena != null && item.ciziMena.hodnota > 0)
            {
                return(issues);
            }

            //
            bool jeToDodatek = false;

            if (item.navazanyZaznam != null)
            {
                Lib.Data.Smlouva navSm = Lib.Data.Smlouva.Load(item.navazanyZaznam);
                if (navSm != null)
                {
                    jeToDodatek = jeToDodatek || item.predmet.ToLower().Contains("dodatek");
                    jeToDodatek = jeToDodatek || item.Prilohy.Any(m => Devmasters.TextUtil.ShortenText(m.PlainTextContent, 300)?.ToLower()?.Contains("dodatek") == true);
                }
            }

            bool ukonceniSmlouvy = false;

            ukonceniSmlouvy = ukonceniSmlouvy || item.predmet?.ToLower()?.RemoveAccents()?.Contains("dohoda o ukonceni") == true;
            ukonceniSmlouvy = ukonceniSmlouvy || item.Prilohy.Any(m => Devmasters.TextUtil.ShortenText(m.PlainTextContent, 300)?.ToLower()?.RemoveAccents()?.Contains("dohoda o ukonceni") == true);

            if (
                (item.hodnotaBezDph.HasValue == false && item.hodnotaVcetneDph.HasValue == false)
                ||
                (item.hodnotaBezDph == 0 && item.hodnotaVcetneDph == 0)
                )
            {
                if (jeToDodatek)
                {
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.Nulova_hodnota_smlouvy_u_dodatku, "Nulová hodnota smlouvy", "Smlouva nemá v metadatech uvedenu cenu. Utajení hodnoty smlouvy je možné pouze v odůvodněných případech, což při této kontrole nehodnotíme. Tuto smlouvu jsme identifikovali jako dodatek, dodatky bez změny ceny mají hodnotu 0 zcela oprávněně")
                        );
                }
                else if (ukonceniSmlouvy)
                {
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.Nulova_hodnota_smlouvy_ostatni, "Nulová hodnota smlouvy", "Smlouva nemá v metadatech uvedenu cenu. Utajení hodnoty smlouvy je možné pouze v odůvodněných případech, což při této kontrole nehodnotíme. Tuto smlouvu jsme identifikovali jako ukončení smlouvy, kde je nulová hodnota smlouvy možná.")
                        );
                }
                else
                {
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.Nulova_hodnota_smlouvy, "Nulová hodnota smlouvy", "Smlouva nemá v metadatech uvedenu cenu. Utajení hodnoty smlouvy je možné pouze v odůvodněných případech, což při této kontrole nehodnotíme.")
                        );
                }
            }

            if (item.hodnotaBezDph.HasValue && (item.hodnotaBezDph.HasValue == false || item.hodnotaBezDph == 0))
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Cena_bez_DPH_nulova, "Cena bez DPH nulová", "Smlouva uvádí nulovou cenu bez DPH.", null, new { hodnotaBezDph = item.hodnotaBezDph })
                    );
            }

            if (item.hodnotaVcetneDph.HasValue && (item.hodnotaVcetneDph.HasValue == false || item.hodnotaVcetneDph == 0))
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Cena_s_DPH_nulova, "Cena s DPH nulová", "Smlouva uvádí nulovou cenu s DPH.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph })
                    );
            }

            if (item.hodnotaBezDph < 0)
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Zaporna_cena_bez_DPH, "Záp**ná cena bez DPH", "Záp**ná cena je možná pouze u dodatků smlouvy, pouze se dodatkem snižuje hodnota smlouvy. Jinak jde o neplatnou smlouvu.", null, new { hodnotaBezDph = item.hodnotaBezDph })
                    );
            }
            if (item.hodnotaVcetneDph < 0)
            {
                issues.Add(
                    new Issue(this, (int)IssueType.IssueTypes.Zaporna_cena_s_DPH, "Záporna cena s DPH", "Záp**ná cena je možná pouze u dodatků smlouvy, pouze se dodatkem snižuje hodnota smlouvy. Jinak jde o neplatnou smlouvu.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph })
                    );
            }

            if (item.hodnotaBezDph.HasValue && item.hodnotaVcetneDph.HasValue)
            {
                //kontrola vypoctu DPH
                decimal bezDPH = item.hodnotaBezDph.Value;
                decimal sDPH   = item.hodnotaVcetneDph.Value;

                if (bezDPH > sDPH && (bezDPH > 0 && sDPH > 0))
                {
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.Neplatna_cena, "Neplatná cena", "Cena bez DPH je větší než cena s DPH.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph, hodnotaBezDph = item.hodnotaBezDph })
                        );
                }
                else if (bezDPH == sDPH) //stejne DPH
                {
                    //over, zda je v registru platcu DPH
                    issues.Add(
                        new Issue(this, (int)IssueType.IssueTypes.bezDPH_x_DPH, "bezDPH = sDPH", "", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph, hodnotaBezDph = item.hodnotaBezDph })
                        );
                }
                else
                {
                    //TODO
                    bool      valid     = false;
                    decimal[] validVats = new decimal[] { 1.21m, 1.15m, 1.10m };
                    foreach (var vat in validVats)
                    {
                        var diff = Math.Round(bezDPH * vat);
                        if (Math.Abs(sDPH - diff) < 5)
                        {
                            valid = true;
                        }
                    }
                    if (valid == false)
                    {
                        issues.Add(
                            new Issue(this, (int)IssueType.IssueTypes.Neplatna_cena_vypocetDPH, "Neplatná cena", "Rozdíl ceny s DPH a bez DPH neodpovídá žádné sazbě DPH.", null, new { hodnotaVcetneDph = item.hodnotaVcetneDph, hodnotaBezDph = item.hodnotaBezDph })
                            );
                    }
                }
            }

            return(issues);
        }