Avisos
Publica un aviso para todos los usuarios por megáfono, correo y web push.
Los avisos son comunicados que un administrador publica para todos: una ventana de mantenimiento, una función nueva, un cambio de términos. Cada uno es una página dentro de la aplicación, una entrada en un desplegable con icono de megáfono y, opcionalmente, un correo. Esta guía cubre encender el módulo, publicar, lo que ven los usuarios y lo que la cola tiene que hacer.
Enciéndelo
| Opción | Variable de entorno | Por omisión | Qué cambia |
|---|---|---|---|
features.announcements |
FEATURE_ANNOUNCEMENTS |
false |
Encendida: el recurso Announcements aparece en /admin/announcements, el desplegable del megáfono aparece en la barra superior de la aplicación y /account/announcements abre. Apagada: el recurso se oculta y sus rutas devuelven 403, las páginas de cuenta devuelven 404, el desplegable no se dibuja. |
FEATURE_ANNOUNCEMENTS no está en .env.example; agrégala tú.
FEATURE_ANNOUNCEMENTS=true
La bandera se lee desde config/features.php, así que surte efecto después de php artisan config:clear cuando la configuración está en caché.
Publica uno
Ve a /admin/announcements y haz clic en Create. El formulario:
| Campo | Reglas | Notas |
|---|---|---|
| Title | obligatorio, hasta 255 caracteres | Se muestra en el desplegable, la lista, la página y el asunto del correo. |
| Slug | opcional, único | Si lo dejas vacío, se genera a partir del título. Es el último segmento de la URL pública, /account/announcements/{slug}. |
| Description | obligatorio | Un editor Markdown (Toast UI). Se guarda como Markdown y se dibuja como HTML en la página y en el correo. |
| Status | obligatorio, por omisión Draft | draft o published, los casos de App\Enums\AnnouncementStatus. Sólo los avisos publicados son visibles para los usuarios. |
| Send Email | por omisión apagado | Si la publicación además envía un correo. Oculto en las vistas de índice y detalle. |
Dos campos más, Published At y Created At, son de sólo lectura en la vista de detalle.
No hay selector de audiencia ni publicación programada: cada aviso publicado llega a todas las cuentas en el momento en que lo guardas con el estado Published. Publica los borradores cuando lo digas en serio.
Lo que pasa al guardar, en App\Observers\AnnouncementObserver:
- Guardar con estado Published por primera vez llena Published At con la hora actual. Regresar a Draft lo limpia; publicar de nuevo estampa una hora nueva, así que el aviso vuelve arriba como no leído para todos.
- Cada vez que el estado se vuelve Published — al crear o tras un cambio — el job
App\Jobs\SendAnnouncementEmailsJobse despacha a la cola con el aviso. Editar el título o el cuerpo de un aviso que ya está publicado no despacha nada.
Los avisos hacen borrado suave, así que la vista de papelera del recurso puede restaurar uno. Los permisos siguen la forma habitual (create announcement, retrieve announcement, update announcement, delete announcement); mira /help/roles-and-permissions.
Lo que ven los usuarios
El lado del lector son tres componentes Livewire en app/Livewire/Auth/Announcements/: Dropdown, Index y Show.
El megáfono. La barra superior de la aplicación muestra un icono de megáfono junto a la campana de notificaciones. Una insignia roja lleva el número de avisos no leídos, con tope en 9+. Al hacer clic se abre un desplegable con los diez avisos publicados más recientes, del más nuevo al más viejo, cada uno con su título y un extracto de 60 caracteres; los no leídos llevan un borde izquierdo de color. El desplegable tiene Mark as Read, que marca todo como leído de una vez, y View all announcements.
La lista. /account/announcements (enlazada también como Announcements en la barra lateral de la cuenta) pagina los avisos publicados, diez por página, con título, extracto de 150 caracteres y fecha de publicación.
La página. /account/announcements/{slug} dibuja el Markdown completo con la fecha de publicación y un enlace de regreso a la lista. Sólo resuelven los avisos publicados; el slug de un borrador devuelve 404.
Cómo se registra la lectura
El estado de lectura es una marca de tiempo por cuenta: users.last_announcement_read_at. Un aviso está sin leer cuando su Published At es posterior a esa marca, o cuando la marca está vacía. Dos cosas la ponen en la hora actual: abrir la página de cualquier aviso, y Mark as Read en el desplegable. Ambas marcan todos los avisos como leídos, no sólo uno.
No hay registro de lectura por aviso ni conteo de lecturas. El panel de administración no muestra nada sobre quién leyó qué; lo que sí guarda es qué correos salieron, descrito abajo.
Correo y web push
El job recorre User::whereNull('blocked_at') en bloques de 100 y envía a cada cuenta App\Notifications\Announcements\AnnouncementNotification. Las cuentas sin verificar entran; las bloqueadas no. La notificación elige sus canales por cuenta:
| Canal | Se envía cuando |
|---|---|
| Correo | Send Email está encendido para el aviso Y la cuenta tiene activado Notify me by email of all actions on my account en su perfil. |
| Web push | La cuenta tiene al menos una suscripción push, esté o no encendido Send Email. Mira /help/web-push-and-the-pwa. |
La notificación no usa el canal de base de datos, así que no aparece en el centro de notificaciones; el megáfono es su forma dentro de la aplicación. Una cuenta que no cumple ninguna de las dos condiciones no recibe nada más que la insignia del megáfono.
El correo usa el layout de correo estándar de la aplicación a través de resources/views/emails/announcements/announcement.blade.php: el asunto es {nombre de la app} — {título}, el cuerpo es el Markdown dibujado, y un botón Read announcement abre la página del aviso. Cada correo que de verdad se envía queda registrado en Communication Logs, en /admin/communication_logs, con el destinatario, la clase de notificación, el asunto y el cuerpo HTML; un envío fallido también queda registrado ahí con su estado. Ese registro es lo más cercano a un reporte de entrega que ofrece el panel.
El job y la notificación implementan ShouldQueue, así que nada se envía hasta que corre un worker:
php artisan queue:work
Sin worker el aviso queda publicado y visible en el megáfono de inmediato; sólo los correos y los push esperan. Configura el worker como servicio en producción, como describe /help/queues-and-scheduled-work, y asegúrate de que el correo de .env funciona antes de encender Send Email para una base de usuarios grande: una publicación envía un correo por cuenta.