notebookvb
This commit is contained in:
@@ -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"}
|
||||
Reference in New Issue
Block a user