AniLovet logo

Admin - Acceso

Inicia sesión con tu cuenta de Google autorizada

Acceso denegado

Iniciar sesión con Google
AniLovet logo

Panel de administración

Usuarios, dashboard, API y documentación

Conectado como
—

Monitor de sincronizaciones en tiempo real

Se muestran los push de sync (app → backend) en curso y los recientes. La lista se actualiza cada 2 segundos. Los completados se mantienen unos segundos y luego desaparecen.

Pacientes y registros médicos por grupo

Lista de grupos (instituciones) ordenada de mayor a menor cantidad de pacientes. Incluye datos del creador y uso de la app.

Cargando...
Grupo Correo creador Pacientes Registros médicos Acceso Último acceso Aperturas app Versión app Plataforma Auto IA Acciones
Grupo Correo creador Pacientes Registros médicos Acceso Último acceso Aperturas app Versión app Plataforma Auto IA Acciones

Exportar / Importar base de datos completa

Copia de seguridad de todas las tablas (excepto tablas de log: institution_logs, _import_staging_users, hc_change_log). Soporta miles de registros. Útil para restaurar tras un borrado accidental.

⚠️ Advertencia: La importación trunca las tablas presentes en el ZIP y reemplaza sus datos. Asegúrate de que el ZIP es un backup válido generado por «Exportar todo».

Subiendo...

Vaciar tablas

Se listan las tablas que se pueden vaciar por completo. No se muestran users ni subscriptions. Cada acción pide confirmación antes de ejecutar. Usa el botón para refrescar la lista sin recargar la página.

Cargando...
Tabla Filas (aprox.) Acción

Creación de logs

Si deshabilitas la creación de logs, el backend dejará de escribir en institution_logs y ai_usage_logs, lo que ayuda a reducir el espacio en la base de datos del servidor.

Mantenimiento de PostgreSQL

Una base de datos recién creada o con pocos datos puede mostrar varios MB por catálogos del sistema y bloques vacíos. Estas acciones optimizan el uso interno y, en su caso, devuelven espacio al sistema.

VACUUM + ANALYZE: recomendado de forma periódica; no bloquea. REINDEX: reconstruye índices; puede tardar. VACUUM FULL: reescribe tablas y devuelve espacio al SO; bloquea escrituras durante la ejecución.

Mantenimiento: limpiar logs y tablas temporales

Solo se muestran tablas de log y temporales. Vaciar estas tablas libera espacio y optimiza la base de datos sin afectar usuarios, suscripciones ni datos clínicos. Usa el botón para refrescar la lista.

Cargando...
Tabla Descripción Filas Acción

Diagnóstico de conflictos

Revisión de datos que conviene tener en cuenta. No se modifica nada.

Cargando...

Conflictos de Sincronización (Health Cloud)

Gestiona las colisiones de datos generadas cuando varios usuarios editan el mismo registro al mismo tiempo.

Cargando conflictos...
ID Conflicto Entidad Grupo Usuario (Local) Fecha Acción

Pacientes Duplicados

Identifica pacientes duplicados (mismo nombre y nombre de tutor) para unificarlos eliminando el registro extraña. Borrará registros médicos asociados.

Verificando pacientes duplicados...

⚖️ Resolver Conflicto de Sincronización

Seleccionar todos los campos de: Los campos marcados con * difieren — selecciona cuál mantener en cada uno.
Conflicto de versión: El dispositivo envió una versión más antigua que la del servidor, pero el contenido es idéntico. Puedes aplicar la versión del servidor directamente.
Campo 📱 Versión Local (dispositivo) 🖥️ Versión Servidor (actual) Usar en resultado
La versión resultante se aplicará en el servidor y se propagará a todos los dispositivos en el próximo pull.

Explorador de base de datos

Navega la estructura de datos como un explorador de archivos: Base de datos → Grupos de trabajo → Pacientes → Registros médicos → Datos asociados (signos vitales, finanzas, citas).

📁 Base de datos
Selecciona un elemento en el árbol para ver sus detalles.
Cargando...

Rutas API

Rutas disponibles en el backend. Al añadir o cambiar rutas (y su routeDocs en cada router), este listado se actualiza. Usa «Exportar documentación» para copiar un texto listo para usar como prompt con otra IA.

Base URL del servidor:

Cargando rutas...

Configuración App Android

Controla versión mínima, enlace de actualización, mantenimiento y disponibilidad del acceso conectado.

