@zeniai/client-epic-state 5.0.69-betaML51 → 5.0.69-betaML52
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/viewAndReport/viewAndReport.d.ts +2 -2
- package/lib/commonStateTypes/viewAndReport/viewAndReport.js +2 -0
- package/lib/entity/account/accountSelector.d.ts +9 -0
- package/lib/entity/account/accountSelector.js +14 -1
- package/lib/entity/account/accountState.d.ts +1 -1
- package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
- package/lib/entity/class/classReducer.d.ts +4 -4
- package/lib/entity/class/classState.d.ts +1 -1
- package/lib/entity/forecast/forecastState.d.ts +1 -1
- package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
- package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
- package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
- package/lib/entity/sectionProjectView/sectionProjectView.d.ts +1 -1
- package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +2 -2
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +1 -0
- package/lib/entity/tenant/clearAllEpic.d.ts +2 -1
- package/lib/entity/tenant/clearAllEpic.js +2 -0
- package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +4 -0
- package/lib/entity/transaction/payloadTypes/transactionPayload.js +18 -10
- package/lib/entity/transaction/stateTypes/transaction.d.ts +3 -0
- package/lib/epic.d.ts +3 -1
- package/lib/epic.js +3 -1
- package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +2 -0
- package/lib/esm/entity/account/accountSelector.js +11 -0
- package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
- package/lib/esm/entity/tenant/clearAllEpic.js +2 -0
- package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +18 -10
- package/lib/esm/epic.js +3 -1
- package/lib/esm/index.js +5 -4
- package/lib/esm/reducer.js +3 -0
- package/lib/esm/view/createTransferEntry/createTransferEntryReducer.js +72 -0
- package/lib/esm/view/createTransferEntry/createTransferEntrySelector.js +64 -0
- package/lib/esm/view/createTransferEntry/createTransferEntryState.js +17 -0
- package/lib/esm/view/createTransferEntry/epics/createTransferEntryEpic.js +130 -0
- package/lib/esm/view/createTransferEntry/epics/fetchTransferAccountsEpic.js +36 -0
- package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +8 -0
- package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +13 -1
- package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +9 -1
- package/lib/esm/view/transactionDetail/epics/transactionDetailEpic.js +14 -2
- package/lib/esm/view/transactionDetail/transactionDetailReducer.js +2 -1
- package/lib/esm/view/transactionDetail/transactionDetailSelector.js +6 -1
- package/lib/index.d.ts +5 -4
- package/lib/index.js +43 -33
- package/lib/reducer.d.ts +3 -0
- package/lib/reducer.js +3 -0
- package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
- package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
- package/lib/view/cardBalance/cardBalanceSelector.d.ts +1 -1
- package/lib/view/cashBalance/cashBalanceSelector.d.ts +1 -1
- package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
- package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
- package/lib/view/createTransferEntry/createTransferEntryReducer.d.ts +32 -0
- package/lib/view/createTransferEntry/createTransferEntryReducer.js +76 -0
- package/lib/view/createTransferEntry/createTransferEntrySelector.d.ts +39 -0
- package/lib/view/createTransferEntry/createTransferEntrySelector.js +69 -0
- package/lib/view/createTransferEntry/createTransferEntryState.d.ts +30 -0
- package/lib/view/createTransferEntry/createTransferEntryState.js +20 -0
- package/lib/view/createTransferEntry/epics/createTransferEntryEpic.d.ts +11 -0
- package/lib/view/createTransferEntry/epics/createTransferEntryEpic.js +134 -0
- package/lib/view/createTransferEntry/epics/fetchTransferAccountsEpic.d.ts +14 -0
- package/lib/view/createTransferEntry/epics/fetchTransferAccountsEpic.js +40 -0
- package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
- package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.d.ts +2 -1
- package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +8 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +3 -1
- package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +14 -2
- package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +4 -1
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +1 -0
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +11 -1
- package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
- package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
- package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
- package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
- package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
- package/lib/view/topEx/topExSelector.d.ts +1 -1
- package/lib/view/transactionDetail/epics/transactionDetailEpic.d.ts +2 -1
- package/lib/view/transactionDetail/epics/transactionDetailEpic.js +14 -2
- package/lib/view/transactionDetail/transactionDetailPayload.d.ts +1 -1
- package/lib/view/transactionDetail/transactionDetailReducer.d.ts +2 -1
- package/lib/view/transactionDetail/transactionDetailReducer.js +2 -1
- package/lib/view/transactionDetail/transactionDetailSelector.d.ts +6 -1
- package/lib/view/transactionDetail/transactionDetailSelector.js +6 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createSelector } from '@reduxjs/toolkit';
|
|
2
|
+
import { getAccountBase, getAccountBaseForCreditCardTransferAccounts, getAccountBaseForTransferAccounts, } from '../../entity/account/accountSelector';
|
|
3
|
+
import { getAccountList } from '../accountList/accountListSelector';
|
|
4
|
+
export function getCreateTransferEntryStatus(state) {
|
|
5
|
+
return state.createTransferEntryState.createTransferEntryStatus;
|
|
6
|
+
}
|
|
7
|
+
export function getLastTransferEntryReplacement(state) {
|
|
8
|
+
return state.createTransferEntryState.lastTransferEntryReplacement;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Shared resolver for the credit/debit dropdowns in the transfer drawer.
|
|
12
|
+
*
|
|
13
|
+
* Resolution policy (intentional):
|
|
14
|
+
* 1. Prefer the dedicated API fetch results (`transferEntryEligible` for the
|
|
15
|
+
* debit pool, `creditCardOnlyEligible` for the credit-card-payment credit
|
|
16
|
+
* pool).
|
|
17
|
+
* 2. If the dedicated fetch returns an empty list while the COA is loaded,
|
|
18
|
+
* fall back to the COA: the full account list for `transferEntryEligible`,
|
|
19
|
+
* and COA accounts filtered to `credit_card` for `creditCardOnlyEligible`.
|
|
20
|
+
* This keeps the dropdown populated for older tenants where the dedicated
|
|
21
|
+
* endpoints haven't been backfilled yet.
|
|
22
|
+
*
|
|
23
|
+
* Intent — what this selector deliberately does NOT do:
|
|
24
|
+
* - Does NOT distinguish "fetch in-flight" / "fetch errored" / "fetch returned
|
|
25
|
+
* empty" — all three collapse to the COA fallback. The product preference
|
|
26
|
+
* is "always show something selectable" over "show a spinner that may never
|
|
27
|
+
* resolve". Loading/error UI belongs in the view layer; if you need a
|
|
28
|
+
* spinner, observe the `fetchState` on `transferAccountsByType[kind]`
|
|
29
|
+
* separately rather than changing the resolution policy here.
|
|
30
|
+
* - Does NOT enforce "API result is authoritative even if empty" — a tenant
|
|
31
|
+
* whose dedicated endpoint is correctly returning `[]` (e.g. no eligible
|
|
32
|
+
* transfer destinations) will still see the COA. That trade-off is
|
|
33
|
+
* accepted because the alternative blocks the user from picking anything;
|
|
34
|
+
* the backend distinguishes "no result" from "endpoint not implemented" by
|
|
35
|
+
* surfacing an error response, which the view layer handles separately.
|
|
36
|
+
*
|
|
37
|
+
* Memoized with reselect so consuming view-models don't recompute on every
|
|
38
|
+
* unrelated state change.
|
|
39
|
+
*/
|
|
40
|
+
export const getResolvedTransferAccounts = createSelector([
|
|
41
|
+
(state) => state.accountState,
|
|
42
|
+
(state) => state.accountListState,
|
|
43
|
+
(state) => state.createTransferEntryState.transferAccountsByType
|
|
44
|
+
.transferEntryEligible.accountIds,
|
|
45
|
+
(state) => state.createTransferEntryState.transferAccountsByType
|
|
46
|
+
.creditCardOnlyEligible.accountIds,
|
|
47
|
+
], (accountState, accountListState, transferEligibleIds, creditCardOnlyIds) => {
|
|
48
|
+
const accountList = getAccountList(accountState, accountListState, 'accountList');
|
|
49
|
+
const transferEligibleFromApi = transferEligibleIds
|
|
50
|
+
.map((id) => getAccountBaseForTransferAccounts(accountState, id))
|
|
51
|
+
.filter((account) => account != null);
|
|
52
|
+
const coaFallbackAllAccounts = accountList.accounts
|
|
53
|
+
.map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
|
|
54
|
+
.filter((account) => account != null);
|
|
55
|
+
const transferAccountsList = transferEligibleFromApi.length > 0
|
|
56
|
+
? transferEligibleFromApi
|
|
57
|
+
: coaFallbackAllAccounts;
|
|
58
|
+
const creditCardFromApi = creditCardOnlyIds
|
|
59
|
+
.map((id) => getAccountBaseForCreditCardTransferAccounts(accountState, id))
|
|
60
|
+
.filter((account) => account != null);
|
|
61
|
+
const coaFallbackCreditCards = coaFallbackAllAccounts.filter((a) => a.accountType === 'credit_card');
|
|
62
|
+
const creditCardTransferAccountsList = creditCardFromApi.length > 0 ? creditCardFromApi : coaFallbackCreditCards;
|
|
63
|
+
return { creditCardTransferAccountsList, transferAccountsList };
|
|
64
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Which pool `fetchAccountsForTransferFlow` / transfer-flow epic should load. */
|
|
2
|
+
export const TRANSFER_ACCOUNTS_FETCH_TYPE = [
|
|
3
|
+
'transferEntryEligible',
|
|
4
|
+
'creditCardOnlyEligible',
|
|
5
|
+
];
|
|
6
|
+
const initialTransferAccountsState = {
|
|
7
|
+
accountIds: [],
|
|
8
|
+
fetchState: 'Not-Started',
|
|
9
|
+
};
|
|
10
|
+
export const initialCreateTransferEntryState = {
|
|
11
|
+
createTransferEntryStatus: 'Not-Started',
|
|
12
|
+
lastTransferEntryReplacement: undefined,
|
|
13
|
+
transferAccountsByType: {
|
|
14
|
+
transferEntryEligible: initialTransferAccountsState,
|
|
15
|
+
creditCardOnlyEligible: initialTransferAccountsState,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { concat, from, timer } from 'rxjs';
|
|
2
|
+
import { catchError, filter, mergeMap } from 'rxjs/operators';
|
|
3
|
+
import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
|
|
4
|
+
import { toTransactionID } from '../../../entity/transaction/payloadTypes/transactionIDPayload';
|
|
5
|
+
import { removeTransaction, updateTransaction, } from '../../../entity/transaction/transactionReducer';
|
|
6
|
+
import { isSuccessResponse } from '../../../responsePayload';
|
|
7
|
+
import { removeTransactionFromAllTabs } from '../../expenseAutomationView/reducers/transactionsViewReducer';
|
|
8
|
+
import { initializeTransactionDetailLocalData, removeTransactionDetail, } from '../../transactionDetail/transactionDetailReducer';
|
|
9
|
+
import { getTransactionDetailKey } from '../../transactionDetail/transactionDetailState';
|
|
10
|
+
import { clearTransferEntryRouteReplacement, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, } from '../createTransferEntryReducer';
|
|
11
|
+
// ─── Pure helpers ────────────────────────────────────────────────────────────
|
|
12
|
+
function transactionIdsAreEqual(a, b) {
|
|
13
|
+
return a.id === b.id && a.type === b.type;
|
|
14
|
+
}
|
|
15
|
+
const successSnackbar = () => openSnackbar({
|
|
16
|
+
messageSection: 'create_transfer_entry',
|
|
17
|
+
messageText: 'success',
|
|
18
|
+
type: 'success',
|
|
19
|
+
});
|
|
20
|
+
const failureSnackbar = () => openSnackbar({
|
|
21
|
+
messageSection: 'create_transfer_entry',
|
|
22
|
+
messageText: 'failed',
|
|
23
|
+
type: 'error',
|
|
24
|
+
});
|
|
25
|
+
function buildFailureActions() {
|
|
26
|
+
return [createTransferEntryFailure(), failureSnackbar()];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Defensive guard: a BE response that returns 200 with `transaction != null`
|
|
30
|
+
* but where the body lacks a usable id/type is unsafe to seed into the store —
|
|
31
|
+
* downstream code would store under a garbage key and the host hook would try
|
|
32
|
+
* to navigate to a broken url. Treat that case as failure so the source row
|
|
33
|
+
* stays visible and the user can retry.
|
|
34
|
+
*/
|
|
35
|
+
function isWellFormedTransactionPayload(t) {
|
|
36
|
+
return (t != null &&
|
|
37
|
+
typeof t.transaction_id === 'string' &&
|
|
38
|
+
t.transaction_id !== '' &&
|
|
39
|
+
typeof t.transaction_type === 'string' &&
|
|
40
|
+
t.transaction_type !== '');
|
|
41
|
+
}
|
|
42
|
+
function buildSuccessSideEffects(sourceTransactionId) {
|
|
43
|
+
return [
|
|
44
|
+
createTransferEntrySuccess(),
|
|
45
|
+
removeTransactionFromAllTabs(sourceTransactionId),
|
|
46
|
+
successSnackbar(),
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
function buildPreviousTransactionCleanupActions(previousTransactionId) {
|
|
50
|
+
return [
|
|
51
|
+
removeTransaction(getTransactionDetailKey(previousTransactionId)),
|
|
52
|
+
removeTransactionDetail(previousTransactionId),
|
|
53
|
+
clearTransferEntryRouteReplacement(),
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Emits `resetCreateTransferEntryStatus()` (and, on the replacement path, the
|
|
58
|
+
* follow-up cleanup actions) one scheduler tick after the success actions.
|
|
59
|
+
*
|
|
60
|
+
* Why the `timer(0)` (and not synchronous emission):
|
|
61
|
+
* On the replacement path the host (web-app-ui) watches
|
|
62
|
+
* `lastTransferEntryReplacement`, navigates to the new transaction url, and
|
|
63
|
+
* then sees `clearTransferEntryRouteReplacement` clear the signal. If we
|
|
64
|
+
* dispatched the cleanup actions in the same tick as
|
|
65
|
+
* `createTransferEntryReplacedTransaction`, redux subscribers would observe
|
|
66
|
+
* `lastTransferEntryReplacement` flicker on then off in a single render, and
|
|
67
|
+
* the old transaction's state (which the still-mounted detail view may be
|
|
68
|
+
* reading) would be torn down before the host has had a chance to start
|
|
69
|
+
* navigating. Deferring by one microtask gives the host exactly one render
|
|
70
|
+
* pass to react before we tear down the previous transaction.
|
|
71
|
+
*/
|
|
72
|
+
function delayedResetAndPreviousCleanup(previousTransactionId) {
|
|
73
|
+
return timer(0).pipe(mergeMap(() => {
|
|
74
|
+
const actions = [resetCreateTransferEntryStatus()];
|
|
75
|
+
if (previousTransactionId != null) {
|
|
76
|
+
actions.push(...buildPreviousTransactionCleanupActions(previousTransactionId));
|
|
77
|
+
}
|
|
78
|
+
return from(actions);
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
// ─── Success-path branches ───────────────────────────────────────────────────
|
|
82
|
+
function handleSuccessWithoutTransactionBody(transactionId) {
|
|
83
|
+
return concat(from(buildSuccessSideEffects(transactionId)), delayedResetAndPreviousCleanup(undefined));
|
|
84
|
+
}
|
|
85
|
+
function handleSuccessWithTransactionBody(transactionPayload, vendorPayload, previousTransactionId, sourceTransactionId) {
|
|
86
|
+
const newTransactionId = toTransactionID(transactionPayload);
|
|
87
|
+
const replaced = !transactionIdsAreEqual(previousTransactionId, newTransactionId);
|
|
88
|
+
const immediate = [
|
|
89
|
+
updateTransaction(getTransactionDetailKey(newTransactionId), transactionPayload),
|
|
90
|
+
initializeTransactionDetailLocalData({
|
|
91
|
+
transactionId: newTransactionId,
|
|
92
|
+
vendorId: vendorPayload?.[0]?.vendor_id,
|
|
93
|
+
}),
|
|
94
|
+
...buildSuccessSideEffects(sourceTransactionId),
|
|
95
|
+
];
|
|
96
|
+
if (replaced) {
|
|
97
|
+
immediate.push(createTransferEntryReplacedTransaction(previousTransactionId, newTransactionId));
|
|
98
|
+
}
|
|
99
|
+
return concat(from(immediate), delayedResetAndPreviousCleanup(replaced ? previousTransactionId : undefined));
|
|
100
|
+
}
|
|
101
|
+
// ─── Top-level epic ──────────────────────────────────────────────────────────
|
|
102
|
+
const CREATE_TRANSFER_ENTRY_URL = `https://dev.api.zeni.ai/version/accounting/komal/1.0/transactions/transaction-type-update`;
|
|
103
|
+
export const createTransferEntryEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(createTransferEntry.match), mergeMap((action) => {
|
|
104
|
+
const { transactionId, creditAccountIntegrationId, debitAccountIntegrationId, memo, transactionType, sourceTransactionType, } = action.payload;
|
|
105
|
+
const previousTransactionId = {
|
|
106
|
+
id: transactionId,
|
|
107
|
+
type: sourceTransactionType,
|
|
108
|
+
};
|
|
109
|
+
return zeniAPI
|
|
110
|
+
.postAndGetJSON(CREATE_TRANSFER_ENTRY_URL, {
|
|
111
|
+
transaction_type: transactionType,
|
|
112
|
+
transaction_id: transactionId,
|
|
113
|
+
to_account_integration_id: creditAccountIntegrationId,
|
|
114
|
+
from_account_integration_id: debitAccountIntegrationId,
|
|
115
|
+
memo,
|
|
116
|
+
})
|
|
117
|
+
.pipe(mergeMap((response) => {
|
|
118
|
+
if (!isSuccessResponse(response)) {
|
|
119
|
+
return from(buildFailureActions());
|
|
120
|
+
}
|
|
121
|
+
const transaction = response.data?.transaction;
|
|
122
|
+
if (transaction != null) {
|
|
123
|
+
if (!isWellFormedTransactionPayload(transaction)) {
|
|
124
|
+
return from(buildFailureActions());
|
|
125
|
+
}
|
|
126
|
+
return handleSuccessWithTransactionBody(transaction, response.data?.vendors, previousTransactionId, transactionId);
|
|
127
|
+
}
|
|
128
|
+
return handleSuccessWithoutTransactionBody(transactionId);
|
|
129
|
+
}), catchError(() => from(buildFailureActions())));
|
|
130
|
+
}));
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { of } from 'rxjs';
|
|
2
|
+
import { catchError, filter, groupBy, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
|
+
import { updateAccounts } from '../../../entity/account/accountReducer';
|
|
4
|
+
import { isSuccessResponse } from '../../../responsePayload';
|
|
5
|
+
import { fetchAccountsForTransferFlow, updateAccountsForTransferFlow, updateAccountsForTransferFlowFailure, } from '../createTransferEntryReducer';
|
|
6
|
+
const REPORT_ID_BY_TYPE = {
|
|
7
|
+
transferEntryEligible: 'transfer_accounts',
|
|
8
|
+
creditCardOnlyEligible: 'credit_card_transfer_accounts',
|
|
9
|
+
};
|
|
10
|
+
const QUERY_BY_TYPE = {
|
|
11
|
+
transferEntryEligible: { is_only_include_transfer_accounts: true },
|
|
12
|
+
creditCardOnlyEligible: { is_include_only_credit_card_accounts: true },
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Pools fetched concurrently: `groupBy(kind)` keeps `transferEntryEligible`
|
|
16
|
+
* and `creditCardOnlyEligible` in their own streams so a back-to-back dispatch
|
|
17
|
+
* of both does not cancel the first. Within a single type, a fresh dispatch
|
|
18
|
+
* supersedes any in-flight request (per-group `switchMap`).
|
|
19
|
+
*/
|
|
20
|
+
export const fetchTransferAccountsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchAccountsForTransferFlow.match), groupBy((action) => action.payload.kind), mergeMap((group$) => group$.pipe(switchMap((action) => {
|
|
21
|
+
const { kind } = action.payload;
|
|
22
|
+
const queryValue = QUERY_BY_TYPE[kind];
|
|
23
|
+
const reportId = REPORT_ID_BY_TYPE[kind];
|
|
24
|
+
const url = `https://dev.api.zeni.ai/version/accounting/komal/1.0/accounts?query=${encodeURIComponent(JSON.stringify(queryValue))}`;
|
|
25
|
+
return zeniAPI.getJSON(url).pipe(mergeMap((response) => {
|
|
26
|
+
if (isSuccessResponse(response) && response.data != null) {
|
|
27
|
+
const accountIds = response.data.accounts.map((account) => account.account_id);
|
|
28
|
+
const actions = [
|
|
29
|
+
updateAccounts(response.data.accounts, reportId),
|
|
30
|
+
updateAccountsForTransferFlow({ accountIds, kind }),
|
|
31
|
+
];
|
|
32
|
+
return of(...actions);
|
|
33
|
+
}
|
|
34
|
+
return of(updateAccountsForTransferFlowFailure({ kind }));
|
|
35
|
+
}), catchError(() => of(updateAccountsForTransferFlowFailure({ kind }))));
|
|
36
|
+
}))));
|
|
@@ -4,6 +4,7 @@ import { toMonthYearPeriodId, } from '../../../../commonStateTypes/timePeriod';
|
|
|
4
4
|
import { getIsAccountingProjectsEnabled } from '../../../../entity/tenant/tenantSelector';
|
|
5
5
|
import { fetchAccountList } from '../../../accountList/accountListReducer';
|
|
6
6
|
import { fetchClassList } from '../../../classList/classListReducer';
|
|
7
|
+
import { fetchAccountsForTransferFlow } from '../../../createTransferEntry/createTransferEntryReducer';
|
|
7
8
|
import { fetchOwnerList } from '../../../ownerList/ownerListReducer';
|
|
8
9
|
import { fetchProjectList } from '../../../projectList/projectListReducer';
|
|
9
10
|
import { fetchTransactionCategorization, fetchTransactionCategorizationView, } from '../../reducers/transactionsViewReducer';
|
|
@@ -23,6 +24,13 @@ export const fetchTransactionCategorizationViewEpic = (actions$, state$) => acti
|
|
|
23
24
|
accountList.fetchState === 'Not-Started') {
|
|
24
25
|
updateActions.push(fetchAccountList('accountList', true));
|
|
25
26
|
}
|
|
27
|
+
const { transferEntryEligible, creditCardOnlyEligible } = state$.value.createTransferEntryState.transferAccountsByType;
|
|
28
|
+
if (transferEntryEligible.fetchState === 'Not-Started') {
|
|
29
|
+
updateActions.push(fetchAccountsForTransferFlow({ kind: 'transferEntryEligible' }));
|
|
30
|
+
}
|
|
31
|
+
if (creditCardOnlyEligible.fetchState === 'Not-Started') {
|
|
32
|
+
updateActions.push(fetchAccountsForTransferFlow({ kind: 'creditCardOnlyEligible' }));
|
|
33
|
+
}
|
|
26
34
|
const classList = state$.value.classListState;
|
|
27
35
|
if (classList.hasValidState() === false &&
|
|
28
36
|
classList.fetchState === 'Not-Started') {
|
|
@@ -5,6 +5,7 @@ import { toMonthYearPeriodId, } from '../../../commonStateTypes/timePeriod';
|
|
|
5
5
|
import { isVendorTransaction } from '../../../entity/transaction/stateTypes/vendorTransaction';
|
|
6
6
|
import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, filterAutoTabLineItems, mergeTabSpecificLineItems, removeTransactionFromTabView, setEntityRecommendationForLineIdInLocalData, toSetAllLineItemsToCategoryClass, toTransactionDetailLocalData, } from '../helpers/transactionCategorizationLocalDataHelper';
|
|
7
7
|
import { DEFAULT_COMPLETED_SUB_TAB, } from '../types/completedSubTab';
|
|
8
|
+
import { TRANSACTIONS_TABS, } from '../types/transactionsViewState';
|
|
8
9
|
export const initialTransactionTabViewState = {
|
|
9
10
|
saveStatus: {
|
|
10
11
|
fetchState: 'Not-Started',
|
|
@@ -927,7 +928,18 @@ const expenseAutomationTransactionsView = createSlice({
|
|
|
927
928
|
};
|
|
928
929
|
},
|
|
929
930
|
},
|
|
931
|
+
removeTransactionFromAllTabs: {
|
|
932
|
+
prepare(transactionId) {
|
|
933
|
+
return { payload: { transactionId } };
|
|
934
|
+
},
|
|
935
|
+
reducer(draft, action) {
|
|
936
|
+
const { transactionId } = action.payload;
|
|
937
|
+
for (const tab of TRANSACTIONS_TABS) {
|
|
938
|
+
removeTransactionFromTabView(draft.transactionCategorizationView[tab], transactionId);
|
|
939
|
+
}
|
|
940
|
+
},
|
|
941
|
+
},
|
|
930
942
|
},
|
|
931
943
|
});
|
|
932
|
-
export const { fetchTransactionCategorization, updateTransactionCategorizationUIState, initializeTransactionCategorizationViewLocalData, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateStatusForTransactionNotMiscategorizedUpdateForCategorization, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, setAllItemsToCategoryClassInLocalDataForCategorization, updateTotalCountForTransactionCategorization, updateParentTotalCountForTab, fetchTransactionCategorizationSuccess, resetOtherTabsFetchState, fetchTransactionCategorizationView, updateSelectedCheckboxTransactionIds, clearExpenseAutomationTransactionsViewPerTabView, clearExpenseAutomationTransactionsView, setEntityRecommendationForLineIdsForCategorization, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, } = expenseAutomationTransactionsView.actions;
|
|
944
|
+
export const { fetchTransactionCategorization, updateTransactionCategorizationUIState, initializeTransactionCategorizationViewLocalData, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateStatusForTransactionNotMiscategorizedUpdateForCategorization, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, setAllItemsToCategoryClassInLocalDataForCategorization, updateTotalCountForTransactionCategorization, updateParentTotalCountForTab, fetchTransactionCategorizationSuccess, resetOtherTabsFetchState, fetchTransactionCategorizationView, updateSelectedCheckboxTransactionIds, clearExpenseAutomationTransactionsViewPerTabView, clearExpenseAutomationTransactionsView, setEntityRecommendationForLineIdsForCategorization, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, removeTransactionFromAllTabs, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, } = expenseAutomationTransactionsView.actions;
|
|
933
945
|
export default expenseAutomationTransactionsView.reducer;
|
|
@@ -6,10 +6,14 @@ import { getTransactionWithCOT } from '../../../entity/transaction/transactionHe
|
|
|
6
6
|
import { getSupportedTransactionsByIds } from '../../../entity/transaction/transactionSelector';
|
|
7
7
|
import { getAccountList, getNestedAccountListHierarchy, getUncategorizedAccounts, } from '../../accountList/accountListSelector';
|
|
8
8
|
import { getClassList, getNestedClassListHierarchy, } from '../../classList/classListSelector';
|
|
9
|
+
import { getResolvedTransferAccounts } from '../../createTransferEntry/createTransferEntrySelector';
|
|
9
10
|
import { getProjectList } from '../../projectList/projectListSelector';
|
|
10
11
|
import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
|
|
12
|
+
// Re-exported here for back-compat. New code should import from
|
|
13
|
+
// `view/createTransferEntry/createTransferEntrySelector`.
|
|
14
|
+
export { getLastTransferEntryReplacement } from '../../createTransferEntry/createTransferEntrySelector';
|
|
11
15
|
export function getExpenseAutomationTransactionView(state) {
|
|
12
|
-
const { accountState, classState, classListState, accountListState, expenseAutomationTransactionsViewState, expenseAutomationViewState, projectState, projectListState, transactionState, monthEndCloseChecksState, monthEndCloseChecksViewState, } = state;
|
|
16
|
+
const { accountState, classState, classListState, accountListState, createTransferEntryState, expenseAutomationTransactionsViewState, expenseAutomationViewState, projectState, projectListState, transactionState, monthEndCloseChecksState, monthEndCloseChecksViewState, } = state;
|
|
13
17
|
const { selectedTransactionCategorizationCompletedSubTab, selectedTransactionCategorizationTab, } = expenseAutomationTransactionsViewState;
|
|
14
18
|
const { uiState, refreshStatus, saveStatus, markAsNotMiscategorizedStatus, transactionIdsBySelectedPeriod, transactionReviewLocalDataById, selectedCheckBoxTransactionIds, transactionIdsWithUnsavedData, uploadReceiptStatusById, selectedTransactionId, selectedTransactionLineId, } = expenseAutomationTransactionsViewState.transactionCategorizationView[selectedTransactionCategorizationTab];
|
|
15
19
|
const uncategorizedIncomeExpense = getUncategorizedAccounts(accountState, accountListState, 'accountList');
|
|
@@ -103,6 +107,7 @@ export function getExpenseAutomationTransactionView(state) {
|
|
|
103
107
|
: [];
|
|
104
108
|
const transactionCompletionStatus = allSteps.find((step) => step.step === 'transaction_categorization')?.completionStatus;
|
|
105
109
|
const completionStatus = transactionCompletionStatus ?? 'incomplete';
|
|
110
|
+
const { transferAccountsList, creditCardTransferAccountsList } = getResolvedTransferAccounts(state);
|
|
106
111
|
return {
|
|
107
112
|
version: 0,
|
|
108
113
|
fetchState: fetchStatus.fetchState,
|
|
@@ -123,6 +128,7 @@ export function getExpenseAutomationTransactionView(state) {
|
|
|
123
128
|
refreshStatus,
|
|
124
129
|
saveStatus,
|
|
125
130
|
markAsNotMiscategorizedStatus,
|
|
131
|
+
createTransferEntryStatus: createTransferEntryState.createTransferEntryStatus,
|
|
126
132
|
completionStatus,
|
|
127
133
|
totalCountByTab,
|
|
128
134
|
parentTabTotalCountByTab,
|
|
@@ -130,6 +136,8 @@ export function getExpenseAutomationTransactionView(state) {
|
|
|
130
136
|
uploadReceiptStatusById,
|
|
131
137
|
selectedTransactionId,
|
|
132
138
|
selectedTransactionLineId,
|
|
139
|
+
creditCardTransferAccountsList,
|
|
140
|
+
transferAccounts: transferAccountsList,
|
|
133
141
|
selectedTransactionCategorizationCompletedSubTab,
|
|
134
142
|
};
|
|
135
143
|
}
|
|
@@ -13,12 +13,13 @@ import { fetchAccountList } from '../../accountList/accountListReducer';
|
|
|
13
13
|
import { fetchClassList } from '../../classList/classListReducer';
|
|
14
14
|
import { getInitializedTransactionVendorLocalData } from '../../commonVendorView/transactionVendorView/transactionVendorLocalDataHelper';
|
|
15
15
|
import { updateTransactionVendorLocalData } from '../../commonVendorView/transactionVendorView/transactionVendorViewReducer';
|
|
16
|
+
import { fetchAccountsForTransferFlow } from '../../createTransferEntry/createTransferEntryReducer';
|
|
16
17
|
import { fetchOwnerList } from '../../ownerList/ownerListReducer';
|
|
17
18
|
import { fetchProjectList } from '../../projectList/projectListReducer';
|
|
18
19
|
import { fetchTransactionDetail, initializeTransactionDetailLocalData, removeTransactionDetail, updateTransactionDetailFetchState, } from '../transactionDetailReducer';
|
|
19
20
|
import { getAllLinkedTransactions, getTransactionDetailKey, } from '../transactionDetailState';
|
|
20
21
|
export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchTransactionDetail.match), mergeMap((action) => {
|
|
21
|
-
const { transactionId, cacheOverride } = action.payload;
|
|
22
|
+
const { transactionId, cacheOverride, isCreateTransferEntryFromExpenseEnabled, } = action.payload;
|
|
22
23
|
const detailKey = getTransactionDetailKey(transactionId);
|
|
23
24
|
const transactionActions = [];
|
|
24
25
|
if (cacheOverride === true) {
|
|
@@ -35,6 +36,17 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
|
|
|
35
36
|
accountList.fetchState !== 'In-Progress') {
|
|
36
37
|
transactionActions.push(fetchAccountList('accountList'));
|
|
37
38
|
}
|
|
39
|
+
if (isCreateTransferEntryFromExpenseEnabled === true) {
|
|
40
|
+
const { transferEntryEligible, creditCardOnlyEligible } = state$.value.createTransferEntryState.transferAccountsByType;
|
|
41
|
+
if (transferEntryEligible.fetchState !== 'In-Progress' &&
|
|
42
|
+
transferEntryEligible.fetchState !== 'Completed') {
|
|
43
|
+
transactionActions.push(fetchAccountsForTransferFlow({ kind: 'transferEntryEligible' }));
|
|
44
|
+
}
|
|
45
|
+
if (creditCardOnlyEligible.fetchState !== 'In-Progress' &&
|
|
46
|
+
creditCardOnlyEligible.fetchState !== 'Completed') {
|
|
47
|
+
transactionActions.push(fetchAccountsForTransferFlow({ kind: 'creditCardOnlyEligible' }));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
38
50
|
const classList = state$.value.classListState;
|
|
39
51
|
if (classList.hasValidState() === false &&
|
|
40
52
|
classList.fetchState !== 'In-Progress') {
|
|
@@ -48,7 +60,7 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
|
|
|
48
60
|
transactionActions.push(updateTransactionDetailFetchState(transactionId, 'In-Progress'));
|
|
49
61
|
const query = { transaction_type: transactionId.type };
|
|
50
62
|
const getTransactionDetail$ = zeniAPI
|
|
51
|
-
.getJSON(
|
|
63
|
+
.getJSON(`https://dev.api.zeni.ai/version/accounting/mohanrajoria/1.0/transactions/${transactionId.id}?query=${encodeURIComponent(JSON.stringify(query))}`)
|
|
52
64
|
.pipe(mergeMap((response) => {
|
|
53
65
|
if (isSuccessResponse(response) &&
|
|
54
66
|
response.data?.transaction?.transaction_id != null) {
|
|
@@ -50,11 +50,12 @@ const transactionDetail = createSlice({
|
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
|
-
prepare(transactionId, cacheOverride = false) {
|
|
53
|
+
prepare(transactionId, cacheOverride = false, isCreateTransferEntryFromExpenseEnabled = false) {
|
|
54
54
|
return {
|
|
55
55
|
payload: {
|
|
56
56
|
transactionId,
|
|
57
57
|
cacheOverride,
|
|
58
|
+
isCreateTransferEntryFromExpenseEnabled,
|
|
58
59
|
},
|
|
59
60
|
};
|
|
60
61
|
},
|
|
@@ -8,10 +8,11 @@ import { getVendorsByVendorIds } from '../../entity/vendor/vendorSelector';
|
|
|
8
8
|
import { dateNow } from '../../zeniDayJS';
|
|
9
9
|
import { getAccountList, getNestedAccountListHierarchy, } from '../accountList/accountListSelector';
|
|
10
10
|
import { getClassList, getNestedClassListHierarchy, } from '../classList/classListSelector';
|
|
11
|
+
import { getResolvedTransferAccounts } from '../createTransferEntry/createTransferEntrySelector';
|
|
11
12
|
import { getProjectList, } from '../projectList/projectListSelector';
|
|
12
13
|
import { getAllLinkedTransactions, getTransactionDetailKey, initialSupportedTransactionDetail, } from './transactionDetailState';
|
|
13
14
|
export const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = true) => {
|
|
14
|
-
const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, projectState, projectListState, } = state;
|
|
15
|
+
const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, createTransferEntryState, projectState, projectListState, } = state;
|
|
15
16
|
const detailKey = getTransactionDetailKey(transactionId);
|
|
16
17
|
const transactionDetail = recordGet(transactionDetailState.transactionDetailById, detailKey);
|
|
17
18
|
let fetchState = {
|
|
@@ -78,6 +79,7 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
|
|
|
78
79
|
: [];
|
|
79
80
|
const transactionDetailAnyUpdateStatus = reduceUpdateFetchStates(transactionDetail);
|
|
80
81
|
const vendors = getVendorsByVendorIds(vendorState, vendorListState.vendorIds);
|
|
82
|
+
const { transferAccountsList, creditCardTransferAccountsList } = getResolvedTransferAccounts(state);
|
|
81
83
|
return {
|
|
82
84
|
reportId: 'transaction_detail',
|
|
83
85
|
reportTitle: 'Transaction Detail',
|
|
@@ -94,6 +96,9 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
|
|
|
94
96
|
accountsHierarchyList,
|
|
95
97
|
classList: classList,
|
|
96
98
|
isAccountingClassesEnabled,
|
|
99
|
+
createTransferEntryStatus: createTransferEntryState.createTransferEntryStatus,
|
|
100
|
+
creditCardTransferAccountsList,
|
|
101
|
+
transferAccounts: transferAccountsList,
|
|
97
102
|
isAccountingProjectsEnabled,
|
|
98
103
|
projectList,
|
|
99
104
|
isUpdateNotAllowed: transactionDetail?.isUpdateNotAllowed,
|
package/lib/index.d.ts
CHANGED
|
@@ -260,6 +260,7 @@ import { CompanyOfficerLocalData, CompanyOfficerType, PrimaryContactLocalData }
|
|
|
260
260
|
import { PortfolioUIState } from './view/companyView/types/companyPortfolioViewState';
|
|
261
261
|
import { CompanyView } from './view/companyView/types/companyView';
|
|
262
262
|
import { UserAndRole } from './view/companyView/types/userAndRole';
|
|
263
|
+
import { clearTransferEntryRouteReplacement, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, fetchAccountsForTransferFlow, resetCreateTransferEntryStatus } from './view/createTransferEntry/createTransferEntryReducer';
|
|
263
264
|
import { fetchDashboard, updateTreasuryVideoClosed } from './view/dashboard/dashboardReducer';
|
|
264
265
|
import { DashboardReport, getDashboard } from './view/dashboard/dashboardSelector';
|
|
265
266
|
import { updateDashboardLayout } from './view/dashboardLayout/dashboardLayoutReducer';
|
|
@@ -274,7 +275,7 @@ import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFl
|
|
|
274
275
|
import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryJeSchedule as retryExpenseAutomationJESchedule, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
|
|
275
276
|
import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, searchTransactionsForManualMatch, searchTransactionsForManualMatchFailure, searchTransactionsForManualMatchSuccess, setBulkUploadCompletedSubTab, setBulkUploadResultsTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, storeBatchDetails, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
|
|
276
277
|
import { deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, updateAccountReconciliationLocalData as updateExpenseAutomationAccountReconciliationLocalData, updateSelectedAccountId as updateExpenseAutomationAccountReconciliationSelectedAccountId, updateSelectedTab as updateExpenseAutomationAccountReconciliationSelectedTab, updateReconListScrollPosition as updateExpenseAutomationReconListScrollPosition, updateReviewTabSortState as updateExpenseAutomationReconReviewTabListSortState, updateReviewTabLocalData as updateExpenseAutomationReconReviewTabLocalData, updateReconcileTabListScrollState as updateExpenseAutomationReconcileTabListScrollState, updateReconcileTabListSortState as updateExpenseAutomationReconcileTabListSortState, updateReconcileTabLocalData as updateExpenseAutomationReconcileTabLocalData, updateSelectedDrawerAccountId as updateExpenseAutomationSelectedDrawerAccountId, updateNodeCollapseState, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
|
|
277
|
-
import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
|
|
278
|
+
import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
|
|
278
279
|
import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
|
|
279
280
|
import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
|
|
280
281
|
import { JEAccountSettingsView } from './view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes';
|
|
@@ -286,7 +287,7 @@ import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSel
|
|
|
286
287
|
import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
|
|
287
288
|
import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
|
|
288
289
|
import { getExpenseAutomationReconciliationView, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
|
|
289
|
-
import { getExpenseAutomationTransactionView } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
|
|
290
|
+
import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
|
|
290
291
|
import { CompletedSubTab, DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab } from './view/expenseAutomationView/types/completedSubTab';
|
|
291
292
|
import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey, FluxAnalysisViewUIState, FluxBalancesByMonth } from './view/expenseAutomationView/types/fluxAnalysisViewState';
|
|
292
293
|
import { AccountSettingsLocalData, JEScheduleMainTab as ExpenseAutomationJEScheduleMainTab, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEScheduleLocalData, toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey } from './view/expenseAutomationView/types/jeSchedulesViewState';
|
|
@@ -660,10 +661,10 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
|
|
|
660
661
|
export { ClassesViewSelectorReportV2 };
|
|
661
662
|
export { BalancesTimeseries, TrendTimeseries, BalanceKind };
|
|
662
663
|
export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
|
|
663
|
-
export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, DEFAULT_COMPLETED_SUB_TAB, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
|
|
664
|
+
export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, DEFAULT_COMPLETED_SUB_TAB, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
|
|
664
665
|
export { JEScheduleLocalData };
|
|
665
666
|
export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
|
|
666
|
-
export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
|
|
667
|
+
export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, clearTransferEntryRouteReplacement, fetchAccountsForTransferFlow, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
|
|
667
668
|
export { TopExpense, TopExTimePeriod, TOP_EX_TIME_PERIODS };
|
|
668
669
|
export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsoluteDay, toMonthYearPeriodId, convertToPeriod, MonthYearPeriod, };
|
|
669
670
|
export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorExpenseSelector';
|