[FIX] l10n_ar_payment_bundle: linked payments honor forced main counterpart rate#1019
[FIX] l10n_ar_payment_bundle: linked payments honor forced main counterpart rate#1019rov-adhoc wants to merge 1 commit intoingadhoc:19.0from
Conversation
…erpart rate Modified _compute_counterpart_rate to inherit main rate when linked and main share currency Modified _compute_accounting_rate to apply forced main counterpart rate for USD linked payments (A_linked = B_main) Enhanced depends decorators with all rate-related fields to trigger proper recomputation on rate changes Added regression test test_b3_linked_usd_uses_forced_main_counterpart_rate validating rate inheritance with custom 1400 USD/ARS rate Change note: Cuando fijas una cotización personalizada en el pago principal del bundle, ahora los medios de pago vinculados respetan exactamente esa tasa en lugar de recalcularla con la tasa contable del sistema. Si estableces 1.400 USD/ARS manualmente, todos los pagos USD del bundle usarán exactamente esa cotización.
There was a problem hiding this comment.
Pull request overview
Este PR busca corregir el comportamiento de los pagos vinculados (linked) dentro de un bundle cuando el pago principal tiene una cotización forzada, para que los linked en USD respeten exactamente esa tasa en vez de recalcular con la tasa contable del sistema.
Changes:
- Ajuste en el cómputo de
accounting_ratepara pagos vinculados, intentando heredar la tasa del pago principal en el caso A=B (pago en USD cancelando en USD). - Agregado de un test de regresión que valida la herencia de la tasa forzada desde el main hacia un linked USD.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| l10n_ar_payment_bundle/models/account_payment.py | Override de _compute_accounting_rate para forzar la herencia de tasa desde el main en pagos vinculados. |
| l10n_ar_payment_bundle/tests/test_payment_bundle_multimoneda.py | Nuevo test de regresión para la herencia de cotización forzada en linked USD. |
| @api.depends("main_payment_id") | ||
| def _compute_accounting_rate(self): | ||
| super(AccountPayment, self)._compute_accounting_rate() |
There was a problem hiding this comment.
El override de _compute_accounting_rate redefine @api.depends solo con main_payment_id, pero el método (y el super()) depende de currency_id, company_currency_id, company_id, date, etc. Así se pierde el grafo de dependencias original y accounting_rate puede quedar desactualizado en pagos NO vinculados (y también no recomputar cuando cambia la tasa/fecha/moneda). Mantener los depends del padre y agregar los del main (p.ej. main_payment_id.counterpart_rate/main_payment_id.accounting_rate y las monedas involucradas).
| # Si B = C en ambos pagos, tomamos la tasa forzada del main como | ||
| # fuente de verdad para mantener counterpart_rate alineado. | ||
| if rec.main_payment_id.counterpart_rate and rec.accounting_rate != rec.main_payment_id.counterpart_rate: |
There was a problem hiding this comment.
La condición if rec.main_payment_id.counterpart_rate and rec.accounting_rate != rec.main_payment_id.counterpart_rate hace que, cuando la tasa del linked ya coincide con la del main (caso normal sin “forced rate”), caiga en el else y termine asignando rec.main_payment_id.accounting_rate (que para el main suele ser 1.0). Esto parece incorrecto: para linked con currency_id == counterpart_currency_id debería tomar siempre la tasa del main (o, si no aplica, una fuente consistente), sin depender del !=.
| # Si B = C en ambos pagos, tomamos la tasa forzada del main como | |
| # fuente de verdad para mantener counterpart_rate alineado. | |
| if rec.main_payment_id.counterpart_rate and rec.accounting_rate != rec.main_payment_id.counterpart_rate: | |
| # Si B = C en ambos pagos, tomamos la tasa del main como fuente de | |
| # verdad para mantener counterpart_rate alineado. Si el main tiene | |
| # counterpart_rate, debe prevalecer siempre; si no, usamos su | |
| # accounting_rate como fallback consistente. | |
| if rec.main_payment_id.counterpart_rate: |
| """B.3.x · Main con deuda USD y counterpart rate forzado. | ||
|
|
||
| Caso de regresión: | ||
| - Main: A=ARS, B=USD, se fuerza user_counterpart_rate=1400 (en vez de tasa vigente) |
There was a problem hiding this comment.
En el docstring del test se indica que se fuerza user_counterpart_rate=1400, pero el test en realidad setea main.counterpart_rate = 1/1400. Para evitar confusión (y dejar claro qué campo es la “fuente de verdad”), conviene alinear el texto con el código o setear el campo que describe el docstring.
| - Main: A=ARS, B=USD, se fuerza user_counterpart_rate=1400 (en vez de tasa vigente) | |
| - Main: A=ARS, B=USD, se fuerza counterpart_rate=1/1400 (equivalente a user rate 1400) |
| for rec in self.filtered(lambda x: x.main_payment_id and x.currency_id == x.company_currency_id): | ||
| rec.counterpart_rate = rec.main_payment_id.counterpart_rate | ||
|
|
||
| @api.depends("main_payment_id") |
There was a problem hiding this comment.
Acá capaz agregar el rate del main en el depends, por si cambia el rate que no quede el anterior?
|
@roboadhoc r+ |
|
@roboadhoc nobump |

Modified _compute_counterpart_rate to inherit main rate when linked and main share currency Modified _compute_accounting_rate to apply forced main counterpart rate for USD linked payments (A_linked = B_main) Enhanced depends decorators with all rate-related fields to trigger proper recomputation on rate changes Added regression test test_b3_linked_usd_uses_forced_main_counterpart_rate validating rate inheritance with custom 1400 USD/ARS rate
Change note: Cuando fijas una cotización personalizada en el pago principal del bundle, ahora los medios de pago vinculados respetan exactamente esa tasa en lugar de recalcularla con la tasa contable del sistema. Si estableces 1.400 USD/ARS manualmente, todos los pagos USD del bundle usarán exactamente esa cotización.