feat(api): raspuns minim implicit + corelare cerere-raspuns + sugestie cod in raspuns; coloana # in lista trimiteri
- POST /v1/prezentari: camp optional 'raspuns' (minim implicit / complet); forma minima = 6 chei fixe (index, submission_id, vehicul, status, motiv, id_prezentare), formatul detaliat ramane la cerere - corelare rezultat<->cerere: index 0-based + ecou vin/nr_inmatriculare - sugestia principala de cod RAR pe nemapate (GOLD partajat > SILVER > embeddings > fuzzy peste prag), in motiv si in nemapate[].sugestie (si pe dry-run /valideaza); suggestion-only, nu se aplica automat - lista Trimiteri: coloana # cu id-ul trimiterii (desktop + mobil) - README: sectiune 'Mapari si sugestii de cod RAR'; contract actualizat Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -97,11 +97,37 @@ class PrezentareRequest(BaseModel):
|
||||
on_unmapped_error: bool | None = None
|
||||
# Mediul RAR tinta: 'test' | 'prod'. Absent -> default-ul contului (REQ-DEFAULT).
|
||||
rar_env: Literal["test", "prod"] | None = None
|
||||
# Forma raspunsului: 'minim' (implicit) = 6 campuri fixe per rezultat
|
||||
# (index, submission_id, vehicul, status, motiv, id_prezentare);
|
||||
# 'complet' = SubmissionResult intreg (erori/nemapate/deduped/held/...).
|
||||
raspuns: Literal["minim", "complet"] | None = None
|
||||
|
||||
|
||||
class SubmissionResultMinim(BaseModel):
|
||||
"""Rezultat compact per prezentare — forma implicita a raspunsului.
|
||||
|
||||
Chei FIXE (mereu prezente), usor de parsat de clienti simpli (ex. VFP):
|
||||
`motiv` e null cand randul e curat in coada; `id_prezentare` e non-null
|
||||
doar pe dedup al unui rand deja trimis la RAR.
|
||||
"""
|
||||
|
||||
index: int
|
||||
submission_id: int | None = None
|
||||
vehicul: str
|
||||
status: str
|
||||
motiv: str | None = None
|
||||
id_prezentare: int | None = None
|
||||
|
||||
|
||||
class SubmissionResult(BaseModel):
|
||||
# submission_id e None cand cererea a fost RESPINSA fara enqueue (on_unmapped_error=True).
|
||||
submission_id: int | None = None
|
||||
# Corelare cu cererea (campuri aditive): pozitia 0-based in `prezentari`
|
||||
# + ecoul vehiculului trimis, ca integratorul sa lege fiecare rezultat
|
||||
# de randul lui fara sa se bazeze doar pe ordine.
|
||||
index: int | None = None
|
||||
vin: str | None = None
|
||||
nr_inmatriculare: str | None = None
|
||||
status: str
|
||||
id_prezentare: int | None = None
|
||||
deduped: bool = False # True daca idempotency a intors un submission existent
|
||||
@@ -127,7 +153,9 @@ class SubmissionResult(BaseModel):
|
||||
|
||||
|
||||
class PrezentariResponse(BaseModel):
|
||||
results: list[SubmissionResult]
|
||||
# Uniune per element: instantele sunt deja modelul potrivit (smart union
|
||||
# pydantic v2 pastreaza tipul exact), deci serializarea nu amesteca formele.
|
||||
results: list[SubmissionResult | SubmissionResultMinim]
|
||||
|
||||
|
||||
class ValidarePrezentariRequest(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user