[REF] pos_payment_method_cashdro_rounding: hook the amount, not the url builder

`_cashdro_payment_url()` is shared by the payment and the reversal paths, so
patching it applied the rounding to the reversals too: giving back a paid
order sent the drawer the *order* remaining, rounded, instead of the amount
of the line, and reversing an order already covered by other payments sent 0.

It also collided with the modules that fix that same method, leaving the
outcome to the asset load order.

Both go away by hooking `_cashdro_amount()`, the extension point
`pos_payment_method_cashdro_flow_fix` provides, which is only reached on a
payment. `shouldRound`/`getDefaultAmountDueToPayIn` came with the 18.0 tax
totals rework, so fall back instead of breaking the payment with a TypeError
the operator would read as one more connection error.

Adds the README_DEV.md the repo conventions ask for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
GitHub Copilot 2026-08-31 17:43:38 +02:00
parent 7ae10abda8
commit 57bf688169
Signed by: snt
GPG key ID: A9FD34930EADBE71
3 changed files with 75 additions and 14 deletions

View file

@ -0,0 +1,52 @@
# pos_payment_method_cashdro_rounding
Sends the CashDro the amount the customer is really expected to pay — the due
amount with the PoS **cash rounding** applied — instead of the plain due amount
the OCA module asks for.
## Why
A CashDro can only give change with the coins it holds. When the PoS is
configured with a cash rounding (`pos.config.cash_rounding`, typically to 0.05
so that 1 and 2 cent coins are not needed), asking the drawer for the unrounded
due leaves it trying to return change it does not have.
Core already computes that amount: `PosOrder.getDefaultAmountDueToPayIn()` is
what a payment line defaults to when it is created. We simply reuse it, so the
drawer is asked for exactly what the payment screen shows.
`shouldRound()` decides whether the rounding applies at all — it takes
`only_round_cash_method` into account, and the CashDro method is a cash one, so
in practice it is always true when a cash rounding is configured.
## How
One single patch on `PaymentCashdro.prototype._cashdro_amount()`, the hook
`pos_payment_method_cashdro_flow_fix` extracted for this. Everything else of the
OCA payment flow (request, acknowledge, polling, error handling) is untouched.
Two things this deliberately does **not** do:
- It does not touch the **reversals**. There the amount to send is the one of
the line being given back, not the remaining of the order, and it is already
the rounded figure that was collected. Rounding it a second time against the
order total would ask the drawer to collect the total all over again.
- It does not touch `_cashdro_payment_url()`, which is what it patched until
`18.0.1.1.0`. That method is shared by the payment and the reversal paths,
which is exactly how the reversal bug above got in, and it collides with the
fix modules that also patch it — the outcome then depending on the asset load
order.
## Dependencies
Needs `pos_payment_method_cashdro_flow_fix` for the `_cashdro_amount()` hook,
and through it `pos_payment_method_cashdro_fix`: without them the OCA module
does not work on 18.0 at all, so there is nothing to round.
## Testing
There are no automated tests — the flow needs a CashDro answering on the
network. To check it by hand, configure a cash rounding of 0.05 on the PoS, take
an order to a total that is not a multiple of 0.05 (e.g. 17.43) and confirm the
drawer asks for 17.45. See the `USAGE` of
`pos_payment_method_cashdro_flow_fix` for how to read a failure.