168 lines
5.5 KiB
Markdown
168 lines
5.5 KiB
Markdown
# 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
|
|
|
|
1. Seleccionar carpeta con PDFs.
|
|
2. Los PDFs se envían en lotes de 10 a `POST /count/v1/count` (count-api).
|
|
3. Los resultados se guardan en PostgreSQL vía `POST /count-jobs` (extraction).
|
|
4. El usuario revisa y marca archivos como válidos/inválidos.
|
|
|
|
### Extracción desde conteo
|
|
|
|
1. Desde el wizard de conteo, clic en "Extraer archivos válidos".
|
|
2. Se llama `POST /tasks/extraction/from-count` con el `counting_task_id`.
|
|
3. El servicio extraction lee los PDFs desde el volumen `/data` y los procesa con LLM.
|
|
|
|
### Extracción directa
|
|
|
|
1. Seleccionar carpeta → discovery de campos → seleccionar campos → estimar costo.
|
|
2. Subir PDFs en lotes a `/tasks/{id}/ingest-many`.
|
|
3. Polling de progreso vía `GET /tasks/{id}`.
|
|
4. 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`](src/renderer/lib/apiClient.ts).
|
|
|
|
### Indexación de carpetas
|
|
|
|
El proceso principal (Electron) indexa carpetas locales con [`electron/folderIndex.cjs`](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
|
|
|
|
```bash
|
|
cd services/desktop_app
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
## Build para producción
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
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`:
|
|
|
|
```text
|
|
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):
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
npm run publish:minio
|
|
```
|