CallMedik

CallMedik es un sistema full-stack para la gestión de citas médicas, pacientes, expedientes clínicos y cuerpo médico. Fue desarrollado con NestJS en el backend y con React, Vite y TypeScript en el frontend, y se ha pensado tanto para quienes necesitan una base sólida sobre la cual construir como para clínicas que requieren un panel interno ordenado y agradable de usar.

El código está organizado de forma modular, de manera que cada parte del sistema puede ser entendida y modificada sin tocar el resto. Para trabajar de manera local se utiliza SQLite, y cuando llega el momento de pasar a producción la base de datos puede ser cambiada a PostgreSQL en pocos minutos.

📷 Capturas de Pantalla

✨ Características Principales

📊 Panel de Control Clínico

Las citas del día, los pacientes registrados, los doctores activos y el estado de las consultas son mostrados en una sola vista. La información se actualiza conforme se registran movimientos, por lo que el panel refleja siempre la situación real de la clínica.

📅 Agenda de Citas Médicas

Las citas son programadas y consultadas desde una agenda que admite filtros por fecha, doctor, paciente, estado de la cita y estado del pago.

  • Estados de la cita: Pendiente, Aplicada, No asistió y Cancelada.
  • Estados del pago: Pendiente, Pagado y Anulado.

Gracias a esta separación, una cita puede ser aplicada aunque su pago siga pendiente, o ser cancelada con el pago ya anulado, tal como ocurre en la práctica diaria de un consultorio.

🩺 Ficha Clínica y Pacientes

Cada paciente cuenta con su propia ficha, donde son registrados los datos personales, las enfermedades previas, las alergias conocidas y los medicamentos prescritos. El historial de consultas queda asociado a la misma ficha, así que todo lo relacionado con el paciente puede ser revisado desde un único lugar.

👨‍⚕️ Directorio Médico y Especialidades

Los doctores son registrados y asignados a su especialidad correspondiente. Las especialidades funcionan como un catálogo propio, que puede ser ampliado cuando la clínica incorpora nuevas áreas.

⚙️ Ajustes del Sistema

Los parámetros generales de la clínica, como el título del sistema y el correo del administrador, se configuran desde un módulo dedicado y no requieren cambios en el código.

🎨 Temas Claro y Oscuro

La interfaz puede alternar entre un modo claro y un modo oscuro con estética Glassmorphism. La preferencia elegida es guardada en el navegador, por lo que se conserva en la siguiente visita.

🔒 Seguridad

El acceso es controlado mediante JSON Web Tokens (JWT) y las contraseñas son almacenadas con hash Bcrypt, de modo que nunca se guardan en texto plano. Cada usuario cuenta además con un módulo de perfil donde su información personal y sus credenciales pueden ser actualizadas.

🛠️ Especificaciones Técnicas

  • Backend: NestJS, un framework de Node.js escrito en TypeScript.
  • Frontend: React con Vite y TypeScript.
  • ORM: Prisma, que permite acceder a los datos con tipado seguro.
  • Base de datos: SQLite para el desarrollo local y PostgreSQL para producción.

📦 Instalación para Desarrolladores

1. Instalar dependencias

Los paquetes de Node deben ser instalados en las dos carpetas por separado:

bash

# Backend
cd backend
npm install

# Frontend
cd ../frontend
npm install

2. Variables de entorno

En la carpeta backend/ se encuentra el archivo .env, donde se define la configuración del sistema. Al ser un archivo oculto, puede ser necesario activar la vista de archivos ocultos en el editor.

env

# Conexión a la base de datos (SQLite por defecto)
DATABASE_URL="file:./dev.db"

# Clave usada para firmar los tokens JWT
JWT_SECRET="secretKey"

# Puerto del backend
PORT=3001

La clave JWT_SECRET de ejemplo debe ser reemplazada por una propia antes de publicar el sistema en producción.

Con el archivo listo, el esquema es sincronizado con la base de datos:

bash

cd backend
npx prisma db push

3. Ejecutar el proyecto

Se abren dos terminales para levantar ambos servicios:

bash

# Terminal 1: backend
cd backend
npm run start:dev

# Terminal 2: frontend
cd frontend
npm run dev

El frontend queda disponible en http://localhost:5173 y el backend en http://localhost:3001.

🗄️ Esquemas de Base de Datos

El proyecto incluye esquemas preparados para distintos motores:

  • schema.mysql.sql: esquema original adaptado a MySQL, con las 8 tablas del sistema.
  • schema.sql: esquema estándar para PostgreSQL, con claves foráneas, índices y datos iniciales.
  • backend/prisma/schema.prisma: esquema de Prisma configurado para SQLite y que puede ser cambiado a PostgreSQL.

Las tablas son nombradas en singular y en snake_case: user, pacient, category, medic, status, payment, reservation y setting. Las claves foráneas siguen la misma convención (pacient_id, medic_id, user_id, category_id, status_id y payment_id), lo que facilita su mapeo a cualquier base de datos relacional.

🚀 Migración a PostgreSQL

Para pasar a producción con Prisma, los cambios necesarios son pocos:

  1. En backend/prisma/schema.prisma, el provider es cambiado de "sqlite" a "postgresql".
  2. La variable DATABASE_URL del archivo .env es actualizada con la cadena de conexión:

env

   DATABASE_URL="postgresql://usuario:password@localhost:5432/callmedik?schema=public"
  1. Los cambios son aplicados en el servidor de destino:

bash

   npx prisma db push

📥 Descargar CallMedik

El código fuente completo de CallMedik puede ser descargado para ser instalado, adaptado y puesto en marcha en cualquier clínica o consultorio.