@@ -7,13 +7,21 @@ import {getIOUActionForTransactions} from '@libs/actions/IOU/Duplicate';
77import { getIOURequestPolicyID } from '@libs/actions/IOU/MoneyRequest' ;
88import { initSplitExpenseItemData } from '@libs/actions/IOU/SplitExpenseItems' ;
99import { updateSplitTransactions } from '@libs/actions/IOU/SplitTransactionUpdate' ;
10+ import initSplitExpense from '@libs/actions/SplitExpenses' ;
1011import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID' ;
12+ import { calculateAmount as calculateIOUAmount } from '@libs/IOUUtils' ;
1113import { getOriginalMessage , isMoneyRequestAction } from '@libs/ReportActionsUtils' ;
1214import { getActiveGroupSearchHashes } from '@libs/SearchUIUtils' ;
13- import { getChildTransactions , getOriginalTransactionWithSplitInfo } from '@libs/TransactionUtils' ;
15+ import {
16+ getChildTransactions ,
17+ getOriginalTransactionWithSplitInfo ,
18+ isPerDiemRequest as isPerDiemRequestTransactionUtils ,
19+ shouldRedirectDeleteToSplitExpenseEdit ,
20+ } from '@libs/TransactionUtils' ;
1421import CONST from '@src/CONST' ;
1522import ONYXKEYS from '@src/ONYXKEYS' ;
1623import type { Policy , Report , ReportAction , Transaction , TransactionViolations } from '@src/types/onyx' ;
24+ import type { SplitExpense } from '@src/types/onyx/IOU' ;
1725import useArchivedReportsIdSet from './useArchivedReportsIdSet' ;
1826import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails' ;
1927import useNetwork from './useNetwork' ;
@@ -29,6 +37,24 @@ type UseDeleteTransactionsParams = {
2937 policy ?: Policy ;
3038} ;
3139
40+ type DeleteTransactionsResult =
41+ | {
42+ action : 'redirected' ;
43+ }
44+ | {
45+ action : 'deleted' ;
46+ deletedTransactionThreadReportIDs : string [ ] ;
47+ } ;
48+
49+ function redistributeRemainingPerDiemSplitExpenses ( splitExpenses : SplitExpense [ ] , total : number , currency : string ) : SplitExpense [ ] {
50+ const lastSplitIndex = splitExpenses . length - 1 ;
51+
52+ return splitExpenses . map ( ( splitExpense , index ) => ( {
53+ ...splitExpense ,
54+ amount : calculateIOUAmount ( lastSplitIndex , total , currency , index === lastSplitIndex , true ) ,
55+ } ) ) ;
56+ }
57+
3258/**
3359 * Pure hook for deleting transactions
3460 * All data must be provided through function parameters
@@ -53,15 +79,41 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
5379 const [ personalDetails ] = useOnyx ( ONYXKEYS . PERSONAL_DETAILS_LIST ) ;
5480 const { isOffline} = useNetwork ( ) ;
5581
82+ const getSplitExpenseEditTransactionOnDelete = useCallback (
83+ ( transactionIDs : string [ ] ) : Transaction | undefined => {
84+ if ( transactionIDs . length !== 1 ) {
85+ return undefined ;
86+ }
87+
88+ const transaction = allTransactions ?. [ `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ transactionIDs . at ( 0 ) } ` ] ;
89+
90+ if ( ! transaction ) {
91+ return undefined ;
92+ }
93+
94+ const originalTransaction = allTransactions ?. [ `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ transaction . comment ?. originalTransactionID } ` ] ;
95+ if ( ! shouldRedirectDeleteToSplitExpenseEdit ( transaction , originalTransaction ) ) {
96+ return undefined ;
97+ }
98+
99+ return transaction ;
100+ } ,
101+ [ allTransactions ] ,
102+ ) ;
103+
104+ const shouldOpenSplitExpenseEditFlowOnDelete = useCallback (
105+ ( transactionIDs : string [ ] ) : boolean => ! ! getSplitExpenseEditTransactionOnDelete ( transactionIDs ) ,
106+ [ getSplitExpenseEditTransactionOnDelete ] ,
107+ ) ;
108+
56109 /**
57110 * Delete transactions by IDs
58111 * @param transactionIDs - Array of transaction IDs to delete
59112 * @param duplicateTransactions - Collection of duplicate transactions
60113 * @param duplicateTransactionViolations - Collection of duplicate transaction violations
61114 * @param currentSearchHash - Current search hash for updating split transactions
62- * @param onClearSelection - Optional callback to clear selection after deletion
63115 * @param isSingleTransactionView - Optional flag indicating if the deletion is from a single transaction view
64- * @returns Array of deleted transaction thread report IDs for navigation handling
116+ * @returns Result describing whether the delete redirected or deleted transaction threads
65117 */
66118 const deleteTransactions = useCallback (
67119 (
@@ -70,9 +122,21 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
70122 duplicateTransactionViolations : OnyxCollection < TransactionViolations > ,
71123 currentSearchHash ?: number ,
72124 isSingleTransactionView ?: boolean ,
73- ) : string [ ] => {
125+ ) : DeleteTransactionsResult => {
74126 if ( ! transactionIDs . length ) {
75- return [ ] ;
127+ return {
128+ action : 'deleted' ,
129+ deletedTransactionThreadReportIDs : [ ] ,
130+ } ;
131+ }
132+
133+ const splitExpenseEditTransaction = getSplitExpenseEditTransactionOnDelete ( transactionIDs ) ;
134+
135+ if ( splitExpenseEditTransaction ) {
136+ initSplitExpense ( splitExpenseEditTransaction , policy , { navigateToEditSplitExpense : true } ) ;
137+ return {
138+ action : 'redirected' ,
139+ } ;
76140 }
77141
78142 const iouActions = reportActions . filter ( ( action ) => isMoneyRequestAction ( action ) ) ;
@@ -122,6 +186,10 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
122186 const originalTransactionIouActions = getIOUActionForTransactions ( [ transactionID ] , report ?. reportID ) ;
123187 const iouReportID = isMoneyRequestAction ( originalTransactionIouActions . at ( 0 ) ) ? getOriginalMessage ( originalTransactionIouActions . at ( 0 ) ) ?. IOUReportID : undefined ;
124188 const iouReport = allReports ?. [ `${ ONYXKEYS . COLLECTION . REPORT } ${ iouReportID } ` ] ;
189+ const splitExpensesTotal = allChildTransactions . reduce ( ( total , childTransaction ) => {
190+ const transactionReport = allReports ?. [ `${ ONYXKEYS . COLLECTION . REPORT } ${ childTransaction ?. reportID } ` ] ;
191+ return total + initSplitExpenseItemData ( childTransaction , transactionReport ) . amount ;
192+ } , 0 ) ;
125193 const policyRecentlyUsedCategories =
126194 allPolicyRecentlyUsedCategories ?. [
127195 `${ ONYXKEYS . COLLECTION . POLICY_RECENTLY_USED_CATEGORIES } ${ getNonEmptyStringOnyxID ( getIOURequestPolicyID ( originalTransaction , report ) ) } `
@@ -141,6 +209,11 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
141209 const transactionReport = allReports ?. [ `${ ONYXKEYS . COLLECTION . REPORT } ${ childTransaction ?. reportID } ` ] ;
142210 return initSplitExpenseItemData ( childTransaction , transactionReport ) ;
143211 } ) ;
212+ const remainingSplitExpensesTotal = remainingSplitExpenses . reduce ( ( total , splitExpense ) => total + splitExpense . amount , 0 ) ;
213+ const updatedRemainingSplitExpenses =
214+ originalTransaction && isPerDiemRequestTransactionUtils ( originalTransaction ) && remainingSplitExpenses . length > 0 && remainingSplitExpensesTotal !== splitExpensesTotal
215+ ? redistributeRemainingPerDiemSplitExpenses ( remainingSplitExpenses , splitExpensesTotal , originalTransaction . currency ?? CONST . CURRENCY . USD )
216+ : remainingSplitExpenses ;
144217
145218 const parentTransactionReport = allReports ?. [ `${ ONYXKEYS . COLLECTION . REPORT } ${ report ?. parentReportID } ` ] ;
146219 const expenseReport = report ?. type === CONST . REPORT . TYPE . EXPENSE ? report : parentTransactionReport ;
@@ -156,11 +229,8 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
156229 transactionData : {
157230 reportID : report ?. reportID ?? String ( CONST . DEFAULT_NUMBER_ID ) ,
158231 originalTransactionID : transactionID ,
159- splitExpenses : remainingSplitExpenses ,
160- splitExpensesTotal : allChildTransactions . reduce ( ( total , childTransaction ) => {
161- const transactionReport = allReports ?. [ `${ ONYXKEYS . COLLECTION . REPORT } ${ childTransaction ?. reportID } ` ] ;
162- return total + initSplitExpenseItemData ( childTransaction , transactionReport ) . amount ;
163- } , 0 ) ,
232+ splitExpenses : updatedRemainingSplitExpenses ,
233+ splitExpensesTotal,
164234 } ,
165235 searchContext : {
166236 currentSearchHash,
@@ -216,7 +286,10 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
216286 }
217287 }
218288
219- return Array . from ( deletedTransactionThreadReportIDs ) ;
289+ return {
290+ action : 'deleted' ,
291+ deletedTransactionThreadReportIDs : Array . from ( deletedTransactionThreadReportIDs ) ,
292+ } ;
220293 } ,
221294 [
222295 allPolicyRecentlyUsedCategories ,
@@ -240,12 +313,14 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
240313 betas ,
241314 allPolicyTags ,
242315 personalDetails ,
316+ getSplitExpenseEditTransactionOnDelete ,
243317 isOffline ,
244318 ] ,
245319 ) ;
246320
247321 return {
248322 deleteTransactions,
323+ shouldOpenSplitExpenseEditFlowOnDelete,
249324 } ;
250325}
251326
0 commit comments