En un proyecto real no siempre necesitas construir un dashboard para obtener información útil.
A veces una consulta SQL bien hecha puede darte la respuesta en minutos. En este caso necesitábamos responder una pregunta concreta dentro de RapiTaller:
¿La tienda Baterías Panasonic está registrando clientes y mantenimientos?
Para resolverlo usamos Claude + PostgreSQL + consultas SQL.
El problema
La tarea estaba registrada en nuestro grupo interno de WhatsApp. Necesitábamos saber:
- qué talleres y tiendas tenían actividad;
- cuántos mantenimientos habían registrado;
- qué clientes estaban asociados;
- comparar Panasonic con otros negocios.
Crear una nueva pantalla dentro del panel solo para responder esto habría tomado mucho más tiempo.
La solución rápida fue consultar directamente la base de datos.
1. Ver talleres y tiendas con actividad
Primero necesitábamos una vista general. Esta consulta lista talleres y tiendas y muestra cuántos mantenimientos tienen registrados.
SELECT *
FROM (
SELECT
'taller' AS tipo,
w.id,
w.store_name,
COUNT(m.id) AS total_mantenimientos,
CASE
WHEN COUNT(m.id) > 0 THEN 'SI'
ELSE 'NO'
END AS tiene_mantenimientos
FROM workshops w
LEFT JOIN locations l
ON l.locationable_id = w.id
AND l.locationable_type = 'workshop'
LEFT JOIN maintenances m
ON m.location_id = l.id
GROUP BY w.id, w.store_name
UNION ALL
SELECT
'tienda' AS tipo,
c.id,
c.store_name,
COUNT(m.id) AS total_mantenimientos,
CASE
WHEN COUNT(m.id) > 0 THEN 'SI'
ELSE 'NO'
END AS tiene_mantenimientos
FROM comerces c
LEFT JOIN locations l
ON l.locationable_id = c.id
AND l.locationable_type = 'commerce'
LEFT JOIN maintenances m
ON m.location_id = l.id
GROUP BY c.id, c.store_name
) AS negocios
ORDER BY total_mantenimientos DESC;Con esta consulta podemos identificar rápidamente qué negocios están utilizando realmente la aplicación.
2. Ver los clientes registrados por cada negocio
Después necesitábamos bajar al detalle. No bastaba con saber que existían registros. Queríamos conocer:
- cliente;
- correo;
- teléfono;
- vehículo;
- placa;
- mantenimiento;
- fecha del registro.
SELECT
COALESCE(w.id, c.id) AS negocio_id,
l.locationable_type AS tipo,
COALESCE(w.store_name, c.store_name) AS nombre_negocio,
l.id AS location_id,
l.name AS nombre_sede,
o.id AS owner_id,
u.name AS nombre_cliente,
u.email AS email_cliente,
o.phone AS telefono_cliente,
v.id AS vehicle_id,
v.license_plate AS placa,
m.id AS maintenance_id,
m.type AS tipo_mantenimiento,
m.title,
m.description,
m.it_changed_pieces,
m.pieces_changed,
m.it_changed_oil,
m.current_mileage,
m.created_at AS fecha_mantenimiento
FROM maintenances m
JOIN locations l
ON l.id = m.location_id
JOIN vehicles v
ON v.id = m.vehicle_id
JOIN owners o
ON o.id = v.owner_id
JOIN users u
ON u.id = o.user_id
LEFT JOIN workshops w
ON w.id = l.locationable_id
AND l.locationable_type = 'workshop'
LEFT JOIN comerces c
ON c.id = l.locationable_id
AND l.locationable_type = 'commerce'
ORDER BY negocio_id, m.created_at DESC;También podemos filtrar directamente por negocio:
WHERE COALESCE(w.id, c.id) = 314Así evitamos revisar manualmente cientos de registros.
Resultado del análisis
El reporte permitió encontrar rápidamente una diferencia importante.
Baterías Panasonic prácticamente no estaba registrando nuevos clientes, mientras que otros negocios, como Reparo al Toque, tenían varios registros.
Ese dato ya puede ser útil para:
- marketing;
- seguimiento comercial;
- soporte;
- gerencia;
- capacitación de negocios;
- detectar usuarios que no están aprovechando la plataforma.
Y todo salió directamente desde la base de datos.
¿Por qué usar Claude para este tipo de tareas?
Claude no reemplaza entender la base de datos.
Pero ayuda bastante cuando ya conoces:
- las tablas;
- las relaciones;
- el objetivo del reporte.
Puedes explicarle algo como:
Necesito identificar qué talleres tienen clientes registrados y cuántos mantenimientos realizó cada uno.
Luego puedes revisar, corregir y ejecutar el SQL generado.
Eso reduce bastante el tiempo necesario para construir consultas largas.
Video: así hice el reporte
En el video muestro el proceso real:
- revisar el requerimiento;
- buscar la tienda dentro de RapiTaller;
- usar Claude desde la terminal;
- generar las consultas SQL;
- revisar los resultados;
- preparar información para las personas encargadas de tomar decisiones.
SQL primero, dashboard después
Esta es la parte más importante. No todos los reportes necesitan inmediatamente:
Frontend
+
Backend
+
Endpoints
+
Filtros
+
Gráficos
+
Permisos
+
Dashboard
Si primero necesitas validar si una información realmente aporta valor, una consulta SQL puede ser suficiente.
El flujo puede ser:
Pregunta del negocio
↓
Consulta SQL
↓
Reporte
↓
Validar utilidad
↓
Automatizar
↓
Dashboard
Así evitas desarrollar funciones que quizás nadie termine utilizando.
Una posible mejora para el panel
Una idea futura sería agregar dentro del panel administrativo una herramienta interna para ejecutar consultas de lectura.
Algo similar a Adminer, pero mucho más limitado.
Por seguridad debería trabajar con:
- usuario PostgreSQL exclusivo para reportes;
- permisos únicamente de lectura;
- solo operaciones
SELECT; - límites de filas;
- timeout de consultas;
- registro de consultas ejecutadas;
- acceso únicamente para administradores autorizados.
Nunca expondría un usuario con permisos de UPDATE,
DELETE, DROP o escritura general.
Para producción, incluso sería mejor trabajar con reportes predefinidos o consultas parametrizadas antes que permitir SQL arbitrario.
Conclusión
Claude + SQL puede convertirse en una herramienta muy práctica para analizar una aplicación real.
En este caso conseguimos responder rápidamente:
- quién está usando la plataforma;
- cuántos registros tiene cada negocio;
- qué clientes están asociados;
- qué negocios necesitan seguimiento.
Antes de construir un dashboard completo, muchas veces vale la pena empezar por algo mucho más simple:
hacer la pregunta correcta y consultar directamente los datos.
Autor: Anibal Copitan ( Contactar con Anibal Copitan )





No hay comentarios:
Publicar un comentario