Skip to content

Commit 4560ae0

Browse files
authored
Merge pull request Expensify#73227 from Expensify/revert-73186-72485-fixes
Revert "Update create report logic while moving expenses" & "Allow admin and report managers to move expenses"
2 parents 78c2503 + c0a188c commit 4560ae0

7 files changed

Lines changed: 25 additions & 151 deletions

File tree

src/components/Search/index.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import useSearchHighlightAndScroll from '@hooks/useSearchHighlightAndScroll';
2121
import useSearchShouldCalculateTotals from '@hooks/useSearchShouldCalculateTotals';
2222
import useThemeStyles from '@hooks/useThemeStyles';
2323
import {turnOffMobileSelectionMode, turnOnMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
24-
import type {TransactionPreviewData} from '@libs/actions/Search';
2524
import {openSearch, setOptimisticDataForTransactionThreadPreview} from '@libs/actions/Search';
25+
import type {TransactionPreviewData} from '@libs/actions/Search';
2626
import Timing from '@libs/actions/Timing';
2727
import {canUseTouchScreen} from '@libs/DeviceCapabilities';
2828
import Log from '@libs/Log';
@@ -115,7 +115,6 @@ function mapTransactionItemToSelectedEntry(
115115
isFromOneTransactionReport: item.isFromOneTransactionReport,
116116
convertedCurrency: item.convertedCurrency,
117117
currency: item.currency,
118-
ownerAccountID: item.report?.ownerAccountID ?? item.accountID,
119118
},
120119
];
121120
}
@@ -198,7 +197,6 @@ function prepareTransactionsList(
198197
convertedCurrency: item.convertedCurrency,
199198
currency: item.currency,
200199
isFromOneTransactionReport: item.isFromOneTransactionReport,
201-
ownerAccountID: item.report?.ownerAccountID ?? item.accountID,
202200
},
203201
};
204202
}

src/components/Search/types.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ type SelectedTransactionInfo = {
4949

5050
/** Whether it is the only expense of the parent expense report */
5151
isFromOneTransactionReport?: boolean;
52-
53-
/** Account ID of the report owner */
54-
ownerAccountID?: number;
5552
};
5653

5754
/** Model of selected transactions */

src/hooks/useSelectedTransactionsActions.ts

