# Offline Festival Setup

## Inainte de festival

1. Importa migratia centrala `database/migrations/003_local_gateway_sync.sql`.
2. In admin, deschide `/admin/events/:eventId/local-gateways`.
3. Creeaza gateway si salveaza `gateway_code` + tokenul afisat o singura data.
4. Pe laptop/mini-PC instaleaza MySQL/MariaDB local.
5. Creeaza baza `eventor_gateway`.
6. Importa `local-gateway/database/local_schema.sql`.
7. Copiaza `local-gateway/.env.example` in `.env`.
8. Completeaza `CENTRAL_URL`, `EVENT_ID`, `GATEWAY_CODE`, `GATEWAY_TOKEN` si datele DB locale.
9. Porneste gateway-ul cu `node app.js`.
10. Deschide `http://localhost:3100` si apasa `Descarca snapshot`.

## Ziua evenimentului

1. Conecteaza laptopul/mini-PC-ul la routerul local.
2. Conecteaza scanner-ele si POS-urile la acelasi Wi-Fi.
3. In `/devices`, genereaza PIN pentru fiecare device.
4. Configureaza device-ul cu URL-ul local, rolul, poarta si zona.
5. Testeaza o scanare de intrare, iesire si validare.
6. Testeaza o plata cashless cu suma mica.

## Cand internetul cade

- Scannerul local continua sa valideze pe snapshot.
- Re-entry ramane local: maximum 3 intrari/zi, iesirea nu consuma intrare.
- POS-ul local scade soldul local si salveaza tranzactia cu idempotency key.
- Dashboard-ul arata scanari/tranzactii nesincronizate.

## Cand internetul revine

1. Deschide `/sync`.
2. Apasa `Push sync`.
3. Verifica numarul de conflicte.
4. Daca exista conflicte, nu le ignora; compara starea centrala si cea locala.
5. Dupa reconciliere, descarca un snapshot nou.

## Riscuri operationale

- Doua gateway-uri active pentru acelasi eveniment pot produce conflicte de stare. Centralul afiseaza warning.
- Soldurile cashless pot intra in conflict daca acelasi wallet este folosit simultan pe doua gateway-uri.
- Snapshotul vechi nu stie despre refunduri/blocari facute dupa descarcare; aceste cazuri sunt marcate conflict la sync.
- Pentru productie mare este necesara criptare disc, procedura de backup si reconciliere asistata.
