239 lines
9.9 KiB
Python
239 lines
9.9 KiB
Python
"""test_import_single.py – vloží 1 soubor do dekurzu s rozšířenou logikou:
|
||
|
||
1. Poslední dekurs pacienta je z dnešního dne A má sekci 'Vložené přílohy'
|
||
→ soubor se přidá DO té sekce (ne nová sekce)
|
||
2. Poslední dekurs je z dnešního dne, ale sekci 'Vložené přílohy' nemá
|
||
→ prepend nové sekce na začátek
|
||
3. Poslední dekurs je z jiného dne / neexistuje
|
||
→ nový dekurs pro dnešek
|
||
|
||
Spustit na Windows.
|
||
"""
|
||
import datetime, os, re, fdb
|
||
import funkce, funkce_ext
|
||
|
||
CESTA = r'u:\\'
|
||
IDPAC = 9742
|
||
DATUM = datetime.date(2026, 3, 18)
|
||
|
||
SOUBORY = [
|
||
{'souborname': '7309208104 2026-03-18 Buzalka, Vladimír [vyšetření] [ahoj Claude - zařazení].pdf',
|
||
'prvnizavorka': 'vyšetření',
|
||
'druhazavorka': 'ahoj Claude - zařazení',
|
||
'datum': DATUM},
|
||
]
|
||
|
||
# Vzor pro detekci sekce Vložené přílohy (RTF kódování win1250)
|
||
PRILOHY_HEADER = r"Vlo\'9een\'e9 p\'f8\'edlohy:"
|
||
PRILOHY_CLOSING = r'\pard\s10\plain\cs15\f0\fs20 \par'
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
def najdi_posledni_dekurs_dnes(conn, idpac, datum_vlozeni):
|
||
"""Vrátí (id, rtf) posledního dekurzu pacienta pokud je z dnešního dne."""
|
||
cur = conn.cursor()
|
||
cur.execute("""
|
||
SELECT FIRST 1 ID, DATUM, DEKURS FROM DEKURS
|
||
WHERE IDPAC = ?
|
||
ORDER BY ID DESC
|
||
""", (idpac,))
|
||
row = cur.fetchone()
|
||
if row is None:
|
||
return None
|
||
dekurs_id, dekurs_datum, dekurs_rtf = row
|
||
print(f" Poslední dekurs: ID={dekurs_id}, datum={dekurs_datum}")
|
||
if dekurs_datum == datum_vlozeni:
|
||
print(f" → dnešní den ({datum_vlozeni}) ✓")
|
||
return (dekurs_id, dekurs_rtf)
|
||
else:
|
||
print(f" → jiný den ({dekurs_datum} ≠ {datum_vlozeni}), vytvoříme nový")
|
||
return None
|
||
|
||
|
||
def ma_sekci_prilohy(rtf):
|
||
return PRILOHY_HEADER in rtf
|
||
|
||
|
||
def pridat_do_sekce_prilohy(rtf, new_bkm_entry, filenameforbookmark):
|
||
"""Přidá soubor do EXISTUJÍCÍ sekce 'Vložené přílohy'.
|
||
|
||
Postup:
|
||
1. Spočítá počet Files: odkazů = N → nový index = N
|
||
2. Posune bkmkstart/bkmkend >= N o +1 (uvolní místo pro nový)
|
||
3. Vloží nový \pard před uzavírací prázdný řádek sekce
|
||
4. Vloží bookmark na pozici N do {\info{\bookmarks ...}}
|
||
"""
|
||
# 1. Počet existujících Files: odkazů v bookmarks listu
|
||
bkm_match = re.search(r'\{\\info\{\\bookmarks ([^}]*)\}\}', rtf)
|
||
if bkm_match:
|
||
bkm_entries = [e for e in bkm_match.group(1).split(';') if e.strip()]
|
||
n_files = sum(1 for e in bkm_entries if '"Files:' in e)
|
||
else:
|
||
bkm_entries = []
|
||
n_files = 0
|
||
|
||
new_idx = n_files
|
||
print(f" Počet existujících Files odkazů: {n_files} → nový bkmkstart={new_idx}")
|
||
|
||
# 2. Posunout bkmkstart/bkmkend >= n_files o +1
|
||
rtf = re.sub(r'\\bkmkstart (\d+)',
|
||
lambda m: '\\bkmkstart ' + (
|
||
str(int(m.group(1)) + 1) if int(m.group(1)) >= n_files
|
||
else m.group(1)),
|
||
rtf)
|
||
rtf = re.sub(r'\\bkmkend (\d+)',
|
||
lambda m: '\\bkmkend ' + (
|
||
str(int(m.group(1)) + 1) if int(m.group(1)) >= n_files
|
||
else m.group(1)),
|
||
rtf)
|
||
|
||
# 3. Najít uzavírající prázdný řádek sekce (první výskyt po hlavičce)
|
||
prilohy_pos = rtf.find(PRILOHY_HEADER)
|
||
closing_pos = rtf.find(PRILOHY_CLOSING, prilohy_pos)
|
||
if closing_pos == -1:
|
||
raise RuntimeError("Nenalezen uzavírací řádek sekce Vložené přílohy!")
|
||
|
||
new_pard = (r'\pard\s10{\*\bkmkstart ' + str(new_idx) + r'}'
|
||
r'\plain\cs32\f0\ul\fs20\cf1 ' + filenameforbookmark
|
||
+ r'{\*\bkmkend ' + str(new_idx) + r'}\par')
|
||
|
||
rtf = rtf[:closing_pos] + new_pard + '\n' + rtf[closing_pos:]
|
||
|
||
# 4. Vložit bookmark na pozici n_files do {\info{\bookmarks}}
|
||
def insert_bookmark(m):
|
||
entries = [e for e in m.group(1).split(';') if e.strip()]
|
||
entries.insert(n_files, new_bkm_entry)
|
||
return '{\\info{\\bookmarks ' + ';'.join(entries) + '}}'
|
||
|
||
rtf = re.sub(r'\{\\info\{\\bookmarks ([^}]*)\}\}', insert_bookmark, rtf)
|
||
return rtf
|
||
|
||
|
||
def merge_rtf_prepend(existing_rtf, new_bkm_list, new_body_pards, n_new):
|
||
"""Vloží nový obsah na ZAČÁTEK stávajícího dekurzu (žádná existující sekce)."""
|
||
rtf = existing_rtf
|
||
rtf = re.sub(r'\\bkmkstart (\d+)',
|
||
lambda m: '\\bkmkstart ' + str(int(m.group(1)) + n_new), rtf)
|
||
rtf = re.sub(r'\\bkmkend (\d+)',
|
||
lambda m: '\\bkmkend ' + str(int(m.group(1)) + n_new), rtf)
|
||
|
||
new_bkm_str = ';'.join(new_bkm_list)
|
||
|
||
def merge_bkm(m):
|
||
existing = m.group(1).strip()
|
||
combined = new_bkm_str + (';' + existing if existing else '')
|
||
return '{\\info{\\bookmarks ' + combined + '}}'
|
||
|
||
if re.search(r'\{\\info\{\\bookmarks', rtf):
|
||
rtf = re.sub(r'\{\\info\{\\bookmarks ([^}]*)\}\}', merge_bkm, rtf)
|
||
else:
|
||
rtf = re.sub(r'(\\deflang\d+)',
|
||
r'\1{\\info{\\bookmarks ' + new_bkm_str + '}}', rtf, count=1)
|
||
|
||
match = re.search(r'\\uc1\\pard', rtf)
|
||
if match:
|
||
pos = match.start()
|
||
rtf = rtf[:pos] + new_body_pards + '\n' + rtf[pos:]
|
||
return rtf
|
||
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
conn = fdb.connect(dsn=r'localhost:c:\medicus 3\data\medicus.fdb',
|
||
user='SYSDBA', password='masterkey', charset='WIN1250')
|
||
|
||
# ── Krok 1: vložit soubory do ext DB ─────────────────────────────────────────
|
||
bookmark_list = []
|
||
bookmarks_body = ''
|
||
cislo = 9
|
||
poradi = 0
|
||
|
||
for s in SOUBORY:
|
||
cesta_souboru = os.path.join(CESTA, s['souborname'])
|
||
datumsouboru = datetime.datetime.fromtimestamp(os.path.getmtime(cesta_souboru))
|
||
|
||
print(f"\n>>> Zpracovávám: {s['souborname']}")
|
||
fileid = funkce_ext.zapis_file_ext(
|
||
vstupconnection=conn, idpac=IDPAC,
|
||
cesta=CESTA, souborname=s['souborname'],
|
||
prvnizavorka=s['prvnizavorka'],
|
||
soubordate=s['datum'], souborfiledate=datumsouboru,
|
||
poznamka=s['druhazavorka'],
|
||
)
|
||
print(f" → FILES.ID = {fileid}")
|
||
|
||
filenameforbookmark = (s['datum'].strftime('%Y-%m-%d') + ' '
|
||
+ s['prvnizavorka'] + ': ' + s['druhazavorka'])
|
||
bookmark_list.append('"' + filenameforbookmark + '","Files:' + str(fileid) + '",' + str(cislo))
|
||
cislo += 7
|
||
|
||
bookmarks_body += (r'\pard\s10{\*\bkmkstart ' + str(poradi) + r'}'
|
||
r'\plain\cs32\f0\ul\fs20\cf1 ' + filenameforbookmark
|
||
+ r'{\*\bkmkend ' + str(poradi) + r'}\par')
|
||
poradi += 1
|
||
|
||
new_body = (r'\uc1\pard\s10\plain\cs20\f0\i\fs20 Vlo\'9een\'e9 p\'f8\'edlohy:\par' + '\n'
|
||
+ bookmarks_body + '\n'
|
||
+ r'\pard\s10\plain\cs15\f0\fs20 \par')
|
||
|
||
# ── Krok 2: rozhodovací logika ────────────────────────────────────────────────
|
||
print(f"\n>>> Hledám poslední dekurs pro IDPAC={IDPAC}...")
|
||
existujici = najdi_posledni_dekurs_dnes(conn, IDPAC, DATUM)
|
||
cur = conn.cursor()
|
||
now = datetime.datetime.now()
|
||
|
||
if existujici:
|
||
dekurs_id, existing_rtf = existujici
|
||
|
||
if ma_sekci_prilohy(existing_rtf):
|
||
# ── Případ 1: dnešní dekurs s existující sekcí → přidáme do ní ──────
|
||
print(f"\n>>> Sekce 'Vložené přílohy' nalezena v DEKURS ID={dekurs_id}")
|
||
print(">>> Přidávám soubor DO existující sekce...")
|
||
filenameforbookmark = (SOUBORY[0]['datum'].strftime('%Y-%m-%d') + ' '
|
||
+ SOUBORY[0]['prvnizavorka'] + ': ' + SOUBORY[0]['druhazavorka'])
|
||
merged_rtf = pridat_do_sekce_prilohy(
|
||
existing_rtf,
|
||
bookmark_list[0],
|
||
filenameforbookmark
|
||
)
|
||
else:
|
||
# ── Případ 2: dnešní dekurs bez sekce → prepend ───────────────────────
|
||
print(f"\n>>> DEKURS ID={dekurs_id} nemá sekci příloh → prepend nové sekce")
|
||
merged_rtf = merge_rtf_prepend(existing_rtf, bookmark_list, new_body, len(SOUBORY))
|
||
|
||
print("\n=== Výsledný RTF ===")
|
||
print(merged_rtf)
|
||
|
||
cur.execute("UPDATE DEKURS SET DEKURS = ? WHERE ID = ?", (merged_rtf, dekurs_id))
|
||
conn.commit()
|
||
print(f"\n>>> UPDATE DEKURS ID={dekurs_id} – hotovo!")
|
||
|
||
else:
|
||
# ── Případ 3: žádný dnešní dekurs → nový ─────────────────────────────────
|
||
print(f"\n>>> Žádný dekurs pro {DATUM} → vytvářím nový...")
|
||
bookmark_str = ';'.join(bookmark_list)
|
||
rtf = r"""{\rtf1\ansi\ansicpg1250\uc1\deff0\deflang1029{\info{\bookmarks BOOKMARKNAMES}}{\fonttbl{\f0\fnil\fcharset238 Arial;}{\f5\fnil\fcharset238 Symbol;}}
|
||
{\colortbl ;\red0\green0\blue255;\red0\green128\blue0;\red0\green0\blue0;}
|
||
{\stylesheet{\s10\fi0\li0\ql\ri0\sb0\sa0 Vlevo;}{\*\cs15\f0\fs20 Norm\'e1ln\'ed;}{\*\cs20\f0\i\fs20 Z\'e1hlav\'ed;}{\*\cs32\f0\ul\fs20\cf1 Odkaz;}}
|
||
BOOKMARKSTEXT
|
||
\pard\s10\plain\cs15\f0\fs20 \par
|
||
}"""
|
||
rtf = rtf.replace('BOOKMARKNAMES', bookmark_str)
|
||
rtf = rtf.replace('BOOKMARKSTEXT', new_body)
|
||
|
||
print("\n=== Výsledný RTF ===")
|
||
print(rtf)
|
||
|
||
dekursid = funkce.get_dekurs_id(conn)
|
||
cur.execute(
|
||
"INSERT INTO DEKURS (id, iduzi, idprac, idodd, idpac, datum, cas, dekurs)"
|
||
" VALUES (?,?,?,?,?,?,?,?)",
|
||
(dekursid, 6, 2, 2, IDPAC, now.date(), now.time(), rtf)
|
||
)
|
||
conn.commit()
|
||
print(f"\n>>> Nový DEKURS ID={dekursid}")
|
||
|
||
conn.close()
|
||
print("\n=== HOTOVO ===")
|
||
print("Otevři Medicus → karta Buzalka → zkontroluj dekurs!")
|