Cargando configuración...
Play Integrity (simbólico): Opciones inactivas. Solo se usa verificación para mostrar en perfil (caché local).
Play Integrity (solo Android): Verifica que la app es auténtica, instalada desde Google Play y se ejecuta en un dispositivo Android genuino.
  • Suscripciones: Si está activo, el backend rechaza la verificación de compras si falta o falla el token.
  • Estado de licencia: Si está activo, el backend rechaza la consulta de acceso (tester, suscripción, etc.) si falta o falla el token.
  • Versiones antiguas: Si está activo, se aceptan requests sin token (apps que no usan Play Integrity API). Si lo desactivas, solo funcionan versiones que envíen el token.
Desactiva solo para pruebas en emulador o sideload. iOS usará App Attest o DeviceCheck en el futuro.

Última actualización: —

Planes de Suscripción

Planes leídos desde Google Play Console. Solo los planes que guardes y marques como "Mostrar en app" se envían a la app para que el usuario pueda suscribirse. Los que no guardes o marques como "Ocultar" no aparecerán en la app.

Cargando planes desde Google Play Console...

🤖 API Keys de IA (Claves Públicas)

Claves compartidas que usa la app cuando el usuario no tiene su propia key. El backend las usa como proxy hacia Groq y Gemini.

Cargando...
Provider Etiqueta Key (masked) Activa Acciones
No hay claves configuradas.

Nueva clave

Modelos

Cargando modelos...
Model ID Label Descripción Acceso Default Activo Acciones
No hay modelos configurados para este proveedor.

Nuevo modelo

📋 Log de uso de IA

Cargando logs...
No hay registros aún. Comenzarán a aparecer cuando los usuarios usen la IA.
Fecha Usuario Provider Modelo Prompt preview Chars Clave Status ms

📒 AniDevel Contabilidad

Registra ingresos (pagos de Google Play, Apple, Stripe, clientes) y gastos (suscripciones, servicios, salario, etc.) para administrar tu negocio.

➕ Registrar ingreso

Últimos ingresos

Cargando...

➖ Registrar gasto

Últimos gastos

Cargando...

💰 Dinero a preparar (próximos gastos)

Para este mes: —
Para Próximo mes: —
Para siguientes meses: —
Total a preparar: —
Cargando...

Tasa USD→BRL para rellenar pagos tester

Se usa al hacer clic en «Rellenar con pagos tester» en el formulario de ingresos.

💰 Configuración financiera (app móvil)

Métodos de pago, categorías de gastos y presets por país. La app consume estos datos vía endpoints públicos con ?lang= para labels traducidos.

ID ES EN FR IT PT Acciones

Agregar método de pago

Solo minúsculas, sin espacios
ID ES EN FR IT PT Impuesto Acciones

Agregar categoría

Código ES EN FR IT PT Impuesto Impuesto anual Moneda Símbolo Preset anual Acciones

Agregar preset país

Opcional. type: percentage_of_profit, percentage_of_income, fixed_amount, tax_brackets. Dejar vacío para sin preset.
Cargando estadísticas...

Usuarios totales

—
En la base de datos

Con suscripción activa

—
Al menos una suscripción activa

Ingresos totales

—
Últimos 12 meses (Stripe + Play, R$)

Ingresos estimados (MRR)

—
Mensual recurrente

Ingresos estimados (ARR)

—
Anual recurrente

Almacenamiento (PostgreSQL)

—
Base de datos (Railway)

Usuarios por versión de app

Usuarios por plataforma

Adquisición de usuarios por mes

Adquisición de usuarios por día (últimos 30 días)

Total de usuarios acumulado por día (últimos 30 días)

Total de usuarios acumulado por mes (último año)

Total de usuarios acumulado por mes (últimos 10 años)

Usuarios y suscripciones activas por país

Ingresos reales por mes

Ingresos reales por día (últimos 30 días)

Suscripciones por tipo de plan

📒 AniDevel Contabilidad

Ingresos y gastos registrados manualmente (Play, Apple, Stripe, clientes, suscripciones, servicios, etc.)

Ingresos totales

—

Gastos totales

—

Balance

—

Balance este mes

—

Dinero a preparar

—
—

Ingresos por mes

Gastos por mes

Ingresos por origen

Gastos por categoría

Filtros:
Cargando...

Estado del webhook RTDN

