@zeniai/client-epic-state 4.19.37-betaVR9 → 4.19.38

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.
Files changed (68) hide show
  1. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  2. package/lib/entity/snackbar/snackbarTypes.js +0 -1
  3. package/lib/epic.d.ts +1 -9
  4. package/lib/epic.js +1 -9
  5. package/lib/esm/entity/snackbar/snackbarTypes.js +0 -1
  6. package/lib/esm/epic.js +1 -9
  7. package/lib/esm/index.js +6 -8
  8. package/lib/esm/view/expenseAutomationView/payload/missingReceiptsPayload.js +1 -100
  9. package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +1 -264
  10. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +1 -128
  11. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +10 -1
  12. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +4 -2
  13. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +5 -2
  14. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +10 -1
  15. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +4 -2
  16. package/lib/esm/zeniAPI.js +3 -41
  17. package/lib/index.d.ts +9 -11
  18. package/lib/index.js +32 -58
  19. package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
  20. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  21. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +0 -108
  22. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +0 -107
  23. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +3 -51
  24. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +2 -265
  25. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +1 -61
  26. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.d.ts +1 -1
  27. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +0 -127
  28. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +0 -104
  29. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.d.ts +1 -1
  30. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +11 -2
  31. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +4 -2
  32. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelectorTypes.d.ts +2 -0
  33. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewState.d.ts +1 -0
  34. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.d.ts +1 -0
  35. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +5 -2
  36. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonState.d.ts +2 -0
  37. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.d.ts +1 -1
  38. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +11 -2
  39. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +4 -2
  40. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelectorTypes.d.ts +2 -0
  41. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewState.d.ts +1 -0
  42. package/lib/zeniAPI.d.ts +0 -9
  43. package/lib/zeniAPI.js +2 -40
  44. package/package.json +2 -2
  45. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +0 -24
  46. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +0 -49
  47. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +0 -31
  48. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +0 -41
  49. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +0 -57
  50. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +0 -35
  51. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +0 -27
  52. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +0 -41
  53. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.d.ts +0 -15
  54. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +0 -28
  55. package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.d.ts +0 -7
  56. package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +0 -53
  57. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.d.ts +0 -8
  58. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +0 -35
  59. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.d.ts +0 -7
  60. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +0 -45
  61. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.d.ts +0 -8
  62. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +0 -61
  63. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.d.ts +0 -8
  64. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +0 -39
  65. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.d.ts +0 -6
  66. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +0 -31
  67. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +0 -15
  68. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +0 -46
