Add MedicusWithClaude project - DB exploration scripts and notes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 14:37:00 +01:00
parent 490374b83d
commit 27338a9b85
8 changed files with 390 additions and 0 deletions

View File

@@ -0,0 +1,163 @@
# 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