notebookvb

This commit is contained in:
Vladimir Buzalka
2026-06-14 12:07:35 +02:00
parent 9133fe9497
commit 2bdac59676
16 changed files with 1484 additions and 29 deletions
+81
View File
@@ -0,0 +1,81 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
recept_dialog.py — formátování otázky do Telegramu a parsování odpovědi člověka.
Čisté funkce bez vedlejších efektů (snadno testovatelné).
"""
import re
import unicodedata
def _bez_diakritiky(s: str) -> str:
s = unicodedata.normalize("NFKD", s or "")
return "".join(c for c in s if not unicodedata.combining(c))
def format_otazka(rec: dict) -> str:
"""Sestaví text otázky do Telegramu z pending záznamu."""
sk = rec.get("skore")
lines = ["🟡 Žádost o recept — nejistá identifikace"
+ (f" (jistota {sk}/100)" if sk is not None else "")]
if rec.get("sender"):
lines.append(f"Od: {rec['sender']}")
if rec.get("email_subject"):
lines.append(f"Předmět: {rec['email_subject']}")
if rec.get("leky_str"):
lines.append(f"Léky: {rec['leky_str']}")
if rec.get("duvody"):
lines.append("Proč nejisté: " + "; ".join(rec["duvody"]))
kand = rec.get("kandidati") or []
if kand:
lines.append("")
lines.append("Kandidáti:")
for i, k in enumerate(kand, 1):
lines.append(
f" {i}) {k.get('prijmeni', '')} {k.get('jmeno', '')}"
f", RČ {k.get('rc', '?')}, nar. {k.get('datnar', '?')}"
f", poj. {k.get('poj', '?')}"
)
else:
lines.append("")
lines.append("(žádný kandidát v kartotéce)")
lines.append("")
lines.append("Odpověz jako reply na tuto zprávu:")
lines.append("• RČ správného pacienta (definitivní)")
if kand:
lines.append("• nebo číslo kandidáta (1, 2, …)")
lines.append("• nebo „ne“ = nezakládat")
return "\n".join(lines)
_SKIP = {
"ne", "nezakladat", "preskoc", "preskocit", "zahodit", "zahod",
"ignoruj", "nic", "stop", "nezaklada", "nezakladej",
}
def parse_odpoved(text: str) -> dict:
"""Rozparsuje odpověď člověka.
Vrací dict:
{"akce": "rc", "rc": "7309208104"} definitivní RČ pacienta
{"akce": "kandidat", "index": 1} výběr kandidáta podle pořadí
{"akce": "preskoc"} nezakládat
{"akce": "nejasne"} nerozpoznáno
"""
t = (text or "").strip()
low = _bez_diakritiky(t).lower().strip().rstrip(".!")
if low in _SKIP:
return {"akce": "preskoc"}
digits = re.sub(r"\D", "", t)
if len(digits) in (9, 10):
return {"akce": "rc", "rc": digits}
m = re.fullmatch(r"\s*(\d{1,2})\s*", t)
if m:
return {"akce": "kandidat", "index": int(m.group(1))}
return {"akce": "nejasne"}