Lines changed: 11 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
canEditFieldOfMoneyRequest,
1616
canHoldUnholdReportAction,
1717
canUserPerformWriteAction as canUserPerformWriteActionReportUtils,
18-
getReportOrDraftReport,
1918
isArchivedReport,
2019
isInvoiceReport,
2120
isMoneyRequestReport as isMoneyRequestReportUtils,
@@ -59,7 +58,7 @@ function useSelectedTransactionsActions({
5958
beginExportWithTemplate: (templateName: string, templateType: string, transactionIDList: string[], policyID?: string) => void;
6059
}) {
6160
const {isOffline} = useNetworkWithOfflineStatus();
62-
const {selectedTransactionIDs, clearSelectedTransactions, selectedTransactions: selectedTransactionsMeta} = useSearchContext();
61+
const {selectedTransactionIDs, clearSelectedTransactions} = useSearchContext();
6362
const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: false});
6463
const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {canBeMissing: true});
6564
const [lastVisitedPath] = useOnyx(ONYXKEYS.LAST_VISITED_PATH, {canBeMissing: true});
@@ -70,7 +69,7 @@ function useSelectedTransactionsActions({
7069

7170
const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(selectedTransactionIDs);
7271
const isReportArchived = useReportIsArchived(report?.reportID);
73-
const selectedTransactionsList = useMemo(
72+
const selectedTransactions = useMemo(
7473
() =>
7574
selectedTransactionIDs.reduce((acc, transactionID) => {
7675
const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
@@ -81,48 +80,6 @@ function useSelectedTransactionsActions({
8180
}, [] as Transaction[]),
8281
[allTransactions, selectedTransactionIDs],
8382
);
84-
const hasTransactionsFromMultipleOwners = useMemo(() => {
85-
const knownOwnerIDs = new Set<number>();
86-
let hasUnknownOwner = false;
87-
88-
for (const selectedTransactionInfo of Object.values(selectedTransactionsMeta ?? {})) {
89-
const ownerAccountID = selectedTransactionInfo?.ownerAccountID;
90-
if (typeof ownerAccountID === 'number') {
91-
knownOwnerIDs.add(ownerAccountID);
92-
if (knownOwnerIDs.size > 1) {
93-
return true;
94-
}
95-
} else {
96-
hasUnknownOwner = true;
97-
}
98-
}
99-
100-
for (const selectedTransaction of selectedTransactionsList) {
101-
const reportID = selectedTransaction?.reportID;
102-
if (!reportID || reportID === CONST.REPORT.UNREPORTED_REPORT_ID) {
103-
hasUnknownOwner = true;
104-
continue;
105-
}
106-
107-
const parentReport = getReportOrDraftReport(reportID);
108-
const ownerAccountID = parentReport?.ownerAccountID;
109-
110-
if (typeof ownerAccountID === 'number') {
111-
knownOwnerIDs.add(ownerAccountID);
112-
if (knownOwnerIDs.size > 1) {
113-
return true;
114-
}
115-
} else {
116-
hasUnknownOwner = true;
117-
}
118-
}
119-
120-
if (hasUnknownOwner) {
121-
return knownOwnerIDs.size > 0 || selectedTransactionIDs.length > 1;
122-
}
123-
124-
return false;
125-
}, [selectedTransactionsList, selectedTransactionsMeta, selectedTransactionIDs]);
12683

12784
const {translate} = useLocalize();
12885
const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false);
@@ -214,10 +171,10 @@ function useSelectedTransactionsActions({
214171
const options = [];
215172
const isMoneyRequestReport = isMoneyRequestReportUtils(report);
216173
const isReportReimbursed = report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED;
217-
let canHoldTransactions = selectedTransactionsList.length > 0 && isMoneyRequestReport && !isReportReimbursed;
218-
let canUnholdTransactions = selectedTransactionsList.length > 0 && isMoneyRequestReport;
174+
let canHoldTransactions = selectedTransactions.length > 0 && isMoneyRequestReport && !isReportReimbursed;
175+
let canUnholdTransactions = selectedTransactions.length > 0 && isMoneyRequestReport;
219176

220-
selectedTransactionsList.forEach((selectedTransaction) => {
177+
selectedTransactions.forEach((selectedTransaction) => {
221178
if (!canHoldTransactions && !canUnholdTransactions) {
222179
return;
223180
}
@@ -314,7 +271,7 @@ function useSelectedTransactionsActions({
314271
subMenuItems: getExportOptions(),
315272
});
316273

317-
const canSelectedExpensesBeMoved = selectedTransactionsList.every((transaction) => {
274+
const canSelectedExpensesBeMoved = selectedTransactions.every((transaction) => {
318275
if (!transaction) {
319276
return false;
320277
}
@@ -325,7 +282,7 @@ function useSelectedTransactionsActions({
325282
});
326283

327284
const canUserPerformWriteAction = canUserPerformWriteActionReportUtils(report, isReportArchived);
328-
if (canSelectedExpensesBeMoved && canUserPerformWriteAction && !hasTransactionsFromMultipleOwners) {
285+
if (canSelectedExpensesBeMoved && canUserPerformWriteAction) {
329286
options.push({
330287
text: translate('iou.moveExpenses', {count: selectedTransactionIDs.length}),
331288
icon: Expensicons.DocumentMerge,
@@ -339,14 +296,14 @@ function useSelectedTransactionsActions({
339296
}
340297

341298
// In phase 1, we only show merge action if report is eligible for merge and only one transaction is selected
342-
const canMergeTransaction = selectedTransactionsList.length === 1 && report && isMergeAction(report, selectedTransactionsList, policy);
299+
const canMergeTransaction = selectedTransactions.length === 1 && report && isMergeAction(report, selectedTransactions, policy);
343300
if (canMergeTransaction) {
344301
options.push({
345302
text: translate('common.merge'),
346303
icon: Expensicons.ArrowCollapse,
347304
value: MERGE,
348305
onSelected: () => {
349-
const targetTransaction = selectedTransactionsList.at(0);
306+
const targetTransaction = selectedTransactions.at(0);
350307

351308
if (!report || !targetTransaction) {
352309
return;
@@ -358,7 +315,7 @@ function useSelectedTransactionsActions({
358315
});
359316
}
360317

361-
const canAllSelectedTransactionsBeRemoved = selectedTransactionsList.every((transaction) => {
318+
const canAllSelectedTransactionsBeRemoved = Object.values(selectedTransactions).every((transaction) => {
362319
const canRemoveTransaction = canDeleteCardTransactionByLiabilityType(transaction);
363320
const action = getIOUActionForTransactionID(reportActions, transaction.transactionID);
364321
const isActionDeleted = isDeletedAction(action);
@@ -381,7 +338,7 @@ function useSelectedTransactionsActions({
381338
}, [
382339
selectedTransactionIDs,
383340
report,
384-
selectedTransactionsList,
341+
selectedTransactions,
385342
translate,
386343
isReportArchived,
387344
policy,
@@ -399,7 +356,6 @@ function useSelectedTransactionsActions({
399356
lastVisitedPath,
400357
session?.accountID,
401358
showDeleteModal,
402-
hasTransactionsFromMultipleOwners,
403359
]);
404360

405361
return {

src/libs/ReportUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4594,7 +4594,7 @@ function canEditFieldOfMoneyRequest(
45944594
Object.values(allPolicies ?? {}).flatMap((currentPolicy) =>
45954595
getOutstandingReportsForUser(currentPolicy?.id, moneyRequestReport?.ownerAccountID, outstandingReportsByPolicyID?.[currentPolicy?.id ?? CONST.DEFAULT_NUMBER_ID] ?? {}),
45964596
).length > 1 ||
4597-
((isOwner || isAdmin || isManager) && isReportOutstanding(moneyRequestReport, moneyRequestReport.policyID))
4597+
(isOwner && isReportOutstanding(moneyRequestReport, moneyRequestReport.policyID))
45984598
);
45994599
}
46004600

src/pages/Search/SearchPage.tsx

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ import Navigation from '@libs/Navigation/Navigation';
5757
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
5858
import type {SearchFullscreenNavigatorParamList} from '@libs/Navigation/types';
5959
import {getActiveAdminWorkspaces, hasVBBA, isPaidGroupPolicy} from '@libs/PolicyUtils';
60-
import {generateReportID, getPolicyExpenseChat, getReportOrDraftReport, isExpenseReport as isExpenseReportUtil, isIOUReport as isIOUReportUtil} from '@libs/ReportUtils';
60+
import {generateReportID, getPolicyExpenseChat, isExpenseReport as isExpenseReportUtil, isIOUReport as isIOUReportUtil} from '@libs/ReportUtils';
6161
import {buildCannedSearchQuery, buildSearchQueryJSON} from '@libs/SearchQueryUtils';
6262
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
6363
import type {ReceiptFile} from '@pages/iou/request/step/IOURequestStepScan/types';
@@ -452,28 +452,9 @@ function SearchPage({route}: SearchPageProps) {
452452
});
453453
}
454454

455-
const ownerAccountIDs = new Set<number>();
456-
let hasUnknownOwner = false;
457-
for (const id of selectedTransactionsKeys) {
458-
const transactionEntry = selectedTransactions[id];
459-
if (!transactionEntry) {
460-
continue;
461-
}
462-
const ownerAccountID = transactionEntry.ownerAccountID ?? getReportOrDraftReport(transactionEntry.reportID)?.ownerAccountID;
463-
if (typeof ownerAccountID === 'number') {
464-
ownerAccountIDs.add(ownerAccountID);
465-
if (ownerAccountIDs.size > 1) {
466-
break;
467-
}
468-
} else {
469-
hasUnknownOwner = true;
470-
}
471-
}
472-
const hasMultipleOwners = ownerAccountIDs.size > 1 || (hasUnknownOwner && (ownerAccountIDs.size > 0 || selectedTransactionsKeys.length > 1));
473-
474455
const canAllTransactionsBeMoved = selectedTransactionsKeys.every((id) => selectedTransactions[id].canChangeReport);
475456

476-
if (canAllTransactionsBeMoved && !hasMultipleOwners) {
457+
if (canAllTransactionsBeMoved) {
477458
options.push({
478459
text: translate('iou.moveExpenses', {count: selectedTransactionsKeys.length}),
479460
icon: Expensicons.DocumentMerge,

src/pages/Search/SearchTransactionsChangeReport.tsx

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {createNewReport} from '@libs/actions/Report';
1010
import {changeTransactionsReport} from '@libs/actions/Transaction';
1111
import Navigation from '@libs/Navigation/Navigation';
1212
import Permissions from '@libs/Permissions';
13-
import {getReportOrDraftReport, hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils';
13+
import {hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils';
1414
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
1515
import IOURequestEditReportCommon from '@pages/iou/request/step/IOURequestEditReportCommon';
1616
import CONST from '@src/CONST';
@@ -42,30 +42,6 @@ function SearchTransactionsChangeReport() {
4242
Object.values(selectedTransactions).every((transaction) => transaction.reportID === firstTransactionReportID) && firstTransactionReportID !== CONST.REPORT.UNREPORTED_REPORT_ID
4343
? firstTransactionReportID
4444
: undefined;
45-
const areAllTransactionsUnreported =
46-
selectedTransactionsKeys.length > 0 && selectedTransactionsKeys.every((transactionKey) => selectedTransactions[transactionKey]?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID);
47-
const targetOwnerAccountID = useMemo(() => {
48-
if (selectedTransactionsKeys.length === 0) {
49-
return undefined;
50-
}
51-
52-
// Prefer owner metadata attached to each selection (handles unreported expenses)
53-
const ownerFromSelection = selectedTransactionsKeys.map((transactionKey) => selectedTransactions[transactionKey]?.ownerAccountID).find((ownerID) => typeof ownerID === 'number');
54-
if (ownerFromSelection !== undefined) {
55-
return ownerFromSelection;
56-
}
57-
58-
const reportIDWithOwner = selectedTransactionsKeys
59-
.map((transactionKey) => selectedTransactions[transactionKey]?.reportID)
60-
.find((reportID) => reportID && reportID !== CONST.REPORT.UNREPORTED_REPORT_ID);
61-
62-
if (!reportIDWithOwner) {
63-
return undefined;
64-
}
65-
66-
const report = getReportOrDraftReport(reportIDWithOwner);
67-
return report?.ownerAccountID;
68-
}, [selectedTransactions, selectedTransactionsKeys]);
6945

7046
const createReport = () => {
7147
if (shouldSelectPolicy) {
@@ -133,8 +109,6 @@ function SearchTransactionsChangeReport() {
133109
removeFromReport={removeFromReport}
134110
createReport={createReport}
135111
isEditing
136-
isUnreported={areAllTransactionsUnreported}
137-
targetOwnerAccountID={targetOwnerAccountID}
138112
/>
139113
);
140114
}

0 commit comments

Comments
 (0)