diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 7a343c5febef..78f5bd047731 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -159,6 +159,7 @@ import { isPerDiemRequest as isPerDiemRequestTransactionUtils, isReceiptBeingScanned as isReceiptBeingScannedTransactionUtils, isScanRequest as isScanRequestTransactionUtils, + removeSettledAndApprovedTransactions, shouldShowBrokenConnectionViolation, } from '@libs/TransactionUtils'; import ViolationsUtils from '@libs/Violations/ViolationsUtils'; @@ -6764,6 +6765,56 @@ function deleteMoneyRequest(transactionID: string | undefined, reportAction: Ony value: null, }); + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: transaction ?? null, + }, + ]; + + if (transactionViolations) { + removeSettledAndApprovedTransactions( + transactionViolations.filter((violation) => violation?.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION).flatMap((violation) => violation?.data?.duplicates ?? []), + ).forEach((duplicateID) => { + const duplicateTransactionsViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${duplicateID}`]; + if (!duplicateTransactionsViolations) { + return; + } + + const duplicateViolation = duplicateTransactionsViolations.find((violation) => violation.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION); + if (!duplicateViolation?.data?.duplicates) { + return; + } + + const duplicateTransactionIDs = duplicateViolation.data.duplicates.filter((duplicateTransactionID) => duplicateTransactionID !== transactionID); + + const optimisticViolations: OnyxTypes.TransactionViolations = duplicateTransactionsViolations.filter((violation) => violation.name !== CONST.VIOLATIONS.DUPLICATED_TRANSACTION); + + if (duplicateTransactionIDs.length > 0) { + optimisticViolations.push({ + ...duplicateViolation, + data: { + ...duplicateViolation.data, + duplicates: duplicateTransactionIDs, + }, + }); + } + + optimisticData.push({ + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${duplicateID}`, + value: optimisticViolations.length > 0 ? optimisticViolations : null, + }); + + failureData.push({ + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${duplicateID}`, + value: duplicateTransactionsViolations, + }); + }); + } + if (shouldDeleteTransactionThread) { optimisticData.push( // Use merge instead of set to avoid deleting the report too quickly, which could cause a brief "not found" page to appear. @@ -6909,14 +6960,6 @@ function deleteMoneyRequest(transactionID: string | undefined, reportAction: Ony }); } - const failureData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, - value: transaction ?? null, - }, - ]; - failureData.push({ onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,