# US-BI-008: Integracion con Power BI y Tableau **Epica:** MAI-006 - Reportes y Business Intelligence **Sprint:** 22 **Story Points:** 8 **Prioridad:** Media **Asignado a:** Backend + Data Engineering --- ## Historia de Usuario **Como** Data Analyst (Analista de Datos) **Quiero** conectar herramientas de BI como Power BI y Tableau a los datos del sistema **Para** crear analisis avanzados y dashboards personalizados con herramientas especializadas --- ## Criterios de Aceptacion ### 1. API REST para Extraccion de Datos - [ ] Sistema expone API REST documentada para extraccion de datos - [ ] La API incluye endpoints para todas las entidades principales: - Proyectos y metadata - Presupuestos y costos - Avances de obra - Compras e inventarios - Recursos humanos y asistencias - Estimaciones y facturacion - [ ] Cada endpoint soporta: - Filtros por fecha, proyecto, estado - Paginacion (limit/offset) - Ordenamiento - Seleccion de campos (sparse fieldsets) - Formato JSON ### 2. Conector ODBC/JDBC - [ ] Sistema proporciona driver ODBC para Windows - [ ] Sistema proporciona driver JDBC para herramientas Java - [ ] Los drivers permiten: - Conexion segura con credenciales - Queries SQL directas sobre vistas - Acceso a datos en tiempo real - Soporte para todas las tablas principales - [ ] Documentacion de instalacion y configuracion ### 3. Vistas SQL Optimizadas para BI - [ ] Base de datos incluye vistas SQL predefinidas para BI: - `vw_bi_projects_summary` - Resumen de proyectos - `vw_bi_budget_vs_actual` - Presupuesto vs real - `vw_bi_cost_breakdown` - Desglose de costos - `vw_bi_progress_timeline` - Avances en el tiempo - `vw_bi_purchase_analysis` - Analisis de compras - `vw_bi_labor_productivity` - Productividad de MO - `vw_bi_cashflow_projection` - Proyeccion de flujo - `vw_bi_kpis_consolidated` - KPIs consolidados - [ ] Las vistas estan optimizadas (indices, materializadas si aplica) - [ ] Cada vista incluye documentacion de campos ### 4. Sincronizacion Incremental - [ ] Sistema soporta sincronizacion incremental de datos: - Solo extrae registros nuevos o modificados - Usa campo `updated_at` para detectar cambios - Reduce tiempo de sincronizacion en 90% - [ ] API incluye endpoints para sync incremental: - `GET /api/bi/sync/projects?since=2025-11-01` - `GET /api/bi/sync/costs?since=2025-11-01` - [ ] Soporte para cambios eliminados (soft deletes) ### 5. Refresh Automatico Programado - [ ] Puedo configurar refresh automatico de datos en Power BI/Tableau - [ ] Sistema soporta webhooks para notificar cambios: - Webhook cuando hay nuevos avances - Webhook cuando se actualizan costos - Webhook cuando se crea nueva estimacion - [ ] Las herramientas BI pueden suscribirse a webhooks - [ ] Documentacion de configuracion de refresh ### 6. Data Lake / Data Warehouse (Opcional) - [ ] Sistema puede exportar datos a Data Lake: - Soporte para AWS S3 - Soporte para Azure Blob Storage - Soporte para Google Cloud Storage - [ ] Exportacion en formatos: - Parquet (columnar, optimizado) - CSV (compatible) - JSON (flexible) - [ ] Exportacion puede ser: - Full snapshot (todo) - Incremental (solo cambios) - Programada (diaria, semanal) ### 7. Autenticacion y Seguridad - [ ] Conexiones BI usan autenticacion segura: - API Keys con permisos especificos - OAuth 2.0 para Power BI/Tableau - Tokens JWT con expiracion - [ ] Los usuarios BI solo ven datos que tienen permiso de ver - [ ] Se aplican Row-Level Security (RLS) segun usuario - [ ] Todas las conexiones son HTTPS/TLS - [ ] Se registran auditorias de acceso a datos ### 8. Templates Pre-Configurados - [ ] Sistema incluye templates listos para usar: - **Power BI:** Dashboard Ejecutivo (.pbix) - **Power BI:** Analisis Financiero (.pbix) - **Tableau:** Project Portfolio (.twb) - **Tableau:** Cost Analysis (.twb) - [ ] Los templates incluyen: - Conexion pre-configurada (solo cambiar credenciales) - Visualizaciones predefinidas - Calculos DAX/LOD ya creados - Filtros y slicers configurados - [ ] Templates son descargables desde el sistema ### 9. Documentacion y Modelo de Datos - [ ] Sistema proporciona documentacion completa: - Diccionario de datos (todas las tablas y campos) - Diagrama ER (Entity-Relationship) - Modelo dimensional (Star Schema si aplica) - Ejemplos de queries SQL comunes - Guias de conexion paso a paso - [ ] Documentacion accesible online - [ ] Incluye casos de uso y mejores practicas ### 10. Monitoreo de Integraciones - [ ] Puedo ver dashboard de integraciones BI activas: - Cuantas conexiones activas hay - Ultimo acceso de cada conexion - Volumenes de datos extraidos - Errores de conexion recientes - Usuarios que usan integracion - [ ] Recibo alertas si: - Una integracion falla repetidamente - Uso de datos excede limites - Credenciales estan por expirar - [ ] Puedo revocar credenciales de BI en cualquier momento --- ## Mockup / Wireframe ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ 🔌 Integraciones con Power BI y Tableau │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─ Metodos de Conexion ────────────────────────────────────────────────────┐│ │ │ ││ │ │ Seleccione el metodo de integracion que desea configurar: ││ │ │ ││ │ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ││ │ │ │ 🔗 API REST │ │ 🗄️ ODBC/JDBC │ │ 📦 Data Export │ ││ │ │ │ │ │ │ │ │ ││ │ │ │ Extraccion via │ │ Conexion │ │ Exportacion a │ ││ │ │ │ endpoints HTTP │ │ directa SQL │ │ Cloud Storage │ ││ │ │ │ │ │ │ │ │ ││ │ │ │ [Configurar →] │ │ [Configurar →] │ │ [Configurar →] │ ││ │ │ └────────────────┘ └────────────────┘ └────────────────┘ ││ │ └───────────────────────────────────────────────────────────────────────────┘│ │ │ │ ┌─ Configuracion API REST ──────────────────────────────────────────────────┐│ │ │ ││ │ │ 1️⃣ Generar Credenciales ││ │ │ ││ │ │ Nombre de la conexion: [Power BI - Dashboard Ejecutivo_____________] ││ │ │ ││ │ │ Permisos: [✓] Proyectos [✓] Presupuestos [✓] Avances ││ │ │ [✓] Costos [ ] Compras [ ] RRHH ││ │ │ ││ │ │ Expiracion: (●) 1 año ( ) 6 meses ( ) 3 meses ( ) Sin expiracion ││ │ │ ││ │ │ [🔑 Generar API Key] ││ │ │ ││ │ │ ✅ API Key generada exitosamente: ││ │ │ ││ │ │ ┌──────────────────────────────────────────────────────────────────┐ ││ │ │ │ API_KEY: YOUR_API_KEY_HERE_EXAMPLE_PLACEHOLDER │ ││ │ │ │ [📋 Copy]│ ││ │ │ └──────────────────────────────────────────────────────────────────┘ ││ │ │ ││ │ │ ⚠️ Guarde esta clave en lugar seguro. No se volvera a mostrar. ││ │ │ ││ │ │ 2️⃣ Endpoints Disponibles ││ │ │ ││ │ │ Base URL: https://api.empresa.com/v1 ││ │ │ ││ │ │ ┌──────────────────────────────────────────────────────────────────┐ ││ │ │ │ Proyectos: │ ││ │ │ │ GET /api/bi/projects Lista todos los proyectos │ ││ │ │ │ GET /api/bi/projects/{id} Detalle de proyecto │ ││ │ │ │ GET /api/bi/projects/summary Resumen consolidado │ ││ │ │ │ │ ││ │ │ │ Presupuestos: │ ││ │ │ │ GET /api/bi/budgets Lista presupuestos │ ││ │ │ │ GET /api/bi/budgets/vs-actual Presupuesto vs Real │ ││ │ │ │ GET /api/bi/cost-breakdown Desglose de costos │ ││ │ │ │ │ ││ │ │ │ Avances: │ ││ │ │ │ GET /api/bi/progress Avances de obra │ ││ │ │ │ GET /api/bi/progress/timeline Linea de tiempo │ ││ │ │ │ │ ││ │ │ │ [📚 Ver Documentacion Completa →] │ ││ │ │ └──────────────────────────────────────────────────────────────────┘ ││ │ │ ││ │ │ 3️⃣ Ejemplo de Uso en Power BI ││ │ │ ││ │ │ ┌──────────────────────────────────────────────────────────────────┐ ││ │ │ │ 1. Abrir Power BI Desktop │ ││ │ │ │ 2. Obtener Datos → Web │ ││ │ │ │ 3. URL: https://api.empresa.com/v1/api/bi/projects │ ││ │ │ │ 4. Avanzado → Agregar header: │ ││ │ │ │ Authorization: Bearer sk_live_abc123... │ ││ │ │ │ 5. Conectar → Transformar datos │ ││ │ │ │ │ ││ │ │ │ [📥 Descargar Template Power BI] │ ││ │ │ └──────────────────────────────────────────────────────────────────┘ ││ │ └───────────────────────────────────────────────────────────────────────────┘│ │ │ │ ┌─ Templates Pre-Configurados ──────────────────────────────────────────────┐│ │ │ ││ │ │ Descargue templates listos para usar: ││ │ │ ││ │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ││ │ │ │ 📊 Power BI │ │ 📊 Power BI │ │ 📈 Tableau │ ││ │ │ │ Dashboard │ │ Analisis │ │ Project │ ││ │ │ │ Ejecutivo │ │ Financiero │ │ Portfolio │ ││ │ │ │ │ │ │ │ │ ││ │ │ │ Incluye: │ │ Incluye: │ │ Incluye: │ ││ │ │ │ • 12 Visuals │ │ • 8 Visuals │ │ • 10 Sheets │ ││ │ │ │ • KPIs Corp. │ │ • P&L Analysis │ │ • Gantt View │ ││ │ │ │ • Mapas │ │ • Margins │ │ • Cost Trend │ ││ │ │ │ │ │ • ROI │ │ • Resource │ ││ │ │ │ │ │ │ │ │ ││ │ │ │ [📥 Download] │ │ [📥 Download] │ │ [📥 Download] │ ││ │ │ │ .pbix (5.2 MB) │ │ .pbix (3.8 MB) │ │ .twb (2.1 MB) │ ││ │ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ ││ │ └───────────────────────────────────────────────────────────────────────────┘│ │ │ │ ┌─ Conexiones Activas ──────────────────────────────────────────────────────┐│ │ │ ││ │ │ ┌─────────────────────────────────────────────────────────────────────┐ ││ │ │ │Nombre │Tipo │Usuario │Ultimo Acceso │Estado│Accion│ ││ │ │ ├─────────────────────────────────────────────────────────────────────┤ ││ │ │ │Power BI - Dashboard │API REST│jperez │Hace 5 min │🟢 OK │[🗑️] │ ││ │ │ │Tableau - Finanzas │ODBC │mgarcia │Hace 2 horas │🟢 OK │[🗑️] │ ││ │ │ │Data Export - S3 │Export │sistema │Diario 06:00 │🟢 OK │[⚙️] │ ││ │ │ └─────────────────────────────────────────────────────────────────────┘ ││ │ │ ││ │ │ Conexiones activas: 3 | Datos extraidos hoy: 245 MB ││ │ └───────────────────────────────────────────────────────────────────────────┘│ │ │ │ ┌─ Documentacion y Recursos ────────────────────────────────────────────────┐│ │ │ ││ │ │ 📖 [Documentacion API REST] Referencia completa de endpoints ││ │ │ 📊 [Diccionario de Datos] Descripcion de todas las tablas ││ │ │ 🗺️ [Diagrama ER] Modelo de datos visual ││ │ │ 💡 [Guia Power BI] Paso a paso para conexion ││ │ │ 📈 [Guia Tableau] Paso a paso para conexion ││ │ │ 🔐 [Seguridad y Permisos] Mejores practicas ││ │ │ ❓ [FAQ] Preguntas frecuentes ││ │ └───────────────────────────────────────────────────────────────────────────┘│ │ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## Flujo de Trabajo ``` 1. CONFIGURAR INTEGRACION POWER BI ↓ Usuario (Data Analyst) → Integraciones BI ↓ Selecciona "API REST" ↓ Completa formulario: - Nombre: "Power BI - Dashboard Ejecutivo" - Permisos: Proyectos, Presupuestos, Avances, Costos - Expiracion: 1 año ↓ Hace clic en [Generar API Key] ↓ Sistema: - Genera API Key segura - Almacena hash en BD - Registra permisos - Muestra clave (solo una vez) ↓ Usuario copia API Key 2. CONECTAR POWER BI ↓ Usuario abre Power BI Desktop ↓ Obtener Datos → Web ↓ URL: https://api.empresa.com/v1/api/bi/projects ↓ Avanzado → Agregar header HTTP: - Nombre: Authorization - Valor: Bearer sk_live_abc123... ↓ Conectar ↓ Power BI hace request: GET /api/bi/projects Headers: { Authorization: "Bearer sk_live_abc..." } ↓ Sistema valida: - API Key es valida - No esta expirada - Tiene permisos para "proyectos" ↓ Sistema responde con JSON: { "data": [ { "id": 1, "name": "Los Pinos", "budget": 45200000, ... }, { "id": 2, "name": "Vertical Reforma", "budget": 38500000, ... } ], "pagination": { "total": 18, "page": 1, "limit": 100 } } ↓ Power BI parsea JSON y crea tabla ↓ Usuario transforma datos en Power Query ↓ Crea visualizaciones 3. DESCARGAR Y USAR TEMPLATE ↓ Usuario hace clic en [Descargar Template Power BI] ↓ Sistema genera archivo .pbix con: - Conexion pre-configurada (sin API Key) - 12 visualizaciones listas - Medidas DAX calculadas - Relaciones entre tablas ↓ Usuario descarga archivo ↓ Abre en Power BI Desktop ↓ Sistema pide credenciales (API Key) ↓ Usuario ingresa su API Key ↓ Template se conecta y carga datos ↓ Dashboard listo para usar 4. CONFIGURAR REFRESH AUTOMATICO ↓ Usuario publica dashboard a Power BI Service ↓ En Power BI Service → Dataset → Settings ↓ Configura Scheduled Refresh: - Frecuencia: Diaria - Hora: 06:00 AM ↓ Power BI Service ejecuta refresh: - Hace requests a API con API Key - Descarga datos actualizados - Actualiza dataset - Actualiza dashboards ↓ Usuarios ven datos frescos cada mañana 5. USAR CONECTOR ODBC (TABLEAU) ↓ Usuario descarga driver ODBC del sistema ↓ Instala driver en Windows ↓ Configura DSN (Data Source Name): - Server: db.empresa.com - Port: 5432 - Database: erp_production - Username: bi_user - Password: [generada por sistema] ↓ Abre Tableau Desktop ↓ Connect → Other Databases (ODBC) ↓ Selecciona DSN configurado ↓ Tableau se conecta via ODBC ↓ Usuario ve lista de vistas disponibles: - vw_bi_projects_summary - vw_bi_budget_vs_actual - vw_bi_cost_breakdown ↓ Arrastra vistas a canvas ↓ Crea visualizaciones 6. MONITOREAR INTEGRACIONES ↓ Admin → Integraciones BI → Conexiones Activas ↓ Ve tabla con 3 conexiones activas ↓ Identifica conexion "Power BI - Dashboard" - Ultimo acceso: Hace 5 min - Estado: OK - Datos extraidos hoy: 125 MB ↓ Sistema registra cada request: - Timestamp - Endpoint accedido - Usuario/API Key - Volumenes de datos ↓ Admin puede revocar API Key si es necesario ``` --- ## Notas Tecnicas ### API REST para BI ```typescript // Middleware de autenticacion para BI async function authenticateBIRequest(req: Request, res: Response, next: NextFunction) { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).json({ error: 'Missing API Key' }); } const apiKey = authHeader.substring(7); // Remover "Bearer " // Validar API Key const hashedKey = hashApiKey(apiKey); const credential = await db.biCredentials.findOne({ where: { apiKeyHash: hashedKey, isActive: true } }); if (!credential) { return res.status(401).json({ error: 'Invalid API Key' }); } // Verificar expiracion if (credential.expiresAt && new Date() > credential.expiresAt) { return res.status(401).json({ error: 'API Key expired' }); } // Registrar acceso await db.biAccessLog.create({ credentialId: credential.id, endpoint: req.path, method: req.method, ipAddress: req.ip, timestamp: new Date() }); // Agregar permisos al request req.biPermissions = credential.permissions; req.userId = credential.userId; next(); } // Middleware de permisos function requireBIPermission(resource: string) { return (req: Request, res: Response, next: NextFunction) => { if (!req.biPermissions.includes(resource)) { return res.status(403).json({ error: `Permission denied for resource: ${resource}` }); } next(); }; } // Endpoints BI const router = express.Router(); // Proyectos router.get('/api/bi/projects', authenticateBIRequest, requireBIPermission('projects'), async (req, res) => { const { page = 1, limit = 100, since } = req.query; let query = db.projects.findAll({ limit: parseInt(limit), offset: (parseInt(page) - 1) * parseInt(limit), order: [['updatedAt', 'DESC']] }); // Sync incremental if (since) { query = query.where('updatedAt', '>=', new Date(since)); } const projects = await query; const total = await db.projects.count(); res.json({ data: projects, pagination: { total, page: parseInt(page), limit: parseInt(limit), pages: Math.ceil(total / parseInt(limit)) } }); } ); // Presupuesto vs Real router.get('/api/bi/budgets/vs-actual', authenticateBIRequest, requireBIPermission('budgets'), async (req, res) => { const data = await db.query(` SELECT p.id, p.name, p.budget_total, SUM(c.amount) as actual_cost, (SUM(c.amount) - p.budget_total) as variance, ((SUM(c.amount) - p.budget_total) / p.budget_total * 100) as variance_pct FROM projects p LEFT JOIN costs c ON c.project_id = p.id GROUP BY p.id, p.name, p.budget_total `); res.json({ data }); } ); // Muchos mas endpoints... ``` ### Vistas SQL para BI ```sql -- Vista: Resumen de Proyectos CREATE OR REPLACE VIEW vw_bi_projects_summary AS SELECT p.id, p.code, p.name, p.type, p.region, p.status, p.start_date, p.end_date, p.budget_total, p.contract_amount, COALESCE(c.total_cost, 0) as actual_cost, COALESCE(a.progress_percentage, 0) as progress, COALESCE(c.total_cost - p.budget_total, 0) as cost_variance, COALESCE((c.total_cost - p.budget_total) / p.budget_total * 100, 0) as cost_variance_pct, COALESCE((p.contract_amount - c.total_cost) / p.contract_amount * 100, 0) as margin_pct, CASE WHEN c.total_cost > p.budget_total * 1.10 THEN 'HIGH' WHEN c.total_cost > p.budget_total * 1.05 THEN 'MEDIUM' ELSE 'LOW' END as risk_level, p.created_at, p.updated_at FROM projects p LEFT JOIN ( SELECT project_id, SUM(amount) as total_cost FROM costs GROUP BY project_id ) c ON c.project_id = p.id LEFT JOIN ( SELECT project_id, MAX(progress_percentage) as progress_percentage FROM progress_reports GROUP BY project_id ) a ON a.project_id = p.id; -- Vista: Presupuesto vs Real (Desglosado) CREATE OR REPLACE VIEW vw_bi_budget_vs_actual AS SELECT bi.id, bi.project_id, p.name as project_name, bi.item_code, bi.item_name, bi.category, bi.budgeted_quantity, bi.budgeted_unit_price, bi.budgeted_amount, COALESCE(actual.quantity, 0) as actual_quantity, COALESCE(actual.amount, 0) as actual_amount, COALESCE(actual.amount - bi.budgeted_amount, 0) as variance, COALESCE((actual.amount - bi.budgeted_amount) / bi.budgeted_amount * 100, 0) as variance_pct FROM budget_items bi JOIN projects p ON p.id = bi.project_id LEFT JOIN ( SELECT budget_item_id, SUM(quantity) as quantity, SUM(amount) as amount FROM cost_transactions GROUP BY budget_item_id ) actual ON actual.budget_item_id = bi.id; -- Vista: Timeline de Avances CREATE OR REPLACE VIEW vw_bi_progress_timeline AS SELECT pr.id, pr.project_id, p.name as project_name, pr.report_date, pr.progress_percentage, pr.progress_amount, pr.status, LAG(pr.progress_percentage) OVER ( PARTITION BY pr.project_id ORDER BY pr.report_date ) as previous_progress, pr.progress_percentage - LAG(pr.progress_percentage) OVER ( PARTITION BY pr.project_id ORDER BY pr.report_date ) as progress_increment FROM progress_reports pr JOIN projects p ON p.id = pr.project_id ORDER BY pr.project_id, pr.report_date; -- Indices para optimizar vistas CREATE INDEX idx_costs_project_id ON costs(project_id); CREATE INDEX idx_progress_reports_project_id ON progress_reports(project_id); CREATE INDEX idx_budget_items_project_id ON budget_items(project_id); CREATE INDEX idx_projects_updated_at ON projects(updated_at); ``` ### Conector ODBC ```ini ; Archivo de configuracion ODBC (odbc.ini) [ERP_BI_Connection] Description=ERP System BI Connection Driver=PostgreSQL Unicode Server=db.empresa.com Port=5432 Database=erp_production Username=bi_user Password=******** ReadOnly=Yes Protocol=7.4 FetchBufferSize=100 ; Configuracion de seguridad SSLMode=require UseServerSidePrepare=1 ``` ### Endpoints Necesarios ```typescript // Credenciales BI POST /api/bi-credentials // Generar API Key GET /api/bi-credentials // Listar mis credenciales DELETE /api/bi-credentials/:id // Revocar API Key // Extraccion de datos GET /api/bi/projects // Proyectos GET /api/bi/projects/:id // Proyecto especifico GET /api/bi/projects/summary // Resumen GET /api/bi/budgets // Presupuestos GET /api/bi/budgets/vs-actual // Presup vs Real GET /api/bi/costs // Costos GET /api/bi/cost-breakdown // Desglose costos GET /api/bi/progress // Avances GET /api/bi/progress/timeline // Timeline avances GET /api/bi/kpis // KPIs consolidados // Sync incremental GET /api/bi/sync/projects?since=date // Proyectos modificados GET /api/bi/sync/costs?since=date // Costos modificados // Webhooks POST /api/bi/webhooks // Registrar webhook DELETE /api/bi/webhooks/:id // Eliminar webhook // Templates GET /api/bi/templates // Listar templates GET /api/bi/templates/:id/download // Descargar template // Monitoreo GET /api/bi/connections // Conexiones activas GET /api/bi/access-log // Log de accesos GET /api/bi/usage-stats // Estadisticas de uso // Documentacion GET /api/bi/docs // Documentacion API GET /api/bi/schema // Modelo de datos ``` --- ## Definicion de "Done" - [ ] API REST completa con 20+ endpoints para BI - [ ] Documentacion de API con Swagger/OpenAPI - [ ] Driver ODBC para Windows instalable - [ ] Driver JDBC para herramientas Java - [ ] 8 vistas SQL optimizadas para BI - [ ] Soporte para sincronizacion incremental - [ ] Sistema de API Keys con permisos granulares - [ ] Autenticacion OAuth 2.0 implementada - [ ] Row-Level Security aplicada - [ ] 4 templates pre-configurados (2 Power BI, 2 Tableau) - [ ] Webhooks para notificaciones de cambios - [ ] Exportacion a S3/Azure/GCS funcional - [ ] Dashboard de monitoreo de integraciones - [ ] Diccionario de datos completo - [ ] Diagrama ER documentado - [ ] Guias de conexion para Power BI y Tableau - [ ] Tests de endpoints de BI - [ ] Performance: endpoints responden en <1s - [ ] Validado con Data Analysts --- **Estimacion:** 8 Story Points **Dependencias:** Requiere todos los modulos del sistema **Fecha:** 2025-11-18