feat(api): validare cod_prestatie la nomenclator + optiune on_unmapped_error
Cod_prestatie necunoscut in nomenclator nu se mai trimite raw la RAR (HTTP 500 ORA-12899 + record partial FINALIZATA pe care reconcilierea il marca fals sent): e promovat la cod_op_service si tratat ca operatie de mapat. Optiune top-level boolean on_unmapped_error pe POST /v1/prezentari + /valideaza: - false (default) -> submission needs_mapping (intra in editor) - true -> respinge fara enqueue (status error, submission_id=null, erori) - None -> default per-cont accounts.on_unmapped_error_default (implicit 0) Inlocuieste enum-ul anterior on_unmapped (needs_mapping/error) cu un boolean mai simplu; coloana de cont migrata aditiv la INTEGER on_unmapped_error_default. Izolare teste de .env-ul de dezvoltare: tests/conftest.py fixeaza default sigur pe AUTOPASS_REQUIRE_API_KEY / AUTOPASS_WORKER_USE_TEST_CREDS (precedenta peste .env in pydantic-settings) + fixturile env din test_creds_delivery/test_t1 pineaza explicit aceste flag-uri, ca fallback-ul creds pe cont sa fie atins. Teste: 752 passed (fara flag pe CLI). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,12 +19,25 @@ from .config import Settings, get_settings
|
||||
|
||||
|
||||
class RarError(Exception):
|
||||
"""Eroare la apel RAR. `status_code` = HTTP RAR; `field_errors` = lista [{field,message}] la 400."""
|
||||
"""Eroare la apel RAR. `status_code` = HTTP RAR; `field_errors` = lista [{field,message}] la 400.
|
||||
|
||||
def __init__(self, message: str, *, status_code: int | None = None, field_errors: list[dict] | None = None):
|
||||
`rar_message` = mesajul din envelope-ul de eroare al RAR (`{statusCode, message, data}`),
|
||||
cand exista. Prezenta lui pe un 5xx inseamna ca RAR A RASPUNS definitiv „am esuat"
|
||||
(nu o pierdere de raspuns) -> worker-ul il trateaza ca permanent, nu reconciliaza.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
message: str,
|
||||
*,
|
||||
status_code: int | None = None,
|
||||
field_errors: list[dict] | None = None,
|
||||
rar_message: str | None = None,
|
||||
):
|
||||
super().__init__(message)
|
||||
self.status_code = status_code
|
||||
self.field_errors = field_errors or []
|
||||
self.rar_message = rar_message
|
||||
|
||||
|
||||
class RarAuthError(RarError):
|
||||
@@ -105,7 +118,14 @@ class RarClient:
|
||||
errors = body.get("data") if isinstance(body.get("data"), list) else []
|
||||
msg = body.get("message", "Validare esuata la RAR")
|
||||
raise RarError(msg, status_code=400, field_errors=errors)
|
||||
raise RarError(f"postPrezentare esuat (HTTP {resp.status_code})", status_code=resp.status_code)
|
||||
# Non-200/non-400: pastram mesajul din envelope-ul RAR daca exista (ex. 500 cu
|
||||
# `{"statusCode":500,"message":"Eroare la adaugarea prezentarii : ORA-..."}`).
|
||||
rar_message = body.get("message") if isinstance(body, dict) else None
|
||||
raise RarError(
|
||||
f"postPrezentare esuat (HTTP {resp.status_code})",
|
||||
status_code=resp.status_code,
|
||||
rar_message=rar_message,
|
||||
)
|
||||
|
||||
def get_finalizate(self, token: str) -> list[dict]:
|
||||
"""Lista prezentarilor finalizate (pentru reconciliere — T2).
|
||||
|
||||
Reference in New Issue
Block a user