@@ -1,100 +1 @@
1
- import { toURL } from '../../../commonPayloadTypes/urlPayload';
2
- // -- Converter functions --
3
- export function toBatchFile(payload) {
4
- return {
5
- attachmentId: payload.attachment_id,
6
- candidates: payload.candidates?.map((c) => ({
7
- transactionId: c.transaction_id,
8
- matchScore: c.match_score,
9
- })),
10
- fileId: payload.file_id,
11
- filePreviewUrl: payload.file_preview_url,
12
- filename: payload.filename,
13
- matchSource: payload.match_source,
14
- matchedTransactionId: payload.matched_transaction?.transaction_id,
15
- status: payload.status,
16
- };
17
- }
18
- export function extractTransactionPayloadsFromBatchFiles(files) {
19
- const seen = new Set();
20
- const payloads = [];
21
- for (const file of files) {
22
- if (file.matched_transaction != null) {
23
- const id = file.matched_transaction.transaction_id;
24
- if (!seen.has(id)) {
25
- seen.add(id);
26
- payloads.push(matchedTransactionPayloadToSupportedTransactionPayload(file.matched_transaction));
27
- }
28
- }
29
- if (file.candidates != null) {
30
- for (const candidate of file.candidates) {
31
- const id = candidate.transaction_id;
32
- if (!seen.has(id)) {
33
- seen.add(id);
34
- payloads.push(matchedTransactionPayloadToSupportedTransactionPayload(candidate));
35
- }
36
- }
37
- }
38
- }
39
- return payloads;
40
- }
41
- function matchedTransactionPayloadToSupportedTransactionPayload(payload) {
42
- return {
43
- transaction_id: payload.transaction_id,
44
- transaction_type: payload.transaction_type ?? 'expense',
45
- transaction_date: payload.transaction_date ?? '',
46
- currency_code: payload.currency_code,
47
- total_amount: payload.amount,
48
- vendor_name: payload.vendor_name,
49
- logo: payload.vendor_logo == null ? undefined : toURL(payload.vendor_logo),
50
- };
51
- }
52
- export function toBatchSummary(payload) {
53
- return {
54
- failed: payload.failed,
55
- matched: payload.matched,
56
- noMatch: payload.no_match,
57
- possibleMatches: payload.possible_matches,
58
- total: payload.total,
59
- };
60
- }
61
- export function toBatchStatus(payload) {
62
- return {
63
- batchId: payload.batch_id,
64
- progress: payload.progress,
65
- status: payload.status,
66
- };
67
- }
68
- export function toBatchDetails(payload) {
69
- return {
70
- batchId: payload.batch_id,
71
- createdAt: payload.created_at,
72
- files: payload.files.map(toBatchFile),
73
- status: payload.status,
74
- summary: toBatchSummary(payload.summary),
75
- };
76
- }
77
- export function toBatchListItem(payload) {
78
- return {
79
- batchId: payload.batch_id,
80
- createdAt: payload.created_at,
81
- failedCount: payload.failed_count,
82
- matchedCount: payload.matched_count,
83
- noMatchCount: payload.no_match_count,
84
- possibleMatchesCount: payload.possible_matches_count,
85
- status: payload.status,
86
- totalFiles: payload.total_files,
87
- };
88
- }
89
- export function toManualSearchResult(payload) {
90
- return {
91
- amount: payload.amount,
92
- currencyCode: payload.currency,
93
- entityId: payload.entity_id,
94
- memo: payload.memo,
95
- transactionDate: payload.transaction_date,
96
- transactionId: payload.transaction_id,
97
- transactionType: payload.transaction_type,
98
- vendorName: payload.vendor_name,
99
- };
100
- }
1
+ export {};
@@ -1,28 +1,6 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
2
  import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
