Goal
Fix the misleading label on the buy-payment action button so it matches what the button actually does. Tester feedback from Bojan Jankovic (RealUnit, 28.05): the current wording tells the customer to transfer money first and click afterwards, but the click is in fact what requests the payment instructions — the customer should click first, receive the payment slip, then pay.
This is a pure i18n label change. No behaviour, flow, API, or surrounding-copy change.
Exact change
File: assets/languages/strings_de.arb and assets/languages/strings_en.arb, key buyPaymentConfirm (currently line 31 in both).
| Lang |
Current |
New |
| de |
Klicken Sie hier, sobald Sie die Überweisung getätigt haben |
Zahlungsanweisungen per E-Mail anfordern |
| en |
Click here once you have made the transfer |
Request payment instructions by email |
Nothing else in the ARB files changes.
Why this is correct (investigation summary)
The button lives in lib/screens/buy/widgets/payment_information_details.dart:225. Its onPressed calls BuyConfirmCubit.confirmPayment(buyPaymentInfo.id) → RealUnitBuyPaymentInfoService.confirmPayment(id) → PUT /v1/realunit/buy/{id}/confirm (DFX API).
Server-side (DFXswiss/api → realunit.service.ts confirmBuy), that endpoint calls blockchainService.requestPaymentInstructions(...) against Aktionariat, sets the transaction request to WAITING_FOR_PAYMENT, and returns a reference. In other words the action requests the payment instructions — it does not record an already-made transfer. The old label inverted the real order of operations; the new label matches both the backend method name (requestPaymentInstructions) and RealUnit's established setup (Bojan: "Es ist einfacher für den Kunden, zuerst ein Mail mit Einzahlungsschein zu erhalten und erst danach die Zahlung im E-Banking zu erfassen. Im aktuellen Setup haben wir es auch so.").
Because the backend already does exactly what the new label says, only the label is wrong — hence the strict label-only scope. Bojan explicitly scoped it too: "Einzig den Text auf dem Button sollte man ändern."
Out of scope — do NOT touch
confirmPayment / BuyConfirmCubit logic, the /confirm endpoint, or any API behaviour.
buyPaymentInformationDescription ("Bitte überweisen Sie den Kaufbetrag mit diesen Angaben…") and the in-app IBAN/BIC/QR display — they stay; the customer can still see and use the details directly.
buyExecutedDescription ("Vielen Dank. Sobald Ihre Überweisung eingegangen ist, übertragen wir die REALU-Token…") and PaymentExecutedSheet — the post-action success copy still fits.
- The error strings
buyPaymentConfirmFailed / buyPaymentConfirmFailedAktionariat — unchanged.
Required follow-up steps (per repo conventions)
- Keep the ARB files alphabetically ordered (the key keeps its position). Run
dart run tool/generate_localization.dart to regenerate lib/generated/i18n.dart.
- Goldens: the loaded buy-payment screen renders this button — the golden
test/goldens/screens/buy/goldens/macos/buy_payment_info_loaded.png will change. After pushing the branch, trigger gh workflow run golden-regenerate.yaml --repo RealUnitCH/app --ref <branch> (don't wait for the Visual-Regression check to fail first).
- Widget tests: check
test/screens/buy/widgets/payment_information_test.dart and test/screens/buy/buy_golden_test.dart for any assertion on the old literal string and update if present.
Acceptance criteria
Branch / workflow
Feature branch → PR against staging (RealUnit branch flow, per CONTRIBUTING.md), open as Draft.
Source: tester feedback "Test RU App mit Android", Bojan Jankovic, 28.05.2026.
Goal
Fix the misleading label on the buy-payment action button so it matches what the button actually does. Tester feedback from Bojan Jankovic (RealUnit, 28.05): the current wording tells the customer to transfer money first and click afterwards, but the click is in fact what requests the payment instructions — the customer should click first, receive the payment slip, then pay.
This is a pure i18n label change. No behaviour, flow, API, or surrounding-copy change.
Exact change
File:
assets/languages/strings_de.arbandassets/languages/strings_en.arb, keybuyPaymentConfirm(currently line 31 in both).Klicken Sie hier, sobald Sie die Überweisung getätigt habenZahlungsanweisungen per E-Mail anfordernClick here once you have made the transferRequest payment instructions by emailNothing else in the ARB files changes.
Why this is correct (investigation summary)
The button lives in
lib/screens/buy/widgets/payment_information_details.dart:225. ItsonPressedcallsBuyConfirmCubit.confirmPayment(buyPaymentInfo.id)→RealUnitBuyPaymentInfoService.confirmPayment(id)→PUT /v1/realunit/buy/{id}/confirm(DFX API).Server-side (
DFXswiss/api→realunit.service.tsconfirmBuy), that endpoint callsblockchainService.requestPaymentInstructions(...)against Aktionariat, sets the transaction request toWAITING_FOR_PAYMENT, and returns areference. In other words the action requests the payment instructions — it does not record an already-made transfer. The old label inverted the real order of operations; the new label matches both the backend method name (requestPaymentInstructions) and RealUnit's established setup (Bojan: "Es ist einfacher für den Kunden, zuerst ein Mail mit Einzahlungsschein zu erhalten und erst danach die Zahlung im E-Banking zu erfassen. Im aktuellen Setup haben wir es auch so.").Because the backend already does exactly what the new label says, only the label is wrong — hence the strict label-only scope. Bojan explicitly scoped it too: "Einzig den Text auf dem Button sollte man ändern."
Out of scope — do NOT touch
confirmPayment/BuyConfirmCubitlogic, the/confirmendpoint, or any API behaviour.buyPaymentInformationDescription("Bitte überweisen Sie den Kaufbetrag mit diesen Angaben…") and the in-app IBAN/BIC/QR display — they stay; the customer can still see and use the details directly.buyExecutedDescription("Vielen Dank. Sobald Ihre Überweisung eingegangen ist, übertragen wir die REALU-Token…") andPaymentExecutedSheet— the post-action success copy still fits.buyPaymentConfirmFailed/buyPaymentConfirmFailedAktionariat— unchanged.Required follow-up steps (per repo conventions)
dart run tool/generate_localization.dartto regeneratelib/generated/i18n.dart.test/goldens/screens/buy/goldens/macos/buy_payment_info_loaded.pngwill change. After pushing the branch, triggergh workflow run golden-regenerate.yaml --repo RealUnitCH/app --ref <branch>(don't wait for the Visual-Regression check to fail first).test/screens/buy/widgets/payment_information_test.dartandtest/screens/buy/buy_golden_test.dartfor any assertion on the old literal string and update if present.Acceptance criteria
buyPaymentConfirmreads the new text in bothstrings_de.arbandstrings_en.arb.lib/generated/i18n.dartregenerated; build green.Branch / workflow
Feature branch → PR against
staging(RealUnit branch flow, per CONTRIBUTING.md), open as Draft.Source: tester feedback "Test RU App mit Android", Bojan Jankovic, 28.05.2026.