@zeniai/client-epic-state 5.3.13 → 5.3.14-beta1MM

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 (30) hide show
  1. package/lib/commonStateTypes/animations.d.ts +1 -1
  2. package/lib/commonStateTypes/animations.js +0 -2
  3. package/lib/entity/actualMatching/actualMatchingPayload.d.ts +2 -0
  4. package/lib/entity/actualMatching/actualMatchingPayload.js +6 -0
  5. package/lib/entity/actualMatching/actualMatchingReducer.js +2 -1
  6. package/lib/entity/actualMatching/actualMatchingState.d.ts +2 -0
  7. package/lib/entity/actualMatching/actualMatchingTypes.d.ts +6 -0
  8. package/lib/entity/actualMatching/actualMatchingTypes.js +17 -0
  9. package/lib/esm/commonStateTypes/animations.js +0 -2
  10. package/lib/esm/entity/actualMatching/actualMatchingPayload.js +6 -0
  11. package/lib/esm/entity/actualMatching/actualMatchingReducer.js +2 -1
  12. package/lib/esm/entity/actualMatching/actualMatchingTypes.js +16 -1
  13. package/lib/esm/index.js +1 -0
  14. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/actualMatching/fetchActualMatchingEpic.js +2 -1
  15. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/actualMatching/fetchActualMatchingMatchEpic.js +17 -2
  16. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/actualMatching/matchAndReverseAccrualsEpic.js +7 -3
  17. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/actualMatching/undoReversalAccrualsEpic.js +12 -7
  18. package/lib/esm/view/expenseAutomationView/reducers/actualMatchingViewReducer.js +32 -23
  19. package/lib/esm/view/expenseAutomationView/selectors/actualMatchingViewSelector.js +2 -0
  20. package/lib/index.d.ts +1 -0
  21. package/lib/index.js +4 -2
  22. package/lib/view/expenseAutomationView/epics/jeSchedule/actualMatching/fetchActualMatchingEpic.js +2 -1
  23. package/lib/view/expenseAutomationView/epics/jeSchedule/actualMatching/fetchActualMatchingMatchEpic.js +17 -2
  24. package/lib/view/expenseAutomationView/epics/jeSchedule/actualMatching/matchAndReverseAccrualsEpic.js +7 -3
  25. package/lib/view/expenseAutomationView/epics/jeSchedule/actualMatching/undoReversalAccrualsEpic.js +12 -7
  26. package/lib/view/expenseAutomationView/reducers/actualMatchingViewReducer.d.ts +12 -3
  27. package/lib/view/expenseAutomationView/reducers/actualMatchingViewReducer.js +32 -23
  28. package/lib/view/expenseAutomationView/selectorTypes/actualMatchingViewSelectorTypes.d.ts +2 -0
  29. package/lib/view/expenseAutomationView/selectors/actualMatchingViewSelector.js +2 -0
  30. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- export declare const toAnimationsFileName: (v: string) => "Success" | "AiAgent" | "AiIconEntry" | "AiIconExit" | "AiIconLoop" | "AiStar" | "AiStarIcon" | "AiStarPlain" | "AIPoweredInvoiceDark" | "AIPoweredInvoiceLight" | "Angry" | "AutoTransfer" | "CloseCard" | "Confetti" | "ConfettiSuccess" | "DashboardChristmasSnow" | "DashboardHalloweenBats" | "DashboardNewYearShow" | "DashboardSidebarBottomChristmas" | "DashboardSidebarBottomHalloween" | "DashboardSidebarBottomNewYear" | "DashboardSidebarBottomThanksgiving" | "DashboardSidebarTopChristmas" | "DashboardSidebarTopHalloween" | "DashboardSidebarTopNewYear" | "DashboardSidebarTopThanksgiving" | "Distribution" | "DistributionDark" | "EarnYield" | "FastestWayDark" | "FastestWayLight" | "FinanceTeamDark" | "FinanceTeamLight" | "Happy" | "Liquidity" | "LockCard" | "MoneyTransferSuccess" | "MultiLevelApprovalDark" | "MultiLevelApprovalLight" | "NotHappy" | "Protection" | "ReceiptDark" | "ReceiptLight" | "Recurring" | "RecurringDark" | "ReimburseDark" | "ReimburseLight" | "RewardsDark" | "RewardsDarkHover" | "RewardsLight" | "RewardsLightHover" | "Ripple" | "Secure" | "Target" | "TargetDark" | "UnlockCard" | "VeryHappy" | "Welcome" | "ZeniAssist";
1
+ export declare const toAnimationsFileName: (v: string) => "Success" | "AiAgent" | "AiIconEntry" | "AiIconExit" | "AiIconLoop" | "AiStar" | "AiStarIcon" | "AiStarPlain" | "AIPoweredInvoiceDark" | "AIPoweredInvoiceLight" | "Angry" | "AutoTransfer" | "CloseCard" | "Confetti" | "ConfettiSuccess" | "DashboardChristmasSnow" | "DashboardHalloweenBats" | "DashboardNewYearShow" | "DashboardSidebarBottomChristmas" | "DashboardSidebarBottomNewYear" | "DashboardSidebarBottomThanksgiving" | "DashboardSidebarTopChristmas" | "DashboardSidebarTopNewYear" | "DashboardSidebarTopThanksgiving" | "Distribution" | "DistributionDark" | "EarnYield" | "FastestWayDark" | "FastestWayLight" | "FinanceTeamDark" | "FinanceTeamLight" | "Happy" | "Liquidity" | "LockCard" | "MoneyTransferSuccess" | "MultiLevelApprovalDark" | "MultiLevelApprovalLight" | "NotHappy" | "Protection" | "ReceiptDark" | "ReceiptLight" | "Recurring" | "RecurringDark" | "ReimburseDark" | "ReimburseLight" | "RewardsDark" | "RewardsDarkHover" | "RewardsLight" | "RewardsLightHover" | "Ripple" | "Secure" | "Target" | "TargetDark" | "UnlockCard" | "VeryHappy" | "Welcome" | "ZeniAssist";
2
2
  export type AnimationFileName = ReturnType<typeof toAnimationsFileName>;
