From 1e97ed02144158e1246b1ea0285a1d82bdd9a632 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 19 Mar 2025 12:17:29 +0800 Subject: [PATCH 1/3] fix tax field shows for distance expense --- src/libs/actions/IOU.ts | 6 +++- src/pages/iou/SplitBillDetailsPage.tsx | 6 ++-- tests/actions/IOUTest.ts | 42 ++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 343e25e27ba0..4ebe28d5c6bf 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -5471,7 +5471,7 @@ function createSplitsAndOnyxData({ } // STEP 3: Build optimistic transaction - const oneOnOneTransaction = buildOptimisticTransaction({ + let oneOnOneTransaction = buildOptimisticTransaction({ originalTransactionID: splitTransaction.transactionID, transactionParams: { amount: isExpenseReport(oneOnOneIOUReport) ? -splitAmount : splitAmount, @@ -5489,6 +5489,10 @@ function createSplitsAndOnyxData({ }, }); + if (isDistanceRequest) { + oneOnOneTransaction = fastMerge(existingTransaction, oneOnOneTransaction, false); + } + // STEP 4: Build optimistic reportActions. We need: // 1. CREATED action for the chatReport // 2. CREATED action for the iouReport diff --git a/src/pages/iou/SplitBillDetailsPage.tsx b/src/pages/iou/SplitBillDetailsPage.tsx index 51ff19157b6a..83c20beeab99 100644 --- a/src/pages/iou/SplitBillDetailsPage.tsx +++ b/src/pages/iou/SplitBillDetailsPage.tsx @@ -21,7 +21,7 @@ import Parser from '@libs/Parser'; import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import {getTransactionDetails, isPolicyExpenseChat} from '@libs/ReportUtils'; import type {OptionData} from '@libs/ReportUtils'; -import {areRequiredFieldsEmpty, hasReceipt, isDistanceRequest, isReceiptBeingScanned} from '@libs/TransactionUtils'; +import {areRequiredFieldsEmpty, hasReceipt, isDistanceRequest as isDistanceRequestUtil, isReceiptBeingScanned} from '@libs/TransactionUtils'; import withReportAndReportActionOrNotFound from '@pages/home/report/withReportAndReportActionOrNotFound'; import type {WithReportAndReportActionOrNotFoundProps} from '@pages/home/report/withReportAndReportActionOrNotFound'; import variables from '@styles/variables'; @@ -66,6 +66,7 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag const isScanning = hasReceipt(transaction) && isReceiptBeingScanned(transaction); const hasSmartScanFailed = hasReceipt(transaction) && transaction?.receipt?.state === CONST.IOU.RECEIPT_STATE.SCANFAILED; const isEditingSplitBill = session?.accountID === actorAccountID && areRequiredFieldsEmpty(transaction); + const isDistanceRequest = isDistanceRequestUtil(transaction); const [isConfirmed, setIsConfirmed] = useState(false); const { @@ -107,7 +108,7 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag /> )} - + {!!participants.length && ( { }); expect(report?.lastVisibleActionCreated).toBe(iouAction?.created); }); + + it('optimistic transaction should be merged with the draft transaction if it is a distance request', async () => { + // Given a workspace expense chat and a draft split transaction + const workspaceReportID = '1'; + const transactionAmount = 100; + const draftTransaction = { + amount: transactionAmount, + currency: CONST.CURRENCY.USD, + merchant: 'test', + created: '', + iouRequestType: CONST.IOU.REQUEST_TYPE.DISTANCE, + }; + + await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true}); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`, draftTransaction); + + // When doing a distance split expense + splitBill({ + participants: [{reportID: workspaceReportID}], + currentUserLogin: RORY_EMAIL, + currentUserAccountID: RORY_ACCOUNT_ID, + existingSplitChatReportID: workspaceReportID, + ...draftTransaction, + comment: '', + }); + + await waitForBatchedUpdates(); + + const transaction = await new Promise>((resolve) => { + const connection = Onyx.connect({ + key: ONYXKEYS.COLLECTION.TRANSACTION, + waitForCollectionCallback: true, + callback: (transactions) => { + Onyx.disconnect(connection); + resolve(Object.values(transactions ?? {}).find((transaction) => transaction?.amount === -(transactionAmount / 2))); + }, + }); + }); + + // Then the data from the transaction draft should be merged into the optimistic transaction + expect(transaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE); + }); }); describe('payMoneyRequestElsewhere', () => { From 232d7391747da2a41e98e63cea99428897591d2a Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 19 Mar 2025 12:17:44 +0800 Subject: [PATCH 2/3] make it required --- src/components/MoneyRequestConfirmationList.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index df09363f79e3..2f66a1a5ec5a 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -140,7 +140,7 @@ type MoneyRequestConfirmationListProps = { transaction?: OnyxEntry; /** Whether the expense is a distance expense */ - isDistanceRequest?: boolean; + isDistanceRequest: boolean; /** Whether the expense is a per diem expense */ isPerDiemRequest?: boolean; @@ -184,7 +184,7 @@ function MoneyRequestConfirmationList({ onConfirm, iouType = CONST.IOU.TYPE.SUBMIT, iouAmount, - isDistanceRequest = false, + isDistanceRequest, isPerDiemRequest = false, isPolicyExpenseChat = false, iouCategory = '', From 8e4a07e9710aa83aaafc5ccff8fe22d707bb1e20 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 19 Mar 2025 12:24:16 +0800 Subject: [PATCH 3/3] lint --- 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 0e6291d24416..c2f5a2d24d4f 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -1893,7 +1893,7 @@ describe('actions/IOU', () => { await waitForBatchedUpdates(); - const transaction = await new Promise>((resolve) => { + const optimisticTransaction = await new Promise>((resolve) => { const connection = Onyx.connect({ key: ONYXKEYS.COLLECTION.TRANSACTION, waitForCollectionCallback: true, @@ -1905,7 +1905,7 @@ describe('actions/IOU', () => { }); // Then the data from the transaction draft should be merged into the optimistic transaction - expect(transaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE); + expect(optimisticTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE); }); });