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 %}
|
|