From 852a70b47ae582d3ebe2aebeed1722cf5c3d0c23 Mon Sep 17 00:00:00 2001 From: VH Date: Fri, 24 Oct 2025 23:26:07 +0700 Subject: [PATCH 01/11] Remove openReport temporary solution by using transaction.reportName --- src/libs/MergeTransactionUtils.ts | 6 +++++- .../TransactionMerge/MergeTransactionsListContent.tsx | 8 -------- src/types/onyx/Transaction.ts | 3 +++ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/libs/MergeTransactionUtils.ts b/src/libs/MergeTransactionUtils.ts index 21c8f6d76b674..c1cfbd1c85c32 100644 --- a/src/libs/MergeTransactionUtils.ts +++ b/src/libs/MergeTransactionUtils.ts @@ -372,7 +372,11 @@ function getDisplayValue(field: MergeFieldKey, transaction: Transaction, transla return getCommaSeparatedTagNameWithSanitizedColons(SafeString(fieldValue)); } if (field === 'reportID') { - return fieldValue === CONST.REPORT.UNREPORTED_REPORT_ID ? translate('common.none') : getReportName(getReportOrDraftReport(SafeString(fieldValue))); + if (fieldValue === CONST.REPORT.UNREPORTED_REPORT_ID) { + return translate('common.none'); + } + + return transaction?.reportName ?? getReportName(getReportOrDraftReport(SafeString(fieldValue))); } if (field === 'attendees') { return Array.isArray(fieldValue) ? getAttendeesListDisplayString(fieldValue) : ''; diff --git a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx index 7178c6c648a23..99c24bf5c4ad6 100644 --- a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx +++ b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx @@ -24,7 +24,6 @@ import { import Navigation from '@libs/Navigation/Navigation'; import {getReportName, getReportOrDraftReport} from '@libs/ReportUtils'; import {getCreated} from '@libs/TransactionUtils'; -import {openReport} from '@userActions/Report'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -115,13 +114,6 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr return; } - // It's a temporary solution to ensure the source report is loaded, so we can display reportName in the merge transaction details page - // We plan to remove this in next phase of merge expenses project - const sourceReport = getReportOrDraftReport(sourceTransaction.reportID); - if (!sourceReport) { - openReport(sourceTransaction.reportID); - } - const {targetTransaction: newTargetTransaction, sourceTransaction: newSourceTransaction} = selectTargetAndSourceTransactionsForMerge(targetTransaction, sourceTransaction); if (shouldNavigateToReceiptReview([newTargetTransaction, newSourceTransaction])) { setMergeTransactionKey(transactionID, { diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index bbe5c4b9fcb09..a26eeeb8f5d66 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -478,6 +478,9 @@ type Transaction = OnyxCommon.OnyxValueWithOfflineFeedback< /** The iouReportID associated with the transaction */ reportID: string | undefined; + /** The name of iouReport associated with the transaction */ + reportName?: string; + /** Existing routes */ routes?: Routes; From b197d4cac086ed0c6d4f81049862aa03cfd147cf Mon Sep 17 00:00:00 2001 From: VH Date: Fri, 24 Oct 2025 23:27:11 +0700 Subject: [PATCH 02/11] Fix eslint --- src/pages/TransactionMerge/MergeTransactionsListContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx index 99c24bf5c4ad6..f125f593f2802 100644 --- a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx +++ b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx @@ -22,7 +22,7 @@ import { shouldNavigateToReceiptReview, } from '@libs/MergeTransactionUtils'; import Navigation from '@libs/Navigation/Navigation'; -import {getReportName, getReportOrDraftReport} from '@libs/ReportUtils'; +import {getReportName} from '@libs/ReportUtils'; import {getCreated} from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; From 6492861f82083387f0b4f779e4688175f55fedf0 Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 27 Oct 2025 10:58:10 +0700 Subject: [PATCH 03/11] refactor: move currency handling logic to getMergeFieldUpdatedValues - Extract currency handling logic from DetailsReviewPage into centralized function - Add MergeTransactionUpdateValues type for better type safety with null values - Update setMergeTransactionKey to handle null values for Onyx key clearing - Add comprehensive tests for merge field update scenarios - Improve code organization by centralizing field update logic --- src/libs/MergeTransactionUtils.ts | 22 +++++++++++- src/libs/actions/MergeTransaction.ts | 8 ++--- .../TransactionMerge/DetailsReviewPage.tsx | 7 ++-- src/types/onyx/MergeTransaction.ts | 4 +++ tests/unit/MergeTransactionUtilsTest.ts | 35 +++++++++++++++++++ 5 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/libs/MergeTransactionUtils.ts b/src/libs/MergeTransactionUtils.ts index c1cfbd1c85c32..cd79d28eabfc5 100644 --- a/src/libs/MergeTransactionUtils.ts +++ b/src/libs/MergeTransactionUtils.ts @@ -35,6 +35,9 @@ type MergeFieldData = { options: MergeFieldOption[]; }; +/** Type for merge transaction values that can be null to clear existing values in Onyx */ +type MergeTransactionUpdateValues = Partial>; + const MERGE_FIELD_TRANSLATION_KEYS = { amount: 'iou.amount', currency: 'iou.currency', @@ -430,6 +433,22 @@ function buildMergeFieldsData( }); } +/** + * Build updated values for merge transaction field selection + * Handles special cases like currency for amount field + */ +function getMergeFieldUpdatedValues(transaction: OnyxEntry, field: K, fieldValue: MergeTransaction[K]): MergeTransactionUpdateValues { + const updatedValues: MergeTransactionUpdateValues = { + [field]: fieldValue, + }; + + if (field === 'amount') { + updatedValues.currency = getCurrency(transaction); + } + + return updatedValues; +} + export { getSourceTransactionFromMergeTransaction, getTargetTransactionFromMergeTransaction, @@ -446,8 +465,9 @@ export { getDisplayValue, buildMergeFieldsData, getReportIDForExpense, + getMergeFieldUpdatedValues, getMergeFieldErrorText, MERGE_FIELDS, }; -export type {MergeFieldKey, MergeFieldData}; +export type {MergeFieldKey, MergeFieldData, MergeTransactionUpdateValues}; diff --git a/src/libs/actions/MergeTransaction.ts b/src/libs/actions/MergeTransaction.ts index 5ed6505d4a65e..3d5c9d3c81649 100644 --- a/src/libs/actions/MergeTransaction.ts +++ b/src/libs/actions/MergeTransaction.ts @@ -1,11 +1,11 @@ import {deepEqual} from 'fast-equals'; import Onyx from 'react-native-onyx'; -import type {OnyxCollection, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; +import type {OnyxCollection, OnyxEntry, OnyxMergeInput, OnyxUpdate} from 'react-native-onyx'; import * as API from '@libs/API'; import type {GetTransactionsForMergingParams} from '@libs/API/parameters'; import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; import {getMergeFieldValue, getTransactionThreadReportID, MERGE_FIELDS} from '@libs/MergeTransactionUtils'; -import type {MergeFieldKey} from '@libs/MergeTransactionUtils'; +import type {MergeFieldKey, MergeTransactionUpdateValues} from '@libs/MergeTransactionUtils'; import {isPaidGroupPolicy, isPolicyAdmin} from '@libs/PolicyUtils'; import {getIOUActionForReportID} from '@libs/ReportActionsUtils'; import { @@ -34,8 +34,8 @@ function setupMergeTransactionData(transactionID: string, values: Partial) { - Onyx.merge(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${transactionID}`, values); +function setMergeTransactionKey(transactionID: string, values: MergeTransactionUpdateValues) { + Onyx.merge(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${transactionID}`, values as OnyxMergeInput<`mergeTransaction_${string}`>); } /** diff --git a/src/pages/TransactionMerge/DetailsReviewPage.tsx b/src/pages/TransactionMerge/DetailsReviewPage.tsx index dc1ed159ca461..ce6df18a783b3 100644 --- a/src/pages/TransactionMerge/DetailsReviewPage.tsx +++ b/src/pages/TransactionMerge/DetailsReviewPage.tsx @@ -19,6 +19,7 @@ import { buildMergeFieldsData, getMergeableDataAndConflictFields, getMergeFieldErrorText, + getMergeFieldUpdatedValues, getMergeFieldValue, getSourceTransactionFromMergeTransaction, getTargetTransactionFromMergeTransaction, @@ -31,7 +32,6 @@ import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavig import type {MergeTransactionNavigatorParamList} from '@libs/Navigation/types'; import {getIOUActionForTransactionID} from '@libs/ReportActionsUtils'; import {getTransactionDetails} from '@libs/ReportUtils'; -import {getCurrency} from '@libs/TransactionUtils'; import {createTransactionThreadReport, openReport} from '@userActions/Report'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -151,9 +151,10 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) { // Update both the field value and track which transaction was selected (persisted in Onyx) const currentSelections = mergeTransaction?.selectedTransactionByField ?? {}; + const updatedValues = getMergeFieldUpdatedValues(transaction, field, fieldValue); + setMergeTransactionKey(transactionID, { - [field]: fieldValue, - ...(field === 'amount' && {currency: getCurrency(transaction)}), + ...updatedValues, selectedTransactionByField: { ...currentSelections, [field]: transaction.transactionID, diff --git a/src/types/onyx/MergeTransaction.ts b/src/types/onyx/MergeTransaction.ts index 1b6023585d9d5..279cc2e73de3f 100644 --- a/src/types/onyx/MergeTransaction.ts +++ b/src/types/onyx/MergeTransaction.ts @@ -56,4 +56,8 @@ type MergeTransaction = { attendees?: Attendee[]; }; +/** Type for merge transaction update values that supports null values for clearing Onyx keys */ +type MergeTransactionUpdateValues = Partial>; + export default MergeTransaction; +export type {MergeTransactionUpdateValues}; diff --git a/tests/unit/MergeTransactionUtilsTest.ts b/tests/unit/MergeTransactionUtilsTest.ts index 45becac876814..1d41a7a1b8d40 100644 --- a/tests/unit/MergeTransactionUtilsTest.ts +++ b/tests/unit/MergeTransactionUtilsTest.ts @@ -4,6 +4,7 @@ import { getMergeableDataAndConflictFields, getMergeFieldErrorText, getMergeFieldTranslationKey, + getMergeFieldUpdatedValues, getMergeFieldValue, getSourceTransactionFromMergeTransaction, isEmptyMergeValue, @@ -717,6 +718,40 @@ describe('MergeTransactionUtils', () => { }); }); + describe('getMergeFieldUpdatedValues', () => { + it('should return updated values with the field value for non-special fields', () => { + // Given a transaction and a basic field like merchant + const transaction = createRandomTransaction(0); + const fieldValue = 'New Merchant Name'; + + // When we get updated values for merchant field + const result = getMergeFieldUpdatedValues(transaction, 'merchant', fieldValue); + + // Then it should return an object with the field value + expect(result).toEqual({ + merchant: 'New Merchant Name', + }); + }); + + it('should include currency when field is amount', () => { + // Given a transaction with EUR currency + const transaction = { + ...createRandomTransaction(0), + currency: CONST.CURRENCY.EUR, + }; + const fieldValue = 2500; + + // When we get updated values for amount field + const result = getMergeFieldUpdatedValues(transaction, 'amount', fieldValue); + + // Then it should include both amount and currency + expect(result).toEqual({ + amount: 2500, + currency: CONST.CURRENCY.EUR, + }); + }); + }); + describe('getMergeFieldErrorText', () => { it('should return specific error message for attendees field', () => { // Given a merge field data object for attendees field From f5138733db2024bff5e511a3d38e8a3d69a45db8 Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 27 Oct 2025 11:18:42 +0700 Subject: [PATCH 04/11] feat: merge reportName and display in confirmation page - Add reportName handling to merge transaction flow - Update MoneyRequestView to support merged report names - Enhance MergeTransactionUtils with reportName merge logic - Add comprehensive tests for getMergeFieldUpdatedValues function - Improve confirmation page display for merged transactions --- .../ReportActionItem/MoneyRequestView.tsx | 10 ++++------ src/libs/MergeTransactionUtils.ts | 7 ++++++- src/types/onyx/MergeTransaction.ts | 3 +++ tests/unit/MergeTransactionUtilsTest.ts | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index e5e2d9beb1b04..0df8212558f68 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -32,7 +32,6 @@ import {isCategoryMissing} from '@libs/CategoryUtils'; import {convertToDisplayString} from '@libs/CurrencyUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; -import {getReportIDForExpense} from '@libs/MergeTransactionUtils'; import {hasEnabledOptions} from '@libs/OptionsListUtils'; import Parser from '@libs/Parser'; import {getLengthOfTag, getTagLists, hasDependentTags as hasDependentTagsPolicyUtils, isTaxTrackingEnabled} from '@libs/PolicyUtils'; @@ -44,7 +43,6 @@ import { canEditMoneyRequest, canUserPerformWriteAction as canUserPerformWriteActionReportUtils, getReportName, - getReportOrDraftReport, getTransactionDetails, getTripIDFromTransactionParentReportID, isInvoiceReport, @@ -614,9 +612,9 @@ function MoneyRequestView({ ); }); - const actualParentReport = isFromMergeTransaction ? getReportOrDraftReport(getReportIDForExpense(updatedTransaction)) : parentReport; - const shouldShowReport = !!parentReportID || !!actualParentReport; - const reportCopyValue = !canEditReport ? getReportName(actualParentReport) || actualParentReport?.reportName : undefined; + const reportNameToDisplay = isFromMergeTransaction ? updatedTransaction?.reportName : getReportName(parentReport) || parentReport?.reportName; + const shouldShowReport = !!parentReportID || (isFromMergeTransaction && !!reportNameToDisplay); + const reportCopyValue = !canEditReport ? reportNameToDisplay : undefined; // In this case we want to use this value. The shouldUseNarrowLayout will always be true as this case is handled when we display ReportScreen in RHP. // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth @@ -913,7 +911,7 @@ function MoneyRequestView({ , m created: mergeTransaction.created, modifiedCreated: mergeTransaction.created, reportID: mergeTransaction.reportID, + reportName: mergeTransaction.reportName, }; } @@ -435,7 +436,7 @@ function buildMergeFieldsData( /** * Build updated values for merge transaction field selection - * Handles special cases like currency for amount field + * Handles special cases like currency for amount field, reportID */ function getMergeFieldUpdatedValues(transaction: OnyxEntry, field: K, fieldValue: MergeTransaction[K]): MergeTransactionUpdateValues { const updatedValues: MergeTransactionUpdateValues = { @@ -446,6 +447,10 @@ function getMergeFieldUpdatedValues(transaction: OnyxEn updatedValues.currency = getCurrency(transaction); } + if (field === 'reportID') { + updatedValues.reportName = transaction?.reportName ?? getReportName(getReportOrDraftReport(getReportIDForExpense(transaction))); + } + return updatedValues; } diff --git a/src/types/onyx/MergeTransaction.ts b/src/types/onyx/MergeTransaction.ts index 279cc2e73de3f..a93fcee134e30 100644 --- a/src/types/onyx/MergeTransaction.ts +++ b/src/types/onyx/MergeTransaction.ts @@ -52,6 +52,9 @@ type MergeTransaction = { /** The report ID of the transaction */ reportID: string; + /** The report name of the transaction */ + reportName: string; + /** The attendees of the transaction */ attendees?: Attendee[]; }; diff --git a/tests/unit/MergeTransactionUtilsTest.ts b/tests/unit/MergeTransactionUtilsTest.ts index 1d41a7a1b8d40..c3a3501c0bfb9 100644 --- a/tests/unit/MergeTransactionUtilsTest.ts +++ b/tests/unit/MergeTransactionUtilsTest.ts @@ -750,6 +750,25 @@ describe('MergeTransactionUtils', () => { currency: CONST.CURRENCY.EUR, }); }); + + it('should include reportName when field is reportID', () => { + // Given a transaction with a reportID and reportName + const transaction = { + ...createRandomTransaction(0), + reportID: '123', + reportName: 'Test Report', + }; + const fieldValue = '456'; + + // When we get updated values for reportID field + const result = getMergeFieldUpdatedValues(transaction, 'reportID', fieldValue); + + // Then it should include both reportID and reportName + expect(result).toEqual({ + reportID: '456', + reportName: 'Test Report', + }); + }); }); describe('getMergeFieldErrorText', () => { From beb322bc3f9f1741cab0faa652df610eb4a6ed0b Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 27 Oct 2025 11:19:48 +0700 Subject: [PATCH 05/11] Revert changes --- src/types/onyx/MergeTransaction.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/types/onyx/MergeTransaction.ts b/src/types/onyx/MergeTransaction.ts index a93fcee134e30..1710628084e97 100644 --- a/src/types/onyx/MergeTransaction.ts +++ b/src/types/onyx/MergeTransaction.ts @@ -59,8 +59,4 @@ type MergeTransaction = { attendees?: Attendee[]; }; -/** Type for merge transaction update values that supports null values for clearing Onyx keys */ -type MergeTransactionUpdateValues = Partial>; - export default MergeTransaction; -export type {MergeTransactionUpdateValues}; From b7e9fbb518aadc32a061c28d991b119d4433a54c Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 27 Oct 2025 11:35:22 +0700 Subject: [PATCH 06/11] Fix type errors --- src/libs/DebugUtils.ts | 2 ++ tests/utils/collections/mergeTransaction.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/src/libs/DebugUtils.ts b/src/libs/DebugUtils.ts index 3fd01df806f38..ea48435e4fa25 100644 --- a/src/libs/DebugUtils.ts +++ b/src/libs/DebugUtils.ts @@ -924,6 +924,7 @@ function validateTransactionDraftProperty(key: keyof Transaction, value: string) } switch (key) { case 'reportID': + case 'reportName': case 'currency': case 'tag': case 'category': @@ -1048,6 +1049,7 @@ function validateTransactionDraftProperty(key: keyof Transaction, value: string) participants: CONST.RED_BRICK_ROAD_PENDING_ACTION, receipt: CONST.RED_BRICK_ROAD_PENDING_ACTION, reportID: CONST.RED_BRICK_ROAD_PENDING_ACTION, + reportName: CONST.RED_BRICK_ROAD_PENDING_ACTION, routes: CONST.RED_BRICK_ROAD_PENDING_ACTION, transactionID: CONST.RED_BRICK_ROAD_PENDING_ACTION, tag: CONST.RED_BRICK_ROAD_PENDING_ACTION, diff --git a/tests/utils/collections/mergeTransaction.ts b/tests/utils/collections/mergeTransaction.ts index dd45e28fa951b..938720a013235 100644 --- a/tests/utils/collections/mergeTransaction.ts +++ b/tests/utils/collections/mergeTransaction.ts @@ -23,5 +23,6 @@ export default function createRandomMergeTransaction(index: number): MergeTransa receipt: {}, created: format(randPastDate(), CONST.DATE.FNS_DB_FORMAT_STRING), reportID: index.toString(), + reportName: randWord(), }; } From 1109c315c086577f547745bb4be03ce865cd4469 Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 27 Oct 2025 12:56:21 +0700 Subject: [PATCH 07/11] Fix failed spec --- tests/unit/MergeTransactionUtilsTest.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/MergeTransactionUtilsTest.ts b/tests/unit/MergeTransactionUtilsTest.ts index c3a3501c0bfb9..2bc081ca49ce1 100644 --- a/tests/unit/MergeTransactionUtilsTest.ts +++ b/tests/unit/MergeTransactionUtilsTest.ts @@ -509,6 +509,7 @@ describe('MergeTransactionUtils', () => { receipt: {receiptID: 1235, source: 'merged.jpg', filename: 'merged.jpg'}, created: '2025-01-02T00:00:00.000Z', reportID: '1', + reportName: 'Test Report', }; const result = buildMergedTransactionData(targetTransaction, mergeTransaction); @@ -534,6 +535,7 @@ describe('MergeTransactionUtils', () => { created: '2025-01-02T00:00:00.000Z', modifiedCreated: '2025-01-02T00:00:00.000Z', reportID: '1', + reportName: 'Test Report', }); }); }); From 0a8e670073041467a6d965dc66584a23d298c71b Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 27 Oct 2025 15:53:16 +0700 Subject: [PATCH 08/11] Add spec of getDisplayValue for reportID --- tests/unit/MergeTransactionUtilsTest.ts | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/unit/MergeTransactionUtilsTest.ts b/tests/unit/MergeTransactionUtilsTest.ts index 2bc081ca49ce1..9b2d4aa7be6ef 100644 --- a/tests/unit/MergeTransactionUtilsTest.ts +++ b/tests/unit/MergeTransactionUtilsTest.ts @@ -1,3 +1,4 @@ +import Onyx from 'react-native-onyx'; import { buildMergedTransactionData, getDisplayValue, @@ -13,14 +14,22 @@ import { } from '@libs/MergeTransactionUtils'; import {getTransactionDetails} from '@libs/ReportUtils'; import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; import createRandomMergeTransaction from '../utils/collections/mergeTransaction'; +import {createRandomReport} from '../utils/collections/reports'; import createRandomTransaction from '../utils/collections/transaction'; import {translateLocal} from '../utils/TestHelper'; +import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; // Mock localeCompare function for tests const mockLocaleCompare = (a: string, b: string) => a.localeCompare(b); describe('MergeTransactionUtils', () => { + beforeAll(() => { + Onyx.init({keys: ONYXKEYS}); + return waitForBatchedUpdates(); + }); + describe('getSourceTransactionFromMergeTransaction', () => { it('should return undefined when mergeTransaction is undefined', () => { // Given a null merge transaction @@ -718,6 +727,61 @@ describe('MergeTransactionUtils', () => { expect(merchantResult).toBe('Starbucks Coffee'); expect(categoryResult).toBe('Food & Dining'); }); + + it('should return "None" for unreported reportID', () => { + // Given a transaction with unreported reportID + const transaction = { + ...createRandomTransaction(0), + reportID: CONST.REPORT.UNREPORTED_REPORT_ID, + }; + + // When we get display value for reportID + const result = getDisplayValue('reportID', transaction, translateLocal); + + // Then it should return translated "None" + expect(result).toBe('common.none'); + }); + + it("should return transation's reportName when available for reportID", () => { + // Given a transaction with reportID and reportName + const transaction = { + ...createRandomTransaction(0), + reportID: '123', + reportName: 'Test Report Name', + }; + + // When we get display value for reportID + const result = getDisplayValue('reportID', transaction, translateLocal); + + // Then it should return the reportName + expect(result).toBe('Test Report Name'); + }); + + fit("should return report's name when no reportName available on transaction", async () => { + // Given a random report + const reportID = 456; + const report = { + ...createRandomReport(reportID), + reportName: 'Test Report Name', + }; + + // Store the report in Onyx + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report); + await waitForBatchedUpdates(); + + // Given a transaction with reportID but no reportName + const transaction = { + ...createRandomTransaction(0), + reportID: report.reportID, + reportName: undefined, + }; + + // When we get display value for reportID + const result = getDisplayValue('reportID', transaction, translateLocal); + + // Then it should return the report's name from Onyx + expect(result).toBe(report.reportName); + }); }); describe('getMergeFieldUpdatedValues', () => { From 5f58e12493e3b3b74f06bcff2a6f3533c08e01ab Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 27 Oct 2025 16:09:45 +0700 Subject: [PATCH 09/11] Fix spellcheck --- tests/unit/MergeTransactionUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/MergeTransactionUtilsTest.ts b/tests/unit/MergeTransactionUtilsTest.ts index 9b2d4aa7be6ef..bc44de340365d 100644 --- a/tests/unit/MergeTransactionUtilsTest.ts +++ b/tests/unit/MergeTransactionUtilsTest.ts @@ -742,7 +742,7 @@ describe('MergeTransactionUtils', () => { expect(result).toBe('common.none'); }); - it("should return transation's reportName when available for reportID", () => { + it("should return transaction's reportName when available for reportID", () => { // Given a transaction with reportID and reportName const transaction = { ...createRandomTransaction(0), From 51da8e90fdbd119af7ff99cb6349c96a357db143 Mon Sep 17 00:00:00 2001 From: Vinh Hoang Date: Fri, 31 Oct 2025 07:04:33 +0700 Subject: [PATCH 10/11] Update suggestion Co-authored-by: Dominic <165644294+dominictb@users.noreply.github.com> --- src/libs/actions/MergeTransaction.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/MergeTransaction.ts b/src/libs/actions/MergeTransaction.ts index 3d5c9d3c81649..b77db2fbe15f5 100644 --- a/src/libs/actions/MergeTransaction.ts +++ b/src/libs/actions/MergeTransaction.ts @@ -35,7 +35,7 @@ function setupMergeTransactionData(transactionID: string, values: Partial); + Onyx.merge(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${transactionID}`, values as OnyxMergeInput<`${typeof ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${string}`>); } /** From 499b1851325156fe93a9ead365ac5bf8ae982fbe Mon Sep 17 00:00:00 2001 From: VH Date: Fri, 31 Oct 2025 17:50:24 +0700 Subject: [PATCH 11/11] Fix linter --- tests/unit/MergeTransactionUtilsTest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/MergeTransactionUtilsTest.ts b/tests/unit/MergeTransactionUtilsTest.ts index bc44de340365d..68a5f1d4d4416 100644 --- a/tests/unit/MergeTransactionUtilsTest.ts +++ b/tests/unit/MergeTransactionUtilsTest.ts @@ -757,11 +757,11 @@ describe('MergeTransactionUtils', () => { expect(result).toBe('Test Report Name'); }); - fit("should return report's name when no reportName available on transaction", async () => { + it("should return report's name when no reportName available on transaction", async () => { // Given a random report const reportID = 456; const report = { - ...createRandomReport(reportID), + ...createRandomReport(reportID, undefined), reportName: 'Test Report Name', };