Agregar filtro Solo Presentes y reorganizar filtros
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
This commit is contained in:
2025-12-05 12:17:15 -06:00
parent 39a01d351b
commit eb5fa191c1
4 changed files with 139 additions and 6 deletions

View File

@@ -0,0 +1,86 @@
/**
* 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'
})
}
})