From b7829f51d5994b9e72a4f94065c64c46fef8026d Mon Sep 17 00:00:00 2001 From: nkdengineer <161821005+nkdengineer@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:20:54 +0700 Subject: [PATCH 1/4] Revert "[CP Staging] Revert "fix: Incorrect split amount is allowed to save"" --- src/libs/ReportUtils.ts | 2 +- src/pages/iou/SplitExpensePage.tsx | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index ef94108d66e22..c78208999d084 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4543,7 +4543,7 @@ function getTransactionDetails( const report = getReportOrDraftReport(transaction?.reportID, undefined, 'report' in transaction ? transaction.report : undefined); const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction); - const isFromExpenseReport = !isEmptyObject(report) && isExpenseReport(report); + const isFromExpenseReport = (!isEmptyObject(report) && isExpenseReport(report)) || isPaidGroupPolicyPolicyUtils(policy); return { created: getFormattedCreated(transaction, createdDateFormat), diff --git a/src/pages/iou/SplitExpensePage.tsx b/src/pages/iou/SplitExpensePage.tsx index 16014b39df8bf..8a377b625fe20 100644 --- a/src/pages/iou/SplitExpensePage.tsx +++ b/src/pages/iou/SplitExpensePage.tsx @@ -45,7 +45,6 @@ import OnyxTabNavigator, {TabScreenWithFocusTrapWrapper, TopTab} from '@libs/Nav import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SplitExpenseParamList} from '@libs/Navigation/types'; import {isSplitAction} from '@libs/ReportSecondaryActionUtils'; -import type {TransactionDetails} from '@libs/ReportUtils'; import {getReportOrDraftReport, getTransactionDetails, isReportApproved, isSettled as isSettledReportUtils} from '@libs/ReportUtils'; import type {TranslationPathOrText} from '@libs/TransactionPreviewUtils'; import {getChildTransactions, isManagedCardTransaction, isPerDiemRequest} from '@libs/TransactionUtils'; @@ -99,12 +98,12 @@ function SplitExpensePage({route}: SplitExpensePageProps) { const isSplitAvailable = report && transaction && isSplitAction(currentReport, [transaction], originalTransaction, currentPolicy); - const transactionDetails = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); + const transactionDetails = getTransactionDetails(transaction, undefined, currentPolicy); const transactionDetailsAmount = transactionDetails?.amount ?? 0; const sumOfSplitExpenses = useMemo(() => (draftTransaction?.comment?.splitExpenses ?? []).reduce((acc, item) => acc + (item.amount ?? 0), 0), [draftTransaction?.comment?.splitExpenses]); const splitExpenses = useMemo(() => draftTransaction?.comment?.splitExpenses ?? [], [draftTransaction?.comment?.splitExpenses]); - const currencySymbol = currencyList?.[transactionDetails.currency ?? '']?.symbol ?? transactionDetails.currency ?? CONST.CURRENCY.USD; + const currencySymbol = currencyList?.[transactionDetails?.currency ?? '']?.symbol ?? transactionDetails?.currency ?? CONST.CURRENCY.USD; const isPerDiem = isPerDiemRequest(transaction); const isCard = isManagedCardTransaction(transaction); @@ -366,7 +365,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) { const footerContent = useMemo(() => { const shouldShowWarningMessage = sumOfSplitExpenses < transactionDetailsAmount; const warningMessage = shouldShowWarningMessage - ? translate('iou.totalAmountLessThanOriginal', {amount: convertToDisplayString(transactionDetailsAmount - sumOfSplitExpenses, transactionDetails.currency)}) + ? translate('iou.totalAmountLessThanOriginal', {amount: convertToDisplayString(transactionDetailsAmount - sumOfSplitExpenses, transactionDetails?.currency)}) : ''; return ( @@ -389,7 +388,19 @@ function SplitExpensePage({route}: SplitExpensePageProps) { /> ); - }, [sumOfSplitExpenses, transactionDetailsAmount, translate, transactionDetails.currency, errorMessage, styles.ph1, styles.mb2, styles.w100, styles.ph5, styles.pb5, onSaveSplitExpense]); + }, [ + sumOfSplitExpenses, + transactionDetailsAmount, + translate, + transactionDetails?.currency, + errorMessage, + styles.ph1, + styles.mb2, + styles.w100, + styles.ph5, + styles.pb5, + onSaveSplitExpense, + ]); const splitDatesTitle = useMemo(() => { const startDate = draftTransaction?.comment?.splitsStartDate; From 5ed22864e7b0605fb835b29d52e9ff37a3fa09c4 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 12 Jan 2026 14:57:18 +0700 Subject: [PATCH 2/4] correct test data --- tests/actions/IOUTest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index dd40d32e16302..9cbcc985a9c14 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -8344,7 +8344,7 @@ describe('actions/IOU', () => { it('should initialize split expense with correct transaction details', async () => { const transaction: Transaction = { transactionID: '123', - amount: 100, + amount: -100, currency: 'USD', merchant: 'Test Merchant', comment: { @@ -8428,7 +8428,7 @@ describe('actions/IOU', () => { it('should initialize split expense with correct VND currency amounts', async () => { const transaction: Transaction = { transactionID: '123', - amount: 1700, + amount: -1700, currency: 'VND', merchant: 'Test Merchant', comment: { From 9ccca3701fa46053079d6790965bb4a74912f79f Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 21 Jan 2026 16:16:56 +0700 Subject: [PATCH 3/4] correct test data --- src/pages/iou/SplitExpensePage.tsx | 2 +- tests/actions/IOUTest.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/SplitExpensePage.tsx b/src/pages/iou/SplitExpensePage.tsx index d5db21ca7b1ab..2c7f9ae5cda6d 100644 --- a/src/pages/iou/SplitExpensePage.tsx +++ b/src/pages/iou/SplitExpensePage.tsx @@ -47,7 +47,7 @@ import OnyxTabNavigator, {TabScreenWithFocusTrapWrapper, TopTab} from '@libs/Nav import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SplitExpenseParamList} from '@libs/Navigation/types'; import {isSplitAction} from '@libs/ReportSecondaryActionUtils'; -import {getReportOrDraftReport, getTransactionDetails, isReportApproved, isSettled as isSettledReportUtils } from '@libs/ReportUtils'; +import {getReportOrDraftReport, getTransactionDetails, isReportApproved, isSettled as isSettledReportUtils} from '@libs/ReportUtils'; import type {TransactionDetails} from '@libs/ReportUtils'; import type {TranslationPathOrText} from '@libs/TransactionPreviewUtils'; import {getChildTransactions, isManagedCardTransaction, isPerDiemRequest} from '@libs/TransactionUtils'; diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index bc1704579e727..2c96a19be6732 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -991,7 +991,7 @@ describe('actions/IOU', () => { const originalTransaction: Transaction = { ...createRandomTransaction(1), transactionID: 'original-transaction', - amount: 5000, + amount: -5000, currency: 'USD', }; From 25883b01f00e9131906bb9f0129e55ea08e60ebb Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 21 Jan 2026 16:39:14 +0700 Subject: [PATCH 4/4] fix test --- tests/actions/IOUTest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 2c96a19be6732..3148215b7b7ec 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -991,7 +991,7 @@ describe('actions/IOU', () => { const originalTransaction: Transaction = { ...createRandomTransaction(1), transactionID: 'original-transaction', - amount: -5000, + amount: 5000, currency: 'USD', }; @@ -1027,7 +1027,7 @@ describe('actions/IOU', () => { const draftTransaction = transactionDrafts?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${originalTransaction.transactionID}`]; expect(draftTransaction).toBeTruthy(); - expect(draftTransaction?.amount).toBe(originalTransaction.amount); + expect(draftTransaction?.amount).toBe(-originalTransaction.amount); expect(draftTransaction?.currency).toBe(originalTransaction.currency); expect(draftTransaction?.actionableWhisperReportActionID).toBe(reportActionID); expect(draftTransaction?.linkedTrackedExpenseReportID).toBe(selfDMReport.reportID);