@zeniai/client-epic-state 5.0.65-betaML2 → 5.0.65-betaRR1

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 (115) hide show
  1. package/lib/entity/aiCfo/aiCfoPayload.d.ts +135 -1
  2. package/lib/entity/aiCfo/aiCfoReducer.js +111 -2
  3. package/lib/entity/aiCfo/aiCfoState.d.ts +141 -4
  4. package/lib/entity/aiCfo/aiCfoState.js +10 -1
  5. package/lib/entity/cardPolicy/cardPolicyPayload.d.ts +171 -0
  6. package/lib/entity/cardPolicy/cardPolicyPayload.js +112 -0
  7. package/lib/entity/cardPolicy/cardPolicyReducer.d.ts +13 -0
  8. package/lib/entity/cardPolicy/cardPolicyReducer.js +184 -0
  9. package/lib/entity/cardPolicy/cardPolicySelector.d.ts +28 -0
  10. package/lib/entity/cardPolicy/cardPolicySelector.js +86 -0
  11. package/lib/entity/cardPolicy/cardPolicyState.d.ts +162 -0
  12. package/lib/entity/cardPolicy/cardPolicyState.js +14 -0
  13. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.d.ts +18 -0
  14. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.js +54 -0
  15. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.d.ts +26 -0
  16. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +47 -0
  17. package/lib/entity/tenant/clearAllEpic.d.ts +6 -2
  18. package/lib/entity/tenant/clearAllEpic.js +8 -0
  19. package/lib/epic.d.ts +9 -2
  20. package/lib/epic.js +9 -2
  21. package/lib/esm/entity/aiCfo/aiCfoReducer.js +112 -3
  22. package/lib/esm/entity/aiCfo/aiCfoState.js +7 -0
  23. package/lib/esm/entity/cardPolicy/cardPolicyPayload.js +101 -0
  24. package/lib/esm/entity/cardPolicy/cardPolicyReducer.js +180 -0
  25. package/lib/esm/entity/cardPolicy/cardPolicySelector.js +66 -0
  26. package/lib/esm/entity/cardPolicy/cardPolicyState.js +9 -0
  27. package/lib/esm/entity/cardPolicy/extractPolicyDocumentEpic.js +50 -0
  28. package/lib/esm/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +43 -0
  29. package/lib/esm/entity/tenant/clearAllEpic.js +8 -0
  30. package/lib/esm/epic.js +9 -2
  31. package/lib/esm/index.js +21 -7
  32. package/lib/esm/reducer.js +12 -0
  33. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +1 -21
  34. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +14 -117
  35. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +0 -28
  36. package/lib/esm/view/recommendation/recommendationHelper.js +0 -29
  37. package/lib/esm/view/recommendation/recommendationReducer.js +1 -36
  38. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +70 -0
  39. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +22 -0
  40. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +1 -0
  41. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +44 -0
  42. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +49 -0
  43. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +42 -0
  44. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +72 -0
  45. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +21 -0
  46. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +1 -0
  47. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +46 -0
  48. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +50 -0
  49. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +6 -0
  50. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +1 -0
  51. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +34 -0
  52. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +17 -0
  53. package/lib/esm/view/transactionDetail/transactionDetailReducer.js +1 -110
  54. package/lib/esm/view/transactionDetail/transactionDetailSelector.js +0 -22
  55. package/lib/index.d.ts +20 -8
  56. package/lib/index.js +119 -35
  57. package/lib/reducer.d.ts +12 -0
  58. package/lib/reducer.js +12 -0
  59. package/lib/view/companyHealthMetricView/companyHealthMetricViewSelector.d.ts +1 -1
  60. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +0 -1
  61. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +2 -23
  62. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +1 -14
  63. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +14 -117
  64. package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +0 -2
  65. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +0 -3
  66. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +0 -29
  67. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +0 -1
  68. package/lib/view/onboardingView/cockpitView/types/onboardingCockpitViewTypes.d.ts +1 -1
  69. package/lib/view/people/peopleTypes.d.ts +1 -1
  70. package/lib/view/recommendation/recommendationHelper.d.ts +0 -9
  71. package/lib/view/recommendation/recommendationHelper.js +1 -31
  72. package/lib/view/recommendation/recommendationReducer.d.ts +1 -18
  73. package/lib/view/recommendation/recommendationReducer.js +2 -37
  74. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.d.ts +14 -0
  75. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +74 -0
  76. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.d.ts +21 -0
  77. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +28 -0
  78. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.d.ts +25 -0
  79. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +2 -0
  80. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.d.ts +19 -0
  81. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +48 -0
  82. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.d.ts +18 -0
  83. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +53 -0
  84. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.d.ts +16 -0
  85. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +46 -0
  86. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.d.ts +15 -0
  87. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +76 -0
  88. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.d.ts +21 -0
  89. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +27 -0
  90. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.d.ts +19 -0
  91. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +2 -0
  92. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.d.ts +19 -0
  93. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +50 -0
  94. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.d.ts +12 -0
  95. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +54 -0
  96. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.d.ts +4 -0
  97. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +10 -0
  98. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.d.ts +15 -0
  99. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +2 -0
  100. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.d.ts +8 -0
  101. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +38 -0
  102. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.d.ts +15 -0
  103. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +21 -0
  104. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  105. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +1 -1
  106. package/lib/view/transactionDetail/transactionDetailReducer.d.ts +1 -11
  107. package/lib/view/transactionDetail/transactionDetailReducer.js +2 -111
  108. package/lib/view/transactionDetail/transactionDetailSelector.d.ts +0 -2
  109. package/lib/view/transactionDetail/transactionDetailSelector.js +1 -24
  110. package/lib/view/transactionDetail/transactionDetailTypes.d.ts +0 -1
  111. package/package.json +1 -1
  112. package/lib/esm/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.js +0 -88
  113. package/lib/tsconfig.typecheck.tsbuildinfo +0 -1
  114. package/lib/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.d.ts +0 -9
  115. package/lib/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.js +0 -92
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchCardPolicyListEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const cardPolicyPayload_1 = require("../../../../../entity/cardPolicy/cardPolicyPayload");
7
+ const cardPolicyReducer_1 = require("../../../../../entity/cardPolicy/cardPolicyReducer");
8
+ const responsePayload_1 = require("../../../../../responsePayload");
9
+ const cardPolicyListReducer_1 = require("./cardPolicyListReducer");
10
+ /**
11
+ * `GET /cards/1.0/policy-templates`. On success the response carries
12
+ * both the tenant-wide `stats` block and a `templates[]` array whose
13
+ * rows are wrapped in `{data: {cards_applied, template}}` (the same
14
+ * envelope the create endpoint returns). We split the result into
15
+ * three actions:
16
+ *
17
+ * 1. `updateCardPolicyTemplates` — full replace of the entity map.
18
+ * 2. `updateCardPolicyStats` — entity-level cached stats.
19
+ * 3. `updateCardPolicyListFetchStatus` — view lifecycle + ordered IDs.
20
+ */
21
+ const fetchCardPolicyListEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(cardPolicyListReducer_1.fetchCardPolicyList.match), (0, operators_1.mergeMap)(() => {
22
+ return zeniAPI
23
+ .getJSON(`${zeniAPI.apiEndPoints.cardMicroServiceBaseUrl}/1.0/policy-templates`)
24
+ .pipe((0, operators_1.mergeMap)((response) => {
25
+ if ((0, responsePayload_1.isSuccessStatus)(response) && response.data != null) {
26
+ const templates = (0, cardPolicyPayload_1.toCardPolicyTemplateList)(response.data);
27
+ const stats = (0, cardPolicyPayload_1.toCardPolicyStats)(response.data.stats);
28
+ const actions = [
29
+ (0, cardPolicyReducer_1.updateCardPolicyTemplates)(templates),
30
+ (0, cardPolicyReducer_1.updateCardPolicyStats)(stats),
31
+ (0, cardPolicyListReducer_1.updateCardPolicyListFetchStatus)({
32
+ fetchState: 'Completed',
33
+ templateIds: templates.map((t) => t.templateId),
34
+ }),
35
+ ];
36
+ return (0, rxjs_1.from)(actions);
37
+ }
38
+ else {
39
+ return (0, rxjs_1.of)((0, cardPolicyListReducer_1.updateCardPolicyListFetchStatus)({
40
+ fetchState: 'Error',
41
+ error: response.status,
42
+ }));
43
+ }
44
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, cardPolicyListReducer_1.updateCardPolicyListFetchStatus)({
45
+ fetchState: 'Error',
46
+ error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch card-policy list REST API call errored out' +
47
+ JSON.stringify(error)),
48
+ }))));
49
+ }));
50
+ exports.fetchCardPolicyListEpic = fetchCardPolicyListEpic;
@@ -0,0 +1,12 @@
1
+ import { FetchState, ID } from '../../../../../commonStateTypes/common';
2
+ import { CreateCardPolicyTemplateRequest } from '../../../../../entity/cardPolicy/cardPolicyPayload';
3
+ import { ZeniAPIStatus } from '../../../../../responsePayload';
4
+ import { CreateCardPolicyState } from './createCardPolicyState';
5
+ export declare const initialState: CreateCardPolicyState;
6
+ export declare const createCardPolicyTemplate: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[request: CreateCardPolicyTemplateRequest], CreateCardPolicyTemplateRequest, "createCardPolicy/createCardPolicyTemplate", never, never>, updateCreateCardPolicyTemplateRequestState: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
7
+ fetchState: FetchState;
8
+ error?: ZeniAPIStatus;
9
+ templateId?: ID;
10
+ }, "createCardPolicy/updateCreateCardPolicyTemplateRequestState">, clearCreateCardPolicy: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"createCardPolicy/clearCreateCardPolicy">;
11
+ declare const _default: import("redux").Reducer<CreateCardPolicyState>;
12
+ export default _default;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.clearCreateCardPolicy = exports.updateCreateCardPolicyTemplateRequestState = exports.createCardPolicyTemplate = exports.initialState = void 0;
5
+ const toolkit_1 = require("@reduxjs/toolkit");
6
+ exports.initialState = {
7
+ createCardPolicyTemplateRequestState: {
8
+ fetchState: 'Not-Started',
9
+ error: undefined,
10
+ },
11
+ lastCreatedCardPolicyTemplateId: undefined,
12
+ };
13
+ const createCardPolicy = (0, toolkit_1.createSlice)({
14
+ name: 'createCardPolicy',
15
+ initialState: exports.initialState,
16
+ reducers: {
17
+ /**
18
+ * Kick off the `POST /cards/1.0/policy-templates` request. Setting
19
+ * the request state to `In-Progress` synchronously here matches how
20
+ * every other "create" slice in this repo wires its kickoff
21
+ * (see `issueChargeCards`, `fetchChargeCardConfig`, etc.).
22
+ *
23
+ * The accompanying epic listens for this action, performs the POST,
24
+ * dispatches `updateCreatedCardPolicyTemplate` on the entity slice,
25
+ * and dispatches `updateCreateCardPolicyTemplateRequestState` here to
26
+ * flip the lifecycle to `Completed` or `Error`.
27
+ */
28
+ createCardPolicyTemplate: {
29
+ reducer(draft,
30
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
31
+ _action) {
32
+ draft.createCardPolicyTemplateRequestState.fetchState = 'In-Progress';
33
+ draft.createCardPolicyTemplateRequestState.error = undefined;
34
+ draft.lastCreatedCardPolicyTemplateId = undefined;
35
+ },
36
+ prepare(request) {
37
+ return { payload: request };
38
+ },
39
+ },
40
+ updateCreateCardPolicyTemplateRequestState(draft, action) {
41
+ draft.createCardPolicyTemplateRequestState.fetchState =
42
+ action.payload.fetchState;
43
+ draft.createCardPolicyTemplateRequestState.error = action.payload.error;
44
+ if (action.payload.templateId != null) {
45
+ draft.lastCreatedCardPolicyTemplateId = action.payload.templateId;
46
+ }
47
+ },
48
+ clearCreateCardPolicy(draft) {
49
+ Object.assign(draft, exports.initialState);
50
+ },
51
+ },
52
+ });
53
+ _a = createCardPolicy.actions, exports.createCardPolicyTemplate = _a.createCardPolicyTemplate, exports.updateCreateCardPolicyTemplateRequestState = _a.updateCreateCardPolicyTemplateRequestState, exports.clearCreateCardPolicy = _a.clearCreateCardPolicy;
54
+ exports.default = createCardPolicy.reducer;
@@ -0,0 +1,4 @@
1
+ import { FetchStateAndError, ID } from '../../../../../commonStateTypes/common';
2
+ import { CreateCardPolicyState } from './createCardPolicyState';
3
+ export declare function getCreateCardPolicyTemplateRequestState(state: CreateCardPolicyState): FetchStateAndError;
4
+ export declare function getLastCreatedCardPolicyTemplateId(state: CreateCardPolicyState): ID | undefined;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCreateCardPolicyTemplateRequestState = getCreateCardPolicyTemplateRequestState;
4
+ exports.getLastCreatedCardPolicyTemplateId = getLastCreatedCardPolicyTemplateId;
5
+ function getCreateCardPolicyTemplateRequestState(state) {
6
+ return state.createCardPolicyTemplateRequestState;
7
+ }
8
+ function getLastCreatedCardPolicyTemplateId(state) {
9
+ return state.lastCreatedCardPolicyTemplateId;
10
+ }
@@ -0,0 +1,15 @@
1
+ import { FetchStateAndError, ID } from '../../../../../commonStateTypes/common';
2
+ /**
3
+ * View-side scaffolding for the manual Card Policy "create" flow.
4
+ *
5
+ * Mirrors `issueChargeCard` in spirit — kicks off a one-shot POST and
6
+ * tracks the request lifecycle. List + edit lifecycles live in sibling
7
+ * slices (`cardPolicyList`, `cardPolicyDetail`); MCC categories used by
8
+ * the create form live on the entity slice (shared with the AI-CFO flow)
9
+ * and are fetched via the co-located `fetchCardPolicyMccCategoriesEpic`.
10
+ */
11
+ export interface CreateCardPolicyState {
12
+ createCardPolicyTemplateRequestState: FetchStateAndError;
13
+ /** `templateId` of the most recently created template — populated on success. */
14
+ lastCreatedCardPolicyTemplateId?: ID;
15
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { updateCreatedCardPolicyTemplate } from '../../../../../entity/cardPolicy/cardPolicyReducer';
4
+ import { RootState } from '../../../../../reducer';
5
+ import { ZeniAPI } from '../../../../../zeniAPI';
6
+ import { createCardPolicyTemplate, updateCreateCardPolicyTemplateRequestState } from './createCardPolicyReducer';
7
+ export type ActionType = ReturnType<typeof createCardPolicyTemplate> | ReturnType<typeof updateCreatedCardPolicyTemplate> | ReturnType<typeof updateCreateCardPolicyTemplateRequestState>;
8
+ export declare const createCardPolicyTemplateEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCardPolicyTemplateEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const cardPolicyReducer_1 = require("../../../../../entity/cardPolicy/cardPolicyReducer");
7
+ const cardPolicyPayload_1 = require("../../../../../entity/cardPolicy/cardPolicyPayload");
8
+ const responsePayload_1 = require("../../../../../responsePayload");
9
+ const createCardPolicyReducer_1 = require("./createCardPolicyReducer");
10
+ const createCardPolicyTemplateEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(createCardPolicyReducer_1.createCardPolicyTemplate.match), (0, operators_1.mergeMap)((action) => {
11
+ const body = (0, cardPolicyPayload_1.toCreateCardPolicyTemplateRequestBody)(action.payload);
12
+ return zeniAPI
13
+ .postAndGetJSON(`${zeniAPI.apiEndPoints.cardMicroServiceBaseUrl}/1.0/policy-templates`, body)
14
+ .pipe((0, operators_1.mergeMap)((response) => {
15
+ if ((0, responsePayload_1.isSuccessStatus)(response) && response.data != null) {
16
+ const { template } = response.data;
17
+ const actions = [
18
+ (0, cardPolicyReducer_1.updateCreatedCardPolicyTemplate)(template),
19
+ (0, createCardPolicyReducer_1.updateCreateCardPolicyTemplateRequestState)({
20
+ fetchState: 'Completed',
21
+ templateId: template.template_id,
22
+ }),
23
+ ];
24
+ return (0, rxjs_1.from)(actions);
25
+ }
26
+ else {
27
+ return (0, rxjs_1.of)((0, createCardPolicyReducer_1.updateCreateCardPolicyTemplateRequestState)({
28
+ fetchState: 'Error',
29
+ error: response.status,
30
+ }));
31
+ }
32
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, createCardPolicyReducer_1.updateCreateCardPolicyTemplateRequestState)({
33
+ fetchState: 'Error',
34
+ error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Create card-policy template REST API call errored out' +
35
+ JSON.stringify(error)),
36
+ }))));
37
+ }));
38
+ exports.createCardPolicyTemplateEpic = createCardPolicyTemplateEpic;
@@ -0,0 +1,15 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { fetchCardPolicyMccCategories, updateCardPolicyMccCategories, updateCardPolicyMccCategoriesFailure } from '../../../../../entity/cardPolicy/cardPolicyReducer';
4
+ import { RootState } from '../../../../../reducer';
5
+ import { ZeniAPI } from '../../../../../zeniAPI';
6
+ /**
7
+ * MCC categories are reference data shared between the manual create
8
+ * flow and the AI-CFO `card_policy` form. The slice fields live on the
9
+ * `entity/cardPolicy` slice (so any consumer can read them without
10
+ * re-fetching); only the fetch lifecycle lives in `createCardPolicy/`
11
+ * because the manual create page is currently the only producer of the
12
+ * `fetchCardPolicyMccCategories` action.
13
+ */
14
+ export type ActionType = ReturnType<typeof fetchCardPolicyMccCategories> | ReturnType<typeof updateCardPolicyMccCategories> | ReturnType<typeof updateCardPolicyMccCategoriesFailure>;
15
+ export declare const fetchCardPolicyMccCategoriesEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchCardPolicyMccCategoriesEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const cardPolicyReducer_1 = require("../../../../../entity/cardPolicy/cardPolicyReducer");
7
+ const responsePayload_1 = require("../../../../../responsePayload");
8
+ const fetchCardPolicyMccCategoriesEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(cardPolicyReducer_1.fetchCardPolicyMccCategories.match), (0, operators_1.mergeMap)(() => {
9
+ return zeniAPI
10
+ .getJSON(`${zeniAPI.apiEndPoints.cardMicroServiceBaseUrl}/1.0/cards/mcc-codes`)
11
+ .pipe((0, operators_1.mergeMap)((response) => {
12
+ if ((0, responsePayload_1.isSuccessStatus)(response) && response.data != null) {
13
+ return (0, rxjs_1.from)([(0, cardPolicyReducer_1.updateCardPolicyMccCategories)(response.data)]);
14
+ }
15
+ else {
16
+ return (0, rxjs_1.of)((0, cardPolicyReducer_1.updateCardPolicyMccCategoriesFailure)(response.status));
17
+ }
18
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, cardPolicyReducer_1.updateCardPolicyMccCategoriesFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch card policy MCC categories REST API call errored out' +
19
+ JSON.stringify(error))))));
20
+ }));
21
+ exports.fetchCardPolicyMccCategoriesEpic = fetchCardPolicyMccCategoriesEpic;
@@ -61,7 +61,7 @@ export declare const initialCreditAcc: CreditAccount;
61
61
  export declare const initialDebitCardSummaries: DebitCardSummaries;
