@zeniai/client-epic-state 4.19.37-betaVR19 → 4.19.37-betaVR2
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 +8 -4
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +2 -2
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +1 -6
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +3 -7
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +15 -24
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +32 -32
- package/lib/esm/view/expenseAutomationView/payload/missingReceiptsPayload.js +12 -15
- package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +13 -73
- package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +12 -99
- 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 +7 -3
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +2 -2
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +1 -6
- 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 +12 -25
- package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +7 -5
- package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +28 -28
- package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +16 -15
- package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +13 -16
- package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +3 -12
- package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +14 -75
- package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +1 -7
- package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +12 -99
- package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +2 -10
- package/package.json +2 -2
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -36
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.d.ts +0 -8
- package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -43
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.fetchCompletedTransactionsFailure = exports.fetchCompletedTransactionsSuccess = exports.fetchCompletedTransactions = exports.clearManualSearchResults = exports.searchTransactionsForManualMatchFailure = exports.searchTransactionsForManualMatchSuccess = exports.searchTransactionsForManualMatch = exports.clearBulkUpload = exports.setBulkUploadSortConfig = exports.setBulkUploadCompletedSubTab = exports.setBulkUploadResultsTab = exports.confirmBulkUploadMatchFailure = exports.confirmBulkUploadMatchSuccess = exports.confirmBulkUploadMatch = exports.fetchBulkUploadBatchesFailure = exports.fetchBulkUploadBatchesSuccess = exports.fetchBulkUploadBatches = exports.
|
|
4
|
+
exports.fetchCompletedTransactionsFailure = exports.fetchCompletedTransactionsSuccess = exports.fetchCompletedTransactions = exports.clearManualSearchResults = exports.searchTransactionsForManualMatchFailure = exports.searchTransactionsForManualMatchSuccess = exports.searchTransactionsForManualMatch = exports.clearBulkUpload = exports.setBulkUploadSortConfig = exports.setBulkUploadCompletedSubTab = exports.setBulkUploadResultsTab = exports.confirmBulkUploadMatchFailure = exports.confirmBulkUploadMatchSuccess = exports.confirmBulkUploadMatch = exports.fetchBulkUploadBatchesFailure = exports.fetchBulkUploadBatchesSuccess = exports.fetchBulkUploadBatches = exports.storeBatchDetails = exports.fetchBulkUploadBatchDetailsFailure = exports.fetchBulkUploadBatchDetailsSuccess = exports.fetchBulkUploadBatchDetails = exports.pusherBatchStatusUpdate = exports.updateBulkUploadBatchStatus = exports.bulkUploadReceiptsFailure = exports.bulkUploadReceiptsSuccess = exports.updateBulkUploadProgress = exports.bulkUploadReceipts = exports.clearExpenseAutomationMissingReceiptsView = exports.markMissingReceiptAsDone = exports.updateMissingReceiptsUIState = exports.updateMissingReceiptUploadState = exports.uploadMissingReceiptSuccess = exports.fetchMissingReceiptsFailure = exports.fetchMissingReceiptsSuccess = exports.fetchMissingReceipts = exports.initialState = exports.initialBulkUploadState = void 0;
|
|
5
5
|
const toolkit_1 = require("@reduxjs/toolkit");
|
|
6
6
|
const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
|
|
7
|
-
const getCompletedTransactionsCacheKey = (periodId, sortKey, sortOrder, subTab) => `completed-${subTab}-${sortKey}-${sortOrder === 'ascending' ? 'asc' : 'desc'}-${periodId}`;
|
|
8
|
-
exports.getCompletedTransactionsCacheKey = getCompletedTransactionsCacheKey;
|
|
9
7
|
exports.initialBulkUploadState = {
|
|
10
8
|
batchDetailsById: {},
|
|
11
|
-
batchDetailsPaginationState: { fetchState: 'Not-Started', error: undefined },
|
|
12
9
|
batchListByPeriod: {},
|
|
13
10
|
batchListFetchState: { fetchState: 'Not-Started', error: undefined },
|
|
14
11
|
batchStatusById: {},
|
|
@@ -17,7 +14,6 @@ exports.initialBulkUploadState = {
|
|
|
17
14
|
confirmMatchStatus: { fetchState: 'Not-Started', error: undefined },
|
|
18
15
|
currentBatchId: undefined,
|
|
19
16
|
currentResultsTab: 'unmatched',
|
|
20
|
-
failedBatchDetailIds: [],
|
|
21
17
|
manualSearch: {
|
|
22
18
|
fetchState: { fetchState: 'Not-Started', error: undefined },
|
|
23
19
|
results: [],
|
|
@@ -31,7 +27,6 @@ exports.initialBulkUploadState = {
|
|
|
31
27
|
};
|
|
32
28
|
exports.initialState = {
|
|
33
29
|
bulkUpload: exports.initialBulkUploadState,
|
|
34
|
-
pendingMissingReceiptsTabNavigation: null,
|
|
35
30
|
uploadReceiptStatusById: {},
|
|
36
31
|
refreshStatus: {
|
|
37
32
|
fetchState: 'Not-Started',
|
|
@@ -184,15 +179,13 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
184
179
|
};
|
|
185
180
|
draft.bulkUpload.phase = 'idle';
|
|
186
181
|
},
|
|
187
|
-
|
|
182
|
+
updateBulkUploadBatchStatus(draft, action) {
|
|
188
183
|
const batchStatus = action.payload;
|
|
189
184
|
draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
|
|
190
185
|
},
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
clearMissingReceiptsTabNavigation(draft) {
|
|
195
|
-
draft.pendingMissingReceiptsTabNavigation = null;
|
|
186
|
+
pusherBatchStatusUpdate(draft, action) {
|
|
187
|
+
const batchStatus = action.payload;
|
|
188
|
+
draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
|
|
196
189
|
},
|
|
197
190
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
198
191
|
fetchBulkUploadBatchDetails(_draft) {
|
|
@@ -210,58 +203,6 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
210
203
|
storeBatchDetails(draft, action) {
|
|
211
204
|
const details = action.payload;
|
|
212
205
|
draft.bulkUpload.batchDetailsById[details.batchId] = details;
|
|
213
|
-
/**
|
|
214
|
-
* Multi-batch fetch paths use `storeBatchDetails` (not `fetchBulkUploadBatchDetailsSuccess`).
|
|
215
|
-
* Without this, `phase` stays `matching` after upload forever and the Unmatched tab keeps
|
|
216
|
-
* showing the skeleton (`bulkUploadPhase === 'matching'` in web-components).
|
|
217
|
-
*/
|
|
218
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
219
|
-
draft.bulkUpload.currentBatchId === details.batchId) {
|
|
220
|
-
draft.bulkUpload.phase = 'completed';
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
batchDetailFetchFailed(draft, action) {
|
|
224
|
-
const { batchId } = action.payload;
|
|
225
|
-
if (!draft.bulkUpload.failedBatchDetailIds.includes(batchId)) {
|
|
226
|
-
draft.bulkUpload.failedBatchDetailIds.push(batchId);
|
|
227
|
-
}
|
|
228
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
229
|
-
draft.bulkUpload.currentBatchId === batchId) {
|
|
230
|
-
draft.bulkUpload.phase = 'completed';
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
setInitialBatchDetailsLoading(draft) {
|
|
234
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
235
|
-
fetchState: 'In-Progress',
|
|
236
|
-
error: undefined,
|
|
237
|
-
};
|
|
238
|
-
},
|
|
239
|
-
fetchMoreBatchDetails(_draft) {
|
|
240
|
-
_draft.bulkUpload.batchDetailsPaginationState = {
|
|
241
|
-
fetchState: 'In-Progress',
|
|
242
|
-
error: undefined,
|
|
243
|
-
};
|
|
244
|
-
},
|
|
245
|
-
fetchMoreBatchDetailsComplete(draft) {
|
|
246
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
247
|
-
fetchState: 'Completed',
|
|
248
|
-
error: undefined,
|
|
249
|
-
};
|
|
250
|
-
const currentId = draft.bulkUpload.currentBatchId;
|
|
251
|
-
const currentDetails = currentId != null
|
|
252
|
-
? draft.bulkUpload.batchDetailsById[currentId]
|
|
253
|
-
: undefined;
|
|
254
|
-
if (draft.bulkUpload.phase === 'matching' &&
|
|
255
|
-
currentId != null &&
|
|
256
|
-
currentDetails?.status === 'completed') {
|
|
257
|
-
draft.bulkUpload.phase = 'completed';
|
|
258
|
-
}
|
|
259
|
-
},
|
|
260
|
-
fetchMoreBatchDetailsFailure(draft, action) {
|
|
261
|
-
draft.bulkUpload.batchDetailsPaginationState = {
|
|
262
|
-
fetchState: 'Error',
|
|
263
|
-
error: action.payload.error,
|
|
264
|
-
};
|
|
265
206
|
},
|
|
266
207
|
fetchBulkUploadBatches: {
|
|
267
208
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -336,6 +277,7 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
336
277
|
},
|
|
337
278
|
setBulkUploadCompletedSubTab(draft, action) {
|
|
338
279
|
draft.bulkUpload.completedSubTab = action.payload;
|
|
280
|
+
draft.bulkUpload.completedTransactionsByPeriod = {};
|
|
339
281
|
},
|
|
340
282
|
setBulkUploadSortConfig(draft, action) {
|
|
341
283
|
draft.bulkUpload.sortKey = action.payload.sortKey;
|
|
@@ -343,7 +285,6 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
343
285
|
},
|
|
344
286
|
clearBulkUpload(draft) {
|
|
345
287
|
Object.assign(draft.bulkUpload, exports.initialBulkUploadState);
|
|
346
|
-
draft.pendingMissingReceiptsTabNavigation = null;
|
|
347
288
|
},
|
|
348
289
|
searchTransactionsForManualMatch: {
|
|
349
290
|
reducer(draft, action) {
|
|
@@ -391,16 +332,15 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
391
332
|
}
|
|
392
333
|
}
|
|
393
334
|
},
|
|
394
|
-
prepare(pageToken
|
|
395
|
-
return { payload: { pageToken
|
|
335
|
+
prepare(pageToken) {
|
|
336
|
+
return { payload: { pageToken } };
|
|
396
337
|
},
|
|
397
338
|
},
|
|
398
339
|
fetchCompletedTransactionsSuccess(draft, action) {
|
|
399
340
|
const { transactionIds, nextPageToken, totalCount, selectedPeriod, isInitialLoad } = action.payload;
|
|
400
341
|
const periodId = (0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod);
|
|
401
|
-
const cacheKey = (0, exports.getCompletedTransactionsCacheKey)(periodId, draft.bulkUpload.sortKey, draft.bulkUpload.sortOrder, draft.bulkUpload.completedSubTab);
|
|
402
342
|
if (isInitialLoad) {
|
|
403
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
343
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
404
344
|
transactionIds,
|
|
405
345
|
nextPageToken,
|
|
406
346
|
totalCount,
|
|
@@ -408,7 +348,7 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
408
348
|
};
|
|
409
349
|
}
|
|
410
350
|
else {
|
|
411
|
-
const existing = draft.bulkUpload.completedTransactionsByPeriod[
|
|
351
|
+
const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
|
|
412
352
|
if (existing != null) {
|
|
413
353
|
existing.transactionIds.push(...transactionIds);
|
|
414
354
|
existing.nextPageToken = nextPageToken;
|
|
@@ -416,7 +356,7 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
416
356
|
existing.fetchState = { fetchState: 'Completed', error: undefined };
|
|
417
357
|
}
|
|
418
358
|
else {
|
|
419
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
359
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
420
360
|
transactionIds,
|
|
421
361
|
nextPageToken,
|
|
422
362
|
totalCount,
|
|
@@ -427,8 +367,7 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
427
367
|
},
|
|
428
368
|
fetchCompletedTransactionsFailure(draft, action) {
|
|
429
369
|
const periodId = (0, timePeriod_1.toMonthYearPeriodId)(action.payload.selectedPeriod);
|
|
430
|
-
const
|
|
431
|
-
const existing = draft.bulkUpload.completedTransactionsByPeriod[cacheKey];
|
|
370
|
+
const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
|
|
432
371
|
if (existing != null) {
|
|
433
372
|
existing.fetchState = {
|
|
434
373
|
fetchState: 'Error',
|
|
@@ -436,7 +375,7 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
436
375
|
};
|
|
437
376
|
}
|
|
438
377
|
else {
|
|
439
|
-
draft.bulkUpload.completedTransactionsByPeriod[
|
|
378
|
+
draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
|
|
440
379
|
fetchState: { fetchState: 'Error', error: action.payload.error },
|
|
441
380
|
nextPageToken: null,
|
|
442
381
|
totalCount: 0,
|
|
@@ -448,7 +387,7 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
|
|
|
448
387
|
});
|
|
449
388
|
_a = expenseAutomationMissingReceiptsView.actions, exports.fetchMissingReceipts = _a.fetchMissingReceipts, exports.fetchMissingReceiptsSuccess = _a.fetchMissingReceiptsSuccess, exports.fetchMissingReceiptsFailure = _a.fetchMissingReceiptsFailure, exports.uploadMissingReceiptSuccess = _a.uploadMissingReceiptSuccess, exports.updateMissingReceiptUploadState = _a.updateMissingReceiptUploadState, exports.updateMissingReceiptsUIState = _a.updateMissingReceiptsUIState, exports.markMissingReceiptAsDone = _a.markMissingReceiptAsDone, exports.clearExpenseAutomationMissingReceiptsView = _a.clearExpenseAutomationMissingReceiptsView,
|
|
450
389
|
// Bulk Upload
|
|
451
|
-
exports.bulkUploadReceipts = _a.bulkUploadReceipts, exports.updateBulkUploadProgress = _a.updateBulkUploadProgress, exports.bulkUploadReceiptsSuccess = _a.bulkUploadReceiptsSuccess, exports.bulkUploadReceiptsFailure = _a.bulkUploadReceiptsFailure, exports.
|
|
390
|
+
exports.bulkUploadReceipts = _a.bulkUploadReceipts, exports.updateBulkUploadProgress = _a.updateBulkUploadProgress, exports.bulkUploadReceiptsSuccess = _a.bulkUploadReceiptsSuccess, exports.bulkUploadReceiptsFailure = _a.bulkUploadReceiptsFailure, exports.updateBulkUploadBatchStatus = _a.updateBulkUploadBatchStatus, exports.pusherBatchStatusUpdate = _a.pusherBatchStatusUpdate, exports.fetchBulkUploadBatchDetails = _a.fetchBulkUploadBatchDetails, exports.fetchBulkUploadBatchDetailsSuccess = _a.fetchBulkUploadBatchDetailsSuccess, exports.fetchBulkUploadBatchDetailsFailure = _a.fetchBulkUploadBatchDetailsFailure, exports.storeBatchDetails = _a.storeBatchDetails, exports.fetchBulkUploadBatches = _a.fetchBulkUploadBatches, exports.fetchBulkUploadBatchesSuccess = _a.fetchBulkUploadBatchesSuccess, exports.fetchBulkUploadBatchesFailure = _a.fetchBulkUploadBatchesFailure, exports.confirmBulkUploadMatch = _a.confirmBulkUploadMatch, exports.confirmBulkUploadMatchSuccess = _a.confirmBulkUploadMatchSuccess, exports.confirmBulkUploadMatchFailure = _a.confirmBulkUploadMatchFailure, exports.setBulkUploadResultsTab = _a.setBulkUploadResultsTab, exports.setBulkUploadCompletedSubTab = _a.setBulkUploadCompletedSubTab, exports.setBulkUploadSortConfig = _a.setBulkUploadSortConfig, exports.clearBulkUpload = _a.clearBulkUpload, exports.searchTransactionsForManualMatch = _a.searchTransactionsForManualMatch, exports.searchTransactionsForManualMatchSuccess = _a.searchTransactionsForManualMatchSuccess, exports.searchTransactionsForManualMatchFailure = _a.searchTransactionsForManualMatchFailure, exports.clearManualSearchResults = _a.clearManualSearchResults,
|
|
452
391
|
// Completed Transactions
|
|
453
392
|
exports.fetchCompletedTransactions = _a.fetchCompletedTransactions, exports.fetchCompletedTransactionsSuccess = _a.fetchCompletedTransactionsSuccess, exports.fetchCompletedTransactionsFailure = _a.fetchCompletedTransactionsFailure;
|
|
454
393
|
exports.default = expenseAutomationMissingReceiptsView.reducer;
|
|
@@ -15,11 +15,9 @@ export interface ResolvedCandidate {
|
|
|
15
15
|
}
|
|
16
16
|
export interface ResolvedBatchFile {
|
|
17
17
|
attachmentId: ID;
|
|
18
|
-
batchId: ID;
|
|
19
|
-
fileDownloadUrl: string | null;
|
|
20
18
|
fileId: ID;
|
|
21
19
|
filename: string;
|
|
22
|
-
filePreviewUrl: string
|
|
20
|
+
filePreviewUrl: string;
|
|
23
21
|
status: BatchFileStatus;
|
|
24
22
|
candidates?: ResolvedCandidate[];
|
|
25
23
|
matchedTransaction?: SupportedTransaction;
|
|
@@ -27,7 +25,6 @@ export interface ResolvedBatchFile {
|
|
|
27
25
|
}
|
|
28
26
|
export interface BulkUploadSelectorData {
|
|
29
27
|
batchDetails: ResolvedBatchDetails | undefined;
|
|
30
|
-
batchDetailsPaginationState: FetchStateAndError;
|
|
31
28
|
batchList: BatchListItem[];
|
|
32
29
|
batchListFetchState: FetchStateAndError;
|
|
33
30
|
batchStatus: BatchStatus | undefined;
|
|
@@ -35,7 +32,6 @@ export interface BulkUploadSelectorData {
|
|
|
35
32
|
completedTransactions: CompletedTransactionsSelectorData;
|
|
36
33
|
confirmMatchStatus: FetchStateAndError;
|
|
37
34
|
currentResultsTab: BulkUploadResultsTab;
|
|
38
|
-
hasMoreBatchDetails: boolean;
|
|
39
35
|
manualSearch: ManualSearchState;
|
|
40
36
|
matchedFiles: ResolvedBatchFile[];
|
|
41
37
|
pastBatches: BatchListItem[];
|
|
@@ -68,8 +64,6 @@ export interface ResolvedBatchDetails {
|
|
|
68
64
|
export interface ExpenseAutomationMissingReceiptsViewSelector extends SelectorView {
|
|
69
65
|
bulkUpload: BulkUploadSelectorData;
|
|
70
66
|
completionStatus: CompletionStatusType;
|
|
71
|
-
/** When set, UI should switch bulk-upload sub-tab once (e.g. Unmatched on batch completion). */
|
|
72
|
-
pendingMissingReceiptsTabNavigation: BulkUploadResultsTab | null;
|
|
73
67
|
refreshStatus: FetchStateAndError;
|
|
74
68
|
transactions: SupportedTransaction[];
|
|
75
69
|
uiState: MissingReceiptsViewUIState;
|
|
@@ -9,8 +9,6 @@ const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
|
|
|
9
9
|
const tenantSelector_1 = require("../../../entity/tenant/tenantSelector");
|
|
10
10
|
const transactionSelector_1 = require("../../../entity/transaction/transactionSelector");
|
|
11
11
|
const expenseAutomationViewSelectorTypes_1 = require("../selectorTypes/expenseAutomationViewSelectorTypes");
|
|
12
|
-
const missingReceiptsPayload_1 = require("../payload/missingReceiptsPayload");
|
|
13
|
-
const missingReceiptsViewReducer_1 = require("../reducers/missingReceiptsViewReducer");
|
|
14
12
|
function getExpenseAutomationMissingReceiptsView(state) {
|
|
15
13
|
const { expenseAutomationMissingReceiptsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState, } = state;
|
|
16
14
|
const currentTenant = (0, tenantSelector_1.getCurrentTenant)(state);
|
|
@@ -55,34 +53,14 @@ function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
55
53
|
const completionStatus = missingReceiptsCompletionStatus != null
|
|
56
54
|
? missingReceiptsCompletionStatus
|
|
57
55
|
: 'incomplete';
|
|
58
|
-
const { bulkUpload
|
|
56
|
+
const { bulkUpload } = expenseAutomationMissingReceiptsViewState;
|
|
59
57
|
const currentBatchStatus = bulkUpload.currentBatchId != null
|
|
60
58
|
? bulkUpload.batchStatusById[bulkUpload.currentBatchId]
|
|
61
59
|
: undefined;
|
|
62
|
-
const
|
|
63
|
-
? bulkUpload.
|
|
64
|
-
: [];
|
|
65
|
-
/** API returns newest-first (`sort_order: desc`); primary batch uses oldest-first order. */
|
|
66
|
-
const batchListChronological = (0, orderBy_1.default)(batchList, (b) => new Date(b.createdAt).valueOf(), 'asc');
|
|
67
|
-
/**
|
|
68
|
-
* Primary "Unmatched" batch = first completed batch in chronological order, preferring the
|
|
69
|
-
* first batch that still has un_matched/no_match work when any completed batch has such work.
|
|
70
|
-
* Batches without details yet: wait if the list row still reports unmatched work; otherwise skip
|
|
71
|
-
* so we do not block the whole tab while older rows are not fetched yet.
|
|
72
|
-
*/
|
|
73
|
-
const primaryBatchIdFromDetailsOrder = getPrimaryBatchIdFromBatchListOrder(batchListChronological, bulkUpload.batchDetailsById, bulkUpload.failedBatchDetailIds);
|
|
74
|
-
/** During upload/matching, the in-flight batch may not appear in batchList yet — prefer currentBatchId. */
|
|
75
|
-
const unmatchedSectionBatchId = bulkUpload.phase === 'matching' || bulkUpload.phase === 'uploading'
|
|
76
|
-
? bulkUpload.currentBatchId ?? primaryBatchIdFromDetailsOrder
|
|
77
|
-
: primaryBatchIdFromDetailsOrder;
|
|
78
|
-
const completedBatchesInApiOrder = batchList.filter((b) => (0, missingReceiptsPayload_1.isBatchListStatusCompleted)(b.status));
|
|
79
|
-
const currentBatchDetails = unmatchedSectionBatchId != null
|
|
80
|
-
? bulkUpload.batchDetailsById[unmatchedSectionBatchId]
|
|
60
|
+
const currentBatchDetails = bulkUpload.currentBatchId != null
|
|
61
|
+
? bulkUpload.batchDetailsById[bulkUpload.currentBatchId]
|
|
81
62
|
: undefined;
|
|
82
|
-
const resolvedFiles = currentBatchDetails?.files.map((file) => resolveBatchFile(file,
|
|
83
|
-
const failedIds = new Set(bulkUpload.failedBatchDetailIds);
|
|
84
|
-
const hasMoreBatchDetails = completedBatchesInApiOrder.some((b) => bulkUpload.batchDetailsById[b.batchId] == null &&
|
|
85
|
-
!failedIds.has(b.batchId));
|
|
63
|
+
const resolvedFiles = currentBatchDetails?.files.map((file) => resolveBatchFile(file, transactionState));
|
|
86
64
|
const getSortValue = (file) => {
|
|
87
65
|
const t = file.matchedTransaction;
|
|
88
66
|
if (t == null) {
|
|
@@ -120,14 +98,11 @@ function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
120
98
|
: 0,
|
|
121
99
|
}
|
|
122
100
|
: { total: 0, processed: 0, percentage: 0 };
|
|
101
|
+
const batchList = monthYearPeriodId != null
|
|
102
|
+
? bulkUpload.batchListByPeriod[monthYearPeriodId] ?? []
|
|
103
|
+
: [];
|
|
123
104
|
const batchListFetchState = bulkUpload.batchListFetchState;
|
|
124
|
-
|
|
125
|
-
* When primary batch is not resolved yet, still aggregate unmatched files from every batch
|
|
126
|
-
* that has details loaded (otherwise past is empty and receipts vanish from the UI).
|
|
127
|
-
*/
|
|
128
|
-
const pastBatches = unmatchedSectionBatchId != null
|
|
129
|
-
? batchList.filter((b) => b.batchId !== unmatchedSectionBatchId)
|
|
130
|
-
: batchList;
|
|
105
|
+
const pastBatches = batchList.filter((b) => b.batchId !== bulkUpload.currentBatchId);
|
|
131
106
|
const pastUnmatchedFiles = pastBatches.flatMap((b) => {
|
|
132
107
|
const details = bulkUpload.batchDetailsById[b.batchId];
|
|
133
108
|
if (details == null) {
|
|
@@ -135,13 +110,10 @@ function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
135
110
|
}
|
|
136
111
|
return details.files
|
|
137
112
|
.filter((f) => f.status === 'un_matched' || f.status === 'no_match')
|
|
138
|
-
.map((f) => resolveBatchFile(f,
|
|
113
|
+
.map((f) => resolveBatchFile(f, transactionState));
|
|
139
114
|
});
|
|
140
|
-
const
|
|
141
|
-
?
|
|
142
|
-
: undefined;
|
|
143
|
-
const completedTransactionsForPeriod = completedTransactionsCacheKey != null
|
|
144
|
-
? bulkUpload.completedTransactionsByPeriod[completedTransactionsCacheKey]
|
|
115
|
+
const completedTransactionsForPeriod = monthYearPeriodId != null
|
|
116
|
+
? bulkUpload.completedTransactionsByPeriod[monthYearPeriodId]
|
|
145
117
|
: undefined;
|
|
146
118
|
const completedTransactionIds = completedTransactionsForPeriod?.transactionIds ?? [];
|
|
147
119
|
const resolvedCompletedTransactions = (0, transactionSelector_1.getSupportedTransactionsByIds)(transactionState, completedTransactionIds);
|
|
@@ -162,7 +134,6 @@ function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
162
134
|
refreshStatus,
|
|
163
135
|
transactions: sortedTransactions,
|
|
164
136
|
completionStatus,
|
|
165
|
-
pendingMissingReceiptsTabNavigation: pendingMissingReceiptsTabNavigation ?? null,
|
|
166
137
|
bulkUpload: {
|
|
167
138
|
phase: bulkUpload.phase,
|
|
168
139
|
uploadStatus: bulkUpload.uploadStatus,
|
|
@@ -189,68 +160,12 @@ function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
189
160
|
pastBatches,
|
|
190
161
|
pastUnmatchedFiles,
|
|
191
162
|
confirmMatchStatus: bulkUpload.confirmMatchStatus,
|
|
192
|
-
hasMoreBatchDetails,
|
|
193
|
-
batchDetailsPaginationState: bulkUpload.batchDetailsPaginationState,
|
|
194
163
|
manualSearch: bulkUpload.manualSearch,
|
|
195
164
|
uploadProgress: bulkUpload.uploadProgress,
|
|
196
165
|
},
|
|
197
166
|
};
|
|
198
167
|
}
|
|
199
|
-
function
|
|
200
|
-
return details.files.some((f) => f.status === 'un_matched' || f.status === 'no_match');
|
|
201
|
-
}
|
|
202
|
-
/** List row summary before batch details load — aligns with unmatched / possible-match work. */
|
|
203
|
-
function batchListItemHasUnmatchedWork(batch) {
|
|
204
|
-
return batch.noMatchCount > 0 || batch.possibleMatchesCount > 0;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* `batchList` must be in chronological order (oldest first). Picks the primary batch for the
|
|
208
|
-
* top "Unmatched" section. Skips failed detail fetches.
|
|
209
|
-
*
|
|
210
|
-
* If details are not loaded for an older batch but the list row reports no unmatched work, we
|
|
211
|
-
* skip that batch so newer batches with loaded details can be primary (avoids an empty tab when
|
|
212
|
-
* the first fetch page only loaded newer batches). If the list reports unmatched work but details
|
|
213
|
-
* are still loading, we wait (undefined) so primary order stays correct once details arrive.
|
|
214
|
-
*/
|
|
215
|
-
function getPrimaryBatchIdFromBatchListOrder(batchListChronological, batchDetailsById, failedBatchDetailIds) {
|
|
216
|
-
const failedIds = new Set(failedBatchDetailIds);
|
|
217
|
-
const anyCompletedBatchHasUnmatchedWork = batchListChronological.some((b) => {
|
|
218
|
-
if (failedIds.has(b.batchId)) {
|
|
219
|
-
return false;
|
|
220
|
-
}
|
|
221
|
-
const d = batchDetailsById[b.batchId];
|
|
222
|
-
if (d != null &&
|
|
223
|
-
d.status === 'completed' &&
|
|
224
|
-
batchDetailsHasUnmatchedWork(d)) {
|
|
225
|
-
return true;
|
|
226
|
-
}
|
|
227
|
-
return d == null && batchListItemHasUnmatchedWork(b);
|
|
228
|
-
});
|
|
229
|
-
for (const batch of batchListChronological) {
|
|
230
|
-
if (failedIds.has(batch.batchId)) {
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
const details = batchDetailsById[batch.batchId];
|
|
234
|
-
if (details == null) {
|
|
235
|
-
if (batchListItemHasUnmatchedWork(batch)) {
|
|
236
|
-
return undefined;
|
|
237
|
-
}
|
|
238
|
-
continue;
|
|
239
|
-
}
|
|
240
|
-
if (details.status !== 'completed') {
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
if (anyCompletedBatchHasUnmatchedWork) {
|
|
244
|
-
if (batchDetailsHasUnmatchedWork(details)) {
|
|
245
|
-
return batch.batchId;
|
|
246
|
-
}
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
return batch.batchId;
|
|
250
|
-
}
|
|
251
|
-
return undefined;
|
|
252
|
-
}
|
|
253
|
-
function resolveBatchFile(file, batchId, transactionState) {
|
|
168
|
+
function resolveBatchFile(file, transactionState) {
|
|
254
169
|
const matchedTransaction = file.matchedTransactionId != null
|
|
255
170
|
? (0, transactionSelector_1.getSupportedTransactionById)(transactionState, file.matchedTransactionId)
|
|
256
171
|
: undefined;
|
|
@@ -264,8 +179,6 @@ function resolveBatchFile(file, batchId, transactionState) {
|
|
|
264
179
|
.filter((c) => c != null);
|
|
265
180
|
return {
|
|
266
181
|
attachmentId: file.attachmentId,
|
|
267
|
-
batchId,
|
|
268
|
-
fileDownloadUrl: file.fileDownloadUrl,
|
|
269
182
|
fileId: file.fileId,
|
|
270
183
|
filename: file.filename,
|
|
271
184
|
filePreviewUrl: file.filePreviewUrl,
|
|
@@ -36,10 +36,9 @@ export interface MatchCandidate {
|
|
|
36
36
|
}
|
|
37
37
|
export interface BatchFile {
|
|
38
38
|
attachmentId: ID;
|
|
39
|
-
fileDownloadUrl: string | null;
|
|
40
39
|
fileId: ID;
|
|
41
40
|
filename: string;
|
|
42
|
-
filePreviewUrl: string
|
|
41
|
+
filePreviewUrl: string;
|
|
43
42
|
status: BatchFileStatus;
|
|
44
43
|
candidates?: CandidateRef[];
|
|
45
44
|
matchedTransactionId?: ID;
|
|
@@ -101,15 +100,13 @@ export interface CompletedTransactionsState {
|
|
|
101
100
|
}
|
|
102
101
|
export interface BulkUploadState {
|
|
103
102
|
batchDetailsById: Record<ID, BatchDetails>;
|
|
104
|
-
batchDetailsPaginationState: FetchStateAndError;
|
|
105
103
|
batchListByPeriod: Record<MonthYearPeriodId, BatchListItem[]>;
|
|
106
104
|
batchListFetchState: FetchStateAndError;
|
|
107
105
|
batchStatusById: Record<ID, BatchStatus>;
|
|
108
106
|
completedSubTab: CompletedSubTab;
|
|
109
|
-
completedTransactionsByPeriod: Record<
|
|
107
|
+
completedTransactionsByPeriod: Record<MonthYearPeriodId, CompletedTransactionsState>;
|
|
110
108
|
confirmMatchStatus: FetchStateAndError;
|
|
111
109
|
currentResultsTab: BulkUploadResultsTab;
|
|
112
|
-
failedBatchDetailIds: ID[];
|
|
113
110
|
manualSearch: ManualSearchState;
|
|
114
111
|
phase: BulkUploadPhase;
|
|
115
112
|
sortKey: BulkUploadSortKey;
|
|
@@ -120,11 +117,6 @@ export interface BulkUploadState {
|
|
|
120
117
|
}
|
|
121
118
|
export interface MissingReceiptsViewState extends FetchedState {
|
|
122
119
|
bulkUpload: BulkUploadState;
|
|
123
|
-
/**
|
|
124
|
-
* When set, the app shell should switch the Missing Receipts sub-tab (e.g. to Unmatched)
|
|
125
|
-
* once, then clear via `clearMissingReceiptsTabNavigation`.
|
|
126
|
-
*/
|
|
127
|
-
pendingMissingReceiptsTabNavigation: BulkUploadResultsTab | null;
|
|
128
120
|
refreshStatus: FetchStateAndError;
|
|
129
121
|
transactionIdsBySelectedPeriod: Record<MonthYearPeriodId, ID[]>;
|
|
130
122
|
uiState: MissingReceiptsViewUIState;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeniai/client-epic-state",
|
|
3
|
-
"version": "4.19.37-
|
|
3
|
+
"version": "4.19.37-betaVR2",
|
|
4
4
|
"description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib/esm/index.js",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"find-dead-code": "ts-prune | grep -v '(used in module)'",
|
|
112
112
|
"find-unused-exports": "ts-unused-exports ./tsconfig.json",
|
|
113
113
|
"circular-dependency": "npx madge --circular --extensions ts ./src",
|
|
114
|
-
"build": "concurrently --kill-others-on-fail --handle-input \"echo 'Running ESLint...' && eslint . --ext .js,.jsx,.ts,.tsx\" \"echo 'TypeScript build in progress...' && time tsc && echo 'ESM build...' && tsc -p tsconfig.esm.json\"",
|
|
114
|
+
"build": "concurrently --kill-others-on-fail --handle-input \"echo 'Running ESLint...' && eslint . --ext .js,.jsx,.ts,.tsx\" \"echo 'TypeScript build in progress...' && time tsc && echo 'ESM build...' && tsc -p tsconfig.esm.json\" \"echo 'Running tests and typecheck...' && pnpm test\" && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
|
|
115
115
|
"only-build": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc && tsc -p tsconfig.esm.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
|
|
116
116
|
"format": "prettier --write --ignore-unknown \"src/**/*\" && pnpm lint",
|
|
117
117
|
"format-watch": "(git diff --name-only --diff-filter=ACM && git ls-files --others --exclude-standard) | grep -E '\\.(ts|tsx)$' | xargs prettier --write",
|
package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import orderBy from 'lodash/orderBy';
|
|
2
|
-
import { concat, of } from 'rxjs';
|
|
3
|
-
import { catchError, exhaustMap, filter } from 'rxjs/operators';
|
|
4
|
-
import { toMonthYearPeriodId } from '../../../../commonStateTypes/timePeriod';
|
|
5
|
-
import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
|
|
6
|
-
import { createZeniAPIStatus } from '../../../../responsePayload';
|
|
7
|
-
import { isBatchListStatusCompleted } from '../../payload/missingReceiptsPayload';
|
|
8
|
-
import { fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, } from '../../reducers/missingReceiptsViewReducer';
|
|
9
|
-
import { fetchBatchDetailsByIds } from './fetchMultipleBatchDetailsEpic';
|
|
10
|
-
const MORE_BATCH_PAGE_SIZE = 4;
|
|
11
|
-
export const fetchMoreBatchDetailsEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchMoreBatchDetails.match),
|
|
12
|
-
/** One page at a time — avoids duplicate loads if IO + scroll fallback both fire. */
|
|
13
|
-
exhaustMap(() => {
|
|
14
|
-
const state = state$.value;
|
|
15
|
-
const { expenseAutomationViewState: { selectedPeriodByTenantId }, expenseAutomationMissingReceiptsViewState: { bulkUpload }, } = state;
|
|
16
|
-
const currentTenant = getCurrentTenant(state);
|
|
17
|
-
const selectedPeriod = selectedPeriodByTenantId[currentTenant.tenantId];
|
|
18
|
-
if (selectedPeriod == null) {
|
|
19
|
-
return of(fetchMoreBatchDetailsComplete());
|
|
20
|
-
}
|
|
21
|
-
const periodId = toMonthYearPeriodId(selectedPeriod);
|
|
22
|
-
const batchList = bulkUpload.batchListByPeriod[periodId] ?? [];
|
|
23
|
-
const failedIds = new Set(bulkUpload.failedBatchDetailIds);
|
|
24
|
-
const unfetchedBatches = batchList.filter((batch) => isBatchListStatusCompleted(batch.status) &&
|
|
25
|
-
bulkUpload.batchDetailsById[batch.batchId] == null &&
|
|
26
|
-
!failedIds.has(batch.batchId));
|
|
27
|
-
const unfetchedBatchIds = orderBy(unfetchedBatches, (b) => new Date(b.createdAt).valueOf(), 'asc').map((batch) => batch.batchId);
|
|
28
|
-
if (unfetchedBatchIds.length === 0) {
|
|
29
|
-
return of(fetchMoreBatchDetailsComplete());
|
|
30
|
-
}
|
|
31
|
-
const nextPage = unfetchedBatchIds.slice(0, MORE_BATCH_PAGE_SIZE);
|
|
32
|
-
return concat(fetchBatchDetailsByIds(nextPage, zeniAPI), of(fetchMoreBatchDetailsComplete())).pipe(catchError((error) => of(fetchMoreBatchDetailsFailure({
|
|
33
|
-
error: createZeniAPIStatus('Unexpected Error', 'Fetch more batch details errored out: ' +
|
|
34
|
-
JSON.stringify(error)),
|
|
35
|
-
}))));
|
|
36
|
-
}));
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { ActionsObservable, StateObservable } from 'redux-observable';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { updateTransactions } from '../../../../entity/transaction/transactionReducer';
|
|
4
|
-
import { RootState } from '../../../../reducer';
|
|
5
|
-
import { ZeniAPI } from '../../../../zeniAPI';
|
|
6
|
-
import { batchDetailFetchFailed, fetchBulkUploadBatchesSuccess, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, setInitialBatchDetailsLoading, storeBatchDetails } from '../../reducers/missingReceiptsViewReducer';
|
|
7
|
-
export type ActionType = ReturnType<typeof fetchBulkUploadBatchesSuccess> | ReturnType<typeof fetchMoreBatchDetails> | ReturnType<typeof fetchMoreBatchDetailsComplete> | ReturnType<typeof fetchMoreBatchDetailsFailure> | ReturnType<typeof batchDetailFetchFailed> | ReturnType<typeof setInitialBatchDetailsLoading> | ReturnType<typeof storeBatchDetails> | ReturnType<typeof updateTransactions>;
|
|
8
|
-
export declare const fetchMoreBatchDetailsEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.fetchMoreBatchDetailsEpic = void 0;
|
|
7
|
-
const orderBy_1 = __importDefault(require("lodash/orderBy"));
|
|
8
|
-
const rxjs_1 = require("rxjs");
|
|
9
|
-
const operators_1 = require("rxjs/operators");
|
|
10
|
-
const timePeriod_1 = require("../../../../commonStateTypes/timePeriod");
|
|
11
|
-
const tenantSelector_1 = require("../../../../entity/tenant/tenantSelector");
|
|
12
|
-
const responsePayload_1 = require("../../../../responsePayload");
|
|
13
|
-
const missingReceiptsPayload_1 = require("../../payload/missingReceiptsPayload");
|
|
14
|
-
const missingReceiptsViewReducer_1 = require("../../reducers/missingReceiptsViewReducer");
|
|
15
|
-
const fetchMultipleBatchDetailsEpic_1 = require("./fetchMultipleBatchDetailsEpic");
|
|
16
|
-
const MORE_BATCH_PAGE_SIZE = 4;
|
|
17
|
-
const fetchMoreBatchDetailsEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.fetchMoreBatchDetails.match),
|
|
18
|
-
/** One page at a time — avoids duplicate loads if IO + scroll fallback both fire. */
|
|
19
|
-
(0, operators_1.exhaustMap)(() => {
|
|
20
|
-
const state = state$.value;
|
|
21
|
-
const { expenseAutomationViewState: { selectedPeriodByTenantId }, expenseAutomationMissingReceiptsViewState: { bulkUpload }, } = state;
|
|
22
|
-
const currentTenant = (0, tenantSelector_1.getCurrentTenant)(state);
|
|
23
|
-
const selectedPeriod = selectedPeriodByTenantId[currentTenant.tenantId];
|
|
24
|
-
if (selectedPeriod == null) {
|
|
25
|
-
return (0, rxjs_1.of)((0, missingReceiptsViewReducer_1.fetchMoreBatchDetailsComplete)());
|
|
26
|
-
}
|
|
27
|
-
const periodId = (0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod);
|
|
28
|
-
const batchList = bulkUpload.batchListByPeriod[periodId] ?? [];
|
|
29
|
-
const failedIds = new Set(bulkUpload.failedBatchDetailIds);
|
|
30
|
-
const unfetchedBatches = batchList.filter((batch) => (0, missingReceiptsPayload_1.isBatchListStatusCompleted)(batch.status) &&
|
|
31
|
-
bulkUpload.batchDetailsById[batch.batchId] == null &&
|
|
32
|
-
!failedIds.has(batch.batchId));
|
|
33
|
-
const unfetchedBatchIds = (0, orderBy_1.default)(unfetchedBatches, (b) => new Date(b.createdAt).valueOf(), 'asc').map((batch) => batch.batchId);
|
|
34
|
-
if (unfetchedBatchIds.length === 0) {
|
|
35
|
-
return (0, rxjs_1.of)((0, missingReceiptsViewReducer_1.fetchMoreBatchDetailsComplete)());
|
|
36
|
-
}
|
|
37
|
-
const nextPage = unfetchedBatchIds.slice(0, MORE_BATCH_PAGE_SIZE);
|
|
38
|
-
return (0, rxjs_1.concat)((0, fetchMultipleBatchDetailsEpic_1.fetchBatchDetailsByIds)(nextPage, zeniAPI), (0, rxjs_1.of)((0, missingReceiptsViewReducer_1.fetchMoreBatchDetailsComplete)())).pipe((0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, missingReceiptsViewReducer_1.fetchMoreBatchDetailsFailure)({
|
|
39
|
-
error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch more batch details errored out: ' +
|
|
40
|
-
JSON.stringify(error)),
|
|
41
|
-
}))));
|
|
42
|
-
}));
|
|
43
|
-
exports.fetchMoreBatchDetailsEpic = fetchMoreBatchDetailsEpic;
|