From d06256ec3b68f02dec63a01b32853b1628c6fcc1 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Thu, 18 Dec 2025 09:14:31 +0400 Subject: [PATCH 01/11] Fix: Optimistically copy submission/approval related report actions --- src/libs/actions/IOU.ts | 71 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index f7a8c5c979552..e99d0f743db93 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -108,10 +108,15 @@ import { getReportActionText, getTrackExpenseActionableWhisper, isActionableTrackExpense, + isApprovedAction, isCreatedAction, isDeletedAction, + isForwardedAction, isMoneyRequestAction, isReportPreviewAction, + isRetractedAction, + isSubmittedAction, + isUnapprovedAction, } from '@libs/ReportActionsUtils'; import type {OptimisticChatReport, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptionData, TransactionDetails} from '@libs/ReportUtils'; import { @@ -10091,6 +10096,59 @@ function getHoldReportActionsAndTransactions(reportID: string | undefined) { return {holdReportActions, holdTransactions}; } +/** + * Copies submission/approval related report actions from a source report to a target report. + * This includes actions like SUBMITTED, APPROVED, FORWARDED, UNAPPROVED, RETRACTED, and REJECTED. + * + * @param sourceReportID - The ID of the report to copy actions from + * @param targetReportID - The ID of the report to copy actions to + * @returns An object containing the copied actions with their optimistic, success, and failure states + */ +function copySubmissionApprovalActionsForReport( + sourceReportID: string | undefined, + targetReportID: string | undefined, +): { + copiedActions: Record; + copiedActionsSuccess: OnyxCollection>; + copiedActionsFailure: Record; +} { + const copiedActions: Record = {}; + const copiedActionsSuccess: OnyxCollection> = {}; + const copiedActionsFailure: Record = {}; + + if (!sourceReportID || !targetReportID) { + return {copiedActions, copiedActionsSuccess, copiedActionsFailure}; + } + + const sourceReportActions = getAllReportActions(sourceReportID); + + for (const action of Object.values(sourceReportActions)) { + if ( + action && + (isSubmittedAction(action) || + isApprovedAction(action) || + isForwardedAction(action) || + isUnapprovedAction(action) || + isRetractedAction(action) || + action.actionName === CONST.REPORT.ACTIONS.TYPE.REJECTED) + ) { + const newActionID = NumberUtils.rand64(); + copiedActions[newActionID] = { + ...action, + reportActionID: newActionID, + reportID: targetReportID, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }; + copiedActionsSuccess[newActionID] = { + pendingAction: null, + }; + copiedActionsFailure[newActionID] = null; + } + } + + return {copiedActions, copiedActionsSuccess, copiedActionsFailure}; +} + function getReportFromHoldRequestsOnyxData( chatReport: OnyxTypes.Report, iouReport: OnyxEntry, @@ -10193,6 +10251,13 @@ function getReportFromHoldRequestsOnyxData( }; } + // Copy submission/approval actions to the new report + const { + copiedActions: copiedSubmissionApprovalActions, + copiedActionsSuccess: copiedSubmissionApprovalActionsSuccess, + copiedActionsFailure: copiedSubmissionApprovalActionsFailure, + } = copySubmissionApprovalActionsForReport(iouReport?.reportID, optimisticExpenseReport.reportID); + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -10230,7 +10295,7 @@ function getReportFromHoldRequestsOnyxData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticExpenseReport.reportID}`, - value: addHoldReportActions, + value: {...addHoldReportActions, ...copiedSubmissionApprovalActions}, }, // update held reports with new parentReportActionID { @@ -10269,7 +10334,7 @@ function getReportFromHoldRequestsOnyxData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticExpenseReport.reportID}`, - value: addHoldReportActionsSuccess, + value: {...addHoldReportActionsSuccess, ...copiedSubmissionApprovalActionsSuccess}, }, ]; @@ -10306,7 +10371,7 @@ function getReportFromHoldRequestsOnyxData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticExpenseReport.reportID}`, - value: null, + value: {...copiedSubmissionApprovalActionsFailure}, }, // add hold transactions back to old iou report { From b3996009ed3ee321fdc6778577da87abd2913a7d Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Sun, 21 Dec 2025 21:19:50 +0400 Subject: [PATCH 02/11] Fix: Update action filtering to match backend's WORKFLOW_ACTIONS list --- src/libs/actions/IOU.ts | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index e99d0f743db93..012d73ccf9a8e 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10122,16 +10122,23 @@ function copySubmissionApprovalActionsForReport( const sourceReportActions = getAllReportActions(sourceReportID); + // Match the backend's WORKFLOW_ACTIONS list + const workflowActionTypes = [ + CONST.REPORT.ACTIONS.TYPE.SUBMITTED, + CONST.REPORT.ACTIONS.TYPE.SUBMITTED_AND_CLOSED, + CONST.REPORT.ACTIONS.TYPE.APPROVED, + CONST.REPORT.ACTIONS.TYPE.UNAPPROVED, + CONST.REPORT.ACTIONS.TYPE.REJECTED, + CONST.REPORT.ACTIONS.TYPE.RETRACTED, + CONST.REPORT.ACTIONS.TYPE.CLOSED, + CONST.REPORT.ACTIONS.TYPE.REOPENED, + CONST.REPORT.ACTIONS.TYPE.FORWARDED, + CONST.REPORT.ACTIONS.TYPE.TAKE_CONTROL, + CONST.REPORT.ACTIONS.TYPE.REROUTE, + ] as const; + for (const action of Object.values(sourceReportActions)) { - if ( - action && - (isSubmittedAction(action) || - isApprovedAction(action) || - isForwardedAction(action) || - isUnapprovedAction(action) || - isRetractedAction(action) || - action.actionName === CONST.REPORT.ACTIONS.TYPE.REJECTED) - ) { + if (action && (workflowActionTypes as readonly string[]).includes(action.actionName)) { const newActionID = NumberUtils.rand64(); copiedActions[newActionID] = { ...action, From 8f11654dc5f8a53fba3ca78562a725aa90c5a6a0 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Mon, 22 Dec 2025 02:55:33 +0400 Subject: [PATCH 03/11] Refactor: Remove unused action imports from IOU actions --- src/libs/actions/IOU.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 40bd4af838568..5de0b6e1de248 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -108,15 +108,10 @@ import { getReportActionText, getTrackExpenseActionableWhisper, isActionableTrackExpense, - isApprovedAction, isCreatedAction, isDeletedAction, - isForwardedAction, isMoneyRequestAction, isReportPreviewAction, - isRetractedAction, - isSubmittedAction, - isUnapprovedAction, } from '@libs/ReportActionsUtils'; import type {OptimisticChatReport, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptionData, TransactionDetails} from '@libs/ReportUtils'; import { From a08e2fb8a8a701a00e429d8ffc04525180e68c5a Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Mon, 22 Dec 2025 03:34:34 +0400 Subject: [PATCH 04/11] fix prettier --- src/libs/actions/IOU.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 5de0b6e1de248..b10b24bd67e95 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10110,7 +10110,7 @@ function copySubmissionApprovalActionsForReport( } const sourceReportActions = getAllReportActions(sourceReportID); - + // Match the backend's WORKFLOW_ACTIONS list const workflowActionTypes = [ CONST.REPORT.ACTIONS.TYPE.SUBMITTED, @@ -10125,7 +10125,7 @@ function copySubmissionApprovalActionsForReport( CONST.REPORT.ACTIONS.TYPE.TAKE_CONTROL, CONST.REPORT.ACTIONS.TYPE.REROUTE, ] as const; - + for (const action of Object.values(sourceReportActions)) { if (action && (workflowActionTypes as readonly string[]).includes(action.actionName)) { const newActionID = NumberUtils.rand64(); From 5c256a99ade927020a8e8e245bdb7539b77dd68a Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:03:52 +0400 Subject: [PATCH 05/11] Refactor: Rename and update copySubmissionApprovalActionsForReport function to getDuplicateActionsForPartialReport --- src/libs/actions/IOU.ts | 75 ++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index b10b24bd67e95..91d25818ab8fd 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10086,27 +10086,23 @@ function getHoldReportActionsAndTransactions(reportID: string | undefined) { } /** - * Copies submission/approval related report actions from a source report to a target report. - * This includes actions like SUBMITTED, APPROVED, FORWARDED, UNAPPROVED, RETRACTED, and REJECTED. + * Gets duplicate workflow actions for a partial expense report. + * Used when splitting held expenses into a new partial report to maintain action history. * - * @param sourceReportID - The ID of the report to copy actions from - * @param targetReportID - The ID of the report to copy actions to - * @returns An object containing the copied actions with their optimistic, success, and failure states + * @param sourceReportID - The ID of the original report to copy actions from + * @param targetReportID - The ID of the new partial expense report to copy actions to + * @returns A tuple of [optimisticData, successData, failureData] OnyxUpdate arrays */ -function copySubmissionApprovalActionsForReport( +function getDuplicateActionsForPartialReport( sourceReportID: string | undefined, targetReportID: string | undefined, -): { - copiedActions: Record; - copiedActionsSuccess: OnyxCollection>; - copiedActionsFailure: Record; -} { - const copiedActions: Record = {}; - const copiedActionsSuccess: OnyxCollection> = {}; - const copiedActionsFailure: Record = {}; +): [OnyxUpdate[], OnyxUpdate[], OnyxUpdate[]] { + const optimisticData: OnyxUpdate[] = []; + const successData: OnyxUpdate[] = []; + const failureData: OnyxUpdate[] = []; if (!sourceReportID || !targetReportID) { - return {copiedActions, copiedActionsSuccess, copiedActionsFailure}; + return [optimisticData, successData, failureData]; } const sourceReportActions = getAllReportActions(sourceReportID); @@ -10126,6 +10122,10 @@ function copySubmissionApprovalActionsForReport( CONST.REPORT.ACTIONS.TYPE.REROUTE, ] as const; + const copiedActions: Record = {}; + const copiedActionsSuccess: OnyxCollection> = {}; + const copiedActionsFailure: Record = {}; + for (const action of Object.values(sourceReportActions)) { if (action && (workflowActionTypes as readonly string[]).includes(action.actionName)) { const newActionID = NumberUtils.rand64(); @@ -10142,7 +10142,27 @@ function copySubmissionApprovalActionsForReport( } } - return {copiedActions, copiedActionsSuccess, copiedActionsFailure}; + if (Object.keys(copiedActions).length > 0) { + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${targetReportID}`, + value: copiedActions, + }); + + successData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${targetReportID}`, + value: copiedActionsSuccess, + }); + + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${targetReportID}`, + value: copiedActionsFailure, + }); + } + + return [optimisticData, successData, failureData]; } function getReportFromHoldRequestsOnyxData( @@ -10247,13 +10267,6 @@ function getReportFromHoldRequestsOnyxData( }; } - // Copy submission/approval actions to the new report - const { - copiedActions: copiedSubmissionApprovalActions, - copiedActionsSuccess: copiedSubmissionApprovalActionsSuccess, - copiedActionsFailure: copiedSubmissionApprovalActionsFailure, - } = copySubmissionApprovalActionsForReport(iouReport?.reportID, optimisticExpenseReport.reportID); - const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -10291,7 +10304,7 @@ function getReportFromHoldRequestsOnyxData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticExpenseReport.reportID}`, - value: {...addHoldReportActions, ...copiedSubmissionApprovalActions}, + value: addHoldReportActions, }, // update held reports with new parentReportActionID { @@ -10330,7 +10343,7 @@ function getReportFromHoldRequestsOnyxData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticExpenseReport.reportID}`, - value: {...addHoldReportActionsSuccess, ...copiedSubmissionApprovalActionsSuccess}, + value: addHoldReportActionsSuccess, }, ]; @@ -10363,12 +10376,6 @@ function getReportFromHoldRequestsOnyxData( key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`, value: bringReportActionsBack, }, - // remove hold report actions from the new iou report - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticExpenseReport.reportID}`, - value: {...copiedSubmissionApprovalActionsFailure}, - }, // add hold transactions back to old iou report { onyxMethod: Onyx.METHOD.MERGE_COLLECTION, @@ -10377,6 +10384,12 @@ function getReportFromHoldRequestsOnyxData( }, ]; + // Copy submission/approval actions to the new report + const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure] = getDuplicateActionsForPartialReport(iouReport?.reportID, optimisticExpenseReport.reportID); + optimisticData.push(...copiedActionsOptimistic); + successData.push(...copiedActionsSuccess); + failureData.push(...copiedActionsFailure); + return { optimisticData, optimisticHoldActionID: optimisticExpenseReportPreview.reportActionID, From 8f03f1e9cc924a7faa21f987fbcbbc71f8a100c8 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:52:35 +0400 Subject: [PATCH 06/11] chore: fix prettier --- src/libs/actions/IOU.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 91d25818ab8fd..6956d4a9cb855 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10093,10 +10093,7 @@ function getHoldReportActionsAndTransactions(reportID: string | undefined) { * @param targetReportID - The ID of the new partial expense report to copy actions to * @returns A tuple of [optimisticData, successData, failureData] OnyxUpdate arrays */ -function getDuplicateActionsForPartialReport( - sourceReportID: string | undefined, - targetReportID: string | undefined, -): [OnyxUpdate[], OnyxUpdate[], OnyxUpdate[]] { +function getDuplicateActionsForPartialReport(sourceReportID: string | undefined, targetReportID: string | undefined): [OnyxUpdate[], OnyxUpdate[], OnyxUpdate[]] { const optimisticData: OnyxUpdate[] = []; const successData: OnyxUpdate[] = []; const failureData: OnyxUpdate[] = []; From 5c53cebff4c35d4a53dcbcf7fd87328f9a2b509a Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:57:59 +0400 Subject: [PATCH 07/11] Refactor: Enhance type definitions in getDuplicateActionsForPartialReport function --- src/libs/actions/IOU.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 83382cf6b86d3..bd64b7bf9b679 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10172,10 +10172,17 @@ function getHoldReportActionsAndTransactions(reportID: string | undefined) { * @param targetReportID - The ID of the new partial expense report to copy actions to * @returns A tuple of [optimisticData, successData, failureData] OnyxUpdate arrays */ -function getDuplicateActionsForPartialReport(sourceReportID: string | undefined, targetReportID: string | undefined): [OnyxUpdate[], OnyxUpdate[], OnyxUpdate[]] { - const optimisticData: OnyxUpdate[] = []; - const successData: OnyxUpdate[] = []; - const failureData: OnyxUpdate[] = []; +function getDuplicateActionsForPartialReport( + sourceReportID: string | undefined, + targetReportID: string | undefined, +): [ + Array>, + Array>, + Array>, +] { + const optimisticData: Array> = []; + const successData: Array> = []; + const failureData: Array> = []; if (!sourceReportID || !targetReportID) { return [optimisticData, successData, failureData]; From e228216949c6277e1adc951fda094fc6392a31d9 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Tue, 23 Dec 2025 15:25:14 +0400 Subject: [PATCH 08/11] revert removed onyx update --- src/libs/actions/IOU.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index bd64b7bf9b679..f4a55cd3974ab 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10459,6 +10459,12 @@ function getReportFromHoldRequestsOnyxData( key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`, value: bringReportActionsBack, }, + // remove hold report actions from the new iou report + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticExpenseReport.reportID}`, + value: null, + }, // add hold transactions back to old iou report { onyxMethod: Onyx.METHOD.MERGE_COLLECTION, From 083840c0a54b56de1ca1fbede09c0db6792d168c Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:47:40 +0400 Subject: [PATCH 09/11] Refactor: Add duplicatedReportActionIDs to PayMoneyRequestParams and update related functions --- src/libs/API/parameters/PayMoneyRequestParams.ts | 8 ++++++++ src/libs/actions/IOU.ts | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/libs/API/parameters/PayMoneyRequestParams.ts b/src/libs/API/parameters/PayMoneyRequestParams.ts index 337c38d7164ea..dfc14b2972338 100644 --- a/src/libs/API/parameters/PayMoneyRequestParams.ts +++ b/src/libs/API/parameters/PayMoneyRequestParams.ts @@ -17,6 +17,14 @@ type PayMoneyRequestParams = { * }> */ optimisticHoldReportExpenseActionIDs?: string; + /** + * Stringified JSON object with type of following structure: + * Array<{ + * optimisticReportActionID: string; + * oldReportActionID: string; + * }> + */ + duplicatedReportActionIDs?: string; }; export default PayMoneyRequestParams; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index f4a55cd3974ab..25c01adfbbcc5 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10170,7 +10170,7 @@ function getHoldReportActionsAndTransactions(reportID: string | undefined) { * * @param sourceReportID - The ID of the original report to copy actions from * @param targetReportID - The ID of the new partial expense report to copy actions to - * @returns A tuple of [optimisticData, successData, failureData] OnyxUpdate arrays + * @returns A tuple of [optimisticData, successData, failureData, duplicatedReportActionIDs] */ function getDuplicateActionsForPartialReport( sourceReportID: string | undefined, @@ -10179,13 +10179,15 @@ function getDuplicateActionsForPartialReport( Array>, Array>, Array>, + OptimisticHoldReportExpenseActionID[], ] { const optimisticData: Array> = []; const successData: Array> = []; const failureData: Array> = []; + const duplicatedReportActionIDs: OptimisticHoldReportExpenseActionID[] = []; if (!sourceReportID || !targetReportID) { - return [optimisticData, successData, failureData]; + return [optimisticData, successData, failureData, duplicatedReportActionIDs]; } const sourceReportActions = getAllReportActions(sourceReportID); @@ -10222,6 +10224,7 @@ function getDuplicateActionsForPartialReport( pendingAction: null, }; copiedActionsFailure[newActionID] = null; + duplicatedReportActionIDs.push({optimisticReportActionID: newActionID, oldReportActionID: action.reportActionID}); } } @@ -10245,7 +10248,7 @@ function getDuplicateActionsForPartialReport( }); } - return [optimisticData, successData, failureData]; + return [optimisticData, successData, failureData, duplicatedReportActionIDs]; } function getReportFromHoldRequestsOnyxData( @@ -10256,6 +10259,7 @@ function getReportFromHoldRequestsOnyxData( optimisticHoldReportID: string; optimisticHoldActionID: string; optimisticHoldReportExpenseActionIDs: OptimisticHoldReportExpenseActionID[]; + duplicatedReportActionIDs: OptimisticHoldReportExpenseActionID[]; optimisticData: OnyxUpdate[]; successData: OnyxUpdate[]; failureData: OnyxUpdate[]; @@ -10474,7 +10478,7 @@ function getReportFromHoldRequestsOnyxData( ]; // Copy submission/approval actions to the new report - const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure] = getDuplicateActionsForPartialReport(iouReport?.reportID, optimisticExpenseReport.reportID); + const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure, duplicatedReportActionIDs] = getDuplicateActionsForPartialReport(iouReport?.reportID, optimisticExpenseReport.reportID); optimisticData.push(...copiedActionsOptimistic); successData.push(...copiedActionsSuccess); failureData.push(...copiedActionsFailure); @@ -10486,6 +10490,7 @@ function getReportFromHoldRequestsOnyxData( successData, optimisticHoldReportID: optimisticExpenseReport.reportID, optimisticHoldReportExpenseActionIDs, + duplicatedReportActionIDs, }; } @@ -10805,6 +10810,7 @@ function getPayMoneyRequestParams({ let optimisticHoldReportID; let optimisticHoldActionID; let optimisticHoldReportExpenseActionIDs; + let duplicatedReportActionIDs; if (!full) { const holdReportOnyxData = getReportFromHoldRequestsOnyxData(chatReport, iouReport, recipient); @@ -10814,6 +10820,7 @@ function getPayMoneyRequestParams({ optimisticHoldReportID = holdReportOnyxData.optimisticHoldReportID; optimisticHoldActionID = holdReportOnyxData.optimisticHoldActionID; optimisticHoldReportExpenseActionIDs = JSON.stringify(holdReportOnyxData.optimisticHoldReportExpenseActionIDs); + duplicatedReportActionIDs = JSON.stringify(holdReportOnyxData.duplicatedReportActionIDs); } return { @@ -10827,6 +10834,7 @@ function getPayMoneyRequestParams({ optimisticHoldReportID, optimisticHoldActionID, optimisticHoldReportExpenseActionIDs, + duplicatedReportActionIDs, ...policyParams, }, optimisticData, From e388a4aabab560b32e113836c7555e3db46069c1 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:55:55 +0400 Subject: [PATCH 10/11] Refactor: Rename duplicatedReportActionIDs to optimisticDuplicatedReportActionIDs and update related functions --- .../parameters/ApproveMoneyRequestParams.ts | 8 +++++++ .../API/parameters/PayMoneyRequestParams.ts | 2 +- src/libs/actions/IOU.ts | 23 +++++++++++-------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/libs/API/parameters/ApproveMoneyRequestParams.ts b/src/libs/API/parameters/ApproveMoneyRequestParams.ts index 521226aeeff24..d67bc97b7de3d 100644 --- a/src/libs/API/parameters/ApproveMoneyRequestParams.ts +++ b/src/libs/API/parameters/ApproveMoneyRequestParams.ts @@ -12,6 +12,14 @@ type ApproveMoneyRequestParams = { * }> */ optimisticHoldReportExpenseActionIDs?: string; + /** + * Stringified JSON object with type of following structure: + * Array<{ + * optimisticReportActionID: string; + * oldReportActionID: string; + * }> + */ + optimisticDuplicatedReportActionIDs?: string; }; export default ApproveMoneyRequestParams; diff --git a/src/libs/API/parameters/PayMoneyRequestParams.ts b/src/libs/API/parameters/PayMoneyRequestParams.ts index dfc14b2972338..af93975566087 100644 --- a/src/libs/API/parameters/PayMoneyRequestParams.ts +++ b/src/libs/API/parameters/PayMoneyRequestParams.ts @@ -24,7 +24,7 @@ type PayMoneyRequestParams = { * oldReportActionID: string; * }> */ - duplicatedReportActionIDs?: string; + optimisticDuplicatedReportActionIDs?: string; }; export default PayMoneyRequestParams; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 25c01adfbbcc5..2b13edf36cfd7 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10184,10 +10184,10 @@ function getDuplicateActionsForPartialReport( const optimisticData: Array> = []; const successData: Array> = []; const failureData: Array> = []; - const duplicatedReportActionIDs: OptimisticHoldReportExpenseActionID[] = []; + const optimisticDuplicatedReportActionIDs: OptimisticHoldReportExpenseActionID[] = []; if (!sourceReportID || !targetReportID) { - return [optimisticData, successData, failureData, duplicatedReportActionIDs]; + return [optimisticData, successData, failureData, optimisticDuplicatedReportActionIDs]; } const sourceReportActions = getAllReportActions(sourceReportID); @@ -10224,7 +10224,7 @@ function getDuplicateActionsForPartialReport( pendingAction: null, }; copiedActionsFailure[newActionID] = null; - duplicatedReportActionIDs.push({optimisticReportActionID: newActionID, oldReportActionID: action.reportActionID}); + optimisticDuplicatedReportActionIDs.push({optimisticReportActionID: newActionID, oldReportActionID: action.reportActionID}); } } @@ -10248,7 +10248,7 @@ function getDuplicateActionsForPartialReport( }); } - return [optimisticData, successData, failureData, duplicatedReportActionIDs]; + return [optimisticData, successData, failureData, optimisticDuplicatedReportActionIDs]; } function getReportFromHoldRequestsOnyxData( @@ -10259,7 +10259,7 @@ function getReportFromHoldRequestsOnyxData( optimisticHoldReportID: string; optimisticHoldActionID: string; optimisticHoldReportExpenseActionIDs: OptimisticHoldReportExpenseActionID[]; - duplicatedReportActionIDs: OptimisticHoldReportExpenseActionID[]; + optimisticDuplicatedReportActionIDs: OptimisticHoldReportExpenseActionID[]; optimisticData: OnyxUpdate[]; successData: OnyxUpdate[]; failureData: OnyxUpdate[]; @@ -10478,7 +10478,7 @@ function getReportFromHoldRequestsOnyxData( ]; // Copy submission/approval actions to the new report - const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure, duplicatedReportActionIDs] = getDuplicateActionsForPartialReport(iouReport?.reportID, optimisticExpenseReport.reportID); + const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure, optimisticDuplicatedReportActionIDs] = getDuplicateActionsForPartialReport(iouReport?.reportID, optimisticExpenseReport.reportID); optimisticData.push(...copiedActionsOptimistic); successData.push(...copiedActionsSuccess); failureData.push(...copiedActionsFailure); @@ -10490,7 +10490,7 @@ function getReportFromHoldRequestsOnyxData( successData, optimisticHoldReportID: optimisticExpenseReport.reportID, optimisticHoldReportExpenseActionIDs, - duplicatedReportActionIDs, + optimisticDuplicatedReportActionIDs, }; } @@ -10810,7 +10810,7 @@ function getPayMoneyRequestParams({ let optimisticHoldReportID; let optimisticHoldActionID; let optimisticHoldReportExpenseActionIDs; - let duplicatedReportActionIDs; + let optimisticDuplicatedReportActionIDs; if (!full) { const holdReportOnyxData = getReportFromHoldRequestsOnyxData(chatReport, iouReport, recipient); @@ -10820,7 +10820,7 @@ function getPayMoneyRequestParams({ optimisticHoldReportID = holdReportOnyxData.optimisticHoldReportID; optimisticHoldActionID = holdReportOnyxData.optimisticHoldActionID; optimisticHoldReportExpenseActionIDs = JSON.stringify(holdReportOnyxData.optimisticHoldReportExpenseActionIDs); - duplicatedReportActionIDs = JSON.stringify(holdReportOnyxData.duplicatedReportActionIDs); + optimisticDuplicatedReportActionIDs = JSON.stringify(holdReportOnyxData.optimisticDuplicatedReportActionIDs); } return { @@ -10834,7 +10834,7 @@ function getPayMoneyRequestParams({ optimisticHoldReportID, optimisticHoldActionID, optimisticHoldReportExpenseActionIDs, - duplicatedReportActionIDs, + optimisticDuplicatedReportActionIDs, ...policyParams, }, optimisticData, @@ -11261,6 +11261,7 @@ function approveMoneyRequest( let optimisticHoldReportID; let optimisticHoldActionID; let optimisticHoldReportExpenseActionIDs; + let optimisticDuplicatedReportActionIDs; if (!full && !!chatReport && !!expenseReport) { const holdReportOnyxData = getReportFromHoldRequestsOnyxData(chatReport, expenseReport, {accountID: expenseReport.ownerAccountID}); @@ -11270,6 +11271,7 @@ function approveMoneyRequest( optimisticHoldReportID = holdReportOnyxData.optimisticHoldReportID; optimisticHoldActionID = holdReportOnyxData.optimisticHoldActionID; optimisticHoldReportExpenseActionIDs = JSON.stringify(holdReportOnyxData.optimisticHoldReportExpenseActionIDs); + optimisticDuplicatedReportActionIDs = JSON.stringify(holdReportOnyxData.optimisticDuplicatedReportActionIDs); } // Remove duplicates violations if we approve the report @@ -11312,6 +11314,7 @@ function approveMoneyRequest( optimisticHoldReportID, optimisticHoldActionID, optimisticHoldReportExpenseActionIDs, + optimisticDuplicatedReportActionIDs, }; playSound(SOUNDS.SUCCESS); From 5754efb16d686c087f6e32753a07df9c8101eb98 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Fri, 26 Dec 2025 16:01:18 +0400 Subject: [PATCH 11/11] chore : prettier --- src/libs/actions/IOU.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 2b13edf36cfd7..81a4aa5719a62 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10478,7 +10478,10 @@ function getReportFromHoldRequestsOnyxData( ]; // Copy submission/approval actions to the new report - const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure, optimisticDuplicatedReportActionIDs] = getDuplicateActionsForPartialReport(iouReport?.reportID, optimisticExpenseReport.reportID); + const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure, optimisticDuplicatedReportActionIDs] = getDuplicateActionsForPartialReport( + iouReport?.reportID, + optimisticExpenseReport.reportID, + ); optimisticData.push(...copiedActionsOptimistic); successData.push(...copiedActionsSuccess); failureData.push(...copiedActionsFailure);