diff --git a/data/zakazky/main.py b/data/zakazky/main.py index 86860f5..eae2aaf 100644 --- a/data/zakazky/main.py +++ b/data/zakazky/main.py @@ -1,150 +1,94 @@ -# - http://www.isvz.cz/ISVZ/Podpora/ISVZ_open_data_vz.aspx -# - http://www.isvz.cz/ISVZ/MetodickaPodpora/Napovedaopendata.pdf - import csv -import datetime as dt -import gzip +import shutil +import hashlib import json import os -import re -import ssl +import logging from contextlib import contextmanager -from datetime import datetime from urllib.request import Request, urlopen - -from lxml.etree import iterparse - -# ISVZ nema duveryhodny certy -ssl._create_default_https_context = ssl._create_unverified_context - - -dtpt = re.compile(r"^\d{1,2}\.\d{1,2}\.\d{4}$") -isodate = re.compile(r"^[0-9]{4}-[0-9]{2}-[0-9]{2}$") -isodatetime = re.compile(r"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$") +import urllib.error -def fix_date(s): - if s is None or len(s) == 0: - return None +CACHE_DIR = "cache" +START_YEAR, START_MONTH = 2024, 2 - if isodate.match(s) is not None: - return dt.date.fromisoformat(s).isoformat() - if isodatetime.match(s) is not None: - return dt.datetime.fromisoformat(s).isoformat() - if dtpt.match(s) is not None: - d, m, y = map(int, s.split(".")) - return f"{y}-{m:02d}-{d:02d}" - else: - return datetime.strptime(s, "%d.%m.%Y %H:%M:%S").isoformat() +# TODO(PR): +# - rozdelit VZ tabulku na vic tabulek (jsou tam obrovsky JSONB sloupce) +# - opravit db sloupce, at nemaj tak dlouhy nazvy - v pg je to problem -# '000 23 234' - takhle se obcas zadavaj ICO -def fix_ico(s): - if s is None or len(s) == 0: - return None - elif s.isdigit(): - rv = int(s) - elif s.startswith("CZ") and s[2:].isdigit(): # CZ00000205 - rv = int(s[2:]) - else: - try: - rv = int(s.replace(" ", "").replace("\xa0", "")) - except ValueError: - return None +@contextmanager +def read_url(url): + if not os.path.exists(CACHE_DIR): + os.mkdir(CACHE_DIR) - if rv < 100 * 10**6: - return rv - else: - return None + url_hash = hashlib.sha256(url.encode("utf-8")).hexdigest() + cache_filename = os.path.join(CACHE_DIR, f"{url_hash}") + if os.path.exists(cache_filename): + print(f"Nahravam z cache {url}") + with open(cache_filename, "rb") as cached_file: + yield cached_file + return -@contextmanager -def read_url(url): request = Request(url, headers={"Accept-Encoding": "gzip"}) with urlopen(request, timeout=60) as r: - assert r.headers.get("Content-Encoding") == "gzip" - yield gzip.open(r) - - -root_url = "https://isvz.nipez.cz/sites/default/files/content/opendata-predchozi/" -url_sources = { - "zzvz": ( - root_url + "ODZZVZ/{}.xml", - list(range(2016, 2024 + 1)), - ), - "vvz": ( - root_url + "ODVVZ/{}.xml", - list(range(2006, 2016 + 1)), - ), - "etrziste": ( - root_url + "ODET/{}.xml", - list(range(2012, 2017 + 1)), - ), -} + with open(cache_filename, "wb") as cache_file: + shutil.copyfileobj(r, cache_file) + + with read_url(url) as cached_file: + yield cached_file def main(outdir: str, partial: bool = False): cdir = os.path.dirname(os.path.abspath(__file__)) with open(os.path.join(cdir, "mapping.json"), encoding="utf-8") as f: - allmaps = json.load(f) - - assert list(allmaps.keys()) == ["etrziste", "vvz", "zzvz"] - - for ds, mapping in allmaps.items(): - filehandles, csvwriters = {}, {} - - for v in mapping.values(): - full_ds = f"{ds}_{v['table']}" - tfn = os.path.join(outdir, f"{full_ds}.csv") - filehandles[full_ds] = open(tfn, "w", encoding="utf8") - csvwriters[full_ds] = csv.DictWriter( - filehandles[full_ds], - fieldnames=v["header"], - lineterminator="\n", - ) - csvwriters[full_ds].writeheader() - - base_url, years = url_sources[ds] - - for year in years: - if partial and year != years[-1]: - continue - print(ds, year) - url = base_url.format(year) - with read_url(url) as resp: - for action, element in iterparse(resp): - assert action == "end" - if element.tag not in mapping: - continue - mp = mapping[element.tag] - full_ds = f"{ds}_{mp['table']}" - - row = { - el.tag: el.text.strip() if el.text else None - for el in element.getchildren() - } - - for k, v in row.items(): - if k in mp.get("dates", []): - row[k] = fix_date(v) - if v and k in mp.get("numeric", []): - row[k] = v.replace(",", ".") - if "ICO" in k: - ico = fix_ico(v) - if ico is None and v is not None: - print("nevalidni ico", v, f"({full_ds}, {url})") - row[k] = ico - if k == "OteviraniNabidekDatumCas" and v and "-" not in v: - print("nevalidni datum/cas", v) - row[k] = None - - csvwriters[full_ds].writerow(row) - - element.clear() - - for fh in filehandles.values(): - fh.close() + mp = json.load(f) + + for _, mapping in mp.items(): + base_url = mapping["base_url"] + key = mapping["key"] + header = mapping["srcheader"] + sheader = set(header) + dbheader = mapping["dbheader"] + + tdir = os.path.join(outdir, key) + os.makedirs(tdir, exist_ok=True) + + for idx in range(0, 100 if not partial else 1): + year = START_YEAR + (START_MONTH + idx - 1) // 12 + month = (START_MONTH + idx - 1) % 12 + 1 + URL = base_url.format(year=year, month=month) + logging.info("Nahravam %s", URL) + + fn = os.path.join(tdir, os.path.splitext(os.path.basename(URL))[0] + ".csv") + # break in case of 404 + try: + with read_url(URL) as f, open(fn, "wt", encoding="utf-8") as fw: + cw = csv.DictWriter(fw, fieldnames=dbheader) + cw.writeheader() + data = json.load(f) + # VZ 08-2025 ma najednou klic Data :shrug: + for rel in data.get("data", data.get("Data", [])): + el = {k.lower(): v for k, v in rel[key].items()} + # neni v datech zadny sloupec navic (ale muze jich byt mene) + if (set(el.keys()) - sheader) != set(): + breakpoint() + assert (set(el.keys()) - sheader) == set(), ( + set(el.keys()) - sheader + ) + row = {dk: el.get(sk) for sk, dk in zip(header, dbheader)} + + for k, v in row.items(): + if isinstance(v, (list, dict)): + row[k] = json.dumps(v, ensure_ascii=False) + cw.writerow(row) + except urllib.error.HTTPError as e: + if e.code != 404: + raise + logging.info("Chybi data pro %04d-%02d, koncim", year, month) + break if __name__ == "__main__": diff --git a/data/zakazky/mapping.json b/data/zakazky/mapping.json index 5bd359a..6e05693 100644 --- a/data/zakazky/mapping.json +++ b/data/zakazky/mapping.json @@ -1,404 +1,295 @@ { - "etrziste": { - "CastiVZ": { - "table": "casti_vz", - "header": [ - "VZsystemoveCislo", - "CastVZcislo", - "SmluvniCenaVcetneDPH", - "SmluvniCenaBezDPH", - "SmluvniCenaSazbaDPH", - "SmluvniCenaMena" - ], - "numeric": [ - "SmluvniCenaBezDPH", - "SmluvniCenaVcetneDPH" - ] - }, - "PolozkyVZ": { - "table": "polozky_vz", - "header": [ - "VZsystemoveCislo", - "NIPEZkod", - "NIPEZnazev", - "NIPEZpovinnostProEtrziste", - "NIPEZnazevVlastnosti", - "NIPEZdatovyTypVlastnosti", - "NIPEZhodnotaVlastnosti", - "NIPEZmernaJednotkaVlastnosti", - "NIPEZoperatorVlastnosti" - ], - "numeric": "NIPEZhodnotaVlastnosti" - }, - "Kriteria": { - "table": "kriteria_vz", - "header": [ - "VZsystemoveCislo", - "DilciHodnoticiKriterium", - "DilciHodnoticiKriteriumVaha", - "DilciKriteriumCiselneVyjadritelne", - "DilciKriteriumPredmetemEaukce", - "DilciKriteriumZadavatelPozadovalVlozeniNabidkovychHodnot", - "SubkriteriumNabidkoveCeny", - "SubkriteriumNabidkoveCenyVaha", - "SubkriteriumDilcihoKriteria", - "SubkriteriumDilcihoKriteriaVaha", - "SubkriteriumCiselneVyjadritelne", - "SubkriteriumPredmetemEaukce", - "SubkriteriumZadavatelPozadovalVlozeniNabidkovychHodnot" - ] - }, - "ViceDodavatelu": { - "table": "dodavatele", - "header": [ - "VZsystemoveCislo", - "CastVZcislo", - "DatumUzavreniSmlouvy", - "DodavatelUredniNazev", - "DodavatelICO", - "DodavatelStat" - ] - }, - "Zakazky": { - "table": "vz", - "header": [ - "NazevEtrziste", - "VZsystemoveCislo", - "NazevVZ", - "VZstav", - "VZdruh", - "VZtyp", - "DruhZadavaciRizeni", - "PredpokladanaHodnotaVZ", - "CelkovaSmluvniCenaBezDPH", - "CelkovaSmluvniCenaVcetneDPH", - "CelkovaSmluvniCenaMena", - "ZadavatelNazev", - "ZadavatelICO", - "ZadavatelKategorie", - "VysledekZadavacihoRizeni", - "DatumUzavreniSmlouvy", - "DelenaNaCasti", - "PocetCasti", - "PocetPolozekVZ", - "MetodaHodnoceni", - "ZakladniHodnoticiKriterium", - "ZruseniVZ", - "DatumZruseniZadavacihoRizeni", - "BylaDoZRzarazenaEaukce", - "PocetVyzvanychDodavatelu", - "PocetObdrzenychNabidek", - "PocetHodnocenychNabidek", - "NamitkyPocet", - "NamitkyVyhoveno", - "PrezkumUkonu", - "PrezkumnychRizeniPocet", - "ZadostioDodatecneInformacePocet", - "DodavatelNazev", - "DodavatelICO" - ], - "numeric": [ - "CelkovaSmluvniCenaBezDPH", - "CelkovaSmluvniCenaVcetneDPH", - "PredpokladanaHodnotaVZ" - ], - "dates": [ - "DatumUzavreniSmlouvy", - "DatumZruseniZadavacihoRizeni" - ] - } + "VZ": { + "base_url": "https://isvz.nipez.cz/sites/default/files/content/opendata-rvz/VZ-{month:02d}-{year}.json", + "key": "verejna_zakazka", + "srcheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "interniidentifikatorverejnezakazkypridelenyzadavatelem", + "nazev_verejne_zakazky", + "predpokladana_hodnota_bez_dph_v_czk", + "predpokladana_hodnota_bez_dph", + "predpokladana_hodnota_bez_dph_mena", + "predpokladana_hodnota_bude_uverejnena", + "predpokladana_hodnota_vsech_verejnych_zakazek_ktere_mohou_byt_zadany_na_zaklade_ramcove_dohody_bez_dph_v_czk", + "predpokladana_hodnota_vsech_verejnych_zakazek_ktere_mohou_byt_zadany_na_zaklade_ramcove_dohody_bez_dph", + "predpokladana_hodnota_vsech_verejnych_zakazek_ktere_mohou_byt_zadany_na_zaklade_ramcove_dohody_bez_dph_mena", + "druh_verejne_zakazky", + "vedlejsi_druhy_verejne_zakazky", + "rezim_verejne_zakazky", + "rezim_dle_volby_zadavatele", + "predmet", + "oduvodneni_nerozdeleni_nadlimitni_verejne_zakazky_na_casti", + "typ_verejne_zakazky_dle_vyse_predpokladane_hodnoty", + "hodnoty_koncese", + "casti_verejne_zakazky", + "zadavaci_postupy" + ], + "dbheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "interniidentifikatorverejnezakazkypridelenyzadavatelem", + "nazev_verejne_zakazky", + "predpokladana_hodnota_bez_dph_v_czk", + "predpokladana_hodnota_bez_dph", + "predpokladana_hodnota_bez_dph_mena", + "predpokladana_hodnota_bude_uverejnena", + "predp_hodnota_vz__ramcove_dohody_bez_dph_v_czk", + "predp_hodnota_vz__ramcove_dohody_bez_dph", + "predp_hodnota_vz__ramcove_dohody_bez_dph_mena", + "druh_verejne_zakazky", + "vedlejsi_druhy_verejne_zakazky", + "rezim_verejne_zakazky", + "rezim_dle_volby_zadavatele", + "predmet", + "oduvodneni_nerozdeleni_nadlimitni_verejne_zakazky_na_casti", + "typ_verejne_zakazky_dle_vyse_predpokladane_hodnoty", + "hodnoty_koncese", + "casti_verejne_zakazky", + "zadavaci_postupy" + ] }, - "vvz": { - "CastiVerejneZakazky": { - "table": "casti_vz", - "header": [ - "EvidencniCisloVZnaVVZ", - "CisloFormulareNaVVZ", - "CisloCastiZadaniVZ", - "NazevCastiVZ", - "DatumZadaniVZ", - "PocetObdrzenychNabidek", - "DodavatelNazev", - "DodavatelICOZeZadani", - "DodavatelPostovniAdresa", - "DodavatelObec", - "DodavatelPSC", - "DodavatelStat", - "DodavatelWww", - "PuvodniOdhadovanaCelkovaHodnotaVZ", - "PuvodniOdhadovanaCelkovaHodnotaVZMena", - "PuvodniOdhadovanaCelkovaHodnotaVZsazbaDPH", - "PuvodniOdhadovanaCelkovaHodnotaVZprocentniSazbaDPH", - "CelkovaKonecnaHodnotaVZzaZadani", - "CelkovaKonecnaHodnotaVZmenaZaZadani", - "CelkovaKonecnaHodnotaVZSazbaDPHzaZadani", - "CelkovaKonecnaHodnotaVZprocentniSazbaDPHzaZadani", - "HodnotaNejnizsiNabidky", - "HodnotaNejnizsiNabidkyMena", - "HodnotaNejnizsiNabidkySazbaDPH", - "HodnotaNejnizsiNabidkyProcentniSazbaDPH", - "RocniCiMesicniHodnotaPocetRoku", - "RocniCiMesicniHodnotaPocetMesicu", - "SubdodavkyHodnotaBezDPH", - "SubdodavkyMena", - "SubdodavkyPomer", - "PlatnyFormular" - ], - "dates": [ - "DatumZadaniVZ" - ] - }, - "VerejnaZakazka": { - "table": "vz", - "header": [ - "EvidencniCisloVZnaVVZ", - "CisloFormulareNaVVZ", - "DruhFormulare", - "TypFormulare", - "VZdelenaNaCasti", - "ZadavatelICO", - "DodavatelICO", - "LimitVZ", - "DatumOdeslaniFormulareNaVVZ", - "DatumUverejneni", - "ZadavatelUredniNazev", - "ZadavatelDruh", - "ZadavatelHlavniPredmetCinnosti", - "ZadavatelZadavaJmenemJinych", - "NazevVZ", - "DruhVZ", - "KategorieSluzeb", - "HlavniMistoPlneni", - "StrucnyPopisVZ", - "CPVhlavni", - "CPVdoplnkovy1", - "CPVdoplnkovy2", - "DruhyPredmetCPVhlavni", - "DruhyPredmetCPVdoplnkovy1", - "DruhyPredmetCPVdoplnkovy2", - "TretiPredmetCPVhlavni", - "TretiPredmetCPVdoplnkovy1", - "TretiPredmetCPVdoplnkovy2", - "CtvrtyPredmetCPVhlavni", - "CtvrtyPredmetCPVdoplnkovy1", - "CtvrtyPredmetCPVdoplnkovy2", - "PatyPredmetCPVhlavni", - "PatyPredmetCPVdoplnkovy1", - "PatyPredmetCPVdoplnkovy2", - "NaVZseVztahujeGPA", - "CelkovaKonecnaHodnotaVZ", - "CelkovaKonecnaHodnotaVZmena", - "CelkovaKonecnaHodnotaVZsazbaDPH", - "CelkovaKonecnaHodnotaVZprocentniSazbaDPH", - "NejnizsiNabidkaVzataVuvahu", - "NejnizsiNabidkaVzataVuvahuMena", - "NejnizsiNabidkaVzataVuvahuSazbaDPH", - "NejnizsiNabidkaVzataVuvahuProcentniSazbaDPH", - "NejvyssiNabidkaVzataVuvahu", - "DruhRizeni", - "HlavniKriteriaProZadaniZakazky", - "Kriterium1", - "VahaKriteria1", - "Kriterium2", - "VahaKriteria2", - "Kriterium3", - "VahaKriteria3", - "Kriterium4", - "VahaKriteria4", - "Kriterium5", - "VahaKriteria5", - "Kriterium6", - "VahaKriteria6", - "Kriterium7", - "VahaKriteria7", - "Kriterium8", - "VahaKriteria8", - "Kriterium9", - "VahaKriteria9", - "Kriterium10", - "VahaKriteria10", - "BylaPouzitaElektronickaDrazba", - "ZakazkaSeVztahujeKprojektuFinZes", - "ProjektyCiprogramy", - "OdhadovanaHodnotaVZbezDPH", - "OdhadovanaHodnotaVZmena", - "OdhadovanaHodnotaVZrozsahOd", - "OdhadovanaHodnotaVZrozsahDo", - "OdhadovanaHodnotaVZrozsahMena", - "PlatnyFormular" - ], - "dates": [ - "DatumOdeslaniFormulareNaVVZ", - "DatumUverejneni" - ] - } + "DNS": { + "base_url": "https://isvz.nipez.cz/sites/default/files/content/opendata-rvz/DNS-{month:02d}-{year}.json", + "key": "dynamicky_nakupni_system", + "srcheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "interni_identifikator_dynamickeho_nakupniho_systemu_prideleny_zadavatelem", + "evidencni_cislo_ve_vestniku_verejnych_zakazek", + "nazev_dynamickeho_nakupniho_systemu", + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_dph_v_czk", + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_dph", + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_dph_mena", + "predpokladana_hodnota_bude_uverejnena", + "url", + "druh_verejne_zakazky", + "rezim_verejne_zakazky", + "rezim_dle_volby_zadavatele", + "zadavaci_postup_pro_zavedeni_dynamickeho_nakupniho_systemu", + "predmet_verejne_zakazky_zadavany_v_dynamickem_nakupnim_systemu", + "kriteria_kvalifikace", + "verejna_zakazka_je_alespon_castecne_financovana_z_prostredku_evropske_unie", + "informace_o_financnich_prostredcich_eu", + "kategorie_dynamickeho_nakupniho_systemu", + "doba_trvani", + "vedlejsi_druhy_verejne_zakazky", + "dodavatele_zadajici_o_ucast_v_dynamickem_nakupnim_systemu", + "ucastnici_zarazeni_do_dynamickeho_nakupniho_systemu", + "kriterium_pro_hodnoceni_nabidek", + "informace_o_otevirani_podani_v_zadavacim_postupu_pro_zavedeni_dynamickeho_nakupniho_systemu", + "predmet", + "evidencni_cislo_zadavaciho_postupu_ve_vestniku_verejnych_zakazek", + "url" + ], + "dbheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "interni_identifikator_dynamickeho_nakupniho_systemu_prideleny_zadavatelem", + "evidencni_cislo_ve_vestniku_verejnych_zakazek", + "nazev_dynamickeho_nakupniho_systemu", + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_dph_v_czk", + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_dph", + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_dph_mena", + "predpokladana_hodnota_bude_uverejnena", + "url", + "druh_verejne_zakazky", + "rezim_verejne_zakazky", + "rezim_dle_volby_zadavatele", + "zadavaci_postup_pro_zavedeni_dynamickeho_nakupniho_systemu", + "predmet_verejne_zakazky_zadavany_v_dynamickem_nakupnim_systemu", + "kriteria_kvalifikace", + "verejna_zakazka_je_alespon_castecne_financovana_z_prostredku_evropske_unie", + "informace_o_financnich_prostredcich_eu", + "kategorie_dynamickeho_nakupniho_systemu", + "doba_trvani", + "vedlejsi_druhy_verejne_zakazky", + "dodavatele_zadajici_o_ucast_v_dynamickem_nakupnim_systemu", + "ucastnici_zarazeni_do_dynamickeho_nakupniho_systemu", + "kriterium_pro_hodnoceni_nabidek", + "informace_o_otevirani_podani_v_zadavacim_postupu_pro_zavedeni_dynamickeho_nakupniho_systemu", + "predmet", + "evidencni_cislo_zadavaciho_postupu_ve_vestniku_verejnych_zakazek" + ] }, - "zzvz": { - "Zadani": { - "table": "zadani_vz", - "header": [ - "IDZakazky", - "EvidencniCisloVZnaVVZ", - "CisloFormulareNaVVZ", - "DruhFormulare", - "IDZadani", - "CisloCastiZadaniVZ", - "NazevCastiVZ", - "ZadaniCastiZakazky", - "InformaceONezadaniCastiZakazky", - "DatumZadaniVZ", - "PocetObdrzenychNabidek", - "PuvodniOdhadovanaCelkovaHodnotaVZ", - "PuvodniOdhadovanaCelkovaHodnotaVZMena", - "CelkovaKonecnaHodnotaVZzaZadani", - "CelkovaKonecnaHodnotaVZmenaZaZadani", - "HodnotaNejnizsiNabidky", - "HodnotaNejnizsiNabidkyMena", - "HodnotaNejvyssiNabidky", - "SubdodavkyHodnotaBezDPH", - "SubdodavkyMena", - "SubdodavkyPomer", - "DatumOdeslaniFormulareNaVVZ", - "PlatnyFormular" - ], - "dates": [ - "DatumZadaniVZ", - "DatumOdeslaniFormulareNaVVZ" - ] - }, - "CastiVZ": { - "table": "casti_vz", - "header": [ - "IDZakazky", - "EvidencniCisloVZnaVVZ", - "CisloFormulareNaVVZ", - "DruhFormulare", - "IDCastiVZ", - "CisloCastiVZ", - "NazevCastiVZ", - "PopisCastiVZ", - "PredpokladanaCelkovaHodnotaCastiVZ", - "PredpokladanaCelkovaHodnotaCastiVZMena", - "HlavniMistoPlneniNUTS", - "HlavniMistoPlneni", - "CPVkod", - "ZakazkaSeVztahujeKprojektuFinZes", - "ProjektyCiProgramyFinZes", - "DatumOdeslaniFormulareNaVVZ", - "PlatnyFormular" - ], - "dates": [ - "DatumOdeslaniFormulareNaVVZ" - ] - }, - "Dodavatele": { - "table": "dodavatele", - "header": [ - "IDZakazky", - "EvidencniCisloVZnaVVZ", - "CisloFormulareNaVVZ", - "DruhFormulare", - "IDZadani", - "CisloCastiZadaniVZ", - "NazevCastiVZ", - "DodavatelICO", - "DodavatelNazev", - "DodavatelPostovniAdresa", - "DodavatelObec", - "DodavatelPSC", - "DodavatelStat", - "DodavatelWww", - "DatumOdeslaniFormulareNaVVZ", - "PlatnyFormular" - ], - "dates": [ - "DatumOdeslaniFormulareNaVVZ" - ] - }, - "VZ": { - "table": "vz", - "header": [ - "IDZakazky", - "EvidencniCisloVZnaVVZ", - "CisloFormulareNaVVZ", - "DruhFormulare", - "TypFormulare", - "VZdelenaNaCasti", - "ZadavatelICO", - "LimitVZ", - "DatumOdeslaniFormulareNaVVZ", - "DatumUverejneni", - "ZadavatelUredniNazev", - "ZadavatelDruh", - "ZadavatelHlavniPredmetCinnosti", - "ZakazkaZahrnujeSpolecneZadavaniZakazek", - "ZakazkuZadavaCentralniZadavatel", - "ZadavatelProfilURL", - "ZadavatelProfilURLPlatnost", - "ZadavatelProfilZruseniTyp", - "ZadavatelProfilURLNova", - "DatumZruseniCiZneaktivneniProfilu", - "NazevVZ", - "DruhVZ", - "StrucnyPopisVZ", - "CPVhlavni", - "CPVdoplnkovy1", - "NaVZseVztahujeGPA", - "CelkovaKonecnaHodnotaVZ", - "CelkovaKonecnaHodnotaVZmena", - "NejnizsiNabidkaVzataVuvahu", - "NejnizsiNabidkaVzataVuvahuMena", - "NejvyssiNabidkaVzataVuvahu", - "DruhRizeni", - "BylaPouzitaElektronickaDrazba", - "OdhadovanaHodnotaVZbezDPH", - "OdhadovanaHodnotaVZmena", - "ZadavatelKontaktniOsoba", - "ZadavatelEmail", - "ZadavatelTelefon", - "LhutaProDoruceniNabidek", - "OteviraniNabidekDatumCas", - "OteviraniNabidekMisto", - "OteviraniNabidekOpravneneOsobyDalsiInfo", - "UchazecVazanNabidkouDo", - "UchazecVazanNabidkouDobaMesice", - "PlatnyFormular", - "PravidelnePredbezneOznameni", - "PravidelnePredbezneOznameniVyzvaKSoutezi", - "PredbezneOznameni", - "PredbezneOznameniVyzvaKSoutezi", - "SystemKvalifikace", - "SystemKvalifikaceVyzvaKSoutezi", - "OznameniOZahajeniZR", - "OznameniOVysledkuZR", - "OznameniOVysledkuKS" - ], - "dates": [ - "DatumOdeslaniFormulareNaVVZ", - "DatumUverejneni", - "DatumZruseniCiZneaktivneniProfilu" - ] - }, - "HodnoticiKriteria": { - "table": "kriteria_vz", - "header": [ - "IDZakazky", - "IDPopisuCastiZakazky", - "EvidencniCisloVZnaVVZ", - "CisloFormulareNaVVZ", - "DruhFormulare", - "CisloCastiVZ", - "NazevCastiVZ", - "PoradiKriteria", - "KriteriumZadaniZakazky", - "NazevKriteria", - "VahaKriteria", - "DatumOdeslaniFormulareNaVVZ", - "PlatnyFormular" - ], - "dates": [ - "DatumOdeslaniFormulareNaVVZ" - ] - } + "SON": { + "base_url": "https://isvz.nipez.cz/sites/default/files/content/opendata-rvz/SON-{month:02d}-{year}.json", + "key": "soutez_o_navrh", + "srcheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "interni_identifikator_souteze_o_navrh_prideleny_zadavatelem", + "identifikator_celex_pravniho_predpisu_eu", + "zadavatel_zadavaciho_postupu", + "evidencni_cislo_ve_vvz", + "nazev_souteze_o_navrh", + "stav", + "kategorie_zadavaciho_postupu", + "druh_zadavaciho_postupu", + "pravni_predpis_eu_na_zaklade_nehoz_probiha_zadavaci_postup", + "pravni_predpis_eu", + "datum_zahajeni_zadavaciho_postupu", + "datum_ukonceni_zadavaciho_postupu", + "evidence_vysledku_zadavaciho_postupu", + "udeleni_cen_odmen_nebo_jinych_plateb", + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb", + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb_mena", + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb_bude_uverejnena", + "dalsi_informace_v_souvislosti_s_odmenami", + "ocenovane_umisteni", + "pocet_podanych_navrhu", + "pocet_zaslanych_zaevidovanych_vysvetleni_souteznich_podminek", + "presne_informace_o_lhutach_pro_prezkumna_rizeni", + "dalsi_informace", + "soutez_o_navrh_a_navazujici_verejna_zakazka_jsou_alespon_castecne_financovany_z_prostredku_evropske_unie", + "ucastnici_zadavaciho_postupu", + "ucastnici_jimz_zanikla_ucast_v_zadavacim_postupu", + "vysledek_zadavaciho_postupu", + "podane_soutezni_navrhy", + "pravidla_pro_hodnoceni_souteznich_navrhu", + "kriteria_kvalifikace", + "namitky", + "lhuty", + "informace_o_otevirani_podani", + "specifikace_podani_souteznich_navrhu", + "informace_o_dalsi_fazi_uzsi_souteze_o_navrh", + "informace_o_souteznich_podminkach", + "spolecne_zadavani_zadavatelu_z_ruznych_statu", + "predmet_souteze_o_navrh", + "informace_o_financnich_prostredcich_eu", + "stret_zajmu", + "uverejnovaci_formulare", + "zadavani_inovaci", + "socialne_odpovedne_zadavani", + "environmentalni_zadavani", + "enviromentalni_zadavani_podle_kriterii", + "popis_odpovedneho_zadavani", + "informace_o_danovych_pravnich_predpisech", + "informace_o_pracovnepravnich_predpisech", + "informace_o_predpisech_v_oblasti_zivotniho_prostredi", + "nestandardni_stavy", + "dokumenty", + "informace_o_druhe_fazi_uzsi_souteze_o_navrh", + "vylouceni_ucastnici_kteri_podali_vybrany_navrh", + "kriteria_enviromentalnich_verejnych_zakazek", + "vylouceni_ucastnici_zadavaciho_postupu", + "evidencni_cislo_zadavaciho_postupu_ve_vestniku_verejnych_zakazek" + ], + "dbheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "interni_identifikator_souteze_o_navrh_prideleny_zadavatelem", + "identifikator_celex_pravniho_predpisu_eu", + "zadavatel_zadavaciho_postupu", + "evidencni_cislo_ve_vvz", + "nazev_souteze_o_navrh", + "stav", + "kategorie_zadavaciho_postupu", + "druh_zadavaciho_postupu", + "pravni_predpis_eu_na_zaklade_nehoz_probiha_zadavaci_postup", + "pravni_predpis_eu", + "datum_zahajeni_zadavaciho_postupu", + "datum_ukonceni_zadavaciho_postupu", + "evidence_vysledku_zadavaciho_postupu", + "udeleni_cen_odmen_nebo_jinych_plateb", + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb", + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb_mena", + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb_bude_uverejnena", + "dalsi_informace_v_souvislosti_s_odmenami", + "ocenovane_umisteni", + "pocet_podanych_navrhu", + "pocet_zaslanych_zaevidovanych_vysvetleni_souteznich_podminek", + "presne_informace_o_lhutach_pro_prezkumna_rizeni", + "dalsi_informace", + "soutez_o_navrh_a_navazujici_verejna_zakazka_jsou_alespon_castecne_financovany_z_prostredku_evropske_unie", + "ucastnici_zadavaciho_postupu", + "ucastnici_jimz_zanikla_ucast_v_zadavacim_postupu", + "vysledek_zadavaciho_postupu", + "podane_soutezni_navrhy", + "pravidla_pro_hodnoceni_souteznich_navrhu", + "kriteria_kvalifikace", + "namitky", + "lhuty", + "informace_o_otevirani_podani", + "specifikace_podani_souteznich_navrhu", + "informace_o_dalsi_fazi_uzsi_souteze_o_navrh", + "informace_o_souteznich_podminkach", + "spolecne_zadavani_zadavatelu_z_ruznych_statu", + "predmet_souteze_o_navrh", + "informace_o_financnich_prostredcich_eu", + "stret_zajmu", + "uverejnovaci_formulare", + "zadavani_inovaci", + "socialne_odpovedne_zadavani", + "environmentalni_zadavani", + "enviromentalni_zadavani_podle_kriterii", + "popis_odpovedneho_zadavani", + "informace_o_danovych_pravnich_predpisech", + "informace_o_pracovnepravnich_predpisech", + "informace_o_predpisech_v_oblasti_zivotniho_prostredi", + "nestandardni_stavy", + "dokumenty", + "informace_o_druhe_fazi_uzsi_souteze_o_navrh", + "vylouceni_ucastnici_kteri_podali_vybrany_navrh", + "kriteria_enviromentalnich_verejnych_zakazek", + "vylouceni_ucastnici_zadavaciho_postupu", + "evidencni_cislo_zadavaciho_postupu_ve_vestniku_verejnych_zakazek" + ] + }, + "SK": { + "base_url": "https://isvz.nipez.cz/sites/default/files/content/opendata-rvz/SK-{month:02d}-{year}.json", + "key": "system_kvalifikace", + "srcheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "datum_zavedeni_systemu_kvalifikace", + "nazev_systemu_kvalifikace", + "predmet", + "platba_za_zarazeni_do_systemu_kvalifikace", + "vyse_platby_bez_dph", + "vyse_platby_s_dph", + "mena", + "kvalifikace", + "zadavatel_systemu_kvalifikace", + "kategorie_systemu_kvalifikace", + "dodavatele_zarazeni_do_systemu_kvalifikace", + "lhuty", + "doba_trvani", + "uverejnovaci_formulare" + ], + "dbheader": [ + "casova_znacka", + "identifikator_nipez", + "identifikator_v_elektronickem_nastroji", + "identifikatory_v_elektronickem_nastroji", + "datum_zavedeni_systemu_kvalifikace", + "nazev_systemu_kvalifikace", + "predmet", + "platba_za_zarazeni_do_systemu_kvalifikace", + "vyse_platby_bez_dph", + "vyse_platby_s_dph", + "mena", + "kvalifikace", + "zadavatel_systemu_kvalifikace", + "kategorie_systemu_kvalifikace", + "dodavatele_zarazeni_do_systemu_kvalifikace", + "lhuty", + "doba_trvani", + "uverejnovaci_formulare" + ] } } \ No newline at end of file diff --git a/data/zakazky/schema.py b/data/zakazky/schema.py index d1ab2a9..a31e200 100644 --- a/data/zakazky/schema.py +++ b/data/zakazky/schema.py @@ -2,8 +2,8 @@ from sqlalchemy.sql.sqltypes import ( Boolean, Date, + JSON, DateTime, - Integer, Numeric, SmallInteger, Text, @@ -13,369 +13,249 @@ schema = [ Table( - "etrziste_casti_vz", + "verejna_zakazka", meta, - Column("vz_systemove_cislo", Text, nullable=False), - Column("cast_vz_cislo", SmallInteger, nullable=False), - Column("smluvni_cena_vcetne_dph", Numeric(16, 2), nullable=True), - Column("smluvni_cena_bez_dph", Numeric(16, 2), nullable=True), - Column("smluvni_cena_sazba_dph", Numeric(16, 2), nullable=True), - Column("smluvni_cena_mena", Text, nullable=True), # TODO: enum? - ), - Table( - "etrziste_polozky_vz", - meta, - Column("vz_systemove_cislo", Text, nullable=False), - Column("nipez_kod", Text, nullable=True), - Column("nipez_nazev", Text, nullable=True), - Column("nipez_povinnost_pro_etrziste", Text, nullable=True), - Column("nipez_nazev_vlastnosti", Text, nullable=True), - Column("nipez_datovy_typ_vlastnosti", Text, nullable=True), - Column("nipez_hodnota_vlastnosti", Text, nullable=True), - Column("nipez_merna_jednotka_vlastnosti", Text, nullable=True), - Column("nipez_operator_vlastnosti", Text, nullable=True), - ), - Table( - "etrziste_kriteria_vz", - meta, - Column("vz_systemove_cislo", Text, nullable=False), - Column("dilci_hodnotici_kriterium", Text, nullable=False), - Column("dilci_hodnotici_kriterium_vaha", Numeric(5, 2), nullable=False), - Column("dilci_kriterium_ciselne_vyjadritelne", Text, nullable=True), - Column("dilci_kriterium_predmetem_eaukce", Text, nullable=True), + Column("casova_znacka", DateTime, nullable=False), + Column("identifikator_NIPEZ", Text, nullable=False, index=True), + Column("identifikator_v_elektronickem_nastroji", Text, nullable=True), + Column("identifikatory_v_elektronickem_nastroji", JSON, nullable=False), Column( - "dilci_kriterium_zadavatel_pozadoval_vlozeni_nabidkovych_hodnot", + "interniIdentifikatorVerejneZakazkyPridelenyZadavatelem", Text, nullable=True, ), - Column("subkriterium_nabidkove_ceny", Text, nullable=True), - Column("subkriterium_nabidkove_ceny_vaha", Numeric(5, 2), nullable=True), - Column("subkriterium_dilciho_kriteria", Text, nullable=True), - Column("subkriterium_dilciho_kriteria_vaha", Numeric(5, 2), nullable=True), - Column("subkriterium_ciselne_vyjadritelne", Text, nullable=True), - Column("subkriterium_predmetem_eaukce", Text, nullable=True), + Column("nazev_verejne_zakazky", Text, nullable=False), + Column("predpokladana_hodnota_bez_DPH_v_CZK", Numeric(16, 2), nullable=True), + Column("predpokladana_hodnota_bez_DPH", Numeric(16, 2), nullable=True), + Column("predpokladana_hodnota_bez_DPH_mena", Text, nullable=True), + Column("predpokladana_hodnota_bude_uverejnena", Boolean, nullable=True), + Column( + "predp_hodnota_vz__ramcove_dohody_bez_DPH_v_CZK", + Numeric(16, 2), + nullable=True, + ), + Column( + "predp_hodnota_vz__ramcove_dohody_bez_DPH", + Numeric(16, 2), + nullable=True, + ), Column( - "subkriterium_zadavatel_pozadoval_vlozeni_nabidkovych_hodnot", + "predp_hodnota_vz__ramcove_dohody_bez_DPH_mena", Text, nullable=True, ), + Column("druh_verejne_zakazky", Text, nullable=True), + Column("vedlejsi_druhy_verejne_zakazky", JSON, nullable=False), + Column("rezim_verejne_zakazky", Text, nullable=True), + Column("rezim_dle_volby_zadavatele", Text, nullable=True), + Column("predmet", JSON, nullable=False), + Column( + "oduvodneni_nerozdeleni_nadlimitni_verejne_zakazky_na_casti", + Text, + nullable=True, + ), + Column( + "typ_verejne_zakazky_dle_vyse_predpokladane_hodnoty", Text, nullable=True + ), + Column("hodnoty_koncese", JSON, nullable=False), + # TODO: splitni tohle do zvlast tabulky + Column("casti_verejne_zakazky", JSON, nullable=False), + Column("zadavaci_postupy", Text, nullable=False), ), Table( - "etrziste_dodavatele", - meta, - Column("vz_systemove_cislo", Text, nullable=False), - Column("cast_vz_cislo", SmallInteger, nullable=False), - Column("datum_uzavreni_smlouvy", DateTime, nullable=True), - Column("dodavatel_uredni_nazev", Text, nullable=False), - Column("dodavatel_ico", Integer, nullable=True, index=True), - Column("dodavatel_stat", Text, nullable=False), - ), - Table( - "etrziste_vz", - meta, - Column("nazev_etrziste", Text, nullable=False), - Column("vz_systemove_cislo", Text, nullable=False), - Column("nazev_vz", Text, nullable=False), - Column("vz_stav", Text, nullable=False), - Column("vz_druh", Text, nullable=False), - Column("vz_typ", Text, nullable=True), - Column("druh_zadavaci_rizeni", Text, nullable=True), - Column("predpokladana_hodnota_vz", Numeric(16, 2), nullable=False), - Column("celkova_smluvni_cena_bez_dph", Numeric(16, 2), nullable=True), - Column("celkova_smluvni_cena_vcetne_dph", Numeric(16, 2), nullable=True), - Column("celkova_smluvni_cena_mena", Text, nullable=True), - Column("zadavatel_nazev", Text, nullable=False), - Column("zadavatel_ico", Integer, nullable=False, index=True), - Column("zadavatel_kategorie", Text, nullable=False), - Column("vysledek_zadavaciho_rizeni", Text, nullable=False), - Column("datum_uzavreni_smlouvy", Date, nullable=True), - Column("delena_na_casti", Text, nullable=False), - Column("pocet_casti", Text, nullable=True), - Column("pocet_polozek_vz", Text, nullable=False), - Column("metoda_hodnoceni", Text, nullable=False), - Column("zakladni_hodnotici_kriterium", Text, nullable=False), - Column("zruseni_vz", Text, nullable=True), - Column("datum_zruseni_zadavaciho_rizeni", Date, nullable=True), - Column("byla_do_zr_zarazena_eaukce", Text, nullable=True), - Column("pocet_vyzvanych_dodavatelu", Text, nullable=True), - Column("pocet_obdrzenych_nabidek", Text, nullable=True), - Column("pocet_hodnocenych_nabidek", Text, nullable=True), - Column("namitky_pocet", Text, nullable=True), - Column("namitky_vyhoveno", Text, nullable=True), - Column("prezkum_ukonu", Text, nullable=True), - Column("prezkumnych_rizeni_pocet", Text, nullable=True), - Column("zadosti_o_dodatecne_informace_pocet", Text, nullable=True), - Column("dodavatel_nazev", Text, nullable=True), - Column("dodavatel_ico", Integer, nullable=True, index=True), - ), - Table( - "vvz_casti_vz", + "dynamicky_nakupni_system", meta, - Column("evidencni_cislo_vz_na_vvz", Text, nullable=False), - Column("cislo_formulare_na_vvz", Text, nullable=True), - Column("cislo_casti_zadani_vz", Text, nullable=True), - Column("nazev_casti_vz", Text, nullable=True), - Column("datum_zadani_vz", Date, nullable=True), - Column("pocet_obdrzenych_nabidek", Integer, nullable=True), - Column("dodavatel_nazev", Text, nullable=True), - Column("dodavatel_ico_ze_zadani", Integer, nullable=True, index=True), - Column("dodavatel_postovni_adresa", Text, nullable=True), - Column("dodavatel_obec", Text, nullable=True), - Column("dodavatel_psc", Text, nullable=True), - Column("dodavatel_stat", Text, nullable=True), - Column("dodavatel_www", Text, nullable=True), - Column("puvodni_odhadovana_celkova_hodnota_vz", Numeric(16, 2), nullable=True), - Column("puvodni_odhadovana_celkova_hodnota_vz_mena", Text, nullable=True), - Column("puvodni_odhadovana_celkova_hodnota_vz_sazba_dph", Text, nullable=True), + Column("casova_znacka", DateTime, nullable=False), + Column("identifikator_NIPEZ", Text, nullable=False, index=True), + Column("identifikator_v_elektronickem_nastroji", Text, nullable=True), + Column("identifikatory_v_elektronickem_nastroji", JSON, nullable=False), + Column( + "interni_identifikator_dynamickeho_nakupniho_systemu_prideleny_zadavatelem", + Text, + nullable=True, + ), + Column("evidencni_cislo_ve_Vestniku_verejnych_zakazek", Text, nullable=True), + Column("nazev_dynamickeho_nakupniho_systemu", Text, nullable=False), Column( - "puvodni_odhadovana_celkova_hodnota_vz_procentni_sazba_dph", - Numeric(4, 2), + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_DPH_v_CZK", + Numeric(16, 2), nullable=True, ), - Column("celkova_konecna_hodnota_vz_za_zadani", Text, nullable=True), - Column("celkova_konecna_hodnota_vz_mena_za_zadani", Text, nullable=True), - Column("celkova_konecna_hodnota_vz_sazba_dph_za_zadani", Text, nullable=True), Column( - "celkova_konecna_hodnota_vz_procentni_sazba_dph_za_zadani", + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_DPH", + Numeric(16, 2), + nullable=True, + ), + Column( + "predpokladana_hodnota_dynamickeho_nakupniho_systemu_bez_DPH_mena", Text, nullable=True, ), - Column("hodnota_nejnizsi_nabidky", Numeric(16, 2), nullable=True), - Column("hodnota_nejnizsi_nabidky_mena", Text, nullable=True), - Column("hodnota_nejnizsi_nabidky_sazba_dph", Text, nullable=True), + Column("predpokladana_hodnota_bude_uverejnena", Boolean, nullable=True), + Column("url", Text, nullable=True), + Column("druh_verejne_zakazky", Text, nullable=False), + Column("rezim_verejne_zakazky", Text, nullable=True), + Column("rezim_dle_volby_zadavatele", Text, nullable=True), Column( - "hodnota_nejnizsi_nabidky_procentni_sazba_dph", Numeric(4, 2), nullable=True + "zadavaci_postup_pro_zavedeni_dynamickeho_nakupniho_systemu", + Text, + nullable=False, ), - Column("rocni_ci_mesicni_hodnota_pocet_roku", Integer, nullable=True), - Column("rocni_ci_mesicni_hodnota_pocet_mesicu", Integer, nullable=True), - Column("subdodavky_hodnota_bez_dph", Numeric(16, 2), nullable=True), - Column("subdodavky_mena", Text, nullable=True), - Column("subdodavky_pomer", Numeric(5, 2), nullable=True), - Column("platny_formular", Boolean, nullable=False), - ), - Table( - "vvz_vz", - meta, - Column("evidencni_cislo_vz_na_vvz", Text, nullable=False), - Column("cislo_formulare_na_vvz", Text, nullable=True), - Column("druh_formulare", Text, nullable=False), - Column("typ_formulare", Text, nullable=False), - Column("vz_delena_na_casti", Text, nullable=True), - Column("zadavatel_ico", Integer, nullable=True, index=True), - Column("dodavatel_ico", Integer, nullable=True, index=True), - Column("limit_vz", Text, nullable=True), - Column("datum_odeslani_formulare_na_vvz", Date, nullable=False), - Column("datum_uverejneni", Date, nullable=False), - Column("zadavatel_uredni_nazev", Text, nullable=False), - Column("zadavatel_druh", Text, nullable=True), - Column("zadavatel_hlavni_predmet_cinnosti", Text, nullable=True), - Column("zadavatel_zadava_jmenem_jinych", Text, nullable=True), - Column("nazev_vz", Text, nullable=True), - Column("druh_vz", Text, nullable=True), - Column("kategorie_sluzeb", Text, nullable=True), - Column("hlavni_misto_plneni", Text, nullable=True), - Column("strucny_popis_vz", Text, nullable=True), - Column("cpv_hlavni", Text, nullable=True), - Column("cpv_doplnkovy1", Text, nullable=True), - Column("cpv_doplnkovy2", Text, nullable=True), - Column("druhy_predmet_cpv_hlavni", Text, nullable=True), - Column("druhy_predmet_cpv_doplnkovy1", Text, nullable=True), - Column("druhy_predmet_cpv_doplnkovy2", Text, nullable=True), - Column("treti_predmet_cpv_hlavni", Text, nullable=True), - Column("treti_predmet_cpv_doplnkovy1", Text, nullable=True), - Column("treti_predmet_cpv_doplnkovy2", Text, nullable=True), - Column("ctvrty_predmet_cpv_hlavni", Text, nullable=True), - Column("ctvrty_predmet_cpv_doplnkovy1", Text, nullable=True), - Column("ctvrty_predmet_cpv_doplnkovy2", Text, nullable=True), - Column("paty_predmet_cpv_hlavni", Text, nullable=True), - Column("paty_predmet_cpv_doplnkovy1", Text, nullable=True), - Column("paty_predmet_cpv_doplnkovy2", Text, nullable=True), - Column("na_vz_se_vztahuje_gpa", Text, nullable=True), - Column("celkova_konecna_hodnota_vz", Text, nullable=True), - Column("celkova_konecna_hodnota_vz_mena", Text, nullable=True), - Column("celkova_konecna_hodnota_vz_sazba_dph", Text, nullable=True), - Column("celkova_konecna_hodnota_vz_procentni_sazba_dph", Text, nullable=True), - Column("nejnizsi_nabidka_vzata_vuvahu", Text, nullable=True), - Column("nejnizsi_nabidka_vzata_vuvahu_mena", Text, nullable=True), - Column("nejnizsi_nabidka_vzata_vuvahu_sazba_dph", Text, nullable=True), Column( - "nejnizsi_nabidka_vzata_vuvahu_procentni_sazba_dph", Text, nullable=True + "predmet_verejne_zakazky_zadavany_v_dynamickem_nakupnim_systemu", + JSON, + nullable=True, + ), + Column("kriteria_kvalifikace", JSON, nullable=True), + Column( + "verejna_zakazka_je_alespon_castecne_financovana_z_prostredku_Evropske_unie", + Boolean, + nullable=True, + ), + Column("informace_o_financnich_prostredcich_EU", Text, nullable=False), + Column("kategorie_dynamickeho_nakupniho_systemu", Text, nullable=False), + Column("doba_trvani", Text, nullable=False), + Column("vedlejsi_druhy_verejne_zakazky", JSON, nullable=False), + Column( + "dodavatele_zadajici_o_ucast_v_dynamickem_nakupnim_systemu", + JSON, + nullable=False, + ), + Column( + "ucastnici_zarazeni_do_dynamickeho_nakupniho_systemu", JSON, nullable=False + ), + Column("kriterium_pro_hodnoceni_nabidek", JSON, nullable=False), + Column( + "informace_o_otevirani_podani_v_zadavacim_postupu_pro_zavedeni_dynamickeho_nakupniho_systemu", + Text, + nullable=True, + ), + Column("predmet", JSON, nullable=True), + Column( + "evidencni_cislo_zadavaciho_postupu_ve_vestniku_verejnych_zakazek", + Text, + nullable=True, ), - Column("nejvyssi_nabidka_vzata_vuvahu", Text, nullable=True), - Column("druh_rizeni", Text, nullable=True), - Column("hlavni_kriteria_pro_zadani_zakazky", Text, nullable=True), - Column("kriterium1", Text, nullable=True), - Column("vaha_kriteria1", Text, nullable=True), - Column("kriterium2", Text, nullable=True), - Column("vaha_kriteria2", Text, nullable=True), - Column("kriterium3", Text, nullable=True), - Column("vaha_kriteria3", Text, nullable=True), - Column("kriterium4", Text, nullable=True), - Column("vaha_kriteria4", Text, nullable=True), - Column("kriterium5", Text, nullable=True), - Column("vaha_kriteria5", Text, nullable=True), - Column("kriterium6", Text, nullable=True), - Column("vaha_kriteria6", Text, nullable=True), - Column("kriterium7", Text, nullable=True), - Column("vaha_kriteria7", Text, nullable=True), - Column("kriterium8", Text, nullable=True), - Column("vaha_kriteria8", Text, nullable=True), - Column("kriterium9", Text, nullable=True), - Column("vaha_kriteria9", Text, nullable=True), - Column("kriterium10", Text, nullable=True), - Column("vaha_kriteria10", Text, nullable=True), - Column("byla_pouzita_elektronicka_drazba", Text, nullable=True), - Column("zakazka_se_vztahuje_kprojektu_fin_zes", Text, nullable=True), - Column("projekty_ciprogramy", Text, nullable=True), - Column("odhadovana_hodnota_vz_bez_dph", Numeric(16, 2), nullable=True), - Column("odhadovana_hodnota_vz_mena", Text, nullable=True), - Column("odhadovana_hodnota_vz_rozsah_od", Numeric(16, 2), nullable=True), - Column("odhadovana_hodnota_vz_rozsah_do", Numeric(16, 2), nullable=True), - Column("odhadovana_hodnota_vz_rozsah_mena", Text, nullable=True), - Column("platny_formular", Boolean, nullable=False), - ), - Table( - "zzvz_zadani_vz", - meta, - Column("id_zakazky", Text, nullable=False), - Column("evidencni_cislo_vz_na_vvz", Text, nullable=False), - Column("cislo_formulare_na_vvz", Text, nullable=False), - Column("druh_formulare", Text, nullable=False), - Column("id_zadani", Text, nullable=False), - Column("cislo_casti_zadani_vz", Text, nullable=True), - Column("nazev_casti_vz", Text, nullable=True), - Column("zadani_casti_zakazky", Text, nullable=True), - Column("informace_o_nezadani_casti_zakazky", Text, nullable=True), - Column("datum_zadani_vz", DateTime, nullable=True), - Column("pocet_obdrzenych_nabidek", Text, nullable=True), - Column("puvodni_odhadovana_celkova_hodnota_vz", Numeric(16, 2), nullable=True), - Column("puvodni_odhadovana_celkova_hodnota_vz_mena", Text, nullable=True), - Column("celkova_konecna_hodnota_vz_za_zadani", Numeric(16, 2), nullable=True), - Column("celkova_konecna_hodnota_vz_mena_za_zadani", Text, nullable=True), - Column("hodnota_nejnizsi_nabidky", Numeric(16, 2), nullable=True), - Column("hodnota_nejnizsi_nabidky_mena", Text, nullable=True), - Column("hodnota_nejvyssi_nabidky", Numeric(16, 2), nullable=True), - Column("subdodavky_hodnota_bez_dph", Numeric(16, 2), nullable=True), - Column("subdodavky_mena", Text, nullable=True), - Column("subdodavky_pomer", Numeric(5, 2), nullable=True), - Column("datum_odeslani_formulare_na_vvz", DateTime, nullable=False), - Column("platny_formular", Boolean, nullable=False), - ), - Table( - "zzvz_casti_vz", - meta, - Column("id_zakazky", Text, nullable=False), - Column("evidencni_cislo_vz_na_vvz", Text, nullable=False), - Column("cislo_formulare_na_vvz", Text, nullable=True), - Column("druh_formulare", Text, nullable=False), - Column("id_casti_vz", Text, nullable=False), - Column("cislo_casti_vz", Text, nullable=True), - Column("nazev_casti_vz", Text, nullable=True), - Column("popis_casti_vz", Text, nullable=True), - Column("predpokladana_celkova_hodnota_casti_vz", Numeric(16, 2), nullable=True), - Column("predpokladana_celkova_hodnota_casti_vz_mena", Text, nullable=True), - Column("hlavni_misto_plneni_nuts", Text, nullable=True), - Column("hlavni_misto_plneni", Text, nullable=True), - Column("cpv_kod", Text, nullable=True), - Column("zakazka_se_vztahuje_kprojektu_fin_zes", Text, nullable=True), - Column("projekty_ci_programy_fin_zes", Text, nullable=True), - Column("datum_odeslani_formulare_na_vvz", DateTime, nullable=False), - Column("platny_formular", Boolean, nullable=False), - ), - Table( - "zzvz_dodavatele", - meta, - Column("id_zakazky", Text, nullable=False), - Column("evidencni_cislo_vz_na_vvz", Text, nullable=False), - Column("cislo_formulare_na_vvz", Text, nullable=False), - Column("druh_formulare", Text, nullable=False), - Column("id_zadani", Text, nullable=False), - Column("cislo_casti_zadani_vz", Text, nullable=True), - Column("nazev_casti_vz", Text, nullable=True), - Column("dodavatel_ico", Integer, nullable=True, index=True), - Column("dodavatel_nazev", Text, nullable=False), - Column("dodavatel_postovni_adresa", Text, nullable=True), - Column("dodavatel_obec", Text, nullable=False), - Column("dodavatel_psc", Text, nullable=True), - Column("dodavatel_stat", Text, nullable=False), - Column("dodavatel_www", Text, nullable=True), - Column("datum_odeslani_formulare_na_vvz", DateTime, nullable=False), - Column("platny_formular", Boolean, nullable=False), ), Table( - "zzvz_vz", + "soutez_o_navrh", meta, - Column("id_zakazky", Text, nullable=False), - Column("evidencni_cislo_vz_na_vvz", Text, nullable=False), - Column("cislo_formulare_na_vvz", Text, nullable=False), - Column("druh_formulare", Text, nullable=False), - Column("typ_formulare", Text, nullable=False), - Column("vz_delena_na_casti", Text, nullable=True), - Column("zadavatel_ico", Integer, nullable=True, index=True), - Column("limit_vz", Text, nullable=True), - Column("datum_odeslani_formulare_na_vvz", DateTime, nullable=False), - Column("datum_uverejneni", DateTime, nullable=False), - Column("zadavatel_uredni_nazev", Text, nullable=False), - Column("zadavatel_druh", Text, nullable=True), - Column("zadavatel_hlavni_predmet_cinnosti", Text, nullable=True), - Column("zakazka_zahrnuje_spolecne_zadavani_zakazek", Text, nullable=True), - Column("zakazku_zadava_centralni_zadavatel", Text, nullable=True), - Column("zadavatel_profil_url", Text, nullable=True), - Column("zadavatel_profil_url_platnost", Text, nullable=True), - Column("zadavatel_profil_zruseni_typ", Text, nullable=True), - Column("zadavatel_profil_url_nova", Text, nullable=True), - Column("datum_zruseni_ci_zneaktivneni_profilu", DateTime, nullable=True), - Column("nazev_vz", Text, nullable=True), - Column("druh_vz", Text, nullable=True), - Column("strucny_popis_vz", Text, nullable=True), - Column("cpv_hlavni", Text, nullable=True), - Column("cpv_doplnkovy1", Text, nullable=True), - Column("na_vz_se_vztahuje_gpa", Text, nullable=True), - Column("celkova_konecna_hodnota_vz", Numeric(16, 2), nullable=True), - Column("celkova_konecna_hodnota_vz_mena", Text, nullable=True), - Column("nejnizsi_nabidka_vzata_vuvahu", Numeric(16, 2), nullable=True), - Column("nejnizsi_nabidka_vzata_vuvahu_mena", Text, nullable=True), - Column("nejvyssi_nabidka_vzata_vuvahu", Numeric(16, 2), nullable=True), - Column("druh_rizeni", Text, nullable=True), - Column("byla_pouzita_elektronicka_drazba", Text, nullable=True), - Column("odhadovana_hodnota_vz_bez_dph", Numeric(16, 2), nullable=True), - Column("odhadovana_hodnota_vz_mena", Text, nullable=True), - Column("zadavatel_kontaktni_osoba", Text, nullable=True), - Column("zadavatel_email", Text, nullable=False), - Column("zadavatel_telefon", Text, nullable=True), - Column("lhuta_pro_doruceni_nabidek", Text, nullable=True), - Column("otevirani_nabidek_datum_cas", DateTime, nullable=True), - Column("otevirani_nabidek_misto", Text, nullable=True), - Column("otevirani_nabidek_opravnene_osoby_dalsi_info", Text, nullable=True), - Column("uchazec_vazan_nabidkou_do", Text, nullable=True), - Column("uchazec_vazan_nabidkou_doba_mesice", Text, nullable=True), - Column("platny_formular", Text, nullable=False), - Column("pravidelne_predbezne_oznameni", Text, nullable=True), - Column("pravidelne_predbezne_oznameni_vyzva_k_soutezi", Text, nullable=True), - Column("predbezne_oznameni", Text, nullable=True), - Column("predbezne_oznameni_vyzva_k_soutezi", Text, nullable=True), - Column("system_kvalifikace", Text, nullable=True), - Column("system_kvalifikace_vyzva_k_soutezi", Text, nullable=True), - Column("oznameni_o_zahajeni_zr", Text, nullable=True), - Column("oznameni_o_vysledku_zr", Text, nullable=True), - Column("oznameni_o_vysledku_ks", Text, nullable=True), + Column("casova_znacka", DateTime, nullable=False), + Column("identifikator_NIPEZ", Text, nullable=False, index=True), + Column("identifikator_v_elektronickem_nastroji", Text, nullable=True), + Column("identifikatory_v_elektronickem_nastroji", JSON, nullable=False), + Column( + "interni_identifikator_souteze_o_navrh_prideleny_zadavatelem", + Text, + nullable=True, + ), + Column("identifikator_CELEX_pravniho_predpisu_EU", Text, nullable=True), + Column("zadavatel_zadavaciho_postupu", JSON, nullable=False), + Column("evidencni_cislo_ve_VVZ", Text, nullable=True), + Column("nazev_souteze_o_navrh", Text, nullable=False), + Column("stav", Text, nullable=True), + Column("kategorie_zadavaciho_postupu", Text, nullable=True), + Column("druh_zadavaciho_postupu", Text, nullable=False), + Column( + "pravni_predpis_EU_na_zaklade_nehoz_probiha_zadavaci_postup", + Text, + nullable=True, + ), + Column("pravni_predpis_EU", Text, nullable=True), + Column("datum_zahajeni_zadavaciho_postupu", Date, nullable=True), + Column("datum_ukonceni_zadavaciho_postupu", Date, nullable=True), + Column("evidence_vysledku_zadavaciho_postupu", Text, nullable=True), + Column("udeleni_cen_odmen_nebo_jinych_plateb", Boolean, nullable=True), + Column( + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb", + Numeric(16, 2), + nullable=True, + ), + Column( + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb_mena", + Text, + nullable=True, + ), + Column( + "predpokladana_vyse_cen_odmen_nebo_jinych_plateb_bude_uverejnena", + Boolean, + nullable=True, + ), + Column("dalsi_informace_v_souvislosti_s_odmenami", Text, nullable=True), + Column("ocenovane_umisteni", JSON, nullable=True), + Column("pocet_podanych_navrhu", SmallInteger, nullable=True), + Column( + "pocet_zaslanych_zaevidovanych_vysvetleni_souteznich_podminek", + SmallInteger, + nullable=True, + ), + Column("presne_informace_o_lhutach_pro_prezkumna_rizeni", Text, nullable=True), + Column("dalsi_informace", Text, nullable=True), + Column( + "soutez_o_navrh_a_navazujici_verejna_zakazka_jsou_alespon_castecne_financovany_z_prostredku_Evropske_unie", + Boolean, + nullable=True, + ), + Column("ucastnici_zadavaciho_postupu", JSON, nullable=False), + Column("ucastnici_jimz_zanikla_ucast_v_zadavacim_postupu", JSON, nullable=True), + Column("vysledek_zadavaciho_postupu", JSON, nullable=True), + Column("podane_soutezni_navrhy", JSON, nullable=False), + Column("pravidla_pro_hodnoceni_souteznich_navrhu", Text, nullable=True), + Column("kriteria_kvalifikace", JSON, nullable=True), + Column("namitky", JSON, nullable=False), + Column("lhuty", JSON, nullable=False), + Column("informace_o_otevirani_podani", Text, nullable=False), + Column("specifikace_podani_souteznich_navrhu", Text, nullable=True), + Column("informace_o_dalsi_fazi_uzsi_souteze_o_navrh", Text, nullable=True), + Column("informace_o_souteznich_podminkach", Text, nullable=False), + Column("spolecne_zadavani_zadavatelu_z_ruznych_statu", JSON, nullable=False), + Column("predmet_souteze_o_navrh", JSON, nullable=False), + Column("informace_o_financnich_prostredcich_EU", Text, nullable=False), + Column("stret_zajmu", Text, nullable=False), + Column("uverejnovaci_formulare", JSON, nullable=False), + Column("zadavani_inovaci", Text, nullable=False), + Column("socialne_odpovedne_zadavani", Text, nullable=False), + Column("environmentalni_zadavani", Text, nullable=False), + Column("enviromentalni_zadavani_podle_kriterii", JSON, nullable=True), + Column("popis_odpovedneho_zadavani", Text, nullable=False), + Column("informace_o_danovych_pravnich_predpisech", Text, nullable=False), + Column("informace_o_pracovnepravnich_predpisech", Text, nullable=False), + Column( + "informace_o_predpisech_v_oblasti_zivotniho_prostredi", Text, nullable=False + ), + Column("nestandardni_stavy", JSON, nullable=True), + Column("dokumenty", JSON, nullable=True), + Column("informace_o_druhe_fazi_uzsi_souteze_o_navrh", Text, nullable=True), + Column("vylouceni_ucastnici_kteri_podali_vybrany_navrh", JSON, nullable=True), + Column("kriteria_enviromentalnich_verejnych_zakazek", JSON, nullable=True), + Column("vylouceni_ucastnici_zadavaciho_postupu", JSON, nullable=True), + Column( + "evidencni_cislo_zadavaciho_postupu_ve_vestniku_verejnych_zakazek", + Text, + nullable=True, + ), ), Table( - "zzvz_kriteria_vz", + "system_kvalifikace", meta, - Column("id_zakazky", Text, nullable=False), - Column("id_popisu_casti_zakazky", Text, nullable=False), - Column("evidencni_cislo_vz_na_vvz", Text, nullable=False), - Column("cislo_formulare_na_vvz", Text, nullable=False), - Column("druh_formulare", Text, nullable=False), - Column("cislo_casti_vz", Text, nullable=True), - Column("nazev_casti_vz", Text, nullable=True), - Column("poradi_kriteria", Text, nullable=True), - Column("kriterium_zadani_zakazky", Text, nullable=False), - Column("nazev_kriteria", Text, nullable=True), - Column("vaha_kriteria", Text, nullable=True), - Column("datum_odeslani_formulare_na_vvz", DateTime, nullable=False), - Column("platny_formular", Boolean, nullable=False), + Column("casova_znacka", DateTime, nullable=False), + Column("identifikator_NIPEZ", Text, nullable=False, index=True), + Column("identifikator_v_elektronickem_nastroji", Text, nullable=True), + Column("identifikatory_v_elektronickem_nastroji", JSON, nullable=False), + Column("datum_zavedeni_systemu_kvalifikace", Date, nullable=False), + Column("nazev_systemu_kvalifikace", Text, nullable=False), + Column("predmet", JSON, nullable=False), + Column("platba_za_zarazeni_do_systemu_kvalifikace", Boolean, nullable=False), + Column("vyse_platby_bez_DPH", Numeric(16, 2), nullable=True), + Column("vyse_platby_s_DPH", Numeric(16, 2), nullable=True), + Column("mena", Text, nullable=True), + Column("kvalifikace", JSON, nullable=False), + Column("zadavatel_systemu_kvalifikace", JSON, nullable=False), + Column("kategorie_systemu_kvalifikace", Text, nullable=False), + Column("dodavatele_zarazeni_do_systemu_kvalifikace", JSON, nullable=False), + Column("lhuty", JSON, nullable=False), + Column("doba_trvani", Text, nullable=False), + Column("uverejnovaci_formulare", JSON, nullable=False), ), ] diff --git a/main.py b/main.py index 62b633d..c90098a 100644 --- a/main.py +++ b/main.py @@ -19,6 +19,8 @@ def warninger(message, category, filename, lineno, line=None): warnings.formatwarning = warninger +csv.field_size_limit(2**24) # velky fieldy v zakazkach + def main( *, @@ -159,9 +161,11 @@ def main( logging.info("Nahravam %s", filename) # z nejakyho zahadnyho duvodu to muze obcas detekovat quote # jako neco jineho nez uvozovku + # max_line_size je kvuli embedovanym tabulkam v zakazkach - casem to snad + # nebude nutny, az to splitnem cur.execute( f"INSERT INTO {full_table_name} SELECT * FROM " - f"read_csv('{filename}', quote='\"')" + f"read_csv('{filename}', quote='\"', sep=',', max_line_size=100000000)" ) elif engine.name == "sqlite": conn = engine.raw_connection()