@@ -21,11 +21,9 @@ const ALL_ANIMATIONS_FILE_NAMES = [
21
21
  'DashboardHalloweenBats',
22
22
  'DashboardNewYearShow',
23
23
  'DashboardSidebarBottomChristmas',
24
- 'DashboardSidebarBottomHalloween',
25
24
  'DashboardSidebarBottomNewYear',
26
25
  'DashboardSidebarBottomThanksgiving',
27
26
  'DashboardSidebarTopChristmas',
28
- 'DashboardSidebarTopHalloween',
29
27
  'DashboardSidebarTopNewYear',
30
28
  'DashboardSidebarTopThanksgiving',
31
29
  'Distribution',
@@ -17,8 +17,10 @@ export interface ActualMatchingMatchPayload {
17
17
  currency_code?: string | null;
18
18
  currency_symbol?: string | null;
19
19
  leftovers?: JEOneTimeAccrualPayload[];
20
+ match_batch_id?: string | null;
20
21
  match_shape?: string | null;
21
22
  match_tier?: string | null;
23
+ suggestion_key?: string | null;
22
24
  transaction_date?: string | null;
23
25
  vendor_id?: ID | null;
24
26
  vendor_name?: string | null;
@@ -34,6 +34,12 @@ function toActualMatchingMatch(payload, fallbackCurrency) {
34
34
  : currencyCode;
35
35
  return {
36
36
  matchId: payload.match_id,
37
+ matchBatchId: payload.match_batch_id != null && payload.match_batch_id !== ''
38
+ ? payload.match_batch_id
39
+ : undefined,
40
+ suggestionKey: payload.suggestion_key != null && payload.suggestion_key !== ''
41
+ ? payload.suggestion_key
42
+ : undefined,
37
43
  transactionType: (payload.transaction_type || '').toLowerCase(),
38
44
  transactionIntegrationId: payload.transaction_integration_id,
39
45
  transactionDate: payload.transaction_date ?? undefined,
@@ -5,6 +5,7 @@ exports.updateActualMatchingMatches = exports.removeActualMatchingMatch = export
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const rootActions_1 = require("../../rootActions");
7
7
  const actualMatchingPayload_1 = require("./actualMatchingPayload");
8
+ const actualMatchingTypes_1 = require("./actualMatchingTypes");
8
9
  exports.initialState = {
9
10
  byMatchId: {},
10
11
  };
@@ -19,7 +20,7 @@ const actualMatching = (0, toolkit_1.createSlice)({
19
20
  reducer(draft, action) {
20
21
  action.payload.matches.forEach((payload) => {
21
22
  const match = (0, actualMatchingPayload_1.toActualMatchingMatch)(payload, action.payload.fallbackCurrency);
22
- draft.byMatchId[match.matchId] = match;
23
+ draft.byMatchId[(0, actualMatchingTypes_1.actualMatchingRowKey)(match.matchId, match.matchBatchId, match.suggestionKey)] = match;
23
24
  });
24
25
  },
25
26
  },
@@ -12,8 +12,10 @@ export interface ActualMatchingMatch {
12
12
  transactionIntegrationId: ID;
13
13
  transactionType: string;
14
14
  leftovers?: JEOneTimeAccrualState[];
15
+ matchBatchId?: string;
15
16
  matchShape?: string;
16
17
  matchTier?: string;
18
+ suggestionKey?: string;
17
19
  transactionDate?: string;
18
20
  vendorId?: ID;
19
21
  vendorName?: string;
@@ -1 +1,7 @@
1
1
  export type ActualMatchingMatchId = string;
2
+ /** Store and status key. The route match id stays ``type:id``.
3
+
4
+ The second part is the cleared ``match_batch_id`` when one exists, otherwise the
5
+ pending suggestion's ``suggestion_key``.
6
+ */
7
+ export declare function actualMatchingRowKey(matchId: string, matchBatchId?: string | null, suggestionKey?: string | null): string;
@@ -1,2 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.actualMatchingRowKey = actualMatchingRowKey;
4
+ /** Store and status key. The route match id stays ``type:id``.
5
+
6
+ The second part is the cleared ``match_batch_id`` when one exists, otherwise the
7
+ pending suggestion's ``suggestion_key``.
8
+ */
9
+ function actualMatchingRowKey(matchId, matchBatchId, suggestionKey) {
10
+ const batch = (matchBatchId ?? '').trim();
11
+ if (batch !== '') {
12
+ return `${matchId}\u0000${batch}`;
13
+ }
14
+ const suggestion = (suggestionKey ?? '').trim();
15
+ if (suggestion === '') {
16
+ return matchId;
17
+ }
18
+ return `${matchId}\u0000${suggestion}`;
19
+ }
@@ -18,11 +18,9 @@ const ALL_ANIMATIONS_FILE_NAMES = [
18
18
  'DashboardHalloweenBats',
19
19
  'DashboardNewYearShow',
20
20
  'DashboardSidebarBottomChristmas',
21
- 'DashboardSidebarBottomHalloween',
22
21
  'DashboardSidebarBottomNewYear',
23
22
  'DashboardSidebarBottomThanksgiving',
24
23
  'DashboardSidebarTopChristmas',
25
- 'DashboardSidebarTopHalloween',
26
24
  'DashboardSidebarTopNewYear',
27
25
  'DashboardSidebarTopThanksgiving',
28
26
  'Distribution',
@@ -30,6 +30,12 @@ export function toActualMatchingMatch(payload, fallbackCurrency) {
30
30
  : currencyCode;
31
31
  return {
32
32
  matchId: payload.match_id,
33
+ matchBatchId: payload.match_batch_id != null && payload.match_batch_id !== ''
34
+ ? payload.match_batch_id
35
+ : undefined,
36
+ suggestionKey: payload.suggestion_key != null && payload.suggestion_key !== ''
37
+ ? payload.suggestion_key
38
+ : undefined,
33
39
  transactionType: (payload.transaction_type || '').toLowerCase(),
34
40
  transactionIntegrationId: payload.transaction_integration_id,
35
41
  transactionDate: payload.transaction_date ?? undefined,
@@ -1,6 +1,7 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
2
  import { clearAll } from '../../rootActions';
3
3
  import { toActualMatchingMatch, } from './actualMatchingPayload';
4
+ import { actualMatchingRowKey, } from './actualMatchingTypes';
4
5
  export const initialState = {
5
6
  byMatchId: {},
6
7
  };
@@ -15,7 +16,7 @@ const actualMatching = createSlice({
15
16
  reducer(draft, action) {
16
17
  action.payload.matches.forEach((payload) => {
17
18
  const match = toActualMatchingMatch(payload, action.payload.fallbackCurrency);
18
- draft.byMatchId[match.matchId] = match;
19
+ draft.byMatchId[actualMatchingRowKey(match.matchId, match.matchBatchId, match.suggestionKey)] = match;
19
20
  });
20
21
  },
21
22
  },
@@ -1 +1,16 @@
1
- export {};
1
+ /** Store and status key. The route match id stays ``type:id``.
2
+
3
+ The second part is the cleared ``match_batch_id`` when one exists, otherwise the
4
+ pending suggestion's ``suggestion_key``.
5
+ */
6
+ export function actualMatchingRowKey(matchId, matchBatchId, suggestionKey) {
7
+ const batch = (matchBatchId ?? '').trim();
8
+ if (batch !== '') {
9
+ return `${matchId}\u0000${batch}`;
10
+ }
11
+ const suggestion = (suggestionKey ?? '').trim();
12
+ if (suggestion === '') {
13
+ return matchId;
14
+ }
15
+ return `${matchId}\u0000${suggestion}`;
16
+ }
package/lib/esm/index.js CHANGED
@@ -875,6 +875,7 @@ export { getInvoicingOnboardingGateView } from './view/invoicing/invoicingConfig
875
875
  // narrow a JEScheduleRow before reading baseTransaction / recurringAmount.
876
876
  export { getExpenseAutomationJEOneTimeAccrualDetailView, getJEScheduleRowType, isAccruedScheduleRow, isAiAccountantSchedule, isExistingTabRow, isOneTimeAccrualRow, isRenderableOneTimeAccrual, isPendingReviewRow, } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
877
877
  export { getActualMatchingAmount, getActualMatchingReversalDate, getActualMatchingMatchModalConfirmStatus, getCloseMatchAfterIgnoreMatchId, getCloseMatchAfterUndo, getCloseMatchAfterUndoMatchId, parseActualMatchingMatchId, getExpenseAutomationActualMatchingMatchView, getExpenseAutomationActualMatchingView, isAutoReversedAccrual, isManuallyReversedAccrual, isPendingReviewAccrual, } from './view/expenseAutomationView/selectors/actualMatchingViewSelector';
878
+ export { actualMatchingRowKey } from './entity/actualMatching/actualMatchingTypes';
878
879
  export { fetchCustomerSummaryDetail, fetchCustomerSummaryList, resetCustomerSummaryDetailUiState, saveCustomerSummaryDetail, updateCustomerAllTransactionsTabData, updateCustomerDetailSelectedTab, updateCustomerSummaryRevenueSelection, updateCustomerSummaryScrollYOffset, updateCustomerSummarySortUiState, updateCustomerTrendFilter, } from './view/customerSummaryView/customerSummaryViewReducer';
879
880
  export { getCustomerSummaryAllTransactionsTabData, getCustomerSummaryDetail, getCustomerSummaryList, getCustomerSummarySelectedTabType, getCustomerSummaryTrendFilter, isCustomersTabVisible, } from './view/customerSummaryView/customerSummaryViewSelector';
880
881
  export { CUSTOMER_REVENUE_KEYS } from './view/customerSummaryView/customerSummaryViewState';
@@ -1,6 +1,7 @@
1
1
  import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, switchMap, takeUntil, } from 'rxjs/operators';
3
3
  import { updateActualMatchingMatches } from '../../../../../entity/actualMatching/actualMatchingReducer';
4
+ import { actualMatchingRowKey } from '../../../../../entity/actualMatching/actualMatchingTypes';
4
5
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../../responsePayload';
5
6
  import { clearAll } from '../../../../../rootActions';
6
7
  import { toServiceMonthFromPeriod, } from '../../../payload/actualMatchingPayload';
@@ -26,7 +27,7 @@ export const fetchActualMatchingEpic = (actions$, state$, zeniAPI) => actions$.p
26
27
  updateActions.push(updateActualMatchingMatches(matches, getTenantDisplayCurrency(state)));
27
28
  }
28
29
  updateActions.push(fetchActualMatchingSuccess({
29
- matchIds: matches.map((match) => match.match_id),
30
+ matchIds: matches.map((match) => actualMatchingRowKey(match.match_id, match.match_batch_id, match.suggestion_key)),
30
31
  selectedPeriod: requestPeriod,
31
32
  refreshViewInBackground,
32
33
  }));
@@ -6,29 +6,44 @@ import { clearAll } from '../../../../../rootActions';
6
6
  import { fetchActualMatchingMatch, fetchActualMatchingMatchFailure, fetchActualMatchingMatchSuccess, } from '../../../reducers/actualMatchingViewReducer';
7
7
  import { getTenantDisplayCurrency } from '../../../selectors/actualMatchingViewSelector';
8
8
  export const fetchActualMatchingMatchEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchActualMatchingMatch.match), mergeMap((action) => {
9
- const { matchId, refreshViewInBackground } = action.payload;
9
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground } = action.payload;
10
+ const detailQuery = new URLSearchParams();
11
+ if (matchBatchId != null && matchBatchId !== '') {
12
+ detailQuery.set('batch_id', matchBatchId);
13
+ }
14
+ else if (suggestionKey != null && suggestionKey !== '') {
15
+ detailQuery.set('suggestion_key', suggestionKey);
16
+ }
17
+ const encodedQuery = detailQuery.toString();
18
+ const batchQuery = encodedQuery === '' ? '' : `?${encodedQuery}`;
10
19
  return zeniAPI
11
- .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accruals/actual-matching/${encodeURIComponent(matchId)}`)
20
+ .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accruals/actual-matching/${encodeURIComponent(matchId)}${batchQuery}`)
12
21
  .pipe(mergeMap((response) => {
13
22
  if (isSuccessResponse(response) && response.data != null) {
14
23
  return from([
15
24
  updateActualMatchingMatches([response.data], getTenantDisplayCurrency(state$.value)),
16
25
  fetchActualMatchingMatchSuccess({
26
+ suggestionKey,
17
27
  matchId,
28
+ matchBatchId,
18
29
  refreshViewInBackground,
19
30
  }),
20
31
  ]);
21
32
  }
22
33
  return from([
23
34
  fetchActualMatchingMatchFailure({
35
+ suggestionKey,
24
36
  matchId,
37
+ matchBatchId,
25
38
  refreshViewInBackground,
26
39
  status: response.status,
27
40
  }),
28
41
  ]);
29
42
  }), catchError((error) => from([
30
43
  fetchActualMatchingMatchFailure({
44
+ suggestionKey,
31
45
  matchId,
46
+ matchBatchId,
32
47
  refreshViewInBackground,
33
48
  status: createZeniAPIStatus('Unexpected Error', `Fetch actual matching match REST API call errored out ${JSON.stringify(error)}`),
34
49
  }),
@@ -56,8 +56,12 @@ function matchAndReverseHttpFailSnackbar(vendorName) {
56
56
  });
57
57
  }
58
58
  function matchVendorName(state, matchId) {
59
- return (getActualMatchingMatchById(state.actualMatchingState, matchId)
60
- ?.vendorName ?? '');
59
+ const stored = getActualMatchingMatchById(state.actualMatchingState, matchId);
60
+ if (stored?.vendorName != null && stored.vendorName !== '') {
61
+ return stored.vendorName;
62
+ }
63
+ const sameBill = Object.values(state.actualMatchingState.byMatchId).find((match) => match.matchId === matchId);
64
+ return sameBill?.vendorName ?? '';
61
65
  }
62
66
  export const matchAndReverseAccrualsEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(matchAndReverseAccruals.match),
63
67
  // Per-match exhaust: a second click on the same match drops while HTTP is in
@@ -96,7 +100,7 @@ groupBy((action) => `${action.payload.transactionType.toLowerCase()}:${action.pa
96
100
  // List + detail: list can omit leftovers; detail GET always
97
101
  // writes intended occupancy so leftover retry can join C
98
102
  // onto the occupied bill instead of a stale cached row.
99
- successActions.push(...refreshActualMatchingList(state$.value), fetchActualMatchingMatch(matchId, true));
103
+ successActions.push(...refreshActualMatchingList(state$.value), fetchActualMatchingMatch(matchId, true, response.data.match_batch_id));
100
104
  }
101
105
  const snackbar = matchAndReverseSnackbar(results, vendorName);
102
106
  if (snackbar != null) {
@@ -1,6 +1,7 @@
1
1
  import { from, of } from 'rxjs';
2
2
  import { catchError, exhaustMap, filter, groupBy, mergeMap, takeUntil, } from 'rxjs/operators';
3
3
  import { getActualMatchingMatchById } from '../../../../../entity/actualMatching/actualMatchingSelector';
4
+ import { actualMatchingRowKey } from '../../../../../entity/actualMatching/actualMatchingTypes';
4
5
  import { openSnackbar } from '../../../../../entity/snackbar/snackbarReducer';
5
6
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../../responsePayload';
6
7
  import { clearAll } from '../../../../../rootActions';
@@ -37,41 +38,45 @@ function undoReversalSnackbar(results, vendorName) {
37
38
  variables,
38
39
  });
39
40
  }
40
- function matchVendorName(state, matchId) {
41
- return (getActualMatchingMatchById(state.actualMatchingState, matchId)?.vendorName ??
41
+ function matchVendorName(state, matchId, matchBatchId) {
42
+ const rowKey = actualMatchingRowKey(matchId, matchBatchId);
43
+ return (getActualMatchingMatchById(state.actualMatchingState, rowKey)?.vendorName ??
44
+ getActualMatchingMatchById(state.actualMatchingState, matchId)?.vendorName ??
42
45
  '');
43
46
  }
44
47
  export const undoReversalAccrualsEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(undoReversalAccruals.match),
45
48
  // Per-match exhaust: a second click on the same match drops while HTTP is in
46
49
  // flight. A different match must still run — a global exhaustMap left the
47
50
  // other match's reducer In-Progress with no request.
48
- groupBy((action) => action.payload.matchId), mergeMap((perMatch$) => perMatch$.pipe(exhaustMap((action) => {
49
- const { accrualIds, matchId } = action.payload;
51
+ groupBy((action) => actualMatchingRowKey(action.payload.matchId, action.payload.matchBatchId)), mergeMap((perMatch$) => perMatch$.pipe(exhaustMap((action) => {
52
+ const { accrualIds, matchId, matchBatchId } = action.payload;
50
53
  const body = {
51
54
  accrual_ids: accrualIds,
52
55
  };
53
- const vendorName = matchVendorName(state$.value, matchId);
56
+ const vendorName = matchVendorName(state$.value, matchId, matchBatchId);
54
57
  return zeniAPI
55
58
  .postAndGetJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accruals/undo-reversal`, body)
56
59
  .pipe(mergeMap((response) => {
57
60
  if (isSuccessResponse(response) && response.data != null) {
58
61
  const results = response.data.results.map(toUndoReversalResult);
59
62
  const successActions = [
60
- undoReversalAccrualsSuccess(matchId, results),
63
+ undoReversalAccrualsSuccess(matchId, results, matchBatchId),
61
64
  ];
62
65
  const anyUndone = results.some((result) => result.status === 'undone');
63
66
  if (anyUndone) {
64
- successActions.push(...refreshActualMatchingList(state$.value), fetchActualMatchingMatch(matchId, true));
67
+ successActions.push(...refreshActualMatchingList(state$.value), fetchActualMatchingMatch(matchId, true, matchBatchId));
65
68
  }
66
69
  successActions.push(undoReversalSnackbar(results, vendorName));
67
70
  return from(successActions);
68
71
  }
69
72
  return of(undoReversalAccrualsFailure({
70
73
  matchId,
74
+ matchBatchId,
71
75
  status: response.status,
72
76
  }), undoReversalSnackbar([], vendorName));
73
77
  }), catchError((error) => of(undoReversalAccrualsFailure({
74
78
  matchId,
79
+ matchBatchId,
75
80
  status: createZeniAPIStatus('Unexpected Error', 'Undo reversal accruals REST API call errored out' +
76
81
  JSON.stringify(error)),
77
82
  }), undoReversalSnackbar([], vendorName))), takeUntil(actions$.pipe(filter(clearAll.match))));
@@ -1,5 +1,6 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
2
  import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
3
+ import { actualMatchingRowKey } from '../../../entity/actualMatching/actualMatchingTypes';
3
4
  import { generateJEOneTimeAccrualKey } from '../../../entity/jeSchedules/jeScheduleHelper';
4
5
  import { createZeniAPIStatus } from '../../../responsePayload';
5
6
  import { clearAll } from '../../../rootActions';
@@ -183,19 +184,22 @@ const expenseAutomationActualMatchingView = createSlice({
183
184
  }
184
185
  },
185
186
  fetchActualMatchingMatch: {
186
- prepare(matchId, refreshViewInBackground = false) {
187
- return { payload: { matchId, refreshViewInBackground } };
187
+ prepare(matchId, refreshViewInBackground = false, matchBatchId, suggestionKey) {
188
+ return {
189
+ payload: { suggestionKey, matchBatchId, matchId, refreshViewInBackground },
190
+ };
188
191
  },
189
192
  reducer(draft, action) {
190
- const { matchId, refreshViewInBackground } = action.payload;
193
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground } = action.payload;
194
+ const rowKey = actualMatchingRowKey(matchId, matchBatchId, suggestionKey);
191
195
  if (refreshViewInBackground) {
192
- draft.detailRefreshStatusByMatchId[matchId] = {
196
+ draft.detailRefreshStatusByMatchId[rowKey] = {
193
197
  fetchState: 'In-Progress',
194
198
  error: undefined,
195
199
  };
196
200
  }
197
201
  else {
198
- draft.detailFetchStateByMatchId[matchId] = {
202
+ draft.detailFetchStateByMatchId[rowKey] = {
199
203
  fetchState: 'In-Progress',
200
204
  error: undefined,
201
205
  };
@@ -203,30 +207,32 @@ const expenseAutomationActualMatchingView = createSlice({
203
207
  },
204
208
  },
205
209
  fetchActualMatchingMatchSuccess(draft, action) {
206
- const { matchId, refreshViewInBackground } = action.payload;
210
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground } = action.payload;
211
+ const rowKey = actualMatchingRowKey(matchId, matchBatchId, suggestionKey);
207
212
  if (refreshViewInBackground) {
208
- draft.detailRefreshStatusByMatchId[matchId] = {
213
+ draft.detailRefreshStatusByMatchId[rowKey] = {
209
214
  fetchState: 'Completed',
210
215
  error: undefined,
211
216
  };
212
217
  }
213
218
  else {
214
- draft.detailFetchStateByMatchId[matchId] = {
219
+ draft.detailFetchStateByMatchId[rowKey] = {
215
220
  fetchState: 'Completed',
216
221
  error: undefined,
217
222
  };
218
223
  }
219
224
  },
220
225
  fetchActualMatchingMatchFailure(draft, action) {
221
- const { matchId, refreshViewInBackground, status } = action.payload;
226
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground, status } = action.payload;
227
+ const rowKey = actualMatchingRowKey(matchId, matchBatchId, suggestionKey);
222
228
  if (refreshViewInBackground) {
223
- draft.detailRefreshStatusByMatchId[matchId] = {
229
+ draft.detailRefreshStatusByMatchId[rowKey] = {
224
230
  fetchState: 'Error',
225
231
  error: status,
226
232
  };
227
233
  }
228
234
  else {
229
- draft.detailFetchStateByMatchId[matchId] = {
235
+ draft.detailFetchStateByMatchId[rowKey] = {
230
236
  fetchState: 'Error',
231
237
  error: status,
232
238
  };
@@ -417,40 +423,42 @@ const expenseAutomationActualMatchingView = createSlice({
417
423
  },
418
424
  undoReversalAccruals: {
419
425
  reducer(draft, action) {
420
- draft.undoReversalStatusByMatchId[action.payload.matchId] = {
426
+ const rowKey = actualMatchingRowKey(action.payload.matchId, action.payload.matchBatchId);
427
+ draft.undoReversalStatusByMatchId[rowKey] = {
421
428
  fetchState: 'In-Progress',
422
429
  error: undefined,
423
430
  };
424
431
  },
425
- prepare(matchId, accrualIds) {
426
- return { payload: { matchId, accrualIds } };
432
+ prepare(matchId, accrualIds, matchBatchId) {
433
+ return { payload: { matchId, accrualIds, matchBatchId } };
427
434
  },
428
435
  },
429
436
  undoReversalAccrualsSuccess: {
430
437
  reducer(draft, action) {
431
- const { matchId, results } = action.payload;
432
- draft.undoReversalStatusByMatchId[matchId] = {
438
+ const { matchId, matchBatchId, results } = action.payload;
439
+ const rowKey = actualMatchingRowKey(matchId, matchBatchId);
440
+ draft.undoReversalStatusByMatchId[rowKey] = {
433
441
  fetchState: 'Completed',
434
442
  error: undefined,
435
443
  };
436
444
  const allUndone = results.length > 0 &&
437
445
  results.every((result) => result.status === 'undone');
438
446
  if (allUndone) {
439
- enqueueCloseMatchId(draft.closeMatchAfterUndoMatchIds, matchId);
447
+ enqueueCloseMatchId(draft.closeMatchAfterUndoMatchIds, rowKey);
440
448
  }
441
449
  else {
442
- draft.closeMatchAfterUndoMatchIds = dropCloseMatchId(draft.closeMatchAfterUndoMatchIds, matchId);
450
+ draft.closeMatchAfterUndoMatchIds = dropCloseMatchId(draft.closeMatchAfterUndoMatchIds, rowKey);
443
451
  }
444
452
  pruneLastMatchResultsForUndone(draft, matchId, results);
445
453
  if (allUndone) {
446
- delete draft.lastUndoResultsByMatchId[matchId];
454
+ delete draft.lastUndoResultsByMatchId[rowKey];
447
455
  }
448
456
  else {
449
- draft.lastUndoResultsByMatchId[matchId] = results;
457
+ draft.lastUndoResultsByMatchId[rowKey] = results;
450
458
  }
451
459
  },
452
- prepare(matchId, results) {
453
- return { payload: { matchId, results } };
460
+ prepare(matchId, results, matchBatchId) {
461
+ return { payload: { matchId, results, matchBatchId } };
454
462
  },
455
463
  },
456
464
  ackCloseMatchAfterUndo(draft) {
@@ -494,7 +502,8 @@ const expenseAutomationActualMatchingView = createSlice({
494
502
  draft.closeMatchAfterIgnoreMatchIds.shift();
495
503
  },
496
504
  undoReversalAccrualsFailure(draft, action) {
497
- draft.undoReversalStatusByMatchId[action.payload.matchId] = {
505
+ const rowKey = actualMatchingRowKey(action.payload.matchId, action.payload.matchBatchId);
506
+ draft.undoReversalStatusByMatchId[rowKey] = {
498
507
  fetchState: 'Error',
499
508
  error: action.payload.status,
500
509
  };
@@ -130,7 +130,9 @@ function toActualMatchingRow(match) {
130
130
  ];
131
131
  return {
132
132
  ...first,
133
+ suggestionKey: match.suggestionKey,
133
134
  matchId: match.matchId,
135
+ matchBatchId: match.matchBatchId,
134
136
  kind: match.kind,
135
137
  accruedAmount: match.accruedAmount,
136
138
  actualAmount: match.actualAmount,
package/lib/index.d.ts CHANGED
@@ -1274,6 +1274,7 @@ export type { ExpenseAutomationActualMatchingMatchView } from './view/expenseAut
1274
1274
  export type { ActualMatchingMatch, ActualMatchingMatchKind, } from './entity/actualMatching/actualMatchingState';
1275
1275
  export type { ActualMatchingMatchId } from './entity/actualMatching/actualMatchingTypes';
1276
1276
  export type { SessionEndpointsLoader } from './sessionEndpointsLoader';
1277
+ export { actualMatchingRowKey } from './entity/actualMatching/actualMatchingTypes';
1277
1278
  export type { DisplayCurrencyFallback } from './entity/actualMatching/actualMatchingPayload';
1278
1279
  export { fetchCustomerSummaryDetail, fetchCustomerSummaryList, resetCustomerSummaryDetailUiState, saveCustomerSummaryDetail, updateCustomerAllTransactionsTabData, updateCustomerDetailSelectedTab, updateCustomerSummaryRevenueSelection, updateCustomerSummaryScrollYOffset, updateCustomerSummarySortUiState, updateCustomerTrendFilter, } from './view/customerSummaryView/customerSummaryViewReducer';
1279
1280
  export { getCustomerSummaryAllTransactionsTabData, getCustomerSummaryDetail, getCustomerSummaryList, getCustomerSummarySelectedTabType, getCustomerSummaryTrendFilter, isCustomersTabVisible, } from './view/customerSummaryView/customerSummaryViewSelector';
package/lib/index.js CHANGED
@@ -86,8 +86,8 @@ exports.startInvoicingMigration = exports.rollbackInvoicingMigration = exports.r
86
86
  exports.updateInvoicingTransactionFilters = exports.setInvoicingTransactionActiveTab = exports.fetchInvoicingTransactionListPage = exports.fetchInvoicingTransactionList = exports.updateInvoicingTransactions = exports.removeInvoicingTransaction = exports.getInvoicingSubscriptionById = exports.fetchInvoicingSubscriptionDetailPage = exports.fetchInvoicingSubscriptionDetail = exports.getInvoicingSubscriptionListView = exports.INVOICING_SUBSCRIPTION_COLUMNS = exports.ALL_INVOICING_SUBSCRIPTION_TAB_IDS = exports.ALL_INVOICING_SUBSCRIPTION_SORT_KEYS = exports.updateInvoicingSubscriptionFilters = exports.setInvoicingSubscriptionActiveTab = exports.fetchInvoicingSubscriptionListPage = exports.fetchInvoicingSubscriptionList = exports.fetchInvoicingSubscriptionCounts = exports.updateInvoicingSubscriptions = exports.removeInvoicingSubscription = exports.resetPromotionalCreditAction = exports.submitAddPromotionalCredits = exports.getInvoicingSetupIntentFetchState = exports.getInvoicingSetupIntent = exports.getInvoicingSentPaymentLinkMagicUrl = exports.getInvoicingSentPaymentLinkEmail = exports.getInvoicingPlaidLinkToken = exports.getInvoicingPaymentMethodSaveState = exports.getInvoicingPaymentLinkSendState = exports.sendInvoicingPaymentLink = exports.saveInvoicingPaymentMethod = exports.resetInvoicingCustomerPaymentMethod = exports.fetchInvoicingPlaidLinkToken = exports.createInvoicingSetupIntent = exports.fetchInvoicingPaymentLinkEmailPreviewPage = exports.fetchInvoicingCustomerDetailPage = exports.fetchInvoicingCustomerDetail = exports.getInvoicingCustomerListView = exports.INVOICING_CUSTOMER_COLUMNS = exports.ALL_INVOICING_CUSTOMER_TAB_IDS = exports.ALL_INVOICING_CUSTOMER_SORT_KEYS = exports.updateInvoicingCustomerFilters = exports.setInvoicingCustomerActiveTab = exports.fetchInvoicingCustomerListPage = exports.fetchInvoicingCustomerList = exports.fetchInvoicingCustomerCounts = exports.updateInvoicingCustomers = exports.removeInvoicingCustomer = exports.INVOICING_LIST_PAGE_SIZE = exports.uploadInvoicingMigrationFiles = void 0;
87
87
  exports.INVOICING_DUNNING_CASE_COLUMNS = exports.ALL_INVOICING_DUNNING_CASE_TAB_IDS = exports.ALL_INVOICING_DUNNING_CASE_SORT_KEYS = exports.updateInvoicingDunningCaseFilters = exports.setInvoicingDunningCaseActiveTab = exports.fetchInvoicingDunningCaseListPage = exports.fetchInvoicingDunningCaseList = exports.fetchInvoicingDunningCaseCounts = exports.updateInvoicingDunningCases = exports.removeInvoicingDunningCase = exports.fetchInvoicingCouponDetail = exports.getInvoicingCouponById = exports.getInvoicingCouponListView = exports.getInvoicingCouponListNextCursor = exports.getInvoicingCouponListItems = exports.getInvoicingCouponListHasMore = exports.getInvoicingCouponListFilters = exports.getInvoicingCouponListFetchState = exports.getInvoicingCouponCounts = exports.INVOICING_COUPON_COLUMNS = exports.ALL_INVOICING_COUPON_TAB_IDS = exports.ALL_INVOICING_COUPON_SORT_KEYS = exports.updateInvoicingCouponFilters = exports.setInvoicingCouponActiveTab = exports.fetchInvoicingCouponListPage = exports.fetchInvoicingCouponList = exports.fetchInvoicingCouponCounts = exports.updateInvoicingCoupons = exports.removeInvoicingCoupon = exports.getInvoicingCreditNoteDetail = exports.getInvoicingCreditNoteById = exports.fetchInvoicingCreditNoteDetail = exports.getInvoicingCreditNoteListView = exports.INVOICING_CREDIT_NOTE_COLUMNS = exports.ALL_INVOICING_CREDIT_NOTE_TAB_IDS = exports.ALL_INVOICING_CREDIT_NOTE_SORT_KEYS = exports.updateInvoicingCreditNoteFilters = exports.setInvoicingCreditNoteActiveTab = exports.fetchInvoicingCreditNoteListPage = exports.fetchInvoicingCreditNoteList = exports.fetchInvoicingCreditNoteCounts = exports.updateInvoicingCreditNotes = exports.removeInvoicingCreditNote = exports.getInvoicingTransactionDetail = exports.getInvoicingTransactionById = exports.fetchInvoicingTransactionDetail = exports.getInvoicingTransactionListView = exports.INVOICING_TRANSACTION_COLUMNS = exports.ALL_INVOICING_TRANSACTION_TAB_IDS = exports.ALL_INVOICING_TRANSACTION_SORT_KEYS = void 0;
88
88
  exports.fetchInvoicingQboSyncHealth = exports.fetchInvoicingQboConnection = exports.fetchInvoicingAccountingPickers = exports.isStripeConnectedFromSettings = exports.initialInvoicingBrandingFormLocalData = exports.entityToInvoicingBrandingFormLocalData = exports.INVOICING_BUSINESS_ADDRESS_TYPE = exports.invoicingQboSettingsLocalDataToPayload = exports.initialInvoicingQboSettingsLocalData = exports.entityToInvoicingQboSettingsLocalData = exports.getInvoicingSettingsView = exports.getInvoicingSettingsHubView = exports.getInvoicingSettingsFetchState = exports.getInvoicingSettings = exports.getInvoicingQboSettingsFormView = exports.getInvoicingBrandingFormView = exports.updateInvoicingSettings = exports.updateInvoicingQboSettingsDraft = exports.updateInvoicingBrandingFormDraft = exports.submitInvoicingQboSettings = exports.submitInvoicingBrandingForm = exports.saveInvoicingSettings = exports.resetSaveInvoicingSettings = exports.resetInvoicingQboSettingsDraft = exports.resetInvoicingBrandingFormDraft = exports.fetchInvoicingSettings = exports.disconnectInvoicingStripe = exports.connectInvoicingStripe = exports.getLowestInvoicingCatalogPricePointAmount = exports.getInvoicingCatalogItemById = exports.fetchInvoicingCatalogItemDetail = exports.getInvoicingCatalogListView = exports.updateInvoicingCatalogProductFilters = exports.updateInvoicingCatalogPlanFilters = exports.fetchInvoicingCatalogProductList = exports.fetchInvoicingCatalogPlanList = exports.fetchInvoicingCatalogListPage = exports.fetchInvoicingCatalogCounts = exports.updateInvoicingCatalogItems = exports.removeInvoicingCatalogItem = exports.mergeInvoicingCatalogPricePoint = exports.getInvoicingDunningEmailPreview = exports.getInvoicingDunningCaseDetail = exports.getInvoicingDunningCaseById = exports.invalidateInvoicingDunningEmailPreview = exports.fetchInvoicingDunningEmailPreviewPage = exports.fetchInvoicingDunningCaseDetailPage = exports.fetchInvoicingDunningCaseDetail = exports.clearInvoicingDunningCaseDetailView = exports.getInvoicingDunningCaseListView = void 0;
89
- exports.getCustomerSummaryTrendFilter = exports.getCustomerSummarySelectedTabType = exports.getCustomerSummaryList = exports.getCustomerSummaryDetail = exports.getCustomerSummaryAllTransactionsTabData = exports.updateCustomerTrendFilter = exports.updateCustomerSummarySortUiState = exports.updateCustomerSummaryScrollYOffset = exports.updateCustomerSummaryRevenueSelection = exports.updateCustomerDetailSelectedTab = exports.updateCustomerAllTransactionsTabData = exports.saveCustomerSummaryDetail = exports.resetCustomerSummaryDetailUiState = exports.fetchCustomerSummaryList = exports.fetchCustomerSummaryDetail = exports.isPendingReviewAccrual = exports.isManuallyReversedAccrual = exports.isAutoReversedAccrual = exports.getExpenseAutomationActualMatchingView = exports.getExpenseAutomationActualMatchingMatchView = exports.parseActualMatchingMatchId = exports.getCloseMatchAfterUndoMatchId = exports.getCloseMatchAfterUndo = exports.getCloseMatchAfterIgnoreMatchId = exports.getActualMatchingMatchModalConfirmStatus = exports.getActualMatchingReversalDate = exports.getActualMatchingAmount = exports.isPendingReviewRow = exports.isRenderableOneTimeAccrual = exports.isOneTimeAccrualRow = exports.isExistingTabRow = exports.isAiAccountantSchedule = exports.isAccruedScheduleRow = exports.getJEScheduleRowType = exports.getExpenseAutomationJEOneTimeAccrualDetailView = exports.getInvoicingOnboardingGateView = exports.getInvoicingConfigView = exports.updateInvoicingConfig = exports.resetInvoicingConfigActionStates = exports.fetchInvoicingConfig = exports.enableInvoicing = exports.acceptInvoicingTerms = exports.toInvoicingQboCustomerMatchingMode = exports.toInvoicingNamedOptionsByKey = exports.getInvoicingQboAccountMappingId = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.getInvoicingQboView = exports.invoicingAccountsForQboAccountTypes = exports.startInvoicingQboBackfill = exports.retryInvoicingQboSyncTask = void 0;
90
- exports.CUSTOMER_REVENUE_KEYS = exports.isCustomersTabVisible = void 0;
89
+ exports.getCustomerSummarySelectedTabType = exports.getCustomerSummaryList = exports.getCustomerSummaryDetail = exports.getCustomerSummaryAllTransactionsTabData = exports.updateCustomerTrendFilter = exports.updateCustomerSummarySortUiState = exports.updateCustomerSummaryScrollYOffset = exports.updateCustomerSummaryRevenueSelection = exports.updateCustomerDetailSelectedTab = exports.updateCustomerAllTransactionsTabData = exports.saveCustomerSummaryDetail = exports.resetCustomerSummaryDetailUiState = exports.fetchCustomerSummaryList = exports.fetchCustomerSummaryDetail = exports.actualMatchingRowKey = exports.isPendingReviewAccrual = exports.isManuallyReversedAccrual = exports.isAutoReversedAccrual = exports.getExpenseAutomationActualMatchingView = exports.getExpenseAutomationActualMatchingMatchView = exports.parseActualMatchingMatchId = exports.getCloseMatchAfterUndoMatchId = exports.getCloseMatchAfterUndo = exports.getCloseMatchAfterIgnoreMatchId = exports.getActualMatchingMatchModalConfirmStatus = exports.getActualMatchingReversalDate = exports.getActualMatchingAmount = exports.isPendingReviewRow = exports.isRenderableOneTimeAccrual = exports.isOneTimeAccrualRow = exports.isExistingTabRow = exports.isAiAccountantSchedule = exports.isAccruedScheduleRow = exports.getJEScheduleRowType = exports.getExpenseAutomationJEOneTimeAccrualDetailView = exports.getInvoicingOnboardingGateView = exports.getInvoicingConfigView = exports.updateInvoicingConfig = exports.resetInvoicingConfigActionStates = exports.fetchInvoicingConfig = exports.enableInvoicing = exports.acceptInvoicingTerms = exports.toInvoicingQboCustomerMatchingMode = exports.toInvoicingNamedOptionsByKey = exports.getInvoicingQboAccountMappingId = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.getInvoicingQboView = exports.invoicingAccountsForQboAccountTypes = exports.startInvoicingQboBackfill = exports.retryInvoicingQboSyncTask = void 0;
90
+ exports.CUSTOMER_REVENUE_KEYS = exports.isCustomersTabVisible = exports.getCustomerSummaryTrendFilter = void 0;
91
91
  const allowedValue_1 = require("./commonStateTypes/allowedValue");
92
92
  Object.defineProperty(exports, "isAllowedValueWithCode", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithCode; } });
93
93
  Object.defineProperty(exports, "isAllowedValueWithID", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithID; } });
@@ -3297,6 +3297,8 @@ Object.defineProperty(exports, "getExpenseAutomationActualMatchingView", { enume
3297
3297
  Object.defineProperty(exports, "isAutoReversedAccrual", { enumerable: true, get: function () { return actualMatchingViewSelector_1.isAutoReversedAccrual; } });
3298
3298
  Object.defineProperty(exports, "isManuallyReversedAccrual", { enumerable: true, get: function () { return actualMatchingViewSelector_1.isManuallyReversedAccrual; } });
3299
3299
  Object.defineProperty(exports, "isPendingReviewAccrual", { enumerable: true, get: function () { return actualMatchingViewSelector_1.isPendingReviewAccrual; } });
3300
+ var actualMatchingTypes_1 = require("./entity/actualMatching/actualMatchingTypes");
3301
+ Object.defineProperty(exports, "actualMatchingRowKey", { enumerable: true, get: function () { return actualMatchingTypes_1.actualMatchingRowKey; } });
3300
3302
  var customerSummaryViewReducer_1 = require("./view/customerSummaryView/customerSummaryViewReducer");
3301
3303
  Object.defineProperty(exports, "fetchCustomerSummaryDetail", { enumerable: true, get: function () { return customerSummaryViewReducer_1.fetchCustomerSummaryDetail; } });
3302
3304
  Object.defineProperty(exports, "fetchCustomerSummaryList", { enumerable: true, get: function () { return customerSummaryViewReducer_1.fetchCustomerSummaryList; } });
@@ -4,6 +4,7 @@ exports.fetchActualMatchingEpic = void 0;
4
4
  const rxjs_1 = require("rxjs");
5
5
  const operators_1 = require("rxjs/operators");
6
6
  const actualMatchingReducer_1 = require("../../../../../entity/actualMatching/actualMatchingReducer");
7
+ const actualMatchingTypes_1 = require("../../../../../entity/actualMatching/actualMatchingTypes");
7
8
  const responsePayload_1 = require("../../../../../responsePayload");
8
9
  const rootActions_1 = require("../../../../../rootActions");
9
10
  const actualMatchingPayload_1 = require("../../../payload/actualMatchingPayload");
@@ -29,7 +30,7 @@ const fetchActualMatchingEpic = (actions$, state$, zeniAPI) => actions$.pipe((0,
29
30
  updateActions.push((0, actualMatchingReducer_1.updateActualMatchingMatches)(matches, (0, actualMatchingViewSelector_1.getTenantDisplayCurrency)(state)));
30
31
  }
31
32
  updateActions.push((0, actualMatchingViewReducer_1.fetchActualMatchingSuccess)({
32
- matchIds: matches.map((match) => match.match_id),
33
+ matchIds: matches.map((match) => (0, actualMatchingTypes_1.actualMatchingRowKey)(match.match_id, match.match_batch_id, match.suggestion_key)),
33
34
  selectedPeriod: requestPeriod,
34
35
  refreshViewInBackground,
35
36
  }));
@@ -9,29 +9,44 @@ const rootActions_1 = require("../../../../../rootActions");
9
9
  const actualMatchingViewReducer_1 = require("../../../reducers/actualMatchingViewReducer");
10
10
  const actualMatchingViewSelector_1 = require("../../../selectors/actualMatchingViewSelector");
11
11
  const fetchActualMatchingMatchEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(actualMatchingViewReducer_1.fetchActualMatchingMatch.match), (0, operators_1.mergeMap)((action) => {
12
- const { matchId, refreshViewInBackground } = action.payload;
12
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground } = action.payload;
13
+ const detailQuery = new URLSearchParams();
14
+ if (matchBatchId != null && matchBatchId !== '') {
15
+ detailQuery.set('batch_id', matchBatchId);
16
+ }
17
+ else if (suggestionKey != null && suggestionKey !== '') {
18
+ detailQuery.set('suggestion_key', suggestionKey);
19
+ }
20
+ const encodedQuery = detailQuery.toString();
21
+ const batchQuery = encodedQuery === '' ? '' : `?${encodedQuery}`;
13
22
  return zeniAPI
14
- .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accruals/actual-matching/${encodeURIComponent(matchId)}`)
23
+ .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accruals/actual-matching/${encodeURIComponent(matchId)}${batchQuery}`)
15
24
  .pipe((0, operators_1.mergeMap)((response) => {
16
25
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
17
26
  return (0, rxjs_1.from)([
18
27
  (0, actualMatchingReducer_1.updateActualMatchingMatches)([response.data], (0, actualMatchingViewSelector_1.getTenantDisplayCurrency)(state$.value)),
19
28
  (0, actualMatchingViewReducer_1.fetchActualMatchingMatchSuccess)({
29
+ suggestionKey,
20
30
  matchId,
31
+ matchBatchId,
21
32
  refreshViewInBackground,
22
33
  }),
23
34
  ]);
24
35
  }
25
36
  return (0, rxjs_1.from)([
26
37
  (0, actualMatchingViewReducer_1.fetchActualMatchingMatchFailure)({
38
+ suggestionKey,
27
39
  matchId,
40
+ matchBatchId,
28
41
  refreshViewInBackground,
29
42
  status: response.status,
30
43
  }),
31
44
  ]);
32
45
  }), (0, operators_1.catchError)((error) => (0, rxjs_1.from)([
33
46
  (0, actualMatchingViewReducer_1.fetchActualMatchingMatchFailure)({
47
+ suggestionKey,
34
48
  matchId,
49
+ matchBatchId,
35
50
  refreshViewInBackground,
36
51
  status: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', `Fetch actual matching match REST API call errored out ${JSON.stringify(error)}`),
37
52
  }),
@@ -59,8 +59,12 @@ function matchAndReverseHttpFailSnackbar(vendorName) {
59
59
  });
60
60
  }
61
61
  function matchVendorName(state, matchId) {
62
- return ((0, actualMatchingSelector_1.getActualMatchingMatchById)(state.actualMatchingState, matchId)
63
- ?.vendorName ?? '');
62
+ const stored = (0, actualMatchingSelector_1.getActualMatchingMatchById)(state.actualMatchingState, matchId);
63
+ if (stored?.vendorName != null && stored.vendorName !== '') {
64
+ return stored.vendorName;
65
+ }
66
+ const sameBill = Object.values(state.actualMatchingState.byMatchId).find((match) => match.matchId === matchId);
67
+ return sameBill?.vendorName ?? '';
64
68
  }
65
69
  const matchAndReverseAccrualsEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(actualMatchingViewReducer_1.matchAndReverseAccruals.match),
66
70
  // Per-match exhaust: a second click on the same match drops while HTTP is in
@@ -99,7 +103,7 @@ const matchAndReverseAccrualsEpic = (actions$, state$, zeniAPI) => actions$.pipe
99
103
  // List + detail: list can omit leftovers; detail GET always
100
104
  // writes intended occupancy so leftover retry can join C
101
105
  // onto the occupied bill instead of a stale cached row.
102
- successActions.push(...(0, refreshActualMatchingList_1.refreshActualMatchingList)(state$.value), (0, actualMatchingViewReducer_1.fetchActualMatchingMatch)(matchId, true));
106
+ successActions.push(...(0, refreshActualMatchingList_1.refreshActualMatchingList)(state$.value), (0, actualMatchingViewReducer_1.fetchActualMatchingMatch)(matchId, true, response.data.match_batch_id));
103
107
  }
104
108
  const snackbar = matchAndReverseSnackbar(results, vendorName);
105
109
  if (snackbar != null) {
@@ -4,6 +4,7 @@ exports.undoReversalAccrualsEpic = void 0;
4
4
  const rxjs_1 = require("rxjs");
5
5
  const operators_1 = require("rxjs/operators");
6
6
  const actualMatchingSelector_1 = require("../../../../../entity/actualMatching/actualMatchingSelector");
7
+ const actualMatchingTypes_1 = require("../../../../../entity/actualMatching/actualMatchingTypes");
7
8
  const snackbarReducer_1 = require("../../../../../entity/snackbar/snackbarReducer");
8
9
  const responsePayload_1 = require("../../../../../responsePayload");
9
10
  const rootActions_1 = require("../../../../../rootActions");
@@ -40,41 +41,45 @@ function undoReversalSnackbar(results, vendorName) {
40
41
  variables,
41
42
  });
42
43
  }
43
- function matchVendorName(state, matchId) {
44
- return ((0, actualMatchingSelector_1.getActualMatchingMatchById)(state.actualMatchingState, matchId)?.vendorName ??
44
+ function matchVendorName(state, matchId, matchBatchId) {
45
+ const rowKey = (0, actualMatchingTypes_1.actualMatchingRowKey)(matchId, matchBatchId);
46
+ return ((0, actualMatchingSelector_1.getActualMatchingMatchById)(state.actualMatchingState, rowKey)?.vendorName ??
47
+ (0, actualMatchingSelector_1.getActualMatchingMatchById)(state.actualMatchingState, matchId)?.vendorName ??
45
48
  '');
46
49
  }
47
50
  const undoReversalAccrualsEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(actualMatchingViewReducer_1.undoReversalAccruals.match),
48
51
  // Per-match exhaust: a second click on the same match drops while HTTP is in
49
52
  // flight. A different match must still run — a global exhaustMap left the
50
53
  // other match's reducer In-Progress with no request.
51
- (0, operators_1.groupBy)((action) => action.payload.matchId), (0, operators_1.mergeMap)((perMatch$) => perMatch$.pipe((0, operators_1.exhaustMap)((action) => {
52
- const { accrualIds, matchId } = action.payload;
54
+ (0, operators_1.groupBy)((action) => (0, actualMatchingTypes_1.actualMatchingRowKey)(action.payload.matchId, action.payload.matchBatchId)), (0, operators_1.mergeMap)((perMatch$) => perMatch$.pipe((0, operators_1.exhaustMap)((action) => {
55
+ const { accrualIds, matchId, matchBatchId } = action.payload;
53
56
  const body = {
54
57
  accrual_ids: accrualIds,
55
58
  };
56
- const vendorName = matchVendorName(state$.value, matchId);
59
+ const vendorName = matchVendorName(state$.value, matchId, matchBatchId);
57
60
  return zeniAPI
58
61
  .postAndGetJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accruals/undo-reversal`, body)
59
62
  .pipe((0, operators_1.mergeMap)((response) => {
60
63
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
61
64
  const results = response.data.results.map(actualMatchingPayload_1.toUndoReversalResult);
62
65
  const successActions = [
63
- (0, actualMatchingViewReducer_1.undoReversalAccrualsSuccess)(matchId, results),
66
+ (0, actualMatchingViewReducer_1.undoReversalAccrualsSuccess)(matchId, results, matchBatchId),
64
67
  ];
65
68
  const anyUndone = results.some((result) => result.status === 'undone');
66
69
  if (anyUndone) {
67
- successActions.push(...(0, refreshActualMatchingList_1.refreshActualMatchingList)(state$.value), (0, actualMatchingViewReducer_1.fetchActualMatchingMatch)(matchId, true));
70
+ successActions.push(...(0, refreshActualMatchingList_1.refreshActualMatchingList)(state$.value), (0, actualMatchingViewReducer_1.fetchActualMatchingMatch)(matchId, true, matchBatchId));
68
71
  }
69
72
  successActions.push(undoReversalSnackbar(results, vendorName));
70
73
  return (0, rxjs_1.from)(successActions);
71
74
  }
72
75
  return (0, rxjs_1.of)((0, actualMatchingViewReducer_1.undoReversalAccrualsFailure)({
73
76
  matchId,
77
+ matchBatchId,
74
78
  status: response.status,
75
79
  }), undoReversalSnackbar([], vendorName));
76
80
  }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, actualMatchingViewReducer_1.undoReversalAccrualsFailure)({
77
81
  matchId,
82
+ matchBatchId,
78
83
  status: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Undo reversal accruals REST API call errored out' +
79
84
  JSON.stringify(error)),
80
85
  }), undoReversalSnackbar([], vendorName))), (0, operators_1.takeUntil)(actions$.pipe((0, operators_1.filter)(rootActions_1.clearAll.match))));
@@ -14,16 +14,22 @@ export declare const ackCloseMatchAfterIgnore: import("@reduxjs/toolkit").Action
14
14
  refreshViewInBackground: boolean;
15
15
  selectedPeriod: MonthYearPeriod;
16
16
  status: ZeniAPIStatus;
17
- }, "expenseAutomationActualMatchingView/fetchActualMatchingFailure">, fetchActualMatchingMatch: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[matchId: string, refreshViewInBackground?: any], {
17
+ }, "expenseAutomationActualMatchingView/fetchActualMatchingFailure">, fetchActualMatchingMatch: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[matchId: string, refreshViewInBackground?: any, matchBatchId?: string | undefined, suggestionKey?: string | undefined], {
18
+ suggestionKey: string | undefined;
19
+ matchBatchId: string | undefined;
18
20
  matchId: string;
19
21
  refreshViewInBackground: any;
20
22
  }, "expenseAutomationActualMatchingView/fetchActualMatchingMatch", never, never>, fetchActualMatchingMatchFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
21
23
  matchId: ActualMatchingMatchId;
22
24
  refreshViewInBackground: boolean;
23
25
  status: ZeniAPIStatus;
26
+ matchBatchId?: string;
27
+ suggestionKey?: string;
24
28
  }, "expenseAutomationActualMatchingView/fetchActualMatchingMatchFailure">, fetchActualMatchingMatchSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
25
29
  matchId: ActualMatchingMatchId;
26
30
  refreshViewInBackground: boolean;
31
+ matchBatchId?: string;
32
+ suggestionKey?: string;
27
33
  }, "expenseAutomationActualMatchingView/fetchActualMatchingMatchSuccess">, fetchActualMatchingPage: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[period: TimePeriod, refreshViewInBackground?: any], {
28
34
  period: TimePeriod;
29
35
  refreshViewInBackground: any;
@@ -76,15 +82,18 @@ export declare const ackCloseMatchAfterIgnore: import("@reduxjs/toolkit").Action
76
82
  append: boolean;
77
83
  nextPageToken: string | null;
78
84
  results: ActualMatchingTransactionSearchResult[];
79
- }, "expenseAutomationActualMatchingView/searchMatchTransactionsSuccess">, undoReversalAccruals: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[matchId: string, accrualIds: string[]], {
85
+ }, "expenseAutomationActualMatchingView/searchMatchTransactionsSuccess">, undoReversalAccruals: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[matchId: string, accrualIds: string[], matchBatchId?: string | undefined], {
80
86
  matchId: string;
81
87
  accrualIds: string[];
88
+ matchBatchId: string | undefined;
82
89
  }, "expenseAutomationActualMatchingView/undoReversalAccruals", never, never>, undoReversalAccrualsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
83
90
  matchId: ActualMatchingMatchId;
84
91
  status: ZeniAPIStatus;
85
- }, "expenseAutomationActualMatchingView/undoReversalAccrualsFailure">, undoReversalAccrualsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[matchId: string, results: UndoReversalResult[]], {
92
+ matchBatchId?: string;
93
+ }, "expenseAutomationActualMatchingView/undoReversalAccrualsFailure">, undoReversalAccrualsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[matchId: string, results: UndoReversalResult[], matchBatchId?: string | undefined], {
86
94
  matchId: string;
87
95
  results: UndoReversalResult[];
96
+ matchBatchId: string | undefined;
88
97
  }, "expenseAutomationActualMatchingView/undoReversalAccrualsSuccess", never, never>, updateActualMatchingUIState: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<ActualMatchingViewUIState>, "expenseAutomationActualMatchingView/updateActualMatchingUIState">;
89
98
  declare const _default: import("redux").Reducer<ActualMatchingViewState>;
90
99
  export default _default;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.updateActualMatchingUIState = exports.undoReversalAccrualsSuccess = exports.undoReversalAccrualsFailure = exports.undoReversalAccruals = exports.searchMatchTransactionsSuccess = exports.searchMatchTransactionsFailure = exports.searchMatchTransactions = exports.searchMatchAccrualsSuccess = exports.searchMatchAccrualsFailure = exports.searchMatchAccruals = exports.openMatchNewModal = exports.matchAndReverseAccrualsSuccess = exports.matchAndReverseAccrualsFailure = exports.matchAndReverseAccruals = exports.ignoreActualMatchingSuggestionSuccess = exports.ignoreActualMatchingSuggestionFailure = exports.ignoreActualMatchingSuggestion = exports.fetchActualMatchingSuccess = exports.fetchActualMatchingPage = exports.fetchActualMatchingMatchSuccess = exports.fetchActualMatchingMatchFailure = exports.fetchActualMatchingMatch = exports.fetchActualMatchingFailure = exports.fetchActualMatching = exports.closeMatchNewModal = exports.clearMatchNewModal = exports.clearActualMatchingView = exports.ackCloseMatchAfterUndo = exports.ackCloseMatchAfterIgnore = exports.initialState = exports.initialMatchModalState = exports.initialAccrualSearchState = exports.initialTransactionSearchState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
7
+ const actualMatchingTypes_1 = require("../../../entity/actualMatching/actualMatchingTypes");
7
8
  const jeScheduleHelper_1 = require("../../../entity/jeSchedules/jeScheduleHelper");
8
9
  const responsePayload_1 = require("../../../responsePayload");
9
10
  const rootActions_1 = require("../../../rootActions");
@@ -187,19 +188,22 @@ const expenseAutomationActualMatchingView = (0, toolkit_1.createSlice)({
187
188
  }
188
189
  },
189
190
  fetchActualMatchingMatch: {
190
- prepare(matchId, refreshViewInBackground = false) {
191
- return { payload: { matchId, refreshViewInBackground } };
191
+ prepare(matchId, refreshViewInBackground = false, matchBatchId, suggestionKey) {
192
+ return {
193
+ payload: { suggestionKey, matchBatchId, matchId, refreshViewInBackground },
194
+ };
192
195
  },
193
196
  reducer(draft, action) {
194
- const { matchId, refreshViewInBackground } = action.payload;
197
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground } = action.payload;
198
+ const rowKey = (0, actualMatchingTypes_1.actualMatchingRowKey)(matchId, matchBatchId, suggestionKey);
195
199
  if (refreshViewInBackground) {
196
- draft.detailRefreshStatusByMatchId[matchId] = {
200
+ draft.detailRefreshStatusByMatchId[rowKey] = {
197
201
  fetchState: 'In-Progress',
198
202
  error: undefined,
199
203
  };
200
204
  }
201
205
  else {
202
- draft.detailFetchStateByMatchId[matchId] = {
206
+ draft.detailFetchStateByMatchId[rowKey] = {
203
207
  fetchState: 'In-Progress',
204
208
  error: undefined,
205
209
  };
@@ -207,30 +211,32 @@ const expenseAutomationActualMatchingView = (0, toolkit_1.createSlice)({
207
211
  },
208
212
  },
209
213
  fetchActualMatchingMatchSuccess(draft, action) {
210
- const { matchId, refreshViewInBackground } = action.payload;
214
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground } = action.payload;
215
+ const rowKey = (0, actualMatchingTypes_1.actualMatchingRowKey)(matchId, matchBatchId, suggestionKey);
211
216
  if (refreshViewInBackground) {
212
- draft.detailRefreshStatusByMatchId[matchId] = {
217
+ draft.detailRefreshStatusByMatchId[rowKey] = {
213
218
  fetchState: 'Completed',
214
219
  error: undefined,
215
220
  };
216
221
  }
217
222
  else {
218
- draft.detailFetchStateByMatchId[matchId] = {
223
+ draft.detailFetchStateByMatchId[rowKey] = {
219
224
  fetchState: 'Completed',
220
225
  error: undefined,
221
226
  };
222
227
  }
223
228
  },
224
229
  fetchActualMatchingMatchFailure(draft, action) {
225
- const { matchId, refreshViewInBackground, status } = action.payload;
230
+ const { suggestionKey, matchBatchId, matchId, refreshViewInBackground, status } = action.payload;
231
+ const rowKey = (0, actualMatchingTypes_1.actualMatchingRowKey)(matchId, matchBatchId, suggestionKey);
226
232
  if (refreshViewInBackground) {
227
- draft.detailRefreshStatusByMatchId[matchId] = {
233
+ draft.detailRefreshStatusByMatchId[rowKey] = {
228
234
  fetchState: 'Error',
229
235
  error: status,
230
236
  };
231
237
  }
232
238
  else {
233
- draft.detailFetchStateByMatchId[matchId] = {
239
+ draft.detailFetchStateByMatchId[rowKey] = {
234
240
  fetchState: 'Error',
235
241
  error: status,
236
242
  };
@@ -421,40 +427,42 @@ const expenseAutomationActualMatchingView = (0, toolkit_1.createSlice)({
421
427
  },
422
428
  undoReversalAccruals: {
423
429
  reducer(draft, action) {
424
- draft.undoReversalStatusByMatchId[action.payload.matchId] = {
430
+ const rowKey = (0, actualMatchingTypes_1.actualMatchingRowKey)(action.payload.matchId, action.payload.matchBatchId);
431
+ draft.undoReversalStatusByMatchId[rowKey] = {
425
432
  fetchState: 'In-Progress',
426
433
  error: undefined,
427
434
  };
428
435
  },
429
- prepare(matchId, accrualIds) {
430
- return { payload: { matchId, accrualIds } };
436
+ prepare(matchId, accrualIds, matchBatchId) {
437
+ return { payload: { matchId, accrualIds, matchBatchId } };
431
438
  },
432
439
  },
433
440
  undoReversalAccrualsSuccess: {
434
441
  reducer(draft, action) {
435
- const { matchId, results } = action.payload;
436
- draft.undoReversalStatusByMatchId[matchId] = {
442
+ const { matchId, matchBatchId, results } = action.payload;
443
+ const rowKey = (0, actualMatchingTypes_1.actualMatchingRowKey)(matchId, matchBatchId);
444
+ draft.undoReversalStatusByMatchId[rowKey] = {
437
445
  fetchState: 'Completed',
438
446
  error: undefined,
439
447
  };
440
448
  const allUndone = results.length > 0 &&
441
449
  results.every((result) => result.status === 'undone');
442
450
  if (allUndone) {
443
- enqueueCloseMatchId(draft.closeMatchAfterUndoMatchIds, matchId);
451
+ enqueueCloseMatchId(draft.closeMatchAfterUndoMatchIds, rowKey);
444
452
  }
445
453
  else {
446
- draft.closeMatchAfterUndoMatchIds = dropCloseMatchId(draft.closeMatchAfterUndoMatchIds, matchId);
454
+ draft.closeMatchAfterUndoMatchIds = dropCloseMatchId(draft.closeMatchAfterUndoMatchIds, rowKey);
447
455
  }
448
456
  pruneLastMatchResultsForUndone(draft, matchId, results);
449
457
  if (allUndone) {
450
- delete draft.lastUndoResultsByMatchId[matchId];
458
+ delete draft.lastUndoResultsByMatchId[rowKey];
451
459
  }
452
460
  else {
453
- draft.lastUndoResultsByMatchId[matchId] = results;
461
+ draft.lastUndoResultsByMatchId[rowKey] = results;
454
462
  }
455
463
  },
456
- prepare(matchId, results) {
457
- return { payload: { matchId, results } };
464
+ prepare(matchId, results, matchBatchId) {
465
+ return { payload: { matchId, results, matchBatchId } };
458
466
  },
459
467
  },
460
468
  ackCloseMatchAfterUndo(draft) {
@@ -498,7 +506,8 @@ const expenseAutomationActualMatchingView = (0, toolkit_1.createSlice)({
498
506
  draft.closeMatchAfterIgnoreMatchIds.shift();
499
507
  },
500
508
  undoReversalAccrualsFailure(draft, action) {
501
- draft.undoReversalStatusByMatchId[action.payload.matchId] = {
509
+ const rowKey = (0, actualMatchingTypes_1.actualMatchingRowKey)(action.payload.matchId, action.payload.matchBatchId);
510
+ draft.undoReversalStatusByMatchId[rowKey] = {
502
511
  fetchState: 'Error',
503
512
  error: action.payload.status,
504
513
  };
@@ -23,9 +23,11 @@ export interface ActualMatchingRow extends JEOneTimeAccrual {
23
23
  groupedMembers?: ActualMatchingGroupedAccrual[];
24
24
  intendedAccrualIds?: ID[];
25
25
  leftovers?: ActualMatchingLeftoverAccrual[];
26
+ matchBatchId?: string;
26
27
  matchShape?: string;
27
28
  matchTier?: string;
28
29
  reversalDate?: ZeniDate;
30
+ suggestionKey?: string;
29
31
  transactionDate?: string;
30
32
  transactionType?: string;
31
33
  }
@@ -152,7 +152,9 @@ function toActualMatchingRow(match) {
152
152
  ];
153
153
  return {
154
154
  ...first,
155
+ suggestionKey: match.suggestionKey,
155
156
  matchId: match.matchId,
157
+ matchBatchId: match.matchBatchId,
156
158
  kind: match.kind,
157
159
  accruedAmount: match.accruedAmount,
158
160
  actualAmount: match.actualAmount,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.3.13",
3
+ "version": "5.3.14-beta1MM",
4
4
  "description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",