Recordatorios de vacunación para clínica veterinaria
Translation pending
HealthTypeScript · CSSGitHub @UniverzooOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
UNIVERZOO · Sistema de Recordatorios de Vacunación Sistema web para la clínica veterinaria UNIVERZOO: registra propietarios, mascotas y vacunaciones, y envía recordatorios automáticos por WhatsApp usando una fecha de próxima vacunación ingresada manualmente (nunca calculada por el sistema).Read the full README ↗
Sistema web para la clínica veterinaria UNIVERZOO: registra propietarios, mascotas y vacunaciones, y envía recordatorios automáticos por WhatsApp usando una fecha de próxima vacunación ingresada manualmente (nunca calculada por el sistema).
Decisiones tomadas y por qué:
@prisma/adapter-neon + ws, configurado en src/lib/db.ts) para poder
usar transacciones — la variante HTTP del driver de Neon no las soporta y
algunas operaciones de Prisma (como upsert) las requieren internamente.
El CLI de Prisma (migraciones) usa la conexión directa
(DATABASE_URL_UNPOOLED) en vez de la pooled, porque las operaciones de
esquema no son compatibles con el pooler (pgbouncer).next-auth
(todavía en beta) para no depender de una librería que podría no estar
alineada con la versión de Next. La sesión es un JWT firmado (jose) en una
cookie httpOnly + secure en producción, verificado en src/proxy.ts
(el archivo que reemplazó a middleware.ts desde Next.js 16).proxy.ts) como dentro de cada Server Action
(defensa en profundidad).scripts/run-reminders.ts),
pensado para ejecutarse vía cron / Programador de tareas de Windows, no
depende de que alguien tenga el navegador abierto. También existe un Route
Handler (/api/cron/reminders, protegido con CRON_SECRET) para
integrarlo con schedulers HTTP externos si se despliega en un host serverless.fetch, sin
automatización no oficial ni WhatsApp Web. Las credenciales viven únicamente
en variables de entorno del servidor (src/lib/whatsapp.ts), nunca en el
frontend.#F78620 / marrón
#4D403A, extraída del logo) definida como tokens en src/app/globals.css.npm install
npm run db:migrate # aplica prisma/migrations contra DATABASE_URL_UNPOOLED
npm run db:seed # usuario admin + catálogo de vacunas + plantillas
npm run dev
Por defecto el seed crea el usuario [email protected] / Univerzoo2026!
(cambiala apenas entres). Podés fijar tus propias credenciales iniciales con
SEED_ADMIN_EMAIL y SEED_ADMIN_PASSWORD. Para incluir además datos de
ejemplo (propietario/mascota ficticios, solo útil en desarrollo local), corré
el seed con SEED_DEMO_DATA=true.
El proyecto está desplegado en Vercel, con Postgres provisto por la
integración Neon del propio dashboard de Vercel (Storage → Create Database).
Pasos completos en DEPLOY.md.
Cambiar esta contraseña / crear usuarios reales antes de usar en producción
desde Usuarios (solo Administrador).
.env)Ver .env.example. Las más importantes:
DATABASE_URL: cadena de conexión (file:./dev.db en desarrollo).AUTH_SECRET: secreto para firmar las sesiones. Cambiar en producción.CRON_SECRET: secreto para invocar /api/cron/reminders por HTTP.WHATSAPP_ACCESS_TOKEN, WHATSAPP_PHONE_NUMBER_ID,
WHATSAPP_BUSINESS_ACCOUNT_ID, WHATSAPP_VERIFY_TOKEN: credenciales de
WhatsApp Business Platform (Meta). Sin estas variables, el sistema sigue
funcionando: genera y registra los recordatorios pendientes, pero cada envío
queda marcado como Error: Integración de WhatsApp no configurada, visible
en Mensajes.npm run reminders:run
Programarlo en el sistema operativo:
npm.cmd con argumentos run reminders:run, directorio de inicio la carpeta
del proyecto, frecuencia diaria.0 8 * * * cd /ruta/al/proyecto && npm run reminders:run.POST /api/cron/reminders con header Authorization: Bearer <CRON_SECRET>.Las plantillas (Configuración → Plantillas de WhatsApp) definen el texto
interno (para el registro/auditoría) y el nombre exacto de la plantilla
aprobada en WhatsApp Business Manager — WhatsApp exige plantillas
pre-aprobadas para mensajes iniciados por el negocio, así que ese nombre debe
coincidir con lo dado de alta en Meta.
Funciones explícitamente fuera del MVP (dejadas preparadas en la arquitectura para el futuro, sin construir): agenda de turnos, historia clínica, facturación, farmacia, portal del propietario, chat automatizado, múltiples sucursales.
prisma/schema.prisma Modelo de datos completo (11 tablas)
prisma/seed.ts Datos iniciales (admin, catálogo, ejemplo)
scripts/run-reminders.ts Motor de recordatorios como proceso standalone
src/lib/ Lógica de negocio (auth, whatsapp, reminders, status...)
src/app/(app)/ Páginas protegidas (dashboard, propietarios, mascotas...)
src/app/login/ Login (público)
src/app/api/ Webhook de WhatsApp, cron HTTP, exportación CSV
src/proxy.ts Protección de rutas (reemplaza a middleware.ts en Next 16)