@zeniai/client-epic-state 4.19.37-betaVR27 → 4.19.37-betaVR4
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/confirmBulkUploadMatchEpic.js +2 -2
- 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 -163
- package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -109
- package/lib/index.d.ts +2 -2
- package/lib/index.js +32 -37
- package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
- package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +1 -1
- 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 -165
- package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +0 -8
- package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -109
- package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +1 -21
- 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,16 +10,10 @@ export const initialBulkUploadState = {
|
|
|
12
10
|
confirmMatchStatus: { fetchState: 'Not-Started', error: undefined },
|
|
13
11
|
currentBatchId: undefined,
|
|
14
12
|
currentResultsTab: 'unmatched',
|
|
15
|
-
failedBatchDetailIds: [],
|
|
16
|
-
manualSearchUiResetKey: 0,
|
|
17
13
|
manualSearch: {
|
|
18
14
|
fetchState: { fetchState: 'Not-Started', error: undefined },
|
|
19
|
-
isLoadingMore: false,
|
|
20
|
-
nextPageToken: null,
|
|
21
|
-
pageSize: 25,
|
|
22
15
|
results: [],
|
|
23
16
|
searchQuery: '',
|
|
24
|
-
totalCount: 0,
|
|
25
17
|
},
|
|
26
18
|
phase: 'idle',
|
|
27
19
|
sortKey: 'date',
|
|
@@ -31,7 +23,6 @@ export const initialBulkUploadState = {
|
|
|
31
23
|
};
|
|
32
24
|
export const initialState = {
|
|
33
25
|
bulkUpload: initialBulkUploadState,
|
|
34
|
-
pendingMissingReceiptsTabNavigation: null,
|
|
35
26
|
uploadReceiptStatusById: {},
|
|
36
27
|
refreshStatus: {
|
|
37
28
|
fetchState: 'Not-Started',
|
|
@@ -184,25 +175,13 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
184
175
|
};
|
|
185
176
|
draft.bulkUpload.phase = 'idle';
|
|
186
177
|
},
|
|
187
|
-
|
|
178
|
+
updateBulkUploadBatchStatus(draft, action) {
|
|
188
179
|
const batchStatus = action.payload;
|
|
189
180
|
draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
|
|
190
|
-
/**
|
|
191
|
-
* Auto-matching banner (`phase === 'matching'`) must clear when the server reports this
|
|
192
|
-
* upload batch is done — otherwise the Missing tab keeps MatchingProgressBanner until
|
|
193
|
-
* batch-details APIs run; EmailUploadBanner should show again for the next upload.
|
|
194
|
-
*/
|
|
195
|
-
if (batchStatus.status === 'completed' &&
|
|
196
|
-
draft.bulkUpload.phase === 'matching' &&
|
|
197
|
-
draft.bulkUpload.currentBatchId === batchStatus.batchId) {
|
|
198
|
-
draft.bulkUpload.phase = 'completed';
|
|
199
|
-
}
|
|
200
181
|
},
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
clearMissingReceiptsTabNavigation(draft) {
|
|
205
|
-
draft.pendingMissingReceiptsTabNavigation = null;
|
|
182
|
+
pusherBatchStatusUpdate(draft, action) {
|
|
183
|
+
const batchStatus = action.payload;
|
|
184
|
+
draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
|
|
206
185
|
},
|
|
207
186
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
208
187
|
fetchBulkUploadBatchDetails(_draft) {
|
|
@@ -220,86 +199,17 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
220
199
|
storeBatchDetails(draft, action) {
|
|
221
200
|
const details = action.payload;
|
|
222
201
|
draft.bulkUpload.batchDetailsById[details.batchId] = details;
|
|
223
|
-
/**
|
|
224
|
-
* Multi-batch fetch paths use `storeBatchDetails` (not `fetchBulkUploadBatchDetailsSuccess`).
|
|
225
|
-
* Without this, `phase` stays `matching` after upload forever and the Unmatched tab keeps
|
|
226
|
-
* showing the skeleton (`bulkUploadPhase === 'matching'` in web-components).
|
|
227
|
-
*/
|
|
228
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
229
|
-
draft.bulkUpload.currentBatchId === details.batchId) {
|
|
230
|
-
draft.bulkUpload.phase = 'completed';
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
batchDetailFetchFailed(draft, action) {
|
|
234
|
-
const { batchId } = action.payload;
|
|
235
|
-
if (!draft.bulkUpload.failedBatchDetailIds.includes(batchId)) {
|
|
236
|
-
draft.bulkUpload.failedBatchDetailIds.push(batchId);
|
|
237
|
-
}
|
|
238
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
239
|
-
draft.bulkUpload.currentBatchId === batchId) {
|
|
240
|
-
draft.bulkUpload.phase = 'completed';
|
|
241
|
-
}
|
|
242
|
-
},
|
|
243
|
-
setInitialBatchDetailsLoading(draft) {
|
|
244
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
245
|
-
fetchState: 'In-Progress',
|
|
246
|
-
error: undefined,
|
|
247
|
-
};
|
|
248
|
-
},
|
|
249
|
-
fetchMoreBatchDetails(_draft) {
|
|
250
|
-
_draft.bulkUpload.batchDetailsPaginationState = {
|
|
251
|
-
fetchState: 'In-Progress',
|
|
252
|
-
error: undefined,
|
|
253
|
-
};
|
|
254
|
-
},
|
|
255
|
-
fetchMoreBatchDetailsComplete(draft) {
|
|
256
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
257
|
-
fetchState: 'Completed',
|
|
258
|
-
error: undefined,
|
|
259
|
-
};
|
|
260
|
-
const currentId = draft.bulkUpload.currentBatchId;
|
|
261
|
-
const currentDetails = currentId != null
|
|
262
|
-
? draft.bulkUpload.batchDetailsById[currentId]
|
|
263
|
-
: undefined;
|
|
264
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
265
|
-
currentId != null &&
|
|
266
|
-
currentDetails?.status === 'completed') {
|
|
267
|
-
draft.bulkUpload.phase = 'completed';
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
fetchMoreBatchDetailsFailure(draft, action) {
|
|
271
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
272
|
-
fetchState: 'Error',
|
|
273
|
-
error: action.payload.error,
|
|
274
|
-
};
|
|
275
202
|
},
|
|
276
203
|
fetchBulkUploadBatches: {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
draft.bulkUpload.batchDetailsById = {};
|
|
280
|
-
draft.bulkUpload.failedBatchDetailIds = [];
|
|
281
|
-
}
|
|
204
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
205
|
+
reducer(draft, _action) {
|
|
282
206
|
draft.bulkUpload.batchListFetchState = {
|
|
283
207
|
fetchState: 'In-Progress',
|
|
284
208
|
error: undefined,
|
|
285
209
|
};
|
|
286
210
|
},
|
|
287
|
-
prepare(
|
|
288
|
-
|
|
289
|
-
return {
|
|
290
|
-
payload: {
|
|
291
|
-
cacheOverride: input === true,
|
|
292
|
-
invalidateBatchDetailsCache: false,
|
|
293
|
-
},
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
const o = input ?? {};
|
|
297
|
-
return {
|
|
298
|
-
payload: {
|
|
299
|
-
cacheOverride: o.cacheOverride === true,
|
|
300
|
-
invalidateBatchDetailsCache: o.invalidateBatchDetailsCache === true,
|
|
301
|
-
},
|
|
302
|
-
};
|
|
211
|
+
prepare(cacheOverride = false) {
|
|
212
|
+
return { payload: { cacheOverride } };
|
|
303
213
|
},
|
|
304
214
|
},
|
|
305
215
|
fetchBulkUploadBatchesSuccess(draft, action) {
|
|
@@ -309,20 +219,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
309
219
|
fetchState: 'Completed',
|
|
310
220
|
error: undefined,
|
|
311
221
|
};
|
|
312
|
-
/**
|
|
313
|
-
* When the multi-batch-details epic has nothing to fetch (e.g. list rows not `completed`
|
|
314
|
-
* yet, or details already present), `phase` can stay `matching` even though we already
|
|
315
|
-
* have completed details for `currentBatchId` (from polling / Pusher). Sync so the UI can
|
|
316
|
-
* dismiss the Unmatched skeleton.
|
|
317
|
-
*/
|
|
318
|
-
const currentId = draft.bulkUpload.currentBatchId;
|
|
319
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
320
|
-
currentId != null) {
|
|
321
|
-
const existing = draft.bulkUpload.batchDetailsById[currentId];
|
|
322
|
-
if (existing?.status === 'completed') {
|
|
323
|
-
draft.bulkUpload.phase = 'completed';
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
222
|
},
|
|
327
223
|
fetchBulkUploadBatchesFailure(draft, action) {
|
|
328
224
|
draft.bulkUpload.batchListFetchState = {
|
|
@@ -365,8 +261,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
365
261
|
}
|
|
366
262
|
}
|
|
367
263
|
}
|
|
368
|
-
draft.bulkUpload.manualSearch = initialBulkUploadState.manualSearch;
|
|
369
|
-
draft.bulkUpload.manualSearchUiResetKey += 1;
|
|
370
264
|
},
|
|
371
265
|
confirmBulkUploadMatchFailure(draft, action) {
|
|
372
266
|
draft.bulkUpload.confirmMatchStatus = {
|
|
@@ -379,6 +273,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
379
273
|
},
|
|
380
274
|
setBulkUploadCompletedSubTab(draft, action) {
|
|
381
275
|
draft.bulkUpload.completedSubTab = action.payload;
|
|
276
|
+
draft.bulkUpload.completedTransactionsByPeriod = {};
|
|
382
277
|
},
|
|
383
278
|
setBulkUploadSortConfig(draft, action) {
|
|
384
279
|
draft.bulkUpload.sortKey = action.payload.sortKey;
|
|
@@ -386,51 +281,28 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
386
281
|
},
|
|
387
282
|
clearBulkUpload(draft) {
|
|
388
283
|
Object.assign(draft.bulkUpload, initialBulkUploadState);
|
|
389
|
-
draft.pendingMissingReceiptsTabNavigation = null;
|
|
390
284
|
},
|
|
391
285
|
searchTransactionsForManualMatch: {
|
|
392
286
|
reducer(draft, action) {
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
else {
|
|
400
|
-
draft.bulkUpload.manualSearch.isLoadingMore = false;
|
|
401
|
-
draft.bulkUpload.manualSearch.results = [];
|
|
402
|
-
draft.bulkUpload.manualSearch.nextPageToken = null;
|
|
403
|
-
draft.bulkUpload.manualSearch.totalCount = 0;
|
|
404
|
-
draft.bulkUpload.manualSearch.fetchState = {
|
|
405
|
-
fetchState: 'In-Progress',
|
|
406
|
-
error: undefined,
|
|
407
|
-
};
|
|
408
|
-
}
|
|
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 = [];
|
|
409
293
|
},
|
|
410
|
-
prepare(query
|
|
411
|
-
return { payload: { query
|
|
294
|
+
prepare(query) {
|
|
295
|
+
return { payload: { query } };
|
|
412
296
|
},
|
|
413
297
|
},
|
|
414
298
|
searchTransactionsForManualMatchSuccess(draft, action) {
|
|
415
|
-
|
|
416
|
-
if (append) {
|
|
417
|
-
const merged = [...draft.bulkUpload.manualSearch.results, ...results];
|
|
418
|
-
const byId = new Map(merged.map((r) => [r.transactionId, r]));
|
|
419
|
-
draft.bulkUpload.manualSearch.results = Array.from(byId.values());
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
draft.bulkUpload.manualSearch.results = results;
|
|
423
|
-
}
|
|
424
|
-
draft.bulkUpload.manualSearch.nextPageToken = nextPageToken;
|
|
425
|
-
draft.bulkUpload.manualSearch.totalCount = totalCount;
|
|
426
|
-
draft.bulkUpload.manualSearch.isLoadingMore = false;
|
|
299
|
+
draft.bulkUpload.manualSearch.results = action.payload;
|
|
427
300
|
draft.bulkUpload.manualSearch.fetchState = {
|
|
428
301
|
fetchState: 'Completed',
|
|
429
302
|
error: undefined,
|
|
430
303
|
};
|
|
431
304
|
},
|
|
432
305
|
searchTransactionsForManualMatchFailure(draft, action) {
|
|
433
|
-
draft.bulkUpload.manualSearch.isLoadingMore = false;
|
|
434
306
|
draft.bulkUpload.manualSearch.fetchState = {
|
|
435
307
|
fetchState: 'Error',
|
|
436
308
|
error: action.payload.error,
|
|
@@ -438,13 +310,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
438
310
|
},
|
|
439
311
|
clearManualSearchResults(draft) {
|
|
440
312
|
draft.bulkUpload.manualSearch = initialBulkUploadState.manualSearch;
|
|
441
|
-
draft.bulkUpload.manualSearchUiResetKey += 1;
|
|
442
|
-
},
|
|
443
|
-
acknowledgeBulkUploadConfirmMatchComplete(draft) {
|
|
444
|
-
draft.bulkUpload.confirmMatchStatus = {
|
|
445
|
-
fetchState: 'Not-Started',
|
|
446
|
-
error: undefined,
|
|
447
|
-
};
|
|
448
313
|
},
|
|
449
314
|
// -- Completed Transactions Actions --
|
|
450
315
|
fetchCompletedTransactions: {
|
|
@@ -463,16 +328,15 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
463
328
|
}
|
|
464
329
|
}
|
|
465
330
|
},
|
|
466
|
-
prepare(pageToken
|
|
467
|
-
return { payload: { pageToken
|
|
331
|
+
prepare(pageToken) {
|
|
332
|
+
return { payload: { pageToken } };
|
|
468
333
|
},
|
|
469
334
|
},
|
|
470
335
|
fetchCompletedTransactionsSuccess(draft, action) {
|
|
471
336
|
const { transactionIds, nextPageToken, totalCount, selectedPeriod, isInitialLoad } = action.payload;
|
|
472
337
|
const periodId = toMonthYearPeriodId(selectedPeriod);
|
|
473
|
-
const cacheKey = getCompletedTransactionsCacheKey(periodId, draft.bulkUpload.sortKey, draft.bulkUpload.sortOrder, draft.bulkUpload.completedSubTab);
|
|
474
338
|
if (isInitialLoad) {
|
|
475
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
339
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
476
340
|
transactionIds,
|
|
477
341
|
nextPageToken,
|
|
478
342
|
totalCount,
|
|
@@ -480,7 +344,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
480
344
|
};
|
|
481
345
|
}
|
|
482
346
|
else {
|
|
483
|
-
const existing = draft.bulkUpload.completedTransactionsByPeriod[
|
|
347
|
+
const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
|
|
484
348
|
if (existing != null) {
|
|
485
349
|
existing.transactionIds.push(...transactionIds);
|
|
486
350
|
existing.nextPageToken = nextPageToken;
|
|
@@ -488,7 +352,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
488
352
|
existing.fetchState = { fetchState: 'Completed', error: undefined };
|
|
489
353
|
}
|
|
490
354
|
else {
|
|
491
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
355
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
492
356
|
transactionIds,
|
|
493
357
|
nextPageToken,
|
|
494
358
|
totalCount,
|
|
@@ -499,8 +363,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
499
363
|
},
|
|
500
364
|
fetchCompletedTransactionsFailure(draft, action) {
|
|
501
365
|
const periodId = toMonthYearPeriodId(action.payload.selectedPeriod);
|
|
502
|
-
const
|
|
503
|
-
const existing = draft.bulkUpload.completedTransactionsByPeriod[cacheKey];
|
|
366
|
+
const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
|
|
504
367
|
if (existing != null) {
|
|
505
368
|
existing.fetchState = {
|
|
506
369
|
fetchState: 'Error',
|
|
@@ -508,7 +371,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
508
371
|
};
|
|
509
372
|
}
|
|
510
373
|
else {
|
|
511
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
374
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
512
375
|
fetchState: { fetchState: 'Error', error: action.payload.error },
|
|
513
376
|
nextPageToken: null,
|
|
514
377
|
totalCount: 0,
|
|
@@ -520,7 +383,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
|
|
|
520
383
|
});
|
|
521
384
|
export const { fetchMissingReceipts, fetchMissingReceiptsSuccess, fetchMissingReceiptsFailure, uploadMissingReceiptSuccess, updateMissingReceiptUploadState, updateMissingReceiptsUIState, markMissingReceiptAsDone, clearExpenseAutomationMissingReceiptsView,
|
|
522
385
|
// Bulk Upload
|
|
523
|
-
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,
|
|
524
387
|
// Completed Transactions
|
|
525
388
|
fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, } = expenseAutomationMissingReceiptsView.actions;
|
|
526
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,72 +154,12 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
188
154
|
pastBatches,
|
|
189
155
|
pastUnmatchedFiles,
|
|
190
156
|
confirmMatchStatus: bulkUpload.confirmMatchStatus,
|
|
191
|
-
|
|
192
|
-
hasMoreBatchDetails,
|
|
193
|
-
batchDetailsPaginationState: bulkUpload.batchDetailsPaginationState,
|
|
194
|
-
manualSearch: {
|
|
195
|
-
...bulkUpload.manualSearch,
|
|
196
|
-
results: manualSearchResults,
|
|
197
|
-
},
|
|
157
|
+
manualSearch: bulkUpload.manualSearch,
|
|
198
158
|
uploadProgress: bulkUpload.uploadProgress,
|
|
199
159
|
},
|
|
200
160
|
};
|
|
201
161
|
}
|
|
202
|
-
function
|
|
203
|
-
return details.files.some((f) => f.status === 'un_matched' || f.status === 'no_match');
|
|
204
|
-
}
|
|
205
|
-
/** List row summary before batch details load — aligns with unmatched / possible-match work. */
|
|
206
|
-
function batchListItemHasUnmatchedWork(batch) {
|
|
207
|
-
return batch.noMatchCount > 0 || batch.possibleMatchesCount > 0;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* `batchList` must match platform order (same sequence as the bulk-upload batches API). Picks the
|
|
211
|
-
* primary batch for the top "Unmatched" section. Skips failed detail fetches.
|
|
212
|
-
*
|
|
213
|
-
* If details are not loaded for an earlier list row but that row reports no unmatched work, we
|
|
214
|
-
* skip it so later rows with loaded details can be primary (avoids an empty tab when the first
|
|
215
|
-
* fetch page only loaded later batches). If the list reports unmatched work but details are still
|
|
216
|
-
* loading, we wait (undefined) so primary order stays correct once details arrive.
|
|
217
|
-
*/
|
|
218
|
-
function getPrimaryBatchIdFromBatchListOrder(batchListInPlatformOrder, batchDetailsById, failedBatchDetailIds) {
|
|
219
|
-
const failedIds = new Set(failedBatchDetailIds);
|
|
220
|
-
const anyCompletedBatchHasUnmatchedWork = batchListInPlatformOrder.some((b) => {
|
|
221
|
-
if (failedIds.has(b.batchId)) {
|
|
222
|
-
return false;
|
|
223
|
-
}
|
|
224
|
-
const d = batchDetailsById[b.batchId];
|
|
225
|
-
if (d != null &&
|
|
226
|
-
d.status === 'completed' &&
|
|
227
|
-
batchDetailsHasUnmatchedWork(d)) {
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
return d == null && batchListItemHasUnmatchedWork(b);
|
|
231
|
-
});
|
|
232
|
-
for (const batch of batchListInPlatformOrder) {
|
|
233
|
-
if (failedIds.has(batch.batchId)) {
|
|
234
|
-
continue;
|
|
235
|
-
}
|
|
236
|
-
const details = batchDetailsById[batch.batchId];
|
|
237
|
-
if (details == null) {
|
|
238
|
-
if (batchListItemHasUnmatchedWork(batch)) {
|
|
239
|
-
return undefined;
|
|
240
|
-
}
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
if (details.status !== 'completed') {
|
|
244
|
-
continue;
|
|
245
|
-
}
|
|
246
|
-
if (anyCompletedBatchHasUnmatchedWork) {
|
|
247
|
-
if (batchDetailsHasUnmatchedWork(details)) {
|
|
248
|
-
return batch.batchId;
|
|
249
|
-
}
|
|
250
|
-
continue;
|
|
251
|
-
}
|
|
252
|
-
return batch.batchId;
|
|
253
|
-
}
|
|
254
|
-
return undefined;
|
|
255
|
-
}
|
|
256
|
-
function resolveBatchFile(file, batchId, transactionState) {
|
|
162
|
+
function resolveBatchFile(file, transactionState) {
|
|
257
163
|
const matchedTransaction = file.matchedTransactionId != null
|
|
258
164
|
? getSupportedTransactionById(transactionState, file.matchedTransactionId)
|
|
259
165
|
: undefined;
|
|
@@ -267,8 +173,6 @@ function resolveBatchFile(file, batchId, transactionState) {
|
|
|
267
173
|
.filter((c) => c != null);
|
|
268
174
|
return {
|
|
269
175
|
attachmentId: file.attachmentId,
|
|
270
|
-
batchId,
|
|
271
|
-
fileDownloadUrl: file.fileDownloadUrl,
|
|
272
176
|
fileId: file.fileId,
|
|
273
177
|
filename: file.filename,
|
|
274
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, };
|