# Guida Utente — Pannello Admin Guida completa all'uso del pannello di amministrazione dell'ecommerce platform. --- ## Indice 1. [Accesso e primo login](#1-accesso-e-primo-login) 2. [Dashboard](#2-dashboard) 3. [Prodotti](#3-prodotti) ← **sezione principale** 4. [Tipi di Prodotto](#4-tipi-di-prodotto-product-types) 5. [Categorie](#5-categorie) 6. [Ordini](#6-ordini) 7. [Clienti](#7-clienti) 8. [Recensioni](#8-recensioni) 9. [Utenti Admin](#9-utenti-admin) 10. [Impostazioni](#10-impostazioni) 11. [Flusso consigliato per iniziare](#11-flusso-consigliato-per-iniziare) --- ## 1. Accesso e Primo Login ### Avviare il server ```bash docker compose up -d ``` Al primo avvio attendere 5-10 minuti. Per monitorare: ```bash docker compose logs -f app ``` ### Accedere al pannello - **URL:** http://localhost/admin - **Email:** `admin@example.com` - **Password:** `Admin1234!test` ### Cambio password al primo accesso Al primo login il sistema reindirizza automaticamente alla pagina **Change Password**. La nuova password deve rispettare tutti i requisiti: | Requisito | Dettaglio | |-----------|-----------| | Lunghezza minima | 12 caratteri | | Lettere maiuscole | almeno 1 | | Lettere minuscole | almeno 1 | | Numeri | almeno 1 | | Simboli | almeno 1 (`!@#$%` ecc.) | Dopo il cambio password si accede direttamente alla Dashboard. --- ## 2. Dashboard **URL:** http://localhost/admin La dashboard è la schermata iniziale e offre una panoramica rapida dello stato del negozio. ### Metriche principali Sei card in evidenza mostrano i dati in tempo reale: | Metrica | Descrizione | |---------|-------------| | **Total Orders** | Numero totale di ordini ricevuti | | **Pending Orders** | Ordini in attesa di elaborazione (status: PENDING) | | **Revenue** | Fatturato totale da ordini pagati | | **Products** | Numero di prodotti nel catalogo | | **Customers** | Numero di clienti registrati | | **Pending Reviews** | Recensioni in attesa di moderazione | ### Ordini recenti Sotto le metriche compare una tabella con i **5 ordini più recenti**, che mostra: - ID ordine - Cliente - Importo - Stato corrente Cliccando su un ordine si apre il dettaglio. ### Link rapidi Pulsanti di navigazione veloce alle sezioni più usate (Prodotti, Ordini, Categorie). --- ## 3. Prodotti Questa è la sezione più importante del pannello. Permette di gestire l'intero catalogo. **URL lista:** http://localhost/admin/products ### 3a. Lista Prodotti La pagina mostra tutti i prodotti con: - **Titolo** del prodotto - **Stato** (DRAFT / PUBLISHED / ARCHIVED) - **Prezzo** base - **Stock** disponibile - **Pulsanti azione**: Modifica, Archivia #### Ricerca e filtri - **Barra di ricerca:** filtra per titolo in tempo reale - **Filtro stato:** dropdown per mostrare solo DRAFT, PUBLISHED o ARCHIVED #### Creare un nuovo prodotto Clicca il pulsante **"New Product"** (in alto a destra) per aprire il form di creazione. --- ### 3b. Creazione Nuovo Prodotto (GUIDA DETTAGLIATA) **URL:** http://localhost/admin/products/new > **Importante:** prima di creare prodotti, assicurati di aver creato almeno un **Product Type** e almeno una **Categoria**. Vedi le sezioni 4 e 5. Il form è diviso in 4 sezioni. --- #### Sezione 1 — Basic Information **Product Type** *(obbligatorio)* - Campo: `select` (menu a tendina) - Seleziona il tipo di prodotto (es. "Abbigliamento", "Elettronica", "Libri") - Il tipo determina quali attributi custom saranno disponibili nella sezione 4 - **Se non hai ancora creato tipi**, vai prima su http://localhost/admin/product-types --- **Title** *(obbligatorio)* - Campo: `text` - Limite: massimo 200 caratteri - Esempio: `"Sneaker Running Pro Modello X"` - Usa un titolo descrittivo e chiaro per i clienti --- **Slug** *(obbligatorio)* - Campo: `text` - Generato automaticamente dal titolo (es. `sneaker-running-pro-modello-x`) - Formato: solo lettere minuscole, numeri e trattini (`-`), no spazi - Viene usato nell'URL del prodotto nel negozio: `/products/sneaker-running-pro-modello-x` - Puoi modificarlo manualmente, ma deve essere **unico** tra tutti i prodotti - **Non cambiarlo dopo la pubblicazione** per evitare link rotti --- **Description** *(obbligatorio)* - Campo: `textarea` - Inserisci una descrizione completa del prodotto - Suggerimenti per una buona descrizione: - Materiali e composizione - Caratteristiche principali - Istruzioni d'uso o cura - Taglie disponibili (se non gestite tramite varianti) --- #### Sezione 2 — Pricing & Inventory **Base Price** *(obbligatorio)* - Campo: `number` (valore in euro/dollari, con decimali) - Inserisci il prezzo nella valuta selezionata, con il punto come separatore decimale - Esempi: - `19.99` → €19,99 - `49.90` → €49,90 - `100` → €100,00 - Valore minimo: `0` - Il sistema converte automaticamente in centesimi internamente (compatibilità con Stripe) --- **Currency** *(obbligatorio)* - Campo: `select` - Opzioni disponibili: - `EUR` — Euro (€) - `USD` — Dollaro americano ($) - `GBP` — Sterlina britannica (£) - Di default usa la valuta configurata nelle Impostazioni generali --- **Stock** *(opzionale)* - Campo: `number` - Indica le unità disponibili in magazzino - **Lasciare vuoto** = stock illimitato (il prodotto non esaurisce mai) - Inserire `0` = prodotto esaurito (non acquistabile) - Inserire un numero positivo (es. `50`) = scorte limitate --- #### Sezione 3 — Status & Organization **Status** *(obbligatorio)* - Campo: `select` - Tre opzioni: | Valore | Significato | |--------|-------------| | `DRAFT` | Bozza — il prodotto **non è visibile** nel negozio. Usalo mentre stai lavorando al prodotto. | | `PUBLISHED` | Pubblicato — il prodotto **è visibile** nel negozio e acquistabile. | | `ARCHIVED` | Archiviato — il prodotto è nascosto e non vendibile. Usato per prodotti discontinuati. | **Consiglio:** inizia sempre con `DRAFT`, verifica tutto, poi cambia in `PUBLISHED`. --- **Categories** *(opzionale)* - Campo: `checkbox multipli` - Assegna il prodotto a una o più categorie del catalogo - Le categorie aiutano i clienti a navigare il negozio - Un prodotto può appartenere a più categorie contemporaneamente - Se non hai ancora creato categorie, vai su http://localhost/admin/categories --- #### Sezione 4 — Custom Attributes **Attributes** *(opzionale)* - Campo: `JSON` - Permette di aggiungere attributi personalizzati in formato JSON - Gli attributi disponibili dipendono dal **Product Type** selezionato nella sezione 1 - Esempio per un prodotto di abbigliamento: ```json { "colore": "Rosso", "taglie_disponibili": ["S", "M", "L", "XL"], "materiale": "100% cotone", "lavaggio": "30°C" } ``` - Esempio per un prodotto elettronico: ```json { "marca": "Samsung", "modello": "Galaxy S25", "ram_gb": 12, "storage_gb": 256, "colori": ["Nero", "Bianco", "Verde"] } ``` > Il JSON deve essere valido: usa virgolette doppie per le chiavi, nessuna virgola finale nell'ultimo elemento. --- #### Salvare il prodotto Una volta compilati tutti i campi obbligatori, clicca **"Save Product"** (o "Create Product"). Se ci sono errori di validazione, il form li mostra in rosso accanto al campo corrispondente. I più comuni: - Slug già usato da un altro prodotto → cambia lo slug manualmente - Prezzo negativo → inserire 0 o un valore positivo - JSON non valido negli attributi → controlla la sintassi --- ### 3c. Modifica Prodotto Esistente 1. Vai su http://localhost/admin/products 2. Trova il prodotto nella lista (usa la ricerca se necessario) 3. Clicca **"Edit"** sulla riga del prodotto 4. Modifica i campi desiderati 5. Clicca **"Save Product"** Tutti i campi sono modificabili in qualsiasi momento. **Cambiare lo status da DRAFT a PUBLISHED** è il modo per rendere il prodotto visibile nel negozio. --- ### 3d. Archiviare un Prodotto L'archiviazione rende il prodotto invisibile nel negozio senza eliminarlo. 1. Dalla lista prodotti, clicca **"Archive"** sulla riga del prodotto 2. Oppure, entra in modifica e cambia lo Status in `ARCHIVED` I prodotti archiviati non vengono eliminati: puoi ripristinarli in qualsiasi momento cambiando lo status in `PUBLISHED`. > **Non esiste un'eliminazione definitiva** dall'interfaccia admin — l'archiviazione è l'operazione più "definitiva" disponibile. --- ### 3e. Immagini prodotto La sezione **Images** appare in fondo alla pagina di modifica di un prodotto già salvato (non durante la creazione iniziale). #### Formato consigliato | Proprietà | Valore | |-----------|--------| | **Proporzione** | **1:1 (quadrata)** | | **Risoluzione minima** | 800 × 800 px | | **Risoluzione consigliata** | 1200 × 1200 px | | **Formati accettati** | JPEG, PNG, WebP | | **Dimensione massima** | 5 MB per file | Il negozio mostra sempre le immagini in formato quadrato ritagliando al centro. Se carichi un'immagine rettangolare, le parti ai lati (o in alto/basso) verranno tagliate e non saranno visibili. > **Esempio:** una foto 1600×900 px (orizzontale) verrà mostrata ritagliata al centro come un quadrato 900×900 px — i bordi sinistro e destro spariranno. #### Come aggiungere immagini 1. Crea e salva il prodotto → il sistema ti reindirizza alla pagina di modifica 2. Scorri fino alla sezione **"Images"** in fondo al form 3. Clicca **"Aggiungi immagini"** e seleziona uno o più file 4. Le anteprime appaiono subito nella griglia — il preview è quadrato, identico a come l'immagine apparirà nel negozio 5. Puoi caricare più immagini: la **prima** è quella mostrata nelle card del catalogo #### Come eliminare un'immagine Passa il mouse sopra l'anteprima e clicca il pulsante **✕** che appare nell'angolo in alto a destra. --- ## 4. Tipi di Prodotto (Product Types) **URL:** http://localhost/admin/product-types I Product Types definiscono la struttura degli attributi custom per categoria di prodotti. **Vanno creati prima dei prodotti.** ### Cos'è un Product Type Un tipo di prodotto è essenzialmente uno schema che dice: "i prodotti di questa categoria hanno questi attributi". Esempio: - Tipo **"Abbigliamento"** → attributi: colore, taglia, materiale - Tipo **"Elettronica"** → attributi: marca, RAM, storage, display - Tipo **"Libri"** → attributi: autore, ISBN, editore, pagine ### Come creare un Product Type 1. Vai su http://localhost/admin/product-types 2. Clicca **"New Product Type"** 3. Compila i campi (vedi sotto) 4. Clicca **"Save"** ### Campi — Product Type **Name** *(obbligatorio)* - Campo: `text` - Il nome del tipo di prodotto, visibile solo nell'admin - Esempio: `Abbigliamento`, `Elettronica`, `Libri` - Usa nomi chiari che descrivano la categoria merceologica --- **Slug** *(obbligatorio)* - Campo: `text` - Identificatore univoco generato automaticamente dal nome - Formato: solo lettere minuscole, numeri e trattini (es. `abbigliamento`, `elettronica`) - Non può contenere spazi o caratteri speciali - Viene usato internamente dal sistema per identificare il tipo — non è visibile ai clienti - **Non modificarlo dopo aver creato prodotti** con questo tipo --- **Schema (JSON)** *(opzionale)* - Campo: `textarea` con formato JSON - Definisce quali attributi personalizzati avranno i prodotti di questo tipo - Usa il formato JSON Schema standard Esempio per abbigliamento: ```json { "type": "object", "properties": { "colore": { "type": "string" }, "taglia": { "type": "string" }, "materiale": { "type": "string" } } } ``` Esempio per elettronica: ```json { "type": "object", "properties": { "marca": { "type": "string" }, "ram_gb": { "type": "number" }, "storage_gb": { "type": "number" } } } ``` > Lo schema è una guida per te — il sistema non blocca l'inserimento di attributi non definiti nello schema. ### Modifica e gestione - I tipi esistenti si possono modificare cliccando **"Edit"** - Modificare uno schema non altera i prodotti già creati con quel tipo - Usare nomi chiari e descrittivi per ritrovarli facilmente --- ## 5. Categorie **URL:** http://localhost/admin/categories Le categorie organizzano il catalogo e aiutano i clienti a navigare il negozio. ### Struttura gerarchica Le categorie supportano una gerarchia padre/figlio: ``` Abbigliamento (padre) ├── Uomo │ ├── T-shirt │ └── Pantaloni └── Donna ├── Vestiti └── Scarpe ``` ### Creare una categoria 1. Vai su http://localhost/admin/categories 2. Clicca **"New Category"** 3. Compila i campi (vedi sotto) 4. Clicca **"Save"** ### Campi — Categoria **Name** *(obbligatorio)* - Campo: `text` - Il nome della categoria visibile ai clienti nel negozio - Esempio: `Sneaker`, `T-shirt Uomo`, `Smartphone` - Usa nomi brevi e chiari --- **Slug** *(obbligatorio)* - Campo: `text` - Generato automaticamente dal nome - Formato: solo lettere minuscole, numeri e trattini (es. `sneaker`, `t-shirt-uomo`) - Viene usato nell'URL della categoria nel negozio: `/category/sneaker` - **Non modificarlo** dopo aver pubblicato la categoria per evitare link rotti --- **Parent Category** *(opzionale)* - Campo: `select` (menu a tendina) - Permette di creare una gerarchia padre/figlio - Lascia vuoto per una categoria di primo livello (es. `Abbigliamento`) - Seleziona una categoria esistente per creare una sottocategoria (es. `Sneaker` → padre: `Scarpe`) - Puoi annidare più livelli (es. `Running` → padre: `Sneaker` → nonno: `Scarpe`) ### Modificare una categoria Clicca **"Edit"** accanto alla categoria, modifica i campi, salva. ### Eliminare una categoria - Clicca **"Delete"** accanto alla categoria - **Attenzione:** non è possibile eliminare una categoria se ha prodotti assegnati. Riassegna prima i prodotti ad altre categorie. --- ## 6. Ordini **URL:** http://localhost/admin/orders Gestisci tutti gli ordini ricevuti nel negozio. ### Lista ordini La lista mostra tutti gli ordini con: - ID ordine - Cliente (nome ed email) - Data - Importo totale - Stato corrente #### Filtrare per stato Usa il menu **"Filter by status"** per vedere solo gli ordini in un determinato stato: | Stato | Descrizione | |-------|-------------| | `PENDING` | Ordine creato, pagamento non ancora completato | | `PAID` | Pagamento ricevuto, in attesa di evasione | | `FULFILLED` | Ordine evaso e spedito al cliente | | `CANCELLED` | Ordine annullato | | `REFUNDED` | Rimborso effettuato | ### Dettaglio ordine Clicca su un ordine per aprire il dettaglio. Trovi: - **Dati cliente:** nome, email, indirizzo di spedizione - **Prodotti ordinati:** lista articoli con quantità e prezzo unitario - **Riepilogo economico:** - Subtotale - Tasse - Spedizione - **Totale** - **Dati pagamento:** provider (Stripe), ID transazione, data pagamento ### Aggiornare lo stato di un ordine 1. Apri il dettaglio dell'ordine 2. Trova il menu **"Update Status"** 3. Seleziona il nuovo stato 4. Clicca **"Update"** **Flusso tipico di un ordine:** ``` PENDING → PAID → FULFILLED ``` In caso di problemi: ``` PAID → CANCELLED → REFUNDED ``` --- ## 7. Clienti **URL:** http://localhost/admin/customers Visualizza tutti i clienti registrati nel negozio. ### Informazioni disponibili Per ogni cliente viene mostrato: - **Email** e nome - **Stato verifica email:** verificata o non verificata - **Numero di ordini** effettuati - Data registrazione ### Cosa puoi fare La sezione clienti è attualmente in **sola lettura**: puoi visualizzare i clienti ma non modificarli o eliminarli dall'interfaccia admin. Per operazioni avanzate sui clienti (reset password, eliminazione account) è necessario intervenire direttamente sul database. --- ## 8. Recensioni **URL:** http://localhost/admin/reviews Modera le recensioni lasciate dai clienti sui prodotti. ### Stati delle recensioni | Stato | Descrizione | |-------|-------------| | `PENDING` | Recensione appena inviata, in attesa di moderazione | | `APPROVED` | Recensione approvata e visibile nel negozio | | `HIDDEN` | Recensione nascosta (spam, contenuto inappropriato) | ### Filtrare le recensioni Usa il filtro per stato per vedere solo le recensioni che richiedono attenzione (es. solo `PENDING`). ### Moderare una recensione Ogni recensione mostra: - **Prodotto** a cui è riferita - **Valutazione** in stelle (1-5) - **Testo** della recensione - **Cliente** che l'ha scritta - **Data** Azioni disponibili: - **Approve** → rende la recensione visibile nel negozio - **Hide** → nasconde la recensione (non viene eliminata) - **Reset to Pending** → riporta la recensione in stato di attesa **Best practice:** approva rapidamente le recensioni PENDING per mantenere il negozio attivo e credibile. Nascondi solo recensioni con contenuto offensivo o spam. --- ## 9. Utenti Admin **URL:** http://localhost/admin/admin-users Gestisci gli account che possono accedere al pannello admin. ### Ruoli disponibili | Ruolo | Permessi | |-------|---------| | `ADMIN` | Accesso completo al pannello, gestione prodotti/ordini/clienti | | `OWNER` | Come ADMIN, più la possibilità di gestire altri admin e le impostazioni di sistema | ### Creare un nuovo admin 1. Vai su http://localhost/admin/admin-users 2. Clicca **"New Admin User"** 3. Compila i campi (vedi sotto) 4. Clicca **"Create"** Il nuovo admin dovrà cambiare la password al primo accesso. ### Campi — Admin User **Name** *(obbligatorio)* - Campo: `text` - Nome e cognome dell'amministratore - Visibile nella lista admin e nei log di audit - Esempio: `Mario Rossi` --- **Email** *(obbligatorio)* - Campo: `email` - Indirizzo email usato per accedere al pannello admin - Deve essere unica — non è possibile avere due admin con la stessa email - Esempio: `mario.rossi@negozio.it` --- **Role** *(obbligatorio)* - Campo: `select` - Seleziona il livello di accesso: | Ruolo | Cosa può fare | |-------|--------------| | `ADMIN` | Gestire prodotti, ordini, clienti, recensioni, categorie, tipi prodotto | | `OWNER` | Tutto ciò che può fare ADMIN, più: gestire altri admin, modificare le impostazioni di sistema | > Assegna `OWNER` solo a persone di fiducia — può modificare impostazioni critiche e creare/eliminare altri admin. --- **Password** *(obbligatorio)* - Campo: `password` - Password temporanea assegnata al nuovo admin - Deve rispettare i requisiti di sicurezza: minimo 12 caratteri, almeno una maiuscola, una minuscola, un numero e un simbolo - Il sistema chiederà di cambiarla al primo accesso - Esempio sicuro: `Temp#2026Admin!` ### Eliminare un admin Clicca **"Delete"** accanto all'admin da rimuovere. > **Attenzione:** non è possibile eliminare il proprio account. Non eliminare l'ultimo account `OWNER` per non perdere l'accesso al pannello. --- ## 10. Impostazioni **URL:** http://localhost/admin/settings Configura le impostazioni globali del negozio. ### Come modificare 1. Vai su http://localhost/admin/settings 2. Modifica i campi desiderati 3. Clicca **"Save Settings"** Le modifiche hanno effetto immediato su tutto il negozio. ### Campi — Impostazioni generali **Site Name** - Campo: `text` - Il nome del negozio, mostrato nel titolo del browser, nelle email ai clienti e nel footer - Esempio: `Il Mio Negozio`, `ShopX Italia` - Tienilo breve e riconoscibile --- **Site Description** - Campo: `text` - Breve descrizione del negozio, usata nei meta tag per i motori di ricerca (SEO) - Esempio: `Il miglior ecommerce di abbigliamento sportivo italiano` - Consigliato: massimo 160 caratteri --- **Support Email** - Campo: `email` - Indirizzo email mostrato ai clienti per il supporto (es. nella pagina contatti, nelle email di conferma ordine) - Esempio: `supporto@mionegozio.it` - Assicurati che sia una casella monitorata --- **Default Currency** - Campo: `text` - Valuta usata di default per i nuovi prodotti e per il negozio - Valori accettati: `EUR`, `USD`, `GBP` (codice ISO 4217 a 3 lettere) - Esempio: `EUR` - **Attenzione:** cambiare la valuta dopo aver creato prodotti non converte automaticamente i prezzi esistenti --- **Tax Rate (%)** - Campo: `number` - Aliquota IVA applicata agli ordini, espressa in percentuale - Esempi: - `22` → IVA italiana al 22% - `10` → IVA ridotta al 10% - `0` → nessuna tassa applicata - Il valore viene mostrato nel riepilogo dell'ordine al checkout --- ### Campi — Footer **Testo copyright** - Campo: `text` - Testo mostrato nel footer del negozio, solitamente l'indicazione del copyright - Esempio: `© 2026 Il Mio Negozio. Tutti i diritti riservati.` - Lascia vuoto per non mostrare nulla --- **Link footer** (Footer Links) - Campo: `textarea` con formato JSON - Lista di link mostrati nel footer (es. Privacy Policy, Termini, Contatti) - Formato: array JSON di oggetti con `label` (testo del link) e `url` (destinazione) - Esempio: ```json [ {"label": "Privacy Policy", "url": "/privacy"}, {"label": "Termini e Condizioni", "url": "/termini"}, {"label": "Contatti", "url": "/contatti"} ] ``` - Lascia `[]` per non mostrare link nel footer - Gli URL possono essere relativi (`/privacy`) o assoluti (`https://...`) --- ### Campi — Branding **Favicon** - Campo: `file upload` - Icona del negozio mostrata nel tab del browser e nei preferiti - Formati accettati: PNG, ICO, SVG, JPEG, WebP - Dimensione massima: 1 MB - Dimensione consigliata: **32×32 px** o **64×64 px** (quadrata) - Come caricare: clicca **"Scegli file"**, seleziona l'immagine, clicca **"Upload Favicon"** - La favicon viene aggiornata immediatamente su tutte le pagine --- ## 11. Flusso Consigliato per Iniziare Se stai configurando il negozio da zero, segui quest'ordine: ### Step 1 — Configura le impostazioni base Vai su **Impostazioni** e imposta nome negozio, valuta e aliquota IVA. ### Step 2 — Crea i Product Types Vai su **Product Types** e crea i tipi per le tue categorie di prodotti. Esempio: "Abbigliamento", "Accessori", "Scarpe". ### Step 3 — Crea le Categorie Vai su **Categorie** e crea la struttura del catalogo. Esempio: "Uomo > T-shirt", "Donna > Vestiti". ### Step 4 — Aggiungi i Prodotti Vai su **Prodotti** → **New Product** e compila il form. Inizia con `DRAFT` per testare, poi passa a `PUBLISHED`. ### Step 5 — Verifica il negozio Apri http://localhost nel browser (non `/admin`) e naviga il negozio come farebbe un cliente. Controlla che i prodotti pubblicati siano visibili e che le categorie siano corrette. ### Step 6 — Configura i pagamenti Aggiungi le chiavi Stripe test nel file `.env` per testare il flusso di acquisto completo. --- ## Riferimenti rapidi | Sezione | URL | |---------|-----| | Dashboard | http://localhost/admin | | Prodotti | http://localhost/admin/products | | Nuovo Prodotto | http://localhost/admin/products/new | | Product Types | http://localhost/admin/product-types | | Categorie | http://localhost/admin/categories | | Ordini | http://localhost/admin/orders | | Clienti | http://localhost/admin/customers | | Recensioni | http://localhost/admin/reviews | | Admin Users | http://localhost/admin/admin-users | | Impostazioni | http://localhost/admin/settings | | Email (Mailpit) | http://localhost:8025 |