From 2a92ca8732195a3a317a0edc155efc0b72351272 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 30 May 2023 15:58:28 +0200 Subject: wallet-core: report possible actions in transactions list --- .../src/operations/pay-merchant.ts | 77 ++++++++++++++++++++-- 1 file changed, 70 insertions(+), 7 deletions(-) (limited to 'packages/taler-wallet-core/src/operations/pay-merchant.ts') diff --git a/packages/taler-wallet-core/src/operations/pay-merchant.ts b/packages/taler-wallet-core/src/operations/pay-merchant.ts index 8462f2fb9..dce2a30ed 100644 --- a/packages/taler-wallet-core/src/operations/pay-merchant.ts +++ b/packages/taler-wallet-core/src/operations/pay-merchant.ts @@ -70,6 +70,7 @@ import { TalerProtocolTimestamp, TalerProtocolViolationError, TalerUriAction, + TransactionAction, TransactionMajorState, TransactionMinorState, TransactionState, @@ -547,7 +548,7 @@ async function processDownloadProposal( await tx.purchases.put(p); } } else { - p.purchaseStatus = PurchaseStatus.Proposed; + p.purchaseStatus = PurchaseStatus.DialogProposed; await tx.purchases.put(p); } const newTxState = computePayMerchantTransactionState(p); @@ -994,7 +995,7 @@ export async function checkPaymentByProposalId( return tx.purchases.get(proposalId); }); - if (!purchase || purchase.purchaseStatus === PurchaseStatus.Proposed) { + if (!purchase || purchase.purchaseStatus === PurchaseStatus.DialogProposed) { // If not already paid, check if we could pay for it. const res = await selectPayCoinsNew(ws, { auditors: [], @@ -1417,7 +1418,7 @@ export async function confirmPay( } const oldTxState = computePayMerchantTransactionState(p); switch (p.purchaseStatus) { - case PurchaseStatus.Proposed: + case PurchaseStatus.DialogProposed: p.payInfo = { payCoinSelection: coinSelection, payCoinSelectionUid: encodeCrock(getRandomBytes(16)), @@ -1498,7 +1499,7 @@ export async function processPurchase( case PurchaseStatus.FailedClaim: case PurchaseStatus.Done: case PurchaseStatus.RepurchaseDetected: - case PurchaseStatus.Proposed: + case PurchaseStatus.DialogProposed: case PurchaseStatus.AbortedProposalRefused: case PurchaseStatus.AbortedIncompletePayment: case PurchaseStatus.SuspendedAbortingWithRefund: @@ -1713,7 +1714,7 @@ export async function refuseProposal( logger.trace(`proposal ${proposalId} not found, won't refuse proposal`); return undefined; } - if (proposal.purchaseStatus !== PurchaseStatus.Proposed) { + if (proposal.purchaseStatus !== PurchaseStatus.DialogProposed) { return undefined; } const oldTxState = computePayMerchantTransactionState(proposal); @@ -1791,7 +1792,7 @@ export async function abortPayMerchant( ws.workAvailable.trigger(); } -export async function cancelAbortingPaymentTransaction( +export async function failPaymentTransaction( ws: InternalWalletState, proposalId: string, ): Promise { @@ -2023,7 +2024,7 @@ export function computePayMerchantTransactionState( major: TransactionMajorState.SuspendedAborting, }; // Dialog States - case PurchaseStatus.Proposed: + case PurchaseStatus.DialogProposed: return { major: TransactionMajorState.Dialog, minor: TransactionMinorState.MerchantOrderProposed, @@ -2060,6 +2061,68 @@ export function computePayMerchantTransactionState( } } +export function computePayMerchantTransactionActions( + purchaseRecord: PurchaseRecord, +): TransactionAction[] { + switch (purchaseRecord.purchaseStatus) { + // Pending States + case PurchaseStatus.PendingDownloadingProposal: + return [TransactionAction.Suspend, TransactionAction.Abort]; + case PurchaseStatus.PendingPaying: + return [TransactionAction.Suspend, TransactionAction.Abort]; + case PurchaseStatus.PendingPayingReplay: + // Special "abort" since it goes back to "done". + return [TransactionAction.Suspend, TransactionAction.Abort]; + case PurchaseStatus.PendingQueryingAutoRefund: + // Special "abort" since it goes back to "done". + return [TransactionAction.Suspend, TransactionAction.Abort]; + case PurchaseStatus.PendingQueryingRefund: + // Special "abort" since it goes back to "done". + return [TransactionAction.Suspend, TransactionAction.Abort]; + case PurchaseStatus.PendingAcceptRefund: + // Special "abort" since it goes back to "done". + return [TransactionAction.Suspend, TransactionAction.Abort]; + // Suspended Pending States + case PurchaseStatus.SuspendedDownloadingProposal: + return [TransactionAction.Resume, TransactionAction.Abort]; + case PurchaseStatus.SuspendedPaying: + return [TransactionAction.Resume, TransactionAction.Abort]; + case PurchaseStatus.SuspendedPayingReplay: + // Special "abort" since it goes back to "done". + return [TransactionAction.Resume, TransactionAction.Abort]; + case PurchaseStatus.SuspendedQueryingAutoRefund: + // Special "abort" since it goes back to "done". + return [TransactionAction.Resume, TransactionAction.Abort]; + case PurchaseStatus.SuspendedQueryingRefund: + // Special "abort" since it goes back to "done". + return [TransactionAction.Resume, TransactionAction.Abort]; + case PurchaseStatus.SuspendedPendingAcceptRefund: + // Special "abort" since it goes back to "done". + return [TransactionAction.Resume, TransactionAction.Abort]; + // Aborting States + case PurchaseStatus.AbortingWithRefund: + return [TransactionAction.Fail, TransactionAction.Suspend]; + case PurchaseStatus.SuspendedAbortingWithRefund: + return [TransactionAction.Fail, TransactionAction.Resume]; + // Dialog States + case PurchaseStatus.DialogProposed: + return []; + // Final States + case PurchaseStatus.AbortedProposalRefused: + return [TransactionAction.Delete]; + case PurchaseStatus.Done: + return [TransactionAction.Delete]; + case PurchaseStatus.RepurchaseDetected: + return [TransactionAction.Delete]; + case PurchaseStatus.AbortedIncompletePayment: + return [TransactionAction.Delete]; + case PurchaseStatus.FailedClaim: + return [TransactionAction.Delete]; + case PurchaseStatus.FailedAbort: + return [TransactionAction.Delete]; + } +} + async function processPurchaseAutoRefund( ws: InternalWalletState, purchase: PurchaseRecord, -- cgit v1.2.3