# MedicusWithClaude – poznámky pro Clauda ## Stav projektu - Zahájeno: 2026-03-13 - Cíl: průzkum Firebird DB Medicus → analýzy a reporty - Zatím: úspěšně čteme i zapisujeme do DB, rozumíme RTF formátu ## Bezpečnost - Pracujeme na **místní kopii** – poškození DB nevadí, obnova = 5 minut - Lze bez obav experimentovat, zapisovat testovací data atd. - Testovací záznamy nemusíme mazat ## Připojení k DB ```python import fdb conn = fdb.connect( dsn=r'localhost:c:\medicus 3\data\medicus.fdb', user='SYSDBA', password='masterkey', charset='win1250' ) ``` - fdb verze 2.0.4, Python na PATH (prostý `python` příkaz) ## O Medicusu - Lékařský software pro praktického lékaře - Vyvíjen od ~roku 2000, organicky rostl přidáváním funkcí - Firebird 2.5 – nikdy nepřejdou na nový (desetitisíce instalací, 993 tabulek) - Žádné zabezpečení DB – vše čitelné přes SYSDBA/masterkey - Charset: win1250 ## DB fakta - 993 tabulek celkem - Charset: win1250 ## Klíčové tabulky ### KAR – Kartotéka (základní kámen Medicusu) - 6319 pacientů – všichni kdo kdy prošli ordinací - Primární klíč: **IDPAC** (interní ID, používá se jako FK v ostatních tabulkách) - Identifikace pacienta v ČR/pojišťovna: **RODCIS** (rodné číslo, bez lomítka, např. 7309208104) - **PRIJMENI**, **JMENO**, TITUL, TITULZA, DATNAR, POHLAVI - **POJ** – pojišťovna (3 znaky, např. 111 = VZP) - Adresy: TRV* (trvalé), PRE* (přechodné) - **VYRAZEN** – příznak vyřazeného pacienta - HLAVDGN – hlavní diagnóza ### DEKURS – záznamy z návštěv - 172 068 záznamů - **IDPAC** → vazba na KAR - **DATUM** (date), **CAS** (time) – kdy - **DEKURS** – text záznamu (BLOB, RTF nebo holý text) - **DGN1** – hlavní diagnóza (5 znaků, např. 'Z000 '), VDGN1-4 – vedlejší - **IDPRAC** – který pracovník - IDODD, IDUZI – oddělení/uživatel (u Buzalky = 2, 2, 6) - IDSKUPINA, IDTYP – volitelné (NULL OK) ## Základní schéma ``` KAR (kartotéka) ←IDPAC→ DEKURS (záznamy z návštěv) ``` ## Testovací pacient (uživatel) - **IDPAC = 9742** – Buzalka Vladimír, RC 7309208104, nar. 20.9.1973 - IDODD=2, IDPRAC=2, IDUZI=6 (použít při INSERT do DEKURS) ## RTF formát v DEKURS ### Základní struktura ``` {\rtf1\ansi\ansicpg1250\uc1\deff0\deflang1029 {\info{\bookmarks "popis","Typ:ID",číslo}} ← metadata Medicusu {\fonttbl{\f0\fnil\fcharset238 Arial;}{\f2...Courier New;}{\f5...Symbol;}} {\colortbl ;\red0\green0\blue255;\red255\green255\blue0;\red0\green128\blue0;\red192\green192\blue192;} {\stylesheet{styly...}} \uc1\pard\s10\plain... ← tělo záznamu } ``` ### Barvy (\cfX) - `\cf1` = modrá (odkazy) - `\cf2` = žlutá (highlight) - `\cf3` = zelená - `\cf4` = šedá (pozadí buněk tabulky `\clcbpat4`) ### Velikost písma (\fsXX = XX/2 bodů) - `\fs18` = 9pt (tabulky) - `\fs20` = 10pt (normální) - `\fs24` = 12pt atd. ### Řezy a formátování - `\b` = tučné, `\i` = kurzíva, `\ul` = podtržené - `\ql` = vlevo, `\qr` = vpravo, `\qc` = střed ### Styly (stylesheet) - `cs15/cs16` = Normální - `cs20` = Vkládaný text - `cs21` = Záhlaví (italic) - `cs22/cs23` = Odkaz (underline, modrá) - `s8/s10` = Vlevo (paragraph styl) ### Záložky (bookmarks v {\info}) - Klikatelné odkazy v Medicusu - Formát: `"popis","Typ:ID",číslo` - Typy: `Files:ID`, `MEDLAB:ID`, `Lab:ID`, `Ock:ID`, `VykA:ID` ### České znaky - RTF hex escape v win1250: `\'e1`=á, `\'9e`=ž, `\'fd`=ý atd. ### Tabulky - Plně funkční RTF tabulky (`\trowd`, `\cell`, `\cellx...`) - Používají se např. pro laboratorní výsledky (viz ID=243082, 50KB) ### Holý text (starší záznamy) - Některé starší záznamy jsou prostý text bez RTF obálky - Nutno detekovat: začíná na `{\\rtf` = RTF, jinak plain text ### Příklad minimálního RTF záznamu ``` {\rtf1\ansi\ansicpg1250\uc1\deff0\deflang1029 {\fonttbl{\f0\fnil\fcharset238 Arial;}} {\colortbl ;\red0\green0\blue255;\red0\green128\blue0;\red0\green0\blue0;} \pard\plain\f0\fs20 Text záznamu zde\par } ``` ## INSERT do DEKURS – ověřený postup ```python import fdb, datetime conn = fdb.connect(...) cur = conn.cursor() cur.execute('SELECT MAX(ID) FROM DEKURS') next_id = cur.fetchone()[0] + 1 text = r'{\rtf1\ansi\ansicpg1250...\par' + '\n}' # raw string pro RTF! cur.execute(""" INSERT INTO DEKURS (ID, IDPAC, IDODD, IDPRAC, IDUZI, DATUM, CAS, DEKURS, DGN1) VALUES (?, ?, 2, 2, 6, ?, ?, ?, ?) """, (next_id, idpac, datum, cas, text, dgn1)) conn.commit() ``` - RTF string musí být **raw string** (r'...') kvůli zpětným lomítkům - DGN1 = 5 znaků s mezerou: `'Z000 '` - DATUM = datetime.date(...), CAS = datetime.time(...) ## Soubory v projektu - `explore_db.py` – výpis všech tabulek a jejich sloupců - `inspect_table.py` – detailní info o konkrétní tabulce (arg: název tabulky) - `sample_dekurs.py` – ukázky nejstarších a nejnovějších záznamů - `sample_dekurs2.py` – celý text jednoho záznamu - `sample_rtf.py` – nejdelší záznamy pacienta (dle délky RTF) - `analyze_rtf.py` – analýza RTF tagů v záznamu - `insert_test.py` – testovací INSERT do DEKURS - `CLAUDE_NOTES.md` – tento soubor ## Další postup (nápady) - Napsat `rtf_to_text()` pro extrakci čistého textu z dekurzů - Prozkoumat tabulky: LECH/LECD (léky?), POU (poukazy?), AMBULEKY (výkony?) - První report – domluvit s uživatelem co chce vidět