@zeniai/client-epic-state 4.19.99-betaSS4 → 4.19.99
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/commonStateTypes/animations.d.ts +1 -1
- package/lib/entity/aiCfo/aiCfoSelector.d.ts +2 -1
- package/lib/entity/billPay/billTransaction/billTransactionState.d.ts +2 -2
- package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +0 -38
- package/lib/entity/jeSchedules/jeSchedulesPayload.js +0 -78
- package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +1 -4
- package/lib/entity/jeSchedules/jeSchedulesSelector.js +1 -5
- package/lib/entity/jeSchedules/jeSchedulesState.d.ts +0 -37
- package/lib/entity/tenant/tenantPayload.d.ts +0 -1
- package/lib/entity/tenant/tenantReducer.js +0 -1
- package/lib/entity/tenant/tenantSelector.d.ts +0 -1
- package/lib/entity/tenant/tenantSelector.js +1 -9
- package/lib/entity/tenant/tenantState.d.ts +0 -1
- package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +1 -4
- package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +0 -1
- package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +0 -3
- package/lib/entity/transaction/payloadTypes/transactionPayload.js +1 -17
- package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +0 -1
- package/lib/entity/transaction/stateTypes/transaction.d.ts +0 -5
- package/lib/entity/transaction/stateTypes/transactionLine.d.ts +1 -1
- package/lib/epic.d.ts +1 -2
- package/lib/epic.js +1 -2
- package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +0 -78
- package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +1 -5
- package/lib/esm/entity/tenant/tenantReducer.js +0 -1
- package/lib/esm/entity/tenant/tenantSelector.js +0 -7
- package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +0 -1
- package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +1 -17
- package/lib/esm/epic.js +1 -2
- package/lib/esm/index.js +7 -8
- package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +1 -82
- package/lib/esm/view/aiCfoView/aiCfoViewSelector.js +2 -8
- package/lib/esm/view/classList/fetchClassListEpic.js +2 -9
- package/lib/esm/view/commonVendorView/vendorView/vendorViewSelector.js +5 -18
- package/lib/esm/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.js +2 -6
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +2 -2
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +2 -2
- package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +3 -4
- package/lib/esm/view/expenseAutomationView/expenseAutomationViewSelector.js +1 -0
- package/lib/esm/view/expenseAutomationView/helpers/saveTransactionHelper.js +2 -2
- package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +2 -2
- package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +1 -17
- package/lib/esm/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +2 -10
- package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +6 -63
- package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +4 -12
- package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +9 -22
- package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +6 -12
- package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +1 -18
- package/lib/esm/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +8 -3
- package/lib/esm/view/profitAndLossClassesView/profitAndLossHorizontalEnrichment.js +63 -144
- package/lib/esm/view/spendManagement/billPay/billList/billListSelector.js +0 -10
- package/lib/esm/view/spendManagement/billPay/billList/billListState.js +0 -1
- package/lib/esm/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +3 -7
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +5 -5
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPayApproversDetailsEpic.js +2 -7
- package/lib/esm/view/spendManagement/billPay/editBillView/editBillViewSelector.js +6 -13
- package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +0 -1
- package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +0 -2
- package/lib/esm/view/spendManagement/reimbursement/editRemiView/editRemiViewSelector.js +4 -7
- package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListSelector.js +0 -12
- package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListState.js +0 -1
- package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +2 -2
- package/lib/esm/view/transactionDetail/epics/saveTransactionHelper.js +2 -2
- package/lib/esm/view/transactionDetail/transactionDetailLocalDataHelper.js +14 -16
- package/lib/index.d.ts +10 -13
- package/lib/index.js +32 -42
- package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
- package/lib/view/aiCfoView/aiCfoViewPayload.d.ts +0 -7
- package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +1 -15
- package/lib/view/aiCfoView/aiCfoViewReducer.js +2 -83
- package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +1 -4
- package/lib/view/aiCfoView/aiCfoViewSelector.js +2 -9
- package/lib/view/aiCfoView/aiCfoViewState.d.ts +1 -18
- package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
- package/lib/view/classList/fetchClassListEpic.d.ts +1 -1
- package/lib/view/classList/fetchClassListEpic.js +1 -8
- package/lib/view/commonVendorView/vendorView/vendorViewSelector.d.ts +0 -1
- package/lib/view/commonVendorView/vendorView/vendorViewSelector.js +5 -18
- package/lib/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.d.ts +0 -1
- package/lib/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.js +2 -6
- package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +2 -2
- package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +1 -1
- package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +3 -4
- package/lib/view/expenseAutomationView/expenseAutomationViewSelector.js +1 -0
- package/lib/view/expenseAutomationView/helpers/saveTransactionHelper.js +2 -2
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +2 -2
- package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +1 -1
- package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +2 -2
- package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +2 -18
- package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +0 -2
- package/lib/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +2 -10
- package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +6 -63
- package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +4 -12
- package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +9 -22
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +5 -11
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +0 -5
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +0 -20
- package/lib/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +8 -3
- package/lib/view/profitAndLossClassesView/profitAndLossHorizontalEnrichment.js +63 -144
- package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
- package/lib/view/spendManagement/billPay/billList/billListSelector.js +0 -10
- package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
- package/lib/view/spendManagement/billPay/billList/billListState.js +0 -1
- package/lib/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +3 -7
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +5 -5
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPayApproversDetailsEpic.js +2 -7
- package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.js +6 -13
- package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
- package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +0 -1
- package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +0 -2
- package/lib/view/spendManagement/reimbursement/editRemiView/editRemiViewSelector.js +3 -6
- package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.d.ts +0 -1
- package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.js +0 -12
- package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +1 -1
- package/lib/view/spendManagement/reimbursement/remiListView/remiListState.js +0 -1
- package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +2 -2
- package/lib/view/transactionDetail/epics/saveTransactionHelper.js +2 -2
- package/lib/view/transactionDetail/transactionDetailLocalDataHelper.js +14 -16
- package/package.json +1 -1
- package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +0 -29
- package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +0 -8
- package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +0 -33
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
import { createSlice } from '@reduxjs/toolkit';
|
|
2
|
-
function removeSessionIdFromPageKeyMap(draft, sessionId) {
|
|
3
|
-
const map = draft.uiState.chatSessionIdByPageKey;
|
|
4
|
-
for (const key of Object.keys(map)) {
|
|
5
|
-
if (map[key] === sessionId) {
|
|
6
|
-
delete map[key];
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
function mirrorCurrentSessionToPageKeyMapIfActive(draft) {
|
|
11
|
-
const key = draft.uiState.aiCfoSidePanelHostPageKey;
|
|
12
|
-
const sessionId = draft.uiState.currentChatSessionId;
|
|
13
|
-
if (key != null && sessionId != null) {
|
|
14
|
-
draft.uiState.chatSessionIdByPageKey[key] = sessionId;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
2
|
export const initialAiCfoViewState = {
|
|
18
3
|
fetchState: 'Not-Started',
|
|
19
4
|
error: undefined,
|
|
@@ -21,8 +6,6 @@ export const initialAiCfoViewState = {
|
|
|
21
6
|
currentInput: '',
|
|
22
7
|
scrollPositionByChatSessionId: {},
|
|
23
8
|
currentChatSessionId: undefined,
|
|
24
|
-
aiCfoSidePanelHostPageKey: undefined,
|
|
25
|
-
chatSessionIdByPageKey: {},
|
|
26
9
|
agentId: undefined,
|
|
27
10
|
chatHistoryNextPageToken: {},
|
|
28
11
|
chatSessionsNextPageToken: { nextPageToken: null, hasMore: false },
|
|
@@ -46,7 +29,6 @@ export const initialAiCfoViewState = {
|
|
|
46
29
|
fetchChatSessionHistoryByChatSessionId: {},
|
|
47
30
|
responseStateByChatSessionId: {},
|
|
48
31
|
stopSubmitStateByChatSessionId: {},
|
|
49
|
-
suggestedQuestionsByPageContext: {},
|
|
50
32
|
};
|
|
51
33
|
const aiCfoView = createSlice({
|
|
52
34
|
name: 'aiCfoView',
|
|
@@ -180,7 +162,6 @@ const aiCfoView = createSlice({
|
|
|
180
162
|
setSession(draft, action) {
|
|
181
163
|
draft.uiState.currentChatSessionId = action.payload.sessionId;
|
|
182
164
|
draft.uiState.agentId = action.payload.agentId;
|
|
183
|
-
mirrorCurrentSessionToPageKeyMapIfActive(draft);
|
|
184
165
|
},
|
|
185
166
|
createSession: {
|
|
186
167
|
reducer(draft, action) {
|
|
@@ -204,7 +185,6 @@ const aiCfoView = createSlice({
|
|
|
204
185
|
nextPageToken: null,
|
|
205
186
|
hasMore: false,
|
|
206
187
|
};
|
|
207
|
-
mirrorCurrentSessionToPageKeyMapIfActive(draft);
|
|
208
188
|
},
|
|
209
189
|
createSessionFailure(draft, action) {
|
|
210
190
|
draft.createSessionState.fetchState = 'Error';
|
|
@@ -242,7 +222,6 @@ const aiCfoView = createSlice({
|
|
|
242
222
|
nextPageToken: null,
|
|
243
223
|
hasMore: false,
|
|
244
224
|
};
|
|
245
|
-
mirrorCurrentSessionToPageKeyMapIfActive(draft);
|
|
246
225
|
},
|
|
247
226
|
createSessionAndSubmitSuccess(draft) {
|
|
248
227
|
// Note: currentChatSessionId, agentId, and chatHistoryNextPageToken are set by initializeNewSessionState
|
|
@@ -359,7 +338,6 @@ const aiCfoView = createSlice({
|
|
|
359
338
|
draft.uiState.currentChatSessionId = undefined;
|
|
360
339
|
draft.uiState.agentId = undefined;
|
|
361
340
|
}
|
|
362
|
-
removeSessionIdFromPageKeyMap(draft, chatSessionId);
|
|
363
341
|
delete draft.uiState.chatHistoryNextPageToken[chatSessionId];
|
|
364
342
|
delete draft.uiState.scrollPositionByChatSessionId[chatSessionId];
|
|
365
343
|
delete draft.fetchChatSessionHistoryByChatSessionId[chatSessionId];
|
|
@@ -382,65 +360,6 @@ const aiCfoView = createSlice({
|
|
|
382
360
|
},
|
|
383
361
|
clearCurrentSessionId(draft) {
|
|
384
362
|
draft.uiState.currentChatSessionId = undefined;
|
|
385
|
-
const key = draft.uiState.aiCfoSidePanelHostPageKey;
|
|
386
|
-
if (key != null) {
|
|
387
|
-
delete draft.uiState.chatSessionIdByPageKey[key];
|
|
388
|
-
}
|
|
389
|
-
},
|
|
390
|
-
applyAiCfoSidePanelHostPageTransition(draft, action) {
|
|
391
|
-
const { newAiCfoSidePanelHostPageKey, nextCurrentChatSessionId } = action.payload;
|
|
392
|
-
const prevKey = draft.uiState.aiCfoSidePanelHostPageKey;
|
|
393
|
-
const curId = draft.uiState.currentChatSessionId;
|
|
394
|
-
if (prevKey != null &&
|
|
395
|
-
prevKey !== newAiCfoSidePanelHostPageKey &&
|
|
396
|
-
curId != null) {
|
|
397
|
-
draft.uiState.chatSessionIdByPageKey[prevKey] = curId;
|
|
398
|
-
}
|
|
399
|
-
draft.uiState.aiCfoSidePanelHostPageKey = newAiCfoSidePanelHostPageKey;
|
|
400
|
-
draft.uiState.currentChatSessionId =
|
|
401
|
-
nextCurrentChatSessionId != null ? nextCurrentChatSessionId : undefined;
|
|
402
|
-
draft.uiState.currentInput = '';
|
|
403
|
-
mirrorCurrentSessionToPageKeyMapIfActive(draft);
|
|
404
|
-
},
|
|
405
|
-
clearAiCfoSidePanelHostPageContext(draft) {
|
|
406
|
-
const key = draft.uiState.aiCfoSidePanelHostPageKey;
|
|
407
|
-
const curId = draft.uiState.currentChatSessionId;
|
|
408
|
-
if (key != null && curId != null) {
|
|
409
|
-
draft.uiState.chatSessionIdByPageKey[key] = curId;
|
|
410
|
-
}
|
|
411
|
-
draft.uiState.aiCfoSidePanelHostPageKey = undefined;
|
|
412
|
-
},
|
|
413
|
-
fetchSuggestedQuestions(draft, action) {
|
|
414
|
-
const { pageContext } = action.payload;
|
|
415
|
-
const prev = draft.suggestedQuestionsByPageContext[pageContext];
|
|
416
|
-
draft.suggestedQuestionsByPageContext[pageContext] = {
|
|
417
|
-
fetchState: 'In-Progress',
|
|
418
|
-
pageContext,
|
|
419
|
-
suggestedQuestions: prev?.suggestedQuestions ?? [],
|
|
420
|
-
generatedAt: prev?.generatedAt,
|
|
421
|
-
error: undefined,
|
|
422
|
-
};
|
|
423
|
-
},
|
|
424
|
-
fetchSuggestedQuestionsSuccess(draft, action) {
|
|
425
|
-
const { pageContext, generatedAt, suggestedQuestions } = action.payload;
|
|
426
|
-
draft.suggestedQuestionsByPageContext[pageContext] = {
|
|
427
|
-
fetchState: 'Completed',
|
|
428
|
-
pageContext,
|
|
429
|
-
generatedAt,
|
|
430
|
-
suggestedQuestions,
|
|
431
|
-
error: undefined,
|
|
432
|
-
};
|
|
433
|
-
},
|
|
434
|
-
fetchSuggestedQuestionsFailure(draft, action) {
|
|
435
|
-
const { pageContext, error } = action.payload;
|
|
436
|
-
const prev = draft.suggestedQuestionsByPageContext[pageContext];
|
|
437
|
-
draft.suggestedQuestionsByPageContext[pageContext] = {
|
|
438
|
-
fetchState: 'Error',
|
|
439
|
-
pageContext,
|
|
440
|
-
suggestedQuestions: prev?.suggestedQuestions ?? [],
|
|
441
|
-
generatedAt: prev?.generatedAt,
|
|
442
|
-
error,
|
|
443
|
-
};
|
|
444
363
|
},
|
|
445
364
|
clearAiCfoView(draft) {
|
|
446
365
|
Object.assign(draft, initialAiCfoViewState);
|
|
@@ -452,5 +371,5 @@ const aiCfoView = createSlice({
|
|
|
452
371
|
},
|
|
453
372
|
},
|
|
454
373
|
});
|
|
455
|
-
export const { submitQuestion, submitQuestionSuccess, submitQuestionFailure, updateResponseState, updateAiCfoViewScrollPosition, updateCurrentInput, clearInput, setSession, createSession, createSessionSuccess, createSessionFailure, createSessionAndSubmit, initializeNewSessionState, createSessionAndSubmitSuccess, createSessionAndSubmitFailure, fetchChatSessionsForUser, fetchChatSessionsForUserSuccess, fetchChatSessionsForUserFailure, fetchChatHistory, fetchChatHistorySuccess, fetchChatHistoryFailure, clearCurrentSessionId, clearLastContextMessage, stopSubmit, stopSubmitSuccess, stopSubmitFailure, stopSubmitQuestion, stopSubmitQuestionSuccess, stopSubmitQuestionFailure, acceptMasterTOS, acceptMasterTOSSuccess, acceptMasterTOSFailure, deleteChatSession, deleteChatSessionSuccess, deleteChatSessionFailure, clearDeleteChatSessionStatus, clearAiCfoView, updateCotCollapsedState,
|
|
374
|
+
export const { submitQuestion, submitQuestionSuccess, submitQuestionFailure, updateResponseState, updateAiCfoViewScrollPosition, updateCurrentInput, clearInput, setSession, createSession, createSessionSuccess, createSessionFailure, createSessionAndSubmit, initializeNewSessionState, createSessionAndSubmitSuccess, createSessionAndSubmitFailure, fetchChatSessionsForUser, fetchChatSessionsForUserSuccess, fetchChatSessionsForUserFailure, fetchChatHistory, fetchChatHistorySuccess, fetchChatHistoryFailure, clearCurrentSessionId, clearLastContextMessage, stopSubmit, stopSubmitSuccess, stopSubmitFailure, stopSubmitQuestion, stopSubmitQuestionSuccess, stopSubmitQuestionFailure, acceptMasterTOS, acceptMasterTOSSuccess, acceptMasterTOSFailure, deleteChatSession, deleteChatSessionSuccess, deleteChatSessionFailure, clearDeleteChatSessionStatus, clearAiCfoView, updateCotCollapsedState, } = aiCfoView.actions;
|
|
456
375
|
export default aiCfoView.reducer;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { initialAiCfoState } from '../../entity/aiCfo/aiCfoReducer';
|
|
2
1
|
import { getAiCfoSelectorView, } from '../../entity/aiCfo/aiCfoSelector';
|
|
3
|
-
import { initialAiCfoViewState } from './aiCfoViewReducer';
|
|
4
2
|
export const getAiCfoView = (state) => {
|
|
5
|
-
const { fetchState, error, uiState, createSessionState, createSessionAndSubmitState, deleteChatSessionStateByChatSessionId, stopSubmitStateByChatSessionId, responseStateByChatSessionId, fetchChatSessionHistoryByChatSessionId, masterTOSAcceptanceState,
|
|
3
|
+
const { fetchState, error, uiState, createSessionState, createSessionAndSubmitState, deleteChatSessionStateByChatSessionId, stopSubmitStateByChatSessionId, responseStateByChatSessionId, fetchChatSessionHistoryByChatSessionId, masterTOSAcceptanceState, } = state.aiCfoViewState;
|
|
6
4
|
return {
|
|
7
5
|
fetchState,
|
|
8
6
|
error,
|
|
@@ -14,11 +12,7 @@ export const getAiCfoView = (state) => {
|
|
|
14
12
|
uiState,
|
|
15
13
|
fetchChatSessionHistoryByChatSessionId,
|
|
16
14
|
masterTOSAcceptanceState,
|
|
17
|
-
|
|
18
|
-
...getAiCfoSelectorView(state.aiCfoState ?? initialAiCfoState),
|
|
15
|
+
...getAiCfoSelectorView(state.aiCfoState),
|
|
19
16
|
version: 1,
|
|
20
17
|
};
|
|
21
18
|
};
|
|
22
|
-
export function getSuggestedQuestionsForPageContext(state, pageContext) {
|
|
23
|
-
return state.aiCfoViewState?.suggestedQuestionsByPageContext?.[pageContext];
|
|
24
|
-
}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
import { of } from 'rxjs';
|
|
2
|
-
import { catchError, filter, mergeMap, switchMap
|
|
2
|
+
import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
3
|
import { updateClasses } from '../../entity/class/classReducer';
|
|
4
|
-
import { getIsAccountingClassesEnabled } from '../../entity/tenant/tenantSelector';
|
|
5
4
|
import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
|
|
6
5
|
import { fetchClassList, updateClassList, updateClassListFailure, } from './classListReducer';
|
|
7
|
-
export const fetchClassListEpic = (actions$,
|
|
8
|
-
if (!getIsAccountingClassesEnabled(state)) {
|
|
9
|
-
return of(updateClassList({
|
|
10
|
-
status: createZeniAPIStatus('Success', ''),
|
|
11
|
-
data: { accounting_classes: [] },
|
|
12
|
-
}));
|
|
13
|
-
}
|
|
6
|
+
export const fetchClassListEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchClassList.match), switchMap((action) => {
|
|
14
7
|
const { isIncludeDeleted } = action.payload;
|
|
15
8
|
const queryParams = isIncludeDeleted === true
|
|
16
9
|
? `?query=${encodeURIComponent(JSON.stringify({ is_include_deleted: true }))}`
|
|
@@ -6,7 +6,6 @@ import { getContactsByIds } from '../../../entity/billPay/contact/contactSelecto
|
|
|
6
6
|
import { getClassById } from '../../../entity/class/classSelector';
|
|
7
7
|
import { getFilesByFileIds } from '../../../entity/file/fileSelector';
|
|
8
8
|
import { getPaymentInstrumentsByIds } from '../../../entity/paymentInstrument/paymentInstrumentSelector';
|
|
9
|
-
import { getIsAccountingClassesEnabled } from '../../../entity/tenant/tenantSelector';
|
|
10
9
|
import { getUserByUserId, getUsersByUserIds, } from '../../../entity/user/userSelector';
|
|
11
10
|
import { getVendorByVendorId } from '../../../entity/vendor/vendorSelector';
|
|
12
11
|
import { getAccountList, getNestedAccountListHierarchy, } from '../../accountList/accountListSelector';
|
|
@@ -61,17 +60,13 @@ export const getVendorView = (state, vendorIdFromUrl) => {
|
|
|
61
60
|
?.vendorDetailLocalData,
|
|
62
61
|
supportedCountries: billPayConfigState.vendor.supportedCountries,
|
|
63
62
|
};
|
|
64
|
-
|
|
65
|
-
const editFetchStateList = [
|
|
63
|
+
fetchState = reduceFetchState([
|
|
66
64
|
accountList,
|
|
65
|
+
classList,
|
|
67
66
|
vendorTypeListState,
|
|
68
67
|
vendorViewState.editVendorStateById[vendorIdFromUrl]?.fetchStatus ??
|
|
69
68
|
vendorViewInitialState.newVendorState.fetchStatus,
|
|
70
|
-
];
|
|
71
|
-
if (isAccountingClassesEnabled) {
|
|
72
|
-
editFetchStateList.push(classList);
|
|
73
|
-
}
|
|
74
|
-
fetchState = reduceFetchState(editFetchStateList);
|
|
69
|
+
]);
|
|
75
70
|
}
|
|
76
71
|
else {
|
|
77
72
|
const basicVendorDetails = getBasicVendorDetailsForNewVendor(state, vendorViewState.newVendorState);
|
|
@@ -100,17 +95,11 @@ export const getVendorView = (state, vendorIdFromUrl) => {
|
|
|
100
95
|
if (tentativeName != null) {
|
|
101
96
|
entityRecommendations = getRecommendationsForEntity(state, tentativeName, 'vendor');
|
|
102
97
|
}
|
|
103
|
-
const isAccountingClassesEnabled = getIsAccountingClassesEnabled(state);
|
|
104
98
|
const fetchStateList = [
|
|
105
99
|
{ fetchState: accountList.fetchState, error: accountList.error },
|
|
100
|
+
{ fetchState: classList.fetchState, error: classList.error },
|
|
106
101
|
vendorTypeListState,
|
|
107
102
|
];
|
|
108
|
-
if (isAccountingClassesEnabled) {
|
|
109
|
-
fetchStateList.push({
|
|
110
|
-
fetchState: classList.fetchState,
|
|
111
|
-
error: classList.error,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
103
|
if (entityRecommendations != null &&
|
|
115
104
|
entityRecommendations.recommendations != null &&
|
|
116
105
|
entityRecommendations.recommendations.length > 0) {
|
|
@@ -155,7 +144,6 @@ export const getVendorView = (state, vendorIdFromUrl) => {
|
|
|
155
144
|
fetchState: fetchState.fetchState,
|
|
156
145
|
hasWireTransfer,
|
|
157
146
|
hasInternationalWireTransfer,
|
|
158
|
-
isAccountingClassesEnabled: getIsAccountingClassesEnabled(state),
|
|
159
147
|
deleteFileStatusById,
|
|
160
148
|
updateFileStatusById,
|
|
161
149
|
loggedInUserVerification,
|
|
@@ -231,10 +219,9 @@ const getBasicVendorDetailsForNewVendor = (state, newVendor) => {
|
|
|
231
219
|
};
|
|
232
220
|
export const getVendorDetailPageView = (state, vendorId, entity) => {
|
|
233
221
|
const trendWithTransactions = getTrendWithTransactions(state, entity, 'EntityDetail');
|
|
234
|
-
const isAccountingClassesEnabled = getIsAccountingClassesEnabled(state);
|
|
235
222
|
const reducedFetchState = reduceAnyFetchState([
|
|
236
223
|
state.accountListState.byReportId.accountList,
|
|
237
|
-
|
|
224
|
+
state.classListState,
|
|
238
225
|
state.vendorTypeListState,
|
|
239
226
|
state.ownerListState,
|
|
240
227
|
state.vendorViewState.editVendorStateById[vendorId]?.fetchStatus ?? {
|
|
@@ -6,7 +6,6 @@ import { getAccountBase } from '../../../entity/account/accountSelector';
|
|
|
6
6
|
import { getAddressByAddressId } from '../../../entity/address/addressSelector';
|
|
7
7
|
import { getContactsByIds } from '../../../entity/billPay/contact/contactSelector';
|
|
8
8
|
import { getClassById } from '../../../entity/class/classSelector';
|
|
9
|
-
import { getIsAccountingClassesEnabled } from '../../../entity/tenant/tenantSelector';
|
|
10
9
|
import { getUserByUserId, getUsersByUserIds, } from '../../../entity/user/userSelector';
|
|
11
10
|
import { getVendorByVendorId } from '../../../entity/vendor/vendorSelector';
|
|
12
11
|
import { dateNow } from '../../../zeniDayJS';
|
|
@@ -21,7 +20,6 @@ const ALL_VENDOR_DETAIL_TABS_TYPES = [
|
|
|
21
20
|
export const toVendorDetailTabsType = (v) => stringToUnion(v, ALL_VENDOR_DETAIL_TABS_TYPES);
|
|
22
21
|
export const getVendorsTabVendorView = (state, vendorIdFromUrl) => {
|
|
23
22
|
const { accountListState, accountState, classListState, classState, vendorState, userState, vendorsTabVendorViewState, vendorTypeListState, addressState, addressViewState, contactState, } = state;
|
|
24
|
-
const isAccountingClassesEnabled = getIsAccountingClassesEnabled(state);
|
|
25
23
|
const accountList = getAccountList(accountState, accountListState, 'accountList');
|
|
26
24
|
const classList = getClassList(classState, classListState);
|
|
27
25
|
const ownerList = getUsersByUserIds(state.userState, state.ownerListState.ownerIds);
|
|
@@ -53,7 +51,7 @@ export const getVendorsTabVendorView = (state, vendorIdFromUrl) => {
|
|
|
53
51
|
}
|
|
54
52
|
fetchState = reduceFetchState([
|
|
55
53
|
accountList,
|
|
56
|
-
|
|
54
|
+
classList,
|
|
57
55
|
vendorTypeListState,
|
|
58
56
|
vendorsTabVendorViewState.vendorStateById[vendorIdFromUrl]?.fetchStatus ?? {
|
|
59
57
|
fetchState: 'Not-Started',
|
|
@@ -64,7 +62,6 @@ export const getVendorsTabVendorView = (state, vendorIdFromUrl) => {
|
|
|
64
62
|
return {
|
|
65
63
|
accountList: accountList,
|
|
66
64
|
classList: classList,
|
|
67
|
-
isAccountingClassesEnabled,
|
|
68
65
|
vendorTypeList: vendorTypeList,
|
|
69
66
|
accountsHierarchyList,
|
|
70
67
|
classHierarchyList,
|
|
@@ -105,10 +102,9 @@ export const getVendorsTabDetailPageView = (state, vendorId, entity) => {
|
|
|
105
102
|
? getTransactionListByEntityForSinglePeriod(state, entity, state.vendorsTabVendorViewState.allTransactionsTabData
|
|
106
103
|
.numberOfQuartersFetched)
|
|
107
104
|
: undefined;
|
|
108
|
-
const isAccountingClassesEnabled = getIsAccountingClassesEnabled(state);
|
|
109
105
|
const reducedFetchState = reduceAnyFetchState([
|
|
110
106
|
state.accountListState.byReportId.accountList,
|
|
111
|
-
|
|
107
|
+
state.classListState,
|
|
112
108
|
state.ownerListState,
|
|
113
109
|
state.vendorTypeListState,
|
|
114
110
|
state.vendorsTabVendorViewState.vendorStateById[vendorId]?.fetchStatus ?? {
|
|
@@ -21,13 +21,13 @@ export const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe
|
|
|
21
21
|
if (isSuccessResponse(response) && response.data != null) {
|
|
22
22
|
const updateActions = [];
|
|
23
23
|
updateActions.push(updateJESchedules([
|
|
24
|
-
...response.data.
|
|
24
|
+
...response.data.draft_je_schedules,
|
|
25
25
|
...response.data.failed_je_postings.je_schedules,
|
|
26
26
|
]), updateJESchedulesDetails([...response.data.failed_je_postings.je_schedules], response.data.failed_je_postings.scheduled_journal_entries), initializeJeScheduleLocalData([
|
|
27
27
|
...response.data.failed_je_postings.je_schedules,
|
|
28
28
|
]));
|
|
29
29
|
updateActions.push(fetchJeSchedulesSuccess({
|
|
30
|
-
jeSchedules: [...response.data.
|
|
30
|
+
jeSchedules: [...response.data.draft_je_schedules],
|
|
31
31
|
failedJeSchedules: [
|
|
32
32
|
...response.data.failed_je_postings.je_schedules,
|
|
33
33
|
],
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { concat, of, timer } from 'rxjs';
|
|
2
|
-
import { catchError, filter, mergeMap
|
|
2
|
+
import { catchError, filter, mergeMap } from 'rxjs/operators';
|
|
3
3
|
import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
|
|
4
4
|
import { BULK_UPLOAD_BAR_COMPLETE_HOLD_MS } from '../../bulkUploadTiming';
|
|
5
5
|
import { bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, updateBulkUploadProgress, } from '../../reducers/missingReceiptsViewReducer';
|
|
6
|
-
export const bulkUploadReceiptsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(bulkUploadReceipts.match),
|
|
6
|
+
export const bulkUploadReceiptsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(bulkUploadReceipts.match), mergeMap((action) => {
|
|
7
7
|
const { files } = action.payload;
|
|
8
8
|
const formData = new FormData();
|
|
9
9
|
for (const file of files) {
|
package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js
CHANGED
|
@@ -25,7 +25,7 @@ export const pusherBatchStatusCompletionEpic = (actions$) => actions$.pipe(filte
|
|
|
25
25
|
* force `phase` to `completed` (dismiss automatching banner) and refresh the batch list.
|
|
26
26
|
* Cancels when the batch completes normally, bulk state is cleared, or another upload supersedes.
|
|
27
27
|
*/
|
|
28
|
-
export const bulkUploadAutomatchingTimeoutEpic = (actions$, state$) => actions$.pipe(filter(bulkUploadReceiptsSuccess.match),
|
|
28
|
+
export const bulkUploadAutomatchingTimeoutEpic = (actions$, state$) => actions$.pipe(filter(bulkUploadReceiptsSuccess.match), mergeMap((action) => {
|
|
29
29
|
const { batchId } = action.payload;
|
|
30
30
|
return timer(BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS).pipe(mergeMap(() => {
|
|
31
31
|
const bulk = state$.value.expenseAutomationMissingReceiptsViewState.bulkUpload;
|
|
@@ -44,11 +44,10 @@ export const bulkUploadAutomatchingTimeoutEpic = (actions$, state$) => actions$.
|
|
|
44
44
|
* error snackbar per upload session (first failure only) so the user is not spammed every
|
|
45
45
|
* interval; Pusher or a later successful poll still completes the flow.
|
|
46
46
|
*/
|
|
47
|
-
export const pollBulkUploadBatchStatusEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(bulkUploadReceiptsSuccess.match),
|
|
47
|
+
export const pollBulkUploadBatchStatusEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(bulkUploadReceiptsSuccess.match), mergeMap((action) => {
|
|
48
48
|
const { batchId } = action.payload;
|
|
49
49
|
let pollErrorNotified = false;
|
|
50
|
-
return timer(FALLBACK_FIRST_DELAY_MS, FALLBACK_POLL_INTERVAL_MS).pipe(takeUntil(merge(actions$.pipe(filter(clearBulkUpload.match)), actions$.pipe(filter(pusherBatchStatusUpdate.match), filter((action) => action.payload.batchId === batchId
|
|
51
|
-
action.payload.status === 'completed')), actions$.pipe(filter(fetchBulkUploadBatchDetailsSuccess.match), filter((action) => action.payload.batchId === batchId)), actions$.pipe(filter(bulkUploadAutomatchingTimedOut.match), filter((action) => action.payload.batchId === batchId)))), switchMap(() => zeniAPI
|
|
50
|
+
return timer(FALLBACK_FIRST_DELAY_MS, FALLBACK_POLL_INTERVAL_MS).pipe(takeUntil(merge(actions$.pipe(filter(clearBulkUpload.match)), actions$.pipe(filter(pusherBatchStatusUpdate.match), filter((action) => action.payload.batchId === batchId)), actions$.pipe(filter(fetchBulkUploadBatchDetailsSuccess.match), filter((action) => action.payload.batchId === batchId)), actions$.pipe(filter(bulkUploadAutomatchingTimedOut.match), filter((action) => action.payload.batchId === batchId)))), switchMap(() => zeniAPI
|
|
52
51
|
.getJSON(`${zeniAPI.apiEndPoints.communicationAgentMicroServiceBaseUrl}/1.0/batches/${batchId}`)
|
|
53
52
|
.pipe(mergeMap((response) => {
|
|
54
53
|
/** Same batch-details URL; polls until `status` is completed (Pusher may win first). */
|
|
@@ -91,6 +91,7 @@ export function getExpenseAutomationView(state) {
|
|
|
91
91
|
const fetchStateVariables = [
|
|
92
92
|
expenseAutomationMissingReceiptsViewState,
|
|
93
93
|
expenseAutomationJESchedulesViewState,
|
|
94
|
+
monthEndCloseChecksView,
|
|
94
95
|
expenseAutomationTransactionsView,
|
|
95
96
|
expenseAutomationReconciliationViewState,
|
|
96
97
|
];
|
|
@@ -64,8 +64,8 @@ export const toTransactionUpdatesFromTransactionCategorizationLocalData = (trans
|
|
|
64
64
|
lineItem.account?.qboId !== accountLine.account.qboId &&
|
|
65
65
|
Boolean(lineItem.account?.qboId);
|
|
66
66
|
hasClassChanged =
|
|
67
|
-
(lineItem.class?.qboId
|
|
68
|
-
lineItem.class?.qboId !== accountLine.class
|
|
67
|
+
Boolean(lineItem.class?.qboId) &&
|
|
68
|
+
lineItem.class?.qboId !== accountLine.class.qboId;
|
|
69
69
|
const recommendedAccountBase = toRecommendedAccountBase(lineItem.amount.amount, lineItem.account);
|
|
70
70
|
const recommendedClassBase = toRecommendedClassBase(lineItem.amount.amount, lineItem.class);
|
|
71
71
|
if (entityDetails != null &&
|
package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js
CHANGED
|
@@ -234,7 +234,7 @@ const buildLineItemById = (transaction, uncategorizedIncomeExpense, recommendati
|
|
|
234
234
|
isPreFilled: true,
|
|
235
235
|
};
|
|
236
236
|
}
|
|
237
|
-
if (
|
|
237
|
+
if (accountLine.class.classId === '' &&
|
|
238
238
|
higherPreferenceRecommendation?.class != null) {
|
|
239
239
|
record.class = {
|
|
240
240
|
...higherPreferenceRecommendation.class,
|
|
@@ -464,7 +464,7 @@ export const setEntityRecommendationForLineIdInLocalData = (draft, transaction,
|
|
|
464
464
|
}
|
|
465
465
|
: accountLine.account;
|
|
466
466
|
record.class =
|
|
467
|
-
|
|
467
|
+
accountLine.class.classId !== ''
|
|
468
468
|
? accountLine.class
|
|
469
469
|
: recommendations?.[0]?.class
|
|
470
470
|
? {
|
|
@@ -44,8 +44,6 @@ export const initialState = {
|
|
|
44
44
|
uiState: {
|
|
45
45
|
searchString: '',
|
|
46
46
|
scrollPosition: { scrollTop: 0, scrollLeft: undefined },
|
|
47
|
-
sortKey: 'startMonth',
|
|
48
|
-
sortOrder: 'descending',
|
|
49
47
|
totalCount: 0,
|
|
50
48
|
limit: 10,
|
|
51
49
|
},
|
|
@@ -367,26 +365,12 @@ const expenseAutomationJESchedulesView = createSlice({
|
|
|
367
365
|
clearJeAccountSettingsLocalData(draft) {
|
|
368
366
|
draft.accountSettings.localData = accountSettingsInitialState.localData;
|
|
369
367
|
},
|
|
370
|
-
updateJESchedulesUIState(draft, action) {
|
|
371
|
-
if (action.payload.sortKey != null) {
|
|
372
|
-
draft.uiState.sortKey = action.payload.sortKey;
|
|
373
|
-
}
|
|
374
|
-
if (action.payload.sortOrder != null) {
|
|
375
|
-
draft.uiState.sortOrder = action.payload.sortOrder;
|
|
376
|
-
}
|
|
377
|
-
if (action.payload.searchString != null) {
|
|
378
|
-
draft.uiState.searchString = action.payload.searchString;
|
|
379
|
-
}
|
|
380
|
-
if (action.payload.scrollPosition != null) {
|
|
381
|
-
draft.uiState.scrollPosition = action.payload.scrollPosition;
|
|
382
|
-
}
|
|
383
|
-
},
|
|
384
368
|
clearExpenseAutomationJESchedulesView(draft) {
|
|
385
369
|
Object.assign(draft, initialState);
|
|
386
370
|
},
|
|
387
371
|
},
|
|
388
372
|
});
|
|
389
|
-
export const { clearExpenseAutomationJESchedulesView, clearJeAccountSettingsLocalData, clearJeScheduleLocalData, fetchAccountSettingsListForAccountTypes, fetchJeSchedules, fetchJeSchedulesFailure, fetchJeSchedulesPage, fetchJeSchedulesSuccess, fetchRecommendationForAccountSettings, ignoreRecommendedJeSchedule, ignoreRecommendedJeScheduleFailure, ignoreRecommendedJeScheduleSuccess, initializeAccountSettingsView, initializeJeScheduleLocalData, removeFailedJeScheduleTransactionKey, removeJeScheduleLocalDataById, removeJeScheduleTransactionKey, retryJeSchedule, retryJeScheduleFailure, retryJeScheduleSuccess, saveAccountSettings, saveAccountSettingsFailure, saveAccountSettingsLocalData, saveAccountSettingsSuccess, updateAccountSettingsListForAccountTypes, updateAccountSettingsListForAccountTypesFailure,
|
|
373
|
+
export const { clearExpenseAutomationJESchedulesView, clearJeAccountSettingsLocalData, clearJeScheduleLocalData, fetchAccountSettingsListForAccountTypes, fetchJeSchedules, fetchJeSchedulesFailure, fetchJeSchedulesPage, fetchJeSchedulesSuccess, fetchRecommendationForAccountSettings, ignoreRecommendedJeSchedule, ignoreRecommendedJeScheduleFailure, ignoreRecommendedJeScheduleSuccess, initializeAccountSettingsView, initializeJeScheduleLocalData, removeFailedJeScheduleTransactionKey, removeJeScheduleLocalDataById, removeJeScheduleTransactionKey, retryJeSchedule, retryJeScheduleFailure, retryJeScheduleSuccess, saveAccountSettings, saveAccountSettingsFailure, saveAccountSettingsLocalData, saveAccountSettingsSuccess, updateAccountSettingsListForAccountTypes, updateAccountSettingsListForAccountTypesFailure, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys, updateRecommendationForAccountSettings, updateRecommendationForAccountSettingsFailure, } = expenseAutomationJESchedulesView.actions;
|
|
390
374
|
export default expenseAutomationJESchedulesView.reducer;
|
|
391
375
|
const doUpdateRecommendationForAccountSettings = (draft, payload) => {
|
|
392
376
|
const { prepaidExpensesRecommendations, fixedAssetsRecommendations, accruedExpensesRecommendations, } = mapAccountTypeRecommendationPayloadToAccountRecommendationByType(payload);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { reduceAnyFetchState } from '../../../commonStateTypes/reduceFetchState';
|
|
2
1
|
import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
|
|
3
2
|
import { getAccountBase } from '../../../entity/account/accountSelector';
|
|
4
3
|
import { getClassById } from '../../../entity/class/classSelector';
|
|
@@ -7,7 +6,7 @@ import { getUserByUserId } from '../../../entity/user/userSelector';
|
|
|
7
6
|
import { getVendorByVendorId } from '../../../entity/vendor/vendorSelector';
|
|
8
7
|
import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
|
|
9
8
|
export function getExpenseAutomationFluxAnalysisView(state) {
|
|
10
|
-
const { expenseAutomationFluxAnalysisViewState, monthEndCloseChecksState
|
|
9
|
+
const { expenseAutomationFluxAnalysisViewState, monthEndCloseChecksState } = state;
|
|
11
10
|
const { fetchState, error, refreshStatus, uiState, reviewOperatingExpenseIdsByPeriod, selectedSectionIdsByPeriod, groupsBySelectedPeriod, fluxAnalysisEntities, bulkReviewStatus, currency, totalBalancesAndVariance, } = expenseAutomationFluxAnalysisViewState;
|
|
12
11
|
const fetchStateAndError = {
|
|
13
12
|
fetchState,
|
|
@@ -92,17 +91,10 @@ export function getExpenseAutomationFluxAnalysisView(state) {
|
|
|
92
91
|
},
|
|
93
92
|
};
|
|
94
93
|
const completionStatus = fluxCompletionStatus != null ? fluxCompletionStatus : 'incomplete';
|
|
95
|
-
const monthEndFetchState = monthYearPeriodId != null
|
|
96
|
-
? (monthEndCloseChecksViewState.monthEndCloseChecksViewByTenantId[currentTenant.tenantId]?.[monthYearPeriodId] ?? { fetchState: 'Not-Started', error: undefined })
|
|
97
|
-
: { fetchState: 'Not-Started', error: undefined };
|
|
98
|
-
const reducedFetchStatus = reduceAnyFetchState([
|
|
99
|
-
fetchStateAndError,
|
|
100
|
-
monthEndFetchState,
|
|
101
|
-
]);
|
|
102
94
|
return {
|
|
103
95
|
sections,
|
|
104
96
|
totalBalancesAndVariance,
|
|
105
|
-
fetchStatus:
|
|
97
|
+
fetchStatus: fetchStateAndError,
|
|
106
98
|
bulkReviewStatus,
|
|
107
99
|
reviewOperatingExpensesIds,
|
|
108
100
|
selectedSectionIds,
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import omit from 'lodash/omit';
|
|
2
|
-
import orderBy from 'lodash/orderBy';
|
|
3
|
-
import { reduceAnyFetchState } from '../../../commonStateTypes/reduceFetchState';
|
|
4
2
|
import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
|
|
5
3
|
import { getAccountIdsForTypes } from '../../../entity/account/accountSelector';
|
|
6
4
|
import { getJEScheduledTransactionByJEScheduleTransactionKey, } from '../../../entity/jeSchedules/jeSchedulesSelector';
|
|
@@ -12,48 +10,10 @@ import { filterNestedAccountHierarchyById } from '../../scheduleView/scheduleDet
|
|
|
12
10
|
import { getAccountLabelForScheduleType, getAccountsTypesForScheduleList, } from '../../scheduleView/scheduleListView/scheduleListHelper';
|
|
13
11
|
import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
|
|
14
12
|
import { getJEAccountSettingsView } from './jeAccountSettingsViewSelector';
|
|
15
|
-
function getJEScheduleSortAccessor(sortKey) {
|
|
16
|
-
switch (sortKey) {
|
|
17
|
-
case 'vendor':
|
|
18
|
-
return (s) => s.vendor.name?.toLowerCase();
|
|
19
|
-
case 'category':
|
|
20
|
-
return (s) => s.jeDebit.account?.accountName?.toLowerCase();
|
|
21
|
-
case 'class':
|
|
22
|
-
return (s) => s.jeDebit.accountingClass?.className?.toLowerCase();
|
|
23
|
-
case 'depCategory':
|
|
24
|
-
return (s) => s.jeCredit.account?.accountName?.toLowerCase();
|
|
25
|
-
case 'scheduleCategory':
|
|
26
|
-
return (s) => s.jeScheduleType;
|
|
27
|
-
case 'startMonth':
|
|
28
|
-
return (s) => s.startDate?.valueOf();
|
|
29
|
-
case 'type':
|
|
30
|
-
return (s) => s.baseTransaction.typeOfTransaction;
|
|
31
|
-
case 'amortizationPeriod':
|
|
32
|
-
return (s) => s.period;
|
|
33
|
-
case 'jePostingDate':
|
|
34
|
-
return (s) => s.dayOfPostingDate;
|
|
35
|
-
case 'remainingMonths':
|
|
36
|
-
return (s) => s.period;
|
|
37
|
-
case 'runningBalance':
|
|
38
|
-
return (s) => s.balanceAsOfToday?.amount;
|
|
39
|
-
case 'totalAmount':
|
|
40
|
-
return (s) => s.baseTransaction.amount.amount;
|
|
41
|
-
case 'transactionDate':
|
|
42
|
-
return (s) => s.baseTransaction.date.valueOf();
|
|
43
|
-
case 'memo':
|
|
44
|
-
return (s) => s.baseTransaction.memo?.toLowerCase();
|
|
45
|
-
default:
|
|
46
|
-
return (s) => s.startDate?.valueOf();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function sortJEScheduledTransactions(transactions, sortKey, sortOrder) {
|
|
50
|
-
const accessor = getJEScheduleSortAccessor(sortKey);
|
|
51
|
-
return orderBy(transactions, [accessor], [sortOrder === 'ascending' ? 'asc' : 'desc']);
|
|
52
|
-
}
|
|
53
13
|
export function getExpenseAutomationJESchedulesView(state) {
|
|
54
14
|
const jeScheduledTransaction = [];
|
|
55
15
|
const failedJeScheduledTransaction = [];
|
|
56
|
-
const { accountState, accountListState, classState, classListState, expenseAutomationJESchedulesViewState, expenseAutomationViewState, monthEndCloseChecksState,
|
|
16
|
+
const { accountState, accountListState, classState, classListState, expenseAutomationJESchedulesViewState, expenseAutomationViewState, monthEndCloseChecksState, } = state;
|
|
57
17
|
const { jeScheduleTransactionKeysByPeriod, failedJeScheduleTransactionKeysByPeriod, jeScheduleLocalDataById, postStatusById, ignoreStatusById, uiState, error, fetchState, refreshStatus, } = expenseAutomationJESchedulesViewState;
|
|
58
18
|
const accountSettingsView = getJEAccountSettingsView(state);
|
|
59
19
|
const currentTenant = getCurrentTenant(state);
|
|
@@ -99,33 +59,18 @@ export function getExpenseAutomationJESchedulesView(state) {
|
|
|
99
59
|
const jeScheduleDetails = getJEScheduledTransactionByJEScheduleTransactionKey(jeScheduleKey, state);
|
|
100
60
|
failedJeScheduledTransaction.push(jeScheduleDetails);
|
|
101
61
|
});
|
|
102
|
-
const
|
|
103
|
-
const
|
|
104
|
-
const ongoingSchedules = sortJEScheduledTransactions(jeScheduledTransaction.filter((schedule) => schedule.status.code === 'ongoing'), sortKey, sortOrder);
|
|
105
|
-
const completedSchedules = sortJEScheduledTransactions(jeScheduledTransaction.filter((schedule) => schedule.status.code === 'completed' ||
|
|
106
|
-
schedule.status.code === 'marked_as_completed'), sortKey, sortOrder);
|
|
107
|
-
const unsortedResolveSchedules = [];
|
|
62
|
+
const draftSchedules = jeScheduledTransaction.filter((schedule) => schedule.status.code === 'draft');
|
|
63
|
+
const resolveSchedules = [];
|
|
108
64
|
failedJeScheduledTransaction.forEach((schedule) => {
|
|
109
65
|
schedule.scheduledJournalEntry.forEach((journalEntry) => {
|
|
110
|
-
|
|
111
|
-
...schedule,
|
|
112
|
-
scheduledJournalEntry: journalEntry,
|
|
113
|
-
});
|
|
66
|
+
resolveSchedules.push({ ...schedule, scheduledJournalEntry: journalEntry });
|
|
114
67
|
});
|
|
115
68
|
});
|
|
116
|
-
const resolveSchedules = sortJEScheduledTransactions(unsortedResolveSchedules, sortKey, sortOrder);
|
|
117
69
|
const allSteps = monthYearPeriodId != null
|
|
118
70
|
? getAllSteps(monthEndCloseChecksState, monthYearPeriodId, currentTenant.tenantId)
|
|
119
71
|
: [];
|
|
120
72
|
const jeCompletionStatus = allSteps.find((step) => step.step === 'je_schedules')?.completionStatus;
|
|
121
73
|
const completionStatus = jeCompletionStatus != null ? jeCompletionStatus : 'incomplete';
|
|
122
|
-
const monthEndFetchState = monthYearPeriodId != null
|
|
123
|
-
? (monthEndCloseChecksViewState.monthEndCloseChecksViewByTenantId[currentTenant.tenantId]?.[monthYearPeriodId] ?? { fetchState: 'Not-Started', error: undefined })
|
|
124
|
-
: { fetchState: 'Not-Started', error: undefined };
|
|
125
|
-
const reducedFetchStatus = reduceAnyFetchState([
|
|
126
|
-
{ fetchState, error },
|
|
127
|
-
monthEndFetchState,
|
|
128
|
-
]);
|
|
129
74
|
return {
|
|
130
75
|
uncategorizedAccounts,
|
|
131
76
|
allDepreciationAccountList: filteredDepAccounts,
|
|
@@ -134,17 +79,15 @@ export function getExpenseAutomationJESchedulesView(state) {
|
|
|
134
79
|
allAccountList: filteredAccounts,
|
|
135
80
|
accountListNestedAccountHierarchy,
|
|
136
81
|
allClassList: allClasses,
|
|
137
|
-
completedSchedules,
|
|
138
82
|
draftSchedules,
|
|
139
|
-
ongoingSchedules,
|
|
140
83
|
resolveSchedules: resolveSchedules,
|
|
141
84
|
accountSettingsView,
|
|
142
85
|
postStatusById: postStatusById,
|
|
143
86
|
ignoreStatusById: ignoreStatusById,
|
|
144
|
-
fetchState:
|
|
87
|
+
fetchState: fetchState,
|
|
145
88
|
jeScheduleLocalDataById: jeScheduleLocalDataById,
|
|
146
89
|
uiState: uiState,
|
|
147
|
-
error:
|
|
90
|
+
error: error,
|
|
148
91
|
refreshStatus,
|
|
149
92
|
completionStatus,
|
|
150
93
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import orderBy from 'lodash/orderBy';
|
|
2
|
-
import { reduceAnyFetchState } from '../../../commonStateTypes/reduceFetchState';
|
|
3
2
|
import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
|
|
4
3
|
import { getCurrentTenant } from '../../../entity/tenant/tenantSelector';
|
|
5
4
|
import { getSupportedTransactionById, getSupportedTransactionsByIds, } from '../../../entity/transaction/transactionSelector';
|
|
@@ -8,7 +7,7 @@ import { getCompletedTransactionsCacheKey } from '../reducers/missingReceiptsVie
|
|
|
8
7
|
import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
|
|
9
8
|
import { isUnmatchedTabFileStatus, } from '../types/missingReceiptsViewState';
|
|
10
9
|
export function getExpenseAutomationMissingReceiptsView(state) {
|
|
11
|
-
const { expenseAutomationMissingReceiptsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState,
|
|
10
|
+
const { expenseAutomationMissingReceiptsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState, } = state;
|
|
12
11
|
const currentTenant = getCurrentTenant(state);
|
|
13
12
|
const { selectedPeriodByTenantId } = expenseAutomationViewState;
|
|
14
13
|
const selectedPeriod = selectedPeriodByTenantId[currentTenant.tenantId];
|
|
@@ -37,7 +36,7 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
37
36
|
transaction.lines.length > 0 &&
|
|
38
37
|
transaction.lines[0]
|
|
39
38
|
?.class != null
|
|
40
|
-
? transaction.lines[0].class
|
|
39
|
+
? transaction.lines[0].class.className.toLowerCase()
|
|
41
40
|
: null;
|
|
42
41
|
case 'vendor':
|
|
43
42
|
default:
|
|
@@ -176,16 +175,9 @@ export function getExpenseAutomationMissingReceiptsView(state) {
|
|
|
176
175
|
vendorLogo: result.vendorLogo ?? transaction?.logo?.href,
|
|
177
176
|
};
|
|
178
177
|
});
|
|
179
|
-
const monthEndFetchState = monthYearPeriodId != null
|
|
180
|
-
? (monthEndCloseChecksViewState.monthEndCloseChecksViewByTenantId[currentTenant.tenantId]?.[monthYearPeriodId] ?? { fetchState: 'Not-Started', error: undefined })
|
|
181
|
-
: { fetchState: 'Not-Started', error: undefined };
|
|
182
|
-
const reducedFetchStatus = reduceAnyFetchState([
|
|
183
|
-
{ fetchState, error },
|
|
184
|
-
monthEndFetchState,
|
|
185
|
-
]);
|
|
186
178
|
return {
|
|
187
|
-
fetchState
|
|
188
|
-
error
|
|
179
|
+
fetchState,
|
|
180
|
+
error,
|
|
189
181
|
uploadReceiptStatusById,
|
|
190
182
|
uiState,
|
|
191
183
|
refreshStatus,
|