# dfomnibus — EU-Omnibus-Richtlinien-Compliance für PrestaShop

> Das Modul dfomnibus bringt Ihren PrestaShop-Shop in Übereinstimmung mit der europäischen Richtlinie 2019/2161, bekannt als Omnibus, die seit dem 28. Mai 2022 in der gesamten Europäischen Union in Kraft ist.…

- Seite: <https://www.datafirefly.com/de/documentation/dfomnibus/>
- Sprache: de
- Aktualisiert am: 2026-07-02
- Weitere Sprachen: [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), [it](https://www.datafirefly.com/it/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)
- Index: <https://www.datafirefly.com/de/documentation/llms.txt>

Das Modul **dfomnibus** bringt Ihren PrestaShop-Shop in Übereinstimmung mit der europäischen Richtlinie 2019/2161, bekannt als Omnibus, die seit dem 28. Mai 2022 in der gesamten Europäischen Union in Kraft ist. Es baut kontinuierlich die Preishistorie jedes Produkts auf und zeigt, sobald eine Aktion aktiv ist, den niedrigsten Preis der 30 vorangehenden Tage an.

**Kompatibilität:** PrestaShop 8.0 bis 9.x. PHP 7.4 bis 8.3. Multishop, Multiwährung und Multikombination werden nativ unterstützt. Keine Drittanbieter-Komponenten, kein CDN, DSGVO-konform.

## Installation

Die Installation dauert weniger als fünf Minuten.

1. Laden Sie die Datei `dfomnibus_v1.0.1.zip` aus Ihrem DataFirefly-Kundenbereich herunter.
2. Gehen Sie im PrestaShop-Backoffice zu **Module → Modulverwaltung → Modul hochladen**.
3. Laden Sie das ZIP hoch. PrestaShop erstellt die Tabellen, generiert ein Cron-Token und registriert die erforderlichen Hooks.
4. Klicken Sie auf **Konfigurieren**, um den Einstellungsbildschirm zu öffnen.

**Zwei erstellte Tabellen:** `ps_dfomnibus_price_history` für die Snapshots und `ps_dfomnibus_compliance_log` für Compliance-Ereignisse (für zukünftige Nutzung reserviert). Das Präfix `ps_` wird automatisch durch Ihres ersetzt.

## Programmierung des täglichen Cron

Der Cron initialisiert die Historie Ihres Katalogs und gewährleistet die Kontinuität der täglichen Snapshots, auch für Produkte, deren Preis sich nie ändert. Ohne aktiven Cron funktioniert das Modul, aber die Historie beschränkt sich auf manuell geänderte Produkte.

### Token abrufen

Öffnen Sie den Konfigurationsbildschirm des Moduls. Das angezeigte Cron-Token ist für Ihre Installation eindeutig. Sie erhalten eine URL der Form:

```
https://ihr-shop.com/modules/dfomnibus/cron.php?token=IHR_TOKEN
```

### Programmierung über Unix-Cron

Fügen Sie die folgende Zeile zu Ihrer Crontab hinzu und passen Sie die Uhrzeit an Ihren Traffic an (idealerweise in Nebenzeiten):

```
15 3 * * * curl -s "https://ihr-shop.com/modules/dfomnibus/cron.php?token=IHR_TOKEN" > /dev/null
```

### Programmierung über CLI

Wenn Sie jegliche HTTP-Exposition vermeiden möchten, führen Sie den Cron direkt auf der Kommandozeile aus:

```
php /pfad/zu/ihrem-shop/modules/dfomnibus/cron.php token=IHR_TOKEN
```

**Token-Sicherheit:** Das Modul verwendet `hash_equals()` zum Vergleichen der Token, was gegen Timing-Angriffe schützt. Teilen Sie dieses Token niemals und generieren Sie es neu, wenn Sie eine Kompromittierung vermuten (Button _Token neu generieren_ in der Konfiguration).

## Konfigurationsoptionen

### Anzeigeaktivierung

Der Schalter **Anzeige aktivieren** steuert das Einfügen des Compliance-Hinweises unter dem Produktpreis. Sie können ihn vorübergehend deaktivieren, um die Historienerfassung zu erhalten, ohne den Hinweis im Frontend anzuzeigen (nützlich bei einer Umstellung oder während Tests).

### Berechnungsmodus

Zwei Modi sind verfügbar:

- **Streng**: Der Referenzpreis ist das Minimum, das während der 30 Tage vor dem tatsächlichen Beginn der aktuellen Aktion erfasst wurde. Entspricht dem Wortlaut der Richtlinie.
- **Konservativ** (standardmäßig empfohlen): Der Referenzpreis ist das Minimum über die zurücklaufenden 30 Tage. Für den Händler ungünstigere Auslegung, aber im Fall einer Prüfung defensiver.

**Welchen Modus wählen?** Wenn Ihr Shop eine klare Aktionspolitik mit gut nachverfolgbaren Start- und Endterminen hat, ist der strenge Modus ideal. Im Zweifel oder wenn Ihre SpecificPrice-Regeln häufig ohne klare Unterbrechung zwischen Aktions- und Nicht-Aktions-Perioden geändert werden, ist der konservative Modus sicherer.

### Referenzzeitraum

Der Zeitraum ist standardmäßig auf 30 Tage festgelegt, gemäß der Richtlinie. Sie können ihn verlängern (60, 90 Tage), um noch vorsichtiger zu sein, aber der Mindestwert bleibt 30 Tage.

### Ausschluss neuer Produkte

Die Option **Produkte unter X Tagen ausschließen** blendet die Anzeige für zu neue Produkte aus. Standardwert: 30 Tage. Dies steht im Einklang mit dem Geist der Richtlinie, die nur für Produkte mit signifikanter Preishistorie gilt.

### EU-Beschränkung

Wenn Sie innerhalb und außerhalb der EU verkaufen, aktivieren Sie **Anzeige auf die Europäische Union beschränken**. Das Modul erkennt das Land des Kunden in dieser Reihenfolge:

1. Lieferadresse des angemeldeten Kunden
2. Adresse des aktuellen Warenkorbs
3. Standardland des Shops

Wenn keine dieser Informationen verfügbar ist, ist die Anzeige standardmäßig aktiv, um jedes Risiko unbeabsichtigter Nichtkonformität zu vermeiden.

### Ausblenden bei gleichem Preis

Die Option **Ausblenden, wenn Preis identisch** entfernt den Hinweis, wenn der aktuelle Preis genau dem niedrigsten Preis der letzten 30 Tage entspricht. Nützlich, um keine Informationen ohne Mehrwert für den Verbraucher anzuzeigen.

### Realer Rabatt

Aktivieren Sie **Realen Rabatt anzeigen**, um den Hinweis um den Prozentsatz zu ergänzen, der auf Basis des Omnibus-Preises statt des durchgestrichenen Preises berechnet wird. Beispiel: Ein Produkt zu 89 €, im Angebot zu 59 €, mit einem Omnibus-Preis von 65 € zeigt _-9,2 %_ realen Rabatt anstelle der -33 %, die auf den durchgestrichenen Preis berechnet werden. Es ist ehrlicher, aber jeder Händler ist frei zu wählen.

### Diagramm

Das 30-Tage-Diagramm kann in einem dedizierten Produkt-Tab oder direkt unter dem Preis angezeigt werden. Es wird lazy per IntersectionObserver geladen und nur beim Eintritt in den Viewport ausgelöst, was einen Null-Einfluss auf die Core Web Vitals Ihrer Produktseiten garantiert.

### Verfolgung pro Kombination

Aktivieren Sie **Kombinationen verfolgen**, wenn Ihre Produkte unterschiedliche Preise pro Kombination haben (zum Beispiel XL-Größen mit Aufpreis). Die Historie wird dann nach `id_product_attribute` segmentiert und der Omnibus-Hinweis passt sich an den Preis der ausgewählten Kombination an.

### Aufbewahrung

Die Standard-Aufbewahrungsdauer beträgt 365 Tage. Darüber hinaus wird die Historie bei Cron-Ausführung automatisch bereinigt. Der Mindestwert beträgt 60 Tage, um eine Sicherheitsspanne gegenüber dem gesetzlichen 30-Tage-Fenster zu gewährleisten.

## Compliance-Dashboard

Erreichbar über **Module → DataFirefly Omnibus Dashboard**, fasst das Dashboard zusammen:

- Die Anzahl verfolgter Produkte
- Die Gesamtzahl erfasster Snapshots
- Datum und Uhrzeit des letzten Cron-Laufs
- Die Liste der Produkte mit jeweils Datum der ersten Erfassung, Datum der letzten Erfassung, niedrigstem Preis der letzten 30 Tage und einem Indikator für aktive Aktionen

Für jedes Produkt stehen drei Aktionen zur Verfügung:

- **Historie anzeigen**: zeigt bis zu 1000 zeitgestempelte Snapshots
- **Manueller Snapshot**: erzwingt eine sofortige Erfassung
- **Historie löschen**: setzt die Verfolgung für dieses Produkt zurück (mit Vorsicht verwenden)

### CSV-Export

Aus der Historienansicht eines Produkts erzeugt der Button **Als CSV exportieren** eine Datei mit allen zeitgestempelten Spalten (Datum, Preis ohne Steuer, Preis mit Steuer, Währung, Shop, Kombination, Aktions-Indikator, Erfassungsquelle). Format bereit zum Archivieren oder zur Übergabe an einen Prüfer.

## Verhalten im Frontend

Auf der Produktseite wird, sobald eine Aktion aktiv ist, der folgende Hinweis automatisch unter dem Preis angezeigt:

> Niedrigster Preis der letzten 30 Tage: 65,00 €

Die Meldung wird nach der Sprache des Shops übersetzt (Französisch, Englisch, Spanisch, Deutsch). Die Anzeige verwendet den Standard-Hook `displayProductPriceBlock` und funktioniert mit allen Themes, die die PrestaShop-Standards respektieren (Classic, Hummingbird, Warehouse, Transformer, Panda).

**Einmalige Wiedergabe pro Seite:** Das Modul enthält eine `static $rendered`-Absicherung, die garantiert, dass der Hinweis nur einmal pro Seite erscheint, auch wenn der Hook `displayProductPriceBlock` mehrfach aufgerufen wird (Zusammenfassungsblöcke, Sticky, etc.).

## Multishop und Multiwährung

Die Historie wird pro eindeutigem Tupel `(id_product, id_product_attribute, id_shop, id_currency)` gespeichert. Jeder Shop Ihrer Installation behält also seine eigene Historie, und jede aktive Währung hat ihre eigene Preiskurve. Keine Umrechnung zur Laufzeit: Die angezeigten Beträge entsprechen genau dem, was zum Zeitpunkt der Erfassung aufgezeichnet wurde.

## Fehlerbehebung

### Der Hinweis erscheint nicht auf der Produktseite

Prüfen Sie in dieser Reihenfolge:

1. Ist die Option **Anzeige aktivieren** in der Konfiguration angehakt?
2. Wurde der Cron mindestens einmal ausgeführt? Wenn nicht, existiert keine Historie.
3. Ist die EU-Beschränkung aktiviert, während Sie aus einem Nicht-EU-Land testen?
4. Ist die Option **Ausblenden, wenn Preis identisch** aktiviert und entspricht der aktuelle Preis dem Minimum?
5. Ist das Produkt weniger als 30 Tage alt (mit aktiver Neuprodukt-Ausschlussoption)?

### Das Diagramm lädt nicht

Öffnen Sie die Browser-Konsole. Das Modul erwartet einen AJAX-Endpunkt, der vom Front-Controller `pricehistory` bereitgestellt wird. Prüfen Sie, dass kein Cache-System oder Firewall diese Route abfängt. Wenn Sie ein CDN verwenden, geben Sie die URLs `/module/dfomnibus/pricehistory` explizit frei.

### Der Cron gibt einen 403- oder 401-Fehler zurück

Das Token in der URL stimmt nicht mit dem gespeicherten überein. Gehen Sie zurück zur Modulkonfiguration und kopieren Sie das aktuelle Token. Wenn Sie ein Leck vermuten, klicken Sie auf **Token neu generieren** und aktualisieren Sie Ihren Unix-Cron.

### SQL-Fehler beim Snapshot

Wenn Sie Version 1.0.0 nutzen, aktualisieren Sie auf 1.0.1. Die ursprüngliche Version hatte einen Defekt in drei `Db::getRow()`-Abfragen, die ein manuelles `LIMIT 1` hinzufügten, während PrestaShop bereits eines automatisch anhängt, was ein ungültiges `LIMIT 1 LIMIT 1` SQL erzeugte. Siehe Changelog.

## Häufig gestellte Fragen

### Ist das Modul für meinen Shop verpflichtend?

Ja, sofern Sie an Verbraucher in der Europäischen Union verkaufen und reduzierte Preise, Aktionen, Gutscheincodes, Sale-Aktionen oder andere Hinweise auf eine Preisreduzierung darstellen. Die Omnibus-Richtlinie gilt ohne Mindestumsatzschwelle.

### Was ist der Unterschied zu CartRules?

Das Modul verfolgt nur Preise aus PrestaShop `SpecificPrice`-Datensätzen (Produkt-, Mengen-, Kundengruppen-Rabatte). Cart Rules (`CartRule`) werden im Checkout angewendet und ändern nicht den auf der Produktseite angezeigten Einzelpreis: Sie fallen daher außerhalb des Geltungsbereichs der Richtlinie.

### Wie funktioniert der strenge Modus genau?

Das Modul sucht in der Historie den letzten Nicht-Aktions-Snapshot und dann den ersten Aktions-Snapshot, der folgt. Dieses Datum ist der Beginn der aktuellen Aktion. Das Referenzfenster sind dann die 30 Tage vor diesem Datum. Wenn kein Übergang von Nicht-Aktion zu Aktion erkennbar ist, wechselt das Modul automatisch in den konservativen Modus.

### Kann ich den Hinweis für bestimmte Produkte ausblenden?

Das Modul gilt global, aber die Option zum Ausschluss neuer Produkte und die Option zum Ausblenden bei gleichem Preis decken die Mehrheit der Fälle ab, in denen die Anzeige keine nützliche Information bringt.

### Kompatibel mit Preisen ohne / mit Steuer?

Ja. Das Modul erfasst beide Beträge (`price_tax_excl` und `price_tax_incl`) bei jedem Snapshot und zeigt den vom Shop verwendeten an. Wenn Sie von einem Modus in den anderen wechseln, bleibt die Historie nutzbar.

## Changelog

### 1.0.1 — 14. Mai 2026

- Korrektur: manuelles `LIMIT 1` aus drei `Db::getRow()`-Abfragen entfernt, die ein ungültiges `LIMIT 1 LIMIT 1` SQL erzeugten. Betraf die Idempotenz-Absicherung der Erfassung und die Aktionsstart-Erkennung im strengen Modus.

### 1.0.0 — 14. Mai 2026

- Erstveröffentlichung
- Automatische Preishistorie-Erfassung über Hooks und täglichen Cron
- Anzeige des niedrigsten Preises der letzten 30 Tage auf der Produktseite
- 30-Tage-Diagramm in Vanilla-Canvas, Lazy-Load, ~3 KB
- Compliance-Dashboard mit Statistiken und CSV-Export
- Berechnungsmodi streng und konservativ
- Multishop-, Multiwährungs- und Multikombinations-Unterstützung
- Konfigurierbare EU-Beschränkung, Ausschluss neuer Produkte, Option Ausblenden-bei-Gleichheit
- Übersetzungen in FR, EN, ES, DE
