desktop_app
Aplicación de escritorio Electron + React de Flujo IPS para interactuar con el stack de servicios. Permite seleccionar carpetas locales, contar servicios en facturas médicas, revisar resultados y lanzar extracciones LLM.
Flujos principales
Conteo de facturas
- Seleccionar carpeta con PDFs.
- Los PDFs se envían en lotes de 10 a
POST /count/v1/count(count-api). - Los resultados se guardan en PostgreSQL vía
POST /count-jobs(extraction). - El usuario revisa y marca archivos como válidos/inválidos.
Extracción desde conteo
- Desde el wizard de conteo, clic en "Extraer archivos válidos".
- Se llama
POST /tasks/extraction/from-countcon elcounting_task_id. - El servicio extraction lee los PDFs desde el volumen
/datay los procesa con LLM.
Extracción directa
- Seleccionar carpeta → discovery de campos → seleccionar campos → estimar costo.
- Subir PDFs en lotes a
/tasks/{id}/ingest-many. - Polling de progreso vía
GET /tasks/{id}. - Exportar resultados como CSV.
Arquitectura técnica
| Capa | Tecnología |
|---|---|
| Shell | Electron 35+ |
| UI | React 19 + TypeScript |
| Bundler | Vite |
| Estilos | CSS custom (sin framework UI) |
| IPC | contextBridge (preload.cjs) |
Comunicación con el backend
Toda la comunicación pasa por el API Gateway.
| Entorno | URL por defecto |
|---|---|
Desarrollo (npm run dev) |
http://127.0.0.1:8189 |
| Instalador (build producción) | https://pys1.builker.xyz |
El cliente HTTP es src/renderer/lib/apiClient.ts. |
Indexación de carpetas
El proceso principal (Electron) indexa carpetas locales con electron/folderIndex.cjs:
- Modo
general: lista todos los PDFs/TIFFs de la carpeta. - Modo
radicados: busca un PDF por tipo de documento dentro de subdirectorios con nombre de radicado.
Estructura del código
electron/
main.cjs — proceso principal Electron
preload.cjs — bridge seguro main ↔ renderer (contextBridge)
folderIndex.cjs — indexación de carpetas locales
src/
renderer/
App.tsx — root: navegación y estado global
components/
CountingWizard.tsx — wizard de conteo en 3 pasos
CountResultsTable.tsx — tabla de resultados con validación
CountingStepper.tsx — indicador de progreso
ExtractionWizard.tsx — wizard de extracción en 4 pasos
ExtractionStepper.tsx — indicador de progreso
lib/
apiClient.ts — cliente HTTP hacia el API Gateway
payloads.ts — builders de FormData y JSON
pathMapping.ts — mapeo rutas locales ↔ contenedor
csv.ts — exportación CSV
styles.css — estilos globales
shared/
types.ts — tipos compartidos main/renderer
Variables de configuración (runtime)
| Variable | Default | Descripción |
|---|---|---|
API Gateway URL |
Ver tabla arriba | Configurable en la pantalla de Configuración |
| Ruta local de documentos | — | Seleccionada con el explorador de archivos |
| Ruta en contenedor | /data |
Prefijo donde Docker monta los documentos |
Arrancar en desarrollo
cd services/desktop_app
npm install
npm run dev
Build para producción
# 1) Sube la versión en package.json (ej. 1.0.1)
# 2) Configura credenciales una vez: copia .env.minio.example → .env.minio
# 3) Genera el instalador y súbelo a MinIO automáticamente:
npm run dist
El instalador queda en %LOCALAPPDATA%\IPSExtractor-desktop-release\ (fuera de Documents/OneDrive, para evitar bloqueos de app.asar en Windows) y se publica en:
s3.builker.xyz/apps-versions/IPSExtractor/{version}/
La fecha de release (UI, latest.json, DATA.txt) es el día del build/publish, salvo que pases RELEASE_DATE=DD/MM/YYYY. Se escribe en version.json antes de vite build (la UI la inyecta en compile-time).
Si solo quieres el .exe local sin subir a MinIO:
npm run dist:local
Versión de la app
| Campo | Archivo |
|---|---|
Número (1.0.0) |
package.json → version |
| Fecha de release | MinIO (latest.json / DATA.txt de la versión); fallback local de version.json |
La versión se muestra en el menú lateral y en la esquina superior derecha. Al arrancar, la app lee la fecha desde MinIO para la versión instalada (si coincide con latest.json, o desde {version}/DATA.txt).
Auto-update (MinIO)
Al iniciar la app instalada, consulta:
https://s3.builker.xyz/apps-versions/IPSExtractor/latest.json
Si hay una versión mayor, pregunta al usuario, descarga el Setup.exe, verifica sha256 y lanza el instalador NSIS.
Layout en el bucket apps-versions:
IPSExtractor/
latest.json
versions.json ← catálogo de todas las versiones publicadas
1.0.1/Flujo-IPS-1.0.1-Setup.exe
1.0.1/DATA.txt ← fecha DD/MM/YYYY, ej. 06/07/2026
Requisito: el prefijo IPSExtractor/ debe permitir GetObject anónimo en la API (s3.builker.xyz). La política se configura en la consola (minio.builker.xyz).
Credenciales de publicación (solo en tu PC):
cp .env.minio.example .env.minio
# Edita MINIO_ACCESS_KEY y MINIO_SECRET_KEY
npm run dist las usa automáticamente al final. También puedes republicar sin rebuild:
npm run publish:minio