exemple integrare

This commit is contained in:
Claude Agent
2026-07-09 13:42:55 +00:00
parent e80a20c856
commit 9b5006f26c
3 changed files with 81 additions and 1 deletions

View File

@@ -69,6 +69,50 @@ def _payload_json_compact(account_id: int) -> str:
return json.dumps(_payload_prezentari_dict(account_id), separators=(",", ":"), ensure_ascii=False) return json.dumps(_payload_prezentari_dict(account_id), separators=(",", ":"), ensure_ascii=False)
def _exemplu_cerere_dict() -> dict:
"""Cerere exemplu completa: ambele forme de prestatie + campuri optionale uzuale."""
return {
"prezentari": [
{
"vin": "WVWZZZ1JZXW000001",
"nr_inmatriculare": "B123ABC",
"data_prestatie": "2026-06-22",
"odometru_final": "150000",
"odometru_initial": "149500",
"prestatii": [
{"cod_prestatie": "OE-1"},
{"cod_op_service": "SF01", "denumire": "Schimb filtru ulei"},
],
}
],
"rar_env": "test",
}
def _exemplu_raspuns_dict() -> dict:
"""Raspuns exemplu in forma implicita `minim`: 6 chei fixe per rezultat."""
return {
"results": [
{
"index": 0,
"submission_id": 123,
"vehicul": "B123ABC",
"status": "queued",
"motiv": None,
"id_prezentare": None,
}
]
}
def exemplu_json() -> dict:
"""Perechea cerere/raspuns JSON formatata pentru cardul din pagina Integrare."""
return {
"cerere": json.dumps(_exemplu_cerere_dict(), indent=2, ensure_ascii=False),
"raspuns": json.dumps(_exemplu_raspuns_dict(), indent=2, ensure_ascii=False),
}
def _snippet_curl_prezentari(base_url: str, account_id: int) -> str: def _snippet_curl_prezentari(base_url: str, account_id: int) -> str:
payload = _payload_json_str(account_id) payload = _payload_json_str(account_id)
return f"""curl -X POST "{base_url}/v1/prezentari" \\ return f"""curl -X POST "{base_url}/v1/prezentari" \\

View File

