Dashboard
Mapa de Entidades por País
Buscar Entidades
| Código | Compañía | Región | Tipo | País | Contactos | Oportunidades | Acciones |
|---|
Gestión de Entidades
Gestión de Contactos
Gestión de Oportunidades
Gestión de Documentos
Gestión de Países
Importar Datos
Haz clic para seleccionar un archivo Excel (.xlsx)
El archivo debe contener las hojas: Pais, Entidades, Contactos, Oportunidades, Documentos
Guía IT / Implementación
Resumen Ejecutivo
GNL CRM es una aplicación web de gestión comercial para Gas Natural Licuado, construida como Single Page Application (SPA) con las siguientes tecnologías:
- Backend: Node.js + Express 5.x (API REST)
- Base de datos: SQLite 3 con better-sqlite3 v12 (modo WAL)
- Frontend: HTML5 + CSS3 + JavaScript vanilla (sin frameworks)
- Mapas: Leaflet.js 1.9 con teselas OpenStreetMap (mapa mundial interactivo en dashboard)
- Autenticación: Sesiones HTTP con express-session (almacenadas en memoria)
Requisitos del Servidor
| Requisito | Mínimo | Recomendado |
|---|---|---|
| Node.js | 18.x LTS | 20.x LTS |
| RAM | 512 MB | 1 GB |
| Disco | 100 MB | 500 MB |
| Sistema Operativo | Windows / Linux / macOS | Ubuntu 22.04 LTS |
| Puerto | 3000 (configurable) | 443 con HTTPS |
Pasos de Despliegue
# 1. Clonar el repositorio git clone <repositorio> gnl-crm cd gnl-crm # 2. Instalar dependencias npm install # 3. Arrancar el servidor node server.js # → Servidor escuchando en http://localhost:3000
El servidor crea automáticamente la base de datos SQLite y el usuario admin por defecto en el primer arranque.
Integración en Ecosistema Microsoft
Azure App Service
Despliegue recomendado en la nube de Microsoft. Plan B1 o superior. Compatible con despliegue continuo desde GitHub/Azure DevOps.
Azure SQL
Migración opcional de SQLite a SQL Server / Azure SQL para entornos de producción con alta concurrencia. El esquema es compatible con mínimas adaptaciones.
Power BI
Conexión directa a la base de datos (SQLite vía ODBC o Azure SQL nativo) para crear dashboards avanzados con KPIs comerciales, mapas geográficos y análisis de pipeline.
Power Apps
Posibilidad de consumir la API REST del CRM desde Power Apps para crear interfaces móviles personalizadas para comerciales en campo.
Power Automate
Automatización de flujos de trabajo:
- Alertas automáticas de expiración de NDA
- Notificaciones de nuevas oportunidades
- Seguimiento periódico de contactos
- Generación automática de informes semanales
Microsoft 365
Integración con Outlook para envío de correos desde el CRM y con Teams para notificaciones de canal sobre actividad comercial.
Plan de Despliegue Recomendado
| Fase | Acción | Descripción |
|---|---|---|
| Fase 1 | Azure App Service | Desplegar la app Node.js con SQLite en App Service. Funcional inmediato. |
| Fase 2 | Azure SQL | Migrar de SQLite a Azure SQL para escalabilidad y backups automáticos. |
| Fase 3 | Power BI + Power Automate | Conectar dashboards de BI y automatizar flujos de negocio. |
Seguridad y Mantenimiento
- Contraseñas: Almacenadas en texto plano — se recomienda añadir bcrypt antes del despliegue en producción
- Sesiones: Gestionadas en memoria del servidor (se pierden al reiniciar)
- CORS: Habilitado globalmente (
cors()) — restringir a dominio propio en producción - Backups: Copiar el fichero
crm.dbperiódicamente (también se generacrm.db.backupautomáticamente) - Actualizaciones:
npm auditperiódico para vulnerabilidades - Logs: Salida estándar (stdout), se recomienda PM2 o similar para producción
Guía de Usuario
Acceso al Sistema
Accede a la aplicación desde tu navegador introduciendo la URL proporcionada por el equipo IT. Introduce tu usuario y contraseña en la pantalla de login.
| Rol | Permisos |
|---|---|
| Admin | Acceso completo: gestión de datos, importación, usuarios y todas las funciones |
| Comercial | Acceso a datos comerciales: entidades, contactos, oportunidades, documentos, búsqueda y dashboard |
Dashboard
La pantalla principal muestra un resumen visual del CRM:
- Tarjetas resumen: Número total de entidades, contactos, oportunidades, documentos y países. Haz clic en cualquier tarjeta para ir directamente a su gestión.
- Mapa mundial interactivo: Muestra la distribución geográfica de las entidades. Cada círculo representa un país; su tamaño es proporcional al número de entidades. Pasa el ratón sobre un círculo para ver el detalle y haz clic para buscar las entidades de ese país. Los códigos de país siguen el estándar ISO 3166-1 alpha-3 (ESP, USA, IND…). El territorio virtual LNG no aparece en el mapa al no tener coordenadas geográficas.
- Gráficos de barras: Entidades por región, por tipo, oportunidades por timing y contactos por probabilidad. Haz clic en una barra para filtrar la tabla por ese valor.
Buscar Entidades
El buscador global permite encontrar entidades por nombre, código, región, tipo o país. Escribe en el campo de búsqueda y los resultados se filtran en tiempo real.
Desde los resultados, pulsa "Ver" para acceder al detalle completo de la entidad con sus contactos, oportunidades y documentos asociados.
Gestión de Tablas (CRUD)
Cada tabla de gestión (Entidades, Contactos, Oportunidades, Documentos, Países) ofrece las mismas operaciones:
| Acción | Cómo | Descripción |
|---|---|---|
| Alta | Botón "Nuevo..." | Abre un formulario modal para crear un registro nuevo |
| Edición | Botón | Abre el formulario con los datos actuales para modificar |
| Baja | Botón | Elimina el registro previa confirmación |
| Filtrado | Campo "Filtrar..." | Filtra los registros visibles en tiempo real |
| Exportar CSV | Botón "Exportar CSV" | Descarga los datos visibles (filtrados o todos) en formato CSV |
Detalle de Entidad
Al hacer clic en "Ver" desde la búsqueda o la tabla de entidades, se muestra la ficha completa de la entidad con:
- Datos generales: Región, país, códigos fiscales, dirección, comentarios
- Botón Editar: Permite modificar los campos directamente en la ficha
- Pestañas: Contactos, Oportunidades y Documentos asociados
- Desde cada pestaña puedes añadir, editar o eliminar registros vinculados a esa entidad
Importación Excel
Permite cargar datos masivamente desde un archivo Excel (.xlsx). El archivo debe contener las siguientes hojas con sus columnas correspondientes:
| Hoja | Descripción |
|---|---|
| Pais | Catálogo de países con código, nombre, región |
| Entidades | Empresas/organizaciones con datos corporativos |
| Contactos | Personas de contacto vinculadas a entidades |
| Oportunidades | Oportunidades comerciales vinculadas a entidades |
| Documentos | Documentación legal (KYC, NDA, MSPA) por entidad |
Asistente IA
El botón en la esquina inferior derecha abre el asistente de inteligencia artificial, que consulta datos reales de la base de datos. Tipos de consulta soportados:
- Por país: "India", "Brasil" — muestra entidades y oportunidades del país
- Documentos: "NDA", "documentos" — estado de documentación legal
- Oportunidades: "pipeline", "oportunidades" — resumen del pipeline comercial
- Próximos pasos: "acciones", "próximos pasos" — acciones pendientes
- Contactos: "seguimiento", "contactos" — estado de contactos
- Resumen: "dashboard", "resumen" — resumen ejecutivo global
Gestión de Usuarios Solo Admin
Los administradores pueden crear nuevos usuarios desde el menú "Usuarios". Cada usuario tiene: nombre de usuario, contraseña, nombre visible y rol (admin o user).
Diseño de Base de Datos
Tecnología
- Motor: SQLite 3 mediante la librería
better-sqlite3(síncrona, rápida) - Modo WAL: Activado para mejor rendimiento en lecturas concurrentes
- Foreign Keys: Habilitadas (
PRAGMA foreign_keys = ON) - Archivo:
crm.dben la raíz del proyecto
Diagrama de Relaciones
┌─────────┐ ┌──────────────┐ ┌─────────────┐
│ Pais │──1:N──│ Entidades │──1:N──│ Contactos │
└─────────┘ │ │ └─────────────┘
│ │──1:N──┌─────────────────┐
│ │ │ Oportunidades │
│ │ └─────────────────┘
│ │──1:N──┌──────────────┐
└──────────────┘ │ Documentos │
└──────────────┘
┌────────────┐
│ Usuarios │ (tabla independiente)
└────────────┘
Tabla: Pais
| Columna | Tipo | Clave | Descripción |
|---|---|---|---|
| CodigoPaisNormalizado | TEXT | PK | Código ISO 3166-1 alpha-3 del país (ej: ESP, USA, IND). Usado como FK en Entidades y como clave del mapa interactivo. |
| Nombre | TEXT | Nombre del país | |
| Region | TEXT | Región geográfica | |
| ReferenciaIndice | TEXT | Índice de referencia | |
| LinkFichaPais | TEXT | Enlace a ficha del país | |
| PersonaReferenciaOportun | TEXT | Persona de referencia | |
| Comentarios | TEXT | Comentarios |
Tabla: Entidades
| Columna | Tipo | Clave | Descripción |
|---|---|---|---|
| CodigoEntidad | TEXT | PK | Código único de la entidad |
| Compania | TEXT | Nombre de la compañía | |
| Region | TEXT | Región | |
| Tipo | TEXT | Tipo (Matriz/Filial) | |
| CodigoPaisNormalizado | TEXT | FK → Pais | País de la entidad |
| FiscalCode | TEXT | Código fiscal | |
| LEI | TEXT | Legal Entity Identifier | |
| Ticker | TEXT | Ticker bursátil | |
| DunsNumber | TEXT | Número DUNS | |
| Direccion | TEXT | Dirección | |
| Comentarios | TEXT | Comentarios |
Tabla: Contactos
| Columna | Tipo | Clave | Descripción |
|---|---|---|---|
| id | INTEGER | PK (auto) | ID interno |
| CodigoContacto | TEXT | UNIQUE | Código auto-generado CON-XXXXX |
| CodigoEntidad | TEXT | FK → Entidades | Entidad asociada |
| Nombre | TEXT | Nombre completo | |
| Cargo | TEXT | Cargo en la empresa | |
| TEXT | Correo electrónico | ||
| Telefono1 | TEXT | Teléfono principal | |
| Telefono2 | TEXT | Teléfono secundario | |
| Via | TEXT | Vía de contacto | |
| FechaUltimoContacto | TEXT | Última fecha de contacto | |
| DemorarContactoAfecha | TEXT | Fecha para demorar contacto | |
| ProbabilidadExito | TEXT | Muy Alta / Alta / Media / Baja | |
| TEXT | Perfil de LinkedIn | ||
| Comentarios | TEXT | Comentarios |
Tabla: Oportunidades
| Columna | Tipo | Clave | Descripción |
|---|---|---|---|
| id | INTEGER | PK (auto) | ID interno |
| CodigoOportunidad | TEXT | UNIQUE | Código auto-generado OPO-XXXXX |
| CodigoEntidad | TEXT | FK → Entidades | Entidad asociada |
| Contraparte | TEXT | Nombre de contraparte | |
| OwnerAccount | TEXT | Responsable de la cuenta | |
| Entrega | TEXT | Tipo de entrega | |
| Periodo | TEXT | Periodo | |
| Volumen | TEXT | Volumen | |
| Precio | TEXT | Precio | |
| SpecsContrapartePCS | TEXT | Especificaciones PCS | |
| ProximosPasosNTGY | TEXT | Próximos pasos NTGY | |
| ProximosPasosContraparte | TEXT | Próximos pasos contraparte | |
| Timing | TEXT | Inmediato / Medio plazo / Largo plazo | |
| Origen | TEXT | Origen de la oportunidad | |
| Comentarios | TEXT | Comentarios |
Tabla: Documentos
| Columna | Tipo | Clave | Descripción |
|---|---|---|---|
| id | INTEGER | PK (auto) | ID interno |
| CodigoDocumento | TEXT | UNIQUE | Código auto-generado DOC-XXXXX |
| CodigoEntidad | TEXT | FK → Entidades | Entidad asociada |
| KYC_S_N | TEXT | KYC completado (Sí/No) | |
| KYC_link | TEXT | Enlace al documento KYC | |
| NDA_S_N | TEXT | NDA firmado (Sí/No) | |
| FechaExpiracionNDA | TEXT | Fecha de expiración del NDA | |
| NDALink | TEXT | Enlace al NDA | |
| MSPASN | TEXT | MSPA completado (Sí/No) | |
| LinkMSPA | TEXT | Enlace al MSPA | |
| Comentarios | TEXT | Comentarios |
Tabla: Usuarios
| Columna | Tipo | Clave | Descripción |
|---|---|---|---|
| id | INTEGER | PK (auto) | ID interno |
| username | TEXT | UNIQUE | Nombre de usuario para login |
| password | TEXT | Hash bcrypt de la contraseña | |
| nombre | TEXT | Nombre visible | |
| rol | TEXT | admin / user |
Migraciones Automáticas
Los códigos de contactos, oportunidades y documentos se generan automáticamente al crear registros sin código:
| Tabla | Formato | Ejemplo |
|---|---|---|
| Contactos | CON-XXXXX | CON-00001 |
| Oportunidades | OPO-XXXXX | OPO-00001 |
| Documentos | DOC-XXXXX | DOC-00001 |
API REST — Endpoints
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/login | Iniciar sesión |
| POST | /api/logout | Cerrar sesión |
| GET | /api/me | Usuario actual (sesión) |
| GET | /api/mi-perfil | Perfil del usuario |
| PUT | /api/mi-perfil | Cambiar contraseña |
| GET | /api/dashboard | Estadísticas del dashboard |
| GET | /api/search?q=... | Búsqueda global de entidades |
| GET | /api/entidades | Listar entidades |
| GET | /api/entidades/:id | Obtener entidad |
| GET | /api/entidades/:id/detail | Detalle completo (con contactos, oportunidades, docs) |
| POST | /api/entidades | Crear entidad |
| PUT | /api/entidades/:id | Actualizar entidad |
| DELETE | /api/entidades/:id | Eliminar entidad |
| GET | /api/contactos | Listar contactos |
| POST | /api/contactos | Crear contacto |
| PUT | /api/contactos/:id | Actualizar contacto |
| DELETE | /api/contactos/:id | Eliminar contacto |
| GET | /api/oportunidades | Listar oportunidades |
| POST | /api/oportunidades | Crear oportunidad |
| PUT | /api/oportunidades/:id | Actualizar oportunidad |
| DELETE | /api/oportunidades/:id | Eliminar oportunidad |
| GET | /api/documentos | Listar documentos |
| POST | /api/documentos | Crear documento |
| PUT | /api/documentos/:id | Actualizar documento |
| DELETE | /api/documentos/:id | Eliminar documento |
| GET | /api/paises | Listar países |
| POST | /api/paises | Crear país |
| PUT | /api/paises/:id | Actualizar país |
| DELETE | /api/paises/:id | Eliminar país |
| GET | /api/usuarios | Listar usuarios (admin) |
| POST | /api/usuarios | Crear usuario (admin) |
| POST | /api/import | Importar Excel |
| POST | /api/ai/chat | Consulta al asistente IA |
Dependencias npm
| Paquete | Versión | Uso |
|---|---|---|
| express | ^5.x | Framework web / API REST |
| better-sqlite3 | ^12.x | Driver SQLite síncrono |
| express-session | ^1.x | Gestión de sesiones HTTP |
| cors | ^2.x | Cabeceras CORS para peticiones cross-origin |
| multer | ^2.x | Upload de archivos (import Excel) |
| xlsx | ^0.18.x | Lectura de archivos Excel |
Presentación
Pulsa "Iniciar Presentación" para ver la presentación a pantalla completa. Usa las flechas ← → o los botones para navegar.
GNL CRM
Gestor Comercial de Gas Natural Licuado
Solución integral para la gestión de relaciones comerciales en el mercado internacional de GNL
Problema / Necesidad
Datos dispersos
Información comercial repartida en múltiples hojas Excel sin conexión entre sí
Seguimiento manual
Control de contactos, NDAs y oportunidades basado en memoria y correos
Sin visibilidad
Falta de dashboards y métricas en tiempo real del pipeline comercial
Sin colaboración
Dificultad para compartir estado y progreso entre miembros del equipo
Solución Propuesta
Una aplicación web centralizada que reúne toda la información comercial en un único punto de acceso, accesible desde cualquier navegador.
Funcionalidades Clave
CRUD completo de empresas con datos corporativos, fiscales y geográficos
Control de personas clave con probabilidad de éxito y fechas de seguimiento
Tracking de ofertas con volumen, precio, timing y próximos pasos
Estado de KYC, NDA y MSPA con alertas de expiración
Visualización en tiempo real con gráficos interactivos
Consultas en lenguaje natural sobre datos del CRM
Arquitectura Técnica
Frontend
HTML5 + CSS3 + JS Vanilla (SPA)
Backend
Node.js + Express.js
Base de Datos
SQLite 3 (WAL mode)
Ventajas del Sistema
Ligero y rápido
Sin dependencias pesadas. Arranca en segundos con un solo comando.
Cero infraestructura
SQLite embebido, sin necesidad de servidor de BBDD externo.
Listo para Azure
Compatible con Azure App Service, Azure SQL, Power BI y Power Automate.
Importación Excel
Migración instantánea desde los ficheros Excel actuales del equipo.
Seguro
Autenticación con bcrypt, roles diferenciados admin/user.
IA integrada
Consultas inteligentes sobre los datos sin salir de la aplicación.
Inconvenientes / Limitaciones
SQLite en producción
SQLite no soporta escrituras concurrentes masivas. Para >50 usuarios simultáneos se recomienda migrar a Azure SQL.
Sesiones en memoria
Las sesiones se pierden al reiniciar el servidor. Para producción se recomienda Redis o almacenamiento persistente.
Responsive limitado
Diseño optimizado para escritorio. La experiencia móvil es funcional pero no está completamente pulida.
Sin notificaciones push
No envía alertas automáticas (ej. NDA expirando). Requiere integración con Power Automate.
Próximos Pasos / Roadmap
Puesta en marcha con SQLite para equipo reducido
Escalabilidad, backups automáticos, alta disponibilidad
Dashboards avanzados y automatización de flujos
Outlook, Teams y Power Apps para movilidad
¡Gracias!