Skip to content

FIX. Bug. STKs are not processed since version 0.39.2#175

Closed
elmasvital wants to merge 1 commit into
GeiserX:mainfrom
elmasvital:main
Closed

FIX. Bug. STKs are not processed since version 0.39.2#175
elmasvital wants to merge 1 commit into
GeiserX:mainfrom
elmasvital:main

Conversation

@elmasvital
Copy link
Copy Markdown
Contributor

@elmasvital elmasvital commented May 24, 2026

Desde la versión 0.39.2 no se procesaban FxEvents que no fueran de cash. Los demás quedaban fuera. La lógica de esa parte también fue eliminada.

for (const trade of trades) {
  if (trade.currency === "EUR") continue;
  if (trade.assetCategory !== "CASH") continue;

Se ha restaurado la lógica. Debería haber afectado a todos los brokers.

Summary by CodeRabbit

  • New Features
    • FX event tracking for multi-currency accounts now includes foreign exchange transactions from securities trades and commissions.
    • Enhanced FX trigger categorization to include stock purchase and sale events for improved tax reporting.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 24, 2026

📝 Walkthrough

Walkthrough

FxFifoEngine.extractFxEvents now generates FX events from both CASH trades and securities trades. The method derives implicit FX events from security trade currency amounts and non-EUR commissions, with FxTrigger expanded to document stock_purchase and stock_sale as FX disposal sources.

Changes

Multi-currency FX event handling

Layer / File(s) Summary
FxTrigger type expansion
src/types/tax.ts
FxTrigger union expanded to include stock_purchase and stock_sale trigger categories, documenting new FX disposal sources from securities trades.
Implicit FX event generation
src/engine/fx-fifo.ts
extractFxEvents normalizes per-trade date, ECB rate, and quantity; retains CASH conversion handling with commission EUR translation; and adds implicit FX event derivation from non-CASH, non-WAR securities trades (FCY from tradeMoney and commission events for non-EUR currencies).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • GeiserX/DeclaRenta#148: Both PRs modify extractFxEvents logic for deriving FX events and the date/timing inputs used for ECB rate lookups.
  • GeiserX/DeclaRenta#161: The main PR generates FX FIFO events from trade-leg and commission data, while PR #161 changes lightyear parsing to emit assetCategory=CASH trades for FX conversions—the exact inputs now consumed by the engine.
  • GeiserX/DeclaRenta#171: Both PRs heavily modify extractFxEvents FX event derivation, but PR #171 removes implicit/securities FX logic and the detectAutoConvert mechanism—opposite direction of change.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title references a bug fix for STK processing that was broken since v0.39.2, which directly aligns with the PR's main objective of restoring FX event processing for non-CASH trades that was inadvertently removed.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@elmasvital elmasvital marked this pull request as ready for review May 24, 2026 15:31
@elmasvital elmasvital changed the title Main FIX. Bug. STKs are not processed since version 0.39.2 May 24, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/engine/fx-fifo.ts`:
- Around line 134-139: The commission block uses trade.commissionCurrency
directly which can be undefined; create a fallback like const commCurrency =
trade.commissionCurrency || trade.currency and use commCurrency for the EUR
check, for the getEcbRate call (getEcbRate(rateMap, date, commCurrency)) and as
the event.currency so undefined is never passed; keep the existing commission
amount logic and only push the event when commCurrency !== "EUR".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4a2f366d-3a27-462d-8086-23f44ad07f21

📥 Commits

Reviewing files that changed from the base of the PR and between 1b8c355 and 6badeb8.

📒 Files selected for processing (2)
  • src/engine/fx-fifo.ts
  • src/types/tax.ts

Comment thread src/engine/fx-fifo.ts
Comment on lines +134 to +139
// Commission also consumes FCY (paid in commissionCurrency)
const commission = new Decimal(trade.commission).abs();
if (commission.greaterThan(0) && trade.commissionCurrency !== "EUR") {
const commRate = getEcbRate(rateMap, date, trade.commissionCurrency);
events.push({ date, currency: trade.commissionCurrency, quantity: commission.negated(), ecbRate: commRate, trigger: "commission" });
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Missing fallback for commissionCurrency when undefined.

CASH trades at line 109 use trade.commissionCurrency || trade.currency as a fallback. Here, trade.commissionCurrency is used directly. If undefined, the condition !== "EUR" passes, then getEcbRate receives undefined and the event gets currency: undefined.

Proposed fix
         // Commission also consumes FCY (paid in commissionCurrency)
         const commission = new Decimal(trade.commission).abs();
-        if (commission.greaterThan(0) && trade.commissionCurrency !== "EUR") {
-          const commRate = getEcbRate(rateMap, date, trade.commissionCurrency);
-          events.push({ date, currency: trade.commissionCurrency, quantity: commission.negated(), ecbRate: commRate, trigger: "commission" });
+        const commCcy = trade.commissionCurrency || trade.currency;
+        if (commission.greaterThan(0) && commCcy !== "EUR") {
+          const commRate = getEcbRate(rateMap, date, commCcy);
+          events.push({ date, currency: commCcy, quantity: commission.negated(), ecbRate: commRate, trigger: "commission" });
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Commission also consumes FCY (paid in commissionCurrency)
const commission = new Decimal(trade.commission).abs();
if (commission.greaterThan(0) && trade.commissionCurrency !== "EUR") {
const commRate = getEcbRate(rateMap, date, trade.commissionCurrency);
events.push({ date, currency: trade.commissionCurrency, quantity: commission.negated(), ecbRate: commRate, trigger: "commission" });
}
// Commission also consumes FCY (paid in commissionCurrency)
const commission = new Decimal(trade.commission).abs();
const commCcy = trade.commissionCurrency || trade.currency;
if (commission.greaterThan(0) && commCcy !== "EUR") {
const commRate = getEcbRate(rateMap, date, commCcy);
events.push({ date, currency: commCcy, quantity: commission.negated(), ecbRate: commRate, trigger: "commission" });
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/engine/fx-fifo.ts` around lines 134 - 139, The commission block uses
trade.commissionCurrency directly which can be undefined; create a fallback like
const commCurrency = trade.commissionCurrency || trade.currency and use
commCurrency for the EUR check, for the getEcbRate call (getEcbRate(rateMap,
date, commCurrency)) and as the event.currency so undefined is never passed;
keep the existing commission amount logic and only push the event when
commCurrency !== "EUR".

@GeiserX
Copy link
Copy Markdown
Owner

GeiserX commented May 24, 2026

Review: REQUEST CHANGES

Hola @elmasvital, gracias por la contribución y por tu dedicación al proyecto. Sin embargo, tras una revisión exhaustiva (10 revisores independientes + análisis del historial git), este PR revierte un cambio de diseño intencional documentado en v0.39.2 (PR #171). No es un bug — es el comportamiento correcto.


❌ CI Tests: 5 fallos

Los tests fallan porque fueron actualizados intencionalmente en v0.39.2 para reflejar el nuevo comportamiento:

Test Esperado Obtenido Razón
fx-fifo.test.ts:255 0 eventos FX de STK 3 Tests aseguran que STK no genera eventos FX
fx-fifo.test.ts:505 0 eventos cuando todo es AFx 4 STK trades ahora generan eventos espurios
fx-fifo.test.ts:517 Sin hint de competidores Hint emitido Disposals FX espurios disparan el mensaje
fixtures.test.ts:209 0 eventos (ibkr-autoconvert) CRASH No ECB rate found for USD near 2025-04-10
fixtures.test.ts:277 0 eventos (ibkr-multicurrency) CRASH No ECB rate found for CAD near 2020-04-15

Los crashes son especialmente reveladores: los rate maps de los tests solo incluyen fechas para CASH trades (las únicas que necesitaban ECB rates). El PR intenta buscar rates para TODAS las fechas de STK trades, que no están en los mapas.


🔴 Problemas Críticos

1. Ganancias FX fantasma por falta de lotes previos

Cuando un usuario exporta solo el año fiscal actual (el caso más común), no existen lotes de divisa de años anteriores. Con este PR, cada compra de acciones en USD intenta consumir lotes inexistentes:

  • El fallback pone ganancia = 0 (seguro), pero genera decenas de disposals con lotId: "UNKNOWN"
  • El usuario ve warnings de "sin lotes previos suficientes" por cada operación bursátil
  • Caso real documentado: 48.000 EUR de ganancias FX ficticias en un usuario antes del fix de v0.39.2

2. Doble contabilización en cuentas auto-convert (AFx)

Para cuentas IBKR con auto-convert (la mayoría):

  1. El broker ejecuta una conversión EUR→USD automática (trade CASH con notes: "AFx")
  2. El filtro isFxconv() correctamente la ignora
  3. Pero con este PR, la compra STK también genera un disposal FX por el mismo importe
  4. Resultado: la misma conversión se cuenta dos veces

3. Modelo fiscal incorrecto

Art. 37.1.l LIRPF grava la conversión de divisa (EUR↔FCY), no el gasto de FCY en valores. Comprar acciones en USD no "dispone de USD" — sigues expuesto a USD a través de las acciones. El hecho imponible es la conversión explícita de vuelta a EUR.

DGT V2324-10 confirma FIFO para lotes de divisa, pero el hecho imponible es la conversión, no la aplicación a una compra de valores.


🟠 Problemas Altos

4. commissionCurrency sin fallback (también flagged por CodeRabbit)

// Rama CASH (correcto):
const commCcy = trade.commissionCurrency || trade.currency;

// Rama STK nueva (sin fallback - puede ser undefined):
if (commission.greaterThan(0) && trade.commissionCurrency !== "EUR") {
  const commRate = getEcbRate(rateMap, date, trade.commissionCurrency); // 💥
}

5. Sin tests nuevos

El PR introduce 3 ramas de código nuevas (STK BUY, STK SELL, STK commission) con cero cobertura de tests, mientras rompe 5+ tests existentes.

6. Exclusión WAR arbitraria

Excluye WAR pero incluye OPT, FOP, FSFOP, BOND, FUND, CRYPTO, CFD — catch-all demasiado amplio sin justificación.


📜 Historial Git: Por qué se eliminó

El historial muestra 9 commits de bug fix en 8 PRs durante 25 días intentando hacer funcionar los eventos FX implícitos desde STK:

PR Problema
#124 Primera detección de doble contabilización con FXCONV
#130 Detección demasiado estrecha → EUR 5.800 ganancias espurias
#131 AFx en Notes field no detectado → mismas ganancias espurias
#136 Heurística de correlación de importes (4 señales, aún falla)
#143 48K EUR ganancias fantasma por lotes previos ausentes
#148 Timing con settlement date vs trade date
#170 Incluso CASH trades manuales en IDEALFX eran limpieza AFx
#171 Eliminación definitiva — documentado como Hard Trace

La eliminación fue explícita y deliberada. El commit dice: "Securities trades no longer produce implicit FX events (avoids phantom gains from missing prior-year lots and matches competitor behavior)". El sub-commit elimina stock_purchase/stock_sale del tipo FxTrigger.


💡 ¿Qué puede estar pasando en tu caso?

Si estás viendo resultados incorrectos con Lightyear, puede deberse a:

  1. Las filas Conversion de tu CSV no se están parseando como assetCategory: "CASH" — esto sería un bug del parser (src/parsers/lightyear.ts), no del motor FX
  2. Tu cuenta de Lightyear realiza conversiones implícitas que no aparecen como filas Conversion — en ese caso, no hay datos sobre los que calcular

En ambos casos, la solución correcta es mejorar el parser de Lightyear, no cambiar el motor FX.

Si quieres, comparte un ejemplo anonimizado de tu CSV (las filas relevantes de compra/venta y conversión) y revisamos si el parser las está interpretando correctamente. Abrimos un issue aparte si hay un bug real.


✅ Lo positivo

  • La reestructuración de la rama CASH (mover isFxconv() dentro del bloque CASH) es una mejora limpia
  • Tu instinto de cuestionar el comportamiento FX muestra compromiso con la corrección del proyecto
  • El fix de commissionCurrency sin fallback que señala CodeRabbit es válido (pero para el código actual, no para este PR)

Recomendación: Cerrar este PR. Si hay un caso concreto con Lightyear donde los resultados son incorrectos, abrimos un issue específico para investigar el parser.

@elmasvital
Copy link
Copy Markdown
Contributor Author

elmasvital commented May 24, 2026

Voy a revisar la documentación que aportas para poder comprender mejor el razonamiento que me has dado. Soy un programador amateur y esto me va grande y desde aquí pido disculpas pq se que te dará más trabajo. Pero creo que puedo aportar información valiosa.

Con respecto a los AFx de IBKR me gustaría aportar lo que he detectado este finde semana para que al menos quede documentado.

La mayoría de los lotes fantasmas que mencionas son los stocks que se están comprando sin soporte de lote fifo . Y es lógico pq se están ignorando los eventos cash que están catalogados como AFx en el que se abriría los lotes que se echan en falta.

Si skipeas los eventos cash AFx habría que localizar qué stk se está comprando para ignorarlo también. Y hasta ahora no se ha podido identificar con garantías de falsos positivos. Pero claro no tenemos claro cómo relacionarlos, hasta ahora.

Hay un parámetro que los relaciona y son los 16 primeros dígitos del parámetro brokerageOrderID.

La mecánica de trabajo debería. En cuanto se detecte una autoconversión con note AFx se extrae su brokerageOrderID se localizan todos los eventos que coincidan con sus primeros 16 caracteres.

Dejo un ejemplo en el que se muestra lo que indico.

</OpenPositions><Trades>
<Trade dateTime="20250514;121940" notes="" brokerageOrderID="019b0cb8.00012b4a.68241e07.0002" description="UNITEDHEALTH GROUP INC" transactionType="ExchTrade" quantity="10" currency="USD" ibCommission="-1.00035" ibCommissionCurrency="USD" buySell="BUY" fxRateToBase="0.89491" assetCategory="STK" subCategory="COMMON" symbol="UNH" conid="13272" securityID="US91324P1021" securityIDType="ISIN" cusip="91324P102" isin="US91324P1021" figi="BBG000CH5208" listingExchange="NYSE" underlyingConid="" underlyingSymbol="UNH" underlyingSecurityID="" underlyingListingExchange="" issuer="" issuerCountryCode="US" tradeID="REDACTED" multiplier="1" relatedTradeID="" strike="" reportDate="20250514" expiry="" putCall="" tradeDate="20250514" principalAdjustFactor="" settleDateTarget="20250515" exchange="NYSE" tradePrice="312.3" tradeMoney="3123" proceeds="-3123" taxes="0" netCash="-3124.00035" closePrice="308.01" openCloseIndicator="O" cost="3124.00035" fifoPnlRealized="0" mtmPnl="-42.9" origTradePrice="0" origTradeDate="" origTradeID="" origOrderID="0" origTransactionID="0" clearingFirmID="" ibOrderID="REDACTED" transactionID="REDACTED" ibExecID="REDACTED" relatedTransactionID="" rtn="" orderReference="REDACTED" volatilityOrderLink="" exchOrderId="N/A" extExecID="REDACTED" orderTime="20250514;075738" openDateTime="" holdingPeriodDateTime="" whenRealized="" whenReopened="" levelOfDetail="EXECUTION" changeInPrice="0" changeInQuantity="0" orderType="LMT" traderID="" isAPIOrder="N" accruedInt="0" initialInvestment="" positionActionID="" serialNumber="" deliveryType="" commodityType="" fineness="0.0" weight="0.0" />

<Trade dateTime="20250514;121940" notes="AFx" brokerageOrderID="019b0cb8.00012b4a.6824256e.0001" description="EUR.USD" transactionType="ExchTrade" quantity="-2673.71" currency="USD" ibCommission="0" ibCommissionCurrency="EUR" buySell="SELL" fxRateToBase="0.89491" assetCategory="CASH" subCategory="" symbol="EUR.USD" conid="12087792" securityID="" securityIDType="" cusip="" isin="" figi="" listingExchange="" underlyingConid="" underlyingSymbol="" underlyingSecurityID="" underlyingListingExchange="" issuer="" issuerCountryCode="" tradeID="REDACTED" multiplier="1" relatedTradeID="" strike="" reportDate="20250514" expiry="" putCall="" tradeDate="20250514" principalAdjustFactor="" settleDateTarget="20250515" exchange="IDEALFX" tradePrice="1.11999" tradeMoney="-2994.5284629" proceeds="2994.5284629" taxes="0" netCash="0" closePrice="0" openCloseIndicator="" cost="0" fifoPnlRealized="0" mtmPnl="6.123467" origTradePrice="0" origTradeDate="" origTradeID="" origOrderID="0" origTransactionID="0" clearingFirmID="" ibOrderID="REDACTED" transactionID="REDACTED" ibExecID="REDACTED" relatedTransactionID="" rtn="" orderReference="" volatilityOrderLink="" exchOrderId="N/A" extExecID="REDACTED" orderTime="20250514;121940" openDateTime="" holdingPeriodDateTime="" whenRealized="" whenReopened="" levelOfDetail="EXECUTION" changeInPrice="0" changeInQuantity="0" orderType="MKT" traderID="" isAPIOrder="N" accruedInt="0" initialInvestment="" positionActionID="" serialNumber="" deliveryType="" commodityType="" fineness="0.0" weight="0.0" />

<Trade dateTime="20250514;121941" notes="AFx" brokerageOrderID="019b0cb8.00012b4a.68242571.0001" description="EUR.USD" transactionType="ExchTrade" quantity="-0.31" currency="USD" ibCommission="0" ibCommissionCurrency="EUR" buySell="SELL" fxRateToBase="0.89491" assetCategory="CASH" subCategory="" symbol="EUR.USD" conid="12087792" securityID="" securityIDType="" cusip="" isin="" figi="" listingExchange="" underlyingConid="" underlyingSymbol="" underlyingSecurityID="" underlyingListingExchange="" issuer="" issuerCountryCode="" tradeID="REDACTED" multiplier="1" relatedTradeID="" strike="" reportDate="20250514" expiry="" putCall="" tradeDate="20250514" principalAdjustFactor="" settleDateTarget="20250515" exchange="IDEALFX" tradePrice="1.11999" tradeMoney="-0.3471969" proceeds="0.3471969" taxes="0" netCash="0" closePrice="0" openCloseIndicator="" cost="0" fifoPnlRealized="0" mtmPnl="0.00071" origTradePrice="0" origTradeDate="" origTradeID="" origOrderID="0" origTransactionID="0" clearingFirmID="" ibOrderID="REDACTED" transactionID="REDACTED" ibExecID="REDACTED" relatedTransactionID="" rtn="" orderReference="" volatilityOrderLink="" exchOrderId="N/A" extExecID="REDACTED" orderTime="20250514;121941" openDateTime="" holdingPeriodDateTime="" whenRealized="" whenReopened="" levelOfDetail="EXECUTION" changeInPrice="0" changeInQuantity="0" orderType="MKT" traderID="" isAPIOrder="N" accruedInt="0" initialInvestment="" positionActionID="" serialNumber="" deliveryType="" commodityType="" fineness="0.0" weight="0.0" />

<Trade dateTime="20250514;170000" notes="" brokerageOrderID="" description="EUR.USD" transactionType="ExchTrade" quantity="0.00909019" currency="USD" ibCommission="0" ibCommissionCurrency="EUR" buySell="BUY" fxRateToBase="0.89491" assetCategory="CASH" subCategory="" symbol="EUR.USD" conid="12087792" securityID="" securityIDType="" cusip="" isin="" figi="" listingExchange="" underlyingConid="" underlyingSymbol="" underlyingSecurityID="" underlyingListingExchange="" issuer="" issuerCountryCode="" tradeID="REDACTED" multiplier="1" relatedTradeID="" strike="" reportDate="20250514" expiry="" putCall="" tradeDate="20250514" principalAdjustFactor="" settleDateTarget="20250515" exchange="IDEALFX" tradePrice="1.11766657" tradeMoney="0.0101598" proceeds="-0.0101598" taxes="0" netCash="0" closePrice="0" openCloseIndicator="" cost="0" fifoPnlRealized="0" mtmPnl="-0.000002" origTradePrice="0" origTradeDate="" origTradeID="" origOrderID="0" origTransactionID="0" clearingFirmID="" ibOrderID="REDACTED" transactionID="REDACTED" ibExecID="REDACTED" relatedTransactionID="" rtn="" orderReference="" volatilityOrderLink="" exchOrderId="N/A" extExecID="N/A" orderTime="20250514;170000" openDateTime="" holdingPeriodDateTime="" whenRealized="" whenReopened="" levelOfDetail="EXECUTION" changeInPrice="0" changeInQuantity="0" orderType="" traderID="" isAPIOrder="N" accruedInt="0" initialInvestment="" positionActionID="" serialNumber="" deliveryType="" commodityType="" fineness="0.0" weight="0.0" />
</Trades>

Con respecto a problemas con el parser de Lightyear. Como te comenté ahora mismo Declarenta está completamente roto con mis datos. En lightyear y en IBKR también. Voy a volver a revisar de porqué.

Y también voy a hacer una prueba de concepto en mi Fork desde la versión anterior a 039.02 para que veas las diferencias.

Ciero el PR como me suguieres.

@elmasvital elmasvital closed this May 24, 2026
@GeiserX
Copy link
Copy Markdown
Owner

GeiserX commented May 24, 2026

¡Gracias por cerrar el PR y por toda la información adicional, @elmasvital! No te disculpes — tu investigación fue valiosa y nos llevó a encontrar un bug real de polaridad que ya está corregido en v0.39.5.

Sobre el brokerageOrderID y la correlación AFx↔STK:

Es un hallazgo interesante que documentaré. Sin embargo, por diseño en v0.39.2+ no necesitamos relacionar AFx con sus STK correspondientes, porque:

  1. Los trades AFx se filtran individualmente por isFxconv() — nunca generan eventos FX
  2. Los trades STK nunca generan eventos FX implícitos (evita phantom gains por lotes inexistentes de años anteriores)
  3. Solo las conversiones manuales (sin notas AFx) generan eventos FX

Así que los "lotes fantasma" que mencionas no deberían aparecer en v0.39.5 — eran el resultado del bug de polaridad (tu SELL manual se interpretaba como disposición en vez de adquisición).

Sobre Lightyear roto: Si también te falla con Lightyear, ¿puedes abrir un issue con un extracto anonimizado del CSV? Así lo investigo por separado.

Te pido que pruebes v0.39.5 en declarenta.com con tu XML y me digas si los resultados ahora tienen sentido. Si sigues viendo algo raro, abre un issue nuevo y lo miramos.

¡Gracias por tu paciencia y por la información del brokerageOrderID — queda documentada para futuras mejoras!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants