dfomnibus — Cumplimiento de la Directiva Omnibus para PrestaShop
Instalación, configuración, cron, modos de cálculo, panel y resolución de problemas del módulo dfomnibus para el cumplimiento de la Directiva europea Omnibus.
El módulo dfomnibus adapta tu tienda PrestaShop a la Directiva europea 2019/2161 conocida como Omnibus, en vigor en toda la Unión Europea desde el 28 de mayo de 2022. Construye continuamente el historial de precios de cada producto y, en cuanto se activa una promoción, muestra el precio más bajo registrado durante los 30 días anteriores.
Compatibilidad: PrestaShop 8.0 a 9.x. PHP 7.4 a 8.3. Multitienda, multidivisa y multicombinación soportadas de forma nativa. Sin componentes de terceros, sin CDN, respetuoso con el RGPD.
Instalación
La instalación lleva menos de cinco minutos.
- Descarga el archivo
dfomnibus_v1.0.1.zipdesde tu área de cliente DataFirefly. - En el back office de PrestaShop, ve a Módulos → Administrador de módulos → Subir un módulo.
- Sube el ZIP. PrestaShop crea las tablas, genera un token cron y registra los hooks necesarios.
- Haz clic en Configurar para abrir la pantalla de ajustes.
Dos tablas creadas: ps_dfomnibus_price_history para los snapshots y ps_dfomnibus_compliance_log para los eventos de cumplimiento (reservada para futuros usos). El prefijo ps_ se reemplaza automáticamente con el tuyo.
Programación del cron diario
El cron inicializa el historial de tu catálogo y garantiza la continuidad de los snapshots diarios, incluso para productos cuyo precio nunca cambia. Sin un cron activo, el módulo funciona pero su historial se limita a los productos modificados manualmente.
Recuperación del token
Abre la pantalla de configuración del módulo. El token cron que se muestra es único para tu instalación. Obtendrás una URL con la forma:
https://tu-tienda.com/modules/dfomnibus/cron.php?token=TU_TOKEN
Programación mediante cron Unix
Añade la siguiente línea a tu crontab, ajustando la hora según tu tráfico (idealmente en horas valle):
15 3 * * * curl -s "https://tu-tienda.com/modules/dfomnibus/cron.php?token=TU_TOKEN" > /dev/null
Programación mediante CLI
Si prefieres evitar cualquier exposición HTTP, ejecuta el cron directamente desde la línea de comandos:
php /ruta/a/tu-tienda/modules/dfomnibus/cron.php token=TU_TOKEN
Seguridad del token: el módulo utiliza hash_equals() para comparar los tokens, lo que protege contra ataques de temporización. Nunca compartas este token y regenéralo si sospechas un compromiso (botón Regenerar token en la configuración).
Opciones de configuración
Activación de la visualización
El interruptor Activar la visualización controla la inserción del mensaje de cumplimiento bajo el precio del producto. Puedes desactivarlo temporalmente para mantener la recopilación del historial sin mostrar el aviso en el frontend (útil durante una transición o durante pruebas).
Modo de cálculo
Hay dos modos disponibles:
- Estricto: el precio de referencia es el mínimo registrado durante los 30 días anteriores al inicio efectivo de la promoción en curso. Coincide con la letra de la directiva.
- Conservador (recomendado por defecto): el precio de referencia es el mínimo sobre los 30 días anteriores en deslizamiento. Interpretación más desfavorable para el comerciante pero más defensiva en caso de inspección.
¿Qué modo elegir? Si tu tienda tiene una política promocional clara, con fechas de inicio y fin bien registradas, el modo estricto es perfecto. En caso de duda, o si tus reglas SpecificPrice se modifican frecuentemente sin una discontinuidad clara entre períodos promo y no-promo, el modo conservador es más seguro.
Período de referencia
El período está fijado en 30 días por defecto, conforme a la directiva. Puedes aumentarlo (60, 90 días) para ser aún más prudente, pero el valor mínimo sigue siendo 30 días.
Exclusión de productos recientes
La opción Excluir productos de menos de X días oculta la visualización para productos demasiado recientes. Valor por defecto: 30 días. Es coherente con el espíritu de la directiva, que solo se aplica a productos con un historial de precios significativo.
Restricción UE
Si vendes dentro y fuera de la UE, marca Restringir la visualización a la Unión Europea. El módulo detecta el país del cliente en este orden:
- Dirección de entrega del cliente conectado
- Dirección del carrito actual
- País por defecto de la tienda
Si ninguna de estas informaciones está disponible, la visualización está activa por defecto para evitar cualquier riesgo de incumplimiento involuntario.
Ocultar cuando el precio es igual
La opción Ocultar si el precio es idéntico elimina el mensaje cuando el precio actual coincide exactamente con el precio más bajo de los últimos 30 días. Útil para evitar mostrar información sin valor añadido para el consumidor.
Descuento real
Activa Mostrar descuento real para complementar el mensaje con el porcentaje calculado sobre la base del precio Omnibus, y no del precio tachado. Ejemplo: un producto a 89 €, en promoción a 59 €, con un precio Omnibus de 65 €, mostrará -9,2 % de descuento real en lugar del -33 % calculado sobre el precio tachado. Es más honesto, pero cada comerciante es libre de elegir.
Gráfico
El gráfico de 30 días puede mostrarse en una pestaña dedicada de la ficha del producto o en línea bajo el precio. Se carga en lazy mediante IntersectionObserver y solo se activa al entrar en el viewport, lo que garantiza un impacto nulo en los Core Web Vitals de tus fichas de producto.
Seguimiento por combinación
Marca Seguir combinaciones si tus productos tienen precios diferentes por combinación (por ejemplo tallas XL con suplemento). El historial se segmenta entonces por id_product_attribute y el aviso Omnibus se adapta al precio de la combinación seleccionada.
Retención
La duración de conservación por defecto es de 365 días. Más allá, el historial se purga automáticamente al ejecutar el cron. El valor mínimo es de 60 días para garantizar un margen de seguridad respecto a la ventana legal de 30 días.
Panel de cumplimiento
Accesible mediante Módulos → Panel DataFirefly Omnibus, el panel reúne:
- El número de productos seguidos
- El total de snapshots registrados
- La fecha y hora del último paso del cron
- La lista de productos con, para cada uno, la fecha de primera captura, la fecha de última captura, el precio más bajo de los últimos 30 días y un indicador de promoción activa
Para cada producto hay tres acciones disponibles:
- Ver historial: muestra hasta 1000 snapshots con marca de tiempo
- Snapshot manual: fuerza la captura inmediata
- Eliminar historial: reinicia el seguimiento para este producto (usar con precaución)
Exportación CSV
Desde la vista de historial de un producto, el botón Exportar a CSV genera un archivo con todas las columnas con marca de tiempo (fecha, precio sin impuestos, precio con impuestos, divisa, tienda, combinación, indicador promo, fuente de la captura). Formato listo para archivar o para entregar a un inspector.
Comportamiento en el frontend
En la ficha del producto, en cuanto se activa una promoción, se muestra automáticamente el siguiente aviso bajo el precio:
Precio más bajo de los últimos 30 días: 65,00 €
El mensaje se traduce según el idioma de la tienda (francés, inglés, español, alemán). La visualización utiliza el hook estándar displayProductPriceBlock y funciona con todos los temas que respetan los estándares de PrestaShop (Classic, Hummingbird, Warehouse, Transformer, Panda).
Renderizado único por página: el módulo incluye una protección static $rendered que garantiza que el aviso solo aparezca una vez por página, incluso si el hook displayProductPriceBlock se llama varias veces (bloques resumen, sticky, etc.).
Multitienda y multidivisa
El historial se almacena por combinación única (id_product, id_product_attribute, id_shop, id_currency). Cada tienda de tu instalación conserva por tanto su propio historial, y cada divisa activa tiene su propia curva de precios. Sin conversión sobre la marcha: los importes mostrados corresponden exactamente a lo que se registró en el momento de la captura.
Resolución de problemas
El aviso no aparece en la ficha del producto
Comprueba en orden:
- ¿Está marcada la opción Activar la visualización en la configuración?
- ¿Se ha ejecutado el cron al menos una vez? Si no, no existe historial.
- ¿Está activada la restricción UE mientras pruebas desde un país no-UE?
- ¿Está activada la opción Ocultar si el precio es idéntico y el precio actual coincide con el mínimo?
- ¿Tiene el producto menos de 30 días (con la opción de exclusión de novedades activa)?
El gráfico no se carga
Abre la consola del navegador. El módulo espera un endpoint AJAX expuesto por el controlador front pricehistory. Comprueba que ningún sistema de caché o firewall intercepte esta ruta. Si utilizas un CDN, autoriza explícitamente las URL /module/dfomnibus/pricehistory.
El cron devuelve un error 403 o 401
El token en la URL no coincide con el registrado. Vuelve a la configuración del módulo y copia el token actual. Si sospechas una fuga, haz clic en Regenerar token y actualiza tu cron Unix.
Error SQL al hacer un snapshot
Si estás en la versión 1.0.0, actualiza a la 1.0.1. La versión inicial contenía un defecto en tres consultas Db::getRow() que añadían un LIMIT 1 manual mientras PrestaShop ya añade uno automáticamente, lo que producía un LIMIT 1 LIMIT 1 SQL inválido. Ver el changelog.
Preguntas frecuentes
¿Es obligatorio el módulo para mi tienda?
Sí, si vende a consumidores establecidos en la Unión Europea y muestra precios rebajados, promociones, códigos promocionales, rebajas o cualquier mención referente a una reducción. La Directiva Omnibus se aplica sin umbral mínimo de facturación.
¿Cuál es la diferencia con las CartRules?
El módulo sigue únicamente los precios provenientes de los registros SpecificPrice de PrestaShop (descuentos de producto, descuentos por cantidad, descuentos por grupo de cliente). Las reglas de carrito (CartRule) se aplican en el checkout y no modifican el precio unitario mostrado en la ficha del producto: por tanto quedan fuera del alcance de la directiva.
¿Cómo funciona exactamente el modo estricto?
El módulo busca en el historial el último snapshot no-promo, y después el primer snapshot promo que le sigue. Esa fecha es el inicio de la promoción en curso. La ventana de referencia son entonces los 30 días anteriores a esa fecha. Si no se puede detectar ninguna transición de no-promo a promo, el módulo pasa automáticamente al modo conservador.
¿Puedo ocultar el aviso en algunos productos?
El módulo se aplica globalmente, pero la opción de exclusión de productos recientes y la opción de ocultar si el precio es igual cubren la mayoría de casos en los que la visualización no aporta información útil.
¿Compatible con precios sin/con impuestos?
Sí. El módulo registra ambos importes (price_tax_excl y price_tax_incl) en cada snapshot y muestra el que utilice la tienda. Si cambias de un modo a otro, el historial sigue siendo utilizable.
Changelog
1.0.1 — 14 de mayo de 2026
- Corrección: se elimina el
LIMIT 1manual de tres consultasDb::getRow()que producían unLIMIT 1 LIMIT 1SQL inválido. Afectaba a la garantía de idempotencia del registro y a la detección del inicio de promo en modo estricto.
1.0.0 — 14 de mayo de 2026
- Versión inicial
- Captura automática del historial de precios mediante hooks y cron diario
- Visualización del precio más bajo en 30 días en la página del producto
- Gráfico de 30 días en canvas vanilla, lazy-load, ~3 KB
- Panel de cumplimiento con estadísticas y exportación CSV
- Modos de cálculo estricto y conservador
- Soporte multitienda, multidivisa y multicombinación
- Restricción UE configurable, exclusión de productos recientes, opción ocultar si igual
- Traducciones en FR, EN, ES, DE