Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ type MoneyRequestConfirmationListProps = {
transaction?: OnyxEntry<OnyxTypes.Transaction>;

/** Whether the expense is a distance expense */
isDistanceRequest?: boolean;
isDistanceRequest: boolean;

/** Whether the expense is a per diem expense */
isPerDiemRequest?: boolean;
Expand Down Expand Up @@ -184,7 +184,7 @@ function MoneyRequestConfirmationList({
onConfirm,
iouType = CONST.IOU.TYPE.SUBMIT,
iouAmount,
isDistanceRequest = false,
isDistanceRequest,
isPerDiemRequest = false,
isPolicyExpenseChat = false,
iouCategory = '',
Expand Down
6 changes: 5 additions & 1 deletion src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down
6 changes: 4 additions & 2 deletions src/pages/iou/SplitBillDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -107,7 +108,7 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag
/>
</View>
)}
<ImageBehaviorContextProvider shouldSetAspectRatioInStyle={!isDistanceRequest(transaction)}>
<ImageBehaviorContextProvider shouldSetAspectRatioInStyle={!isDistanceRequest}>
{!!participants.length && (
<MoneyRequestConfirmationList
payeePersonalDetails={payeePersonalDetails}
Expand All @@ -125,6 +126,7 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag
shouldShowSmartScanFields
receiptPath={transaction?.receipt?.source}
receiptFilename={transaction?.filename}
isDistanceRequest={isDistanceRequest}
isEditingSplitBill={isEditingSplitBill}
hasSmartScanFailed={hasSmartScanFailed}
reportID={reportID}
Expand Down
42 changes: 42 additions & 0 deletions tests/actions/IOUTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1865,6 +1865,48 @@ describe('actions/IOU', () => {
});
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 optimisticTransaction = await new Promise<OnyxEntry<Transaction>>((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(optimisticTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE);
});
});

describe('payMoneyRequestElsewhere', () => {
Expand Down