# Fluxul de evenimente

Fiecare schimbare din firmă devine un eveniment numerotat. Îl poți asculta în timp real, cu reluare de unde ai rămas.

## Jurnalul de evenimente

Fiecare scriere importantă (un preț schimbat, un produs oprit, o firmă creată) lasă un rând în tabelul `events`. Rândurile au un număr crescător, `seq`, care dă ordinea exactă a schimbărilor din firmă.

```json title="Un eveniment"
{
  "seq": 18342,
  "colectie": "produse",
  "id": "0b6c…",
  "camp": "pret",
  "inainte": 32,
  "dupa": 34,
  "cine": "ana@firma.ro",
  "sursa": "platforma",
  "la": "2026-11-11T10:24:05Z"
}
```

| Câmp | Ce înseamnă |
| --- | --- |
| `seq` | numărul evenimentului, crescător |
| `colectie` | ce fel de obiect s-a schimbat |
| `id` | identificatorul obiectului |
| `camp` | câmpul schimbat, sau `null` pentru o schimbare întreagă |
| `inainte`, `dupa` | valoarea veche și cea nouă |
| `cine` | cine a făcut schimbarea |
| `sursa` | `platforma`, `dls`, `poller`, `import` sau `executor` |
| `la` | momentul schimbării |

## Ascultarea în timp real

`GET /v1/evenimente` deschide un flux [Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html) pentru firma activă.

```javascript title="În browser"
const sursa = new EventSource("/nucleu/v1/evenimente", { withCredentials: true });

sursa.addEventListener("produse", (e) => {
  const ev = JSON.parse(e.data);
  console.log(ev.seq, ev.camp, ev.inainte, "→", ev.dupa);
});
```

```text title="Cum arată fluxul"
: ok

id: 18342
event: produse
data: {"seq":18342,"colectie":"produse",...}

: ping
```

- Fiecare cadru are `id` egal cu `seq`, iar `event` egal cu `colectie`.
- La 15 secunde fără evenimente vine un comentariu `: ping`, care ține conexiunea deschisă.
- Fluxul citește singur jurnalul cel puțin o dată la 5 secunde, deci un semnal pierdut întârzie un eveniment, dar nu îl pierde.

## Reluarea de unde ai rămas

La reconectare, browserul trimite singur antetul `Last-Event-ID`, iar fluxul continuă cu evenimentele de după el. Poți da cursorul și explicit:

```bash title="Reluare de la un seq"
GET /v1/evenimente?dupa=18342
```

Fără cursor, fluxul pornește de la capăt: istoricul îl citești o dată cu rutele obișnuite, apoi asculți doar ce vine.

## Alte fluxuri

| Rută | Ce transmite |
| --- | --- |
| `GET /v1/eu/flux` | notificările contului tău |
| `GET /v1/chat/flux` | mesajele din chat |
| `GET /v1/claude/taskuri/flux` | lista de taskuri, la fiecare schimbare |

## Webhook-uri

Fluxul de mai sus cere o conexiune deschisă și o sesiune. Pentru un server care trebuie doar să afle când se emite o factură, un aviz, o ofertă sau vine o comandă de catering, platforma trimite webhook-uri semnate după [Standard Webhooks](https://www.standardwebhooks.com), cu reîncercări și jurnal al livrărilor: vezi [Webhook-uri](#webhook-uri).
