Aktualizovat dokumentaci LEKOVY_ZAZNAM_DB.md

Přepracována na aktuální stav pipeline:
- nové tabulky pacient, predepisujici, vydavajici
- zprava rozšířena o pacient_id, xml_soubor
- popis 07StahnoutVsechny.py (hromadný běh, přírůstkové stahování)
- ošetření chyb API (SOAP Fault, pacient.poznamka)
- XML archiv, logování do Logs/
- aktualizovány analytické dotazy (s JOIN na pacient)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-12 06:15:39 +02:00
parent 5cee10c39a
commit ea6ce9a96f
+244 -134
View File
@@ -1,7 +1,7 @@
# Lékový záznam eRecept → MySQL # Lékový záznam eRecept → MySQL
Popis pipeline pro stažení lékového záznamu pacienta z eRecept SÚKL API Pipeline pro hromadné stažení lékových záznamů všech registrovaných pacientů
a jeho uložení do relační databáze MySQL. z eRecept SÚKL API a jejich uložení do relační databáze MySQL.
--- ---
@@ -9,20 +9,37 @@ a jeho uložení do relační databáze MySQL.
| Soubor | Co dělá | | Soubor | Co dělá |
|--------|---------| |--------|---------|
| `05UlozitOdpoved.py` | Zavolá SOAP API, stáhne XML odpověď, uloží ji do `odpoved_lekovy_zaznam.xml` | | `05UlozitOdpoved.py` | Stáhne XML pro **jednoho** pacienta (ruční test/ladění) |
| `06UlozitDoMySQL.py` | Naparsuje uložené XML, vytvoří/přepíše tabulky v MySQL, vloží data | | `06UlozitDoMySQL.py` | DDL schématu, parsování XML, import do MySQL — používá se jako knihovna i samostatně |
| `07StahnoutVsechny.py` | **Hlavní skript** — načte pacienty z Medicusu, stáhne lékové záznamy, uloží XML i DB záznamy |
### Typické spuštění ```
LékovýZáznamWithClaude/
├── 05UlozitOdpoved.py
├── 06UlozitDoMySQL.py
├── 07StahnoutVsechny.py
├── LEKOVY_ZAZNAM_DB.md
├── Logs/ ← log každého běhu (UTF-8, YYYY-MM-DD_HH-MM-SS.log)
├── Tests/ ← starší vývojové skripty
└── xml_archive/ ← archiv XML odpovědí (YYYY-MM-DD/Prijmeni_Jmena_datnar.xml)
```
---
## Typické spuštění
```bash ```bash
# 1. stáhnout čerstvá data z eReceptu # Čistý start — jednou (DROP + CREATE schéma, importuje odpoved_lekovy_zaznam.xml)
python 05UlozitOdpoved.py
# 2. uložit do databáze
python 06UlozitDoMySQL.py python 06UlozitDoMySQL.py
# nebo předat jiný XML soubor # Hromadné stažení všech registrovaných pacientů
python 06UlozitDoMySQL.py C:\cesta\k\jine_odpovedi.xml python 07StahnoutVsechny.py
# Pouze vybraná příjmení (testování / rodina)
python 07StahnoutVsechny.py --prijmeni Buzalka,Buzalková,Kusinová
# Dávkování po částech
python 07StahnoutVsechny.py --offset 100 --limit 50
``` ```
--- ---
@@ -42,95 +59,133 @@ Certifikát = identifikace **ordinace**, UUID+heslo = identifikace **lékaře ja
--- ---
## Dotaz — parametry `NacistLekovyZaznamLekarDotaz` ## Zdroj pacientů — Medicus (Firebird)
```xml Pacienti se načítají přímo z `medicus.fdb` jako registrovaní pacienti ordinace:
<Doklad>
<Pristupujici> ```
<Uzivatel>UUID lékaře</Uzivatel> DSN: localhost:c:\medicus 3\data\medicus.fdb
<Pracoviste>IČP ordinace</Pracoviste> User: SYSDBA / masterkey
</Pristupujici> Charset: win1250
<PocetZnakuATC>7</PocetZnakuATC> <!-- 5 nebo 7 --> IČP: 09305001 (odbornost 001 — praktický lékař)
<PocetMesicu>60</PocetMesicu> <!-- max 99 --> ```
<Pacient>
<Totoznost> Podmínky registrace: `vyrazen = 'N'`, `registr.priznak IN ('V','D','A')`,
<Jmeno><Prijmeni>...</Prijmeni><Jmena>...</Jmena></Jmeno> registrace platná k dnešnímu datu.
<DatumNarozeni>YYYY-MM-DD</DatumNarozeni>
</Totoznost> ---
</Pacient>
</Doklad> ## Logika přírůstkového stahování
```
první stažení pacienta → PocetMesicu = 60 (maximum, 5 let)
opakované stažení → ceil(dny od posledního stažení / 30) + 1
```
- Překryv 1 měsíce zajistí, že nepřijdeme o nic na hranici období.
- `INSERT IGNORE` na `id_lp_predpis` / `id_lp_vydej` zabrání duplikátům.
- Pauza mezi voláními API: **náhodně 1020 sekund**.
---
## Ošetření chyb API
Pacienti, kteří nejsou v eReceptu ztotožněni (nikdy nebyli v lékárně s e-receptem),
vrátí SOAP Fault `Z002`. Skript:
1. Zachytí chybu (HTTP 500 nebo SOAP Fault v těle odpovědi)
2. Uloží text chyby do `pacient.poznamka`
3. Pokračuje dalším pacientem
Při příštím úspěšném stažení se `poznamka` automaticky vymaže.
```sql
-- přehled pacientů s chybou
SELECT prijmeni, jmena, datum_narozeni, poznamka
FROM pacient
WHERE poznamka IS NOT NULL;
``` ```
--- ---
## Struktura XML odpovědi ## XML archiv
Dle XSD `Cuer2Schema.xsd` + `CuerSchema.xsd`, verze `202501A`:
Každá odpověď API se uloží jako soubor:
``` ```
NacistLekovyZaznamOdpoved xml_archive/YYYY-MM-DD/Prijmeni_Jmena_YYYY-MM-DD.xml
├── Doklad
│ ├── Pacient jméno + datum narození
│ ├── PredepisujiciSeznam lékaři, kteří předepisovali
│ ├── VydavajiciSeznam lékárny, kde byl výdej
│ ├── PredpisSeznam
│ │ └── Predpis × N co bylo předepsáno
│ ├── VydejSeznam
│ │ └── Vydej × N co bylo vydáno v lékárně
│ └── DuplicitaSeznam duplicitní výdeje
└── Zprava metadata odpovědi (ID, čas, verze SW)
``` ```
### Typy léků v Predpis i Vydej Cesta je zároveň uložena v `zprava.xml_soubor`.
Účel: možnost re-parsování při budoucích změnách schématu bez nutnosti znovu volat API.
Každý předpis / výdej obsahuje právě **jeden** z těchto elementů:
| Typ | Popis | Klíčová pole |
|-----|-------|-------------|
| `HVLPReg` | Registrovaný hromadně vyráběný LP | Kod (SÚKL), ATC, Nazev, Forma, Sila, Baleni |
| `HVLPNereg` | Neregistrovaný HVLP | stejná struktura jako HVLPReg |
| `IPLP` | Individuálně připravovaný LP (magistraliter) | Nazev, PostupPripravy (receptura), Slozka[] |
| `INN` | Předpis účinnou látkou (genericky) | Nazev, Forma, Sila, Baleni |
#### IPLP — dvojí uložení receptury
- **Předpis** (`PredpisSeznam/Predpis/IPLP`): lékař zadal recepturu jako **volný text** v `PostupPripravy`. Prvky `Slozka` zde lékař typicky nevyplňuje.
- **Výdej** (`VydejSeznam/Vydej/IPLP`): lékárna při přípravě zaznamenala **strukturované složky** (`Slozka` s množstvím, jednotkou a názvem suroviny). Kvalita dat závisí na lékárně — některé rozkládají do detailu (suroviny, obal, taxa laborum), jiné evidují jen 1 ks jako celek.
--- ---
## Databázové schéma — `medicus` (MySQL 9.6) ## Výstup do konzole a logů
Konzole zobrazuje jen jeden řádek na pacienta:
```
[ 1/1621] Abohamda Horia OK 168p 252v 247 KB
[ 5/1621] Alakbarov Farid CHYBA Z002 - Lekovy zaznam ne...
```
Kompletní detaily (počty nových záznamů, ID zprávy, doba čekání) jsou v:
```
Logs/YYYY-MM-DD_HH-MM-SS.log
```
---
## Databázové schéma — `medicus` (MySQL)
Všechny délky a datové typy jsou přesně dle XSD, **ne odhady**. Všechny délky a datové typy jsou přesně dle XSD, **ne odhady**.
Varianta B — lék je denormalizován přímo do řádku předpisu/výdeje. Lék je denormalizován přímo do řádku předpisu/výdeje.
### Relační diagram ### Relační diagram
``` ```
zprava (1) pacient (1)
── predpis (N) ── zprava (N) -- každé volání API = 1 zpráva
── predpis_slozka (N) -- složky IPLP z předpisu ── predpis (N)
└── vydej (N) │ └── predpis_slozka (N) -- složky IPLP z předpisu
└── vydej_slozka (N) -- složky IPLP z výdeje └── vydej (N)
└── vydej_slozka (N) -- složky IPLP z výdeje
vydej.id_lp_predpis → predpis.id_lp_predpis (párování výdeje s předpisem) vydej.id_lp_predpis → predpis.id_lp_predpis (párování výdeje s předpisem)
predpis.kod_predepisujiciho → predepisujici.lekar_kod
vydej.kod_vydavajiciho → vydavajici.lekarnik_kod
``` ```
### Tabulka `pacient`
Zrcadlo registrovaných pacientů z Medicusu. Aktualizuje se při každém běhu `07`.
| Sloupec | Typ | Poznámka |
|---------|-----|----------|
| `id` | INT PK | |
| `idpac` | INT UNIQUE | IDPAC z tabulky KAR v Medicusu |
| `prijmeni` | VARCHAR(35) | |
| `jmena` | VARCHAR(24) | |
| `datum_narozeni` | DATE | |
| `aktivni` | TINYINT(1) | 0 = přeskočit při hromadném běhu |
| `poznamka` | VARCHAR(500) | poslední chyba API; NULL = OK |
### Tabulka `zprava` ### Tabulka `zprava`
Jeden řádek = jedna odpověď API (jedno volání `NacistLekovyZaznam`). Jeden řádek = jedno volání API (jeden pacient, jeden čas).
| Sloupec | Typ | Zdroj v XSD | | Sloupec | Typ | Poznámka |
|---------|-----|-------------| |---------|-----|----------|
| `id_zpravy` | CHAR(36) UNIQUE | `zprava_type.ID_Zpravy` | | `id_zpravy` | CHAR(36) UNIQUE | UUID z eReceptu |
| `verze` | VARCHAR(20) | `zprava_type.Verze` | | `pacient_id` | INT FK → pacient | |
| `odeslano` | DATETIME | `zprava_type.Odeslano` | | `verze` | VARCHAR(20) | verze zprávy (202501A) |
| `aplikace` | VARCHAR(512) | `zprava_odpoved_type.Aplikace` | | `odeslano` | DATETIME | čas odeslání dotazu |
| `id_podani` | CHAR(36) | `zprava_odpoved_type.ID_Podani` | | `aplikace` | VARCHAR(512) | SW SÚKL serveru |
| `prijato` | DATETIME | `zprava_odpoved_type.Prijato` | | `id_podani` | CHAR(36) | UUID podání |
| `pacient_prijmeni` | VARCHAR(35) | `jmeno_osoby_type.Prijmeni` | | `prijato` | DATETIME | čas přijetí odpovědi |
| `pacient_jmena` | VARCHAR(24) | `jmeno_osoby_type.Jmena` | | `pacient_prijmeni` | VARCHAR(35) | z XML odpovědi |
| `pacient_datum_narozeni` | DATE | `lz_totoznost_type.DatumNarozeni` | | `pacient_jmena` | VARCHAR(24) | z XML odpovědi |
| `pacient_datum_narozeni` | DATE | z XML odpovědi |
| `xml_soubor` | VARCHAR(255) | relativní cesta k archivu |
| `stazeno` | DATETIME | automaticky při INSERT | | `stazeno` | DATETIME | automaticky při INSERT |
### Tabulka `predpis` ### Tabulka `predpis`
@@ -139,35 +194,36 @@ Dle `lz_nacteni_predepsany_lp_erp_type`.
| Sloupec | Typ | NOT NULL | Poznámka | | Sloupec | Typ | NOT NULL | Poznámka |
|---------|-----|----------|----------| |---------|-----|----------|----------|
| `id_lp_predpis` | CHAR(36) | ✓ | UUID z eReceptu, globálně unikátní | | `id_lp_predpis` | CHAR(36) UNIQUE | ✓ | UUID z eReceptu |
| `zprava_id` | INT FK | ✓ | |
| `kod_predepisujiciho` | VARCHAR(36) | ✓ | UUID lékaře | | `kod_predepisujiciho` | VARCHAR(36) | ✓ | UUID lékaře |
| `datum_vystaveni` | DATE | ✓ | | | `datum_vystaveni` | DATE | ✓ | |
| `mnozstvi` | SMALLINT | ✓ | 19999 | | `mnozstvi` | SMALLINT | ✓ | 19999 |
| `navod` | VARCHAR(80) | ✓ | max 80 znaků dle XSD | | `navod` | VARCHAR(80) | ✓ | |
| `opakovani` | INT | | opakování předpisu | | `opakovani` | INT | | |
| `modry_pruh` | TINYINT(1) | | modrý pruh (návykové látky) | | `modry_pruh` | TINYINT(1) | | návykové látky |
| `typ_leku` | ENUM | | HVLPReg / HVLPNereg / IPLP / INN | | `typ_leku` | ENUM | | HVLPReg / HVLPNereg / IPLP / INN |
| `lek_kod` | CHAR(7) | | kód SÚKL (jen HVLP) | | `lek_kod` | CHAR(7) | | kód SÚKL (jen HVLP) |
| `atc` | VARCHAR(7) | | ATC kód (jen HVLP) | | `atc` | VARCHAR(7) | | ATC kód |
| `nazev` | VARCHAR(200) | | max 200 — INN má nejdelší název | | `nazev` | VARCHAR(200) | | |
| `forma` | VARCHAR(27) | | léková forma | | `forma` | VARCHAR(27) | | |
| `sila` | VARCHAR(24) | | síla přípravku | | `sila` | VARCHAR(24) | | |
| `cesta_podani` | VARCHAR(15) | | POR, INH, … | | `cesta_podani` | VARCHAR(15) | | POR, INH, … |
| `baleni` | VARCHAR(22) | | **string**, ne číslo (může být "100 ks") | | `baleni` | VARCHAR(22) | | string, např. "100 ks" |
| `postup_pripravy` | VARCHAR(4000) | | receptura IPLP jako volný text | | `postup_pripravy` | VARCHAR(4000) | | receptura IPLP |
### Tabulka `predpis_slozka` ### Tabulka `predpis_slozka`
Dle `slozka_iplp_predpis_type`. Řádky vznikají jen pro IPLP předpisy se strukturovanými složkami. Složky IPLP předpisů (lékař typicky nevyplňuje, kvalitní data spíše u výdeje).
| Sloupec | Typ | NOT NULL | Poznámka | | Sloupec | Typ | NOT NULL |
|---------|-----|----------|----------| |---------|-----|----------|
| `predpis_id` | INT | ✓ | FK → predpis.id | | `predpis_id` | INT FK | ✓ |
| `mnozstvi` | DECIMAL(15,6) | ✓ | přesné množství suroviny | | `mnozstvi` | DECIMAL(15,6) | ✓ |
| `jednotka` | ENUM('g','ks') | ✓ | | | `jednotka` | ENUM('g','ks') | ✓ |
| `nazev` | VARCHAR(200) | ✓ | název suroviny / přípravku | | `nazev` | VARCHAR(200) | ✓ |
| `surovina` | CHAR(7) | | kód suroviny v registru SÚKL | | `surovina` | CHAR(7) | |
| `hvlp_reg` | CHAR(7) | | pokud je složka registrovaný HVLP | | `hvlp_reg` | CHAR(7) | |
### Tabulka `vydej` ### Tabulka `vydej`
@@ -175,18 +231,19 @@ Dle `lz_nacteni_vydany_lp_erp_type`.
| Sloupec | Typ | NOT NULL | Poznámka | | Sloupec | Typ | NOT NULL | Poznámka |
|---------|-----|----------|----------| |---------|-----|----------|----------|
| `id_lp_vydej` | CHAR(36) | ✓ | UUID výdeje | | `id_lp_vydej` | CHAR(36) UNIQUE | ✓ | UUID výdeje |
| `id_lp_predpis` | CHAR(36) | | FK → predpis.id_lp_predpis, NULL = výdej bez e-předpisu | | `zprava_id` | INT FK | ✓ | |
| `id_lp_predpis` | CHAR(36) FK | | NULL = výdej bez e-předpisu |
| `kod_vydavajiciho` | VARCHAR(36) | ✓ | UUID lékárníka | | `kod_vydavajiciho` | VARCHAR(36) | ✓ | UUID lékárníka |
| `datum_vydeje` | DATE | ✓ | | | `datum_vydeje` | DATE | ✓ | |
| `mnozstvi` | DECIMAL(6,2) | ✓ | **desetinné** — např. 0.5 balení | | `mnozstvi` | DECIMAL(6,2) | ✓ | desetinné — např. 0.5 balení |
| `navod` | VARCHAR(80) | ✓ | | | `navod` | VARCHAR(80) | ✓ | |
| `exspirace` | DATE | | exspirace šarže | | `exspirace` | DATE | | exspirace šarže |
| `sarze` | VARCHAR(50) | ✓ | číslo šarže | | `sarze` | VARCHAR(50) | ✓ | |
| `seriove_cislo` | VARCHAR(20) | | sériové číslo (léky s el. sledováním) | | `seriove_cislo` | VARCHAR(20) | | léky s el. sledováním |
| `pozn` | VARCHAR(1000) | | poznámka lékárníka | | `pozn` | VARCHAR(1000) | | poznámka lékárníka |
| `typ_leku` | ENUM | | HVLPReg / HVLPNereg / IPLP | | `typ_leku` | ENUM | | HVLPReg / HVLPNereg / IPLP |
| `lek_kod` | CHAR(7) | | kód SÚKL (HVLP) nebo KodVZP (IPLP) | | `lek_kod` | CHAR(7) | | kód SÚKL nebo KodVZP (IPLP) |
| `atc` | VARCHAR(7) | | jen HVLP | | `atc` | VARCHAR(7) | | jen HVLP |
| `nazev` | VARCHAR(146) | | | | `nazev` | VARCHAR(146) | | |
| `forma` | VARCHAR(27) | | | | `forma` | VARCHAR(27) | | |
@@ -196,25 +253,67 @@ Dle `lz_nacteni_vydany_lp_erp_type`.
### Tabulka `vydej_slozka` ### Tabulka `vydej_slozka`
Dle `slozka_iplp_type`. Jako `predpis_slozka`, ale navíc obsahuje `hrazeno_zp`. Jako `predpis_slozka`, navíc `hrazeno_zp`. Data lékáren — kvalita závisí na lékárně.
| Sloupec | Typ | NOT NULL | Poznámka | | Sloupec | Typ | NOT NULL | Poznámka |
|---------|-----|----------|----------| |---------|-----|----------|----------|
| `vydej_id` | INT | ✓ | FK → vydej.id | | `vydej_id` | INT FK | ✓ | |
| `mnozstvi` | DECIMAL(15,6) | ✓ | | | `mnozstvi` | DECIMAL(15,6) | ✓ | |
| `jednotka` | ENUM('g','ks') | ✓ | | | `jednotka` | ENUM('g','ks') | ✓ | |
| `nazev` | VARCHAR(200) | ✓ | název suroviny | | `nazev` | VARCHAR(200) | ✓ | |
| `hrazeno_zp` | DECIMAL(9,2) | | částka hrazená zdravotní pojišťovnou | | `hrazeno_zp` | DECIMAL(9,2) | | částka hrazená ZP |
| `surovina` | CHAR(7) | | | | `surovina` | CHAR(7) | | |
| `hvlp_reg` | CHAR(7) | | | | `hvlp_reg` | CHAR(7) | | |
### Tabulka `predepisujici`
Lékaři, kteří pacientovi předepisovali (ze všech ordinací).
| Sloupec | Typ | Poznámka |
|---------|-----|----------|
| `lekar_kod` | CHAR(36) UNIQUE | UUID lékaře = predpis.kod_predepisujiciho |
| `prijmeni` | VARCHAR(35) | |
| `jmena` | VARCHAR(24) | |
| `icz` | CHAR(8) | IČZ zdravotnického zařízení |
| `icp` | CHAR(8) | IČP pracoviště |
| `pzs_nazev` | VARCHAR(200) | název zdravotnického zařízení |
| `ulice` | VARCHAR(150) | |
| `mesto` | VARCHAR(100) | |
| `psc` | CHAR(5) | |
| `telefon` | VARCHAR(20) | |
### Tabulka `vydavajici`
Lékárníci / lékárny, kde byl výdej.
| Sloupec | Typ | Poznámka |
|---------|-----|----------|
| `lekarnik_kod` | CHAR(36) UNIQUE | UUID lékárníka = vydej.kod_vydavajiciho |
| `prijmeni` | VARCHAR(35) | |
| `jmena` | VARCHAR(24) | |
| `pzs_nazev` | VARCHAR(200) | název lékárny |
| `ulice` | VARCHAR(150) | |
| `mesto` | VARCHAR(100) | |
| `psc` | CHAR(5) | |
| `telefon` | VARCHAR(20) | |
--- ---
## Klíčové vlastnosti importu (`06UlozitDoMySQL.py`) ## Typy léků v Predpis i Vydej
- **Idempotentní**: `INSERT IGNORE` na `id_lp_predpis` / `id_lp_vydej` — opakované spuštění se stejným XML nepřidá duplikáty. Každý předpis / výdej obsahuje právě **jeden** z těchto elementů:
- **Víc pacientů**: `zprava.id_zpravy` je UNIQUE — každé volání API (jiný pacient, jiný čas) vytvoří nový řádek v `zprava`. Předpisy a výdeje napříč pacienty se agregují v `predpis` / `vydej`.
- **Schema se přepisuje**: `vytvor_schema()` vždy DROPne a znovu vytvoří všech 5 tabulek. Při produkčním použití (více pacientů) tuto část odstraňte a spouštějte DDL jen jednou při inicializaci. | Typ | Popis | Klíčová pole |
|-----|-------|-------------|
| `HVLPReg` | Registrovaný hromadně vyráběný LP | Kod (SÚKL), ATC, Nazev, Forma, Sila, Baleni |
| `HVLPNereg` | Neregistrovaný HVLP | stejná struktura jako HVLPReg |
| `IPLP` | Individuálně připravovaný LP (magistraliter) | Nazev, PostupPripravy, Slozka[] |
| `INN` | Předpis účinnou látkou (genericky) | Nazev, Forma, Sila, Baleni |
#### IPLP — dvojí uložení receptury
- **Předpis**: lékař zadal recepturu jako volný text v `PostupPripravy`. Složky typicky nevyplněny.
- **Výdej**: lékárna zaznamenala strukturované složky (`Slozka` s množstvím, jednotkou, názvem suroviny). Kvalita dat závisí na lékárně.
--- ---
@@ -228,43 +327,53 @@ WHERE datum_vystaveni >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY atc, nazev GROUP BY atc, nazev
ORDER BY pocet DESC; ORDER BY pocet DESC;
-- co bylo předepsáno ale nevyzvednuto -- co bylo předepsáno ale nevyzvednuto (non-compliance)
SELECT p.datum_vystaveni, p.nazev, p.atc, p.navod SELECT pac.prijmeni, pac.jmena, p.datum_vystaveni, p.nazev, p.atc, p.navod
FROM predpis p FROM predpis p
JOIN zprava z ON z.id = p.zprava_id
JOIN pacient pac ON pac.id = z.pacient_id
LEFT JOIN vydej v ON v.id_lp_predpis = p.id_lp_predpis LEFT JOIN vydej v ON v.id_lp_predpis = p.id_lp_predpis
WHERE v.id_lp_vydej IS NULL; WHERE v.id_lp_vydej IS NULL
ORDER BY p.datum_vystaveni DESC;
-- IPLP magistraliter — kompletní receptury s frekvencí -- lékový záznam konkrétního pacienta (předpisy + výdeje)
SELECT p.nazev, p.postup_pripravy, SELECT p.datum_vystaveni, p.typ_leku, p.nazev, p.atc, p.navod,
COUNT(*) AS pocet_predpisu v.datum_vydeje, v.mnozstvi AS vydano
FROM pacient pac
JOIN zprava z ON z.pacient_id = pac.id
JOIN predpis p ON p.zprava_id = z.id
LEFT JOIN vydej v ON v.id_lp_predpis = p.id_lp_predpis
WHERE pac.prijmeni = 'Buzalka' AND pac.jmena = 'Vladimír'
ORDER BY p.datum_vystaveni DESC;
-- IPLP magistraliter — kompletní receptury s frekvencí (napříč pacienty)
SELECT p.nazev, p.postup_pripravy, COUNT(*) AS pocet_predpisu
FROM predpis p FROM predpis p
WHERE p.typ_leku = 'IPLP' WHERE p.typ_leku = 'IPLP'
GROUP BY p.nazev, p.postup_pripravy GROUP BY p.nazev, p.postup_pripravy
ORDER BY pocet_predpisu DESC; ORDER BY pocet_predpisu DESC;
-- IPLP výdeje — strukturované složky (kde je lékárna zadala) -- nejčastěji používané suroviny v magistrech
SELECT v.datum_vydeje, v.nazev AS pripravek,
GROUP_CONCAT(s.mnozstvi, ' ', s.jednotka, ' ', s.nazev
ORDER BY s.id SEPARATOR ' + ') AS slozeni
FROM vydej v
JOIN vydej_slozka s ON s.vydej_id = v.id
WHERE v.typ_leku = 'IPLP'
GROUP BY v.id
ORDER BY v.datum_vydeje DESC;
-- nejčastěji používané suroviny v magistrech (ze strany výdeje)
SELECT nazev, jednotka, COUNT(*) AS pocet SELECT nazev, jednotka, COUNT(*) AS pocet
FROM vydej_slozka FROM vydej_slozka
GROUP BY nazev, jednotka GROUP BY nazev, jednotka
ORDER BY pocet DESC; ORDER BY pocet DESC;
-- párování: co předepsal lékař vs. co lékárna vydala (generická záměna) -- generická záměna: co předepsal lékař vs. co lékárna vydala
SELECT p.datum_vystaveni, SELECT pac.prijmeni, pac.jmena,
p.nazev AS predepsano, p.atc, p.datum_vystaveni, p.nazev AS predepsano, p.atc,
v.nazev AS vydano, v.datum_vydeje v.nazev AS vydano, v.datum_vydeje
FROM predpis p FROM pacient pac
JOIN vydej v ON v.id_lp_predpis = p.id_lp_predpis JOIN zprava z ON z.pacient_id = pac.id
JOIN predpis p ON p.zprava_id = z.id
JOIN vydej v ON v.id_lp_predpis = p.id_lp_predpis
WHERE p.nazev <> v.nazev; WHERE p.nazev <> v.nazev;
-- pacienti s chybou API (neztotožněni)
SELECT prijmeni, jmena, datum_narozeni, poznamka
FROM pacient
WHERE poznamka IS NOT NULL
ORDER BY prijmeni;
``` ```
--- ---
@@ -275,10 +384,11 @@ WHERE p.nazev <> v.nazev;
requests requests
requests-pkcs12 requests-pkcs12
pymysql pymysql
fdb
``` ```
```bash ```bash
pip install requests requests-pkcs12 pymysql pip install requests requests-pkcs12 pymysql fdb
``` ```
--- ---
@@ -289,5 +399,5 @@ Schéma verze `202501A`, soubory v `Dokumentace/2025-04-24/WSDL_XSD/NEPRIORITNI_
| Soubor | Obsah | | Soubor | Obsah |
|--------|-------| |--------|-------|
| `Cuer2Schema.xsd` | Typy specifické pro lékový záznam: `NacistLekovyZaznamOdpoved`, `lz_nacteni_predepsany_lp_erp_type`, `lz_nacteni_vydany_lp_erp_type`, `slozka_iplp_*` | | `Cuer2Schema.xsd` | `NacistLekovyZaznamOdpoved`, `lz_nacteni_predepsany_lp_erp_type`, `lz_nacteni_vydany_lp_erp_type`, `slozka_iplp_*` |
| `CuerSchema.xsd` | Společné typy: `hvlp_type`, `zprava_odpoved_type`, `zprava_type`, `jmeno_osoby_type`, `jednotka` | | `CuerSchema.xsd` | `hvlp_type`, `zprava_odpoved_type`, `zprava_type`, `jmeno_osoby_type`, `jednotka` |