# Backoffice Preventivi — Krèios Backend + backoffice collegato al configuratore 3D. Riceve i prodotti configurati, li accumula in un preventivo (carrello lato server con token), alla conferma raccoglie i dati del cliente, genera un PDF riassuntivo e invia le email a cliente e amministratore. ## Componenti - **Laravel 13 + Filament 3** (questa cartella): API pubblica del carrello (`/api/carrello/*`) e pannello admin (`/admin`). - **App cliente Vue 3** (`cliente/`): riepilogo carrello + form contatti + conferma (nessun iframe). - **Configuratore** (`../src`): la modifica in `src/js/starter.js` sostituisce il vecchio `postMessage` con una chiamata diretta all'API e mostra un pulsante "Vai al preventivo". ## Flusso 1. L'utente configura un prodotto nel configuratore e clicca "Aggiungi al preventivo". 2. `starter.js` invia `POST /api/carrello/aggiungi` (con `sistema`, `type`, dimensioni, prezzo, payload, screenshot PNG). Il backend crea/aggiorna un `preventivo` (stato `bozza`) identificato da un `token` salvato in `localStorage`. 3. Il pulsante "Vai al preventivo" apre l'app cliente passando il token: `/preventivo/?token=XXX`. 4. L'app cliente mostra il carrello, l'utente compila i dati e conferma → `POST /api/carrello/{token}/conferma`. 5. Il backend crea il `cliente`, imposta lo stato a `inviato`, genera il PDF e invia le email (cliente con PDF allegato + notifica admin). Il preventivo è visibile nel backoffice. ## Setup ```bash # 1. Backend Laravel (da questa cartella) composer install # .env già configurato: MySQL 127.0.0.1 / root / (no password) / DB kreios_preventivi php artisan migrate --seed # crea le tabelle + utente admin php artisan storage:link php artisan serve --port=8000 # API + admin su http://localhost:8000 # 2. Frontend: configuratore + app cliente, compilati in public/ (dalla root del repo) cd .. ./build.sh # -> public/configuratore e public/preventivo ``` Configuratore e app cliente sono serviti da questo backend: e . In sviluppo `./dev.sh` (root) avvia Laravel e ricompila i frontend a ogni modifica. Dettagli in `../docs/PREVENTIVI_BACKOFFICE.md`. ### Credenziali admin (seed di default) - URL: - Email: `admin@kreiosinfissi.it` — Password: `password` ### Email in sviluppo `MAIL_MAILER=log`: le email finiscono in `storage/logs/laravel.log` (incluso il PDF allegato in base64). In produzione configurare SMTP nel `.env`. ## Configurazione (`.env` Laravel) | Variabile | Descrizione | |---|---| | `DB_*` | MySQL: `127.0.0.1`, `root`, no password, `kreios_preventivi` | | `ADMIN_NOTIFY_EMAIL` | Email che riceve la notifica di nuovo preventivo | | `APP_FRONTEND_CLIENTE_URL` | URL dell'app cliente, solo se non servita da qui (default `APP_URL/preventivo`) | | `CORS_ALLOWED_ORIGINS` | Origini esterne autorizzate all'API (default `*`; i frontend serviti da qui non ne hanno bisogno) | ### Frontend Configuratore e app cliente chiamano l'API sulla stessa origine (`${location.origin}/api`): nessuna variabile da impostare. `VITE_PREVENTIVI_API_BASE` (root) / `VITE_API_BASE` (`cliente/`) servono solo per un'API su un altro dominio. Il link "Vai al preventivo" usa `frontend_cliente_url` da `GET /api/config`. ## Modello dati - **`clienti`** — anagrafica cliente. - **`preventivi`** — un preventivo/carrello: `token`, `numero`, `stato` (`bozza`→`inviato`→`in_lavorazione`→`chiuso`), `totale` (IVA inclusa), `pdf_path`. - **`preventivo_items`** — righe: `sistema`, `type`, `nome_modello`, dimensioni, `quantita`, prezzi, `payload` (JSON della configurazione), `immagine_path` (screenshot decodificato). Il payload del configuratore mescola stringhe e oggetti listino: `App\Support\ConfigurazioneFormatter` lo normalizza in righe `{label, value}` con etichette italiane, usato sia dal PDF che dal backoffice. ## Branding Palette allineata al configuratore Krèios (`../src/assets/style.css`): teal `#12373C` (primario) e oro `#ffd700` (call-to-action). Il logo (`../src/assets/img/kreios.jpg`) è copiato in `public/images/kreios-logo.jpg` (Laravel/Filament/PDF/email) e in `cliente/public/kreios-logo.jpg` (app cliente Vue). ## API | Metodo | Endpoint | Descrizione | |---|---|---| | GET | `/api/config` | Configurazione pubblica (URL corrente dell'app cliente) | | POST | `/api/carrello/aggiungi` | Aggiunge un prodotto (crea il carrello se manca il token) | | GET | `/api/carrello/{token}` | Ritorna il carrello (solo stato bozza) | | DELETE | `/api/carrello/{token}/item/{id}` | Rimuove una riga | | POST | `/api/carrello/{token}/conferma` | Finalizza: cliente + PDF + email |