From f907dc97898b6bf9e95800df0a9302d057097140 Mon Sep 17 00:00:00 2001 From: MobileMage Date: Sat, 31 Jan 2026 01:56:19 +0100 Subject: [PATCH] Fix duplicate review tax code page showing no options across workspaces Use threadReportID directly in ReviewTaxCode (consistent with other review pages) and derive the policy from the kept transaction's workspace for correct tax lookups. Merge thread transaction's duplicate list in TransactionPreview to ensure cross-workspace duplicates are fully represented in the review flow. --- .../ReportActionItem/TransactionPreview/index.tsx | 14 +++++++++++--- src/pages/TransactionDuplicate/ReviewTaxCode.tsx | 4 ++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/ReportActionItem/TransactionPreview/index.tsx b/src/components/ReportActionItem/TransactionPreview/index.tsx index 86f58da2c425f..2dea3cfc8d5d4 100644 --- a/src/components/ReportActionItem/TransactionPreview/index.tsx +++ b/src/components/ReportActionItem/TransactionPreview/index.tsx @@ -15,7 +15,7 @@ import Navigation from '@libs/Navigation/Navigation'; import {getOriginalMessage, isMoneyRequestAction as isMoneyRequestActionReportActionsUtils} from '@libs/ReportActionsUtils'; import {getTransactionDetails} from '@libs/ReportUtils'; import {getReviewNavigationRoute} from '@libs/TransactionPreviewUtils'; -import {getExpenseTypeTranslationKey, getOriginalTransactionWithSplitInfo, getTransactionType, removeSettledAndApprovedTransactions} from '@libs/TransactionUtils'; +import {getExpenseTypeTranslationKey, getOriginalTransactionWithSplitInfo, getTransactionID, getTransactionType, removeSettledAndApprovedTransactions} from '@libs/TransactionUtils'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {TransactionDuplicateNavigatorParamList} from '@navigation/types'; import {clearWalletTermsError} from '@userActions/PaymentMethods'; @@ -59,6 +59,13 @@ function TransactionPreview(props: TransactionPreviewProps) { const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`]; const personalDetails = usePersonalDetails(); + // Load thread transaction's complete duplicate list for cross-workspace comparison + const threadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`]; + const threadViolations = useTransactionViolations(getTransactionID(threadReport)); + const [threadDuplicates] = useTransactionsByID( + useMemo(() => threadViolations?.find((v) => v.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION)?.data?.duplicates ?? [], [threadViolations]), + ); + // Get transaction violations for given transaction id from onyx, find duplicated transactions violations and get duplicates const allDuplicateIDs = useMemo(() => violations?.find((violation) => violation.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION)?.data?.duplicates ?? [], [violations]); const [allDuplicates] = useTransactionsByID(allDuplicateIDs); @@ -82,8 +89,9 @@ function TransactionPreview(props: TransactionPreviewProps) { }, [chatReportID]); const navigateToReviewFields = useCallback(() => { - Navigation.navigate(getReviewNavigationRoute(Navigation.getActiveRoute(), route.params?.threadReportID, transaction, duplicates, policyCategories, transactionReport)); - }, [route.params?.threadReportID, transaction, duplicates, policyCategories, transactionReport]); + const allDuplicateTransactions = [...duplicates, ...(threadDuplicates ?? [])]; + Navigation.navigate(getReviewNavigationRoute(Navigation.getActiveRoute(), route.params?.threadReportID, transaction, allDuplicateTransactions, policyCategories, transactionReport)); + }, [route.params?.threadReportID, transaction, duplicates, threadDuplicates, policyCategories, transactionReport]); const transactionPreview = transaction; diff --git a/src/pages/TransactionDuplicate/ReviewTaxCode.tsx b/src/pages/TransactionDuplicate/ReviewTaxCode.tsx index da9c2740b030a..94c802d5ac39a 100644 --- a/src/pages/TransactionDuplicate/ReviewTaxCode.tsx +++ b/src/pages/TransactionDuplicate/ReviewTaxCode.tsx @@ -24,8 +24,7 @@ function ReviewTaxRate() { const route = useRoute>(); const {translate} = useLocalize(); const [reviewDuplicates] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES, {canBeMissing: true}); - const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reviewDuplicates?.reportID ?? route.params.threadReportID}`, {canBeMissing: true}); - const policy = usePolicy(report?.policyID); + const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`, {canBeMissing: true}); const transactionID = getTransactionID(report); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {canBeMissing: true}); const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, { @@ -38,6 +37,7 @@ function ReviewTaxRate() { const [allDuplicates] = useTransactionsByID(allDuplicateIDs); const [reviewDuplicatesReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(reviewDuplicates?.reportID)}`, {canBeMissing: true}); const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getNonEmptyStringOnyxID(reviewDuplicatesReport?.policyID)}`, {canBeMissing: true}); + const policy = usePolicy(reviewDuplicatesReport?.policyID); const compareResult = compareDuplicateTransactionFields(transaction, allDuplicates, reviewDuplicatesReport, undefined, policyCategories); const stepNames = Object.keys(compareResult.change ?? {}).map((key, index) => (index + 1).toString());