commit f061d4f2739b838a11743716fcd311d322d7c2fb parent 603153e42c4c4d4f6de723cdf0bc615fda8ea3e9 Author: Joel-Haeberli <haebu@rubigen.ch> Date: Mon, 20 May 2024 11:16:54 +0200 fix: taler conformant Amount format Diffstat:
19 files changed, 325 insertions(+), 94 deletions(-)
diff --git a/c2ec/amount.go b/c2ec/amount.go @@ -22,7 +22,6 @@ import ( "errors" "fmt" "math" - "regexp" "strconv" "strings" ) @@ -62,6 +61,14 @@ func FormatAmount(amount *Amount) string { return "" } + if amount.Currency == "" && amount.Value == 0 && amount.Fraction == 0 { + return "" + } + + if amount.Fraction <= 0 { + return fmt.Sprintf("%s:%d", amount.Currency, amount.Value) + } + return fmt.Sprintf("%s:%d.%d", amount.Currency, amount.Value, amount.Fraction) } @@ -133,30 +140,41 @@ func (a *Amount) Add(b Amount) (*Amount, error) { // Parses an amount string in the format <currency>:<value>[.<fraction>] func ParseAmount(s string) (*Amount, error) { - re, err := regexp.Compile(`^\s*([-_*A-Za-z0-9]+):([0-9]+)\.?([0-9]+)?\s*$`) - parsed := re.FindStringSubmatch(s) - if nil != err { + if s == "" { + return &Amount{"", 0, 0}, nil + } + + if !strings.Contains(s, ":") { return nil, fmt.Errorf("invalid amount: %s", s) } - tail := "0.0" - if len(parsed) >= 4 { - tail = "0." + parsed[3] + + currencyAndAmount := strings.Split(s, ":") + if len(currencyAndAmount) != 2 { + return nil, fmt.Errorf("invalid amount: %s", s) } - if len(tail) > FractionalLength+1 { - return nil, errors.New("fraction too long") + + currency := currencyAndAmount[0] + valueAndFraction := strings.Split(currencyAndAmount[1], ".") + if len(valueAndFraction) < 1 && len(valueAndFraction) > 2 { + return nil, fmt.Errorf("invalid amount: %s", s) } - value, err := strconv.ParseUint(parsed[2], 10, 64) - if nil != err { - return nil, fmt.Errorf("unable to parse value %s", parsed[2]) + value, err := strconv.Atoi(valueAndFraction[0]) + if err != nil { + LogError("amount", err) + return nil, fmt.Errorf("invalid amount: %s", s) } - fractionF, err := strconv.ParseFloat(tail, 64) - if nil != err { - return nil, fmt.Errorf("unable to parse fraction %s", tail) + + fraction := 0 + if len(valueAndFraction) == 2 { + fraction, err = strconv.Atoi(valueAndFraction[1]) + if err != nil { + LogError("amount", err) + return nil, fmt.Errorf("invalid amount: %s", s) + } } - fraction := uint64(math.Round(fractionF * FractionalBase)) - currency := parsed[1] - a := NewAmount(currency, value, fraction) + + a := NewAmount(currency, uint64(value), uint64(fraction)) return &a, nil } diff --git a/c2ec/amount_test.go b/c2ec/amount_test.go @@ -71,3 +71,126 @@ func TestAmountLarge(t *testing.T) { t.Errorf("Failed") } } + +func TestParseValid(t *testing.T) { + + amnts := []string{ + "CHF:30", + "EUR:20.34", + "CHF:23.99", + "CHF:50.3500000", + "USD:109992332", + } + + for _, a := range amnts { + _, err := ParseAmount(a) + if err != nil { + fmt.Println("failed!", a) + t.FailNow() + } + } +} + +func TestParseInvalid(t *testing.T) { + + amnts := []string{ + "CHF", + "EUR:.34", + "CHF:23.", + "USD:1099928583593859583332", + } + + for _, a := range amnts { + _, err := ParseAmount(a) + if err == nil { + fmt.Println("failed!", a) + t.FailNow() + } + } +} + +func TestFormatAmountValid(t *testing.T) { + + amnts := []string{ + "CHF:30", + "EUR:20.34", + "CHF:23.99", + "USD:109992332", + "", + } + amntsParsed := make([]Amount, 0) + for _, a := range amnts { + a, err := ParseAmount(a) + if err != nil { + fmt.Println("failed!", err) + t.FailNow() + } + amntsParsed = append(amntsParsed, *a) + } + + amntsFormatted := make([]string, 0) + for _, a := range amntsParsed { + amntsFormatted = append(amntsFormatted, FormatAmount(&a)) + } + + for i, frmtd := range amntsFormatted { + fmt.Println(frmtd) + expectation, err1 := ParseAmount(amnts[i]) + reality, err2 := ParseAmount(frmtd) + if err1 != nil || err2 != nil { + fmt.Println("failed!", err1, err2) + t.FailNow() + } + + if expectation.Currency != reality.Currency || + expectation.Value != reality.Value || + expectation.Fraction != reality.Fraction { + + fmt.Println("failed!", amnts[i], frmtd) + t.FailNow() + } + } +} + +func TestFormatAmountInvalid(t *testing.T) { + + amnts := []string{ + "CHF:30", + "EUR:20.34", + "CHF:23.99", + "USD:109992332", + "USD:30.30", + } + amntsParsed := make([]Amount, 0) + for _, a := range amnts { + a, err := ParseAmount(a) + if err != nil { + fmt.Println("failed!", err) + t.FailNow() + } + amntsParsed = append(amntsParsed, *a) + } + + amntsFormatted := make([]string, 0) + for _, a := range amntsParsed { + amntsFormatted = append(amntsFormatted, FormatAmount(&a)) + } + + for i, frmtd := range amntsFormatted { + fmt.Println(frmtd) + expectation, err1 := ParseAmount(amnts[i]) + reality, err2 := ParseAmount(frmtd) + if err1 != nil || err2 != nil { + fmt.Println("failed!", err1, err2) + t.FailNow() + } + + if expectation.Currency != reality.Currency || + expectation.Value != reality.Value || + expectation.Fraction != reality.Fraction { + + fmt.Println("failed!", amnts[i], frmtd) + t.FailNow() + } + } +} diff --git a/c2ec/api-bank-integration.go b/c2ec/api-bank-integration.go @@ -53,7 +53,7 @@ type BankWithdrawalOperationPostResponse struct { type BankWithdrawalOperationStatus struct { Status WithdrawalOperationStatus `json:"status"` - Amount Amount `json:"amount"` + Amount string `json:"amount"` SenderWire string `json:"sender_wire"` WireTypes []string `json:"wire_types"` ReservePubKey EddsaPublicKey `json:"selected_reserve_pub"` @@ -343,7 +343,7 @@ func formatWithdrawalOrErrorStatus(w *Withdrawal) ([]byte, int) { } else { withdrawalStatusBytes, err := NewJsonCodec[BankWithdrawalOperationStatus]().EncodeToBytes(&BankWithdrawalOperationStatus{ Status: w.WithdrawalStatus, - Amount: *amount, + Amount: FormatAmount(amount), SenderWire: fmt.Sprintf("payto://%s/%d", operator.PaytoTargetType, w.ProviderTransactionId), WireTypes: []string{operator.PaytoTargetType}, ReservePubKey: EddsaPublicKey((encodeCrock(w.ReservePubKey))), diff --git a/c2ec/api-terminals.go b/c2ec/api-terminals.go @@ -21,13 +21,13 @@ type TerminalConfig struct { } type TerminalWithdrawalSetup struct { - Amount *Amount `json:"amount"` - SuggestedAmount *Amount `json:"suggested_amount"` - ProviderTransactionId string `json:"provider_transaction_id"` - TerminalFees *Amount `json:"terminal_fees"` - RequestUid string `json:"request_uid"` - UserUuid string `json:"user_uuid"` - Lock string `json:"lock"` + Amount string `json:"amount"` + SuggestedAmount string `json:"suggested_amount"` + ProviderTransactionId string `json:"provider_transaction_id"` + TerminalFees string `json:"terminal_fees"` + RequestUid string `json:"request_uid"` + UserUuid string `json:"user_uuid"` + Lock string `json:"lock"` } type TerminalWithdrawalSetupResponse struct { @@ -35,10 +35,10 @@ type TerminalWithdrawalSetupResponse struct { } type TerminalWithdrawalConfirmationRequest struct { - ProviderTransactionId string `json:"provider_transaction_id"` - TerminalFees *Amount `json:"terminal_fees"` - UserUuid string `json:"user_uuid"` - Lock string `json:"lock"` + ProviderTransactionId string `json:"provider_transaction_id"` + TerminalFees string `json:"terminal_fees"` + UserUuid string `json:"user_uuid"` + Lock string `json:"lock"` } func handleTerminalConfig(res http.ResponseWriter, req *http.Request) { @@ -116,13 +116,29 @@ func handleWithdrawalSetup(res http.ResponseWriter, req *http.Request) { res.WriteHeader(HTTP_INTERNAL_SERVER_ERROR) } + suggstdAmnt, err := parseAmount(setup.SuggestedAmount) + if err != nil { + res.WriteHeader(HTTP_BAD_REQUEST) + return + } + amnt, err := parseAmount(setup.Amount) + if err != nil { + res.WriteHeader(HTTP_BAD_REQUEST) + return + } + fees, err := parseAmount(setup.TerminalFees) + if err != nil { + res.WriteHeader(HTTP_BAD_REQUEST) + return + } + err = DB.SetupWithdrawal( generatedWopid, - preventNilAmount(setup.SuggestedAmount), - preventNilAmount(setup.Amount), + suggstdAmnt, + amnt, terminalId, setup.ProviderTransactionId, - preventNilAmount(setup.TerminalFees), + fees, setup.RequestUid, ) @@ -189,15 +205,18 @@ func handleWithdrawalCheck(res http.ResponseWriter, req *http.Request) { return } - if paymentNotification.TerminalFees == nil { - paymentNotification.TerminalFees = &Amount{"", 0, 0} + trmlFees, err := ParseAmount(paymentNotification.TerminalFees) + if err != nil { + LogError("terminals-api", err) + res.WriteHeader(HTTP_BAD_REQUEST) + return } err = DB.NotifyPayment( wpd, paymentNotification.ProviderTransactionId, terminalId, - *paymentNotification.TerminalFees, + preventNilAmount(trmlFees), ) if err != nil { LogError("terminals-api", err) @@ -230,6 +249,15 @@ func handleWithdrawalAbortTerminal(res http.ResponseWriter, req *http.Request) { handleWithdrawalAbort(res, req) } +func parseAmount(amountStr string) (Amount, error) { + + a, err := ParseAmount(amountStr) + if err != nil { + return Amount{"", 0, 0}, err + } + return preventNilAmount(a), nil +} + func preventNilAmount(a *Amount) Amount { if a == nil { @@ -251,15 +279,31 @@ func hasConflict(t *TerminalWithdrawalSetup) bool { return false // no request with this uid } - isEqual := w.Amount.Curr == t.Amount.Currency && - w.Amount.Val == int64(t.Amount.Value) && - w.Amount.Frac == int32(t.Amount.Fraction) && - w.TerminalFees.Curr == t.TerminalFees.Currency && - uint64(w.TerminalFees.Val) == t.TerminalFees.Value && - uint64(w.TerminalFees.Frac) == t.TerminalFees.Fraction && - w.SuggestedAmount.Curr == t.SuggestedAmount.Currency && - uint64(w.SuggestedAmount.Val) == t.SuggestedAmount.Value && - uint64(w.SuggestedAmount.Frac) == t.SuggestedAmount.Fraction && + suggstdAmnt, err := parseAmount(t.SuggestedAmount) + if err != nil { + LogError("terminals-api", err) + return true + } + amnt, err := parseAmount(t.Amount) + if err != nil { + LogError("terminals-api", err) + return true + } + fees, err := parseAmount(t.TerminalFees) + if err != nil { + LogError("terminals-api", err) + return true + } + + isEqual := w.Amount.Curr == amnt.Currency && + w.Amount.Val == int64(amnt.Value) && + w.Amount.Frac == int32(amnt.Fraction) && + w.TerminalFees.Curr == fees.Currency && + uint64(w.TerminalFees.Val) == fees.Value && + uint64(w.TerminalFees.Frac) == fees.Fraction && + w.SuggestedAmount.Curr == suggstdAmnt.Currency && + uint64(w.SuggestedAmount.Val) == suggstdAmnt.Value && + uint64(w.SuggestedAmount.Frac) == suggstdAmnt.Fraction && w.ProviderTransactionId == &t.ProviderTransactionId && w.RequestUid == t.RequestUid diff --git a/c2ec/api-wire-gateway.go b/c2ec/api-wire-gateway.go @@ -156,6 +156,12 @@ func transfer(res http.ResponseWriter, req *http.Request) { return } + if transfer.Amount == "" || transfer.CreditAccount == "" || transfer.RequestUid == "" { + LogError("wire-gateway-api", errors.New("invalid request")) + res.WriteHeader(HTTP_BAD_REQUEST) + return + } + paytoTargetType, tid, err := ParsePaytoWalleeTransaction(transfer.CreditAccount) if err != nil { LogError("wire-gateway-api", err) @@ -186,7 +192,7 @@ func transfer(res http.ResponseWriter, req *http.Request) { if t == nil { // no transfer for this request_id -> generate new - a, err := ParseAmount(transfer.Amount) + amount, err := ParseAmount(transfer.Amount) if err != nil { LogError("wire-gateway-api", err) res.WriteHeader(HTTP_INTERNAL_SERVER_ERROR) @@ -194,7 +200,7 @@ func transfer(res http.ResponseWriter, req *http.Request) { } err = DB.AddTransfer( decodedRequestUid, - a, + amount, transfer.ExchangeBaseUrl, string(transfer.Wtid), transfer.CreditAccount, diff --git a/c2ec/c2ec-config.yaml b/c2ec/c2ec-config.yaml @@ -20,7 +20,7 @@ db: password: "local" database: "postgres" providers: - # - name: "Wallee" + - name: "Simulation" + key: "secret" + # - name: "Wallee" # key: "secret" - #- name: "Simulation" - # key: "secret" diff --git a/c2ec/taler-wire-gateway-test.sh b/c2ec/taler-wire-gateway-test.sh @@ -12,6 +12,8 @@ taler-exchange-wire-gateway-client taler-exchange-wire-gateway-client -i -b https://bank.example.com +taler-exchange-wire-gateway-client -i -b http://taler-c2ec.ti.bfh.ch/taler-wire-gateway/ + ### TRANSFER diff --git a/simulation/a_test.go b/simulation/a_test.go @@ -89,10 +89,7 @@ func Test2(t *testing.T) { fmt.Println(res.ConfirmTransferUrl, res.Status, res.TransferDone) - for { - select { - case r := <-awaitSelection: - fmt.Println("selected parameters:", r.ReservePubKey, r.Status) - } + for r := range awaitSelection { + fmt.Println("selected parameters:", r.ReservePubKey, r.Status) } } diff --git a/simulation/amount.go b/simulation/amount.go @@ -40,6 +40,15 @@ type Amount struct { Fraction uint64 `json:"fraction"` } +func FormatAmount(amount *Amount) string { + + if amount == nil { + return "" + } + + return fmt.Sprintf("%s:%d.%d", amount.Currency, amount.Value, amount.Fraction) +} + // The maximim length of a fraction (in digits) const FractionalLength = 8 diff --git a/simulation/c2ec-simulation b/simulation/c2ec-simulation Binary files differ. diff --git a/simulation/model.go b/simulation/model.go @@ -55,7 +55,7 @@ type C2ECWithdrawRegistration struct { type C2ECWithdrawalStatus struct { Status WithdrawalOperationStatus `json:"status"` - Amount Amount `json:"amount"` + Amount string `json:"amount"` SenderWire string `json:"sender_wire"` WireTypes []string `json:"wire_types"` ReservePubKey EddsaPublicKey `json:"selected_reserve_pub"` diff --git a/simulation/sim-terminal.go b/simulation/sim-terminal.go @@ -50,10 +50,10 @@ func Terminal(in chan *SimulatedPhysicalInteraction, out chan *SimulatedPhysical } setupReq := &TerminalWithdrawalSetup{ - Amount: &Amount{"CHF", 10, 50}, - SuggestedAmount: &Amount{"CHF", 10, 50}, + Amount: "CHF:10.50", + SuggestedAmount: "CHF:10.50", ProviderTransactionId: "", - TerminalFees: &Amount{}, + TerminalFees: "", RequestUid: uuid.String(), UserUuid: "", Lock: "", @@ -158,11 +158,7 @@ func Terminal(in chan *SimulatedPhysicalInteraction, out chan *SimulatedPhysical fmt.Println("TERMINAL: payment was processed at the provider backend. sending check notification.") checkNotification := &TerminalWithdrawalConfirmationRequest{ ProviderTransactionId: "simulation-transaction-id-0", - TerminalFees: &Amount{ - Currency: "CHF", - Fraction: 10, - Value: 0, - }, + TerminalFees: "CHF:10", } checkurl := FormatUrl( C2EC_TERMINAL_CHECK_WITHDRAWAL_API, @@ -209,13 +205,13 @@ type TerminalConfig struct { } type TerminalWithdrawalSetup struct { - Amount *Amount `json:"amount"` - SuggestedAmount *Amount `json:"suggested_amount"` - ProviderTransactionId string `json:"provider_transaction_id"` - TerminalFees *Amount `json:"terminal_fees"` - RequestUid string `json:"request_uid"` - UserUuid string `json:"user_uuid"` - Lock string `json:"lock"` + Amount string `json:"amount"` + SuggestedAmount string `json:"suggested_amount"` + ProviderTransactionId string `json:"provider_transaction_id"` + TerminalFees string `json:"terminal_fees"` + RequestUid string `json:"request_uid"` + UserUuid string `json:"user_uuid"` + Lock string `json:"lock"` } type TerminalWithdrawalSetupResponse struct { @@ -223,8 +219,8 @@ type TerminalWithdrawalSetupResponse struct { } type TerminalWithdrawalConfirmationRequest struct { - ProviderTransactionId string `json:"provider_transaction_id"` - TerminalFees *Amount `json:"terminal_fees"` - UserUuid string `json:"user_uuid"` - Lock string `json:"lock"` + ProviderTransactionId string `json:"provider_transaction_id"` + TerminalFees string `json:"terminal_fees"` + UserUuid string `json:"user_uuid"` + Lock string `json:"lock"` } diff --git a/simulation/sim-wallet.go b/simulation/sim-wallet.go @@ -169,7 +169,7 @@ type BankWithdrawalOperationPostResponse struct { type BankWithdrawalOperationStatus struct { Status WithdrawalOperationStatus `json:"status"` - Amount Amount `json:"amount"` + Amount string `json:"amount"` SenderWire string `json:"sender_wire"` WireTypes []string `json:"wire_types"` ReservePubKey EddsaPublicKey `json:"selected_reserve_pub"` diff --git a/simulation/sim-wire-watch.go b/simulation/sim-wire-watch.go @@ -7,11 +7,17 @@ import ( "strconv" ) +type IncomingHistory struct { + IncomingTransactions []IncomingReserveTransaction `json:"incoming_transactions"` + CreditAccount string `json:"credit_account"` +} + +// type RESERVE | https://docs.taler.net/core/api-bank-wire.html#tsref-type-IncomingReserveTransaction type IncomingReserveTransaction struct { Type string `json:"type"` RowId int `json:"row_id"` Date Timestamp `json:"date"` - Amount Amount `json:"amount"` + Amount string `json:"amount"` DebitAccount string `json:"debit_account"` ReservePub EddsaPublicKey `json:"reserve_pub"` } @@ -41,7 +47,7 @@ func WireWatch(finish chan interface{}, kill chan error) { response, status, err := HttpGet( url, map[string]string{"Authorization": WireGatewayAuth()}, - NewJsonCodec[[]*IncomingReserveTransaction](), + NewJsonCodec[IncomingHistory](), ) if err != nil { kill <- err @@ -53,9 +59,8 @@ func WireWatch(finish chan interface{}, kill chan error) { } res := *response - for _, r := range res { - a := fmt.Sprintf("%d.%d %s", r.Amount.Value, r.Amount.Value, r.Amount.Currency) - fmt.Println("WIRE-WATCH: Incoming Reserve Transaction(", r.RowId, r.DebitAccount, a, r.ReservePub, ")") + for _, r := range res.IncomingTransactions { + fmt.Println("WIRE-WATCH: Incoming Reserve Transaction(", r.RowId, r.DebitAccount, r.Amount, r.ReservePub, ")") } close(kill) diff --git a/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/client/taler/TerminalClient.kt b/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/client/taler/TerminalClient.kt @@ -6,10 +6,27 @@ import ch.bfh.habej2.wallee_c2ec.client.taler.model.TerminalWithdrawalConfirmati import ch.bfh.habej2.wallee_c2ec.client.taler.model.TerminalWithdrawalSetup import ch.bfh.habej2.wallee_c2ec.client.taler.model.TerminalWithdrawalSetupResponse import ch.bfh.habej2.wallee_c2ec.client.taler.model.WithdrawalOperationStatus +import ch.bfh.habej2.wallee_c2ec.withdrawal.Amount import java.util.Optional interface TerminalClient { + companion object { + + fun FormatAmount(a: Amount): String { + + if (a.curr == "" && a.value == 0 && a.frac == 0) { + return "" + } + + if (a.frac <= 0) { + return "${a.curr}:${a.value}" + } + + return "${a.curr}:${a.value}.${a.frac}" + } + } + fun terminalsConfig( callback: (Optional<TerminalApiConfig>) -> Unit ) diff --git a/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/client/taler/model/TerminalsApiModel.kt b/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/client/taler/model/TerminalsApiModel.kt @@ -13,10 +13,10 @@ data class TerminalApiConfig( data class TerminalWithdrawalSetup( @Json(name = "request_uid") val requestUid: String, - @Json(name = "amount") val amount: Amount, - @Json(name = "suggested_amount") val suggestedAmount: Amount = Amount(0,0, ""), + @Json(name = "amount") val amount: String, + @Json(name = "suggested_amount") val suggestedAmount: String = "", @Json(name = "provider_transaction_id") val providerTransactionId: String = "", - @Json(name = "terminal_fees") val terminalFees: Amount = Amount(0,0, ""), + @Json(name = "terminal_fees") val terminalFees: String = "", @Json(name = "user_uuid") val userUuid: String = "", @Json(name = "lock") val lock: String = "" ) diff --git a/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/withdrawal/ManageActivity.kt b/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/withdrawal/ManageActivity.kt @@ -32,6 +32,8 @@ class ManageActivity : ComponentActivity() { companion object { + var SIM_WALLET_ENABLED = false + private data class Reg( @Json(name = "reserve_pub") val reservePubKey: String, @Json(name = "selected_exchange") val selectedExchange: String @@ -62,8 +64,6 @@ class ManageActivity : ComponentActivity() { } } } - - var SIM_WALLET_ENABLED = true } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/withdrawal/RegisterParametersScreen.kt b/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/withdrawal/RegisterParametersScreen.kt @@ -8,12 +8,18 @@ import androidx.compose.foundation.layout.width import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.unit.dp +import androidx.lifecycle.Lifecycle +import kotlinx.coroutines.launch +import kotlin.coroutines.coroutineContext @SuppressLint("StateFlowValueCalledInComposition") @Composable @@ -60,8 +66,13 @@ fun RegisterParametersScreen( Text(text = "simulate registration") } } else { - model.startAuthorizationWhenReadyOrAbort(navigateToWhenRegistered) { - activity.finish() + val s = rememberCoroutineScope() + LaunchedEffect(key1 = uiState) { + s.launch { + model.startAuthorizationWhenReadyOrAbort(navigateToWhenRegistered) { + activity.finish() + } + } } } } diff --git a/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/withdrawal/WithdrawalViewModel.kt b/wallee-c2ec/app/src/main/java/ch/bfh/habej2/wallee_c2ec/withdrawal/WithdrawalViewModel.kt @@ -22,14 +22,17 @@ import com.wallee.android.till.sdk.data.State import com.wallee.android.till.sdk.data.TransactionCompletion import com.wallee.android.till.sdk.data.TransactionCompletionResponse import com.wallee.android.till.sdk.data.TransactionResponse +import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.newSingleThreadContext import java.io.Closeable import java.math.BigDecimal import java.security.SecureRandom import java.util.Optional import java.util.UUID +import java.util.concurrent.Executors data class Amount( @Json(name = "value") val value: Int, @@ -139,7 +142,7 @@ class WithdrawalViewModel( val setupReq = TerminalWithdrawalSetup( _uiState.value.requestUid, - _uiState.value.amount + TerminalClient.FormatAmount(_uiState.value.amount) ) signals.doOnReady(navigateToWhenAmountEntered) @@ -281,10 +284,10 @@ class WithdrawalViewModel( fun withdrawalOperationFailed() { viewModelScope.launch { terminalClient!!.abortWithdrawal(uiState.value.encodedWopid) {} - SummaryActivity.summary.success = false - val activity = WithdrawalActivity() - val intent = Intent(activity, SummaryActivity::class.java) - activity.startActivity(intent) +// SummaryActivity.summary.success = false +// val activity = WithdrawalActivity() +// val intent = Intent(activity, SummaryActivity::class.java) +// activity.startActivity(intent) } }