3
- export const initialBulkUploadState = {
4
- batchDetailsById: {},
5
- batchListByPeriod: {},
6
- batchListFetchState: { fetchState: 'Not-Started', error: undefined },
7
- batchStatusById: {},
8
- completedSubTab: 'all',
9
- completedTransactionsByPeriod: {},
10
- confirmMatchStatus: { fetchState: 'Not-Started', error: undefined },
11
- currentBatchId: undefined,
12
- currentResultsTab: 'unmatched',
13
- manualSearch: {
14
- fetchState: { fetchState: 'Not-Started', error: undefined },
15
- results: [],
16
- searchQuery: '',
17
- },
18
- phase: 'idle',
19
- sortKey: 'date',
20
- sortOrder: 'descending',
21
- uploadProgress: 0,
22
- uploadStatus: { fetchState: 'Not-Started', error: undefined },
23
- };
24
3
  export const initialState = {
25
- bulkUpload: initialBulkUploadState,
26
4
  uploadReceiptStatusById: {},
27
5
  refreshStatus: {
28
6
  fetchState: 'Not-Started',
@@ -142,248 +120,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
142
120
  clearExpenseAutomationMissingReceiptsView(draft) {
143
121
  Object.assign(draft, initialState);
144
122
  },
145
- // -- Bulk Upload Actions --
146
- bulkUploadReceipts: {
147
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
148
- reducer(draft, _action) {
149
- draft.bulkUpload.phase = 'uploading';
150
- draft.bulkUpload.uploadProgress = 0;
151
- draft.bulkUpload.uploadStatus = {
152
- fetchState: 'In-Progress',
153
- error: undefined,
154
- };
155
- },
156
- prepare(files) {
157
- return { payload: { files } };
158
- },
159
- },
160
- updateBulkUploadProgress(draft, action) {
161
- draft.bulkUpload.uploadProgress = action.payload;
162
- },
163
- bulkUploadReceiptsSuccess(draft, action) {
164
- draft.bulkUpload.currentBatchId = action.payload.batchId;
165
- draft.bulkUpload.uploadStatus = {
166
- fetchState: 'Completed',
167
- error: undefined,
168
- };
169
- draft.bulkUpload.phase = 'matching';
170
- },
171
- bulkUploadReceiptsFailure(draft, action) {
172
- draft.bulkUpload.uploadStatus = {
173
- fetchState: 'Error',
174
- error: action.payload.error,
175
- };
176
- draft.bulkUpload.phase = 'idle';
177
- },
178
- updateBulkUploadBatchStatus(draft, action) {
179
- const batchStatus = action.payload;
180
- draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
181
- },
182
- pusherBatchStatusUpdate(draft, action) {
183
- const batchStatus = action.payload;
184
- draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
185
- },
186
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
187
- fetchBulkUploadBatchDetails(_draft) {
188
- // trigger epic, no state change needed
189
- },
190
- fetchBulkUploadBatchDetailsSuccess(draft, action) {
191
- const details = action.payload;
192
- draft.bulkUpload.batchDetailsById[details.batchId] = details;
193
- draft.bulkUpload.phase = 'completed';
194
- },
195
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
196
- fetchBulkUploadBatchDetailsFailure(draft, _action) {
197
- draft.bulkUpload.phase = 'completed';
198
- },
199
- storeBatchDetails(draft, action) {
200
- const details = action.payload;
201
- draft.bulkUpload.batchDetailsById[details.batchId] = details;
202
- },
203
- fetchBulkUploadBatches: {
204
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
205
- reducer(draft, _action) {
206
- draft.bulkUpload.batchListFetchState = {
207
- fetchState: 'In-Progress',
208
- error: undefined,
209
- };
210
- },
211
- prepare(cacheOverride = false) {
212
- return { payload: { cacheOverride } };
213
- },
214
- },
215
- fetchBulkUploadBatchesSuccess(draft, action) {
216
- const periodId = toMonthYearPeriodId(action.payload.selectedPeriod);
217
- draft.bulkUpload.batchListByPeriod[periodId] = action.payload.batchList;
218
- draft.bulkUpload.batchListFetchState = {
219
- fetchState: 'Completed',
220
- error: undefined,
221
- };
222
- },
223
- fetchBulkUploadBatchesFailure(draft, action) {
224
- draft.bulkUpload.batchListFetchState = {
225
- fetchState: 'Error',
226
- error: action.payload.error,
227
- };
228
- },
229
- confirmBulkUploadMatch: {
230
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
231
- reducer(draft, _action) {
232
- draft.bulkUpload.confirmMatchStatus = {
233
- fetchState: 'In-Progress',
234
- error: undefined,
235
- };
236
- },
237
- prepare(batchId, attachmentId, transactionId, transactionType, fileName) {
238
- return { payload: { batchId, attachmentId, transactionId, transactionType, fileName } };
239
- },
240
- },
241
- confirmBulkUploadMatchSuccess(draft, action) {
242
- const { batchId, attachmentId, transactionId } = action.payload;
243
- draft.bulkUpload.confirmMatchStatus = {
244
- fetchState: 'Completed',
245
- error: undefined,
246
- };
247
- const details = draft.bulkUpload.batchDetailsById[batchId];
248
- if (details != null) {
249
- const file = details.files.find((f) => f.attachmentId === attachmentId);
250
- if (file != null) {
251
- const originalStatus = file.status;
252
- file.status = 'matched';
253
- file.matchedTransactionId = transactionId;
254
- file.candidates = undefined;
255
- details.summary.matched += 1;
256
- if (originalStatus === 'no_match') {
257
- details.summary.noMatch = Math.max(0, details.summary.noMatch - 1);
258
- }
259
- else {
260
- details.summary.possibleMatches = Math.max(0, details.summary.possibleMatches - 1);
261
- }
262
- }
263
- }
264
- },
265
- confirmBulkUploadMatchFailure(draft, action) {
266
- draft.bulkUpload.confirmMatchStatus = {
267
- fetchState: 'Error',
268
- error: action.payload.error,
269
- };
270
- },
271
- setBulkUploadResultsTab(draft, action) {
272
- draft.bulkUpload.currentResultsTab = action.payload;
273
- },
274
- setBulkUploadCompletedSubTab(draft, action) {
275
- draft.bulkUpload.completedSubTab = action.payload;
276
- draft.bulkUpload.completedTransactionsByPeriod = {};
277
- },
278
- setBulkUploadSortConfig(draft, action) {
279
- draft.bulkUpload.sortKey = action.payload.sortKey;
280
- draft.bulkUpload.sortOrder = action.payload.sortOrder;
281
- },
282
- clearBulkUpload(draft) {
283
- Object.assign(draft.bulkUpload, initialBulkUploadState);
284
- },
285
- searchTransactionsForManualMatch: {
286
- reducer(draft, action) {
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 = [];
293
- },
294
- prepare(query) {
295
- return { payload: { query } };
296
- },
297
- },
298
- searchTransactionsForManualMatchSuccess(draft, action) {
299
- draft.bulkUpload.manualSearch.results = action.payload;
300
- draft.bulkUpload.manualSearch.fetchState = {
301
- fetchState: 'Completed',
302
- error: undefined,
303
- };
304
- },
305
- searchTransactionsForManualMatchFailure(draft, action) {
306
- draft.bulkUpload.manualSearch.fetchState = {
307
- fetchState: 'Error',
308
- error: action.payload.error,
309
- };
310
- },
311
- clearManualSearchResults(draft) {
312
- draft.bulkUpload.manualSearch = initialBulkUploadState.manualSearch;
313
- },
314
- // -- Completed Transactions Actions --
315
- fetchCompletedTransactions: {
316
- reducer(draft, action) {
317
- const { pageToken } = action.payload;
318
- if (pageToken != null) {
319
- const periods = draft.bulkUpload.completedTransactionsByPeriod;
320
- for (const entry of Object.values(periods)) {
321
- if (entry.nextPageToken === pageToken) {
322
- entry.fetchState = {
323
- fetchState: 'In-Progress',
324
- error: undefined,
325
- };
326
- break;
327
- }
328
- }
329
- }
330
- },
331
- prepare(pageToken) {
332
- return { payload: { pageToken } };
333
- },
334
- },
335
- fetchCompletedTransactionsSuccess(draft, action) {
336
- const { transactionIds, nextPageToken, totalCount, selectedPeriod, isInitialLoad } = action.payload;
337
- const periodId = toMonthYearPeriodId(selectedPeriod);
338
- if (isInitialLoad) {
339
- draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
340
- transactionIds,
341
- nextPageToken,
342
- totalCount,
343
- fetchState: { fetchState: 'Completed', error: undefined },
344
- };
345
- }
346
- else {
347
- const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
348
- if (existing != null) {
349
- existing.transactionIds.push(...transactionIds);
350
- existing.nextPageToken = nextPageToken;
351
- existing.totalCount = totalCount;
352
- existing.fetchState = { fetchState: 'Completed', error: undefined };
353
- }
354
- else {
355
- draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
356
- transactionIds,
357
- nextPageToken,
358
- totalCount,
359
- fetchState: { fetchState: 'Completed', error: undefined },
360
- };
361
- }
362
- }
363
- },
364
- fetchCompletedTransactionsFailure(draft, action) {
365
- const periodId = toMonthYearPeriodId(action.payload.selectedPeriod);
366
- const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
367
- if (existing != null) {
368
- existing.fetchState = {
369
- fetchState: 'Error',
370
- error: action.payload.error,
371
- };
372
- }
373
- else {
374
- draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
375
- fetchState: { fetchState: 'Error', error: action.payload.error },
376
- nextPageToken: null,
377
- totalCount: 0,
378
- transactionIds: [],
379
- };
380
- }
381
- },
382
123
  },
