Skip to content
Merged
17 changes: 15 additions & 2 deletions src/components/MoneyReportHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ import {
isExported as isExportedUtils,
isInvoiceReport as isInvoiceReportUtil,
isOpenExpenseReport,
isOpenReport,
isProcessingReport,
isReportOwner,
navigateOnDeleteExpense,
Expand All @@ -97,6 +98,7 @@ import {
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
import {
allHavePendingRTERViolation,
getChildTransactions,
getOriginalTransactionWithSplitInfo,
hasCustomUnitOutOfPolicyViolation as hasCustomUnitOutOfPolicyViolationTransactionUtils,
hasDuplicateTransactions,
Expand Down Expand Up @@ -367,6 +369,17 @@ function MoneyReportHeader({
const theme = useTheme();
const {isOffline} = useNetwork();
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction);
const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION);
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT);
const hasMultipleSplits = useMemo(() => {
if (!transaction?.comment?.originalTransactionID) {
return false;
}
const children = getChildTransactions(allTransactions, allReports, transaction.comment.originalTransactionID);
return children.length > 1;
}, [allTransactions, allReports, transaction?.comment?.originalTransactionID]);
const isReportOpen = isOpenReport(moneyRequestReport);
const shouldShowSplitIndicator = isExpenseSplit && (hasMultipleSplits || isReportOpen);

const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const [isDuplicateActive, temporarilyDisableDuplicateAction] = useThrottledButtonState();
Expand Down Expand Up @@ -1409,7 +1422,7 @@ function MoneyReportHeader({
},
},
[CONST.REPORT.SECONDARY_ACTIONS.SPLIT]: {
text: isExpenseSplit ? translate('iou.editSplits') : translate('iou.split'),
text: shouldShowSplitIndicator ? translate('iou.editSplits') : translate('iou.split'),
icon: expensifyIcons.ArrowSplit,
value: CONST.REPORT.SECONDARY_ACTIONS.SPLIT,
sentryLabel: CONST.SENTRY_LABEL.MORE_MENU.SPLIT,
Expand Down Expand Up @@ -1776,7 +1789,7 @@ function MoneyReportHeader({
}
return option;
});
}, [originalSelectedTransactionsOptions, showDeleteModal, dismissedRejectUseExplanation]);
}, [originalSelectedTransactionsOptions, showDeleteModal, dismissedRejectUseExplanation, isDelegateAccessRestricted, showDelegateNoAccessModal]);

const shouldShowSelectedTransactionsButton = !!selectedTransactionsOptions.length && !transactionThreadReportID;

