# Aplicația pe telefon și notificări

Cum se instalează aplicația pe ecranul telefonului, ce notificări poți primi, cum le oprești și în ce limbă se afișează.

## Pe scurt

| Ce | Cum |
| --- | --- |
| Instalare | aplicație web (PWA): se adaugă pe ecranul principal din browser și se deschide fără bara browserului |
| Notificări | push în browser, plus clopoțelul din aplicație, după aceeași regulă de primire |
| Preferințe | pe cont și pe firmă: tipuri oprite și ore de liniște |
| Limba | română implicit; engleza e încă în lucru |

## Instalarea pe ecran

Aplicația are un manifest web (`/manifest.webmanifest`), deci telefonul o poate adăuga pe ecranul principal ca pe o aplicație.

| Câmp din manifest | Valoare |
| --- | --- |
| Nume | numele din manifestul aplicației |
| Pornește la | `/` |
| Afișare | `standalone` (rezervă: `minimal-ui`) |
| Orientare | `portrait` |
| Culoare temă și fundal | `#0e4a2b` |
| Iconițe | 192 × 192, 512 × 512 și o variantă `maskable` de 512 × 512 |

Pe iPhone, paginile au și etichetele Apple pentru ecranul principal, cu titlul din manifest.

> [!NOTE]
> Manifestul stă în spatele autentificării. De aceea, fiecare pagină îl cere cu `crossorigin="use-credentials"`. Fără asta, browserul l-ar cere fără cookie și ar primi pagina de login în loc de manifest. Un test verifică regula pe toate paginile.

Aplicația nu are un buton propriu de instalare. Instalarea se face din meniul browserului.

## Notificările push

Fiecare alertă are un **tip**. Pe pagina Setări → Notificări vezi un comutator pentru fiecare tip:

| Tip | Ce anunță |
| --- | --- |
| `z` | Z-ul nescos la 23:30 |
| `rezumat` | rezumatul zilei, la închiderea Z-ului |
| `raport_zilei` | raportul zilei gata, după închiderea Z |
| `zi_slaba` | zi slabă: vânzări mult sub obișnuit la 15:00 |
| `raport` | raportul de dimineață, la 08:00 |
| `rapoarte` | rapoartele tale pe departamente (PDF), la 21:00 |
| `tv` | televizor care nu răspunde |
| `aparate` | aparatele oprite sau pornite la loc |
| `fisier` | fișier nou pe Google Drive |
| `actualizare` | update-uri ale aplicației |
| `reparatie` | ce n-a putut repara serverul singur |
| `cod` | modificare oprită: un script al platformei are o greșeală de scriere |
| `imagine` | imagini generate, gata sau eșuate |

Orele din tabel sunt cele din catalogul tipurilor. Trimiterea propriu-zisă a notificărilor push și înregistrarea service worker-ului nu sunt în codul platformei. Ele vin din platforma veche. Pagina doar citește abonamentul push existent al browserului.

## Cine ce primește

Regula e una singură, pentru push și pentru clopoțel. Se calculează la citire, după drepturile de acum ale omului:

- fiecare tip aparține unei funcții (preparate, vânzări, aparate, fișiere, administrare sau toți); îl primești dacă ai una din paginile funcției;
- administratorul primește toate tipurile, mai puțin `modificare`;
- unele roluri au o listă albă: Gestiune Produse, Bucătar Șef și Marketing primesc doar `rapoarte` și `reduceri`, iar Patron în plus `raport_zilei`;
- alertele cu sume în lei (Z, rezumat, zi slabă, raportul zilei) ajung doar la cine vede sumele;
- rolul Patron primește alertele de preparate, vânzări și rapoarte, chiar fără paginile lor;
- `reduceri` ajunge la orice cont al firmei;
- `imagine` și `chat_gata` ajung la un singur cont anume;
- tipurile `poza` și `stoc_reumplut` sunt scoase și nu mai ajung la nimeni;
- conturile de probă nu primesc nimic.

## Cum le oprești

| Acțiune | Rută |
| --- | --- |
| Citești preferințele | `GET /v1/eu/notificari/preferinte` |
| Oprești tipuri sau pui ore de liniște | `POST /v1/eu/notificari/preferinte` |
| Marchezi „văzut” | `POST /v1/eu/notificari/vazut` |

```json title="POST /v1/eu/notificari/preferinte"
{ "oprite": ["zi_slaba", "tv"], "linisteDe": "22:00", "linistePana": "07:00" }
```

- Orele de liniște au forma `HH:MM` și vin **amândouă sau niciuna**.
- Corpul schimbă doar ce conține. Restul rămâne cum era.
- Implicit nu e nimic oprit și nu există ore de liniște.
- Butonul „Oprește pe acest dispozitiv” scoate abonamentul push al browserului curent. Pe celelalte dispozitive notificările continuă.

> [!WARNING]
> Clopoțelul marchează alertele drept văzute pe server când îl deschizi (`POST /v1/eu/notificari/vazut`). Pe un cont real, deschiderea lui schimbă starea pentru omul acela.

Platforma notează, ca urme anonime de utilizare, când o notificare push a fost afișată sau apăsată și dacă pagina rulează instalată (`pwa`). Vezi [Jurnal de audit](#jurnal-de-audit).

## Limba aplicației

- Limba implicită este **româna** (`ro-RO`). Cealaltă limbă pregătită este engleza (`en-GB`).
- Alegerea se păstrează pe server, pe cont (`GET` și `PUT /v1/eu/preferinte`). În browser rămâne doar o copie, ca prima afișare să iasă direct în limba bună.
- Engleza nu se poate alege încă din interfață: e ascunsă până la traducerea completă.
- Banii, numerele și datele se formatează după limba aleasă: `1.234,50 lei` în română.
