/** * API endpoint para obtener IDs de empleados presentes * Consulta la tabla Asistencias del proyecto facturador en Supabase via Metabase API * Un empleado está "presente" si su última asistencia tiene entrada pero NO tiene salida */ interface MetabaseResponse { data: { cols: Array<{ name: string }> rows: Array> } } export default defineEventHandler(async (event): Promise => { const config = useRuntimeConfig() const headers = getRequestHeaders(event) // Verificar autenticación const uid = headers['x-authentik-uid'] if (!uid) { throw createError({ statusCode: 401, message: 'Usuario no autenticado' }) } // Obtener configuración de Metabase const metabaseUrl = config.metabaseApiUrl as string const metabaseApiKey = config.metabaseApiKey as string const databaseId = config.metabaseDatabaseId as number if (!metabaseApiKey) { throw createError({ statusCode: 500, message: 'API Key de Metabase no configurada' }) } // Query nativa para obtener empleados presentes // Busca la última asistencia de cada empleado donde salida es NULL const nativeQuery = ` WITH ultima_asistencia AS ( SELECT empleado_id, entrada, salida, ROW_NUMBER() OVER (PARTITION BY empleado_id ORDER BY entrada DESC) as rn FROM asistencias WHERE entrada IS NOT NULL ) SELECT empleado_id FROM ultima_asistencia WHERE rn = 1 AND salida IS NULL ` const metabaseQuery = { database: databaseId, type: 'native', native: { query: nativeQuery } } try { const response = await $fetch(`${metabaseUrl}/api/dataset`, { method: 'POST', headers: { 'X-API-Key': metabaseApiKey, 'Content-Type': 'application/json' }, body: metabaseQuery }) // Extraer los IDs de empleados presentes const presentIds: number[] = response.data.rows.map(row => row[0] as number) return presentIds } catch (error: unknown) { console.error('Error al obtener empleados presentes de Metabase:', error) const err = error as { statusCode?: number; message?: string } throw createError({ statusCode: err.statusCode || 500, message: err.message || 'Error al obtener empleados presentes' }) } })