@zeniai/client-epic-state 5.1.37-betaRD3 → 5.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +2 -0
- package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
- package/lib/esm/index.js +3 -2
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +5 -3
- package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +2 -3
- package/lib/esm/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +32 -0
- package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +1 -0
- package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +163 -21
- package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +30 -26
- package/lib/esm/view/expenseAutomationView/selectors/statementParseViewSelector.js +295 -0
- package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +5 -24
- package/lib/index.d.ts +4 -3
- package/lib/index.js +44 -38
- package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +4 -2
- package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +2 -3
- package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.d.ts +2 -0
- package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +36 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +1 -0
- package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +14 -1
- package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +165 -23
- package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +10 -2
- package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +30 -26
- package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.d.ts +25 -0
- package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.js +313 -0
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +5 -24
- package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +52 -2
- package/package.json +1 -1
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { date } from '../../../zeniDayJS';
|
|
2
|
+
export const getEffectiveStatementPeriod = (parsedMeta, localMeta) => ({
|
|
3
|
+
statementStartDate: localMeta?.statementStartDate != null && localMeta.statementStartDate !== ''
|
|
4
|
+
? localMeta.statementStartDate
|
|
5
|
+
: parsedMeta.statementStartDate,
|
|
6
|
+
statementEndDate: localMeta?.statementEndDate != null && localMeta.statementEndDate !== ''
|
|
7
|
+
? localMeta.statementEndDate
|
|
8
|
+
: parsedMeta.statementEndDate,
|
|
9
|
+
});
|
|
10
|
+
export const isStatementTransactionInPeriod = (transactionDate, statementStartDate, statementEndDate) => {
|
|
11
|
+
if (statementStartDate === '' ||
|
|
12
|
+
statementEndDate === '' ||
|
|
13
|
+
transactionDate === '') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const txn = date(transactionDate).startOf('day');
|
|
17
|
+
const start = date(statementStartDate).startOf('day');
|
|
18
|
+
const end = date(statementEndDate).startOf('day');
|
|
19
|
+
return txn.isSameOrAfter(start, 'day') && txn.isSameOrBefore(end, 'day');
|
|
20
|
+
};
|
|
21
|
+
export const filterStatementTransactionsByPeriod = (transactions, statementPeriod) => {
|
|
22
|
+
const { statementStartDate, statementEndDate } = statementPeriod;
|
|
23
|
+
if (statementStartDate === '' || statementEndDate === '') {
|
|
24
|
+
return transactions;
|
|
25
|
+
}
|
|
26
|
+
return transactions.filter((transaction) => isStatementTransactionInPeriod(transaction.transactionDate, statementStartDate, statementEndDate));
|
|
27
|
+
};
|
|
28
|
+
export const getParsedStatementDataForView = (parsedStatementData, statementUpdateLocalData) => {
|
|
29
|
+
if (parsedStatementData == null) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
const statementUpload = parsedStatementData.statementUpload;
|
|
33
|
+
if (statementUpload == null) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const parsedMeta = statementUpload.statementMeta;
|
|
37
|
+
const localMeta = statementUpdateLocalData?.statementMeta;
|
|
38
|
+
const effectiveMeta = localMeta ?? parsedMeta;
|
|
39
|
+
const statementPeriod = getEffectiveStatementPeriod(parsedMeta, localMeta);
|
|
40
|
+
return {
|
|
41
|
+
statementUpload: {
|
|
42
|
+
...statementUpload,
|
|
43
|
+
statementMeta: effectiveMeta,
|
|
44
|
+
statementTransactions: filterStatementTransactionsByPeriod(statementUpload.statementTransactions, statementPeriod),
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export const getStatementTransactionPeriodById = (allParsedTransactions, parsedMeta, localMeta) => {
|
|
49
|
+
const statementPeriod = getEffectiveStatementPeriod(parsedMeta, localMeta);
|
|
50
|
+
return Object.fromEntries(allParsedTransactions
|
|
51
|
+
.filter((transaction) => transaction.statementTransactionId !== '')
|
|
52
|
+
.map((transaction) => [
|
|
53
|
+
transaction.statementTransactionId,
|
|
54
|
+
isStatementTransactionInPeriod(transaction.transactionDate, statementPeriod.statementStartDate, statementPeriod.statementEndDate),
|
|
55
|
+
]));
|
|
56
|
+
};
|
|
57
|
+
export const getDateFilteredDeletedTransactionIds = (allParsedTransactions, statementPeriod) => {
|
|
58
|
+
if (statementPeriod.statementStartDate === '' ||
|
|
59
|
+
statementPeriod.statementEndDate === '') {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
return allParsedTransactions
|
|
63
|
+
.filter((transaction) => transaction.statementTransactionId !== '' &&
|
|
64
|
+
!isStatementTransactionInPeriod(transaction.transactionDate, statementPeriod.statementStartDate, statementPeriod.statementEndDate))
|
|
65
|
+
.map((transaction) => transaction.statementTransactionId);
|
|
66
|
+
};
|
|
67
|
+
const roundCurrency = (value) => Math.round(value * 100) / 100;
|
|
68
|
+
const toApiDateString = (value) => {
|
|
69
|
+
if (value == null || value === '') {
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
return date(value).format('YYYY-MM-DD');
|
|
73
|
+
};
|
|
74
|
+
const computeStatementTransactionTotals = (transactions) => {
|
|
75
|
+
const totalDeposits = roundCurrency(transactions
|
|
76
|
+
.filter((txn) => txn.transactionDirection === 'credit')
|
|
77
|
+
.reduce((sum, txn) => sum + Math.abs(txn.amount ?? 0), 0));
|
|
78
|
+
const totalPayments = roundCurrency(transactions
|
|
79
|
+
.filter((txn) => txn.transactionDirection === 'debit')
|
|
80
|
+
.reduce((sum, txn) => sum + Math.abs(txn.amount ?? 0), 0));
|
|
81
|
+
return { totalDeposits, totalPayments };
|
|
82
|
+
};
|
|
83
|
+
const computeStatementClosingBalance = (openingBalance, totalDeposits, totalPayments) => roundCurrency(openingBalance + totalDeposits - totalPayments);
|
|
84
|
+
const filterFormTransactionsInPeriod = (transactions, statementStartDate, statementEndDate) => {
|
|
85
|
+
if (statementStartDate === '' || statementEndDate === '') {
|
|
86
|
+
return transactions;
|
|
87
|
+
}
|
|
88
|
+
const periodStart = date(statementStartDate).startOf('day');
|
|
89
|
+
const periodEnd = date(statementEndDate).startOf('day');
|
|
90
|
+
return transactions.filter((txn) => {
|
|
91
|
+
if (txn.transactionDate === '') {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
const txnDate = date(txn.transactionDate).startOf('day');
|
|
95
|
+
return (txnDate.isSameOrAfter(periodStart, 'day') &&
|
|
96
|
+
txnDate.isSameOrBefore(periodEnd, 'day'));
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
export const isStatementParseTransactionFieldChange = (changedField) => changedField === 'transactions' ||
|
|
100
|
+
changedField?.startsWith('transactions.') === true;
|
|
101
|
+
const isStatementParseBalanceAffectingTransactionFieldChange = (changedField) => {
|
|
102
|
+
if (changedField === 'transactions') {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
if (changedField?.startsWith('transactions.') !== true) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return !changedField.endsWith('.transactionMemo');
|
|
109
|
+
};
|
|
110
|
+
export const isStatementParseManualBalanceField = (field) => field === 'totalDeposits' ||
|
|
111
|
+
field === 'totalPayments' ||
|
|
112
|
+
field === 'closingBalance';
|
|
113
|
+
export const shouldRecalculateStatementParseBalances = (changedField) => isStatementParseBalanceAffectingTransactionFieldChange(changedField) ||
|
|
114
|
+
changedField === 'statementStartDate' ||
|
|
115
|
+
changedField === 'statementEndDate';
|
|
116
|
+
export const resolveStatementParseBalanceFields = (formView, changedField) => {
|
|
117
|
+
const inPeriodTransactions = filterFormTransactionsInPeriod(formView.transactions, formView.statementStartDate, formView.statementEndDate);
|
|
118
|
+
const { totalDeposits, totalPayments } = computeStatementTransactionTotals(inPeriodTransactions);
|
|
119
|
+
if (!shouldRecalculateStatementParseBalances(changedField)) {
|
|
120
|
+
return {
|
|
121
|
+
openingBalance: formView.openingBalance,
|
|
122
|
+
closingBalance: formView.closingBalance,
|
|
123
|
+
totalDeposits: formView.totalDeposits,
|
|
124
|
+
totalPayments: formView.totalPayments,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
openingBalance: formView.openingBalance,
|
|
129
|
+
totalDeposits,
|
|
130
|
+
totalPayments,
|
|
131
|
+
closingBalance: computeStatementClosingBalance(formView.openingBalance, totalDeposits, totalPayments),
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
export const areStatementParseBalancesConsistent = (formView) => {
|
|
135
|
+
const { totalDeposits, totalPayments } = computeStatementTransactionTotals(filterFormTransactionsInPeriod(formView.transactions, formView.statementStartDate, formView.statementEndDate));
|
|
136
|
+
return (roundCurrency(formView.closingBalance) ===
|
|
137
|
+
computeStatementClosingBalance(formView.openingBalance, totalDeposits, totalPayments));
|
|
138
|
+
};
|
|
139
|
+
const mapParsedTransactionToFormRow = (transaction, index) => ({
|
|
140
|
+
id: transaction.statementTransactionId || `parsed-${index}`,
|
|
141
|
+
transactionDate: toApiDateString(transaction.transactionDate),
|
|
142
|
+
transactionMemo: transaction.transactionMemo,
|
|
143
|
+
amount: transaction.amount,
|
|
144
|
+
transactionDirection: transaction.transactionDirection,
|
|
145
|
+
statementTransactionId: transaction.statementTransactionId,
|
|
146
|
+
});
|
|
147
|
+
const mapLocalTransactionToFormRow = (transaction, id) => ({
|
|
148
|
+
id,
|
|
149
|
+
transactionDate: toApiDateString(transaction.transactionDate),
|
|
150
|
+
transactionMemo: transaction.transactionMemo,
|
|
151
|
+
amount: transaction.amount,
|
|
152
|
+
transactionDirection: transaction.transactionDirection,
|
|
153
|
+
statementTransactionId: transaction.statementTransactionId,
|
|
154
|
+
});
|
|
155
|
+
const buildStatementParseFormTransactions = (originalTransactions, localData) => {
|
|
156
|
+
const deletedIdSet = new Set(localData.statementTransactions?.deletedIds ?? []);
|
|
157
|
+
const updatedById = new Map((localData.statementTransactions?.updated ?? [])
|
|
158
|
+
.filter((transaction) => transaction.statementTransactionId != null)
|
|
159
|
+
.map((transaction) => [
|
|
160
|
+
transaction.statementTransactionId,
|
|
161
|
+
transaction,
|
|
162
|
+
]));
|
|
163
|
+
const persistedTransactions = originalTransactions
|
|
164
|
+
.filter((transaction) => !deletedIdSet.has(transaction.statementTransactionId))
|
|
165
|
+
.map((transaction, index) => {
|
|
166
|
+
const updated = updatedById.get(transaction.statementTransactionId);
|
|
167
|
+
return updated != null
|
|
168
|
+
? mapLocalTransactionToFormRow(updated, transaction.statementTransactionId)
|
|
169
|
+
: mapParsedTransactionToFormRow(transaction, index);
|
|
170
|
+
});
|
|
171
|
+
const addedTransactions = (localData.statementTransactions?.added ?? []).map((transaction, index) => mapLocalTransactionToFormRow(transaction, `added-${index}`));
|
|
172
|
+
return [...persistedTransactions, ...addedTransactions];
|
|
173
|
+
};
|
|
174
|
+
export const mergeStatementParseDeletedTransactionIds = (originalTransactions, statementPeriod, currentTransactionIds) => {
|
|
175
|
+
const dateFilteredDeletedIds = getDateFilteredDeletedTransactionIds(originalTransactions, statementPeriod);
|
|
176
|
+
const dateFilteredDeletedIdSet = new Set(dateFilteredDeletedIds);
|
|
177
|
+
const userDeletedIds = originalTransactions
|
|
178
|
+
.filter((transaction) => transaction.statementTransactionId !== '' &&
|
|
179
|
+
!currentTransactionIds.has(transaction.statementTransactionId) &&
|
|
180
|
+
!dateFilteredDeletedIdSet.has(transaction.statementTransactionId))
|
|
181
|
+
.map((transaction) => transaction.statementTransactionId);
|
|
182
|
+
return [...new Set([...userDeletedIds, ...dateFilteredDeletedIds])];
|
|
183
|
+
};
|
|
184
|
+
const resolveStatementMetaDates = (parsedStatementMeta, localMeta) => ({
|
|
185
|
+
statementStartDate: localMeta?.statementStartDate != null && localMeta.statementStartDate !== ''
|
|
186
|
+
? localMeta.statementStartDate
|
|
187
|
+
: (parsedStatementMeta?.statementStartDate ?? ''),
|
|
188
|
+
statementEndDate: localMeta?.statementEndDate != null && localMeta.statementEndDate !== ''
|
|
189
|
+
? localMeta.statementEndDate
|
|
190
|
+
: (parsedStatementMeta?.statementEndDate ?? ''),
|
|
191
|
+
});
|
|
192
|
+
export const getStatementParseFormView = ({ parsedStatementMeta, originalTransactions, statementUpdateLocalData, }) => {
|
|
193
|
+
const transactions = statementUpdateLocalData != null
|
|
194
|
+
? buildStatementParseFormTransactions(originalTransactions, statementUpdateLocalData)
|
|
195
|
+
: originalTransactions.map(mapParsedTransactionToFormRow);
|
|
196
|
+
const localMeta = statementUpdateLocalData?.statementMeta;
|
|
197
|
+
const { statementStartDate, statementEndDate } = resolveStatementMetaDates(parsedStatementMeta, localMeta);
|
|
198
|
+
const { totalDeposits, totalPayments } = computeStatementTransactionTotals(filterFormTransactionsInPeriod(transactions, statementStartDate, statementEndDate));
|
|
199
|
+
const openingBalance = localMeta?.openingBalance ?? parsedStatementMeta?.openingBalance ?? 0;
|
|
200
|
+
const computedClosingBalance = computeStatementClosingBalance(openingBalance, totalDeposits, totalPayments);
|
|
201
|
+
return {
|
|
202
|
+
statementStartDate,
|
|
203
|
+
statementEndDate,
|
|
204
|
+
openingBalance,
|
|
205
|
+
closingBalance: localMeta?.closingBalance ?? computedClosingBalance,
|
|
206
|
+
totalDeposits: localMeta?.totalDeposits ?? totalDeposits,
|
|
207
|
+
totalPayments: localMeta?.totalPayments ?? totalPayments,
|
|
208
|
+
transactions: filterFormTransactionsInPeriod(transactions, statementStartDate, statementEndDate),
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
export const toStatementUpdateLocalDataFromFormView = ({ formView, parsedStatementMeta, originalTransactions, changedField, }) => {
|
|
212
|
+
const balanceFields = resolveStatementParseBalanceFields(formView, changedField);
|
|
213
|
+
const currentTransactionIds = new Set(formView.transactions
|
|
214
|
+
.map((transaction) => transaction.statementTransactionId)
|
|
215
|
+
.filter((id) => id != null && id !== ''));
|
|
216
|
+
const added = [];
|
|
217
|
+
const updated = [];
|
|
218
|
+
formView.transactions.forEach((transaction) => {
|
|
219
|
+
const transactionDate = toApiDateString(transaction.transactionDate);
|
|
220
|
+
if (transaction.statementTransactionId == null) {
|
|
221
|
+
if (transaction.transactionDirection != null) {
|
|
222
|
+
added.push({
|
|
223
|
+
amount: transaction.amount,
|
|
224
|
+
transactionDate,
|
|
225
|
+
transactionDirection: transaction.transactionDirection,
|
|
226
|
+
transactionMemo: transaction.transactionMemo,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const original = originalTransactions.find((candidate) => candidate.statementTransactionId === transaction.statementTransactionId);
|
|
232
|
+
if (original != null &&
|
|
233
|
+
(original.amount !== transaction.amount ||
|
|
234
|
+
toApiDateString(original.transactionDate) !== transactionDate ||
|
|
235
|
+
original.transactionMemo !== transaction.transactionMemo)) {
|
|
236
|
+
updated.push({
|
|
237
|
+
amount: transaction.amount,
|
|
238
|
+
transactionDate,
|
|
239
|
+
transactionDirection: transaction.transactionDirection,
|
|
240
|
+
transactionMemo: transaction.transactionMemo,
|
|
241
|
+
statementTransactionId: transaction.statementTransactionId,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
const statementPeriod = {
|
|
246
|
+
statementStartDate: toApiDateString(formView.statementStartDate),
|
|
247
|
+
statementEndDate: toApiDateString(formView.statementEndDate),
|
|
248
|
+
};
|
|
249
|
+
const deletedIds = mergeStatementParseDeletedTransactionIds(originalTransactions, statementPeriod, currentTransactionIds);
|
|
250
|
+
const deletedIdSet = new Set(deletedIds);
|
|
251
|
+
const inPeriodAdded = filterFormTransactionsInPeriod(added, statementPeriod.statementStartDate, statementPeriod.statementEndDate);
|
|
252
|
+
const inPeriodUpdated = updated.filter((transaction) => transaction.statementTransactionId != null &&
|
|
253
|
+
!deletedIdSet.has(transaction.statementTransactionId));
|
|
254
|
+
return {
|
|
255
|
+
statementMeta: {
|
|
256
|
+
closingBalance: balanceFields.closingBalance,
|
|
257
|
+
openingBalance: balanceFields.openingBalance,
|
|
258
|
+
statementDataStatus: parsedStatementMeta?.statementDataStatus ?? {
|
|
259
|
+
code: '',
|
|
260
|
+
label: '',
|
|
261
|
+
},
|
|
262
|
+
statementEndDate: statementPeriod.statementEndDate,
|
|
263
|
+
statementStartDate: statementPeriod.statementStartDate,
|
|
264
|
+
statementStatus: parsedStatementMeta?.statementStatus ?? {
|
|
265
|
+
code: '',
|
|
266
|
+
label: '',
|
|
267
|
+
},
|
|
268
|
+
statementUploadId: parsedStatementMeta?.statementUploadId ?? '',
|
|
269
|
+
totalDeposits: balanceFields.totalDeposits,
|
|
270
|
+
totalPayments: balanceFields.totalPayments,
|
|
271
|
+
},
|
|
272
|
+
statementTransactions: {
|
|
273
|
+
added: inPeriodAdded,
|
|
274
|
+
deletedIds,
|
|
275
|
+
updated: inPeriodUpdated,
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
};
|
|
279
|
+
export const applyStatementParseFormChange = ({ formView, changedField, parsedStatementMeta, originalTransactions, }) => {
|
|
280
|
+
const balanceFields = resolveStatementParseBalanceFields(formView, changedField);
|
|
281
|
+
const shouldRecalculate = shouldRecalculateStatementParseBalances(changedField);
|
|
282
|
+
const mergedFormView = shouldRecalculate
|
|
283
|
+
? { ...formView, ...balanceFields }
|
|
284
|
+
: formView;
|
|
285
|
+
return {
|
|
286
|
+
didRecalculateBalances: shouldRecalculate,
|
|
287
|
+
formView: mergedFormView,
|
|
288
|
+
localData: toStatementUpdateLocalDataFromFormView({
|
|
289
|
+
formView: mergedFormView,
|
|
290
|
+
parsedStatementMeta,
|
|
291
|
+
originalTransactions,
|
|
292
|
+
changedField,
|
|
293
|
+
}),
|
|
294
|
+
};
|
|
295
|
+
};
|
|
@@ -188,28 +188,15 @@ export function getExpenseAutomationTransactionView(state) {
|
|
|
188
188
|
};
|
|
189
189
|
// Parent-tab badge counts. Sourced from `parent_tab_total_count` in the
|
|
190
190
|
// listing response and used exclusively by the navbar / tab strip badges.
|
|
191
|
-
//
|
|
192
|
-
//
|
|
193
|
-
const autoCatTabView = expenseAutomationTransactionsViewState.transactionCategorizationView
|
|
194
|
-
.autoCategorized;
|
|
195
|
-
const reviewTabView = expenseAutomationTransactionsViewState.transactionCategorizationView.review;
|
|
196
|
-
const autoCatSubTabCache = expenseAutomationTransactionsViewState.autoCategorizedSubTabCache;
|
|
197
|
-
const autoCatFilterActive = autoCatTabView.uiState.searchString !== '' ||
|
|
198
|
-
autoCatTabView.filters.categories.length > 0;
|
|
199
|
-
const reviewFilterActive = reviewTabView.uiState.searchString !== '' ||
|
|
200
|
-
reviewTabView.filters.categories.length > 0;
|
|
191
|
+
// Independent of which Completed sub-tab is active so the badge stays
|
|
192
|
+
// stable across sub-tab switches.
|
|
201
193
|
const parentTotalCountByTab = expenseAutomationTransactionsViewState.parentTotalCountByTab;
|
|
202
194
|
const parentTabTotalCountByTab = {
|
|
203
195
|
review: monthYearPeriodId != null
|
|
204
|
-
?
|
|
205
|
-
? totalCountByReview[monthYearPeriodId]
|
|
206
|
-
: (parentTotalCountByTab.review[monthYearPeriodId] ?? 0)
|
|
196
|
+
? (parentTotalCountByTab.review[monthYearPeriodId] ?? 0)
|
|
207
197
|
: 0,
|
|
208
198
|
autoCategorized: monthYearPeriodId != null
|
|
209
|
-
?
|
|
210
|
-
? (autoCatSubTabCache['all']?.totalCount[monthYearPeriodId] ??
|
|
211
|
-
totalCountByAutoCat[monthYearPeriodId])
|
|
212
|
-
: (parentTotalCountByTab.autoCategorized[monthYearPeriodId] ?? 0)
|
|
199
|
+
? (parentTotalCountByTab.autoCategorized[monthYearPeriodId] ?? 0)
|
|
213
200
|
: 0,
|
|
214
201
|
};
|
|
215
202
|
const fetchStateByTab = {
|
|
@@ -252,13 +239,7 @@ export function getExpenseAutomationTransactionView(state) {
|
|
|
252
239
|
isAccountingProjectsEnabled,
|
|
253
240
|
projectList,
|
|
254
241
|
transactionLocalData: filteredTransactionLocalData,
|
|
255
|
-
|
|
256
|
-
// misleading — the server has more pages but the filter already reduces
|
|
257
|
-
// what's visible. Masking pageToken here prevents the skeleton "loading"
|
|
258
|
-
// row from appearing when the user is looking at a filtered result set.
|
|
259
|
-
uiState: filters.categories.length > 0
|
|
260
|
-
? { ...uiState, pageToken: null }
|
|
261
|
-
: uiState,
|
|
242
|
+
uiState,
|
|
262
243
|
refreshStatus,
|
|
263
244
|
saveStatus,
|
|
264
245
|
markAsNotMiscategorizedStatus,
|
package/lib/index.d.ts
CHANGED
|
@@ -279,7 +279,7 @@ import { UploadStatementDocumentAIPayload, UploadStatementDocumentAIResponse } f
|
|
|
279
279
|
import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
|
|
280
280
|
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';
|
|
281
281
|
import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearBulkUploadBatchDetailsForScopeChange, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markBatchDetailRefreshAttempted, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, refreshBatchDetailsForBatchId, 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';
|
|
282
|
-
import { clearStatementDateConflict, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, submitStatementUpdate, 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, updateParsedStatementData, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
|
|
282
|
+
import { clearStatementDateConflict, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, setStatementProcessingDismissedToBackground, submitStatementUpdate, 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, updateParsedStatementData, updateStatementProcessingBackgroundCompletedSteps, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
|
|
283
283
|
import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markCategoryClassRecommendationsFailureForCategorization, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, updateTransactionFilters, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
|
|
284
284
|
import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
|
|
285
285
|
import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
|
|
@@ -292,6 +292,7 @@ import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSel
|
|
|
292
292
|
import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
|
|
293
293
|
import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
|
|
294
294
|
import { getExpenseAutomationReconciliationView, getReparseStatementStatusByAccountId, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
|
|
295
|
+
import { applyStatementParseFormChange, areStatementParseBalancesConsistent, getStatementParseFormView } from './view/expenseAutomationView/selectors/statementParseViewSelector';
|
|
295
296
|
import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
|
|
296
297
|
import { TRANSACTION_FILTER_CATEGORIES, TransactionFilterAmountMatchingOperator, TransactionFilterCategory, TransactionFilterCategoryDropdownOption, TransactionFilterCategoryField, TransactionFilterEntityType, TransactionFilters, applyTransactionFilters } from './view/expenseAutomationView/transactionFilterHelpers';
|
|
297
298
|
import { CompletedSubTab, DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab } from './view/expenseAutomationView/types/completedSubTab';
|
|
@@ -299,7 +300,7 @@ import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey,
|
|
|
299
300
|
import { AccountSettingsLocalData, JEScheduleMainTab as ExpenseAutomationJEScheduleMainTab, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEScheduleLocalData, toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey } from './view/expenseAutomationView/types/jeSchedulesViewState';
|
|
300
301
|
import { BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, MatchCandidate, MatchSource, MissingReceiptsTab, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toMatchSource, toMissingReceiptsTab } from './view/expenseAutomationView/types/missingReceiptsViewState';
|
|
301
302
|
import { MissingReceiptsSortKey as ExpenseAutomationMissingReceiptsSortKey, MissingReceiptsViewState as ExpenseAutomationMissingReceiptsViewState, MissingReceiptsViewUIState as ExpenseAutomationMissingReceiptsViewUIState, toMissingReceiptsSortKey as toExpenseAutomationMissingReceiptsSortKey } from './view/expenseAutomationView/types/missingReceiptsViewState';
|
|
302
|
-
import { AccountReconciliationLocalData, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, StatementDateConflict, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, StatementUpdateLocalData, toReconciliationTabsType } from './view/expenseAutomationView/types/reconciliationViewState';
|
|
303
|
+
import { AccountReconciliationLocalData, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, StatementDateConflict, StatementMeta, StatementParseFormView, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, StatementUpdateLocalData, toReconciliationTabsType } from './view/expenseAutomationView/types/reconciliationViewState';
|
|
303
304
|
import { TransactionsTab as ExpenseAutomationTransactionsTab, TransactionsViewState as ExpenseAutomationTransactionsViewState, TransactionsViewUIState as ExpenseAutomationTransactionsViewUIState, SupportedTransactionCategorization, TransactionCategorizationLineItemData, TransactionReviewLocalData, TransactionsSortKey, TransactionsTab, toTransactionsTabKey as toExpenseAutomationTransactionsTabKey, toTransactionsSortKey } from './view/expenseAutomationView/types/transactionsViewState';
|
|
304
305
|
import { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature } from './view/featureNotificationView/featureNotificationViewReducer';
|
|
305
306
|
import { getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered } from './view/featureNotificationView/featureNotificationViewSelector';
|
|
@@ -674,7 +675,7 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
|
|
|
674
675
|
export { ClassesViewSelectorReportV2 };
|
|
675
676
|
export { BalancesTimeseries, TrendTimeseries, BalanceKind };
|
|
676
677
|
export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, MonthCloseCheckProgressJson, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
|
|
677
|
-
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, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, 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, getReparseStatementStatusByAccountId, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitStatementUpdate, clearStatementDateConflict, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, ParsedStatementData, StatementUpdateLocalData, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
|
|
678
|
+
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, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, 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, getReparseStatementStatusByAccountId, applyStatementParseFormChange, areStatementParseBalancesConsistent, getStatementParseFormView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitStatementUpdate, clearStatementDateConflict, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, ParsedStatementData, StatementUpdateLocalData, StatementParseFormView, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
|
|
678
679
|
export { JEScheduleLocalData };
|
|
679
680
|
export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
|
|
680
681
|
export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateTransactionFilters, updateSelectedCheckboxTransactionIds, markCategoryClassRecommendationsFailureForCategorization, 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, };
|