383
124
  });
384
- export const { fetchMissingReceipts, fetchMissingReceiptsSuccess, fetchMissingReceiptsFailure, uploadMissingReceiptSuccess, updateMissingReceiptUploadState, updateMissingReceiptsUIState, markMissingReceiptAsDone, clearExpenseAutomationMissingReceiptsView,
385
- // Bulk Upload
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,
387
- // Completed Transactions
388
- fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, } = expenseAutomationMissingReceiptsView.actions;
125
+ export const { fetchMissingReceipts, fetchMissingReceiptsSuccess, fetchMissingReceiptsFailure, uploadMissingReceiptSuccess, updateMissingReceiptUploadState, updateMissingReceiptsUIState, markMissingReceiptAsDone, clearExpenseAutomationMissingReceiptsView, } = expenseAutomationMissingReceiptsView.actions;
389
126
  export default expenseAutomationMissingReceiptsView.reducer;
@@ -1,7 +1,7 @@
1
1
  import orderBy from 'lodash/orderBy';
2
2
  import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
3
3
  import { getCurrentTenant } from '../../../entity/tenant/tenantSelector';
4
- import { getSupportedTransactionById, getSupportedTransactionsByIds, } from '../../../entity/transaction/transactionSelector';
4
+ import { getSupportedTransactionsByIds } from '../../../entity/transaction/transactionSelector';
5
5
  import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
