# Stato del progetto Gestione Sinottici

> Snapshot del 2026-05-02. Vivente: aggiornare quando cambiano architettura, deploy, o stato dati.

## Cos'è

Web app SvelteKit per **Salvatore D'Amato** (Circet, telecom FTTH FiberCop). Gestisce import di estrazioni Excel di produzione, le visualizza in tabella, genera **sinottici interattivi** (diagrammi rete ottica) per ogni armadio, esportabili in PDF stile FiberCop.

## URL e account (riferimenti, niente segreti)

| Cosa | Dove |
|---|---|
| App | https://gestione-sinottici.vercel.app |
| Vercel | https://vercel.com/61totos-projects/gestione-sinottici (account Salvatore `61totos-projects`) |
| Repo | https://github.com/61Toto/gestione-sinottici (privato; collaboratore Paolo `paoloalby` Write) |
| DB | Turso `toto-prod` su account `61toto`, regione `aws-eu-west-1` |
| Login app | `salvatore.damato@circet.it` (password gestita da Salvatore) |

## Stack

- **Framework**: SvelteKit 2 (Svelte 5 runes) + TypeScript
- **DB**: Turso (libsql, SQLite distribuito) — schema in `migrations/001_init.sql` e `002_sinottico.sql`
- **Hosting**: Vercel Hobby (gratuito) — adapter-auto sceglie adapter-vercel a build
- **Excel**: SheetJS (xlsx)
- **Auth**: custom session-based, cookie httpOnly 30gg, bcrypt
- **Layout grafo**: @dagrejs/dagre — IMPORTANTE: bundlato inline via `vite.config.ts` `ssr.noExternal` per evitare crash CJS/ESM su Vercel serverless
- **Pan/zoom**: @panzoom/panzoom (dynamic import in `onMount` per SSR safety)
- **Test**: vitest (103 unit) + Playwright (9 E2E desktop/tablet/mobile)

## Architettura applicativa

```
src/
├── lib/
│   ├── server/
│   │   ├── db.ts                 # Client Turso (lazy init via Proxy per SvelteKit build)
│   │   ├── auth.ts               # Session helpers
│   │   ├── excel.ts              # parseEstrazione() — 54 colonne Excel → snake_case
│   │   ├── importService.ts      # Wipe&replace + topology builder per armadio
│   │   ├── topology/
│   │   │   ├── parser.ts         # Pattern matching G/PTE/AO/spillato
│   │   │   └── builder.ts        # Tree assembly + cable label heuristic
│   │   └── repositories/
│   │       ├── users.ts
│   │       ├── sessions.ts
│   │       ├── comuni.ts
│   │       ├── imports.ts
│   │       ├── rows.ts           # 54 col + edited/edited_at audit
│   │       ├── nodes.ts          # Topologia derivata
│   │       ├── edges.ts          # Tree + spillato
│   │       ├── nodeMetadata.ts   # Tipo PTE editato manualmente (sopravvive reimport)
│   │       └── importErrors.ts   # Pattern unknown / overlap / orphan / ...
│   ├── columns.ts                # Mapping header Excel ↔ snake_case (client-safe)
│   ├── sinottico/
│   │   ├── layout.ts             # Dagre wrapper, BT direction
│   │   └── Symbols.svelte        # 16 SVG symbol FiberCop legend
│   └── components/
│       ├── DataTable.svelte      # Tabella editabile (table/card-stack responsive)
│       ├── ColumnPicker.svelte
│       ├── RowDrawer.svelte
│       ├── Sinottico.svelte      # Render SVG puro
│       ├── SinotticoCanvas.svelte # Pan/zoom wrapper
│       ├── SinotticoNodeDrawer.svelte
│       └── Toast.svelte
└── routes/
    ├── login/
    ├── cambia-password/
    ├── logout/
    ├── comuni/                                    # CRUD comuni
    ├── +page.svelte                               # Dashboard globale
    └── comune/[slug]/
        ├── +page.svelte                           # Dashboard comune
        ├── data/                                  # Tabella editabile (wide layout)
        ├── import/                                # Upload Excel
        └── sinottico/[armadio]/                   # Sinottico singolo + PDF
```

## Funzionalità implementate