62
62
  export declare const initialResendRevokeCardInvite: ResendRevokeCardInvite;
63
63
  export declare const initialCreditAccountRepayment: CreditAccountRepayment;
64
- export declare const toChargeCardSortKeyType: (v: string) => "status" | "accountType" | "owner" | "cardName" | "limit" | "department" | "cardType" | "utilisation";
64
+ export declare const toChargeCardSortKeyType: (v: string) => "status" | "cardName" | "owner" | "accountType" | "limit" | "department" | "cardType" | "utilisation";
65
65
  export declare type ChargeCardViewSortKey = ReturnType<typeof toChargeCardSortKeyType>;
66
66
  export declare const ALL_CASHBACK_SORT_KEYS: readonly ["month", "cashback"];
67
67
  export declare const toCashbackSortKeyType: (v: string) => "month" | "cashback";
@@ -14,7 +14,7 @@ export declare const fetchTaskListPage: import("@reduxjs/toolkit").ActionCreator
14
14
  archived?: TaskPayload[];
15
15
  deleted?: TaskPayload[];
16
16
  snoozed?: TaskPayload[];
17
- }, "taskList/updateTaskList">, updateTaskListTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"deleted" | "live" | "archived" | "snoozed", "taskList/updateTaskListTab">, updateTaskListFetchStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
17
+ }, "taskList/updateTaskList">, updateTaskListTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"deleted" | "archived" | "live" | "snoozed", "taskList/updateTaskListTab">, updateTaskListFetchStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
18
18
  fetchState: FetchState;
