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); }
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()); }
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; }
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); }
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); }
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); } } }
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); }
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); }
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); }
//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); }
public void Update(ref Lib.Data.Smlouva item) { }
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 )); } } }
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); }
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); }
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); } } } } }
public bool Update(ref Lib.Data.Smlouva item) { return(false); }
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); }
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); }
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); }