In „Depotbuchung erfassen“ ergibt sich bei Kauf und Verkauf aus zwei der drei Felder Betrag, Stück und Kurs das dritte (Betrag = Stück × Kurs). Der ausgerechnete Wert ist hervorgehoben und zieht nach, wenn sich die anderen Felder ändern. Serverseitig rechnet Depotbuchung::dritterWert() dieselbe Regel für den Weg ohne JavaScript. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
79 lines
2.8 KiB
JavaScript
79 lines
2.8 KiB
JavaScript
// @ts-check
|
||
const { test, expect } = require('@playwright/test')
|
||
|
||
/*
|
||
* Fix #129: In „Depotbuchung erfassen“ hängen bei Kauf und Verkauf Stück, Kurs
|
||
* und Betrag zusammen – Betrag = Stück × Kurs. Sobald zwei Felder eingetragen
|
||
* sind, rechnet die Maske das dritte aus.
|
||
*/
|
||
|
||
const BENUTZER = process.env.E2E_USER || 'e2e'
|
||
const PASSWORT = process.env.E2E_PASSWORD || 'e2e-testpasswort'
|
||
|
||
async function anmelden(page) {
|
||
await page.goto('/login')
|
||
if (page.url().includes('/einrichtung')) {
|
||
throw new Error(
|
||
'Instanz ist noch nicht eingerichtet: ' +
|
||
'docker compose exec -u www-data php php scripts/e2e-benutzer.php'
|
||
)
|
||
}
|
||
await page.fill('#benutzername', BENUTZER)
|
||
await page.fill('#passwort', PASSWORT)
|
||
await page.click('button[type="submit"]')
|
||
await expect(page).toHaveURL(/\/$/)
|
||
}
|
||
|
||
test.describe('Depotbuchung erfassen: Stück, Kurs und Betrag', () => {
|
||
test.beforeEach(async ({ page }) => {
|
||
await anmelden(page)
|
||
await page.goto('/wertpapiere/buchungen/neu')
|
||
})
|
||
|
||
test('Aus Stück und Kurs ergibt sich der Betrag', async ({ page }) => {
|
||
await page.selectOption('#vorgang', 'kauf')
|
||
await page.fill('#stueck', '12')
|
||
await page.fill('#kurs', '45,67')
|
||
await expect(page.locator('#betrag')).toHaveValue('548,04')
|
||
await expect(page.locator('#betrag')).toHaveClass(/berechnet/)
|
||
|
||
// Der ausgerechnete Betrag zieht nach, wenn sich ein Feld ändert.
|
||
await page.fill('#stueck', '10')
|
||
await expect(page.locator('#betrag')).toHaveValue('456,70')
|
||
|
||
// Wird ein Feld geleert, steht hinter dem Betrag nichts mehr.
|
||
await page.fill('#kurs', '')
|
||
await expect(page.locator('#betrag')).toHaveValue('')
|
||
})
|
||
|
||
test('Aus Betrag und Stück ergibt sich der Kurs', async ({ page }) => {
|
||
await page.selectOption('#vorgang', 'verkauf')
|
||
await page.fill('#betrag', '1.000,00')
|
||
await page.fill('#stueck', '8')
|
||
await expect(page.locator('#kurs')).toHaveValue('125')
|
||
})
|
||
|
||
test('Aus Betrag und Kurs ergibt sich die Stückzahl', async ({ page }) => {
|
||
await page.selectOption('#vorgang', 'kauf')
|
||
await page.fill('#kurs', '3')
|
||
await page.fill('#betrag', '100')
|
||
await expect(page.locator('#stueck')).toHaveValue('33,333333')
|
||
|
||
// Selbst eingetragen gilt der Wert als fest und wird nicht mehr überschrieben.
|
||
await page.fill('#stueck', '30')
|
||
await page.fill('#kurs', '4')
|
||
await expect(page.locator('#stueck')).toHaveValue('30')
|
||
await expect(page.locator('#betrag')).toHaveValue('100')
|
||
})
|
||
|
||
test('Bei einer Dividende wird nichts gerechnet', async ({ page }) => {
|
||
await page.selectOption('#vorgang', 'dividende')
|
||
await page.fill('#stueck', '12')
|
||
await page.fill('#kurs', '2')
|
||
await expect(page.locator('#betrag')).toHaveValue('')
|
||
|
||
// Wechselt der Vorgang auf Kauf, rechnet die Maske nach.
|
||
await page.selectOption('#vorgang', 'kauf')
|
||
await expect(page.locator('#betrag')).toHaveValue('24,00')
|
||
})
|
||
})
|