# dfomnibus — Conformità Direttiva Omnibus per PrestaShop

> Il modulo dfomnibus mette il tuo negozio PrestaShop in conformità con la Direttiva europea 2019/2161 nota come Omnibus, in vigore in tutta l'Unione Europea dal 28 maggio 2022. Costruisce continuamente…

- Pagina: <https://www.datafirefly.com/it/documentation/dfomnibus/>
- Lingua: it
- Aggiornato il: 2026-07-02
- Altre lingue: [fr](https://www.datafirefly.com/documentation/dfomnibus/index.md), [en](https://www.datafirefly.com/en/documentation/dfomnibus/index.md), [es](https://www.datafirefly.com/es/documentation/dfomnibus/index.md), [de](https://www.datafirefly.com/de/documentation/dfomnibus/index.md), [pl](https://www.datafirefly.com/pl/documentation/dfomnibus/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfomnibus/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfomnibus/index.md)
- Indice: <https://www.datafirefly.com/it/documentation/llms.txt>

Il modulo **dfomnibus** mette il tuo negozio PrestaShop in conformità con la Direttiva europea 2019/2161 nota come Omnibus, in vigore in tutta l'Unione Europea dal 28 maggio 2022. Costruisce continuamente la cronologia dei prezzi di ogni prodotto e, non appena una promozione è attiva, mostra il prezzo più basso registrato durante i 30 giorni precedenti.

**Compatibilità:** PrestaShop da 8.0 a 9.x. PHP da 7.4 a 8.3. Multi-negozio, multi-valuta e multi-combinazione supportati in modo nativo. Nessun componente di terze parti, nessun CDN, GDPR-friendly.

## Installazione

L'installazione richiede meno di cinque minuti.

1. Scarica il file `dfomnibus_v1.0.1.zip` dalla tua area cliente DataFirefly.
2. Nel back office di PrestaShop, vai a **Moduli → Gestore moduli → Carica un modulo**.
3. Carica lo ZIP. PrestaShop crea le tabelle, genera un token cron e registra gli hook necessari.
4. Fai clic su **Configura** per aprire la schermata delle impostazioni.

**Due tabelle create:** `ps_dfomnibus_price_history` per gli snapshot e `ps_dfomnibus_compliance_log` per gli eventi di conformità (riservata per usi futuri). Il prefisso `ps_` viene sostituito automaticamente con il tuo.

## Programmazione del cron giornaliero

Il cron inizializza la cronologia del tuo catalogo e garantisce la continuità degli snapshot giornalieri, anche per i prodotti il cui prezzo non cambia mai. Senza un cron attivo, il modulo funziona ma la sua cronologia si limita ai prodotti modificati manualmente.

### Recupero del token

Apri la schermata di configurazione del modulo. Il token cron visualizzato è unico per la tua installazione. Ottieni un URL della forma:

```
https://il-tuo-negozio.com/modules/dfomnibus/cron.php?token=TUO_TOKEN
```

### Programmazione tramite cron Unix

Aggiungi la seguente riga al tuo crontab, regolando l'ora in base al tuo traffico (idealmente in orari a bassa affluenza):

```
15 3 * * * curl -s "https://il-tuo-negozio.com/modules/dfomnibus/cron.php?token=TUO_TOKEN" > /dev/null
```

### Programmazione tramite CLI

Se preferisci evitare qualsiasi esposizione HTTP, esegui il cron direttamente da riga di comando:

```
php /percorso/al/tuo-negozio/modules/dfomnibus/cron.php token=TUO_TOKEN
```

**Sicurezza del token:** il modulo utilizza `hash_equals()` per confrontare i token, il che protegge dagli attacchi di timing. Non condividere mai questo token e rigeneralo se sospetti una compromissione (pulsante _Rigenera token_ nella configurazione).

## Opzioni di configurazione

### Attivazione della visualizzazione

L'interruttore **Attiva la visualizzazione** controlla l'inserimento del messaggio di conformità sotto il prezzo del prodotto. Puoi disattivarlo temporaneamente per mantenere la raccolta della cronologia senza mostrare l'avviso in frontend (utile durante una transizione o durante i test).

### Modalità di calcolo

Sono disponibili due modalità:

- **Rigorosa**: il prezzo di riferimento è il minimo registrato durante i 30 giorni precedenti l'inizio effettivo della promozione in corso. Corrisponde alla lettera della direttiva.
- **Conservativa** (consigliata per impostazione predefinita): il prezzo di riferimento è il minimo sui 30 giorni scorrevoli. Interpretazione più sfavorevole per il commerciante ma più difensiva in caso di ispezione.

**Quale modalità scegliere?** Se il tuo negozio ha una politica promozionale chiara, con date di inizio e fine ben tracciate, la modalità rigorosa è perfetta. In caso di dubbio, o se le tue regole SpecificPrice vengono modificate frequentemente senza una netta discontinuità tra periodi promozionali e non promozionali, la modalità conservativa è più sicura.

### Periodo di riferimento

Il periodo è fissato a 30 giorni per impostazione predefinita, conformemente alla direttiva. Puoi aumentarlo (60, 90 giorni) per essere ancora più prudente, ma il valore minimo resta 30 giorni.

### Esclusione dei prodotti recenti

L'opzione **Escludi prodotti di età inferiore a X giorni** nasconde la visualizzazione per i prodotti troppo recenti. Valore predefinito: 30 giorni. È coerente con lo spirito della direttiva, che si applica solo ai prodotti con una cronologia dei prezzi significativa.

### Restrizione UE

Se vendi sia dentro che fuori l'UE, seleziona **Limita la visualizzazione all'Unione Europea**. Il modulo rileva il paese del cliente in questo ordine:

1. Indirizzo di consegna del cliente collegato
2. Indirizzo del carrello corrente
3. Paese predefinito del negozio

Se nessuna di queste informazioni è disponibile, la visualizzazione è attiva per impostazione predefinita per evitare qualsiasi rischio di non conformità involontaria.

### Nascondi quando il prezzo è uguale

L'opzione **Nascondi se il prezzo è identico** rimuove il messaggio quando il prezzo corrente corrisponde esattamente al prezzo più basso degli ultimi 30 giorni. Utile per evitare di visualizzare informazioni senza valore aggiunto per il consumatore.

### Sconto reale

Attiva **Mostra sconto reale** per completare il messaggio con la percentuale calcolata in base al prezzo Omnibus, e non al prezzo barrato. Esempio: un prodotto a 89 €, in promozione a 59 €, con un prezzo Omnibus di 65 € mostrerà _-9,2 %_ di sconto reale invece del -33 % calcolato sul prezzo barrato. È più onesto, ma ogni commerciante è libero di scegliere.

### Grafico

Il grafico di 30 giorni può essere visualizzato in una scheda dedicata del prodotto o in linea sotto il prezzo. Viene caricato in lazy tramite IntersectionObserver e si attiva solo all'ingresso nella viewport, il che garantisce un impatto nullo sui Core Web Vitals delle tue schede prodotto.

### Tracciamento per combinazione

Seleziona **Traccia combinazioni** se i tuoi prodotti hanno prezzi diversi per combinazione (ad esempio taglie XL con supplemento). La cronologia viene quindi segmentata per `id_product_attribute` e l'avviso Omnibus si adatta al prezzo della combinazione selezionata.

### Conservazione

La durata di conservazione predefinita è di 365 giorni. Oltre, la cronologia viene automaticamente eliminata all'esecuzione del cron. Il valore minimo è di 60 giorni per garantire un margine di sicurezza rispetto alla finestra legale di 30 giorni.

## Dashboard di conformità

Accessibile tramite **Moduli → Dashboard DataFirefly Omnibus**, la dashboard riunisce:

- Il numero di prodotti tracciati
- Il totale degli snapshot registrati
- La data e l'ora dell'ultima esecuzione del cron
- L'elenco dei prodotti con, per ciascuno, la data della prima acquisizione, la data dell'ultima acquisizione, il prezzo più basso degli ultimi 30 giorni e un indicatore di promozione attiva

Per ogni prodotto sono disponibili tre azioni:

- **Visualizza cronologia**: mostra fino a 1000 snapshot con timestamp
- **Snapshot manuale**: forza l'acquisizione immediata
- **Elimina cronologia**: reimposta il tracciamento per questo prodotto (da usare con cautela)

### Esportazione CSV

Dalla visualizzazione della cronologia di un prodotto, il pulsante **Esporta in CSV** genera un file con tutte le colonne con timestamp (data, prezzo IVA esclusa, prezzo IVA inclusa, valuta, negozio, combinazione, indicatore promo, fonte dell'acquisizione). Formato pronto per l'archiviazione o per essere consegnato a un ispettore.

## Comportamento in frontend

Sulla scheda prodotto, non appena una promozione è attiva, viene automaticamente visualizzato il seguente avviso sotto il prezzo:

> Prezzo più basso degli ultimi 30 giorni: 65,00 €

Il messaggio viene tradotto in base alla lingua del negozio (francese, inglese, spagnolo, tedesco). La visualizzazione utilizza l'hook standard `displayProductPriceBlock` e funziona con tutti i temi che rispettano gli standard di PrestaShop (Classic, Hummingbird, Warehouse, Transformer, Panda).

**Rendering unico per pagina:** il modulo include una protezione `static $rendered` che garantisce che l'avviso appaia una sola volta per pagina, anche se l'hook `displayProductPriceBlock` viene chiamato più volte (blocchi riepilogativi, sticky, ecc.).

## Multi-negozio e multi-valuta

La cronologia viene memorizzata per tupla univoca `(id_product, id_product_attribute, id_shop, id_currency)`. Ogni negozio della tua installazione mantiene quindi la propria cronologia e ogni valuta attiva ha la propria curva dei prezzi. Nessuna conversione al volo: gli importi visualizzati corrispondono esattamente a quanto è stato registrato al momento dell'acquisizione.

## Risoluzione dei problemi

### L'avviso non appare sulla scheda prodotto

Verifica in ordine:

1. L'opzione **Attiva la visualizzazione** è selezionata nella configurazione?
2. Il cron è stato eseguito almeno una volta? In caso contrario, non esiste cronologia.
3. La restrizione UE è attivata mentre stai testando da un paese non UE?
4. L'opzione **Nascondi se il prezzo è identico** è attiva e il prezzo corrente corrisponde al minimo?
5. Il prodotto ha meno di 30 giorni (con l'opzione di esclusione delle novità attiva)?

### Il grafico non si carica

Apri la console del browser. Il modulo si aspetta un endpoint AJAX esposto dal controller front `pricehistory`. Verifica che nessun sistema di cache o firewall intercetti questa route. Se utilizzi un CDN, autorizza esplicitamente gli URL `/module/dfomnibus/pricehistory`.

### Il cron restituisce un errore 403 o 401

Il token nell'URL non corrisponde a quello registrato. Torna alla configurazione del modulo e copia il token corrente. Se sospetti una fuga, fai clic su **Rigenera token** e aggiorna il tuo cron Unix.

### Errore SQL durante lo snapshot

Se sei sulla versione 1.0.0, aggiorna alla 1.0.1. La versione iniziale conteneva un difetto in tre query `Db::getRow()` che aggiungevano un `LIMIT 1` manuale mentre PrestaShop ne aggiunge già uno automaticamente, il che produceva un `LIMIT 1 LIMIT 1` SQL non valido. Vedi il changelog.

## Domande frequenti

### Il modulo è obbligatorio per il mio negozio?

Sì, se vendi a consumatori stabiliti nell'Unione Europea e mostri prezzi ridotti, promozioni, codici promozionali, saldi o qualsiasi menzione che faccia riferimento a una riduzione. La Direttiva Omnibus si applica senza soglia minima di fatturato.

### Qual è la differenza con le CartRule?

Il modulo tiene traccia solo dei prezzi provenienti dai record `SpecificPrice` di PrestaShop (sconti sul prodotto, sconti per quantità, sconti per gruppo cliente). Le regole del carrello (`CartRule`) si applicano al checkout e non modificano il prezzo unitario visualizzato sulla scheda prodotto: cadono quindi al di fuori dell'ambito della direttiva.

### Come funziona esattamente la modalità rigorosa?

Il modulo cerca nella cronologia l'ultimo snapshot non promozionale, e poi il primo snapshot promozionale che lo segue. Quella data è l'inizio della promozione in corso. La finestra di riferimento sono quindi i 30 giorni precedenti quella data. Se non è possibile rilevare alcuna transizione da non-promo a promo, il modulo passa automaticamente alla modalità conservativa.

### Posso nascondere l'avviso su alcuni prodotti?

Il modulo si applica globalmente, ma l'opzione di esclusione dei prodotti recenti e l'opzione di nascondere se il prezzo è uguale coprono la maggior parte dei casi in cui la visualizzazione non porta informazioni utili.

### Compatibile con prezzi IVA esclusa/IVA inclusa?

Sì. Il modulo registra entrambi gli importi (`price_tax_excl` e `price_tax_incl`) a ogni snapshot e visualizza quello utilizzato dal negozio. Se passi da una modalità all'altra, la cronologia rimane utilizzabile.

## Changelog

### 1.0.1 — 14 maggio 2026

- Correzione: rimosso il `LIMIT 1` manuale da tre query `Db::getRow()` che producevano un `LIMIT 1 LIMIT 1` SQL non valido. Interessava la garanzia di idempotenza della registrazione e il rilevamento dell'inizio della promo in modalità rigorosa.

### 1.0.0 — 14 maggio 2026

- Versione iniziale
- Acquisizione automatica della cronologia dei prezzi tramite hook e cron giornaliero
- Visualizzazione del prezzo più basso in 30 giorni sulla pagina del prodotto
- Grafico di 30 giorni in canvas vanilla, lazy-load, ~3 KB
- Dashboard di conformità con statistiche ed esportazione CSV
- Modalità di calcolo rigorosa e conservativa
- Supporto multi-negozio, multi-valuta e multi-combinazione
- Restrizione UE configurabile, esclusione dei prodotti recenti, opzione nascondi se uguale
- Traduzioni in FR, EN, ES, DE