@@ -516,7 +516,7 @@ def _render_integrare(request: Request, conn, account_id: int) -> str:
configurate pe cont), preia base_url real si genereaza snippet-uri multi-limbaj. configurate pe cont), preia base_url real si genereaza snippet-uri multi-limbaj.
""" """
from ..mapping import account_or_default from ..mapping import account_or_default
from .integrare_examples import exemple as _exemple from .integrare_examples import exemple as _exemple, exemplu_json as _exemplu_json
acct = account_or_default(account_id) acct = account_or_default(account_id)
row_creds = conn.execute( row_creds = conn.execute(
@@ -538,6 +538,7 @@ def _render_integrare(request: Request, conn, account_id: int) -> str:
"account_id": acct, "account_id": acct,
"base_url": base_url, "base_url": base_url,
"exemple": ex, "exemple": ex,
"exemplu_json": _exemplu_json(),
"are_cheie": are_cheie, "are_cheie": are_cheie,
"are_creds": are_creds, "are_creds": are_creds,
"csrf_token": csrf_token, "csrf_token": csrf_token,

View File

@@ -216,6 +216,41 @@
</div> </div>
</div> </div>
{# Card: exemplu cerere + raspuns JSON pentru POST /v1/prezentari #}
<div class="card" style="margin-bottom:16px;">
<h3 style="margin:0 0 6px; font-size:15px;">Cerere si raspuns JSON</h3>
<p class="muted" style="font-size:12px; margin:0 0 12px;">
<code>POST /v1/prezentari</code> — o prezentare cu doua operatii: una cu cod RAR direct
(<code>cod_prestatie</code>), una cu cod intern + denumire (mapata automat de gateway).
</p>
<div style="display:flex; flex-wrap:wrap; gap:12px;">
<div style="flex:1 1 320px; min-width:0;">
<p style="font-size:12.5px; margin:0 0 4px;"><strong>Cerere</strong></p>
<div style="position:relative;">
<button class="btn-copiaza" aria-label="Copiaza exemplu cerere JSON" style="position:absolute; top:8px; right:8px; font-size:12px; padding:4px 10px; background:var(--line); color:var(--ink); border:1px solid var(--line); border-radius:4px; cursor:pointer;">Copiaza</button>
<pre style="background:var(--bg); border:1px solid var(--line); border-radius:6px; padding:16px; overflow-x:auto; margin:0;"><code style="font-size:12px; font-family:ui-monospace,monospace; color:var(--ink);">{{ exemplu_json["cerere"] | e }}</code></pre>
</div>
<div aria-live="polite" class="copiaza-feedback muted" style="font-size:12px; min-height:20px; margin-top:4px;"></div>
</div>
<div style="flex:1 1 320px; min-width:0;">
<p style="font-size:12.5px; margin:0 0 4px;"><strong>Raspuns 200</strong> <span class="muted">(forma implicita <code>minim</code>)</span></p>
<div style="position:relative;">
<button class="btn-copiaza" aria-label="Copiaza exemplu raspuns JSON" style="position:absolute; top:8px; right:8px; font-size:12px; padding:4px 10px; background:var(--line); color:var(--ink); border:1px solid var(--line); border-radius:4px; cursor:pointer;">Copiaza</button>
<pre style="background:var(--bg); border:1px solid var(--line); border-radius:6px; padding:16px; overflow-x:auto; margin:0;"><code style="font-size:12px; font-family:ui-monospace,monospace; color:var(--ink);">{{ exemplu_json["raspuns"] | e }}</code></pre>
</div>
<div aria-live="polite" class="copiaza-feedback muted" style="font-size:12px; min-height:20px; margin-top:4px;"></div>
</div>
</div>
<ul class="muted" style="font-size:12px; margin:8px 0 0; padding-left:18px; line-height:1.6;">
<li>Obligatorii: <code>vin</code>, <code>nr_inmatriculare</code>, <code>data_prestatie</code> (YYYY-MM-DD), <code>odometru_final</code> (string), <code>prestatii</code> (min. 1).</li>
<li>Fiecare prestatie are <code>cod_prestatie</code> (cod RAR din <a href="/?tab=nomenclator">nomenclator</a>) SAU <code>cod_op_service</code> + <code>denumire</code> — gateway-ul le mapeaza la cod RAR.</li>
<li>Optionale: <code>odometru_initial</code>, <code>obs</code>; <code>rar_env</code> (<code>"test"</code> / <code>"prod"</code>) — absent = mediul implicit al contului.</li>
<li>Un rezultat per prezentare, in aceeasi ordine (<code>index</code> = pozitia din cerere). <code>status</code>: <code>queued</code> (in coada), <code>needs_mapping</code> / <code>needs_data</code> / <code>error</code> (blocat — vezi <code>motiv</code>).</li>
<li><code>id_prezentare</code> e completat doar cand randul era DEJA trimis la RAR (duplicat detectat); altfel apare ulterior, in dashboard sau la <code>GET /v1/prezentari/{id}</code>.</li>
<li>Vrei detalii complete (erori pe camp, coduri nemapate, <code>held</code>)? Trimite <code>"raspuns": "complet"</code> in body.</li>
</ul>
</div>
{# Card: De ce nu ajunge la RAR? (onestitate canal API) #} {# Card: De ce nu ajunge la RAR? (onestitate canal API) #}
{# Un POST /v1/prezentari poate intoarce 200 dar randul sa NU plece la RAR. #} {# Un POST /v1/prezentari poate intoarce 200 dar randul sa NU plece la RAR. #}
<div class="card" style="margin-bottom:16px;"> <div class="card" style="margin-bottom:16px;">