Verifica si RTDN (Real-time developer notifications) está configurado correctamente. Si está bien configurado, Google enviará notificaciones automáticamente cuando haya compras o cambios en suscripciones.

Comprobar conexión con Google Play

Verifica que el backend tenga credenciales correctas (GOOGLE_APPLICATION_CREDENTIALS o GOOGLE_PLAY_CREDENTIALS_JSON) y que la cuenta de servicio tenga permisos en Play Console.

Buscar suscripciones Play por email

Verifica si un usuario tiene suscripciones Play registradas en la base de datos. Útil para diagnosticar por qué no aparece una suscripción después de comprar.

⚠️ Cómo obtener el Purchase Token

Si la app no llamó al backend automáticamente, necesitas el purchaseToken de tu compra para registrarla manualmente. Opciones:

  1. Desde la app Flutter: Después de comprar, la librería de Play Billing devuelve el purchaseToken. Revisa los logs de la app o añade un print() para mostrarlo.
  2. Desde Google Play Console: Ve a Monetización → Suscripciones → [Tu producto] → Órdenes. Busca tu orden y verás el purchaseToken.
  3. Desde la API de Android Publisher: Si conoces el packageName y subscriptionId, puedes usar la herramienta de prueba de abajo con un token temporal (si tienes acceso a la API).

Nota: Si RTDN está configurado correctamente, Google debería enviar notificaciones automáticamente y no necesitarías hacer esto manualmente.

Probar actualización de suscripción Play

Simula una notificación RTDN de Google Play para verificar que el webhook actualiza correctamente el estado de una suscripción. Necesitas el purchaseToken y productId de una compra real.

Probando webhook...

Importar suscripciones Play (tokens)

Pega un JSON con la lista de compras de Google Play. Cada ítem debe tener purchaseToken y productId; opcionalmente packageName y email. No se duplican registros: si el token ya existe, se actualiza.

Importando...
← Volver a usuarios

Datos de uso

Correos con acceso al grupo

Cargando...

    Diagnóstico detallado

    Usuario con múltiples suscripciones activas

    Opciones: Actualizar desde RevenueCat (consulta RC y actualiza expiry/status), Marcar inactiva (quita estado activo), Eliminar (borra el registro).

    Detalle de registro huérfano

    🗑️ Registros soft-deleted (deleted_at)

    Conteo por tabla. Ver detalles muestra quién eliminó cada registro. Limpiar elimina solo esa tabla. Proceder elimina todas.

    Cargando...
    Total: 0 registro(s)

    Vaciar datos del grupo

    Se eliminarán todos los pacientes, registros médicos, citas, signos vitales, ingresos y servicios de factura de este grupo. La institución, permisos y miembros se conservan.

    El creador del grupo puede sincronizar desde la app para repoblar con datos locales.

    Grupo:

    Para confirmar, escribe exactamente el nombre del grupo:

    Usuarios permitidos

    Máximo 1 usuario(s). Haz clic en Añadir para agregar un correo.

    Editar ingreso

    Modifica los datos del ingreso.

    Tasa USD→BRL:

    Editar gasto

    Modifica los datos del gasto.

    Añadir usuario

    Crea un usuario manualmente en la base de datos.






    Editar usuario

    Modifica los datos del usuario.






    Si se desmarca, el usuario no podrá acceder desde la app móvil.


    Al seleccionar, se establece caducidad = fecha + 1 año



    Importar usuarios

    Selecciona un archivo .sql o pega el SQL con los datos. Si usas el schema alternativo (public.users con columnas google_id, access_count, last_access, etc.), marca la casilla y solo se importarán los campos compatibles.

    o pega el contenido abajo

    (mapeo: email→email, google_id→uid_auth_google, access_count→app_open_count, created_at, last_access→last_login, is_pro→tester, pro_manual_payment_amount→tester_fee_usd)

    Si el usuario ya existe (por email) se omitirá, no se duplicará ni se sobrescribirá.

    Registros a importar: 0

    Pega un array JSON con el schema alternativo. Solo se usan campos compatibles (email, google_id, access_count, created_at, last_access, is_pro→tester, pro_manual_payment_amount→tester_fee_usd). Si el usuario ya existe (por email) se omitirá.

    Vista previa de importación

    Cantidad de registros que se importarán

    Campos que se tendrán en cuenta (origen → destino). Usuarios ya existentes (por email) se omiten:

    Campo origen Campo destino

    Importando 0 / 0…