Documento vivo del estado del proyecto, errores resueltos y trabajo pendiente.
- Autenticacion JWT con sesion persistente (localStorage)
- CRUD Pacientes con busqueda, ordenamiento y paginacion
- Historias Clinicas con N°HCLX unico por paciente
- Consultas con odontograma, signos vitales, diagnostico
- Odontograma interactivo (SVG, 52 piezas dentales, 5 superficies por pieza)
- Recetas con medicamentos, dosis, frecuencia, duracion
- Tratamientos con plan, presupuesto, abonos
- Pagos con comprobantes y seguimiento
- Necesidades odontologicas por paciente
- Imagenes adjuntas a consultas
- PDF Historia Clinica con N°HCLX por consulta
- Importar/Exportar datos (Excel/CSV) + backup SQLite completo
- WhatsApp envio de mensajes y PDFs adjuntos
- Dashboard con metricas basicas
- Sesion Clinica wizard de 7 pasos
- Estacion de Datos unified import/export
- Configuracion del sistema
Stack:
- Frontend: React 18 + Vite
- Backend: Node.js + Express + SQLite (better-sqlite3)
- Desktop: Electron 35
- PDF: pdfkit (directo) + puppeteer-core (WhatsApp)
- WhatsApp: whatsapp-web.js 1.34.7
Metricas v1.0.0:
- Backend: 5,770 lineas JS (15 controllers, 15 routes, 11 PDF templates)
- Frontend: 7,214 lineas JSX (21 componentes)
- Electron: 1,643 lineas JS (8 archivos)
- CSS: 5,493 lineas en App.css
- Build con electron-builder (
--dirpara portable) - asarUnpack completo de
node_modules/yelectron/ - postbuild hook (
scripts/copy-portable.js) - Iniciar Clinica Dental Pro.bat con:
- Auto-elevacion a administrador
- Verificacion de VC++ Redist, Chrome, Node.js, espacio
- Instalacion automatica via
wingetcon--silent
- VERIFICAR.bat read-only (diagnostico sin instalar)
- README.txt documentacion para usuario final
- 3 paquetes generados:
.7z— 255 MB (recomendado).rar— 262 MB.exeSFX — 262 MB (autoextrae, sin instalar WinRAR)
Verificado end-to-end en PC de desarrollo y otra PC:
- WhatsApp conecta y recibe mensajes
- Multiples ready events confirmados
- QR scan funciona
Sintoma: Cliente se conecta pero appState.hasSynced nunca se emite.
Causa: Race condition entre appState.hasSynced (que ya es true cuando el evento se dispara por primera vez) y el listener change:hasSynced (que solo se activa en cambios).
Fix (en node_modules/whatsapp-web.js/src/Client.js, lineas 404-416):
// ANTES del listener
if (appState.hasSynced) {
window.onAppStateHasSyncedEvent();
}
// Listener para cambios futuros
appState.on('change:hasSynced', (_AppState, hasSynced) => {
if (hasSynced) {
window.onAppStateHasSyncedEvent();
}
});Issue referenciado: whatsapp-web.js #5754
Verificado: log muestra UNPAIRED → OPENING → PAIRING → UNPAIRED_IDLE → ready al escanear QR.
Mantenimiento: Patch via patch-package en patches/whatsapp-web.js+1.34.7.patch. Se aplica automaticamente en npm install via postinstall.
Sintoma: Al ejecutar la app portable, runner falla con este error al cargar puppeteer.
Causa: asarUnpack no incluia @puppeteer/browsers (dep transitiva de puppeteer).
Fix:
- Agregado
@puppeteer/browsers ^2.10.0adependenciesenpackage.json - Expandido asarUnpack a
**/node_modules/**
Resuelto: confirmado en log del runner.
Sintoma: Despues de fix #2, el runner falla con error similar para otras deps transitivas.
Causa: deps transitivas de @puppeteer/browsers (semver) y proxy-agent (agent-base) tampoco estaban en asar.unpacked.
Fix: Cambiar asarUnpack a **/node_modules/** (unpack TODO node_modules).
Resultado:
- asar: 9.7 MB (solo codigo de app)
- asar.unpacked: 383 MB (todo node_modules)
- 7z final: 255 MB (comprime muy bien)
Sintoma: Al reintentar conexion WhatsApp, falla con "browser is already running for ..."
Causa: Retry del runner no mata Chrome previo, queda zombie bloqueando nuevo puppeteer.launch.
Fix (en electron/openwa-runner.js):
function killChromeProcesses() {
try {
const { execSync } = require('child_process');
execSync('taskkill /F /IM chrome.exe /T 2>nul', { stdio: 'ignore' });
} catch (e) {}
}Llamada en cada retry: auth_failure, disconnected, initialize error.
Sintoma: En produccion (Electron empaquetado), console.log no se ve porque stdout/stderr no van a una terminal visible.
Causa: Electron app no tiene consola adjunta en Windows.
Fix (en electron/openwa-runner.js):
const logFile = path.join(process.env.APPDATA || process.env.TEMP, 'Clinica Dental Pro', 'runner.log');
function fileLog(msg) { /* append con timestamp ISO */ }
// Override console.* y process.stderr.writeLog path: %APPDATA%\Clinica Dental Pro\runner.log
Sintoma: "address already in use 0.0.0.0:18234" al iniciar la app por segunda vez.
Causa: Backend anterior no se cerro limpiamente, proceso node.exe zombie mantiene el puerto.
Fix: Antes de iniciar, startBackend() valida que el puerto este libre. Si no, mata el proceso.
Status: PENDIENTE Fase 1.
Sintoma: Error al enviar PDF por WhatsApp.
Causa: findChrome() en backend/src/services/pdfTemplates/htmlToPdf.js solo busca 3 rutas, no consulta C:\Program Files\Google\Chrome\.
Fix planeado: Crear backend/src/utils/chromeFinder.js con 6 rutas (igual que openwaSetup.js) y reusar en ambos lugares.
Status: 🔴 PENDIENTE Fase 1.
| Accion | Toca drivers? | Detalle |
|---|---|---|
| Extraer SFX a carpeta del usuario | No | Solo archivos locales |
winget install VC++ Redist |
No | Solo DLLs de runtime C++ |
winget install Google Chrome |
No | Solo navegador |
winget install Node.js LTS |
No | Solo runtime JS |
taskkill chrome.exe |
No | Mata procesos, no drivers |
fs.rmSync wwebjs_auth |
No | Solo carpeta de sesion |
fs.appendFileSync runner.log |
No | Solo archivo de log |
puppeteer.launch() con Chrome |
No | Chrome usa drivers existentes |
- NO usa
reg.exe(modificar registro) - NO usa
pnputil(instalar drivers) - NO usa
devcon(manipular devices) - NO usa
sc.exe(instalar servicios) - NO accede a
C:\Windows\System32\drivers\ - NO modifica el kernel de Windows
- NO toca dispositivos de hardware
Clinica Dental Pro NO puede danar drivers de sonido o camara.
Si una PC donde se instalo tiene problemas de drivers, las causas probables son:
- Windows Update (causa #1): drivers genericos que reemplazan especificos
- Otro software que se actualizo cerca de esa fecha (Zoom, Teams, etc.)
- Malware que bloqueo drivers
- Problema electrico/hardware no relacionado con software
- Confusion temporal: el driver ya estaba danado antes de instalar
Ver documentacion/SOLUCION_PROBLEMAS.md seccion "Mi PC tiene problemas despues de instalar" para diagnostico paso a paso.
- PDF WhatsApp: unificar
findChrome()conopenwaSetup(6 rutas + winget) - Eliminar
puppeteer-coreduplicado (raiz +backend/) - Unificar sistemas PDF (pdfkit vs puppeteer-core)
- Validar
process.env(no asumirLOCALAPPDATAexiste) - EADDRINUSE 18234 cleanup en restart
- Eliminar archivos no usados (
debug_docker.js,dockerSetup.js,diagnostico.js) - Extraer constantes a
config/(puertos 18234, 3002, paths) - Refactorizar duplicacion
SesionClinica/Historial(extraer hooks) - Reducir
App.css(5,493 lineas en 1 archivo, dividir por componente)
- Sistema de toasts (reemplazar
alert()conreact-hot-toast) - Skeleton loaders en Pacientes, Historial, Dashboard
- Empty states ("No hay pacientes" + ilustracion)
- Busqueda en tiempo real
- Modales de confirmacion estilizados
- Dashboard con graficas (Chart.js o Recharts)
- Tema oscuro
- Calendario de citas (mensual/semanal/diaria)
- Busqueda global Ctrl+K
- Audit log (quien modifico que y cuando)
- Reportes (mensual ingresos, tratamientos comunes)
- Multi-usuario real con roles granulares
| Componente | Cantidad |
|---|---|
| Backend JS | 5,770 lineas |
| Backend archivos | 15 controllers + 15 routes + 11 PDF templates + 3 services |
| Frontend JSX | 7,214 lineas |
| Frontend componentes | 21 |
| Electron JS | 1,643 lineas |
| Electron archivos | 8 |
| CSS | 5,493 lineas (1 solo archivo App.css) |
| Total estimado | ~18,100 lineas |
master— branch principal, codigo de produccionbackup/v1.0.0-portable-whatsapp-working— respaldo del estado establemejoras/documentacion-y-transparencia— trabajo de Fase 0
- Conventional Commits (
feat:,fix:,docs:,chore:) - Mensajes en espanol
- Branchs descriptivos con prefijo de categoria
- Repo GitHub: https://github.com/Charles-X-Core/odontologia-sistema
- whatsapp-web.js docs: https://wwebjs.dev/
- Electron docs: https://www.electronjs.org/docs
- electron-builder: https://www.electron.build/
- patch-package: https://www.npmjs.com/package/patch-package