Expand Down
12 changes: 11 additions & 1 deletion src/components/MoneyRequestHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import {
getPolicyExpenseChat,
isCurrentUserSubmitter,
isDM,
isOpenReport,
isSelfDM,
navigateToDetailsPage,
rejectMoneyRequestReason,
Expand All @@ -51,6 +52,7 @@ import {getReviewNavigationRoute} from '@libs/TransactionPreviewUtils';
import {
getOriginalTransactionWithSplitInfo,
hasCustomUnitOutOfPolicyViolation as hasCustomUnitOutOfPolicyViolationTransactionUtils,
hasMultipleSplitChildren,
hasPendingRTERViolation as hasPendingRTERViolationTransactionUtils,
isDuplicate as isDuplicateTransactionUtils,
isExpensifyCardTransaction,
Expand Down Expand Up @@ -163,6 +165,14 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
const {currentSearchHash} = useSearchStateContext();
const {removeTransaction} = useSearchActionsContext();
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction);
const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION);
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT);
const hasMultipleSplits = useMemo(
() => hasMultipleSplitChildren(allTransactions, allReports, transaction?.comment?.originalTransactionID),
[allTransactions, allReports, transaction?.comment?.originalTransactionID],
);
const isReportOpen = isOpenReport(parentReport);
const shouldShowSplitIndicator = isExpenseSplit && (hasMultipleSplits || isReportOpen);
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST);
const [transactionDrafts] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, {selector: validTransactionDraftsSelector});
const draftTransactionIDs = Object.keys(transactionDrafts ?? {});
Expand Down Expand Up @@ -464,7 +474,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
},
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT]: {
text: isExpenseSplit ? translate('iou.editSplits') : translate('iou.split'),
text: shouldShowSplitIndicator ? translate('iou.editSplits') : translate('iou.split'),
icon: expensifyIcons.ArrowSplit,
value: CONST.REPORT.SECONDARY_ACTIONS.SPLIT,
onSelected: () => {
Expand Down
18 changes: 14 additions & 4 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {Str} from 'expensify-common';
import React, {useCallback, useState} from 'react';
import React, {useCallback, useMemo, useState} from 'react';
import {View} from 'react-native';
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
Expand Down Expand Up @@ -69,6 +69,7 @@ import {
getTripIDFromTransactionParentReportID,
isExpenseReport,
isInvoiceReport,
isOpenReport,
isPaidGroupPolicy,
isReportApproved,
isReportInGroupPolicy,
Expand All @@ -90,6 +91,7 @@ import {
getTagForDisplay,
getTaxName,
hasMissingSmartscanFields,
hasMultipleSplitChildren,
hasReservationList,
hasRoute as hasRouteTransactionUtils,
isFromCreditCardImport as isCardTransactionTransactionUtils,
Expand Down Expand Up @@ -329,6 +331,14 @@ function MoneyRequestView({
const [originalTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transaction?.comment?.originalTransactionID)}`);
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction);
const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`);
const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION);
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT);
const hasMultipleSplits = useMemo(
() => hasMultipleSplitChildren(allTransactions, allReports, transaction?.comment?.originalTransactionID),
[allTransactions, allReports, transaction?.comment?.originalTransactionID],
);
const isReportOpen = isOpenReport(moneyRequestReport);
const shouldShowSplitIndicator = isExpenseSplit && (hasMultipleSplits || isReportOpen);
const isSplitAvailable =
moneyRequestReport &&
transaction &&
Expand All @@ -338,7 +348,7 @@ function MoneyRequestView({
const canEditAmount =
!isGPSDistanceRequest &&
isEditable &&
(canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.AMOUNT, undefined, isChatReportArchived) || (isExpenseSplit && isSplitAvailable));
(canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.AMOUNT, undefined, isChatReportArchived) || (shouldShowSplitIndicator && isSplitAvailable));
const canEditMerchant =
isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.MERCHANT, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy);

Expand Down Expand Up @@ -505,7 +515,7 @@ function MoneyRequestView({
} else if (shouldShowPaid) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.settledExpensify')}`;
}
if (isExpenseSplit) {
if (shouldShowSplitIndicator) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.split')}`;
}
if (shouldShowConvertedAmount) {
Expand Down Expand Up @@ -836,7 +846,7 @@ function MoneyRequestView({
return;
}

if (isExpenseSplit && isSplitAvailable) {
if (shouldShowSplitIndicator && isSplitAvailable) {
initSplitExpense(transaction, policy);
return;
}
Expand Down
11 changes: 11 additions & 0 deletions src/libs/TransactionUtils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2702,6 +2702,16 @@ function getChildTransactions(transactions: OnyxCollection<Transaction>, reports
});
}

/**
* Checks if a split transaction has more than one child transaction.
*/
function hasMultipleSplitChildren(transactions: OnyxCollection<Transaction>, reports: OnyxCollection<Report>, originalTransactionID: string | undefined): boolean {
if (!originalTransactionID) {
return false;
}
return getChildTransactions(transactions, reports, originalTransactionID).length > 1;
}

/**
* Determines whether a report should display the expense breakdown.
*/
Expand Down Expand Up @@ -2902,6 +2912,7 @@ export {
getTransactionPendingAction,
isTransactionPendingDelete,
getChildTransactions,
hasMultipleSplitChildren,
createUnreportedExpenses,
isDemoTransaction,
shouldShowViolation,
Expand Down
11 changes: 7 additions & 4 deletions src/libs/actions/SplitExpenses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {calculateAmount} from '@libs/IOUUtils';
import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
import Navigation from '@libs/Navigation/Navigation';
import {rand64} from '@libs/NumberUtils';
import {getTransactionDetails} from '@libs/ReportUtils';
import {getTransactionDetails, isOpenReport} from '@libs/ReportUtils';
import {buildOptimisticTransaction, getChildTransactions, getOriginalTransactionWithSplitInfo, isDistanceRequest} from '@libs/TransactionUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -47,9 +47,13 @@ function initSplitExpense(transaction: OnyxEntry<Transaction>, policy?: OnyxEntr
const originalTransactionID = transaction?.comment?.originalTransactionID;
const originalTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`];
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction);
const relatedTransactions = getChildTransactions(allTransactions, allReports, originalTransactionID);
const hasMultipleSplits = relatedTransactions.length > 1;
const transactionReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`];
const isReportOpen = isOpenReport(transactionReport);
const shouldShowSplitIndicator = isExpenseSplit && (hasMultipleSplits || isReportOpen);

if (isExpenseSplit) {
const relatedTransactions = getChildTransactions(allTransactions, allReports, originalTransactionID);
if (isExpenseSplit && shouldShowSplitIndicator) {
const transactionDetails = getTransactionDetails(originalTransaction);
const splitExpenses = relatedTransactions.map((currentTransaction) => {
const currentTransactionReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${currentTransaction?.reportID}`];
Expand Down Expand Up @@ -81,7 +85,6 @@ function initSplitExpense(transaction: OnyxEntry<Transaction>, policy?: OnyxEntr

const transactionDetails = getTransactionDetails(transaction);
const transactionDetailsAmount = transactionDetails?.amount ?? 0;
const transactionReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`];

const splitAmounts = [
calculateAmount(1, transactionDetailsAmount, transactionDetails?.currency ?? '', false),
Expand Down
Loading