@zeniai/client-epic-state 5.0.44-betaML1 → 5.0.44-betaRD1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
  2. package/lib/commonStateTypes/viewAndReport/viewAndReport.js +1 -0
  3. package/lib/entity/account/accountState.d.ts +1 -1
  4. package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
  5. package/lib/entity/class/classReducer.d.ts +4 -4
  6. package/lib/entity/class/classState.d.ts +1 -1
  7. package/lib/entity/forecast/forecastState.d.ts +1 -1
  8. package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
  9. package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
  10. package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
  11. package/lib/entity/sectionProjectView/sectionProjectView.d.ts +1 -1
  12. package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +2 -2
  13. package/lib/entity/transaction/stateTypes/transactionType.d.ts +0 -1
  14. package/lib/entity/transaction/stateTypes/transactionType.js +1 -3
  15. package/lib/epic.d.ts +3 -1
  16. package/lib/epic.js +3 -1
  17. package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +1 -0
  18. package/lib/esm/entity/transaction/stateTypes/transactionType.js +0 -1
  19. package/lib/esm/epic.js +3 -1
  20. package/lib/esm/index.js +6 -5
  21. package/lib/esm/view/transactionList/fetchTransactionListByProjectEpic.js +45 -0
  22. package/lib/esm/view/transactionList/parallelFetchProjectTransactionListEpic.js +32 -0
  23. package/lib/esm/view/transactionList/transactionListByProjectSelector.js +58 -0
  24. package/lib/esm/view/transactionList/transactionListReducer.js +83 -2
  25. package/lib/esm/view/transactionList/transactionListState.js +10 -0
  26. package/lib/index.d.ts +6 -5
  27. package/lib/index.js +30 -25
  28. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  29. package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
  30. package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
  31. package/lib/view/cardBalance/cardBalanceSelector.d.ts +1 -1
  32. package/lib/view/cashBalance/cashBalanceSelector.d.ts +1 -1
  33. package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
  34. package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
  35. package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
  36. package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
  37. package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
  38. package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
  39. package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
  40. package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
  41. package/lib/view/topEx/topExSelector.d.ts +1 -1
  42. package/lib/view/transactionList/fetchTransactionListByProjectEpic.d.ts +8 -0
  43. package/lib/view/transactionList/fetchTransactionListByProjectEpic.js +52 -0
  44. package/lib/view/transactionList/parallelFetchProjectTransactionListEpic.d.ts +6 -0
  45. package/lib/view/transactionList/parallelFetchProjectTransactionListEpic.js +36 -0
  46. package/lib/view/transactionList/transactionListByProjectSelector.d.ts +22 -0
  47. package/lib/view/transactionList/transactionListByProjectSelector.js +66 -0
  48. package/lib/view/transactionList/transactionListPayload.d.ts +15 -0
  49. package/lib/view/transactionList/transactionListReducer.d.ts +25 -2
  50. package/lib/view/transactionList/transactionListReducer.js +83 -2
  51. package/lib/view/transactionList/transactionListState.d.ts +15 -0
  52. package/lib/view/transactionList/transactionListState.js +13 -1
  53. package/package.json +1 -1
package/lib/esm/index.js CHANGED
@@ -67,7 +67,7 @@ import { mapFileEntityToAttachment, toContentType, toContentTypeStrict, } from '
67
67
  import { isCustomerTransaction, } from './entity/transaction/stateTypes/customerTransaction';
68
68
  import { isTransferTransaction, } from './entity/transaction/stateTypes/otherTransaction';
69
69
  import { toPlatformLineDetailType, } from './entity/transaction/stateTypes/transactionLine';
70
- import { isJournalEntryTransactionType, toTransactionCategory, toTransactionType, toTransactionTypeStrict, } from './entity/transaction/stateTypes/transactionType';
70
+ import { toTransactionCategory, toTransactionType, toTransactionTypeStrict, } from './entity/transaction/stateTypes/transactionType';
71
71
  import { isVendorTransaction, isVendorTransactionWithCustomer, } from './entity/transaction/stateTypes/vendorTransaction';
72
72
  import { getSupportedTransactionById } from './entity/transaction/transactionSelector';
73
73
  import { getUserRoleByUserId, getUserRoleByUserIds, } from './entity/userRole/userRoleSelector';