✅ Auth: login + cambio password forzato al primo accesso + sessioni + middleware
✅ Comuni: CRUD (Salvatore può crearne quanti vuole)
✅ Import Excel: wipe&replace per comune, drag&drop, parser 54 colonne
✅ Tabella dati: editabile inline (quantità/note/desc.secondaria), drawer dettaglio 54 col, paginazione, filtri (assistente/squadra/F-M/n.foglio), ricerca, selettore colonne, persistenza preferenze in localStorage
✅ Topologia: auto-derivata a ogni import (parser + builder + persistence)
✅ Sinottico per armadio: SVG con dagre layout BT, simboli FiberCop, pan/zoom, tema chiaro/scuro
✅ Drawer dettaglio nodo: edit tipo PTE persistente (`node_metadata`)
✅ Errori topologia: pagina dedicata con tutti i 5 tipi di errore
✅ Export PDF A3 landscape via print stylesheet (legenda + cartiglio FiberCop)
✅ Responsive desktop/tablet/mobile (hamburger, card-stack, drawer fullscreen)
✅ Wide layout su `/data`, `/sinottici`, `/sinottico/<armadio>`, `/sinottici/errori`
✅ Toast notifications

## Test

- **103 vitest unit tests** (parser, builder, repos, excel, format)
- **9 Playwright E2E** (3 viewport × 3 spec: visual + sinottico)
- 0 errori type-check su 465 file

## Workflow di deploy (importante)

Vercel Hobby blocca i deploy automatici da push di collaboratori (`paoloalby`) sul repo privato di Salvatore.

**Workflow concordato:**
1. Paolo sviluppa e testa **localmente** (build + preview puntando a Turso prod, smoke curl)
2. Push su `main` quando stabile
3. Salvatore (o Paolo loggato come Salvatore su GitHub web) fa una **modifica cosmetica via GitHub UI** (es. edit README, salva)
4. Vercel rileva il commit di Salvatore (autore valido = owner) → auto-deploy va a buon fine

Alternative valutate ma scartate: rendere il repo pubblico, upgrade a Vercel Pro.

## Stato dati corrente in produzione

- 1 comune: Montemurlo
- 1 import attivo: `Estrazioen totale.xlsx` (5222 righe)
- 11 armadi con sinottici generati: `57400D_02`, `_07`, `_10`, `_11`, `_21`, `_28`, `_4`, `_63`, `_71`, `_7974`, `_907`
- 190 errori topologia da correggere (dettaglio in `/comune/montemurlo/sinottici/errori`)

## Cose esplicitamente fuori scope (YAGNI)

- Stati colorati (Collaudato/Giuntato/Posato): Salvatore non li vuole
- Multi-utente / gestione ruoli (per ora 1 user)
- Reset password via email
- Foto su doppio click (richiede integrazione XME)
- Editor manuale di topologia (drag/drop/aggiungi nodi) — Salvatore corregge l'Excel sorgente
- Storico multipli per stesso comune (1 import attivo, wipe&replace)
- Export oltre PDF (no CSV/JSON)

## Bug noti / migliorie possibili

- AO e armadio principale visivamente simili — distinguibili solo per dimensione (100×80 vs 80×60). Eventualmente migliorare il simbolo AO.
- Logo FiberCop nel PDF è placeholder testuale. Per usare quello vero: salvare PNG/SVG ufficiale in `static/fibercop-logo.png` + modificare CSS in `src/lib/styles/sinottico-print.css`.
- Filtri Periodo/Week/Tipo elemento/Tipo cavo nel sinottico: definiti in design ma non implementati nel MVP.

## Documenti utili

- `docs/TOPOLOGY_RULES.md` — regole parsing dettagliate
- `docs/plans/2026-05-02-toto-design.md` — design originale (fasi 0-9)
- `docs/plans/2026-05-02-toto-implementation.md` — piano task implementativo
- `docs/plans/2026-05-02-fase10-sinottico-design.md` — design sinottico
- `docs/plans/2026-05-02-fase10-sinottico-implementation.md` — piano sinottico
- `docs/05518L_11_SINOTTICO.pdf` — template gold standard PDF FiberCop
- `README.md` — setup locale + deploy (versione user-facing)
