# Export și PDF

Ce documente poți scoate din platformă ca PDF sau CSV, din ce pagină și prin ce rută.

## Pe scurt

Platforma scoate documente în trei feluri:

| Fel | Cum funcționează |
| --- | --- |
| **Fișier de pe server** | serverul trimite un PDF sau CSV gata făcut, prin rută |
| **Tipar din browser** | pagina pregătește foaia și deschide dialogul de tipărire; de acolo alegi „Salvează ca PDF” |
| **CSV făcut în pagină** | pagina construiește fișierul din datele afișate deja, fără o cerere nouă |

## Documentele

| Document | Pagina | Format | Cum | Rută |
| --- | --- | --- | --- | --- |
| Raportul unei perioade | `/app/rapoarte` | PDF | server | `GET /v1/rapoarte/:id/pdf` |
| Raportul unei zile, pe secțiuni | `/app/rapoarte` | PDF sau CSV | server | `POST /v1/rapoarte/descarca` |
| Vânzări zi cu zi, vânzări pe produs | `/app/rapoarte` | CSV | în pagină | — |
| Factura emisă din bon | `/app/facturi` | PDF | server | `GET /v1/facturi-documente/:id/pdf` |
| Factura pe foaie (ciornă sau emisă) | `/app/facturi` | PDF | tipar | — |
| Factura primită din SPV (ANAF) | `/app/facturi-primite` | PDF sau XML | server | `GET /v1/spv/facturi/:id/:tip` (`tip` = `pdf` sau `xml`) |
| Documentul unei tranzacții din evidență | — (doar API) | fișierul atașat (PDF sau poză) | server | `GET /v1/evidenta/tranzactii/:id/documente/:doc` |
| Oferta de preț | `/app/clienti-club` | PDF | tipar | — |
| Lista ofertelor | `/app/clienti-club` | CSV | în pagină | — |
| Lista clienților | `/app/clienti-club` | CSV | în pagină | — |
| Profit și pierdere pe an | `/app/profit-pierdere` | CSV | în pagină | — |
| Statisticile firmei pe luni | `/app/statistici-firma` | CSV | în pagină | — |
| Serviciile în lucru | `/app/registru` | CSV | în pagină | — |
| Oferta din registru | `/app/registru` | PDF | tipar | — |
| Actele din registru | `/app/registru` | PDF | vizualizare în pagină | — |

> [!NOTE]
> La documentele „tipar” nu se descarcă un fișier direct: se deschide dialogul de tipărire al browserului. De acolo alegi „Salvează ca PDF”.

## Raportul unei zile

```json title="POST /v1/rapoarte/descarca"
{ "zi": "2026-11-10", "sectiuni": ["total", "per_produs", "numerar_card"], "format": "pdf" }
```

| Câmp | Valori |
| --- | --- |
| `zi` | o zi reală, `AAAA-LL-ZZ` (de exemplu `2026-02-30` e refuzată) |
| `sectiuni` | cel puțin una, fără dubluri: `total`, `statistici`, `per_produs`, `livrari`, `numerar_card`, `neconcordante`, `nota`, `lista`, `lista_vanzari` |
| `format` | `pdf` sau `csv` |

| Răspuns | Când |
| --- | --- |
| `200` | documentul, ca atașament `raport-<zi>.<format>` |
| `403 sectiune_interzisa` | ai cerut o secțiune pe care rolul tău nu o are |
| `409 zi_neinchisa` | ziua nu e închisă încă la casă |
| `502 punte_esuata` | raportul nu s-a putut genera acum |

Secțiunile permise se calculează pe server, după rol, nu din pagină. Rolurile fără drept de finanțe nu au nicio secțiune permisă. Un om căruia nu i s-a deschis ecranul primește `404`.

## Rapoartele pe perioadă

`GET /v1/rapoarte/:id/pdf` întoarce PDF-ul ca atașament `raport-<id>.pdf`. Fiecare raport aparține unui rol; un rol diferit primește `403 alt_rol`. Ruta răspunde doar firmei pentru care sunt configurate rapoartele; pentru celelalte, `404`, ca să nu afli nici dacă raportul există.

## CSV-urile

CSV-urile sunt UTF-8; aproape toate au BOM la început, ca Excel să afișeze corect diacriticele (excepție: statisticile firmei). Separatorul diferă:

| Fișier | Separator |
| --- | --- |
| Raportul zilei (server), vânzările din `/app/rapoarte`, profit și pierdere | `;` |
| Clienții, ofertele, serviciile în lucru, statisticile firmei | `,` |

În CSV-ul clienților, o celulă care începe cu `=`, `+`, `-` sau `@` primește un apostrof în față, ca Excel să nu o ia drept formulă.

> [!WARNING]
> Un CSV făcut în pagină conține doar ce vezi: lista filtrată, nu toată baza. Schimbă filtrele înainte de export dacă vrei mai mult.

## Antetele fișierelor de pe server

```http title="Antete la descărcare"
Content-Type: application/pdf
Content-Disposition: attachment; filename="raport-2026-11-10.pdf"
Cache-Control: private, no-store
X-Content-Type-Options: nosniff
```

Facturile în PDF (din bon, din SPV) și documentele din evidență se deschid `inline`, direct în browser; XML-ul din SPV și rapoartele se descarcă (`attachment`). Rapoartele și fișierele din SPV au `Cache-Control: private, no-store`, deci nu rămân în memoria intermediară.