@@ -381,8 +381,9 @@ import { getThirdPartyIdFromTransactionId, } from './view/transactionDetail/tran
381
381
  import { getTransactionListByAccount, getTransactionListUIStateByAccountKey, } from './view/transactionList/transactionListByAccountSelector';
382
382
  import { getTransactionListUIStateByCategoryType, getTransactionsListByCategoryType, } from './view/transactionList/transactionListByCategoryTypeSelector';
383
383
  import { getTransactionListByClass, getTransactionListUIStateByClassKey, } from './view/transactionList/transactionListByClassSelector';
384
+ import { getTransactionListByProject, getTransactionListUIStateByProjectKey, } from './view/transactionList/transactionListByProjectSelector';
384
385
  import { getTransactionListByEntity, getTransactionListByEntityForSinglePeriod, } from './view/transactionList/transactionListByEntitySelector';
385
- import { clearTransactionList, fetchAccountTransactionList, fetchEntityTransactionList, parallelFetchAccountTransactionList, parallelFetchClassTransactionList, parallelFetchEntityTransactionList, parallelFetchTransactionListByCategoryType, updateLatestTransactionId, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListUIStateByCategoryType, } from './view/transactionList/transactionListReducer';
386
+ import { clearTransactionList, fetchAccountTransactionList, fetchEntityTransactionList, parallelFetchAccountTransactionList, parallelFetchClassTransactionList, parallelFetchProjectTransactionList, parallelFetchEntityTransactionList, parallelFetchTransactionListByCategoryType, updateLatestTransactionId, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByProject, updateTransactionListByProjectUIState, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListUIStateByCategoryType, } from './view/transactionList/transactionListReducer';
386
387
  import { clearTrendData, fetchExpenseTrend, fetchIncomeTrend, } from './view/trend/trendReducer';
387
388
  import { getCurrentFiscalQuarterDateRange, getTrendForEntity, } from './view/trend/trendSelector';
388
389
  import { clearTrendWithTransactions, fetchTransactionsForEntity, fetchTrendForEntity, updateSelectedTimeperiod, } from './view/trendWithTransactions/trendWithTransactionsReducer';
@@ -486,17 +487,17 @@ export { defaultCustomerCurrency };
486
487
  export { isCustomerTransaction };
487
488
  export { toTransactionID, } from './entity/transaction/payloadTypes/transactionIDPayload';
488
489
  export { toPlatformLineDetailType, };
489
- export { toTransactionType, toTransactionTypeStrict, toTransactionCategory, isJournalEntryTransactionType, };
490
+ export { toTransactionType, toTransactionTypeStrict, toTransactionCategory, };
490
491
  export { defaultVendorCurrency, updateVendors };
491
492
  export { isVendorTransaction, isVendorTransactionWithCustomer, };
492
493
  export { isTransferTransaction };
493
494
  export { getSupportedTransactionById, };
494
- export { clearTransactionList, updateLatestTransactionId, parallelFetchAccountTransactionList, parallelFetchEntityTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, updateTransactionListByClassUIState, updateTransactionListByClass, updateTransactionListUIStateByCategoryType, parallelFetchTransactionListByCategoryType, };
495
+ export { clearTransactionList, updateLatestTransactionId, parallelFetchAccountTransactionList, parallelFetchEntityTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, updateTransactionListByClassUIState, updateTransactionListByClass, parallelFetchProjectTransactionList, updateTransactionListByProjectUIState, updateTransactionListByProject, updateTransactionListUIStateByCategoryType, parallelFetchTransactionListByCategoryType, };
495
496
  export { getTransactionListByAccount, getTransactionListUIStateByAccountKey, };
496
497
  export { fetchEntityTransactionList, updateTransactionListByEntity, saveTransactionDetailLocalData, clearTransactionDetailSaveStatus, updateTransactionListByEntityFailure, resetLineItemsCategoryClassInLocalData, setAllLineItemsToCategoryClassInLocalData, saveTransactionDetail, setAllLineItemsLocalDataIsUpdateAllChecked, initializeTransactionDetailLocalData, removeEntityRecommendationForLineIdForTransactionDetail, updateSelectedVendor, updateSelectedCustomer, resetSelectedCustomer, resetVendor, updateLocalDataWithTransactionsUpdateWithVendorCheckbox, updateVendorToAllLineItems, resetAllLineItemsToVendor, updateLatestSelectedEntity, updateVendorBulkRecommendationsFetchStatus, setIsVendorUpdateAllChecked, };
