A receipt against foreign-currency invoices now credits the customer ledger with the amount those invoices were booked at, so the customer ledger and the receivables control account agree and the exchange difference sits only on the exchange account.
The Customer Ledger No Longer Absorbs the Exchange Gain
An export receipt settles invoices that were booked at their own exchange rates, while the bank pays at today’s. The gap between the two is the realised exchange difference and it belongs on the gain or loss account.
The journal has posted it that way since the foreign-currency work shipped, which is why Simulate always showed the right figures. The customer ledger row did not: it converted the receipt at the receipt’s own rate, so the difference landed on the customer’s account as well as on the exchange account, and the customer ledger disagreed with the receivables control account by exactly the gain. In foreign currency the customer was always square; in rupees the account was overstated.
The ledger row now takes the settlement figure from the same calculation the journal uses — read, not recomputed — so there is one definition of what the receipt relieved and not two. Reversing a receipt no longer quietly puts the difference back onto the customer either.
Administrators: rows written before this can be repaired with the backfill_receipt_local_relief command. It refuses a row it cannot settle honestly — a foreign-currency invoice carrying no usable rate, or a home-currency row, where a gap is a discrepancy rather than an exchange difference — and names it for someone to look at.