19
19
  error?: ZeniAPIStatus;
20
20
  }, "taskList/updateTaskListFetchStatus">, updateTaskListSearchText: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
@@ -115,17 +115,7 @@ export declare const downloadAccountingProviderAttachment: import("@reduxjs/tool
115
115
  amount: number;
116
116
  recommendationWithCOTByLineId: RecommendationWithCOTByLineId;
117
117
  uncategorizedIncomeExpense: UncategorizedAccounts;
118
- }, "transactionDetail/setEntityRecommendationForLineIdsForTransactionDetail", never, never>, markCategoryClassRecommendationsInProgressForTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, lineIds: string[]], {
119
- transactionId: TransactionID;
120
- lineIds: string[];
121
- }, "transactionDetail/markCategoryClassRecommendationsInProgressForTransactionDetail", never, never>, markCategoryClassRecommendationsCompletedForTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, lineIds: string[]], {
122
- transactionId: TransactionID;
123
- lineIds: string[];
124
- }, "transactionDetail/markCategoryClassRecommendationsCompletedForTransactionDetail", never, never>, markCategoryClassRecommendationsFailureForTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, lineIds: string[], error: ZeniAPIStatus<Record<string, unknown>>], {
125
- transactionId: TransactionID;
126
- lineIds: string[];
127
- error: ZeniAPIStatus<Record<string, unknown>>;
128
- }, "transactionDetail/markCategoryClassRecommendationsFailureForTransactionDetail", never, never>, removeEntityRecommendationForLineIdForTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, transaction: SupportedTransaction, lineId: string], {
118
+ }, "transactionDetail/setEntityRecommendationForLineIdsForTransactionDetail", never, never>, removeEntityRecommendationForLineIdForTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, transaction: SupportedTransaction, lineId: string], {
129
119
  transactionId: TransactionID;
130
120
  transaction: SupportedTransaction;
131
121
  lineId: string;
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  var _a;
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.setIsVendorUpdateAllChecked = exports.updateVendorBulkRecommendationsFetchStatus = exports.updateLatestSelectedEntity = exports.resetAllLineItemsToVendor = exports.updateVendorToAllLineItems = exports.updateLocalDataWithTransactionsUpdateWithVendorCheckbox = exports.resetSelectedCustomer = exports.resetVendor = exports.updateSelectedCustomer = exports.updateSelectedVendor = exports.removeEntityRecommendationForLineIdForTransactionDetail = exports.markCategoryClassRecommendationsFailureForTransactionDetail = exports.markCategoryClassRecommendationsCompletedForTransactionDetail = exports.markCategoryClassRecommendationsInProgressForTransactionDetail = exports.setEntityRecommendationForLineIdsForTransactionDetail = exports.setAllLineItemsLocalDataIsUpdateAllChecked = exports.setAllLineItemsToCategoryClassInLocalData = exports.resetLineItemsCategoryClassInLocalData = exports.clearTransactionDetailLocalData = exports.saveTransactionDetailLocalData = exports.initializeTransactionDetailLocalData = exports.saveTransactionDetail = exports.updateTransactionStateIfUpdateActionNotAllowed = exports.updateStatusConsolidatedSaveTransactionDetail = exports.updateStatusForTransactionNotMiscategorizedUpdate = exports.deleteTransactionAttachmentSuccess = exports.deleteTransactionAttachmentFailure = exports.deleteTransactionAttachment = exports.markTransactionAsNotMiscategorized = exports.clearTransactionDetailSaveStatus = exports.updateTransactionDetailSaveStatus = exports.updateTransactionDetail = exports.uploadMissingAttachmentSuccess = exports.clearTransactionDetail = exports.removeTransactionDetail = exports.updateTransactionDetailFetchState = exports.fetchTransactionDetail = exports.downloadAccountingProviderAttachmentFailure = exports.downloadAccountingProviderAttachmentSuccess = exports.downloadAccountingProviderAttachment = exports.initialState = void 0;
7
+ exports.setIsVendorUpdateAllChecked = exports.updateVendorBulkRecommendationsFetchStatus = exports.updateLatestSelectedEntity = exports.resetAllLineItemsToVendor = exports.updateVendorToAllLineItems = exports.updateLocalDataWithTransactionsUpdateWithVendorCheckbox = exports.resetSelectedCustomer = exports.resetVendor = exports.updateSelectedCustomer = exports.updateSelectedVendor = exports.removeEntityRecommendationForLineIdForTransactionDetail = exports.setEntityRecommendationForLineIdsForTransactionDetail = exports.setAllLineItemsLocalDataIsUpdateAllChecked = exports.setAllLineItemsToCategoryClassInLocalData = exports.resetLineItemsCategoryClassInLocalData = exports.clearTransactionDetailLocalData = exports.saveTransactionDetailLocalData = exports.initializeTransactionDetailLocalData = exports.saveTransactionDetail = exports.updateTransactionStateIfUpdateActionNotAllowed = exports.updateStatusConsolidatedSaveTransactionDetail = exports.updateStatusForTransactionNotMiscategorizedUpdate = exports.deleteTransactionAttachmentSuccess = exports.deleteTransactionAttachmentFailure = exports.deleteTransactionAttachment = exports.markTransactionAsNotMiscategorized = exports.clearTransactionDetailSaveStatus = exports.updateTransactionDetailSaveStatus = exports.updateTransactionDetail = exports.uploadMissingAttachmentSuccess = exports.clearTransactionDetail = exports.removeTransactionDetail = exports.updateTransactionDetailFetchState = exports.fetchTransactionDetail = exports.downloadAccountingProviderAttachmentFailure = exports.downloadAccountingProviderAttachmentSuccess = exports.downloadAccountingProviderAttachment = exports.initialState = void 0;
8
8
  const toolkit_1 = require("@reduxjs/toolkit");
9
9
  const get_1 = __importDefault(require("lodash/get"));
10
10
  const entity_1 = require("../../entity/genericEntity/entity");
@@ -372,21 +372,6 @@ const transactionDetail = (0, toolkit_1.createSlice)({
372
372
  const detail = (0, get_1.default)(draft.transactionDetailById, key, undefined);
373
373
  if (detail != null) {
374
374
  const newLocalData = (0, transactionDetailLocalDataHelper_1.setEntityRecommendationForLineIdInLocalData)(transaction, detail.transactionDetailLocalData, action.payload.entity, lineIds, uncategorizedIncomeExpense, recommendationWithCOTByLineId);
375
- // Release the per-line fetch flag for every line this fetch
376
- // covered so the inline skeleton resolves and the page-level
377
- // Save button can re-enable.
378
- lineIds.forEach((lineId) => {
379
- const lineItem = newLocalData.lineItemById[lineId];
380
- if (lineItem != null) {
381
- newLocalData.lineItemById[lineId] = {
382
- ...lineItem,
383
- categoryClassRecommendationsFetchState: {
384
- fetchState: 'Completed',
385
- error: undefined,
386
- },
387
- };
388
- }
389
- });
390
375
  draft.transactionDetailById[key] = {
391
376
  ...detail,
392
377
  transactionDetailLocalData: newLocalData,
@@ -407,100 +392,6 @@ const transactionDetail = (0, toolkit_1.createSlice)({
407
392
  };
408
393
  },
409
394
  },
410
- // Start arm of the line-update recommendations fetch for the detail
411
- // page. Flips covered lines to In-Progress; detail page has no
412
- // checkbox, so no auto-uncheck side effect.
413
- markCategoryClassRecommendationsInProgressForTransactionDetail: {
414
- reducer(draft, action) {
415
- const { transactionId, lineIds } = action.payload;
416
- const key = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
417
- const detail = (0, get_1.default)(draft.transactionDetailById, key, undefined);
418
- // TEMP-LOG[JE-skeleton]: reducer entry — confirms the action reached
419
- // the slice and shows whether incoming lineIds match the redux keys.
420
- // eslint-disable-next-line no-console
421
- console.log('[JE-skeleton][reducer] markInProgress detail', {
422
- transactionId,
423
- incomingLineIds: lineIds,
424
- existingLineItemKeys: detail != null
425
- ? Object.keys(detail.transactionDetailLocalData.lineItemById)
426
- : null,
427
- matched: detail != null
428
- ? lineIds.filter((id) => detail.transactionDetailLocalData.lineItemById[id] != null)
429
- : [],
430
- missed: detail != null
431
- ? lineIds.filter((id) => detail.transactionDetailLocalData.lineItemById[id] == null)
432
- : lineIds,
433
- });
434
- if (detail != null) {
435
- lineIds.forEach((lineId) => {
436
- const lineItem = detail.transactionDetailLocalData.lineItemById[lineId];
437
- if (lineItem != null) {
438
- detail.transactionDetailLocalData.lineItemById[lineId] = {
439
- ...lineItem,
440
- categoryClassRecommendationsFetchState: {
441
- fetchState: 'In-Progress',
442
- error: undefined,
443
- },
444
- };
445
- }
446
- });
447
- }
448
- },
449
- prepare(transactionId, lineIds) {
450
- return { payload: { transactionId, lineIds } };
451
- },
452
- },
453
- // Completed arm. Used when the HTTP call succeeded but the server
454
- // returned no per-line recommendations — still need to release the
455
- // In-Progress flag.
456
- markCategoryClassRecommendationsCompletedForTransactionDetail: {
457
- reducer(draft, action) {
458
- const { transactionId, lineIds } = action.payload;
459
- const key = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
460
- const detail = (0, get_1.default)(draft.transactionDetailById, key, undefined);
461
- if (detail != null) {
462
- lineIds.forEach((lineId) => {
463
- const lineItem = detail.transactionDetailLocalData.lineItemById[lineId];
464
- if (lineItem != null) {
465
- detail.transactionDetailLocalData.lineItemById[lineId] = {
466
- ...lineItem,
467
- categoryClassRecommendationsFetchState: {
468
- fetchState: 'Completed',
469
- error: undefined,
470
- },
471
- };
472
- }
473
- });
474
- }
475
- },
476
- prepare(transactionId, lineIds) {
477
- return { payload: { transactionId, lineIds } };
478
- },
479
- },
480
- markCategoryClassRecommendationsFailureForTransactionDetail: {
481
- reducer(draft, action) {
482
- const { transactionId, lineIds, error } = action.payload;
483
- const key = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
484
- const detail = (0, get_1.default)(draft.transactionDetailById, key, undefined);
485
- if (detail != null) {
486
- lineIds.forEach((lineId) => {
487
- const lineItem = detail.transactionDetailLocalData.lineItemById[lineId];
488
- if (lineItem != null) {
489
- detail.transactionDetailLocalData.lineItemById[lineId] = {
490
- ...lineItem,
491
- categoryClassRecommendationsFetchState: {
492
- fetchState: 'Error',
493
- error,
494
- },
495
- };
496
- }
497
- });
498
- }
499
- },
500
- prepare(transactionId, lineIds, error) {
501
- return { payload: { transactionId, lineIds, error } };
502
- },
503
- },
504
395
  removeEntityRecommendationForLineIdForTransactionDetail: {
505
396
  reducer(draft, action) {
506
397
  const { transaction, lineId } = action.payload;
@@ -772,7 +663,7 @@ const transactionDetail = (0, toolkit_1.createSlice)({
772
663
  },
773
664
  },
774
665
  });
775
- _a = transactionDetail.actions, exports.downloadAccountingProviderAttachment = _a.downloadAccountingProviderAttachment, exports.downloadAccountingProviderAttachmentSuccess = _a.downloadAccountingProviderAttachmentSuccess, exports.downloadAccountingProviderAttachmentFailure = _a.downloadAccountingProviderAttachmentFailure, exports.fetchTransactionDetail = _a.fetchTransactionDetail, exports.updateTransactionDetailFetchState = _a.updateTransactionDetailFetchState, exports.removeTransactionDetail = _a.removeTransactionDetail, exports.clearTransactionDetail = _a.clearTransactionDetail, exports.uploadMissingAttachmentSuccess = _a.uploadMissingAttachmentSuccess, exports.updateTransactionDetail = _a.updateTransactionDetail, exports.updateTransactionDetailSaveStatus = _a.updateTransactionDetailSaveStatus, exports.clearTransactionDetailSaveStatus = _a.clearTransactionDetailSaveStatus, exports.markTransactionAsNotMiscategorized = _a.markTransactionAsNotMiscategorized, exports.deleteTransactionAttachment = _a.deleteTransactionAttachment, exports.deleteTransactionAttachmentFailure = _a.deleteTransactionAttachmentFailure, exports.deleteTransactionAttachmentSuccess = _a.deleteTransactionAttachmentSuccess, exports.updateStatusForTransactionNotMiscategorizedUpdate = _a.updateStatusForTransactionNotMiscategorizedUpdate, exports.updateStatusConsolidatedSaveTransactionDetail = _a.updateStatusConsolidatedSaveTransactionDetail, exports.updateTransactionStateIfUpdateActionNotAllowed = _a.updateTransactionStateIfUpdateActionNotAllowed, exports.saveTransactionDetail = _a.saveTransactionDetail, exports.initializeTransactionDetailLocalData = _a.initializeTransactionDetailLocalData, exports.saveTransactionDetailLocalData = _a.saveTransactionDetailLocalData, exports.clearTransactionDetailLocalData = _a.clearTransactionDetailLocalData, exports.resetLineItemsCategoryClassInLocalData = _a.resetLineItemsCategoryClassInLocalData, exports.setAllLineItemsToCategoryClassInLocalData = _a.setAllLineItemsToCategoryClassInLocalData, exports.setAllLineItemsLocalDataIsUpdateAllChecked = _a.setAllLineItemsLocalDataIsUpdateAllChecked, exports.setEntityRecommendationForLineIdsForTransactionDetail = _a.setEntityRecommendationForLineIdsForTransactionDetail, exports.markCategoryClassRecommendationsInProgressForTransactionDetail = _a.markCategoryClassRecommendationsInProgressForTransactionDetail, exports.markCategoryClassRecommendationsCompletedForTransactionDetail = _a.markCategoryClassRecommendationsCompletedForTransactionDetail, exports.markCategoryClassRecommendationsFailureForTransactionDetail = _a.markCategoryClassRecommendationsFailureForTransactionDetail, exports.removeEntityRecommendationForLineIdForTransactionDetail = _a.removeEntityRecommendationForLineIdForTransactionDetail, exports.updateSelectedVendor = _a.updateSelectedVendor, exports.updateSelectedCustomer = _a.updateSelectedCustomer, exports.resetVendor = _a.resetVendor, exports.resetSelectedCustomer = _a.resetSelectedCustomer, exports.updateLocalDataWithTransactionsUpdateWithVendorCheckbox = _a.updateLocalDataWithTransactionsUpdateWithVendorCheckbox, exports.updateVendorToAllLineItems = _a.updateVendorToAllLineItems, exports.resetAllLineItemsToVendor = _a.resetAllLineItemsToVendor, exports.updateLatestSelectedEntity = _a.updateLatestSelectedEntity, exports.updateVendorBulkRecommendationsFetchStatus = _a.updateVendorBulkRecommendationsFetchStatus, exports.setIsVendorUpdateAllChecked = _a.setIsVendorUpdateAllChecked;
666
+ _a = transactionDetail.actions, exports.downloadAccountingProviderAttachment = _a.downloadAccountingProviderAttachment, exports.downloadAccountingProviderAttachmentSuccess = _a.downloadAccountingProviderAttachmentSuccess, exports.downloadAccountingProviderAttachmentFailure = _a.downloadAccountingProviderAttachmentFailure, exports.fetchTransactionDetail = _a.fetchTransactionDetail, exports.updateTransactionDetailFetchState = _a.updateTransactionDetailFetchState, exports.removeTransactionDetail = _a.removeTransactionDetail, exports.clearTransactionDetail = _a.clearTransactionDetail, exports.uploadMissingAttachmentSuccess = _a.uploadMissingAttachmentSuccess, exports.updateTransactionDetail = _a.updateTransactionDetail, exports.updateTransactionDetailSaveStatus = _a.updateTransactionDetailSaveStatus, exports.clearTransactionDetailSaveStatus = _a.clearTransactionDetailSaveStatus, exports.markTransactionAsNotMiscategorized = _a.markTransactionAsNotMiscategorized, exports.deleteTransactionAttachment = _a.deleteTransactionAttachment, exports.deleteTransactionAttachmentFailure = _a.deleteTransactionAttachmentFailure, exports.deleteTransactionAttachmentSuccess = _a.deleteTransactionAttachmentSuccess, exports.updateStatusForTransactionNotMiscategorizedUpdate = _a.updateStatusForTransactionNotMiscategorizedUpdate, exports.updateStatusConsolidatedSaveTransactionDetail = _a.updateStatusConsolidatedSaveTransactionDetail, exports.updateTransactionStateIfUpdateActionNotAllowed = _a.updateTransactionStateIfUpdateActionNotAllowed, exports.saveTransactionDetail = _a.saveTransactionDetail, exports.initializeTransactionDetailLocalData = _a.initializeTransactionDetailLocalData, exports.saveTransactionDetailLocalData = _a.saveTransactionDetailLocalData, exports.clearTransactionDetailLocalData = _a.clearTransactionDetailLocalData, exports.resetLineItemsCategoryClassInLocalData = _a.resetLineItemsCategoryClassInLocalData, exports.setAllLineItemsToCategoryClassInLocalData = _a.setAllLineItemsToCategoryClassInLocalData, exports.setAllLineItemsLocalDataIsUpdateAllChecked = _a.setAllLineItemsLocalDataIsUpdateAllChecked, exports.setEntityRecommendationForLineIdsForTransactionDetail = _a.setEntityRecommendationForLineIdsForTransactionDetail, exports.removeEntityRecommendationForLineIdForTransactionDetail = _a.removeEntityRecommendationForLineIdForTransactionDetail, exports.updateSelectedVendor = _a.updateSelectedVendor, exports.updateSelectedCustomer = _a.updateSelectedCustomer, exports.resetVendor = _a.resetVendor, exports.resetSelectedCustomer = _a.resetSelectedCustomer, exports.updateLocalDataWithTransactionsUpdateWithVendorCheckbox = _a.updateLocalDataWithTransactionsUpdateWithVendorCheckbox, exports.updateVendorToAllLineItems = _a.updateVendorToAllLineItems, exports.resetAllLineItemsToVendor = _a.resetAllLineItemsToVendor, exports.updateLatestSelectedEntity = _a.updateLatestSelectedEntity, exports.updateVendorBulkRecommendationsFetchStatus = _a.updateVendorBulkRecommendationsFetchStatus, exports.setIsVendorUpdateAllChecked = _a.setIsVendorUpdateAllChecked;
776
667
  exports.default = transactionDetail.reducer;
777
668
  function getUpdatedEntityLocalData(detail, updates, entity, resetRecommendations, type) {
778
669
  const key = type === 'customer' ? 'customerUpdates' : 'vendorUpdates';
@@ -18,7 +18,6 @@ export interface TransactionDetailReport extends SelectorView {
18
18
  classHierarchyList: NestedClassHierarchyForReport[];
19
19
  classList: ClassListSelectorView;
20
20
  deleteStatusByAttachmentName: Record<string, FetchStateAndError>;
21
- hasInFlightCategoryClassRecommendations: boolean;
22
21
  isAccountingClassesEnabled: boolean;
23
22
  isAccountingProjectsEnabled: boolean;
24
23
  linkedTransactions: SupportedTransactionWithCOT[];
@@ -31,7 +30,6 @@ export interface TransactionDetailReport extends SelectorView {
31
30
  export interface VendorDetailsView extends SelectorView {
32
31
  vendors: Vendor[];
33
32
  }
34
- export declare const getDetailInFlightRecommendations: (state: RootState, transactionId: TransactionID) => boolean;
35
33
  export declare const getTransactionDetail: (state: RootState, transactionId: TransactionID, fetchLinkedTransactions?: boolean) => TransactionDetailReport;
36
34
  export declare function getTransactionDetailForTransaction(rootState: RootState, transactionId: TransactionID): TransactionDetailReport | undefined;
37
35
  export declare const getInitialUpdatablePeriodsForTransactionRecommendations: (companyIncorporationDate?: ZeniDate, bookCloseDate?: ZeniDate) => {
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getInitialUpdatablePeriodsForTransactionRecommendations = exports.getTransactionDetail = exports.getDetailInFlightRecommendations = void 0;
6
+ exports.getInitialUpdatablePeriodsForTransactionRecommendations = exports.getTransactionDetail = void 0;
7
7
  exports.getTransactionDetailForTransaction = getTransactionDetailForTransaction;
8
8
  const get_1 = __importDefault(require("lodash/get"));
9
9
  const reduceFetchState_1 = require("../../commonStateTypes/reduceFetchState");
@@ -17,27 +17,6 @@ const accountListSelector_1 = require("../accountList/accountListSelector");
17
17
  const classListSelector_1 = require("../classList/classListSelector");
18
18
  const projectListSelector_1 = require("../projectList/projectListSelector");
19
19
  const transactionDetailState_1 = require("./transactionDetailState");
20
- // "Any line on this transaction is fetching category/class recommendations?"
21
- // Inlined as a plain function because the upstream selector
22
- // `getTransactionDetail` is also un-memoized and the iteration is O(lines)
23
- // — typically <10. Exported standalone so consumers that only need the
24
- // flag (e.g. footer save-disable) can avoid materializing the whole
25
- // detail report.
26
- const getDetailInFlightRecommendations = (state, transactionId) => {
27
- const detailKey = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
28
- const detail = (0, get_1.default)(state.transactionDetailState.transactionDetailById, detailKey, undefined);
29
- if (detail == null) {
30
- return false;
31
- }
32
- for (const lineItem of Object.values(detail.transactionDetailLocalData.lineItemById)) {
33
- if (lineItem.categoryClassRecommendationsFetchState?.fetchState ===
34
- 'In-Progress') {
35
- return true;
36
- }
37
- }
38
- return false;
39
- };
40
- exports.getDetailInFlightRecommendations = getDetailInFlightRecommendations;
41
20
  const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = true) => {
42
21
  const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, projectState, projectListState, } = state;
43
22
  const detailKey = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
@@ -100,7 +79,6 @@ const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = tr
100
79
  : [];
101
80
  const transactionDetailAnyUpdateStatus = reduceUpdateFetchStates(transactionDetail);
102
81
  const vendors = (0, vendorSelector_1.getVendorsByVendorIds)(vendorState, vendorListState.vendorIds);
103
- const hasInFlightCategoryClassRecommendations = (0, exports.getDetailInFlightRecommendations)(state, transactionId);
104
82
  return {
105
83
  reportId: 'transaction_detail',
106
84
  reportTitle: 'Transaction Detail',
@@ -116,7 +94,6 @@ const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = tr
116
94
  classHierarchyList,
117
95
  accountsHierarchyList,
118
96
  classList: classList,
119
- hasInFlightCategoryClassRecommendations,
120
97
  isAccountingClassesEnabled,
121
98
  isAccountingProjectsEnabled,
122
99
  projectList,
@@ -14,7 +14,6 @@ export interface TransactionDetailLineItemData extends TransactionLineBase {
14
14
  isClassMiscategorized: boolean;
15
15
  account?: AccountBase;
16
16
  billable?: BillableStatus;
17
- categoryClassRecommendationsFetchState?: FetchStateAndError;
18
17
  class?: ClassBase;
19
18
  customer?: CustomerBase;
20
19
  isCategoryUpdateSelected?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.0.65-betaML2",
3
+ "version": "5.0.65-betaRR1",
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",
@@ -1,88 +0,0 @@
1
- import { concat, of, timer } from 'rxjs';
2
- import { catchError, debounce, filter, groupBy, mergeMap, switchMap, } from 'rxjs/operators';
3
- import { getIsAccountingClassesEnabled } from '../../entity/tenant/tenantSelector';
4
- import { getTransactionWithCOT, getTransactionWithCOTFromRecommendations, } from '../../entity/transaction/transactionHelper';
5
- import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
6
- import { getUncategorizedAccounts } from '../accountList/accountListSelector';
7
- import { markCategoryClassRecommendationsCompletedForCategorization, markCategoryClassRecommendationsFailureForCategorization, markCategoryClassRecommendationsInProgressForCategorization, setEntityRecommendationForLineIdsForCategorization, } from '../expenseAutomationView/reducers/transactionsViewReducer';
8
- import { markCategoryClassRecommendationsCompletedForTransactionDetail, markCategoryClassRecommendationsFailureForTransactionDetail, markCategoryClassRecommendationsInProgressForTransactionDetail, setEntityRecommendationForLineIdsForTransactionDetail, } from '../transactionDetail/transactionDetailReducer';
9
- import { buildRecommendationUrl, getRecommendationByLineIdWithCOTFromRecommendationPayloadWithCOT, } from './recommendationHelper';
10
- import { fetchEntityRecommendationsForLineUpdate } from './recommendationReducer';
11
- // Close the per-target groupBy bucket after this much idle time so inactive
12
- // groups don't accumulate forever (each group holds a Subject + a chain of
13
- // active subscribers; without a duration selector groupBy retains them for
14
- // the lifetime of the source observable, which is the lifetime of the app).
15
- // Picked at 60s to leave a generous window for re-fetches on the same
16
- // payee/transaction/line target while still bounding memory.
17
- const GROUP_INACTIVITY_TIMEOUT_MS = 60000;
18
- // Build the groupBy key. Same flow + same transaction + same line set
19
- // share a target so switchMap can cancel an in-flight prior fetch. Use
20
- // NUL (\u0000) as separator because it can never appear in transaction
21
- // or line ids (vs the `|` used in an earlier WIP which collides with
22
- // pipe-delimited synthetic ids).
23
- const SEPARATOR = '\u0000';
24
- const toGroupKey = (flowType, transactionId, lineIds) => `${flowType}${SEPARATOR}${transactionId}${SEPARATOR}${[...lineIds]
25
- .sort((a, b) => a.localeCompare(b))
26
- .join(SEPARATOR)}`;
27
- // Targeted recommendations fetch that drives the per-line skeleton, the
28
- // list-page row-checkbox uncheck/recheck, and the page-level Save
29
- // disable.
30
- //
31
- // Concurrency model:
32
- // - groupBy by (flowType, transactionId, sorted lineIds) so distinct
33
- // targets run in parallel.
34
- // - inside each group, switchMap so a re-fetch on the SAME target
35
- // cancels any prior in-flight request for that target.
36
- // - groupBy duration selector closes idle groups to bound memory.
37
- export const fetchEntityRecommendationsForLineUpdateEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchEntityRecommendationsForLineUpdate.match), groupBy((action) => toGroupKey(action.payload.flowType, action.payload.transactionDetails.transactionId.id, action.payload.transactionDetails.lineIds), undefined, (group$) => group$.pipe(debounce(() => timer(GROUP_INACTIVITY_TIMEOUT_MS)))), mergeMap((group$) => group$.pipe(switchMap((action) => {
38
- const { entity, amount, transactionDetails, flowType, selectedTab, isFetchCOT, isUncategorizedExpenseCategoryEnabled, } = action.payload;
39
- const { transactionId, transaction, lineIds } = transactionDetails;
40
- // Synchronously emit the start arm so the per-line skeleton +
41
- // row uncheck happen before the HTTP request begins.
42
- const startAction = flowType === 'categorization' && selectedTab != null
43
- ? markCategoryClassRecommendationsInProgressForCategorization(selectedTab, transactionId, lineIds)
44
- : markCategoryClassRecommendationsInProgressForTransactionDetail(transactionId, lineIds);
45
- // TEMP-LOG[JE-skeleton]: epic dispatch payload — confirms the
46
- // targeted-fetch fired with the expected flowType / txnId / lineIds.
47
- // eslint-disable-next-line no-console
48
- console.log('[JE-skeleton][epic] dispatch start arm', {
49
- flowType,
50
- selectedTab,
51
- transactionId,
52
- lineIds,
53
- transactionType: transaction?.type,
54
- });
55
- const url = buildRecommendationUrl(zeniAPI.apiEndPoints.accountMicroServiceBaseUrl, entity, amount, transactionDetails, isFetchCOT === true);
56
- const httpStream$ = zeniAPI
57
- .getJSON(url)
58
- .pipe(mergeMap((response) => {
59
- if (!isSuccessResponse(response) || response.data == null) {
60
- return of(flowType === 'categorization' && selectedTab != null
61
- ? markCategoryClassRecommendationsFailureForCategorization(selectedTab, transactionId, lineIds, response.status)
62
- : markCategoryClassRecommendationsFailureForTransactionDetail(transactionId, lineIds, response.status));
63
- }
64
- const recommendationWithCOTByLineId = getRecommendationByLineIdWithCOTFromRecommendationPayloadWithCOT(response.data.recommendations, lineIds);
65
- // HTTP 200 with no per-line recommendations: NOT an error.
66
- // Flip lines to Completed so the skeleton resolves and
67
- // downstream UI can treat this as "we tried, nothing to
68
- // apply".
69
- if (recommendationWithCOTByLineId == null) {
70
- return of(flowType === 'categorization' && selectedTab != null
71
- ? markCategoryClassRecommendationsCompletedForCategorization(selectedTab, transactionId, lineIds)
72
- : markCategoryClassRecommendationsCompletedForTransactionDetail(transactionId, lineIds));
73
- }
74
- const transactionWithCOT = isFetchCOT === true
75
- ? getTransactionWithCOTFromRecommendations(transaction, recommendationWithCOTByLineId)
76
- : getTransactionWithCOT(transaction);
77
- const uncategorizedIncomeExpense = getUncategorizedAccounts(state$.value.accountState, state$.value.accountListState, 'accountList');
78
- if (flowType === 'categorization' && selectedTab != null) {
79
- return of(setEntityRecommendationForLineIdsForCategorization(selectedTab, transactionId, transactionWithCOT, lineIds, entity, amount, recommendationWithCOTByLineId, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled, getIsAccountingClassesEnabled(state$.value)));
80
- }
81
- return of(setEntityRecommendationForLineIdsForTransactionDetail(transactionId, transactionWithCOT, lineIds, entity, amount, recommendationWithCOTByLineId, uncategorizedIncomeExpense));
82
- }), catchError((error) => of(flowType === 'categorization' && selectedTab != null
83
- ? markCategoryClassRecommendationsFailureForCategorization(selectedTab, transactionId, lineIds, createZeniAPIStatus('Unexpected Error', 'fetchEntityRecommendationsForLineUpdate failed: ' +
84
- JSON.stringify(error)))
85
- : markCategoryClassRecommendationsFailureForTransactionDetail(transactionId, lineIds, createZeniAPIStatus('Unexpected Error', 'fetchEntityRecommendationsForLineUpdate failed: ' +
86
- JSON.stringify(error))))));
87
- return concat(of(startAction), httpStream$);
88
- }))));