taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 0a34f2b7afe2c4162223e09a0061e57388d94e52
parent c4827255fc86253a8924dea560926fcac01ab0fe
Author: Iván Ávalos <avalos@disroot.org>
Date:   Thu, 24 Apr 2025 18:16:09 +0200

wallet-core: add raw and effective amounts to getChoicesForPayment

Diffstat:
Mpackages/taler-util/src/types-taler-wallet.ts | 3+++
Mpackages/taler-wallet-core/src/pay-merchant.ts | 20++++++++++++++++++++
2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -2348,11 +2348,14 @@ export type ChoiceSelectionDetail = export interface ChoiceSelectionDetailPaymentPossible { status: ChoiceSelectionDetailType.PaymentPossible; + amountRaw: AmountString; + amountEffective: AmountString; tokenDetails?: PaymentTokenAvailabilityDetails; } export interface ChoiceSelectionDetailInsufficientBalance { status: ChoiceSelectionDetailType.InsufficientBalance; + amountRaw: AmountString; balanceDetails?: PaymentInsufficientBalanceDetails; tokenDetails?: PaymentTokenAvailabilityDetails; } diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts @@ -2565,6 +2565,9 @@ export async function getChoicesForPayment( assertUnreachable(contractTerms); } + let amountEffective: AmountJson | undefined = undefined; + const currency = Amounts.currencyOf(amount); + const selectCoinsResult = await selectPayCoinsInTx(wex, tx, { restrictExchanges: { auditors: [], @@ -2584,21 +2587,38 @@ export async function getChoicesForPayment( logger.trace("coin selection result", selectCoinsResult); switch (selectCoinsResult.type) { + case "success": { + amountEffective = await getTotalPaymentCostInTx(wex, + tx, currency, selectCoinsResult.coinSel.coins); + break; + } + case "prospective": { + amountEffective = await getTotalPaymentCostInTx(wex, + tx, currency, selectCoinsResult.result.prospectiveCoins); + break; + } case "failure": { + logger.info("choice not payable, insufficient coins"); balanceDetails = selectCoinsResult.insufficientBalanceDetails; + break; } + default: + assertUnreachable(selectCoinsResult); } let choice: ChoiceSelectionDetail; if (tokenSelection.type === "failure" || selectCoinsResult.type === "failure") { choice = { status: ChoiceSelectionDetailType.InsufficientBalance, + amountRaw: amount, balanceDetails: balanceDetails, tokenDetails: tokenSelection.details, }; } else { choice = { status: ChoiceSelectionDetailType.PaymentPossible, + amountRaw: amount, + amountEffective: Amounts.stringify(amountEffective!), tokenDetails: tokenSelection.details, }; }