@zeniai/client-epic-state 4.19.37-betaVR26 → 4.19.37-betaVR3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/epic.d.ts +1 -2
- package/lib/epic.js +1 -2
- package/lib/esm/epic.js +1 -2
- package/lib/esm/index.js +2 -2
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +7 -3
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +13 -22
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +1 -7
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +3 -7
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +23 -45
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +24 -65
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +32 -33
- package/lib/esm/view/expenseAutomationView/payload/missingReceiptsPayload.js +16 -63
- package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +26 -153
- package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -108
- package/lib/index.d.ts +2 -2
- package/lib/index.js +32 -36
- package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
- package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.d.ts +5 -2
- package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +6 -2
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +11 -20
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +1 -7
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +2 -6
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.d.ts +2 -3
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +20 -43
- package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.d.ts +3 -11
- package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +22 -63
- package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +7 -5
- package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +28 -29
- package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +31 -30
- package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +18 -69
- package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +6 -25
- package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +27 -155
- package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +0 -6
- package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -108
- package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +1 -16
- package/package.json +2 -2
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -34
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.d.ts +0 -8
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -38
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { createSlice } from '@reduxjs/toolkit';
|
|
2
2
|
import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
|
|
3
|
-
export const getCompletedTransactionsCacheKey = (periodId, sortKey, sortOrder, subTab) => `completed-${subTab}-${sortKey}-${sortOrder === 'ascending' ? 'asc' : 'desc'}-${periodId}`;
|
|
4
3
|
export const initialBulkUploadState = {
|
|
5
4
|
batchDetailsById: {},
|
|
6
|
-
batchDetailsPaginationState: { fetchState: 'Not-Started', error: undefined },
|
|
7
5
|
batchListByPeriod: {},
|
|
8
6
|
batchListFetchState: { fetchState: 'Not-Started', error: undefined },
|
|
9
7
|
batchStatusById: {},
|
|
@@ -12,15 +10,10 @@ export const initialBulkUploadState = {
|
|
|
12
10
|
confirmMatchStatus: { fetchState: 'Not-Started', error: undefined },
|
|
13
11
|
currentBatchId: undefined,
|
|
14
12
|
currentResultsTab: 'unmatched',
|
|
15
|
-
failedBatchDetailIds: [],
|
|
16
13
|
manualSearch: {
|
|
17
14
|
fetchState: { fetchState: 'Not-Started', error: undefined },
|
|
18
|
-
isLoadingMore: false,
|
|
19
|
-
nextPageToken: null,
|
|
20
|
-
pageSize: 25,
|
|
21
15
|
results: [],
|
|
22
16
|
searchQuery: '',
|
|
23
|
-
totalCount: 0,
|
|
24
17
|
},
|
|
25
18
|
phase: 'idle',
|
|
26
19
|
sortKey: 'date',
|
|
@@ -30,7 +23,6 @@ export const initialBulkUploadState = {
|
|
|
30
23
|
};
|
|
31
24
|
export const initialState = {
|
|
32
25
|
bulkUpload: initialBulkUploadState,
|
|
33
|
-
pendingMissingReceiptsTabNavigation: null,
|
|
34
26
|
uploadReceiptStatusById: {},
|
|
35
27
|
refreshStatus: {
|
|
36
28
|
fetchState: 'Not-Started',
|
|
@@ -183,25 +175,13 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
183
175
|
};
|
|
184
176
|
draft.bulkUpload.phase = 'idle';
|
|
185
177
|
},
|
|
186
|
-
|
|
178
|
+
updateBulkUploadBatchStatus(draft, action) {
|
|
187
179
|
const batchStatus = action.payload;
|
|
188
180
|
draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
|
|
189
|
-
/**
|
|
190
|
-
* Auto-matching banner (`phase === 'matching'`) must clear when the server reports this
|
|
191
|
-
* upload batch is done — otherwise the Missing tab keeps MatchingProgressBanner until
|
|
192
|
-
* batch-details APIs run; EmailUploadBanner should show again for the next upload.
|
|
193
|
-
*/
|
|
194
|
-
if (batchStatus.status === 'completed' &&
|
|
195
|
-
draft.bulkUpload.phase === 'matching' &&
|
|
196
|
-
draft.bulkUpload.currentBatchId === batchStatus.batchId) {
|
|
197
|
-
draft.bulkUpload.phase = 'completed';
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
requestMissingReceiptsTabNavigation(draft, action) {
|
|
201
|
-
draft.pendingMissingReceiptsTabNavigation = action.payload.tab;
|
|
202
181
|
},
|
|
203
|
-
|
|
204
|
-
|
|
182
|
+
pusherBatchStatusUpdate(draft, action) {
|
|
183
|
+
const batchStatus = action.payload;
|
|
184
|
+
draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
|
|
205
185
|
},
|
|
206
186
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
207
187
|
fetchBulkUploadBatchDetails(_draft) {
|
|
@@ -219,86 +199,17 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
219
199
|
storeBatchDetails(draft, action) {
|
|
220
200
|
const details = action.payload;
|
|
221
201
|
draft.bulkUpload.batchDetailsById[details.batchId] = details;
|
|
222
|
-
/**
|
|
223
|
-
* Multi-batch fetch paths use `storeBatchDetails` (not `fetchBulkUploadBatchDetailsSuccess`).
|
|
224
|
-
* Without this, `phase` stays `matching` after upload forever and the Unmatched tab keeps
|
|
225
|
-
* showing the skeleton (`bulkUploadPhase === 'matching'` in web-components).
|
|
226
|
-
*/
|
|
227
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
228
|
-
draft.bulkUpload.currentBatchId === details.batchId) {
|
|
229
|
-
draft.bulkUpload.phase = 'completed';
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
batchDetailFetchFailed(draft, action) {
|
|
233
|
-
const { batchId } = action.payload;
|
|
234
|
-
if (!draft.bulkUpload.failedBatchDetailIds.includes(batchId)) {
|
|
235
|
-
draft.bulkUpload.failedBatchDetailIds.push(batchId);
|
|
236
|
-
}
|
|
237
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
238
|
-
draft.bulkUpload.currentBatchId === batchId) {
|
|
239
|
-
draft.bulkUpload.phase = 'completed';
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
setInitialBatchDetailsLoading(draft) {
|
|
243
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
244
|
-
fetchState: 'In-Progress',
|
|
245
|
-
error: undefined,
|
|
246
|
-
};
|
|
247
|
-
},
|
|
248
|
-
fetchMoreBatchDetails(_draft) {
|
|
249
|
-
_draft.bulkUpload.batchDetailsPaginationState = {
|
|
250
|
-
fetchState: 'In-Progress',
|
|
251
|
-
error: undefined,
|
|
252
|
-
};
|
|
253
|
-
},
|
|
254
|
-
fetchMoreBatchDetailsComplete(draft) {
|
|
255
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
256
|
-
fetchState: 'Completed',
|
|
257
|
-
error: undefined,
|
|
258
|
-
};
|
|
259
|
-
const currentId = draft.bulkUpload.currentBatchId;
|
|
260
|
-
const currentDetails = currentId != null
|
|
261
|
-
? draft.bulkUpload.batchDetailsById[currentId]
|
|
262
|
-
: undefined;
|
|
263
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
264
|
-
currentId != null &&
|
|
265
|
-
currentDetails?.status === 'completed') {
|
|
266
|
-
draft.bulkUpload.phase = 'completed';
|
|
267
|
-
}
|
|
268
|
-
},
|
|
269
|
-
fetchMoreBatchDetailsFailure(draft, action) {
|
|
270
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
271
|
-
fetchState: 'Error',
|
|
272
|
-
error: action.payload.error,
|
|
273
|
-
};
|
|
274
202
|
},
|
|
275
203
|
fetchBulkUploadBatches: {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
draft.bulkUpload.batchDetailsById = {};
|
|
279
|
-
draft.bulkUpload.failedBatchDetailIds = [];
|
|
280
|
-
}
|
|
204
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
205
|
+
reducer(draft, _action) {
|
|
281
206
|
draft.bulkUpload.batchListFetchState = {
|
|
282
207
|
fetchState: 'In-Progress',
|
|
283
208
|
error: undefined,
|
|
284
209
|
};
|
|
285
210
|
},
|
|
286
|
-
prepare(
|
|
287
|
-
|
|
288
|
-
return {
|
|
289
|
-
payload: {
|
|
290
|
-
cacheOverride: input === true,
|
|
291
|
-
invalidateBatchDetailsCache: false,
|
|
292
|
-
},
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
const o = input ?? {};
|
|
296
|
-
return {
|
|
297
|
-
payload: {
|
|
298
|
-
cacheOverride: o.cacheOverride === true,
|
|
299
|
-
invalidateBatchDetailsCache: o.invalidateBatchDetailsCache === true,
|
|
300
|
-
},
|
|
301
|
-
};
|
|
211
|
+
prepare(cacheOverride = false) {
|
|
212
|
+
return { payload: { cacheOverride } };
|
|
302
213
|
},
|
|
303
214
|
},
|
|
304
215
|
fetchBulkUploadBatchesSuccess(draft, action) {
|
|
@@ -308,20 +219,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
308
219
|
fetchState: 'Completed',
|
|
309
220
|
error: undefined,
|
|
310
221
|
};
|
|
311
|
-
/**
|
|
312
|
-
* When the multi-batch-details epic has nothing to fetch (e.g. list rows not `completed`
|
|
313
|
-
* yet, or details already present), `phase` can stay `matching` even though we already
|
|
314
|
-
* have completed details for `currentBatchId` (from polling / Pusher). Sync so the UI can
|
|
315
|
-
* dismiss the Unmatched skeleton.
|
|
316
|
-
*/
|
|
317
|
-
const currentId = draft.bulkUpload.currentBatchId;
|
|
318
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
319
|
-
currentId != null) {
|
|
320
|
-
const existing = draft.bulkUpload.batchDetailsById[currentId];
|
|
321
|
-
if (existing?.status === 'completed') {
|
|
322
|
-
draft.bulkUpload.phase = 'completed';
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
222
|
},
|
|
326
223
|
fetchBulkUploadBatchesFailure(draft, action) {
|
|
327
224
|
draft.bulkUpload.batchListFetchState = {
|
|
@@ -376,6 +273,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
376
273
|
},
|
|
377
274
|
setBulkUploadCompletedSubTab(draft, action) {
|
|
378
275
|
draft.bulkUpload.completedSubTab = action.payload;
|
|
276
|
+
draft.bulkUpload.completedTransactionsByPeriod = {};
|
|
379
277
|
},
|
|
380
278
|
setBulkUploadSortConfig(draft, action) {
|
|
381
279
|
draft.bulkUpload.sortKey = action.payload.sortKey;
|
|
@@ -383,51 +281,28 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
383
281
|
},
|
|
384
282
|
clearBulkUpload(draft) {
|
|
385
283
|
Object.assign(draft.bulkUpload, initialBulkUploadState);
|
|
386
|
-
draft.pendingMissingReceiptsTabNavigation = null;
|
|
387
284
|
},
|
|
388
285
|
searchTransactionsForManualMatch: {
|
|
389
286
|
reducer(draft, action) {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
else {
|
|
397
|
-
draft.bulkUpload.manualSearch.isLoadingMore = false;
|
|
398
|
-
draft.bulkUpload.manualSearch.results = [];
|
|
399
|
-
draft.bulkUpload.manualSearch.nextPageToken = null;
|
|
400
|
-
draft.bulkUpload.manualSearch.totalCount = 0;
|
|
401
|
-
draft.bulkUpload.manualSearch.fetchState = {
|
|
402
|
-
fetchState: 'In-Progress',
|
|
403
|
-
error: undefined,
|
|
404
|
-
};
|
|
405
|
-
}
|
|
287
|
+
draft.bulkUpload.manualSearch.searchQuery = action.payload.query;
|
|
288
|
+
draft.bulkUpload.manualSearch.fetchState = {
|
|
289
|
+
fetchState: 'In-Progress',
|
|
290
|
+
error: undefined,
|
|
291
|
+
};
|
|
292
|
+
draft.bulkUpload.manualSearch.results = [];
|
|
406
293
|
},
|
|
407
|
-
prepare(query
|
|
408
|
-
return { payload: { query
|
|
294
|
+
prepare(query) {
|
|
295
|
+
return { payload: { query } };
|
|
409
296
|
},
|
|
410
297
|
},
|
|
411
298
|
searchTransactionsForManualMatchSuccess(draft, action) {
|
|
412
|
-
|
|
413
|
-
if (append) {
|
|
414
|
-
const merged = [...draft.bulkUpload.manualSearch.results, ...results];
|
|
415
|
-
const byId = new Map(merged.map((r) => [r.transactionId, r]));
|
|
416
|
-
draft.bulkUpload.manualSearch.results = Array.from(byId.values());
|
|
417
|
-
}
|
|
418
|
-
else {
|
|
419
|
-
draft.bulkUpload.manualSearch.results = results;
|
|
420
|
-
}
|
|
421
|
-
draft.bulkUpload.manualSearch.nextPageToken = nextPageToken;
|
|
422
|
-
draft.bulkUpload.manualSearch.totalCount = totalCount;
|
|
423
|
-
draft.bulkUpload.manualSearch.isLoadingMore = false;
|
|
299
|
+
draft.bulkUpload.manualSearch.results = action.payload;
|
|
424
300
|
draft.bulkUpload.manualSearch.fetchState = {
|
|
425
301
|
fetchState: 'Completed',
|
|
426
302
|
error: undefined,
|
|
427
303
|
};
|
|
428
304
|
},
|
|
429
305
|
searchTransactionsForManualMatchFailure(draft, action) {
|
|
430
|
-
draft.bulkUpload.manualSearch.isLoadingMore = false;
|
|
431
306
|
draft.bulkUpload.manualSearch.fetchState = {
|
|
432
307
|
fetchState: 'Error',
|
|
433
308
|
error: action.payload.error,
|
|
@@ -453,16 +328,15 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
453
328
|
}
|
|
454
329
|
}
|
|
455
330
|
},
|
|
456
|
-
prepare(pageToken
|
|
457
|
-
return { payload: { pageToken
|
|
331
|
+
prepare(pageToken) {
|
|
332
|
+
return { payload: { pageToken } };
|
|
458
333
|
},
|
|
459
334
|
},
|
|
460
335
|
fetchCompletedTransactionsSuccess(draft, action) {
|
|
461
336
|
const { transactionIds, nextPageToken, totalCount, selectedPeriod, isInitialLoad } = action.payload;
|
|
462
337
|
const periodId = toMonthYearPeriodId(selectedPeriod);
|
|
463
|
-
const cacheKey = getCompletedTransactionsCacheKey(periodId, draft.bulkUpload.sortKey, draft.bulkUpload.sortOrder, draft.bulkUpload.completedSubTab);
|
|
464
338
|
if (isInitialLoad) {
|
|
465
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
339
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
466
340
|
transactionIds,
|
|
467
341
|
nextPageToken,
|
|
468
342
|
totalCount,
|
|
@@ -470,7 +344,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
470
344
|
};
|
|
471
345
|
}
|
|
472
346
|
else {
|
|
473
|
-
const existing = draft.bulkUpload.completedTransactionsByPeriod[
|
|
347
|
+
const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
|
|
474
348
|
if (existing != null) {
|
|
475
349
|
existing.transactionIds.push(...transactionIds);
|
|
476
350
|
existing.nextPageToken = nextPageToken;
|
|
@@ -478,7 +352,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
478
352
|
existing.fetchState = { fetchState: 'Completed', error: undefined };
|
|
479
353
|
}
|
|
480
354
|
else {
|
|
481
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
355
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
482
356
|
transactionIds,
|
|
483
357
|
nextPageToken,
|
|
484
358
|
totalCount,
|
|
@@ -489,8 +363,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
489
363
|
},
|
|
490
364
|
fetchCompletedTransactionsFailure(draft, action) {
|
|
491
365
|
const periodId = toMonthYearPeriodId(action.payload.selectedPeriod);
|
|
492
|
-
const
|
|
493
|
-
const existing = draft.bulkUpload.completedTransactionsByPeriod[cacheKey];
|
|
366
|
+
const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
|
|
494
367
|
if (existing != null) {
|
|
495
368
|
existing.fetchState = {
|
|
496
369
|
fetchState: 'Error',
|
|
@@ -498,7 +371,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
498
371
|
};
|
|
499
372
|
}
|
|
500
373
|
else {
|
|
501
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
374
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
502
375
|
fetchState: { fetchState: 'Error', error: action.payload.error },
|
|
503
376
|
nextPageToken: null,
|
|
504
377
|
totalCount: 0,
|
|
@@ -510,7 +383,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
510
383
|
});
|
|
511
384
|
export const { fetchMissingReceipts, fetchMissingReceiptsSuccess, fetchMissingReceiptsFailure, uploadMissingReceiptSuccess, updateMissingReceiptUploadState, updateMissingReceiptsUIState, markMissingReceiptAsDone, clearExpenseAutomationMissingReceiptsView,
|
|
512
385
|
// Bulk Upload
|
|
513
|
-
bulkUploadReceipts, updateBulkUploadProgress, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure,
|
|
386
|
+
bulkUploadReceipts, updateBulkUploadProgress, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, updateBulkUploadBatchStatus, pusherBatchStatusUpdate, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults,
|
|
514
387
|
// Completed Transactions
|
|
515
388
|
fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, } = expenseAutomationMissingReceiptsView.actions;
|
|
516
389
|
export default expenseAutomationMissingReceiptsView.reducer;
|
|
@@ -3,8 +3,6 @@ import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
|
|
|
3
3
|
import { getCurrentTenant } from '../../../entity/tenant/tenantSelector';
|
|
4
4
|
import { getSupportedTransactionById, getSupportedTransactionsByIds, } from '../../../entity/transaction/transactionSelector';
|
|
5
5
|
import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
|
|
6
|
-
import { isBatchListStatusCompleted } from '../payload/missingReceiptsPayload';
|
|
7
|
-
import { getCompletedTransactionsCacheKey } from '../reducers/missingReceiptsViewReducer';
|
|
8
6
|
export function getExpenseAutomationMissingReceiptsView(state) {
|
|
9
7
|
const { expenseAutomationMissingReceiptsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState, } = state;
|
|
10
8
|
const currentTenant = getCurrentTenant(state);
|
|
@@ -49,32 +47,14 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
49
47
|
const completionStatus = missingReceiptsCompletionStatus != null
|
|
50
48
|
? missingReceiptsCompletionStatus
|
|
51
49
|
: 'incomplete';
|
|
52
|
-
const { bulkUpload
|
|
50
|
+
const { bulkUpload } = expenseAutomationMissingReceiptsViewState;
|
|
53
51
|
const currentBatchStatus = bulkUpload.currentBatchId != null
|
|
54
52
|
? bulkUpload.batchStatusById[bulkUpload.currentBatchId]
|
|
55
53
|
: undefined;
|
|
56
|
-
const
|
|
57
|
-
? bulkUpload.
|
|
58
|
-
: [];
|
|
59
|
-
/**
|
|
60
|
-
* Primary "Unmatched" batch = first completed batch in platform list order, preferring the
|
|
61
|
-
* first batch that still has un_matched/no_match work when any completed batch has such work.
|
|
62
|
-
* Batches without details yet: wait if the list row still reports unmatched work; otherwise skip
|
|
63
|
-
* so we do not block the whole tab while other rows are not fetched yet.
|
|
64
|
-
*/
|
|
65
|
-
const primaryBatchIdFromDetailsOrder = getPrimaryBatchIdFromBatchListOrder(batchList, bulkUpload.batchDetailsById, bulkUpload.failedBatchDetailIds);
|
|
66
|
-
/** During upload/matching, the in-flight batch may not appear in batchList yet — prefer currentBatchId. */
|
|
67
|
-
const unmatchedSectionBatchId = bulkUpload.phase === 'matching' || bulkUpload.phase === 'uploading'
|
|
68
|
-
? bulkUpload.currentBatchId ?? primaryBatchIdFromDetailsOrder
|
|
69
|
-
: primaryBatchIdFromDetailsOrder;
|
|
70
|
-
const completedBatchesInApiOrder = batchList.filter((b) => isBatchListStatusCompleted(b.status));
|
|
71
|
-
const currentBatchDetails = unmatchedSectionBatchId != null
|
|
72
|
-
? bulkUpload.batchDetailsById[unmatchedSectionBatchId]
|
|
54
|
+
const currentBatchDetails = bulkUpload.currentBatchId != null
|
|
55
|
+
? bulkUpload.batchDetailsById[bulkUpload.currentBatchId]
|
|
73
56
|
: undefined;
|
|
74
|
-
const resolvedFiles = currentBatchDetails?.files.map((file) => resolveBatchFile(file,
|
|
75
|
-
const failedIds = new Set(bulkUpload.failedBatchDetailIds);
|
|
76
|
-
const hasMoreBatchDetails = completedBatchesInApiOrder.some((b) => bulkUpload.batchDetailsById[b.batchId] == null &&
|
|
77
|
-
!failedIds.has(b.batchId));
|
|
57
|
+
const resolvedFiles = currentBatchDetails?.files.map((file) => resolveBatchFile(file, transactionState));
|
|
78
58
|
const getSortValue = (file) => {
|
|
79
59
|
const t = file.matchedTransaction;
|
|
80
60
|
if (t == null) {
|
|
@@ -112,14 +92,11 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
112
92
|
: 0,
|
|
113
93
|
}
|
|
114
94
|
: { total: 0, processed: 0, percentage: 0 };
|
|
95
|
+
const batchList = monthYearPeriodId != null
|
|
96
|
+
? bulkUpload.batchListByPeriod[monthYearPeriodId] ?? []
|
|
97
|
+
: [];
|
|
115
98
|
const batchListFetchState = bulkUpload.batchListFetchState;
|
|
116
|
-
|
|
117
|
-
* When primary batch is not resolved yet, still aggregate unmatched files from every batch
|
|
118
|
-
* that has details loaded (otherwise past is empty and receipts vanish from the UI).
|
|
119
|
-
*/
|
|
120
|
-
const pastBatches = unmatchedSectionBatchId != null
|
|
121
|
-
? batchList.filter((b) => b.batchId !== unmatchedSectionBatchId)
|
|
122
|
-
: batchList;
|
|
99
|
+
const pastBatches = batchList.filter((b) => b.batchId !== bulkUpload.currentBatchId);
|
|
123
100
|
const pastUnmatchedFiles = pastBatches.flatMap((b) => {
|
|
124
101
|
const details = bulkUpload.batchDetailsById[b.batchId];
|
|
125
102
|
if (details == null) {
|
|
@@ -127,13 +104,10 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
127
104
|
}
|
|
128
105
|
return details.files
|
|
129
106
|
.filter((f) => f.status === 'un_matched' || f.status === 'no_match')
|
|
130
|
-
.map((f) => resolveBatchFile(f,
|
|
107
|
+
.map((f) => resolveBatchFile(f, transactionState));
|
|
131
108
|
});
|
|
132
|
-
const
|
|
133
|
-
?
|
|
134
|
-
: undefined;
|
|
135
|
-
const completedTransactionsForPeriod = completedTransactionsCacheKey != null
|
|
136
|
-
? bulkUpload.completedTransactionsByPeriod[completedTransactionsCacheKey]
|
|
109
|
+
const completedTransactionsForPeriod = monthYearPeriodId != null
|
|
110
|
+
? bulkUpload.completedTransactionsByPeriod[monthYearPeriodId]
|
|
137
111
|
: undefined;
|
|
138
112
|
const completedTransactionIds = completedTransactionsForPeriod?.transactionIds ?? [];
|
|
139
113
|
const resolvedCompletedTransactions = getSupportedTransactionsByIds(transactionState, completedTransactionIds);
|
|
@@ -146,13 +120,6 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
146
120
|
summary: currentBatchDetails.summary,
|
|
147
121
|
}
|
|
148
122
|
: undefined;
|
|
149
|
-
const manualSearchResults = bulkUpload.manualSearch.results.map((r) => {
|
|
150
|
-
const t = getSupportedTransactionById(transactionState, r.transactionId);
|
|
151
|
-
return {
|
|
152
|
-
...r,
|
|
153
|
-
vendorLogo: r.vendorLogo ?? t?.logo?.href,
|
|
154
|
-
};
|
|
155
|
-
});
|
|
156
123
|
return {
|
|
157
124
|
fetchState,
|
|
158
125
|
error,
|
|
@@ -161,7 +128,6 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
161
128
|
refreshStatus,
|
|
162
129
|
transactions: sortedTransactions,
|
|
163
130
|
completionStatus,
|
|
164
|
-
pendingMissingReceiptsTabNavigation: pendingMissingReceiptsTabNavigation ?? null,
|
|
165
131
|
bulkUpload: {
|
|
166
132
|
phase: bulkUpload.phase,
|
|
167
133
|
uploadStatus: bulkUpload.uploadStatus,
|
|
@@ -188,71 +154,12 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
188
154
|
pastBatches,
|
|
189
155
|
pastUnmatchedFiles,
|
|
190
156
|
confirmMatchStatus: bulkUpload.confirmMatchStatus,
|
|
191
|
-
|
|
192
|
-
batchDetailsPaginationState: bulkUpload.batchDetailsPaginationState,
|
|
193
|
-
manualSearch: {
|
|
194
|
-
...bulkUpload.manualSearch,
|
|
195
|
-
results: manualSearchResults,
|
|
196
|
-
},
|
|
157
|
+
manualSearch: bulkUpload.manualSearch,
|
|
197
158
|
uploadProgress: bulkUpload.uploadProgress,
|
|
198
159
|
},
|
|
199
160
|
};
|
|
200
161
|
}
|
|
201
|
-
function
|
|
202
|
-
return details.files.some((f) => f.status === 'un_matched' || f.status === 'no_match');
|
|
203
|
-
}
|
|
204
|
-
/** List row summary before batch details load — aligns with unmatched / possible-match work. */
|
|
205
|
-
function batchListItemHasUnmatchedWork(batch) {
|
|
206
|
-
return batch.noMatchCount > 0 || batch.possibleMatchesCount > 0;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* `batchList` must match platform order (same sequence as the bulk-upload batches API). Picks the
|
|
210
|
-
* primary batch for the top "Unmatched" section. Skips failed detail fetches.
|
|
211
|
-
*
|
|
212
|
-
* If details are not loaded for an earlier list row but that row reports no unmatched work, we
|
|
213
|
-
* skip it so later rows with loaded details can be primary (avoids an empty tab when the first
|
|
214
|
-
* fetch page only loaded later batches). If the list reports unmatched work but details are still
|
|
215
|
-
* loading, we wait (undefined) so primary order stays correct once details arrive.
|
|
216
|
-
*/
|
|
217
|
-
function getPrimaryBatchIdFromBatchListOrder(batchListInPlatformOrder, batchDetailsById, failedBatchDetailIds) {
|
|
218
|
-
const failedIds = new Set(failedBatchDetailIds);
|
|
219
|
-
const anyCompletedBatchHasUnmatchedWork = batchListInPlatformOrder.some((b) => {
|
|
220
|
-
if (failedIds.has(b.batchId)) {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
const d = batchDetailsById[b.batchId];
|
|
224
|
-
if (d != null &&
|
|
225
|
-
d.status === 'completed' &&
|
|
226
|
-
batchDetailsHasUnmatchedWork(d)) {
|
|
227
|
-
return true;
|
|
228
|
-
}
|
|
229
|
-
return d == null && batchListItemHasUnmatchedWork(b);
|
|
230
|
-
});
|
|
231
|
-
for (const batch of batchListInPlatformOrder) {
|
|
232
|
-
if (failedIds.has(batch.batchId)) {
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
const details = batchDetailsById[batch.batchId];
|
|
236
|
-
if (details == null) {
|
|
237
|
-
if (batchListItemHasUnmatchedWork(batch)) {
|
|
238
|
-
return undefined;
|
|
239
|
-
}
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
if (details.status !== 'completed') {
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
|
-
if (anyCompletedBatchHasUnmatchedWork) {
|
|
246
|
-
if (batchDetailsHasUnmatchedWork(details)) {
|
|
247
|
-
return batch.batchId;
|
|
248
|
-
}
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
return batch.batchId;
|
|
252
|
-
}
|
|
253
|
-
return undefined;
|
|
254
|
-
}
|
|
255
|
-
function resolveBatchFile(file, batchId, transactionState) {
|
|
162
|
+
function resolveBatchFile(file, transactionState) {
|
|
256
163
|
const matchedTransaction = file.matchedTransactionId != null
|
|
257
164
|
? getSupportedTransactionById(transactionState, file.matchedTransactionId)
|
|
258
165
|
: undefined;
|
|
@@ -266,8 +173,6 @@ function resolveBatchFile(file, batchId, transactionState) {
|
|
|
266
173
|
.filter((c) => c != null);
|
|
267
174
|
return {
|
|
268
175
|
attachmentId: file.attachmentId,
|
|
269
|
-
batchId,
|
|
270
|
-
fileDownloadUrl: file.fileDownloadUrl,
|
|
271
176
|
fileId: file.fileId,
|
|
272
177
|
filename: file.filename,
|
|
273
178
|
filePreviewUrl: file.filePreviewUrl,
|
package/lib/index.d.ts
CHANGED
|
@@ -263,7 +263,7 @@ import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLine
|
|
|
263
263
|
import { UploadStatementDocumentAIPayload, UploadStatementDocumentAIResponse } from './view/expenseAutomationView/payload/reconciliationPayload';
|
|
264
264
|
import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
|
|
265
265
|
import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryJeSchedule as retryExpenseAutomationJESchedule, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
|
|
266
|
-
import { bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, storeBatchDetails,
|
|
266
|
+
import { bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, storeBatchDetails, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, updateBulkUploadBatchStatus, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
|
|
267
267
|
import { deleteAccountStatement, fetchReconciliation as fetchReconciliationView, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, updateAccountReconciliationLocalData as updateExpenseAutomationAccountReconciliationLocalData, updateSelectedAccountId as updateExpenseAutomationAccountReconciliationSelectedAccountId, updateSelectedTab as updateExpenseAutomationAccountReconciliationSelectedTab, updateReconListScrollPosition as updateExpenseAutomationReconListScrollPosition, updateReviewTabSortState as updateExpenseAutomationReconReviewTabListSortState, updateReviewTabLocalData as updateExpenseAutomationReconReviewTabLocalData, updateReconcileTabListScrollState as updateExpenseAutomationReconcileTabListScrollState, updateReconcileTabListSortState as updateExpenseAutomationReconcileTabListSortState, updateReconcileTabLocalData as updateExpenseAutomationReconcileTabLocalData, updateSelectedDrawerAccountId as updateExpenseAutomationSelectedDrawerAccountId, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
|
|
268
268
|
import { clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState } from './view/expenseAutomationView/reducers/transactionsViewReducer';
|
|
269
269
|
import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
|
|
@@ -615,7 +615,7 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
|
|
|
615
615
|
export { ClassesViewSelectorReportV2 };
|
|
616
616
|
export { BalancesTimeseries, TrendTimeseries, BalanceKind };
|
|
617
617
|
export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
|
|
618
|
-
export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, MatchCandidate, MatchSource, MissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, updateBulkUploadProgress, pusherBatchStatusUpdate,
|
|
618
|
+
export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, MatchCandidate, MatchSource, MissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, updateBulkUploadBatchStatus, updateBulkUploadProgress, pusherBatchStatusUpdate, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
|
|
619
619
|
export { JEScheduleLocalData };
|
|
620
620
|
export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
|
|
621
621
|
export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
|