# Centro de Notificaciones para Shopware 6 — Instalación, configuración y documentación técnica

> Presentación El Centro de Notificaciones DataFirefly añade una campana de notificaciones a la cabecera del storefront de Shopware 6, justo al lado del carrito. Una insignia roja indica el número…

- Página: <https://www.datafirefly.com/es/documentation/dff-notification-center-shopware/>
- Idioma: es
- Actualizado el: 2026-07-08
- Otros idiomas: [fr](https://www.datafirefly.com/documentation/dff-notification-center-shopware/index.md), [en](https://www.datafirefly.com/en/documentation/dff-notification-center-shopware/index.md), [de](https://www.datafirefly.com/de/documentation/dff-notification-center-shopware/index.md), [it](https://www.datafirefly.com/it/documentation/dff-notification-center-shopware/index.md), [pl](https://www.datafirefly.com/pl/documentation/dff-notification-center-shopware/index.md), [nl](https://www.datafirefly.com/nl/documentation/dff-notification-center-shopware/index.md), [pt](https://www.datafirefly.com/pt/documentation/dff-notification-center-shopware/index.md)
- Índice: <https://www.datafirefly.com/es/documentation/llms.txt>

## Presentación

El Centro de Notificaciones DataFirefly añade una **campana de notificaciones** a la cabecera del storefront de Shopware 6, justo al lado del carrito. Una insignia roja indica el número de mensajes no leídos (se muestra «9+» a partir de nueve) y un panel desplegable presenta sus anuncios, nuevos productos y códigos promocionales.

El plugin gestiona tres tipos de notificaciones: **anuncios** redactados manualmente, **notificaciones de producto** creadas automáticamente con cada nuevo producto (imagen y enlace resueltos en tiempo real) y **códigos promocionales** con un botón «Copiar» de un solo clic. Cada notificación puede programarse, segmentarse por grupo de clientes y canal de ventas, priorizarse y medirse mediante KPI de vistas y clics.

Un solo plugin, un solo ZIP, compatible con **Shopware 6.5, 6.6 y 6.7** — incluida la administración basada en Vite de la 6.7, entregada precompilada sin paso de compilación.

## Requisitos

- Shopware 6.5, 6.6 o 6.7 (`shopware/core` ~6.5 || ~6.6 || ~6.7)
- Acceso a la línea de comandos para vaciar la caché e instalar los assets
- Sin dependencias externas, sin servicios de terceros

## Instalación

1. En la administración, vaya a **Extensiones → Mis extensiones → Subir extensión** y seleccione el ZIP.
2. Instale y luego **active** el plugin.
3. Vacíe la caché e instale los assets:

```
bin/console plugin:refresh
bin/console plugin:install --activate DffNotificationCenter
bin/console assets:install
bin/console cache:clear
```

Tras instalar o actualizar, vacíe también la caché de su navegador (Ctrl+F5) en la página de administración para recargar el módulo.

### Shopware 6.7 (administración Vite)

El módulo de administración se entrega **precompilado** con un archivo Vite `entrypoints.json`. Se carga tal cual en 6.5, 6.6 y 6.7 sin paso de compilación. Tras cada actualización, simplemente ejecute:

```
bin/console assets:install
bin/console cache:clear
```

## Configuración

Vaya a **Extensiones → Mis extensiones → Centro de Notificaciones → Configurar**. Los ajustes se pueden definir por canal de ventas.

### Campana de notificaciones

- **Activar la campana** (por defecto: sí): muestra u oculta la campana en el storefront.
- **Número máximo de notificaciones mostradas** (por defecto: 10): limitado entre 1 y 50 en el servidor.
- **Intervalo de actualización en segundo plano** (por defecto: 60 s): intervalo de sondeo, `0` para desactivar.
- **Sonido** (por defecto: no): reproduce un sonido al recibir una notificación.
- **Animación** (por defecto: sí): anima la campana cuando hay notificaciones no leídas.

### Notificaciones automáticas de productos

- **Crear una notificación por cada nuevo producto** (por defecto: sí).
- **Solo para productos activos** (por defecto: sí).
- **Caducidad automática** (por defecto: 30 días, `0` = nunca): a partir de ahí, la notificación de producto deja de mostrarse.

### Notificaciones automáticas de promociones

- **Crear una notificación al crear una promoción con código** (por defecto: **no**, debe activarse explícitamente).

La notificación de promoción se crea en cuanto una promoción **activa** tiene un **código global**. Por diseño, los códigos individuales nunca se difunden.

## Gestionar las notificaciones en la administración

El módulo de gestión se encuentra en **Marketing → Centro de Notificaciones**. Allí crea, programa, segmenta y prioriza sus anuncios, y consulta los KPI de vistas/clics.

Hay tres tipos disponibles:

- **Anuncio** (`manual`): título, mensaje, etiqueta de botón y enlace libres.
- **Producto** (`product`): vinculada a un producto; la imagen de portada y el enlace a la ficha se resuelven en tiempo real en cada renderizado — nunca un enlace roto.
- **Código promocional** (`promo`): muestra un código con un botón «Copiar» del lado del cliente.

### Programación, segmentación y prioridad

- **Programación**: fechas `validFrom` / `validUntil`; una notificación fuera de su ventana no se difunde.
- **Segmentación por grupo de clientes**: limita la difusión a un grupo de clientes dado (vacío = todos).
- **Segmentación por canal de ventas**: limita a un canal (vacío = todos), útil en configuraciones multitienda.
- **Prioridad**: entero; las prioridades más altas se muestran primero, luego se ordenan por fecha de creación descendente.

## Comportamiento del lado del cliente

La campana se inserta en la cabecera mediante una extensión Twig (`sw_extends`). Si su tema personaliza mucho la cabecera, un _fallback_ JavaScript inserta automáticamente la campana junto al carrito.

El panel recupera las notificaciones mediante una llamada AJAX. La insignia muestra el recuento de no leídas, con sonido y animación opcionales y una actualización en segundo plano configurable. La interfaz es accesible: atributos ARIA, navegación por teclado y disposición en _bottom-sheet_ en móvil.

**Estado de lectura:** para los clientes conectados se almacena en el servidor (tabla `dff_notification_read`) y, por tanto, se sincroniza entre dispositivos. Para los invitados permanece en el `localStorage` del navegador — no se recopila ningún dato personal.

## Arquitectura técnica

El plugin sigue las convenciones de Shopware: entidades declaradas mediante la Data Abstraction Layer (DAL), un controlador de storefront que devuelve JSON, subscribers de eventos y una migración SQL. Sin overrides — las plantillas se extienden mediante `sw_extends` y el código es 100 % nativo.

### Entidades y Data Abstraction Layer

La entidad principal `dff_notification` (`NotificationDefinition`) lleva los campos: `type`, `active`, `priority`, `validFrom`, `validUntil`, `customerGroupId`, `salesChannelId`, `productId` (+ `productVersionId`), `promotionId`, `promoCode`, `views` y `clicks`. Los campos traducibles `title`, `message`, `buttonLabel` y `linkUrl` los lleva la entidad de traducción `dff_notification_translation`.

Asociaciones: `ManyToOne` hacia `customer_group`, `sales_channel`, `product` y `promotion`; `OneToMany` hacia `dff_notification_read` (estado de lectura por cliente). Las definiciones se registran con la etiqueta `shopware.entity.definition` y se exponen a la API (`ApiAware`).

### Esquema de base de datos

La migración `Migration1781049600NotificationCenter` crea tres tablas:

- `dff_notification`: la notificación, con índices en `active` y en `(product_id, product_version_id)`. Claves foráneas hacia `customer_group` y `sales_channel` (`ON DELETE SET NULL`) y hacia `product` (`ON DELETE CASCADE`).
- `dff_notification_translation`: traducciones por idioma (`title`, `message`, `button_label`, `link_url`).
- `dff_notification_read`: pares notificación/cliente, con un índice único en `(dff_notification_id, customer_id)` para evitar lecturas duplicadas.

### Rutas AJAX del storefront

Las rutas se declaran en XML (`Resources/config/routes.xml`) para mantener la compatibilidad de Shopware 6.5 a 6.7 (Symfony 6.x y 7.x). El controlador extiende `AbstractController` — no `StorefrontController` — porque solo devuelve JSON y `setTwig()` se eliminó en 6.7.

- `GET /dff-nc/list` → `list()`: devuelve las notificaciones difundibles e incrementa sus vistas.
- `POST /dff-nc/read` → `markRead()`: marca como leído en el servidor (clientes conectados); para los invitados, la respuesta indica almacenamiento `client`.
- `POST /dff-nc/click/{id}` → `click()`: incrementa el contador de clics.

### Lógica de difusión (controlador list)

La consulta DAL filtra las notificaciones con `active = true`, dentro de su ventana de validez (`validFrom` ≤ ahora ≤ `validUntil`, límites nulos admitidos), que coinciden con el canal de ventas actual (o nulo) y el grupo de clientes actual (o nulo), ordenadas por prioridad y luego por fecha de creación descendente. Los productos vinculados se resuelven después dinámicamente (asociación `cover.media`): una notificación de producto cuyo producto se ha eliminado o no está disponible en el canal se oculta silenciosamente. Las vistas de las notificaciones realmente mostradas se incrementan en una sola consulta.

### Notificaciones automáticas (subscribers)

**ProductSubscriber** escucha `product.written`. En cada _insert_ de producto en la versión _live_ (se omiten las variantes con `parentId`), y si la opción está activada, crea una notificación de tipo `product` — respetando el filtro «solo productos activos», la vida útil configurada (`validUntil`) y un control anti-duplicados por producto.

**PromotionSubscriber** escucha `promotion.written`. Como la administración crea primero la promoción y luego establece su código y su indicador de activación mediante actualizaciones sucesivas, reacciona tanto a _inserts_ como a _updates_. Solo se crea una notificación `promo` si la promoción está **activa** y tiene un **código global**, arrastrando las fechas `validFrom`/`validUntil` de la promoción con un control anti-duplicados por promoción.

### Internacionalización

Se entregan tres idiomas para storefront y administración: francés, inglés y alemán (snippets `fr-FR`, `en-GB`, `de-DE`). Los títulos y mensajes por defecto de las notificaciones de producto y promoción se generan mediante el servicio de traducción (claves `dffNc.*`).

## Privacidad (RGPD)

El plugin no recopila ningún dato personal. El estado de lectura de los invitados permanece en su navegador (`localStorage`); el de los clientes conectados se almacena en el servidor y se vincula a su cuenta. Los contadores de vistas y clics se agregan a nivel de notificación, sin perfilado individual.

## Desinstalación

Al desinstalar, las tablas `dff_notification_read`, `dff_notification_translation` y `dff_notification` se eliminan — **salvo** que la opción «conservar los datos del usuario» esté marcada, en cuyo caso se dejan intactas.

## Resolución de problemas

- **La campana no aparece**: compruebe que la campana esté activada en la configuración, vuelva a ejecutar `assets:install` y `cache:clear`, y luego vacíe la caché del navegador. El fallback JS la inserta junto al carrito si el tema sobrescribe la cabecera.
- **No se crea ninguna notificación de producto**: la opción debe estar activada, el producto debe ser un producto raíz (no una variante) y, si el filtro está activo, marcado como activo.
- **No se crea ninguna notificación de promoción**: la opción está desactivada por defecto; la promoción debe estar activa y tener un código global (los códigos individuales no se difunden).
- **El módulo de administración no carga en 6.7**: vuelva a ejecutar `assets:install` y luego `cache:clear` y fuerce una recarga del navegador (Ctrl+F5).
