Informe: agrupado, sumado y listo para exportar.
El informe de abajo corre en la app de ejemplo, publicada en la Prueba online, sobre las mismas 52 ventas. Aparecen agrupadas por vendedor, con subtotales por grupo y total general.
Todas las ventas de una vez, separadas por vendedor
Un informe es un listado con la agrupación activada y sin paginación. Todos los registros salen de una vez, separados por grupo, con subtotales y el estado coloreado.

Tres propiedades convierten el listado en informe
Con tres propiedades en el controller, el listado se vuelve informe. Solo hay una regla: el orden predeterminado (defaultSort) tiene que empezar por los campos de la agrupación. Si no, el mismo grupo aparece más de una vez.
class VendaReport extends MadDataGrid{protected string $model = Venda::class;// El sort DEBE empezar por los campos de agrupación (si no, los grupos se repiten)protected string $defaultSort = 'vendedor ASC, data_venda ASC';public int $perPage = 0; // sin paginación: grupos completosprotected string|array $groupBy = 'vendedor';protected bool $groupTotal = true;protected string $exportTitle = 'Informe de ventas';protected string $exportFilename = 'informe-de-ventas';} La exportación conserva los grupos y los subtotales
Grupos, subtotales y total general van junto al CSV, al Excel y al PDF. El PDF es el mismo de la página de Listado, con encabezado, cortes por grupo, estado coloreado y Página X de Y.

Cuándo usar el informe
Usa el informe cuando alguien necesita ver todo de una vez, separado en grupos y sumado. Es la pantalla del cierre y de la verificación.
- Comisión de ventas. Las ventas del mes por vendedor, con el subtotal de cada uno.
- Extracto financiero. Movimientos por cuenta, con un saldo que reinicia en cada cuenta.
- Movimiento de inventario. Entradas y salidas por producto y, dentro de él, por mes.
- Tickets de soporte. Tickets por técnico, con la cantidad de cada uno.
Para editar registro por registro, usa el listado. Para indicadores y gráficos, el dashboard. Para imprimir un pedido, el documento. Y los filtros del informe se convierten en consultas Eloquent comunes, como muestra la generación de código.
Lo que configuras
Además de las tres propiedades de arriba, estos atributos cambian lo que sale en pantalla y en el PDF.
- Niveles de la agrupación
group-by - Hasta tres campos, separados por coma. Acepta un campo de otra tabla y una fecha agrupada por día, mes o año.
- Etiqueta del grupo
group-mask - El texto que abre cada grupo, con campos y valores ya formateados, como moneda y fecha.
- Subtotal alineado
group-band - Con el valor
cells, los subtotales quedan debajo de las columnas sumadas, como en un informe impreso. - Línea de detalle
row-detail - Una segunda línea bajo cada registro, como el historial de un movimiento. Sale en pantalla y en el PDF.
- Saldo acumulado
running - Suma la columna fila por fila. Con
running-reset="group", el saldo reinicia en cada grupo. - Subtítulo del archivo
export-subtitle - Puede traer el período filtrado. Así el PDF ya dice de cuándo son las cifras.
Lo que va al proyecto Laravel
El informe usa la misma base del listado (MadDataGrid), en una clase en app/Control con la vista <mad-grid>. Lo que ajustas en el código:
- Ajustes en propiedades PHP. Agrupación, subtotal, título y nombre del archivo son propiedades de la clase. Si el Blade trae el atributo del título, ese gana.
- Filtro extra en Eloquent. Una condición que la pantalla no ofrece entra en el método de búsqueda de la clase (
onSearch). - Encabezado del PDF con marcadores. Las franjas del PDF quedan en un bloque de la clase, con título, fecha, período, filtros activos y número de página. Un dato solo de esta pantalla entra por un método propio (
exportPdfPlaceholders).
Como toda pantalla de MadBuilder, esos archivos se abren en tu editor, van a tu Git y aceptan código a mano en bloques protegidos, que siguen ahí cuando la pantalla se genera de nuevo. Mira cómo se genera el código.
Preguntas sobre el informe
¿Se puede agrupar el informe por más de un campo?
Sí, hasta en tres niveles, como vendedor y después mes. Cada nivel gana su propia franja de grupo.
¿Se puede agrupar por un campo de otra tabla?
Sí, cuando cada registro apunta a un solo ítem de la otra tabla, como la venta y su cliente. Por los pagos de la venta, que son varios, no se puede.
¿Por qué el informe no tiene paginación?
Con paginación, un grupo quedaría cortado a la mitad y el subtotal sumaría solo la parte de la página. En bases grandes, puedes obligar al usuario a filtrar antes de consultar.
Y más
Crea la cuenta, arma una pantalla, descarga el proyecto.
Sin demo agendada ni llamada de descubrimiento. Si el Laravel que sale no pasa la revisión de tu equipo, perdiste una tarde.
- Crea la cuentaBeta abierta, sin tarjeta.
- Arma una pantallaEn el editor visual, en código o pidiéndoselo a la IA.
- Descarga el .zipUn proyecto Laravel que corre donde quieras.