From f9192d986f1e8fda891a2fd379f645f814fd68a3 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 1 Jun 2022 10:47:46 +0200 Subject: wallet-core: refunds transactions should be sorted after payments --- .../src/operations/transactions.ts | 58 +++++++++++++++------- 1 file changed, 41 insertions(+), 17 deletions(-) (limited to 'packages/taler-wallet-core/src/operations/transactions.ts') diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts index db282bb68..b8df1e7eb 100644 --- a/packages/taler-wallet-core/src/operations/transactions.ts +++ b/packages/taler-wallet-core/src/operations/transactions.ts @@ -96,6 +96,19 @@ function shouldSkipSearch( return true; } +/** + * Fallback order of transactions that have the same timestamp. + */ +const txOrder: { [t in TransactionType]: number } = { + [TransactionType.Withdrawal]: 1, + [TransactionType.Tip]: 2, + [TransactionType.Payment]: 3, + [TransactionType.Refund]: 4, + [TransactionType.Deposit]: 5, + [TransactionType.Refresh]: 6, + [TransactionType.Tip]: 7, +}; + /** * Retrieve the full event history for this wallet. */ @@ -306,8 +319,10 @@ export async function getTransactions( } let totalRefundRaw = Amounts.getZero(contractData.amount.currency); - let totalRefundEffective = Amounts.getZero(contractData.amount.currency); - const refunds: RefundInfoShort[] = [] + let totalRefundEffective = Amounts.getZero( + contractData.amount.currency, + ); + const refunds: RefundInfoShort[] = []; for (const groupKey of refundGroupKeys.values()) { const refundTombstoneId = makeEventId( @@ -353,7 +368,7 @@ export async function getTransactions( timestamp: r0.obtainedTime, amountEffective: Amounts.stringify(amountEffective), amountRaw: Amounts.stringify(amountRaw), - }) + }); } } if (!r0) { @@ -361,7 +376,10 @@ export async function getTransactions( } totalRefundRaw = Amounts.add(totalRefundRaw, amountRaw).amount; - totalRefundEffective = Amounts.add(totalRefundEffective, amountEffective).amount; + totalRefundEffective = Amounts.add( + totalRefundEffective, + amountEffective, + ).amount; transactions.push({ type: TransactionType.Refund, info, @@ -370,7 +388,10 @@ export async function getTransactions( timestamp: r0.obtainedTime, amountEffective: Amounts.stringify(amountEffective), amountRaw: Amounts.stringify(amountRaw), - refundPending: pr.refundAwaiting === undefined ? undefined : Amounts.stringify(pr.refundAwaiting), + refundPending: + pr.refundAwaiting === undefined + ? undefined + : Amounts.stringify(pr.refundAwaiting), pending: false, frozen: false, }); @@ -383,7 +404,10 @@ export async function getTransactions( amountEffective: Amounts.stringify(pr.totalPayCost), totalRefundRaw: Amounts.stringify(totalRefundRaw), totalRefundEffective: Amounts.stringify(totalRefundEffective), - refundPending: pr.refundAwaiting === undefined ? undefined : Amounts.stringify(pr.refundAwaiting), + refundPending: + pr.refundAwaiting === undefined + ? undefined + : Amounts.stringify(pr.refundAwaiting), status: pr.timestampFirstSuccessfulPay ? PaymentStatus.Paid : PaymentStatus.Accepted, @@ -398,7 +422,6 @@ export async function getTransactions( frozen: pr.payFrozen ?? false, ...(err ? { error: err } : {}), }); - }); tx.tips.iter().forEachAsync(async (tipRecord) => { @@ -434,18 +457,19 @@ export async function getTransactions( const txPending = transactions.filter((x) => x.pending); const txNotPending = transactions.filter((x) => !x.pending); - txPending.sort((h1, h2) => - AbsoluteTime.cmp( + const txCmp = (h1: Transaction, h2: Transaction) => { + const tsCmp = AbsoluteTime.cmp( AbsoluteTime.fromTimestamp(h1.timestamp), AbsoluteTime.fromTimestamp(h2.timestamp), - ), - ); - txNotPending.sort((h1, h2) => - AbsoluteTime.cmp( - AbsoluteTime.fromTimestamp(h1.timestamp), - AbsoluteTime.fromTimestamp(h2.timestamp), - ), - ); + ); + if (tsCmp === 0) { + return Math.sign(txOrder[h1.type] - txOrder[h2.type]); + } + return tsCmp; + }; + + txPending.sort(txCmp); + txNotPending.sort(txCmp); return { transactions: [...txNotPending, ...txPending] }; } -- cgit v1.2.3