notebookvb

This commit is contained in:
Vladimir Buzalka
2026-04-26 08:32:14 +02:00
parent 0bfa9c48e4
commit 78ed84209c
2 changed files with 43 additions and 4 deletions
@@ -84,7 +84,8 @@ class Souhrn:
datum: str = ""
stazeni: list[StazeniRadek] = field(default_factory=list)
parse: list[ParseRadek] = field(default_factory=list)
kriticka_chyba: str = ""
parse_preskoceno: int = 0
kriticka_chyba: str = ""
# ─────────────────────────────────────────────────────────────────────────────
@@ -375,6 +376,7 @@ def faze_parsovani(dnes_str, out_dir, souhrn: Souhrn):
if zpracovane.get(erp_kod) == rel_path:
print("přeskočeno (beze změny)")
souhrn.parse_preskoceno += 1
continue
xml_text = xml_file.read_text(encoding="utf-8")
@@ -419,7 +421,7 @@ def sestav_email(souhrn: Souhrn) -> tuple[str, str]:
parse_chyby = [r for r in souhrn.parse if r.stav == "CHYBA"]
ma_chybu = bool(souhrn.kriticka_chyba or stazeno_chyby or parse_chyby)
predmet = f"eRecept {souhrn.datum}{'⚠ CHYBA' if ma_chybu else 'OK'} ({len(stazeno_ok)} staženo, {len(parse_ok)} zpracováno)"
predmet = f"eRecept {souhrn.datum}{'⚠ CHYBA' if ma_chybu else 'OK'} ({len(stazeno_ok)} staženo, {len(parse_ok)} zpracováno, {souhrn.parse_preskoceno} přeskočeno)"
css = "font-family:Arial,sans-serif;font-size:14px;color:#222"
h2 = "margin:20px 0 4px;font-size:15px;border-bottom:1px solid #ddd;padding-bottom:3px"
@@ -473,7 +475,7 @@ def sestav_email(souhrn: Souhrn) -> tuple[str, str]:
f"<h1 style='font-size:18px;margin-bottom:6px'>eRecept — denní souhrn {souhrn.datum}</h1>"
f"{krit}"
f"<p><strong>Stažení:</strong> {len(stazeno_ok)} OK &nbsp;|&nbsp; {len(stazeno_chyby)} chyb</p>"
f"<p><strong>Parsování:</strong> {len(parse_ok)} zpracováno &nbsp;|&nbsp; {len(parse_chyby)} chyb</p>"
f"<p><strong>Parsování:</strong> {len(parse_ok)} zpracováno &nbsp;|&nbsp; {souhrn.parse_preskoceno} přeskočeno (beze změny) &nbsp;|&nbsp; {len(parse_chyby)} chyb</p>"
+ tabulka_stazeni(stazeno_ok, "Stažené recepty")
+ tabulka_stazeni(stazeno_chyby, "Chyby při stahování")
+ tabulka_parse(parse_ok, "Zpracované recepty")
@@ -524,7 +526,7 @@ def main():
print(f"\n{'='*60}")
print(f" SOUHRN {dnes}")
print(f" Stažení: {stazeno_ok} OK, {stazeno_chyby} chyb")
print(f" Parsování: {parse_ok} zpracováno, {parse_chyby} chyb")
print(f" Parsování: {parse_ok} zpracováno, {souhrn.parse_preskoceno} přeskočeno, {parse_chyby} chyb")
if souhrn.kriticka_chyba:
print(" !! Kritická chyba — viz email")
print(f"{'='*60}\n")
@@ -15,6 +15,7 @@ které hromadný dotaz nevrací.
| `09_VytvorTabulky.py` | Vytvoří tabulky `recept_doklad` a `recept_plp` v MySQL |
| `10_StahnoutXML.py` | **Stahování** — načte ERP kódy z Medicusu, přeskočí terminální, uloží XML |
| `11_ParseXML.py` | **Parsování** — naparsuje XML archiv a uloží data do MySQL |
| `12_DenníStaženíAZpracování.py` | **Denní kombinovaný skript** — stažení + parsování + emailový souhrn; spouští se každé 3 hodiny |
```
NačteníPředpisuWithClaude/
@@ -23,6 +24,7 @@ NačteníPředpisuWithClaude/
├── 09_VytvorTabulky.py ← DDL MySQL tabulek
├── 10_StahnoutXML.py ← hromadné stahování s přeskakováním
├── 11_ParseXML.py ← parsování XML do MySQL
├── 12_DenníStaženíAZpracování.py ← denní kombinovaný skript (stažení + parsování + email)
├── NacistPredpis_DOKUMENTACE.md ← tento soubor
├── xml_archive/ ← archiv XML odpovědí (YYYY-MM-DD/ERP_KOD.xml)
├── MedicusDebug/ ← zachycené SOAP požadavky z Medicusu
@@ -291,6 +293,41 @@ Bez spuštění `11` budou terminální recepty znovu stahovány.
---
## 12_DenníStaženíAZpracování.py — denní kombinovaný skript
### Parametry (příkazová řádka)
```
python 12_DenníStaženíAZpracování.py
python 12_DenníStaženíAZpracování.py --od 2025-01-01
python 12_DenníStaženíAZpracování.py --limit 50
```
### Co dělá
1. Načte terminální set z MySQL
2. Načte ERP kódy z Firebirdu (od `--od`, výchozí `2025-01-01`)
3. Stáhne XML pro neterminální recepty do `xml_archive/DNES/` (pauza 13 s mezi requesty)
4. Naparsuje XML z dnešního adresáře do MySQL
5. Odešle HTML emailový souhrn na `vladimir.buzalka@buzalka.cz`
### Chování při opakovaném spuštění (každé 3 hodiny)
Stahování přeskakuje pouze terminální recepty — neterminální se stahují každý běh.
Parsování přeskakuje soubory, jejichž cesta `xml_soubor` v DB se nezměnila:
- **První běh dne** (po půlnoci): nová složka `xml_archive/YYYY-MM-DD/` → cesta nová → parsuje vše
- **Další běhy téhož dne**: stejná složka, cesta beze změny → přeskočí → 0 zpracováno
Email vždy obsahuje počet přeskočených, takže "0 zpracováno | 29 přeskočeno" je normální stav.
### Statistika (duben 2026)
- Neterminálních receptů: ~29 (z 10 151 celkem)
- Doba stahování: ~1 minuta
---
## Ověřeno (16. 4. 2026)
- Hromadné stažení od 1. 1. 2025 dokončeno (`LIMIT = None`)