diff --git a/app/embeddings.py b/app/embeddings.py index c4b3a2e..0bb8387 100644 --- a/app/embeddings.py +++ b/app/embeddings.py @@ -11,7 +11,7 @@ Design (PRD 5.14, Decision #16/#16b): API public (nivel modul): index_corpus(items) -> None - suggest_nearest(text, top_k) -> [{cod, similaritate}] + suggest_nearest(text, top_k) -> [{cod, is_nul, similaritate}] is_available() -> bool Clase (pentru teste / injectare backend): @@ -242,7 +242,7 @@ def index_corpus(items: list[dict], signature: str | None = None) -> None: def suggest_nearest(denumire: str, top_k: int = 3) -> list[dict]: - """Returneaza top_k sugestii [{cod, similaritate}] sau [] la eroare. + """Returneaza top_k sugestii [{cod, is_nul, similaritate}] sau [] la eroare. Sigur de apelat indiferent de starea backend-ului. """ diff --git a/app/shared_store.py b/app/shared_store.py index ee0a13e..1bc8169 100644 --- a/app/shared_store.py +++ b/app/shared_store.py @@ -46,9 +46,12 @@ def seed_suggestions( continue is_nul = 1 if item.get("is_nul") else 0 # NUL -> cod NULL obligatoriu (supresie stricta, #4) - cod = None if is_nul else ((item.get("cod_prestatie") or "") or None) - if cod: - cod = cod.strip().upper() + # Normalizeaza INAINTE de truthiness: un cod whitespace-only (" ") sau + # ne-string trebuie sa devina NULL, nu '' (altfel rand non-NUL cu cod gol). + cod = None + if not is_nul: + raw_cod = str(item.get("cod_prestatie") or "").strip().upper() + cod = raw_cod or None source = str(item.get("source") or "llm") confidence = float(item.get("confidence") or 0.0) cur = conn.execute( diff --git a/app/web/routes.py b/app/web/routes.py index ef74397..53dcf5c 100644 --- a/app/web/routes.py +++ b/app/web/routes.py @@ -1247,7 +1247,7 @@ def _nemapate_pentru_submission(row, nomenclator: list[dict], conn=None) -> list "denumire": item.get("denumire"), "suggestions": suggest_codes(item.get("denumire"), nomenclator, limit=5), "sugestie_principala": None, - "surse_sugestie": {"gold_partajat": None, "silver": None, "embedding": None}, + "surse_sugestie": {"gold_partajat": None, "silver": None, "embedding": None, "nul": False}, } # L14-S6: imbogatire cu GOLD partajat > SILVER > embeddings (SUGGESTION-ONLY, #13) if conn is not None: diff --git a/app/web/templates/_mapari.html b/app/web/templates/_mapari.html index b6da289..397b187 100644 --- a/app/web/templates/_mapari.html +++ b/app/web/templates/_mapari.html @@ -54,11 +54,22 @@
{{ e.denumire or '(fara denumire)' }}
+ {# 5.18 US-007: badge sursa pe sugestia sistemului — confirmat (GOLD) / similar + (SILVER+embedding k-NN) / non-operatie (pre-filtru NUL). Suggestion-only. #} + {% if e.sugestie_principala %} + {% if e.sugestie_principala.sursa == 'gold_partajat' %} + confirmat + {% else %} + similar + {% endif %} + {% elif e.surse_sugestie and e.surse_sugestie.nul %} + non-operatie + {% endif %} {% if e.suggestions %} {% for s in e.suggestions[:3] %} {{ s.cod_prestatie }} ({{ s.score|round|int }}%){% if not loop.last %}, {% endif %} {% endfor %} - {% else %}—{% endif %} + {% elif not e.sugestie_principala and not (e.surse_sugestie and e.surse_sugestie.nul) %}—{% endif %}