All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 57s
- Reorganizar filtros (ID, Teléfono, Empleados, Presentes) en una fila con wrap - Agregar checkbox 'Presentes' basado en tabla Asistencias de Supabase - Crear endpoint /api/contacts/presentes que consulta última asistencia sin salida - Integrar filtro de presentes en useContacts con carga lazy
87 lines
2.3 KiB
TypeScript
87 lines
2.3 KiB
TypeScript
/**
|
|
* 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<Array<unknown>>
|
|
}
|
|
}
|
|
|
|
export default defineEventHandler(async (event): Promise<number[]> => {
|
|
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<MetabaseResponse>(`${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'
|
|
})
|
|
}
|
|
})
|