@zeniai/client-epic-state 5.0.64-betaSS1 → 5.0.65-betaML1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/epic.d.ts +2 -1
- package/lib/epic.js +2 -1
- package/lib/esm/epic.js +2 -1
- package/lib/esm/index.js +6 -6
- package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +21 -1
- package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +137 -21
- package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +28 -0
- package/lib/esm/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.js +78 -0
- package/lib/esm/view/recommendation/recommendationHelper.js +29 -0
- package/lib/esm/view/recommendation/recommendationReducer.js +36 -1
- package/lib/esm/view/transactionDetail/transactionDetailReducer.js +94 -1
- package/lib/esm/view/transactionDetail/transactionDetailSelector.js +22 -0
- package/lib/index.d.ts +7 -6
- package/lib/index.js +35 -32
- package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +23 -2
- package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +14 -1
- package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +137 -21
- package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +2 -0
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +3 -0
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +29 -0
- package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +6 -0
- package/lib/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.d.ts +9 -0
- package/lib/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.js +82 -0
- package/lib/view/recommendation/recommendationHelper.d.ts +9 -0
- package/lib/view/recommendation/recommendationHelper.js +31 -1
- package/lib/view/recommendation/recommendationReducer.d.ts +18 -1
- package/lib/view/recommendation/recommendationReducer.js +37 -2
- package/lib/view/transactionDetail/transactionDetailReducer.d.ts +11 -1
- package/lib/view/transactionDetail/transactionDetailReducer.js +95 -2
- package/lib/view/transactionDetail/transactionDetailSelector.d.ts +2 -0
- package/lib/view/transactionDetail/transactionDetailSelector.js +24 -1
- package/lib/view/transactionDetail/transactionDetailTypes.d.ts +1 -0
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ import { TransactionID } from '../../entity/transaction/stateTypes/transaction';
|
|
|
5
5
|
import { SupportedTransaction } from '../../entity/transaction/transactionState';
|
|
6
6
|
import { ZeniAPIStatus } from '../../responsePayload';
|
|
7
7
|
import { EntityRecommendationState } from './recommendationState';
|
|
8
|
+
export type RecommendationLineUpdateFlowType = 'categorization' | 'detail';
|
|
8
9
|
export declare const initialState: EntityRecommendationState;
|
|
9
10
|
export declare const fetchEntityRecommendationsByTransactionId: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[entity: Entity, amount: number, transactionDetails: {
|
|
10
11
|
lineIds: ID[];
|
|
@@ -22,7 +23,23 @@ export declare const fetchEntityRecommendationsByTransactionId: import("@reduxjs
|
|
|
22
23
|
isTransactionCategorizationFlow: any;
|
|
23
24
|
isFetchCOT: any;
|
|
24
25
|
isUncategorizedExpenseCategoryEnabled: boolean | undefined;
|
|
25
|
-
}, "recommendation/fetchEntityRecommendationsByTransactionId", never, never>,
|
|
26
|
+
}, "recommendation/fetchEntityRecommendationsByTransactionId", never, never>, fetchEntityRecommendationsForLineUpdate: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[entity: Entity, amount: number, transactionDetails: {
|
|
27
|
+
lineIds: ID[];
|
|
28
|
+
transaction: SupportedTransaction;
|
|
29
|
+
transactionId: TransactionID;
|
|
30
|
+
}, flowType: RecommendationLineUpdateFlowType, selectedTab?: "review" | "autoCategorized" | undefined, isFetchCOT?: any, isUncategorizedExpenseCategoryEnabled?: boolean | undefined], {
|
|
31
|
+
entity: Entity;
|
|
32
|
+
amount: number;
|
|
33
|
+
transactionDetails: {
|
|
34
|
+
lineIds: ID[];
|
|
35
|
+
transaction: SupportedTransaction;
|
|
36
|
+
transactionId: TransactionID;
|
|
37
|
+
};
|
|
38
|
+
flowType: RecommendationLineUpdateFlowType;
|
|
39
|
+
selectedTab: "review" | "autoCategorized" | undefined;
|
|
40
|
+
isFetchCOT: any;
|
|
41
|
+
isUncategorizedExpenseCategoryEnabled: boolean | undefined;
|
|
42
|
+
}, "recommendation/fetchEntityRecommendationsForLineUpdate", never, never>, fetchRecommendationByEntityName: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[entityName: string, entityType: EntityType], {
|
|
26
43
|
entityName: string;
|
|
27
44
|
entityType: EntityType;
|
|
28
45
|
}, "recommendation/fetchRecommendationByEntityName", never, never>, fetchRecommendationByEntityId: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[entityId: string, entityType: EntityType], {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.clearRecommendation = exports.indicateReadyToInitializeRecommendation = exports.updateRecommendationForEntityFailure = exports.updateRecommendationForEntity = exports.fetchRecommendationByEntityId = exports.fetchRecommendationByEntityName = exports.fetchEntityRecommendationsByTransactionId = exports.initialState = void 0;
|
|
4
|
+
exports.clearRecommendation = exports.indicateReadyToInitializeRecommendation = exports.updateRecommendationForEntityFailure = exports.updateRecommendationForEntity = exports.fetchRecommendationByEntityId = exports.fetchRecommendationByEntityName = exports.fetchEntityRecommendationsForLineUpdate = exports.fetchEntityRecommendationsByTransactionId = exports.initialState = void 0;
|
|
5
5
|
const toolkit_1 = require("@reduxjs/toolkit");
|
|
6
6
|
const recommendationState_1 = require("./recommendationState");
|
|
7
7
|
exports.initialState = {
|
|
@@ -37,6 +37,41 @@ const recommendation = (0, toolkit_1.createSlice)({
|
|
|
37
37
|
};
|
|
38
38
|
},
|
|
39
39
|
},
|
|
40
|
+
// Targeted recommendations fetch fired when the user changes the
|
|
41
|
+
// payee/customer on a single transaction line (or the JE sibling set
|
|
42
|
+
// for that change). Routed by `fetchEntityRecommendationsForLineUpdateEpic`
|
|
43
|
+
// which uses groupBy + switchMap to keep fetches for distinct targets
|
|
44
|
+
// running in parallel while same-target re-fetches still cancel each
|
|
45
|
+
// other. The flowType discriminator selects the categorization vs
|
|
46
|
+
// detail slice for the per-line In-Progress / Completed / Error state.
|
|
47
|
+
fetchEntityRecommendationsForLineUpdate: {
|
|
48
|
+
reducer(draft, action) {
|
|
49
|
+
const { entity } = action.payload;
|
|
50
|
+
const key = (0, recommendationState_1.getEntityRecommendationKey)(entity.type, entity.id);
|
|
51
|
+
// Unconditional flip to In-Progress; the previous variant only
|
|
52
|
+
// seeded when missing, which left stale fetchStates when a prior
|
|
53
|
+
// fetch had already populated the entity entry.
|
|
54
|
+
draft.recommendationByEntity[key] = {
|
|
55
|
+
...(draft.recommendationByEntity[key] ??
|
|
56
|
+
recommendationState_1.initialEntityRecommendationState),
|
|
57
|
+
fetchState: 'In-Progress',
|
|
58
|
+
error: undefined,
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
prepare(entity, amount, transactionDetails, flowType, selectedTab, isFetchCOT = false, isUncategorizedExpenseCategoryEnabled) {
|
|
62
|
+
return {
|
|
63
|
+
payload: {
|
|
64
|
+
entity,
|
|
65
|
+
amount,
|
|
66
|
+
transactionDetails,
|
|
67
|
+
flowType,
|
|
68
|
+
selectedTab,
|
|
69
|
+
isFetchCOT,
|
|
70
|
+
isUncategorizedExpenseCategoryEnabled,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
},
|
|
40
75
|
fetchRecommendationByEntityName: {
|
|
41
76
|
reducer(draft, action) {
|
|
42
77
|
const { entityName, entityType } = action.payload;
|
|
@@ -115,7 +150,7 @@ const recommendation = (0, toolkit_1.createSlice)({
|
|
|
115
150
|
},
|
|
116
151
|
},
|
|
117
152
|
});
|
|
118
|
-
_a = recommendation.actions, exports.fetchEntityRecommendationsByTransactionId = _a.fetchEntityRecommendationsByTransactionId, exports.fetchRecommendationByEntityName = _a.fetchRecommendationByEntityName, exports.fetchRecommendationByEntityId = _a.fetchRecommendationByEntityId, exports.updateRecommendationForEntity = _a.updateRecommendationForEntity, exports.updateRecommendationForEntityFailure = _a.updateRecommendationForEntityFailure, exports.indicateReadyToInitializeRecommendation = _a.indicateReadyToInitializeRecommendation, exports.clearRecommendation = _a.clearRecommendation;
|
|
153
|
+
_a = recommendation.actions, exports.fetchEntityRecommendationsByTransactionId = _a.fetchEntityRecommendationsByTransactionId, exports.fetchEntityRecommendationsForLineUpdate = _a.fetchEntityRecommendationsForLineUpdate, exports.fetchRecommendationByEntityName = _a.fetchRecommendationByEntityName, exports.fetchRecommendationByEntityId = _a.fetchRecommendationByEntityId, exports.updateRecommendationForEntity = _a.updateRecommendationForEntity, exports.updateRecommendationForEntityFailure = _a.updateRecommendationForEntityFailure, exports.indicateReadyToInitializeRecommendation = _a.indicateReadyToInitializeRecommendation, exports.clearRecommendation = _a.clearRecommendation;
|
|
119
154
|
exports.default = recommendation.reducer;
|
|
120
155
|
const doUpdateRecommendationForEntity = (draft, entityId, entityType, payload) => {
|
|
121
156
|
const key = (0, recommendationState_1.getEntityRecommendationKey)(entityType, entityId);
|
|
@@ -115,7 +115,17 @@ export declare const downloadAccountingProviderAttachment: import("@reduxjs/tool
|
|
|
115
115
|
amount: number;
|
|
116
116
|
recommendationWithCOTByLineId: RecommendationWithCOTByLineId;
|
|
117
117
|
uncategorizedIncomeExpense: UncategorizedAccounts;
|
|
118
|
-
}, "transactionDetail/setEntityRecommendationForLineIdsForTransactionDetail", never, never>,
|
|
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], {
|
|
119
129
|
transactionId: TransactionID;
|
|
120
130
|
transaction: SupportedTransaction;
|
|
121
131
|
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.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.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;
|
|
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,6 +372,21 @@ 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
|
+
});
|
|
375
390
|
draft.transactionDetailById[key] = {
|
|
376
391
|
...detail,
|
|
377
392
|
transactionDetailLocalData: newLocalData,
|
|
@@ -392,6 +407,84 @@ const transactionDetail = (0, toolkit_1.createSlice)({
|
|
|
392
407
|
};
|
|
393
408
|
},
|
|
394
409
|
},
|
|
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
|
+
if (detail != null) {
|
|
419
|
+
lineIds.forEach((lineId) => {
|
|
420
|
+
const lineItem = detail.transactionDetailLocalData.lineItemById[lineId];
|
|
421
|
+
if (lineItem != null) {
|
|
422
|
+
detail.transactionDetailLocalData.lineItemById[lineId] = {
|
|
423
|
+
...lineItem,
|
|
424
|
+
categoryClassRecommendationsFetchState: {
|
|
425
|
+
fetchState: 'In-Progress',
|
|
426
|
+
error: undefined,
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
prepare(transactionId, lineIds) {
|
|
434
|
+
return { payload: { transactionId, lineIds } };
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
// Completed arm. Used when the HTTP call succeeded but the server
|
|
438
|
+
// returned no per-line recommendations — still need to release the
|
|
439
|
+
// In-Progress flag.
|
|
440
|
+
markCategoryClassRecommendationsCompletedForTransactionDetail: {
|
|
441
|
+
reducer(draft, action) {
|
|
442
|
+
const { transactionId, lineIds } = action.payload;
|
|
443
|
+
const key = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
|
|
444
|
+
const detail = (0, get_1.default)(draft.transactionDetailById, key, undefined);
|
|
445
|
+
if (detail != null) {
|
|
446
|
+
lineIds.forEach((lineId) => {
|
|
447
|
+
const lineItem = detail.transactionDetailLocalData.lineItemById[lineId];
|
|
448
|
+
if (lineItem != null) {
|
|
449
|
+
detail.transactionDetailLocalData.lineItemById[lineId] = {
|
|
450
|
+
...lineItem,
|
|
451
|
+
categoryClassRecommendationsFetchState: {
|
|
452
|
+
fetchState: 'Completed',
|
|
453
|
+
error: undefined,
|
|
454
|
+
},
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
},
|
|
460
|
+
prepare(transactionId, lineIds) {
|
|
461
|
+
return { payload: { transactionId, lineIds } };
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
markCategoryClassRecommendationsFailureForTransactionDetail: {
|
|
465
|
+
reducer(draft, action) {
|
|
466
|
+
const { transactionId, lineIds, error } = action.payload;
|
|
467
|
+
const key = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
|
|
468
|
+
const detail = (0, get_1.default)(draft.transactionDetailById, key, undefined);
|
|
469
|
+
if (detail != null) {
|
|
470
|
+
lineIds.forEach((lineId) => {
|
|
471
|
+
const lineItem = detail.transactionDetailLocalData.lineItemById[lineId];
|
|
472
|
+
if (lineItem != null) {
|
|
473
|
+
detail.transactionDetailLocalData.lineItemById[lineId] = {
|
|
474
|
+
...lineItem,
|
|
475
|
+
categoryClassRecommendationsFetchState: {
|
|
476
|
+
fetchState: 'Error',
|
|
477
|
+
error,
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
prepare(transactionId, lineIds, error) {
|
|
485
|
+
return { payload: { transactionId, lineIds, error } };
|
|
486
|
+
},
|
|
487
|
+
},
|
|
395
488
|
removeEntityRecommendationForLineIdForTransactionDetail: {
|
|
396
489
|
reducer(draft, action) {
|
|
397
490
|
const { transaction, lineId } = action.payload;
|
|
@@ -663,7 +756,7 @@ const transactionDetail = (0, toolkit_1.createSlice)({
|
|
|
663
756
|
},
|
|
664
757
|
},
|
|
665
758
|
});
|
|
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;
|
|
759
|
+
_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;
|
|
667
760
|
exports.default = transactionDetail.reducer;
|
|
668
761
|
function getUpdatedEntityLocalData(detail, updates, entity, resetRecommendations, type) {
|
|
669
762
|
const key = type === 'customer' ? 'customerUpdates' : 'vendorUpdates';
|
|
@@ -18,6 +18,7 @@ export interface TransactionDetailReport extends SelectorView {
|
|
|
18
18
|
classHierarchyList: NestedClassHierarchyForReport[];
|
|
19
19
|
classList: ClassListSelectorView;
|
|
20
20
|
deleteStatusByAttachmentName: Record<string, FetchStateAndError>;
|
|
21
|
+
hasInFlightCategoryClassRecommendations: boolean;
|
|
21
22
|
isAccountingClassesEnabled: boolean;
|
|
22
23
|
isAccountingProjectsEnabled: boolean;
|
|
23
24
|
linkedTransactions: SupportedTransactionWithCOT[];
|
|
@@ -30,6 +31,7 @@ export interface TransactionDetailReport extends SelectorView {
|
|
|
30
31
|
export interface VendorDetailsView extends SelectorView {
|
|
31
32
|
vendors: Vendor[];
|
|
32
33
|
}
|
|
34
|
+
export declare const getDetailInFlightRecommendations: (state: RootState, transactionId: TransactionID) => boolean;
|
|
33
35
|
export declare const getTransactionDetail: (state: RootState, transactionId: TransactionID, fetchLinkedTransactions?: boolean) => TransactionDetailReport;
|
|
34
36
|
export declare function getTransactionDetailForTransaction(rootState: RootState, transactionId: TransactionID): TransactionDetailReport | undefined;
|
|
35
37
|
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 = void 0;
|
|
6
|
+
exports.getInitialUpdatablePeriodsForTransactionRecommendations = exports.getTransactionDetail = exports.getDetailInFlightRecommendations = 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,6 +17,27 @@ 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;
|
|
20
41
|
const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = true) => {
|
|
21
42
|
const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, projectState, projectListState, } = state;
|
|
22
43
|
const detailKey = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
|
|
@@ -79,6 +100,7 @@ const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = tr
|
|
|
79
100
|
: [];
|
|
80
101
|
const transactionDetailAnyUpdateStatus = reduceUpdateFetchStates(transactionDetail);
|
|
81
102
|
const vendors = (0, vendorSelector_1.getVendorsByVendorIds)(vendorState, vendorListState.vendorIds);
|
|
103
|
+
const hasInFlightCategoryClassRecommendations = (0, exports.getDetailInFlightRecommendations)(state, transactionId);
|
|
82
104
|
return {
|
|
83
105
|
reportId: 'transaction_detail',
|
|
84
106
|
reportTitle: 'Transaction Detail',
|
|
@@ -94,6 +116,7 @@ const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = tr
|
|
|
94
116
|
classHierarchyList,
|
|
95
117
|
accountsHierarchyList,
|
|
96
118
|
classList: classList,
|
|
119
|
+
hasInFlightCategoryClassRecommendations,
|
|
97
120
|
isAccountingClassesEnabled,
|
|
98
121
|
isAccountingProjectsEnabled,
|
|
99
122
|
projectList,
|
|
@@ -14,6 +14,7 @@ export interface TransactionDetailLineItemData extends TransactionLineBase {
|
|
|
14
14
|
isClassMiscategorized: boolean;
|
|
15
15
|
account?: AccountBase;
|
|
16
16
|
billable?: BillableStatus;
|
|
17
|
+
categoryClassRecommendationsFetchState?: FetchStateAndError;
|
|
17
18
|
class?: ClassBase;
|
|
18
19
|
customer?: CustomerBase;
|
|
19
20
|
isCategoryUpdateSelected?: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeniai/client-epic-state",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.65-betaML1",
|
|
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",
|