feat(maria): raspunsul omului de la suport se pastreaza in jurnalul escaladarii

Jurnalul pastra doar intrebarile FARA raspuns. Replica omului care prelua
discutia se scria numai in firul din `conversations/`, care se sterge dupa
FIR_TTL_MIN — deci exact rezolvarea disparea, iar perechea eroare + rezolvare
trebuia recuperata manual din WhatsApp.

Acum, cat tine preluarea, fiecare mesaj al omului se adauga la fisierul
escaladarii (`completari`, `"fel": "raspuns_om"`, cu cine a scris). La fiecare
mesaj, nu doar la primul: rezolvarea vine de obicei in doua-trei replici. De aici
se pot extrage erorile si rezolvarile pentru `document_store` — „CUI cumparator
incorect" ajunge in documente doar daca o scrie cineva, si cel mai ieftin loc de
unde poate fi scrisa e ce a raspuns deja omul o data.

Limita, documentata in README: preluarea se detecteaza doar in grupuri cu cel
putin FIR_PRELUARE_MIN_PARTICIPANTI participanti, deci nu in self-chat si nu in
grupul de test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
Claude Agent
2026-09-01 20:04:14 +00:00
parent 6686a5406c
commit a4fe127926
3 changed files with 91 additions and 0 deletions

View File

@@ -144,3 +144,36 @@ def test_puntea_respinge_mesajul_nu_promitem_ca_a_plecat(rezultat_fara_acoperire
inregistrare = json.loads(next((config.STATE_DIR / "escalations").glob("*.json")).read_text())
assert inregistrare["notified"] is False
assert "503" in inregistrare["notify_error"]
def test_raspunsul_omului_intra_in_fisierul_escaladarii(tmp_path, monkeypatch):
"""Perechea eroare + rezolvare, in acelasi fisier.
Inainte, replica omului traia doar in firul din `conversations/`, care se
sterge la TTL: jurnalul pastra intrebarile fara raspuns si niciun raspuns.
"""
import json
import time
import config
import consumer
d = config.STATE_DIR / "escalations"
d.mkdir(parents=True, exist_ok=True)
(d / f"{int(time.time())}-M-TEST-OM.json").write_text(
json.dumps({"ref": "M-TEST-OM", "text": "CUI cumparator incorect"}), encoding="utf-8")
consumer.raspuns_de_om("M-TEST-OM", {"id": "1", "pushName": "Suport"},
"Se corecteaza CUI-ul partenerului si se retrimite factura.")
consumer.raspuns_de_om("M-TEST-OM", {"id": "2", "pushName": "Suport"}, " ")
record = json.loads(next(d.glob("*-M-TEST-OM.json")).read_text(encoding="utf-8"))
completari = record["completari"]
assert len(completari) == 1, "mesajul gol nu are ce cauta in jurnal"
assert completari[0]["fel"] == "raspuns_om"
assert completari[0]["cine"] == "Suport"
assert "retrimite" in completari[0]["text"]
def test_raspunsul_omului_pe_o_escaladare_care_nu_exista_nu_crapa():
import consumer
consumer.raspuns_de_om("M-NU-EXISTA", {"id": "1"}, "orice")