Skip to content

Commit dedd11d

Browse files
authored
Merge pull request Expensify#77943 from s77rt/autoreporting-off-use-selfdm
Use selfDM when creating expense from global menu and auto reporting is disabled
2 parents c6feaa4 + c28204b commit dedd11d

15 files changed

Lines changed: 120 additions & 95 deletions

src/hooks/useSelfDMReport.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import DateUtils from '@libs/DateUtils';
2+
import {buildOptimisticSelfDMReport, findSelfDMReportID} from '@libs/ReportUtils';
3+
import ONYXKEYS from '@src/ONYXKEYS';
4+
import useOnyx from './useOnyx';
5+
6+
function useSelfDMReport() {
7+
const [selfDMReportID] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false, selector: findSelfDMReportID});
8+
const [selfDMReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${selfDMReportID}`, {canBeMissing: true});
9+
return selfDMReport ?? buildOptimisticSelfDMReport(DateUtils.getDBTime());
10+
}
11+
12+
export default useSelfDMReport;

src/libs/ReportUtils.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,15 +1885,12 @@ function isConciergeChatReport(report: OnyxInputOrEntry<Report>, conciergeReport
18851885
return !!report && report?.reportID === (conciergeReportID ?? conciergeReportIDOnyxConnect);
18861886
}
18871887

1888-
function findSelfDMReportID(): string | undefined {
1888+
function findSelfDMReportID(reports?: OnyxCollection<Report>): string | undefined {
18891889
if (cachedSelfDMReportID) {
18901890
return cachedSelfDMReportID;
18911891
}
1892-
if (!allReports) {
1893-
return;
1894-
}
18951892

1896-
const selfDMReport = Object.values(allReports).find((report) => isSelfDM(report) && !isThread(report));
1893+
const selfDMReport = Object.values(reports ?? allReports ?? {}).find((report) => isSelfDM(report) && !isThread(report));
18971894
return selfDMReport?.reportID;
18981895
}
18991896

src/libs/actions/IOU/MoneyRequest.ts

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {calculateDefaultReimbursable, navigateToConfirmationPage, navigateToPart
55
import Log from '@libs/Log';
66
import Navigation from '@libs/Navigation/Navigation';
77
import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
8-
import {findSelfDMReportID, generateReportID, getPolicyExpenseChat} from '@libs/ReportUtils';
8+
import {generateReportID, getPolicyExpenseChat, isSelfDM} from '@libs/ReportUtils';
99
import type {OptionData} from '@libs/ReportUtils';
1010
import shouldUseDefaultExpensePolicy from '@libs/shouldUseDefaultExpensePolicy';
1111
import {getValidWaypoints} from '@libs/TransactionUtils';
@@ -101,6 +101,7 @@ type MoneyRequestStepScanParticipantsFlowParams = {
101101
isTestTransaction?: boolean;
102102
locationPermissionGranted?: boolean;
103103
shouldGenerateTransactionThreadReport: boolean;
104+
selfDMReport: OnyxEntry<Report>;
104105
isSelfTourViewed: boolean;
105106
betas: OnyxEntry<Beta[]>;
106107
};
@@ -136,6 +137,7 @@ type MoneyRequestStepDistanceNavigationParams = {
136137
introSelected?: IntroSelected;
137138
activePolicyID?: string;
138139
privateIsArchived?: string;
140+
selfDMReport: OnyxEntry<Report>;
139141
gpsCoordinates?: string;
140142
gpsDistance?: number;
141143
betas: OnyxEntry<Beta[]>;
@@ -284,6 +286,7 @@ function handleMoneyRequestStepScanParticipants({
284286
files,
285287
isTestTransaction = false,
286288
locationPermissionGranted = false,
289+
selfDMReport,
287290
isSelfTourViewed,
288291
betas,
289292
}: MoneyRequestStepScanParticipantsFlowParams) {
@@ -452,19 +455,21 @@ function handleMoneyRequestStepScanParticipants({
452455
// If there was no reportID, then that means the user started this flow from the global + menu
453456
// and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
454457
if (shouldUseDefaultExpensePolicy(iouType, defaultExpensePolicy)) {
455-
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountID, defaultExpensePolicy?.id);
456458
const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || isAutoReporting;
457-
const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
459+
const targetReport = shouldAutoReport ? getPolicyExpenseChat(currentUserAccountID, defaultExpensePolicy?.id) : selfDMReport;
460+
const transactionReportID = isSelfDM(targetReport) ? CONST.REPORT.UNREPORTED_REPORT_ID : targetReport?.reportID;
461+
const iouTypeTrackOrSubmit = transactionReportID === CONST.REPORT.UNREPORTED_REPORT_ID ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT;
458462

459463
// If the initial transaction has different participants selected that means that the user has changed the participant in the confirmation step
460-
if (initialTransaction?.participants && initialTransaction?.participants?.at(0)?.reportID !== activePolicyExpenseChat?.reportID) {
461-
const selfDMReportID = findSelfDMReportID();
462-
const isTrackExpense = initialTransaction?.participants?.at(0)?.reportID === selfDMReportID;
464+
if (initialTransaction?.participants && initialTransaction?.participants?.at(0)?.reportID !== targetReport?.reportID) {
465+
const isTrackExpense = initialTransaction?.participants?.at(0)?.reportID === selfDMReport?.reportID;
463466

464467
const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
465468
Promise.all(setParticipantsPromises).then(() => {
466469
if (isTrackExpense) {
467-
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, initialTransaction.transactionID, selfDMReportID));
470+
Navigation.navigate(
471+
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, initialTransaction.transactionID, selfDMReport?.reportID),
472+
);
468473
} else {
469474
navigateToConfirmationPage(iouType, initialTransaction.transactionID, reportID, backToReport, iouType === CONST.IOU.TYPE.CREATE, initialTransaction?.reportID);
470475
}
@@ -474,17 +479,10 @@ function handleMoneyRequestStepScanParticipants({
474479

475480
const setParticipantsPromises = files.map((receiptFile) => {
476481
setTransactionReport(receiptFile.transactionID, {reportID: transactionReportID}, true);
477-
return setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat, currentUserAccountID);
482+
return setMoneyRequestParticipantsFromReport(receiptFile.transactionID, targetReport, currentUserAccountID);
478483
});
479484
Promise.all(setParticipantsPromises).then(() =>
480-
Navigation.navigate(
481-
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
482-
CONST.IOU.ACTION.CREATE,
483-
iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
484-
initialTransaction.transactionID,
485-
activePolicyExpenseChat?.reportID,
486-
),
487-
),
485+
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, initialTransaction.transactionID, targetReport?.reportID)),
488486
);
489487
} else {
490488
navigateToParticipantPage(iouType, initialTransaction.transactionID, reportID);
@@ -521,6 +519,7 @@ function handleMoneyRequestStepDistanceNavigation({
521519
introSelected,
522520
activePolicyID,
523521
privateIsArchived,
522+
selfDMReport,
524523
gpsCoordinates,
525524
gpsDistance,
526525
policyForMovingExpenses,
@@ -650,9 +649,11 @@ function handleMoneyRequestStepDistanceNavigation({
650649
// If there was no reportID, then that means the user started this flow from the global menu
651650
// and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
652651
if (defaultExpensePolicy && shouldUseDefaultExpensePolicy(iouType, defaultExpensePolicy)) {
653-
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountID, defaultExpensePolicy?.id);
654652
const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || isAutoReporting;
655-
const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
653+
const targetReport = shouldAutoReport ? getPolicyExpenseChat(currentUserAccountID, defaultExpensePolicy?.id) : selfDMReport;
654+
const transactionReportID = isSelfDM(targetReport) ? CONST.REPORT.UNREPORTED_REPORT_ID : targetReport?.reportID;
655+
const iouTypeTrackOrSubmit = transactionReportID === CONST.REPORT.UNREPORTED_REPORT_ID ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT;
656+
656657
const rateID = DistanceRequestUtils.getCustomUnitRateID({
657658
reportID: transactionReportID,
658659
isPolicyExpenseChat: true,
@@ -661,15 +662,8 @@ function handleMoneyRequestStepDistanceNavigation({
661662
});
662663
setTransactionReport(transactionID, {reportID: transactionReportID}, true);
663664
setCustomUnitRateID(transactionID, rateID);
664-
setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserAccountID).then(() => {
665-
Navigation.navigate(
666-
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
667-
CONST.IOU.ACTION.CREATE,
668-
iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
669-
transactionID,
670-
activePolicyExpenseChat?.reportID,
671-
),
672-
);
665+
setMoneyRequestParticipantsFromReport(transactionID, targetReport, currentUserAccountID).then(() => {
666+
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, transactionID, targetReport?.reportID));
673667
});
674668
} else {
675669
navigateToParticipantPage(iouType, transactionID, reportID);

src/pages/Search/SearchPage.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import useOnyx from '@hooks/useOnyx';
3333
import usePermissions from '@hooks/usePermissions';
3434
import usePrevious from '@hooks/usePrevious';
3535
import useResponsiveLayout from '@hooks/useResponsiveLayout';
36+
import useSelfDMReport from '@hooks/useSelfDMReport';
3637
import useTheme from '@hooks/useTheme';
3738
import useThemeStyles from '@hooks/useThemeStyles';
3839
import {confirmReadyToOpenApp} from '@libs/actions/App';
@@ -76,6 +77,7 @@ import {
7677
isExpenseReport as isExpenseReportUtil,
7778
isInvoiceReport,
7879
isIOUReport as isIOUReportUtil,
80+
isSelfDM,
7981
} from '@libs/ReportUtils';
8082
import {buildSearchQueryJSON} from '@libs/SearchQueryUtils';
8183
import {shouldShowDeleteOption} from '@libs/SearchUIUtils';
@@ -113,6 +115,7 @@ function SearchPage({route}: SearchPageProps) {
113115
const isMobileSelectionModeEnabled = useMobileSelectionMode(clearSelectedTransactions);
114116
const allTransactions = useAllTransactions();
115117
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
118+
const selfDMReport = useSelfDMReport();
116119
const [lastPaymentMethods] = useOnyx(ONYXKEYS.NVP_LAST_PAYMENT_METHOD, {canBeMissing: true});
117120
const [currentDate] = useOnyx(ONYXKEYS.CURRENT_DATE, {canBeMissing: true});
118121
const newReportID = generateReportID();
@@ -1123,20 +1126,21 @@ function SearchPage({route}: SearchPageProps) {
11231126
}
11241127

11251128
if (isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled && !shouldRestrictUserBillableActions(activePolicy.id)) {
1126-
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
11271129
const shouldAutoReport = !!activePolicy?.autoReporting || !!personalPolicy?.autoReporting;
1128-
const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
1130+
const report = shouldAutoReport ? getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id) : selfDMReport;
1131+
const transactionReportID = isSelfDM(report) ? CONST.REPORT.UNREPORTED_REPORT_ID : report?.reportID;
1132+
const iouTypeTrackOrSubmit = transactionReportID === CONST.REPORT.UNREPORTED_REPORT_ID ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT;
11291133
const setParticipantsPromises = newReceiptFiles.map((receiptFile) => {
11301134
setTransactionReport(receiptFile.transactionID, {reportID: transactionReportID}, true);
1131-
return setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID);
1135+
return setMoneyRequestParticipantsFromReport(receiptFile.transactionID, report, currentUserPersonalDetails.accountID);
11321136
});
11331137
Promise.all(setParticipantsPromises).then(() =>
11341138
Navigation.navigate(
11351139
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
11361140
CONST.IOU.ACTION.CREATE,
1137-
CONST.IOU.TYPE.SUBMIT,
1141+
iouTypeTrackOrSubmit,
11381142
initialTransaction?.transactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID,
1139-
activePolicyExpenseChat?.reportID,
1143+
report?.reportID,
11401144
),
11411145
),
11421146
);

src/pages/iou/request/step/IOURequestStepAmount.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import usePersonalPolicy from '@hooks/usePersonalPolicy';
1515
import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
1616
import usePrivateIsArchivedMap from '@hooks/usePrivateIsArchivedMap';
1717
import useReportIsArchived from '@hooks/useReportIsArchived';
18+
import useSelfDMReport from '@hooks/useSelfDMReport';
1819
import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
1920
import {setTransactionReport} from '@libs/actions/Transaction';
2021
import {convertToBackendAmount} from '@libs/CurrencyUtils';
@@ -87,6 +88,7 @@ function IOURequestStepAmount({
8788
const {policyForMovingExpensesID} = usePolicyForMovingExpenses();
8889
const policyID = isTrackExpense ? policyForMovingExpensesID : report?.policyID;
8990

91+
const selfDMReport = useSelfDMReport();
9092
const isReportArchived = useReportIsArchived(report?.reportID);
9193
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
9294
const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
@@ -312,15 +314,16 @@ function IOURequestStepAmount({
312314
// Starting from global + menu means no participant context exists yet,
313315
// so we need to handle participant selection based on available workspace settings
314316
if (shouldUseDefaultExpensePolicy(iouType, defaultExpensePolicy)) {
315-
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountIDParam, defaultExpensePolicy?.id);
316317
const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || !!personalPolicy?.autoReporting;
317-
const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
318+
const targetReport = shouldAutoReport ? getPolicyExpenseChat(currentUserAccountIDParam, defaultExpensePolicy?.id) : selfDMReport;
319+
const transactionReportID = isSelfDM(targetReport) ? CONST.REPORT.UNREPORTED_REPORT_ID : targetReport?.reportID;
320+
const iouTypeTrackOrSubmit = transactionReportID === CONST.REPORT.UNREPORTED_REPORT_ID ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT;
318321
const isReturningFromConfirmationPage = !!transaction?.participants?.length;
319322

320323
const resetToDefaultWorkspace = () => {
321324
setTransactionReport(transactionID, {reportID: transactionReportID}, true);
322-
setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID).then(() => {
323-
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, activePolicyExpenseChat?.reportID));
325+
setMoneyRequestParticipantsFromReport(transactionID, targetReport, currentUserPersonalDetails.accountID).then(() => {
326+
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, transactionID, targetReport?.reportID));
324327
});
325328
};
326329

@@ -337,9 +340,9 @@ function IOURequestStepAmount({
337340

338341
// Preserve user's participant selection to avoid forcing them back to default workspace.
339342
const iouReportID = transaction?.reportID;
340-
const selectedReport = iouReportID ? getReportOrDraftReport(iouReportID) : null;
343+
const selectedReport = iouReportID === CONST.REPORT.UNREPORTED_REPORT_ID ? selfDMReport : getReportOrDraftReport(iouReportID);
341344
const navigationIOUType = isSelfDM(selectedReport) ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT;
342-
const chatReportID = selectedReport?.chatReportID ?? iouReportID;
345+
const chatReportID = selectedReport?.chatReportID ?? selectedReport?.reportID;
343346

344347
Navigation.setNavigationActionToMicrotaskQueue(() => {
345348
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, navigationIOUType, transactionID, chatReportID));

src/pages/iou/request/step/IOURequestStepConfirmation.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1080,7 +1080,7 @@ function IOURequestStepConfirmation({
10801080
return;
10811081
}
10821082

1083-
if (iouType === CONST.IOU.TYPE.TRACK || isCategorizingTrackExpense || isSharingTrackExpense || isUnreported) {
1083+
if (iouType === CONST.IOU.TYPE.TRACK || isCategorizingTrackExpense || isSharingTrackExpense) {
10841084
if (Object.values(receiptFiles).filter((receipt) => !!receipt).length && transaction) {
10851085
// If the transaction amount is zero, then the money is being requested through the "Scan" flow and the GPS coordinates need to be included.
10861086
if (transaction.amount === 0 && !isSharingTrackExpense && !isCategorizingTrackExpense && locationPermissionGranted) {

0 commit comments

Comments
 (0)