497
498
  export { downloadAccountingProviderAttachment, downloadAccountingProviderAttachmentSuccess, downloadAccountingProviderAttachmentFailure, fetchTransactionDetail, updateTransactionDetail, uploadMissingAttachmentSuccess, deleteTransactionAttachment, getThirdPartyIdFromTransactionId, };
498
499
  export { getTransactionListByEntity };
499
- export { getTransactionListByClass, getTransactionListUIStateByClassKey, getTransactionListByEntityForSinglePeriod, };
500
+ export { getTransactionListByClass, getTransactionListUIStateByClassKey, getTransactionListByProject, getTransactionListUIStateByProjectKey, getTransactionListByEntityForSinglePeriod, };
500
501
  export { getTransactionDetail, getTransactionDetailForTransaction, getInitialUpdatablePeriodsForTransactionRecommendations as getUpdatablePeriodsForTransactionRecommendations, };
501
502
  export { getInsights, fetchInsightsCard, updateSelectedInsightIndex, };
502
503
  export { fetchForecastList } from './view/forecastList/forecastListReducer';
@@ -0,0 +1,45 @@
1
+ import { toBase64 } from 'js-base64';
2
+ import lodashGet from 'lodash/get';
3
+ import { from, of } from 'rxjs';
4
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
5
+ import { toString } from '../../commonStateTypes/timePeriod';
6
+ import { updateTransactions } from '../../entity/transaction/transactionReducer';
7
+ import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
8
+ import { fetchProjectTransactionList, updateTransactionListByProject, updateTransactionListByProjectFailure, } from './transactionListReducer';
9
+ import { getProjectAcTranKey } from './transactionListState';
10
+ export const fetchTransactionListByProjectEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchProjectTransactionList.match), mergeMap((action) => {
11
+ const state = state$.value;
12
+ const key = getProjectAcTranKey(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period);
13
+ const projectTransactions = lodashGet(state.transactionListState.byProject.transactionListByProjectKey, key, undefined);
14
+ if (action.payload.cacheOverride === true ||
15
+ projectTransactions == null ||
16
+ projectTransactions.hasValidState() === false) {
17
+ const queryParam = {
18
+ start_date: toString(action.payload.period.start),
19
+ end_date: toString(action.payload.period.end),
20
+ sort_by: 'create_time',
21
+ sort_order: 'desc',
22
+ account_id: action.payload.accountId,
23
+ account_type: action.payload.accountType,
24
+ zeni_project_id: action.payload.projectId,
25
+ };
26
+ const base64AccountId = toBase64(action.payload.accountId);
27
+ return zeniAPI
28
+ .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accounts/${base64AccountId}/transactions?query=${encodeURIComponent(JSON.stringify(queryParam))}`)
29
+ .pipe(mergeMap((response) => {
30
+ if (isSuccessResponse(response) && response.data != null) {
31
+ const updateActions = [];
32
+ updateActions.push(updateTransactions(response.data.account.transactions, (value) => value.transaction_id));
33
+ updateActions.push(updateTransactionListByProject(response.data));
34
+ return from(updateActions);
35
+ }
36
+ else {
37
+ return of(updateTransactionListByProjectFailure(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period, response.status));
38
+ }
39
+ }), catchError((error) => of(updateTransactionListByProjectFailure(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period, createZeniAPIStatus('Unexpected Error', 'fetch transaction list REST API call errored out' +
40
+ JSON.stringify(error))))));
41
+ }
42
+ else {
43
+ return from([]);
44
+ }
45
+ }));
@@ -0,0 +1,32 @@
1
+ import { from } from 'rxjs';
2
+ import { filter, mergeMap } from 'rxjs/operators';
3
+ import { splitPeriod } from './parallelFetchClassTransactionListEpic';
4
+ import { fetchProjectTransactionList, parallelFetchProjectTransactionList, } from './transactionListReducer';
5
+ import { getProjectAcTranKey, } from './transactionListState';
6
+ export const parallelFetchProjectTransactionListEpic = (actions$, state$) => actions$.pipe(filter(parallelFetchProjectTransactionList.match), mergeMap((action) => {
7
+ const state = state$.value.transactionListState;
8
+ const timePeriods = splitPeriod(action.payload.period);
9
+ const filteredTimePeriods = timePeriods.filter((value) => {
10
+ if (action.payload.cacheOverride === false) {
11
+ return (isDataAvailableOrFetching(state.byProject, action.payload.accountId, action.payload.accountType, action.payload.projectId, value) === false);
12
+ }
13
+ else {
14
+ return true;
15
+ }
16
+ });
17
+ if (filteredTimePeriods.length > 12) {
18
+ console.error('Only maximum 12 parallel fetch are allowed!');
19
+ return from([]);
20
+ }
21
+ else {
22
+ const fetchActions = filteredTimePeriods.map((period) => fetchProjectTransactionList(action.payload.accountId, action.payload.accountType, action.payload.projectId, period, true));
23
+ return from(fetchActions);
24
+ }
25
+ }));
26
+ function isDataAvailableOrFetching(state, accountId, accountType, projectId, period) {
27
+ const key = getProjectAcTranKey(accountId, accountType, projectId, period);
28
+ const projectTransactions = state.transactionListByProjectKey[key];
29
+ return (projectTransactions != null &&
30
+ (projectTransactions.fetchState === 'In-Progress' ||
31
+ projectTransactions.hasValidState()));
32
+ }
@@ -0,0 +1,58 @@
1
+ import flatMap from 'lodash/flatMap';
2
+ import recordGet from 'lodash/get';
3
+ import orderBy from 'lodash/orderBy';
4
+ import { getSupportedTransactionById } from '../../entity/transaction/transactionSelector';
5
+ import { splitPeriod } from './parallelFetchAccountTransactionListEpic';
6
+ import { isAnyFetchCompleted, reduceFetchState, } from './reduceTransactionListFetchState';
7
+ import { getProjectAcKey, getProjectAcTranKey, } from './transactionListState';
8
+ export const getTransactionListByProject = (transactionState, transactionListState, accountId, accountType, projectId, timeframe, filterByTimePeriod) => {
9
+ const timePeriods = splitPeriod(filterByTimePeriod); // Note: Split by months.
10
+ const accountTransactions = timePeriods
11
+ .map((thisTimePeriod) => {
12
+ const key = getProjectAcTranKey(accountId, accountType, projectId, thisTimePeriod);
13
+ return recordGet(transactionListState.byProject.transactionListByProjectKey, key, undefined);
14
+ })
15
+ .filter((acTransaction) => acTransaction != null);
16
+ let account = undefined;
17
+ if (accountTransactions.length > 0) {
18
+ account = accountTransactions[0].account;
19
+ }
20
+ const fetchState = reduceFetchState(accountTransactions);
21
+ let transactions = [];
22
+ if (isAnyFetchCompleted(accountTransactions)) {
23
+ const allTransactionIDs = flatMap(accountTransactions, (value) => value.transactionIDs);
24
+ const transactionsUnsorted = allTransactionIDs
25
+ .map((transactionId) => getSupportedTransactionById(transactionState, transactionId))
26
+ .filter((value) => {
27
+ if (value == null) {
28
+ console.error("Can't have null transaction at this stage!");
29
+ }
30
+ return value != null;
31
+ });
32
+ transactions = orderBy(transactionsUnsorted, (value) => value.date.valueOf(), 'desc');
33
+ }
34
+ const key = getProjectAcKey(accountId, accountType, projectId);
35
+ const uiState = recordGet(transactionListState.byProject.transactionListUIStateByProjectKey, key, {});
36
+ return {
37
+ reportId: 'transaction_list_of_account_by_project',
38
+ reportTitle: 'Transaction List of Account By Project',
39
+ version: 1,
40
+ status: undefined,
41
+ fetchState: fetchState.fetchState,
42
+ error: fetchState.error,
43
+ timeframe,
44
+ filterByTimePeriod,
45
+ accountId,
46
+ accountType,
47
+ projectId,
48
+ account,
49
+ transactionOrder: 'descending_transaction_date',
50
+ transactions,
51
+ uiState,
52
+ latestTransactionId: transactionListState.latestTransactionId,
53
+ };
54
+ };
55
+ export const getTransactionListUIStateByProjectKey = (transactionListState, accountId, accountType, projectId) => {
56
+ const key = getProjectAcKey(accountId, accountType, projectId);
57
+ return recordGet(transactionListState.byProject.transactionListUIStateByProjectKey, key, undefined);
58
+ };
@@ -2,7 +2,7 @@ import { createSlice } from '@reduxjs/toolkit';
2
2
  import { toAbsoluteDay } from '../../commonStateTypes/timePeriod';
3
3
  import { mapAccountBasePayloadToAccountBase } from '../../entity/account/accountPayload';
4
4
  import { toEntityType } from '../../entity/genericEntity/entity';
5
- import { accountTransactionsInitialState, getAcKey, getAcTranKey, getCategoryTypeTranKey, getClassAcKey, getClassAcTranKey, getEntityTranKey, initialClassTransactionState, initialEntityTransactionState, initialTransactionsStateByCategoryType, } from './transactionListState';
5
+ import { accountTransactionsInitialState, getAcKey, getAcTranKey, getCategoryTypeTranKey, getClassAcKey, getClassAcTranKey, getEntityTranKey, getProjectAcKey, getProjectAcTranKey, initialClassTransactionState, initialEntityTransactionState, initialProjectTransactionState, initialTransactionsStateByCategoryType, } from './transactionListState';
6
6
  export const initialState = {
7
7
  byAccount: {
8
8
  transactionListByAccountKey: {},
@@ -37,6 +37,10 @@ export const initialState = {
37
37
  transactionListByClassKey: {},
38
38
  transactionListUIStateByClassKey: {},
39
39
  },
40
+ byProject: {
41
+ transactionListByProjectKey: {},
42
+ transactionListUIStateByProjectKey: {},
43
+ },
40
44
  };
41
45
  const transactionList = createSlice({
42
46
  name: 'transactionList',
@@ -246,6 +250,64 @@ const transactionList = createSlice({
246
250
  return { payload: { accountId, accountType, classId, period, error } };
247
251
  },
248
252
  },
253
+ // Transaction list by project related reducers
254
+ //
255
+ // Mirrors the by-class set; the only behavioural difference is that the
256
+ // server query param is `zeni_project_id` (post-Ayon's accounting #3984
257
+ // rename) and there's no equivalent of `include_sub_class_transactions`
258
+ // — projects don't have a sub-project hierarchy in this layout yet.
259
+ parallelFetchProjectTransactionList: {
260
+ reducer() {
261
+ // Do nothing..
262
+ },
263
+ prepare(accountId, accountType, projectId, period, cacheOverride = false) {
264
+ return {
265
+ payload: { accountId, accountType, projectId, period, cacheOverride },
266
+ };
267
+ },
268
+ },
269
+ fetchProjectTransactionList: {
270
+ reducer(draft, action) {
271
+ const key = getProjectAcTranKey(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period);
272
+ if (action.payload.cacheOverride === true ||
273
+ draft.byProject.transactionListByProjectKey[key] == null ||
274
+ (draft.byProject.transactionListByProjectKey[key]?.hasValidState() ===
275
+ false &&
276
+ draft.byProject.transactionListByProjectKey[key]?.fetchState !=
277
+ 'In-Progress')) {
278
+ draft.byProject.transactionListByProjectKey[key] = {
279
+ ...initialProjectTransactionState,
280
+ fetchState: 'In-Progress',
281
+ error: undefined,
282
+ };
283
+ }
284
+ },
285
+ prepare(accountId, accountType, projectId, period, cacheOverride = false) {
286
+ return {
287
+ payload: { accountId, accountType, projectId, period, cacheOverride },
288
+ };
289
+ },
290
+ },
291
+ updateTransactionListByProject(draft, action) {
292
+ doUpdateTransactionListByProject(draft.byProject.transactionListByProjectKey, action.payload);
293
+ },
294
+ updateTransactionListByProjectUIState(draft, action) {
295
+ const key = getProjectAcKey(action.payload.accountId, action.payload.accountType, action.payload.projectId);
296
+ draft.byProject.transactionListUIStateByProjectKey[key] = Object.assign({}, draft.byProject.transactionListUIStateByProjectKey[key], action.payload.uiState);
297
+ },
298
+ updateTransactionListByProjectFailure: {
299
+ reducer(draft, action) {
300
+ const key = getProjectAcTranKey(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period);
301
+ draft.byProject.transactionListByProjectKey[key] = {
302
+ ...initialProjectTransactionState,
303
+ fetchState: 'Error',
304
+ error: action.payload.error,
305
+ };
306
+ },
307
+ prepare(accountId, accountType, projectId, period, error) {
308
+ return { payload: { accountId, accountType, projectId, period, error } };
309
+ },
310
+ },
249
311
  parallelFetchTransactionListByCategoryType: {
250
312
  reducer() {
251
313
  // Do nothing..
@@ -340,7 +402,7 @@ const transactionList = createSlice({
340
402
  },
341
403
  },
342
404
  });
343
- export const { parallelFetchAccountTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, parallelFetchEntityTransactionList, fetchEntityTransactionList, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, fetchClassTransactionList, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByClassFailure, parallelFetchTransactionListByCategoryType, fetchTransactionsListByCategoryType, updateTransactionListByCategoryType, updateTransactionsListByCategoryTypeFailure, updateTransactionListUIStateByCategoryType, clearTransactionList, updateLatestTransactionId, } = transactionList.actions;
405
+ export const { parallelFetchAccountTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, parallelFetchEntityTransactionList, fetchEntityTransactionList, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, fetchClassTransactionList, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByClassFailure, parallelFetchProjectTransactionList, fetchProjectTransactionList, updateTransactionListByProject, updateTransactionListByProjectUIState, updateTransactionListByProjectFailure, parallelFetchTransactionListByCategoryType, fetchTransactionsListByCategoryType, updateTransactionListByCategoryType, updateTransactionsListByCategoryTypeFailure, updateTransactionListUIStateByCategoryType, clearTransactionList, updateLatestTransactionId, } = transactionList.actions;
344
406
  export default transactionList.reducer;
345
407
  /**
346
408
  * Helper functions
@@ -390,3 +452,22 @@ function doUpdateTransactionListByClass(draft, payload) {
390
452
  transactionIDs,
391
453
  };
392
454
  }
455
+ function doUpdateTransactionListByProject(draft, payload) {
456
+ const transactionIDs = payload.account.transactions.map((transactionPaylod) => transactionPaylod.transaction_id);
457
+ const account = mapAccountBasePayloadToAccountBase(payload.account);
458
+ const projectId = payload.query.zeni_project_id;
459
+ const start = toAbsoluteDay(payload.query.start_date);
460
+ const end = toAbsoluteDay(payload.query.end_date);
461
+ const key = getProjectAcTranKey(account.accountId, account.accountType, projectId, {
462
+ start,
463
+ end,
464
+ });
465
+ draft[key] = {
466
+ ...initialProjectTransactionState,
467
+ fetchState: 'Completed',
468
+ error: undefined,
469
+ account: account,
470
+ projectId: projectId,
471
+ transactionIDs,
472
+ };
473
+ }
@@ -30,6 +30,16 @@ export const initialClassTransactionState = {
30
30
  return this.fetchState == 'Completed';
31
31
  },
32
32
  };
33
+ export const getProjectAcTranKey = (accountId, accountType, projectId, period) => `${accountId}-${accountType}-${projectId}-${period.start.day}_${period.start.month}_${period.start.year}_${period.end.day}_${period.end.month}_${period.end.year}`;
34
+ export const getProjectAcKey = (accountId, accountType, projectId) => `${accountId}-${accountType}-${projectId}`;
35
+ export const initialProjectTransactionState = {
36
+ transactionIDs: [],
37
+ fetchState: 'Not-Started',
38
+ error: undefined,
39
+ hasValidState() {
40
+ return this.fetchState == 'Completed';
41
+ },
42
+ };
33
43
  export const getCategoryTypeTranKey = (categoryType, period) => `${categoryType}_${period.start.day}_${period.start.month}_${period.start.year}_${period.end.day}_${period.end.month}_${period.end.year}`;
34
44
  export const initialTransactionsStateByCategoryType = {
35
45
  transactionIDs: [],
package/lib/index.d.ts CHANGED
@@ -139,7 +139,7 @@ import { MatchedTransaction } from './entity/transaction/stateTypes/reconciliati
139
139
  import { ScheduleTransaction } from './entity/transaction/stateTypes/scheduleTransaction';
140
140
  import { RecommendationByLineId, RecommendationWithCOTByLineId, Transaction, TransactionID, TransactionWithCOT } from './entity/transaction/stateTypes/transaction';
141
141
  import { BillableStatus, JournalEntryTransactionLine, Line, LineType, LinkedTransactionLine, PlatformLineDetailType, ProductOrService, TransactionInfoLine, TransactionLineBase, TransactionWithAccountAndClassLine, TransactionWithProductOrServiceLine, toPlatformLineDetailType } from './entity/transaction/stateTypes/transactionLine';
142
- import { CustomerTransactionType, EmployeeTransactionType, OtherTransactionType, TransactionCategory, TransactionType, TransferTransactionType, VendorTransactionType, isJournalEntryTransactionType, toTransactionCategory, toTransactionType, toTransactionTypeStrict } from './entity/transaction/stateTypes/transactionType';
142
+ import { CustomerTransactionType, EmployeeTransactionType, OtherTransactionType, TransactionCategory, TransactionType, TransferTransactionType, VendorTransactionType, toTransactionCategory, toTransactionType, toTransactionTypeStrict } from './entity/transaction/stateTypes/transactionType';
143
143
  import { VendorTransaction, VendorTransactionWithCOT, VendorTransactionWithCustomer, VendorTransactionWithCustomerWithCOT, isVendorTransaction, isVendorTransactionWithCustomer } from './entity/transaction/stateTypes/vendorTransaction';
144
144
  import { getSupportedTransactionById } from './entity/transaction/transactionSelector';
145
145
  import { SupportedTransaction, SupportedTransactionPayload, SupportedTransactionWithCOT } from './entity/transaction/transactionState';
@@ -569,8 +569,9 @@ import { TransactionDetailLineItemData, TransactionDetailLocalData, TransactionV
569
569
  import { TransactionListByAccountReport, getTransactionListByAccount, getTransactionListUIStateByAccountKey } from './view/transactionList/transactionListByAccountSelector';
570
570
  import { TransactionListByCategoryType, getTransactionListUIStateByCategoryType, getTransactionsListByCategoryType } from './view/transactionList/transactionListByCategoryTypeSelector';
571
571
  import { TransactionListByClassReport, getTransactionListByClass, getTransactionListUIStateByClassKey } from './view/transactionList/transactionListByClassSelector';
572
+ import { TransactionListByProjectReport, getTransactionListByProject, getTransactionListUIStateByProjectKey } from './view/transactionList/transactionListByProjectSelector';
572
573
  import { TransactionListByEntityView, getTransactionListByEntity, getTransactionListByEntityForSinglePeriod } from './view/transactionList/transactionListByEntitySelector';
573
- import { clearTransactionList, fetchAccountTransactionList, fetchEntityTransactionList, parallelFetchAccountTransactionList, parallelFetchClassTransactionList, parallelFetchEntityTransactionList, parallelFetchTransactionListByCategoryType, updateLatestTransactionId, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListUIStateByCategoryType } from './view/transactionList/transactionListReducer';
574
+ import { clearTransactionList, fetchAccountTransactionList, fetchEntityTransactionList, parallelFetchAccountTransactionList, parallelFetchClassTransactionList, parallelFetchProjectTransactionList, parallelFetchEntityTransactionList, parallelFetchTransactionListByCategoryType, updateLatestTransactionId, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByProject, updateTransactionListByProjectUIState, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListUIStateByCategoryType } from './view/transactionList/transactionListReducer';
574
575
  import { TransactionCategoryType } from './view/transactionList/transactionListState';
575
576
  import { clearTrendData, fetchExpenseTrend, fetchIncomeTrend } from './view/trend/trendReducer';
576
577
  import { TrendView, getCurrentFiscalQuarterDateRange, getTrendForEntity } from './view/trend/trendSelector';
@@ -711,18 +712,18 @@ export { CustomerTransaction, CustomerTransactionWithCOT, isCustomerTransaction
711
712
  export { TransactionID, TransactionWithCOT, Transaction, RecommendationWithCOTByLineId, RecommendationByLineId, };
712
713
  export { TransactionIDPayload, toTransactionID, } from './entity/transaction/payloadTypes/transactionIDPayload';
713
714
  export { TransactionLineBase, LinkedTransactionLine, TransactionWithAccountAndClassLine, TransactionWithProductOrServiceLine, JournalEntryTransactionLine, TransactionInfoLine, Line, LineType, ProductOrService, toPlatformLineDetailType, PlatformLineDetailType, };
714
- export { CustomerTransactionType, VendorTransactionType, EmployeeTransactionType, TransferTransactionType, OtherTransactionType, TransactionType, toTransactionType, toTransactionTypeStrict, toTransactionCategory, TransactionCategory, isJournalEntryTransactionType, };
715
+ export { CustomerTransactionType, VendorTransactionType, EmployeeTransactionType, TransferTransactionType, OtherTransactionType, TransactionType, toTransactionType, toTransactionTypeStrict, toTransactionCategory, TransactionCategory, };
715
716
  export { VendorBase, Vendor, defaultVendorCurrency, updateVendors };
716
717
  export { VendorTransaction, VendorTransactionWithCOT, isVendorTransaction, VendorTransactionWithCustomer, VendorTransactionWithCustomerWithCOT, isVendorTransactionWithCustomer, };
717
718
  export { TransferTransaction, isTransferTransaction };
718
719
  export { MatchedTransaction };
719
720
  export { SupportedTransaction, SupportedTransactionWithCOT, SupportedTransactionPayload, getSupportedTransactionById, };
720
- export { clearTransactionList, updateLatestTransactionId, parallelFetchAccountTransactionList, parallelFetchEntityTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, updateTransactionListByClassUIState, updateTransactionListByClass, updateTransactionListUIStateByCategoryType, parallelFetchTransactionListByCategoryType, };
721
+ export { clearTransactionList, updateLatestTransactionId, parallelFetchAccountTransactionList, parallelFetchEntityTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, updateTransactionListByClassUIState, updateTransactionListByClass, parallelFetchProjectTransactionList, updateTransactionListByProjectUIState, updateTransactionListByProject, updateTransactionListUIStateByCategoryType, parallelFetchTransactionListByCategoryType, };
721
722
  export { TransactionListByAccountReport, getTransactionListByAccount, getTransactionListUIStateByAccountKey, };
722
723
  export { fetchEntityTransactionList, updateTransactionListByEntity, saveTransactionDetailLocalData, clearTransactionDetailSaveStatus, updateTransactionListByEntityFailure, resetLineItemsCategoryClassInLocalData, setAllLineItemsToCategoryClassInLocalData, saveTransactionDetail, setAllLineItemsLocalDataIsUpdateAllChecked, initializeTransactionDetailLocalData, removeEntityRecommendationForLineIdForTransactionDetail, updateSelectedVendor, updateSelectedCustomer, resetSelectedCustomer, resetVendor, updateLocalDataWithTransactionsUpdateWithVendorCheckbox, updateVendorToAllLineItems, resetAllLineItemsToVendor, updateLatestSelectedEntity, updateVendorBulkRecommendationsFetchStatus, setIsVendorUpdateAllChecked, };
723
724
  export { TransactionUpdates, downloadAccountingProviderAttachment, downloadAccountingProviderAttachmentSuccess, downloadAccountingProviderAttachmentFailure, fetchTransactionDetail, updateTransactionDetail, uploadMissingAttachmentSuccess, deleteTransactionAttachment, getThirdPartyIdFromTransactionId, };
724
725
  export { TransactionListByEntityView, getTransactionListByEntity };
725
- export { TransactionListByClassReport, getTransactionListByClass, getTransactionListUIStateByClassKey, getTransactionListByEntityForSinglePeriod, };
726
+ export { TransactionListByClassReport, getTransactionListByClass, getTransactionListUIStateByClassKey, TransactionListByProjectReport, getTransactionListByProject, getTransactionListUIStateByProjectKey, getTransactionListByEntityForSinglePeriod, };
726
727
  export { TransactionDetailReport, getTransactionDetail, getTransactionDetailForTransaction, VendorDetailsView, getInitialUpdatablePeriodsForTransactionRecommendations as getUpdatablePeriodsForTransactionRecommendations, };
727
728
  export { getInsights, fetchInsightsCard, updateSelectedInsightIndex, InsightsView, };
728
729
  export { fetchForecastList } from './view/forecastList/forecastListReducer';