diff --git a/Insurance/KdoJeLékař/_test_no_odb.py b/Insurance/KdoJeLékař/Testy/_test_no_odb.py similarity index 96% rename from Insurance/KdoJeLékař/_test_no_odb.py rename to Insurance/KdoJeLékař/Testy/_test_no_odb.py index 3941dd5..5d36855 100644 --- a/Insurance/KdoJeLékař/_test_no_odb.py +++ b/Insurance/KdoJeLékař/Testy/_test_no_odb.py @@ -7,7 +7,7 @@ from datetime import date import xml.etree.ElementTree as ET ENDPOINT = "https://prod.b2b.vzp.cz/B2BProxy/HttpProxy/RegistracePojistencePZSB2B" -PFX_PATH = r"u:\ordinaceprojekt\Insurance\Certificates\picka.pfx" +PFX_PATH = r"/Insurance/Certificates/picka.pfx" PFX_PASS = "Vlado7309208104+" NS = { "soap": "http://schemas.xmlsoap.org/soap/envelope/", diff --git a/Insurance/KdoJeLékař/_test_temp.py b/Insurance/KdoJeLékař/Testy/_test_temp.py similarity index 97% rename from Insurance/KdoJeLékař/_test_temp.py rename to Insurance/KdoJeLékař/Testy/_test_temp.py index 84150f8..4605d3e 100644 --- a/Insurance/KdoJeLékař/_test_temp.py +++ b/Insurance/KdoJeLékař/Testy/_test_temp.py @@ -9,7 +9,7 @@ import xml.etree.ElementTree as ET from datetime import date ENDPOINT = "https://prod.b2b.vzp.cz/B2BProxy/HttpProxy/RegistracePojistencePZSB2B" -PFX_PATH = r"u:\ordinaceprojekt\Insurance\Certificates\picka.pfx" +PFX_PATH = r"/Insurance/Certificates/picka.pfx" PFX_PASS = "Vlado7309208104+" RC = "7309208104" diff --git a/Insurance/KdoJeLékař/export_neregistrovani_vzp.py b/Insurance/KdoJeLékař/Testy/export_neregistrovani_vzp.py similarity index 100% rename from Insurance/KdoJeLékař/export_neregistrovani_vzp.py rename to Insurance/KdoJeLékař/Testy/export_neregistrovani_vzp.py diff --git a/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py b/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py index b190f81..ced4e4b 100644 --- a/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py +++ b/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py @@ -34,6 +34,9 @@ def main() -> None: print("\n=== Stahování nových zpráv ===") run(os.path.join(DIR, "03_stahuj_nove.py")) + print("\n=== Stahování odeslaných podání ===") + run(os.path.join(DIR, "stahovanipodani.py")) + print("\n=== Stahování číselníků VZP ===") run(CISELNIKY_SCRIPT) diff --git a/Insurance/StahováníZpráv/111 VZP/stahovanipodani.py b/Insurance/StahováníZpráv/111 VZP/stahovanipodani.py new file mode 100644 index 0000000..6fb61b0 --- /dev/null +++ b/Insurance/StahováníZpráv/111 VZP/stahovanipodani.py @@ -0,0 +1,265 @@ +""" +Stáhni odeslaná podání z VZP Point (sekce „Odeslaná podání"). +Načte Bearer token ze stránky Desk/FormDashboard, pak volá REST API /api/desk/form. +Stahuje podání s přiloženým výsledkovým souborem — přeskočí ty, co už existují. +Použití: python stahovanipodani.py [--dry-run] +""" + +import json +import os +import re +import sys +import time +import winreg + +try: + import requests as req_lib +except ImportError: + print("Chybí requests: pip install requests") + sys.exit(1) + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..")) +from Knihovny.najdi_dropbox import get_dropbox_root + +DASHBOARD_URL = "https://point.vzp.cz/Desk/FormDashboard" +API_BASE = "https://point.vzp.cz/api/desk/form" +PAGE_SIZE = 50 + +CHROME_PROFILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "chrome_profile")) +COOKIES_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "vzp_cookies.json")) +DOWNLOAD_DIR = os.path.join( + get_dropbox_root(), + "Ordinace", "Dokumentace_ke_zpracování", "Zúčtovací zprávy", "111 VZP Podání" +) + +DRY_RUN = False + + +def load_cookies(context) -> int: + if not os.path.exists(COOKIES_FILE): + return 0 + try: + with open(COOKIES_FILE, "r", encoding="utf-8") as f: + cookies = json.load(f) + context.add_cookies(cookies) + return len(cookies) + except Exception: + return 0 + + +def save_cookies(context) -> int: + try: + all_cookies = context.cookies() + vzp = [c for c in all_cookies if "vzp.cz" in c.get("domain", "")] + with open(COOKIES_FILE, "w", encoding="utf-8") as f: + json.dump(vzp, f, indent=2, ensure_ascii=False) + return len(vzp) + except Exception: + return 0 + + +CERT_ISSUER_CN = "I.CA Public CA/RSA 06/2022" + + +def _set_chrome_cert_policy() -> None: + policy = json.dumps({ + "pattern": "https://[*.]vzp.cz", + "filter": {"ISSUER": {"CN": CERT_ISSUER_CN}}, + }) + key_path = r"SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls" + try: + key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, key_path) + winreg.SetValueEx(key, "1", 0, winreg.REG_SZ, policy) + winreg.CloseKey(key) + print(f" Chrome politika nastavena (issuer: {CERT_ISSUER_CN})") + except Exception as e: + print(f" Varování: nelze nastavit Chrome politiku: {e}") + + +def extract_bearer_token(page) -> str | None: + """Extrahuje Bearer token z inline