Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
Reservá, reprogramá o cancelá turnos del consultorio. Sincronización con Google Calendar del profesional.
Translation pending
BusinessGitHub @tonyfornsAvailability not checked yetOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗App web de gestión de turnos para un consultorio odontológico: el paciente inicia sesión con Gmail para reservar, completa DNI + fecha de nacimiento, el turno se sincroniza con el Google Calendar del profesional y el paciente puede agregarlo al suyo (enlace Google o archivo .ics). También puede cancelar o reprogramar.
pnpm install
pnpm dev
Abrí http://localhost:3847.
| Ruta | Uso |
|---|---|
/ | Inicio |
/reservar | Pedir turno (requiere login con Gmail) |
/mis-turnos | Login Gmail: cancelar/reprogramar, agregar al calendario |
/consultorio | Agenda, pacientes y fichas (roles staff) |
/admin | Panel administrador: personal y roles (solo admin) |
Datos de ejemplo precargados: DNI 30111222, nacimiento 1990-05-12.
| Capa | Tecnología | Por qué |
|---|---|---|
| App web full-stack | Next.js (App Router) + TypeScript | Una sola base para UI y API; Route Handlers para reservas y sync |
| UI | Tailwind CSS + shadcn/ui | Formularios y paneles rápidos, accesibles y consistentes |
| Validación | Zod | Validar DNI, fechas y payloads en el servidor |
| Fechas | date-fns / date-fns-tz | Franjas horarias en America/Argentina/Buenos_Aires |
| Calendario doctor | Google Calendar API + OAuth2 (refresh token) | Insertar/actualizar/borrar eventos en la cuenta Gmail del profesional |
| Login paciente | Auth.js (NextAuth) + Google | Reserva solo con sesión Gmail; el email lo fija el servidor |
| Calendario paciente | URL “Add to Google Calendar” + .ics | Tras reservar, sumar el evento sin OAuth adicional |
| Persistencia | Postgres (publicado) / JSON local (dev) | Schema: doctors, patients, appointments, clinic_staff |
| Secretos | Variables de entorno | Credenciales Google y DATABASE_URL nunca van al cliente |
/reservar el paciente entra con Gmail (Auth.js). Sin sesión, POST /api/appointments responde 401.doctor_schedule_windows (seed lun–vie 09–12 y 15–18, turnos de 30 min).GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET y GOOGLE_REFRESH_TOKEN, se crea/actualiza/borra el evento; si no, modo mock transparente en la UI..ics./mis-turnos con sesión Gmail; cancelar/reprogramar exige el manageToken del turno./consultorio para roles staff (admin / medico / secretaria) tras login Gmail; pestañas Agenda, Pacientes (alta de ficha) y Horarios./admin solo rol admin — alta/baja de personal en clinic_staff.doctors ← appointments → patients + clinic_staff + doctor_schedule_windows (migrations/002–005).Configurá en el hosting / Cursor Secrets:
AUTH_SECRETAUTH_URL (ej. https://tu-dominio)GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET (login paciente; también sirven AUTH_GOOGLE_ID / AUTH_GOOGLE_SECRET)GOOGLE_REFRESH_TOKEN (calendario del doctor)GOOGLE_CALENDAR_ID (opcional, default primary)DATABASE_URL (Postgres de Supabase; obligatorio en producción)NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY (client helpers)STAFF_MEDICO_EMAIL (opcional: Gmail del médico → rol medico)docs/SUPABASE.mdclinic_staff (admin seed [email protected]; paciente = sin fila)Redirect URI de login paciente: {AUTH_URL}/api/auth/callback/google
http://localhost:3847/api/auth/callback/googlehttps://odontoagenda.vercel.app/api/auth/callback/google (y AUTH_URL=https://odontoagenda.vercel.app).Sin Calendar del doctor, la reserva sigue funcionando (sync en modo demo). Sin Client ID/Secret no se puede iniciar sesión con Gmail.
https://www.googleapis.com/auth/calendar.refresh_token como secreto GOOGLE_REFRESH_TOKEN.pnpm dev — desarrollo (puerto 3847)pnpm build — build de producciónpnpm start — servir build (puerto 3847)pnpm test — tests (Vitest)pnpm seed:volume — carga pacientes/turnos demo (conserva datos reales)docs/CHANGELOG.md