From 39208f3ec0dbdf10e776331b0b59532f2c2f6ae1 Mon Sep 17 00:00:00 2001 From: nkdengineer <161821005+nkdengineer@users.noreply.github.com> Date: Wed, 31 Dec 2025 10:44:42 +0700 Subject: [PATCH 1/3] Revert "[CP Staging] Revert PR #78471 - add converted amount to expense thread" --- src/components/ReportActionItem/MoneyRequestView.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 2c152e26e04b..78d199561acc 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -461,6 +461,12 @@ function MoneyRequestView({ if (isExpenseSplit) { amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.split')}`; } + if (currency !== moneyRequestReport?.currency && !isManagedCardTransaction) { + const convertedAmount = isPaidGroupPolicy(moneyRequestReport) ? -(transaction?.convertedAmount ?? 0) : (transaction?.convertedAmount ?? 0); + if (convertedAmount) { + amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('common.converted')} ${convertToDisplayString(convertedAmount, moneyRequestReport?.currency)}`; + } + } if (isFromMergeTransaction) { // Because we lack the necessary data in policy.customUnits to determine the rate in merge flow, From ac8a587d398324b3b38b3ae5a30ba25328e7c5c5 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 31 Dec 2025 11:00:16 +0700 Subject: [PATCH 2/3] create getConvertedAmount util --- .../ReportActionItem/MoneyRequestView.tsx | 8 +++--- src/libs/ReportUtils.ts | 3 +++ src/libs/TransactionUtils/index.ts | 26 +++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 78d199561acc..26963e832a31 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -267,6 +267,7 @@ function MoneyRequestView({ tag: transactionTag, originalCurrency: transactionOriginalCurrency, postedDate: transactionPostedDate, + convertedAmount: transactionConvertedAmount, } = getTransactionDetails(transaction, undefined, undefined, allowNegativeAmount, false, currentUserPersonalDetails) ?? {}; const isEmptyMerchant = transactionMerchant === '' || transactionMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT; const isDistanceRequest = isDistanceRequestTransactionUtils(transaction); @@ -461,10 +462,9 @@ function MoneyRequestView({ if (isExpenseSplit) { amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.split')}`; } - if (currency !== moneyRequestReport?.currency && !isManagedCardTransaction) { - const convertedAmount = isPaidGroupPolicy(moneyRequestReport) ? -(transaction?.convertedAmount ?? 0) : (transaction?.convertedAmount ?? 0); - if (convertedAmount) { - amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('common.converted')} ${convertToDisplayString(convertedAmount, moneyRequestReport?.currency)}`; + if (currency !== moneyRequestReport?.currency && !isManagedCardTransaction && transaction?.reportID !== CONST.REPORT.UNREPORTED_REPORT_ID) { + if (transactionConvertedAmount) { + amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('common.converted')} ${convertToDisplayString(transactionConvertedAmount, moneyRequestReport?.currency)}`; } } diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 568c30bfad92..8687f86f1544 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -272,6 +272,7 @@ import { getCardID, getCardName, getCategory, + getConvertedAmount, getCurrency, getDescription, getFormattedCreated, @@ -769,6 +770,7 @@ type TransactionDetails = { postedDate: string; transactionID: string; distance?: number; + convertedAmount: number; }; type OptimisticIOUReport = Pick< @@ -4578,6 +4580,7 @@ function getTransactionDetails( cardName: getCardName(transaction), originalAmount: getOriginalAmount(transaction), originalCurrency: getOriginalCurrency(transaction), + convertedAmount: getConvertedAmount(transaction, isFromExpenseReport, transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID, allowNegativeAmount, disableOppositeConversion), postedDate: getFormattedPostedDate(transaction), transactionID: transaction.transactionID, ...(isManualDistanceRequest && {distance: transaction.comment?.customUnit?.quantity ?? undefined}), diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 59a9b7d19204..005e072d0b97 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -844,6 +844,31 @@ function getOriginalAmount(transaction: Transaction): number { return Math.abs(amount); } +function getConvertedAmount( + transaction: OnyxInputOrEntry, + isFromExpenseReport = false, + isFromTrackedExpense = false, + allowNegative = false, + disableOppositeConversion = false, +): number { + // IOU requests cannot have negative values, but they can be stored as negative values, let's return absolute value + if (!isFromExpenseReport && !isFromTrackedExpense && !allowNegative) { + return Math.abs(transaction?.convertedAmount ?? 0); + } + + if (disableOppositeConversion) { + return transaction?.convertedAmount ?? 0; + } + + // Expense report case: + // The amounts are stored using an opposite sign and negative values can be set, + // we need to return an opposite sign than is saved in the transaction object + const convertedAmount = transaction?.convertedAmount ?? 0; + + // To avoid -0 being shown, lets only change the sign if the value is other than 0. + return convertedAmount ? -convertedAmount : 0; +} + /** * Return the original amount for display/sorting purposes. * For expense reports, returns the negated value of (originalAmount || amount || modifiedAmount). @@ -2560,6 +2585,7 @@ export { shouldReuseInitialTransaction, getOriginalAmountForDisplay, getOriginalCurrencyForDisplay, + getConvertedAmount, }; export type {TransactionChanges}; From af135d26188e448cc3ffe09681dd0b799f12ac06 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 31 Dec 2025 11:09:13 +0700 Subject: [PATCH 3/3] fix typescript --- tests/unit/ReportSecondaryActionUtilsTest.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/ReportSecondaryActionUtilsTest.ts b/tests/unit/ReportSecondaryActionUtilsTest.ts index 1ca8144ee897..0e7a944f4cd6 100644 --- a/tests/unit/ReportSecondaryActionUtilsTest.ts +++ b/tests/unit/ReportSecondaryActionUtilsTest.ts @@ -2631,6 +2631,7 @@ describe('getSecondaryTransactionThreadActions', () => { originalCurrency: 'USD', postedDate: '2025-01-01', cardID: 1, + convertedAmount: -100, }); jest.spyOn(ReportUtils, 'isMoneyRequestReportEligibleForMerge').mockReturnValue(true); @@ -2683,6 +2684,7 @@ describe('getSecondaryTransactionThreadActions', () => { originalCurrency: 'USD', postedDate: '2025-01-01', cardID: 1, + convertedAmount: 100, }); jest.spyOn(ReportUtils, 'isMoneyRequestReportEligibleForMerge').mockReturnValue(true);