diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 5c908129a53e..93d0d29f56a7 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -2,7 +2,7 @@ import {format} from 'date-fns'; import {fastMerge, Str} from 'expensify-common'; import type {NullishDeep, OnyxCollection, OnyxEntry, OnyxInputValue, OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; -import type {ValueOf} from 'type-fest'; +import type {PartialDeep, ValueOf} from 'type-fest'; import ReceiptGeneric from '@assets/images/receipt-generic.png'; import * as API from '@libs/API'; import type { @@ -7412,11 +7412,98 @@ function mergeDuplicates(params: TransactionMergeParams) { }; }); + const duplicateTransactionTotals = params.transactionIDList.reduce((total, id) => { + const duplicateTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`]; + if (!duplicateTransaction) { + return total; + } + return total + duplicateTransaction.amount; + }, 0); + + const expenseReport = ReportConnection.getAllReports()?.[`${ONYXKEYS.COLLECTION.REPORT}${params.reportID}`]; + const expenseReportOptimisticData: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${params.reportID}`, + value: { + total: (expenseReport?.total ?? 0) - duplicateTransactionTotals, + }, + }; + const expenseReportFailureData: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${params.reportID}`, + value: { + total: expenseReport?.total, + }, + }; + + const iouActionsToDelete = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${params.reportID}`] ?? {})?.filter( + (reportAction): reportAction is ReportAction => { + if (!ReportActionsUtils.isMoneyRequestAction(reportAction)) { + return false; + } + const message = ReportActionsUtils.getOriginalMessage(reportAction); + if (!message?.IOUTransactionID) { + return false; + } + return params.transactionIDList.includes(message.IOUTransactionID); + }, + ); + + const deletedTime = DateUtils.getDBTime(); + const expenseReportActionsOptimisticData: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${params.reportID}`, + value: iouActionsToDelete.reduce>>>((val, reportAction) => { + // eslint-disable-next-line no-param-reassign + val[reportAction.reportActionID] = { + originalMessage: { + deleted: deletedTime, + }, + ...(Array.isArray(reportAction.message) && + !!reportAction.message[0] && { + message: [ + { + ...reportAction.message[0], + deleted: deletedTime, + }, + ...reportAction.message.slice(1), + ], + }), + ...(!Array.isArray(reportAction.message) && { + message: { + deleted: deletedTime, + }, + }), + }; + return val; + }, {}), + }; + const expenseReportActionsFailureData: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${params.reportID}`, + value: iouActionsToDelete.reduce>>>>((val, reportAction) => { + // eslint-disable-next-line no-param-reassign + val[reportAction.reportActionID] = { + originalMessage: { + deleted: null, + }, + message: reportAction.message, + }; + return val; + }, {}), + }; + const optimisticData: OnyxUpdate[] = []; const failureData: OnyxUpdate[] = []; - optimisticData.push(optimisticTransactionData, ...optimisticTransactionDuplicatesData, ...optimisticTransactionViolations); - failureData.push(failureTransactionData, ...failureTransactionDuplicatesData, ...failureTransactionViolations); + optimisticData.push( + optimisticTransactionData, + ...optimisticTransactionDuplicatesData, + ...optimisticTransactionViolations, + expenseReportOptimisticData, + expenseReportActionsOptimisticData, + ); + failureData.push(failureTransactionData, ...failureTransactionDuplicatesData, ...failureTransactionViolations, expenseReportFailureData, expenseReportActionsFailureData); API.write(WRITE_COMMANDS.TRANSACTION_MERGE, params, {optimisticData, failureData}); }