6
6
  export function getExpenseAutomationMissingReceiptsView(state) {
7
7
  const { expenseAutomationMissingReceiptsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState, } = state;
@@ -47,79 +47,6 @@ export function getExpenseAutomationMissingReceiptsView(state) {
47
47
  const completionStatus = missingReceiptsCompletionStatus != null
48
48
  ? missingReceiptsCompletionStatus
49
49
  : 'incomplete';
50
- const { bulkUpload } = expenseAutomationMissingReceiptsViewState;
51
- const currentBatchStatus = bulkUpload.currentBatchId != null
52
- ? bulkUpload.batchStatusById[bulkUpload.currentBatchId]
53
- : undefined;
54
- const currentBatchDetails = bulkUpload.currentBatchId != null
55
- ? bulkUpload.batchDetailsById[bulkUpload.currentBatchId]
56
- : undefined;
57
- const resolvedFiles = currentBatchDetails?.files.map((file) => resolveBatchFile(file, transactionState));
58
- const getSortValue = (file) => {
59
- const t = file.matchedTransaction;
60
- if (t == null) {
61
- return null;
62
- }
63
- switch (bulkUpload.sortKey) {
64
- case 'vendor':
65
- return (t.vendorName ?? t.description)?.toLowerCase() ?? null;
66
- case 'category': {
67
- const line = t.lines?.[0];
68
- return line?.account?.accountName?.toLowerCase() ?? null;
69
- }
70
- case 'class': {
71
- const line = t.lines?.[0];
72
- return line?.class?.className?.toLowerCase() ?? null;
73
- }
74
- case 'date':
75
- return t.date.valueOf();
76
- case 'amount':
77
- return t.amount.amount;
78
- default:
79
- return null;
80
- }
81
- };
82
- const bulkUploadSortDirection = bulkUpload.sortOrder === 'ascending' ? 'asc' : 'desc';
83
- const matchedFiles = orderBy(resolvedFiles?.filter((f) => f.status === 'matched') ?? [], getSortValue, bulkUploadSortDirection);
84
- const unmatchedFiles = orderBy(resolvedFiles?.filter((f) => f.status === 'un_matched' || f.status === 'no_match') ?? [], getSortValue, bulkUploadSortDirection);
85
- const progress = currentBatchStatus != null
86
- ? {
87
- ...currentBatchStatus.progress,
88
- percentage: currentBatchStatus.progress.total > 0
89
- ? Math.round((currentBatchStatus.progress.processed /
90
- currentBatchStatus.progress.total) *
91
- 100)
92
- : 0,
93
- }
94
- : { total: 0, processed: 0, percentage: 0 };
95
- const batchList = monthYearPeriodId != null
96
- ? bulkUpload.batchListByPeriod[monthYearPeriodId] ?? []
97
- : [];
98
- const batchListFetchState = bulkUpload.batchListFetchState;
99
- const pastBatches = batchList.filter((b) => b.batchId !== bulkUpload.currentBatchId);
100
- const pastUnmatchedFiles = pastBatches.flatMap((b) => {
101
- const details = bulkUpload.batchDetailsById[b.batchId];
102
- if (details == null) {
103
- return [];
104
- }
105
- return details.files
106
- .filter((f) => f.status === 'un_matched' || f.status === 'no_match')
107
- .map((f) => resolveBatchFile(f, transactionState));
108
- });
109
- const completedTransactionsForPeriod = monthYearPeriodId != null
110
- ? bulkUpload.completedTransactionsByPeriod[monthYearPeriodId]
111
- : undefined;
112
- const completedTransactionIds = completedTransactionsForPeriod?.transactionIds ?? [];
113
- const resolvedCompletedTransactions = getSupportedTransactionsByIds(transactionState, completedTransactionIds);
114
- const resolvedBatchDetails = currentBatchDetails != null && resolvedFiles != null
115
- ? {
116
- batchId: currentBatchDetails.batchId,
117
- createdAt: currentBatchDetails.createdAt,
118
- files: resolvedFiles,
119
- status: currentBatchDetails.status,
120
- summary: currentBatchDetails.summary,
121
- }
122
- : undefined;
123
50
  return {
124
51
  fetchState,
125
52
  error,
@@ -128,59 +55,5 @@ export function getExpenseAutomationMissingReceiptsView(state) {
128
55
  refreshStatus,
129
56
  transactions: sortedTransactions,
130
57
  completionStatus,
131
- bulkUpload: {
132
- phase: bulkUpload.phase,
133
- uploadStatus: bulkUpload.uploadStatus,
134
- batchStatus: currentBatchStatus,
135
- batchDetails: resolvedBatchDetails,
136
- completedSubTab: bulkUpload.completedSubTab,
137
- completedTransactions: {
138
- fetchState: completedTransactionsForPeriod?.fetchState ?? {
139
- fetchState: 'Not-Started',
140
- error: undefined,
141
- },
142
- nextPageToken: completedTransactionsForPeriod?.nextPageToken ?? null,
143
- totalCount: completedTransactionsForPeriod?.totalCount ?? 0,
144
- transactions: resolvedCompletedTransactions,
145
- },
146
- matchedFiles,
147
- unmatchedFiles,
148
- progress,
149
- currentResultsTab: bulkUpload.currentResultsTab,
150
- sortKey: bulkUpload.sortKey,
151
- sortOrder: bulkUpload.sortOrder,
152
- batchList,
153
- batchListFetchState,
154
- pastBatches,
155
- pastUnmatchedFiles,
156
- confirmMatchStatus: bulkUpload.confirmMatchStatus,
157
- manualSearch: bulkUpload.manualSearch,
158
- uploadProgress: bulkUpload.uploadProgress,
159
- },
160
- };
161
- }
162
- function resolveBatchFile(file, transactionState) {
163
- const matchedTransaction = file.matchedTransactionId != null
164
- ? getSupportedTransactionById(transactionState, file.matchedTransactionId)
165
- : undefined;
166
- const candidates = file.candidates
167
- ?.map((ref) => {
168
- const transaction = getSupportedTransactionById(transactionState, ref.transactionId);
169
- return transaction != null
170
- ? { transaction, matchScore: ref.matchScore }
171
- : undefined;
172
- })
173
- .filter((c) => c != null);
174
- return {
175
- attachmentId: file.attachmentId,
176
- fileId: file.fileId,
177
- filename: file.filename,
178
- filePreviewUrl: file.filePreviewUrl,
179
- status: file.status,
180
- matchedTransaction,
181
- candidates: candidates != null && candidates.length > 0
182
- ? candidates
183
- : undefined,
184
- matchSource: file.matchSource,
185
58
  };
186
59
  }
@@ -2,6 +2,7 @@ import { createSlice } from '@reduxjs/toolkit';
2
2
  export const initialState = {
3
3
  fetchState: 'Not-Started',
4
4
  error: undefined,
5
+ listeningToPusherEvent: false,
5
6
  approverListState: {
6
7
  approverIds: [],
7
8
  attributes: [],
@@ -154,6 +155,11 @@ const billPaySetupApproverView = createSlice({
154
155
  reducer(draft, action) {
155
156
  const { approvalRuleIds } = action.payload;
156
157
  if (draft.billPaySetupApproverViewUpdateData != null) {
158
+ if (draft.billPaySetupApproverViewUpdateData.type === 'approval_update' &&
159
+ draft.billPaySetupApproverViewUpdateData.data
160
+ ?.isApplicableOnPendingApprovalEntity === true) {
161
+ draft.listeningToPusherEvent = true;
162
+ }
157
163
  draft.billPaySetupApproverViewUpdateData.updateStatus = {
158
164
  fetchState: 'Completed',
159
165
  error: undefined,
@@ -214,6 +220,9 @@ const billPaySetupApproverView = createSlice({
214
220
  return { payload: { billPaySetupApproverViewUpdateData } };
215
221
  },
216
222
  },
223
+ setListeningToPusherEvent(draft, action) {
224
+ draft.listeningToPusherEvent = action.payload;
225
+ },
217
226
  clearBillPaySetupApproverViewUpdateData(draft) {
218
227
  if (draft.billPaySetupApproverViewUpdateData != null) {
219
228
  draft.billPaySetupApproverViewUpdateData.data = undefined;
@@ -224,5 +233,5 @@ const billPaySetupApproverView = createSlice({
224
233
  },
225
234
  },
226
235
  });
227
- export const { fetchBillPaySetupApproverView, fetchBillPaySetupApproverViewSuccess, fetchBillPaySetupApproverViewFailure, fetchBillPayApproversDetails, fetchBillPayApproversList, fetchBillPayApproversListSuccess, fetchBillPayApproversListFailure, deleteBillPayApprovalRule, deleteBillPayApprovalRuleSuccess, deleteBillPayApprovalRuleFailure, saveBillPaySetupApproverViewUpdates, saveBillPaySetupApproverViewUpdatesSuccess, saveBillPaySetupApproverViewUpdatesFailure, initializeBillPaySetupApproverViewUpdateData, saveBillPaySetupApproverViewUpdateData, clearBillPaySetupApproverViewUpdateData, clearBillPaySetupApproverView, } = billPaySetupApproverView.actions;
236
+ export const { fetchBillPaySetupApproverView, fetchBillPaySetupApproverViewSuccess, fetchBillPaySetupApproverViewFailure, fetchBillPayApproversDetails, fetchBillPayApproversList, fetchBillPayApproversListSuccess, fetchBillPayApproversListFailure, deleteBillPayApprovalRule, deleteBillPayApprovalRuleSuccess, deleteBillPayApprovalRuleFailure, saveBillPaySetupApproverViewUpdates, saveBillPaySetupApproverViewUpdatesSuccess, saveBillPaySetupApproverViewUpdatesFailure, initializeBillPaySetupApproverViewUpdateData, saveBillPaySetupApproverViewUpdateData, clearBillPaySetupApproverViewUpdateData, setListeningToPusherEvent, clearBillPaySetupApproverView, } = billPaySetupApproverView.actions;
228
237
  export default billPaySetupApproverView.reducer;
@@ -6,7 +6,7 @@ import { getClassesByIds } from '../../../../entity/class/classSelector';
6
6
  import { getUserByUserId } from '../../../../entity/user/userSelector';
7
7
  import { getUserRoleByUserId } from '../../../../entity/userRole/userRoleSelector';
8
8
  export const getBillPaySetupApproverView = createSelector((state) => state.billPaySetupApproverViewState, (state) => state.approvalRuleState, (state) => state.userState, (billPaySetupApproverViewState, approvalRuleState, userState) => {
9
- const { approvalRulesDeleteStatusById, approvalRuleIds, fetchState, error } = billPaySetupApproverViewState;
9
+ const { approvalRulesDeleteStatusById, approvalRuleIds, fetchState, error, listeningToPusherEvent, } = billPaySetupApproverViewState;
10
10
  const deleteStateList = Object.values(approvalRulesDeleteStatusById);
11
11
  const approvalRules = getApprovalRulesByIds(approvalRuleState, approvalRuleIds);
12
12
  const allApprovalRules = approvalRules.map((approvalRule) => {
@@ -40,10 +40,11 @@ export const getBillPaySetupApproverView = createSelector((state) => state.billP
40
40
  approvalRulesStatus,
41
41
  fetchState,
42
42
  error,
43
+ listeningToPusherEvent,
43
44
  };
44
45
  });
45
46
  export const getBillPaySetupApproverUpdateDataView = createSelector((state) => state.billPaySetupApproverViewState, (state) => state.approvalRuleState, (state) => state.userState, (state) => state.classState, (state) => state.classListState, (state) => state.userRoleState, (billPaySetupApproverViewState, approvalRuleState, userState, classState, classListState, userRoleState) => {
46
- const { approvalRuleIds, approverListState, billPaySetupApproverViewUpdateData, fetchState, error, } = billPaySetupApproverViewState;
47
+ const { approvalRuleIds, approverListState, billPaySetupApproverViewUpdateData, fetchState, error, listeningToPusherEvent, } = billPaySetupApproverViewState;
47
48
  const { approverIds, attributes } = approverListState;
48
49
  const allApprovalRules = getApprovalRulesByIds(approvalRuleState, approvalRuleIds);
49
50
  const allApprovers = approverIds
@@ -96,5 +97,6 @@ export const getBillPaySetupApproverUpdateDataView = createSelector((state) => s
96
97
  fetchState,
97
98
  allAccountingClasses,
98
99
  error,
100
+ listeningToPusherEvent,
99
101
  };
100
102
  });
@@ -33,12 +33,15 @@ export const toApprovalChangableInfoPayload = (approverViewUpdateData) => {
33
33
  }),
34
34
  };
35
35
  });
36
+ const isUpdate = approverViewUpdateData.approvalRuleId != null;
36
37
  const payload = {
37
38
  criteria: criteriaPayload,
38
39
  steps,
39
40
  };
40
- if (approverViewUpdateData.approvalRuleId != null) {
41
- payload['approval_rule_id'] = approverViewUpdateData.approvalRuleId;
41
+ if (isUpdate) {
42
+ payload.approval_rule_id = approverViewUpdateData.approvalRuleId;
43
+ payload.is_applicable_on_pending_approval_entity =
44
+ approverViewUpdateData.isApplicableOnPendingApprovalEntity ?? false;
42
45
  }
43
46
  return payload;
44
47
  };
@@ -2,6 +2,7 @@ import { createSlice } from '@reduxjs/toolkit';
2
2
  export const initialState = {
3
3
  fetchState: 'Not-Started',
4
4
  error: undefined,
5
+ listeningToPusherEvent: false,
5
6
  approverListState: {
6
7
  approverIds: [],
7
8
  attributes: [],
@@ -176,6 +177,11 @@ const remiSetupApproverView = createSlice({
176
177
  reducer(draft, action) {
177
178
  const { approvalRuleIds } = action.payload;
178
179
  if (draft.remiSetupApproverViewUpdateData != null) {
180
+ if (draft.remiSetupApproverViewUpdateData.type === 'approval_update' &&
181
+ draft.remiSetupApproverViewUpdateData.data
182
+ ?.isApplicableOnPendingApprovalEntity === true) {
183
+ draft.listeningToPusherEvent = true;
184
+ }
179
185
  draft.remiSetupApproverViewUpdateData.updateStatus = {
180
186
  fetchState: 'Completed',
181
187
  error: undefined,
@@ -236,6 +242,9 @@ const remiSetupApproverView = createSlice({
236
242
  return { payload: { remiSetupApproverViewUpdateData } };
237
243
  },
238
244
  },
245
+ setListeningToPusherEvent(draft, action) {
246
+ draft.listeningToPusherEvent = action.payload;
247
+ },
239
248
  clearRemiSetupApproverViewUpdateData(draft) {
240
249
  if (draft.remiSetupApproverViewUpdateData != null) {
241
250
  draft.remiSetupApproverViewUpdateData.data = undefined;
@@ -246,5 +255,5 @@ const remiSetupApproverView = createSlice({
246
255
  },
247
256
  },
248
257
  });
249
- export const { fetchRemiSetupApproverView, fetchRemiSetupApproverViewSuccess, fetchRemiSetupApproverViewFailure, fetchRemiApproversDetails, fetchRemiApproversList, fetchRemiApproversListSuccess, fetchRemiApproversListFailure, deleteRemiApprovalRule, deleteRemiApprovalRuleSuccess, deleteRemiApprovalRuleFailure, saveRemiSetupApproverViewUpdates, saveRemiSetupApproverViewUpdatesSuccess, saveRemiSetupApproverViewUpdatesFailure, initializeRemiSetupApproverViewUpdateData, saveRemiSetupApproverViewUpdateData, clearRemiSetupApproverViewUpdateData, clearRemiSetupApproverView, } = remiSetupApproverView.actions;
258
+ export const { fetchRemiSetupApproverView, fetchRemiSetupApproverViewSuccess, fetchRemiSetupApproverViewFailure, fetchRemiApproversDetails, fetchRemiApproversList, fetchRemiApproversListSuccess, fetchRemiApproversListFailure, deleteRemiApprovalRule, deleteRemiApprovalRuleSuccess, deleteRemiApprovalRuleFailure, saveRemiSetupApproverViewUpdates, saveRemiSetupApproverViewUpdatesSuccess, saveRemiSetupApproverViewUpdatesFailure, initializeRemiSetupApproverViewUpdateData, saveRemiSetupApproverViewUpdateData, setListeningToPusherEvent, clearRemiSetupApproverViewUpdateData, clearRemiSetupApproverView, } = remiSetupApproverView.actions;
250
259
  export default remiSetupApproverView.reducer;