Este es un backend robusto y completo para un sistema de CRM (Customer Relationship Management), construido con las mejores prácticas de desarrollo web modernas. El proyecto está diseñado para funcionar de manera local con Docker Compose o conectarse a una base de datos PostgreSQL remota (como Supabase) en producción.
- Arquitectura MVC / Componentes: Organización limpia en controladores, modelos, rutas y middlewares usando módulos de ECMAScript modernos (
import/export). - Seguridad Robusta:
- Protección de cabeceras HTTP mediante Helmet.js.
- Habilitación de CORS para peticiones externas.
- Encriptación de contraseñas con Bcrypt.js integrada en los ganchos (hooks) del modelo de Sequelize.
- Autenticación mediante JWT (JSON Web Tokens) con tiempo de expiración configurable.
- Control de Acceso basado en Roles (RBAC):
- Tres roles integrados:
admin,manager, ysales_rep. - Lógica de privacidad: Los
sales_repsolo pueden ver, crear y modificar sus propios leads, compañías, contactos, negocios y tareas asignadas. Losadminymanagerpueden ver todo y reasignar registros.
- Tres roles integrados:
- Módulos del CRM:
- Users & Auth: Registro, Login, verificación de perfil (/me).
- Companies: Gestión de cuentas de empresas con campos de ingresos anuales, industria y cantidad de empleados.
- Contacts: Personas asociadas a las empresas.
- Leads: Gestión de prospectos con control de origen de lead (referral, website, etc.) y estado.
- Deals (Pipeline de Ventas): Control de oportunidades comerciales por etapas (Prospecting, Negotiation, etc.) con asignación de probabilidades automática y fecha estimada de cierre.
- Activities: Registro de interacciones como llamadas telefónicas, correos electrónicos, reuniones y notas vinculadas a leads, contactos o negocios.
- Tasks: Tareas y recordatorios de seguimiento con prioridad, fecha de vencimiento y estado.
- Conversión Transaccional de Leads (Premium):
- Proceso atómico utilizando transacciones SQL (
sequelize.transaction). Cuando un lead es calificado (Qualified), el sistema crea automáticamente su Compañía, el Contacto correspondiente y un Deal de venta opcional, migrando todo su historial de actividades y tareas sin perder integridad.
- Proceso atómico utilizando transacciones SQL (
- Módulo de Reportes & Analíticas:
- Resumen del pipeline de ventas (Embudo de deals y monto total en dólares por etapa).
- Rendimiento del equipo de ventas (ranking de representantes por monto facturado/ganado).
- Tasa de conversión de leads (leads calificados vs leads totales).
- Documentación Interactiva (Swagger):
- Toda la API está documentada usando la especificación OpenAPI 3.0 y se sirve mediante Swagger UI para que puedas probarla directamente desde el navegador.
- Docker y Docker Compose (recomendado para entorno de desarrollo local).
- Node.js 18+ (si se desea correr localmente sin contenedores).
Esta opción levantará tanto la base de datos PostgreSQL como la aplicación backend. Se ejecutará el script init.sql para pre-poblar la base de datos con datos semilla de forma automática.
- Asegúrate de tener Docker abierto.
- Levanta los contenedores ejecutando en tu terminal:
docker-compose up -d --build
- La base de datos estará corriendo en el puerto
5432y el servidor Express en el puerto5000.
Si prefieres ejecutar el servidor Node directamente en tu sistema:
- Instala las dependencias:
npm install
- Asegúrate de tener una base de datos PostgreSQL activa y configura las credenciales en un archivo
.enven la raíz del proyecto (puedes copiar el archivo.env.example):cp .env.example .env
- Ejecuta las migraciones/sincronización y arranca el servidor:
npm run dev
Una vez que el servidor esté en ejecución, puedes explorar e interactuar de forma gráfica con todos los endpoints de la API (con autenticación, conversión de prospectos y reportes analíticos) desde tu navegador:
🔗 URL de Swagger UI: http://localhost:5000/api-docs
Tip
Cómo probar endpoints protegidos en Swagger UI:
- Haz clic en el endpoint
POST /api/auth/loginy presiona Try it out. - Inicia sesión con el usuario semilla (ej:
admin@crm.comy claveadmin123) y copia eltokendevuelto en la respuesta. - Sube al inicio de la página y presiona el botón Authorize (botón de candado).
- Pega el token copiado en el campo de texto y haz clic en Authorize. Ahora todas las llamadas que realices incluirán la cabecera
Authorizationcorrecta.
El proyecto incluye un script de prueba de extremo a extremo (test-api.js) que simula el comportamiento de un cliente consumiendo la API de manera automatizada.
Para correr el script de prueba:
- Asegúrate de que el servidor esté corriendo en
http://localhost:5000(ya sea por docker o localmente). - Ejecuta:
node test-api.js
- El script realizará de forma secuencial:
- Verificación de salud de la API (
/health). - Inicio de sesión con el administrador semilla.
- Creación de una Compañía y su Contacto.
- Creación de un Lead de prueba.
- Conversión automática y atómica del Lead a Contacto + Compañía + Negocio en curso.
- Creación de tareas.
- Generación y consulta de los reportes analíticos del pipeline, conversión e ingresos.
- Verificación de salud de la API (
CRM/
├── docker-compose.yml # Orquestación de contenedores (db, app)
├── Dockerfile # Configuración del contenedor Node.js
├── init.sql # Definición de tablas iniciales e inserciones semilla
├── package.json # Dependencias del proyecto
├── test-api.js # Script de prueba e integración automatizada
├── src/
│ ├── app.js # Express app, middlewares de seguridad (helmet, cors), enrutamiento
│ ├── server.js # Punto de entrada con retry para la conexión a la base de datos
│ ├── config/
│ │ └── database.js # Conexión Sequelize con soporte SSL para producción/Supabase
│ ├── middlewares/
│ │ ├── auth.js # Protección de JWT y control de roles (RBAC)
│ │ └── errorHandler.js # Formateador centralizado de excepciones (incluyendo validaciones de Sequelize)
│ ├── models/ # Definición de esquemas de Sequelize
│ │ ├── index.js # Configuración global de relaciones
│ │ ├── User.js
│ │ ├── Company.js
│ │ ├── Contact.js
│ │ ├── Lead.js
│ │ ├── Deal.js
│ │ ├── Activity.js
│ │ └── Task.js
│ ├── controllers/ # Lógica de negocio (CRUDs, conversiones y reportes)
│ └── routes/ # Mapeo de rutas
Al levantar el proyecto, se habrán creado los siguientes usuarios con contraseñas por defecto para que puedas interactuar de inmediato:
| Nombre | Contraseña | Rol | |
|---|---|---|---|
| Admin User | admin@crm.com |
admin123 |
admin |
| Sales Manager | manager@crm.com |
manager123 |
manager |
| Sales Rep 1 | rep1@crm.com |
sales123 |
sales_rep |