mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-24 07:53:09 +00:00
fix(budget): keep a payment's currency when it is edited on a phone
The mobile payment sheet always sent the display currency, while it seeded the amount raw in the currency the payment was recorded in. Correcting only the day of a 1000 JPY payment turned it into 1000 EUR and froze a fresh FX rate for it. The sheet now carries its own currency, seeded from the payment (or the display currency for a new one) with the same picker the expense sheet has, and the payment row shows the recorded amount next to the converted one when they differ, like the desktop row does. The day is now required in both payment forms. Cleared, the server stored NULL and the ledger quietly fell back to the day the payment was recorded.
This commit is contained in:
@@ -1308,6 +1308,21 @@ describe('CostsPanel — payment modal', () => {
|
||||
await waitFor(() => expect(put).toBeTruthy())
|
||||
expect(put!.settled_at).toBe('2025-06-10')
|
||||
})
|
||||
|
||||
it('FE-W5COSTS-077: a payment cannot be saved without a day', async () => {
|
||||
// Cleared, the server would store NULL and the ledger would quietly move
|
||||
// the payment back to the day it was recorded on.
|
||||
const user = userEvent.setup()
|
||||
mount([], { settlements: [{ id: 7, from_user_id: 2, to_user_id: 1, amount: 30, settled_at: '2025-06-10', created_at: '2025-06-16 10:00:00' }] })
|
||||
|
||||
await user.click(await screen.findByTitle('Edit'))
|
||||
const save = screen.getByRole('button', { name: 'Save' })
|
||||
expect(save).toBeEnabled()
|
||||
|
||||
await user.click(document.querySelector('button[aria-haspopup="dialog"]') as HTMLElement)
|
||||
await user.click(screen.getByRole('button', { name: 'Clear date' }))
|
||||
expect(save).toBeDisabled()
|
||||
})
|
||||
})
|
||||
|
||||
describe('CostsPanel — expense modal', () => {
|
||||
|
||||
@@ -1022,7 +1022,7 @@ function SettlementModal({ tripId, people, me, editing, currency, onClose, onSav
|
||||
const [saving, setSaving] = useState(false)
|
||||
|
||||
const amt = Number.parseFloat(amount) || 0
|
||||
const valid = amt > 0 && fromId !== toId
|
||||
const valid = amt > 0 && fromId !== toId && !!day
|
||||
const opts = people.map(p => ({ value: String(p.id), label: p.id === me ? t('costs.you') : p.username }))
|
||||
|
||||
const save = async () => {
|
||||
|
||||
Reference in New Issue
Block a user