82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
#!/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"}
|