Extensión / SPA para procesar operaciones de opciones desde archivos CSV con vistas separadas CALLS / PUTS y modo de promedios por strike.
Migración en curso desde un popup HTML (Vanilla JS) a una Single Page Application React + Vite + Material UI. El código legacy (archivos popup.html, popup.js, operations-processor.js) convive temporalmente mientras se completa la transición. La funcionalidad principal nueva vive bajo frontend/.
- Procesamiento de archivos CSV (Papaparse) con filtros por símbolo y vencimiento
- Vista dividida: pestañas CALLS / PUTS + indicador de vista actual
- Cálculo de gastos (fees) por operación: comisión, derechos de mercado e IVA con tooltip detallado
- Filtro de grupos derivado automáticamente y persistencia de selección reciente
- Modo de promedios (opcional): consolida operaciones por strike sumando cantidades y recalculando precio promedio ponderado
- Acciones de exportación: copiar o descargar CSV (vista actual, CALLS, PUTS o combinado)
- Persistencia local (localStorage) de configuración (símbolos, vencimientos, selección actual, preferencia de promedios)
- Advertencias para archivos grandes (>25.000 filas) y corte duro a 50.000 filas
- Mensajes de error y estado en español (locale
es-AR) - Pruebas unitarias + integración (Vitest + Testing Library)
- Linter (ESLint) + formateo consistente (Prettier)
procesador-opciones/
├── manifest.json # Manifest MV3 base (versión legacy 1.0.x)
├── popup.html / popup.js # UI legacy (en proceso de migración)
├── operations-processor.js # Lógica legacy de procesamiento
├── frontend/ # Nueva SPA React
│ ├── src/
│ │ ├── main.jsx # Entrada React
│ │ ├── state/ # Contexto y hooks de configuración
│ │ ├── components/ # Componentes UI
│ │ ├── services/ # Servicios (parsing, export, clipboard)
│ │ ├── processors/ # Lógica de consolidación / promedios
│ │ └── strings/es-AR.js # Textos
│ ├── tests/ # Unit + integration tests
│ ├── vite.config.js
│ └── vitest.config.js
└── README.md
Nota: Algunas carpetas pueden no existir aún si la migración está en progreso; ajustar según evolucione el repositorio.
Requisitos: Node.js 18+ (recomendado LTS), npm.
git clone https://github.com/ChuchoCoder/procesador-opciones.git
cd procesador-opciones/frontend
npm install
npm run dev
Abrí el navegador en la URL que imprima Vite (por defecto http://localhost:5173).
cd frontend
npm run build
Los artefactos quedarán en frontend/dist/.
Se provee un script que genera extension-dist/ lista para cargar en chrome://extensions.
Paso a paso:
npm run build:ext
Esto realiza:
npm run builddentro defrontend/.- Copia
manifest.jsone íconos aextension-dist/. - Copia el contenido de
frontend/dist/. - Renombra
index.htmlapopup.htmly asegura quemanifest.jsonapunte a ese archivo.
Luego:
- Abrí
chrome://extensions. - Activá Modo desarrollador.
- Clic en "Cargar descomprimida" y seleccioná
extension-dist/.
📖 Para más información sobre la extensión Chrome y el sistema de almacenamiento dual, consultá CHROME-EXTENSION.md
Si necesitás mantener el popup legacy por transición, podés conservarlo separado; este flujo lo reemplaza por la SPA.
Nota sobre almacenamiento: La aplicación ahora usa un sistema dual que detecta automáticamente si está ejecutándose como extensión (chrome.storage.local) o como web app (localStorage). Todas las operaciones de almacenamiento son ahora asíncronas.
Ejecutar todo el suite:
cd frontend
npm test
Modo watch:
npm run test:watch
Cobertura (si se añade configuración): ejecutar Vitest con --coverage (no configurado por defecto en este commit).
La funcionalidad de gastos por operación usa un archivo de configuración JSON en frontend/src/services/fees/fees-config.json con el siguiente esquema:
{
"byma": {
"derechosMercadoPct": 0.00005,
"caucionesPct": 0.00002,
"vatPct": 0.21
},
"broker": {
"commissionAccionCedearPct": 0.0006,
"commissionLetraPct": 0.0004,
"commissionBondPct": 0.0005,
"commissionOptionPct": 0.0006,
"commissionCaucionPct": 0.0003
}
}
Notas:
- Todos los valores son porcentajes expresados como fracciones (0.0006 = 0.06%).
vatPctrepresenta IVA aplicado sobre (comisión + derechos).- Si algún valor es inválido o falta, la validación futura lo sanitiza a 0 (o 0.21 para IVA por defecto).
- El flag para habilitar cauciones (
ENABLE_CAUCION_FEES) vive enfees-flags.jsy está desactivado inicialmente.
Uso básico (fase inicial): el bootstrap carga el JSON de forma síncrona y lo expone para el cálculo de gastos en módulos posteriores.
Cada fila de operación muestra una columna "Gastos" con el monto total calculado en pesos argentinos (ARS). Al pasar el cursor sobre el monto, aparece un tooltip detallado con:
- Categoría: Tipo de instrumento (Opción, Acción/CEDAR, Letra, Bono)
- Bruto: Importe bruto de la operación (cantidad × precio)
- Comisión: Monto y porcentaje aplicado
- Derechos: Derechos de mercado (BYMA) y porcentaje
- IVA: Impuesto al valor agregado sobre la suma de comisión + derechos
- Total: Suma de todos los componentes (coincide con el valor mostrado en la celda)
- Fuente: Indica si proviene de configuración o es un placeholder
Para operaciones de caución (cuando la funcionalidad esté habilitada), se muestra "—" con tooltip "Próximamente".
Editá frontend/src/services/fees/fees-config.json ajustando los porcentajes deseados. Tras guardar el archivo, recargá la aplicación para aplicar los cambios. Los valores se validan automáticamente al inicio: números inválidos o negativos se reemplazan por 0 (excepto IVA que tiene un fallback de 0.21).
npm run lint # Revisa reglas
npm run lint:fix # Aplica autofix
Prettier se usa vía configuración .prettierrc (singleQuote, trailing commas, ancho 100).
La configuración se guarda en localStorage del navegador:
Si el almacenamiento falla (modo privado estricto, etc.) se muestra un aviso y la sesión trabaja en memoria.
La rama 004-integrate-jsrofex-to agrega soporte para iniciar sesión contra un broker (jsRofex) y sincronizar automáticamente las operaciones del día sin necesidad de subir el CSV manualmente. El flujo CSV se mantiene como alternativa.
Placeholders creados (Fase 1 Setup):
frontend/src/services/broker/jsrofex-client.jsfrontend/src/services/broker/sync-service.jsfrontend/src/services/broker/dedupe-utils.js- Slices nuevas en el reducer (
brokerAuth,sync,stagingOps) - Instrumentación de performance (
performance-instrumentation.js) - Utilidad de logging (
broker-sync-log-util.js)
Próximas fases implementarán:
- Autenticación y almacenamiento seguro de token (sin credenciales en estado persistido).
- Detección de duplicados y merge atómico.
- Progreso por página, cancelación y reintentos con backoff.
Ver guía rápida: specs/004-integrate-jsrofex-to/quickstart.md.
Estado actual: sólo scaffolding. Lógica se añadirá en fases Foundational y US1.
Columnas mínimas utilizadas por el procesador React:
| Columna | Uso / Validación |
|---|---|
| event_subtype | Se filtra a execution_report |
| ord_status | Se aceptan estados ejecutados / parcialmente ejecutados |
| text | Se excluyen filas con Order Updated |
| order_id | Identificador único (evita duplicados) |
| symbol | Símbolo completo de la opción (usado para separar CALLS / PUTS) |
| side | BUY / SELL |
| last_price | Precio numérico |
| last_qty | Cantidad numérica |
Reglas adicionales:
- Se ignoran filas corruptas (se informan mediante advertencia general)
- Límite suave: aviso >25.000 filas; límite duro: procesa solo hasta 50.000
- Precios se mantienen con hasta 4 decimales internos; salida formateada acorde
Cuando está activado “Promediar por strike”:
- Agrupa operaciones por strike dentro de cada tipo (CALLS / PUTS).
- Suma cantidades netas (BUY positivo, SELL negativo si aplica lógica interna—ver implementación).
- Calcula un precio promedio ponderado por cantidad absoluta acumulada.
- Genera una tabla compacta reduciendo ruido de múltiples fills.
Desactivar el modo muestra las operaciones originales (raw) sin consolidar.
- Barra de navegación: pestañas “Procesador” y “Configuración”.
- Sección Procesar: selector de archivo, símbolo, vencimiento, switch de promedios, botón Procesar.
- Resumen: totales CALLS / PUTS y estado de promedios.
- Acciones: copiar / descargar según alcance (vista actual, llamadas, puts, combinado).
- Tablas: una por tipo, con columnas Cantidad, Strike, Precio.
- Abrí la pestaña “Procesador” (la aplicación recuerda el último símbolo y vencimiento exitosos).
- Arrastrá o seleccioná el archivo CSV con operaciones.
- Presioná “Procesar” para generar resumen y grupos detectados automáticamente.
- Elegí el grupo relevante desde los chips del encabezado (ej.:
GFG O), verificá los totales en el panel de resumen. - Utilizá “Descargar PUTs” / “Descargar CALLs” / “Descargar todo” para obtener el CSV ya filtrado.
Con esta secuencia el flujo se redujo de ~8 interacciones manuales (popup legacy) a 5 pasos guiados, con confirmación visual inmediata antes de exportar.
Opciones disponibles (según selección actual):
- Copiar vista actual (portapapeles)
- Descargar vista actual (CSV)
- Copiar / descargar CALLS
- Copiar / descargar PUTS
- Copiar / descargar combinados
Los CSV generados incluyen encabezados estándar y formateo consistente.
- Unit: parsing, consolidación (promedios), servicios de exportación y clipboard, configuración.
- Integración: flujo de procesamiento, persistencia, toggle de vistas, settings.
| Problema | Posibles causas | Acciones |
|---|---|---|
| Archivo no procesa | Formato inválido, columnas faltantes | Verificar encabezados y encoding UTF-8 |
| Lento / congelado | Archivo muy grande >25k filas | Esperar, dividir archivo o limpiar filas innecesarias |
| No persiste config | Almacenamiento bloqueado | Revisar modo incógnito / permisos browser |
| Copiar falla | Permisos del portapapeles | Reintentar foco en ventana activa |
| Aspecto | Legacy Popup | Nueva SPA |
|---|---|---|
| UI | HTML + JS plano | React + MUI |
| Persistencia | chrome.storage | localStorage (por ahora) |
| Promedios | Básico / limitado | Agrupación por strike con precio ponderado |
| Testing | Manual | Unit + Integración automatizada |
| Linter | No | Sí (ESLint + Prettier) |
- Integrar build SPA al paquete de extensión final
- Documentar estrategia de empaquetado MV3 + React
- Mejorar manejo de errores de parseo con listado detallado
- Agregar métricas de performance (tiempos de parse y consolidación)
Ver CHANGELOG.md para detalles de versiones (1.0.x) y desarrollo en curso (1.0.2 / migración React).
Abrí un issue con propuestas o problemas. PRs bienvenidos una vez alineado el objetivo.
Uso abierto orientado a análisis de operaciones de opciones. Evaluar requisitos regulatorios y privacidad antes de usar con datos sensibles.
Documento generado y actualizado durante la migración a la arquitectura React (locale es-AR).