From 05a3e4a740894b918687931919ddf525b5573357 Mon Sep 17 00:00:00 2001 From: Nabi Ebrahimi Date: Wed, 6 May 2026 01:32:56 +0430 Subject: [PATCH 1/2] fix(expense): exclude rejected expenses from duplicate report --- src/libs/actions/IOU/RejectMoneyRequest.ts | 43 ++++++++++++++-------- src/libs/actions/Search.ts | 4 +- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/libs/actions/IOU/RejectMoneyRequest.ts b/src/libs/actions/IOU/RejectMoneyRequest.ts index f46a421393a8..95f7a4c97c51 100644 --- a/src/libs/actions/IOU/RejectMoneyRequest.ts +++ b/src/libs/actions/IOU/RejectMoneyRequest.ts @@ -72,6 +72,11 @@ type RejectMoneyRequestData = { urlToNavigateBack: Route | undefined; }; +type RejectMoneyRequestOptions = { + sharedRejectedToReportID?: string; + existingRejectedReport?: OnyxEntry; +}; + function dismissRejectUseExplanation() { const parameters: SetNameValuePairParams = { name: ONYXKEYS.NVP_DISMISSED_REJECT_USE_EXPLANATION, @@ -108,7 +113,7 @@ function prepareRejectMoneyRequestData( currentUserAccountIDParam: number, currentUserLogin: string, betas: OnyxEntry, - options?: {sharedRejectedToReportID?: string}, + options?: RejectMoneyRequestOptions, shouldUseBulkAction?: boolean, ): RejectMoneyRequestData | undefined { const allTransactions = getAllTransactions(); @@ -348,17 +353,25 @@ function prepareRejectMoneyRequestData( // 1. Update report total // 2. Remove expense from report // 3. Add to existing draft report or create new one - const existingOpenReport = Object.values(allReports ?? {}).find( - (r) => - r?.reportID !== reportID && - r?.chatReportID === report.chatReportID && - r?.type === CONST.REPORT.TYPE.EXPENSE && - isOpenReport(r) && - r?.ownerAccountID === report.ownerAccountID, - ); + const existingOpenReport = + options?.existingRejectedReport ?? + Object.values(allReports ?? {}).find( + (r) => + r?.reportID !== reportID && + r?.chatReportID === report.chatReportID && + r?.type === CONST.REPORT.TYPE.EXPENSE && + isOpenReport(r) && + r?.ownerAccountID === report.ownerAccountID, + ); if (existingOpenReport) { - movedToReport = existingOpenReport; + movedToReport = { + ...existingOpenReport, + total: (existingOpenReport?.total ?? 0) - transactionAmount, + }; + if (options) { + options.existingRejectedReport = movedToReport; + } rejectedToReportID = existingOpenReport.reportID; const [, , iouAction] = buildOptimisticMoneyRequestEntities({ @@ -380,10 +393,7 @@ function prepareRejectMoneyRequestData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${movedToReport?.reportID}`, - value: { - ...movedToReport, - total: (movedToReport?.total ?? 0) - transactionAmount, - }, + value: movedToReport, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -473,6 +483,9 @@ function prepareRejectMoneyRequestData( expenseMovedReportActionID = movedTransactionAction.reportActionID; expenseCreatedReportActionID = createdActionForExpenseReport.reportActionID; newExpenseReport.parentReportActionID = reportPreviewAction.reportActionID; + if (options) { + options.existingRejectedReport = newExpenseReport; + } optimisticData.push( { onyxMethod: Onyx.METHOD.MERGE, @@ -886,7 +899,7 @@ function rejectMoneyRequest( currentUserAccountIDParam: number, currentUserLogin: string, betas: OnyxEntry, - options?: {sharedRejectedToReportID?: string}, + options?: RejectMoneyRequestOptions, ): Route | undefined { const data = prepareRejectMoneyRequestData(transactionID, reportID, comment, policy, currentUserAccountIDParam, currentUserLogin, betas, options); if (!data) { diff --git a/src/libs/actions/Search.ts b/src/libs/actions/Search.ts index dfb748fe4570..f9e241a0d05e 100644 --- a/src/libs/actions/Search.ts +++ b/src/libs/actions/Search.ts @@ -1088,9 +1088,9 @@ function rejectMoneyRequestsOnSearch( rejectMoneyRequestInBulk(reportID, comment, policy, selectedTransactionIDs, currentUserAccountIDParam, currentUserLogin, betas, hash); } else { // Share a single destination ID across all rejections from the same source report - const sharedRejectedToReportID = generateReportID(); + const sharedRejectOptions = {sharedRejectedToReportID: generateReportID()}; for (const transactionID of selectedTransactionIDs) { - rejectMoneyRequest(transactionID, reportID, comment, policy, currentUserAccountIDParam, currentUserLogin, betas, {sharedRejectedToReportID}); + rejectMoneyRequest(transactionID, reportID, comment, policy, currentUserAccountIDParam, currentUserLogin, betas, sharedRejectOptions); } } if (isSingleReport && areAllExpensesSelected && !isPolicyDelayedSubmissionEnabled) { From 1c81927021d4b98aee837ede18bbaea3b7483ed9 Mon Sep 17 00:00:00 2001 From: Nabi Date: Wed, 6 May 2026 14:50:34 +0430 Subject: [PATCH 2/2] fix reject report rollback --- src/libs/actions/IOU/RejectMoneyRequest.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/libs/actions/IOU/RejectMoneyRequest.ts b/src/libs/actions/IOU/RejectMoneyRequest.ts index 95f7a4c97c51..d41e75fab2b4 100644 --- a/src/libs/actions/IOU/RejectMoneyRequest.ts +++ b/src/libs/actions/IOU/RejectMoneyRequest.ts @@ -119,6 +119,7 @@ function prepareRejectMoneyRequestData( const allTransactions = getAllTransactions(); const allReports = getAllReports(); const allTransactionViolations = getAllTransactionViolations(); + const sharedRejectOptions = options; const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; const transactionAmount = getAmount(transaction); @@ -365,12 +366,13 @@ function prepareRejectMoneyRequestData( ); if (existingOpenReport) { + const originalRejectedReportTotal = existingOpenReport?.total ?? 0; movedToReport = { ...existingOpenReport, - total: (existingOpenReport?.total ?? 0) - transactionAmount, + total: originalRejectedReportTotal - transactionAmount, }; - if (options) { - options.existingRejectedReport = movedToReport; + if (sharedRejectOptions) { + sharedRejectOptions.existingRejectedReport = movedToReport; } rejectedToReportID = existingOpenReport.reportID; @@ -430,7 +432,7 @@ function prepareRejectMoneyRequestData( onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${movedToReport?.reportID}`, value: { - total: movedToReport?.total ?? 0, + total: originalRejectedReportTotal, pendingFields: {total: null}, }, }, @@ -483,8 +485,8 @@ function prepareRejectMoneyRequestData( expenseMovedReportActionID = movedTransactionAction.reportActionID; expenseCreatedReportActionID = createdActionForExpenseReport.reportActionID; newExpenseReport.parentReportActionID = reportPreviewAction.reportActionID; - if (options) { - options.existingRejectedReport = newExpenseReport; + if (sharedRejectOptions) { + sharedRejectOptions.existingRejectedReport = newExpenseReport; } optimisticData.push( {