Replace the fixed-convention exchange rate label with an inline expression:
[amount] <currency> per {other}, where the currency dropdown lets users
pick which side of the rate to enter. Covers both "35 THB per USD" and
"0.028 USD per THB" without requiring mental inversion.
Formula: price_local = per * rate when local currency is in numerator,
price_local = per / rate when foreign currency is in numerator.
rcur is persisted to localStorage and included in the PDF note.
https://claude.ai/code/session_0151QtsUhzXmgzEhSvXG2SDt
Users were confused by the "X foreign = 1 local" convention, which is the
inverse of how exchange rates are normally quoted (e.g. "1 USD = 35 THB").
Flip to the market-standard "1 foreign = X local" direction, updating the
rate label, the price calculation (per * rate instead of per / rate), and
the PDF note.
Note: existing localStorage data using the old convention will produce
incorrect prices until users re-enter their exchange rates.
https://claude.ai/code/session_0151QtsUhzXmgzEhSvXG2SDt
docs/user-guide.md — end-user guide covering the full invoice workflow
docs/admin-guide.md — config.yml reference for setting up the app
docs/dev-guide.md — codebase guide: architecture, state, functions,
localStorage, i18n, FX convention, PDF generation
CLAUDE.md — project briefing for Claude Code sessions