@zeniai/client-epic-state 4.19.39 → 4.19.40-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.
Files changed (27) hide show
  1. package/lib/esm/index.js +2 -2
  2. package/lib/esm/view/commonVendorView/transactionVendorView/epics/saveTransactionVendorEpic.js +1 -0
  3. package/lib/esm/view/commonVendorView/transactionVendorView/transactionVendorViewReducer.js +2 -1
  4. package/lib/esm/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +5 -3
  5. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +27 -0
  6. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +65 -2
  7. package/lib/esm/view/transactionDetail/epics/saveTransactionDetailEpic.js +2 -2
  8. package/lib/esm/view/transactionDetail/epics/updateTransactionDetailEpic.js +11 -2
  9. package/lib/esm/view/transactionDetail/transactionDetailReducer.js +2 -1
  10. package/lib/index.d.ts +2 -2
  11. package/lib/index.js +30 -29
  12. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  13. package/lib/view/commonVendorView/transactionVendorView/epics/saveTransactionVendorEpic.js +1 -0
  14. package/lib/view/commonVendorView/transactionVendorView/transactionVendorViewReducer.d.ts +2 -1
  15. package/lib/view/commonVendorView/transactionVendorView/transactionVendorViewReducer.js +2 -1
  16. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.d.ts +2 -1
  17. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +5 -3
  18. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +10 -0
  19. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +30 -1
  20. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +7 -1
  21. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +65 -2
  22. package/lib/view/transactionDetail/epics/saveTransactionDetailEpic.js +2 -2
  23. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.d.ts +3 -2
  24. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.js +10 -1
  25. package/lib/view/transactionDetail/transactionDetailReducer.d.ts +3 -1
  26. package/lib/view/transactionDetail/transactionDetailReducer.js +2 -1
  27. package/package.json +1 -1
@@ -108,6 +108,7 @@ const saveTransactionVendorEpic = (actions$, state$, zeniAPI) => actions$.pipe((
108
108
  transactionId: action.payload.transactionId,
109
109
  isExpenseAutomationEnabled: action.payload.isExpenseAutomationEnabled,
110
110
  cotTransactionTracking: [], // We don't need to pass COT tracking for vendor save
111
+ isUncategorizedExpenseCategoryEnabled: action.payload.isUncategorizedExpenseCategoryEnabled,
111
112
  }));
112
113
  }
113
114
  return (0, rxjs_1.from)(actions);
@@ -6,11 +6,12 @@ export declare const initialVendorDetailLocalData: TransactionVendorLocalData;
6
6
  export declare const initialState: TransactionVendorViewState;
7
7
  export declare const updateVendorSaveStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
8
8
  vendorId?: ID;
9
- }, "transactionVendorView/updateVendorSaveStatus">, saveTransactionVendor: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId?: TransactionID | undefined, vendorId?: string | undefined, saveTransaction?: boolean | undefined, isExpenseAutomationEnabled?: any], {
9
+ }, "transactionVendorView/updateVendorSaveStatus">, saveTransactionVendor: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId?: TransactionID | undefined, vendorId?: string | undefined, saveTransaction?: boolean | undefined, isExpenseAutomationEnabled?: any, isUncategorizedExpenseCategoryEnabled?: boolean | undefined], {
10
10
  vendorId: string | undefined;
11
11
  transactionId: TransactionID | undefined;
12
12
  saveTransaction: boolean | undefined;
13
13
  isExpenseAutomationEnabled: any;
14
+ isUncategorizedExpenseCategoryEnabled: boolean | undefined;
14
15
  }, "transactionVendorView/saveTransactionVendor", never, never>, saveTransactionVendorSuccessOrFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[fetchState: FetchState, vendorId?: string | undefined, error?: ZeniAPIStatus<Record<string, unknown>> | undefined], {
15
16
  fetchState: FetchState;
16
17
  vendorId: string | undefined;
@@ -48,13 +48,14 @@ const transactionVendorView = (0, toolkit_1.createSlice)({
48
48
  draft.newVendorState.saveStatus.error = undefined;
49
49
  }
50
50
  },
51
- prepare(transactionId, vendorId, saveTransaction, isExpenseAutomationEnabled = false) {
51
+ prepare(transactionId, vendorId, saveTransaction, isExpenseAutomationEnabled = false, isUncategorizedExpenseCategoryEnabled) {
52
52
  return {
53
53
  payload: {
54
54
  vendorId,
55
55
  transactionId,
56
56
  saveTransaction,
57
57
  isExpenseAutomationEnabled,
58
+ isUncategorizedExpenseCategoryEnabled,
58
59
  },
59
60
  };
60
61
  },
@@ -1,3 +1,4 @@
1
+ import { AccountType } from '../../../../entity/account/accountState';
1
2
  import { UploadStatementDocumentAIPayload } from '../../payload/reconciliationPayload';
2
3
  export interface AuthParams {
3
4
  sessionId: string;
@@ -9,4 +10,4 @@ export interface AuthParamsPayload {
9
10
  zeni_tenant_id: string;
10
11
  zeni_user_id: string;
11
12
  }
12
- export default function uploadAccountStatementIntoDocumentAI(fileBlob: Blob, authParams: AuthParams): Promise<UploadStatementDocumentAIPayload | undefined>;
13
+ export default function uploadAccountStatementIntoDocumentAI(accountType: AccountType, fileBlob: Blob, authParams: AuthParams): Promise<UploadStatementDocumentAIPayload | undefined>;
@@ -6,13 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = uploadAccountStatementIntoDocumentAI;
7
7
  const cross_fetch_1 = __importDefault(require("cross-fetch"));
8
8
  const init_1 = require("../../../../init");
9
- async function uploadAccountStatementIntoDocumentAI(fileBlob, authParams) {
9
+ async function uploadAccountStatementIntoDocumentAI(accountType, fileBlob, authParams) {
10
10
  let statementUpload;
11
- const urlEndPoint = `${init_1.zeniAPI.apiEndPoints.documentAIMicroServiceBaseUrl}/1.0/processors/bank-statement`;
11
+ const urlEndPoint = `${init_1.zeniAPI.apiEndPoints.documentAIMicroServiceBaseUrl}/1.0/processors/statement`;
12
12
  const data = new FormData();
13
13
  data.append('attachment_file_0', fileBlob);
14
14
  const attachment_json = JSON.stringify({
15
- document_type: 'reconciliation_bank_statement_upload',
15
+ document_type: accountType === 'credit_card'
16
+ ? 'reconciliation_card_statement_upload'
17
+ : 'reconciliation_bank_statement_upload',
16
18
  purpose_id: 'reconciliation',
17
19
  });
18
20
  data.append('attachment_json_0', attachment_json);
@@ -8,6 +8,16 @@ import { SupportedTransactionPayload, SupportedTransactionWithCOT } from '../../
8
8
  import { UncategorizedAccounts } from '../../accountList/accountListSelector';
9
9
  import { TransactionReviewLocalDataSelectorView } from '../selectorTypes/transactionsViewSelectorTypes';
10
10
  import { TabSpecificLineItems, TransactionCategorizationLineItemData, TransactionReviewLocalData, TransactionsTab, TransactionsTabViewState } from '../types/transactionsViewState';
11
+ /**
12
+ * Extracts line IDs with `pending_review` categorization status from a transaction,
13
+ * preserving the transaction's original line order.
14
+ */
15
+ export declare const getPendingReviewLineIdsFromTransaction: (transaction: SupportedTransactionWithCOT) => string[];
16
+ /**
17
+ * Removes a transaction from a tab view's local data and membership lists.
18
+ * Intended for use within Immer reducer drafts (mutates in place).
19
+ */
20
+ export declare const removeTransactionFromTabView: (tabView: TransactionsTabViewState, transactionId: ID) => void;
11
21
  export declare const MAX_SELECTION_LIMIT = 5;
12
22
  export declare const toTransactionDetailLocalData: (transaction: SupportedTransactionWithCOT, selectedTab: TransactionsTab, lineItemsByTransactionIds: string[], uncategorizedIncomeExpense: UncategorizedAccounts, isUncategorizedExpenseCategoryEnabled?: boolean) => TransactionReviewLocalData;
13
23
  export declare const toSetAllLineItemsToCategoryClass: (draft: TransactionsTabViewState, transaction: SupportedTransactionWithCOT, transactionId: ID, transactionLineId: ID, transactionDetailLocalData: TransactionReviewLocalData, updatedItem: "category" | "class", uncategorizedAccounts: UncategorizedAccounts, selectedTab: TransactionsTab, vendorId?: ID, customerId?: ID, selectedAccount?: AccountBase, selectedClassBase?: ClassBase, isUncategorizedExpenseCategoryEnabled?: boolean) => {
@@ -1,11 +1,40 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hasTransactionLocalDataChanges = exports.isAnyItemWithUncategorizedExpenseAccount = exports.getSnackbarMessageForTransactionReview = exports.mergeTabSpecificLineItems = exports.getLineItemsByTransactionIdsFromLocalData = exports.getLineItemsByTransactionsIdsFromResponse = exports.checkIfAllLineItemsAreCategoryClassFilled = exports.setEntityRecommendationForLineIdInLocalData = exports.toSetAllLineItemsToCategoryClass = exports.toTransactionDetailLocalData = exports.MAX_SELECTION_LIMIT = void 0;
3
+ exports.hasTransactionLocalDataChanges = exports.isAnyItemWithUncategorizedExpenseAccount = exports.getSnackbarMessageForTransactionReview = exports.mergeTabSpecificLineItems = exports.getLineItemsByTransactionIdsFromLocalData = exports.getLineItemsByTransactionsIdsFromResponse = exports.checkIfAllLineItemsAreCategoryClassFilled = exports.setEntityRecommendationForLineIdInLocalData = exports.toSetAllLineItemsToCategoryClass = exports.toTransactionDetailLocalData = exports.MAX_SELECTION_LIMIT = exports.removeTransactionFromTabView = exports.getPendingReviewLineIdsFromTransaction = void 0;
4
4
  const vendorTransaction_1 = require("../../../entity/transaction/stateTypes/vendorTransaction");
5
5
  const transactionDetailLocalDataHelper_1 = require("../../transactionDetail/transactionDetailLocalDataHelper");
6
6
  const transactionDetailLocalDataHelper_2 = require("../../transactionDetail/transactionDetailLocalDataHelper");
7
7
  const transactionsViewState_1 = require("../types/transactionsViewState");
8
8
  const helpers_1 = require("./helpers");
9
+ /**
10
+ * Extracts line IDs with `pending_review` categorization status from a transaction,
11
+ * preserving the transaction's original line order.
12
+ */
13
+ const getPendingReviewLineIdsFromTransaction = (transaction) => {
14
+ if (transaction.lines == null) {
15
+ return [];
16
+ }
17
+ return transaction.lines
18
+ .filter((line) => line.categorizationStatus === 'pending_review')
19
+ .map((line) => line.id);
20
+ };
21
+ exports.getPendingReviewLineIdsFromTransaction = getPendingReviewLineIdsFromTransaction;
22
+ /**
23
+ * Removes a transaction from a tab view's local data and membership lists.
24
+ * Intended for use within Immer reducer drafts (mutates in place).
25
+ */
26
+ const removeTransactionFromTabView = (tabView, transactionId) => {
27
+ delete tabView.transactionReviewLocalDataById[transactionId];
28
+ for (const periodId of Object.keys(tabView.transactionIdsBySelectedPeriod)) {
29
+ tabView.transactionIdsBySelectedPeriod[periodId] =
30
+ tabView.transactionIdsBySelectedPeriod[periodId].filter((id) => id !== transactionId);
31
+ }
32
+ tabView.selectedCheckBoxTransactionIds =
33
+ tabView.selectedCheckBoxTransactionIds.filter((id) => id !== transactionId);
34
+ tabView.transactionIdsWithUnsavedData =
35
+ tabView.transactionIdsWithUnsavedData.filter((id) => id !== transactionId);
36
+ };
37
+ exports.removeTransactionFromTabView = removeTransactionFromTabView;
9
38
  exports.MAX_SELECTION_LIMIT = 5;
10
39
  const toTransactionDetailLocalData = (transaction, selectedTab, lineItemsByTransactionIds, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled) => {
11
40
  const transactionLocal = {
@@ -149,6 +149,12 @@ export declare const fetchTransactionCategorization: import("@reduxjs/toolkit").
149
149
  lineId: ID;
150
150
  selectedTab: TransactionsTab;
151
151
  transactionId: ID;
152
- }, "expenseAutomationTransactionsView/updateSelectedTransactionId">;
152
+ }, "expenseAutomationTransactionsView/updateSelectedTransactionId">, syncTransactionCategorizationFromDetailSave: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, updatedTransaction: SupportedTransactionWithCOT, pendingReviewLineIds: string[], uncategorizedIncomeExpense: UncategorizedAccounts, isUncategorizedExpenseCategoryEnabled?: boolean | undefined], {
153
+ transactionId: TransactionID;
154
+ updatedTransaction: SupportedTransactionWithCOT;
155
+ pendingReviewLineIds: string[];
156
+ uncategorizedIncomeExpense: UncategorizedAccounts;
157
+ isUncategorizedExpenseCategoryEnabled: boolean | undefined;
158
+ }, "expenseAutomationTransactionsView/syncTransactionCategorizationFromDetailSave", never, never>;
153
159
  declare const _default: import("redux").Reducer<TransactionsViewState>;
154
160
  export default _default;
@@ -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.updateSelectedTransactionId = exports.setEntityRecommendationForLineIdsForCategorization = exports.clearExpenseAutomationTransactionsView = exports.clearExpenseAutomationTransactionsViewPerTabView = exports.updateSelectedCheckboxTransactionIds = exports.fetchTransactionCategorizationView = exports.resetOtherTabsFetchState = exports.fetchTransactionCategorizationSuccess = exports.updateTotalCountForTransactionCategorization = exports.setAllItemsToCategoryClassInLocalDataForCategorization = exports.updateSelectedCustomerForTransaction = exports.updateSelectedVendorForTransaction = exports.updateStatusForTransactionNotMiscategorizedUpdateForCategorization = exports.markTransactionAsNotMiscategorized = exports.updateTransactionCategorizationSaveStatus = exports.updateCurrentSelectedTransactionCategorizationTab = exports.updateTransactionCategorization = exports.saveTransactionCategorization = exports.fetchTransactionCategorizationFailure = exports.saveTransactionCategorizationLocalData = exports.initializeTransactionCategorizationViewLocalData = exports.updateTransactionCategorizationUIState = exports.fetchTransactionCategorization = exports.initialState = exports.initialTransactionTabViewState = void 0;
7
+ exports.syncTransactionCategorizationFromDetailSave = exports.updateSelectedTransactionId = exports.setEntityRecommendationForLineIdsForCategorization = exports.clearExpenseAutomationTransactionsView = exports.clearExpenseAutomationTransactionsViewPerTabView = exports.updateSelectedCheckboxTransactionIds = exports.fetchTransactionCategorizationView = exports.resetOtherTabsFetchState = exports.fetchTransactionCategorizationSuccess = exports.updateTotalCountForTransactionCategorization = exports.setAllItemsToCategoryClassInLocalDataForCategorization = exports.updateSelectedCustomerForTransaction = exports.updateSelectedVendorForTransaction = exports.updateStatusForTransactionNotMiscategorizedUpdateForCategorization = exports.markTransactionAsNotMiscategorized = exports.updateTransactionCategorizationSaveStatus = exports.updateCurrentSelectedTransactionCategorizationTab = exports.updateTransactionCategorization = exports.saveTransactionCategorization = exports.fetchTransactionCategorizationFailure = exports.saveTransactionCategorizationLocalData = exports.initializeTransactionCategorizationViewLocalData = exports.updateTransactionCategorizationUIState = exports.fetchTransactionCategorization = exports.initialState = exports.initialTransactionTabViewState = void 0;
8
8
  const toolkit_1 = require("@reduxjs/toolkit");
9
9
  const get_1 = __importDefault(require("lodash/get"));
10
10
  const uniq_1 = __importDefault(require("lodash/uniq"));
@@ -706,7 +706,70 @@ const expenseAutomationTransactionsView = (0, toolkit_1.createSlice)({
706
706
  clearExpenseAutomationTransactionsView(draft) {
707
707
  Object.assign(draft, exports.initialState);
708
708
  },
709
+ syncTransactionCategorizationFromDetailSave: {
710
+ prepare(transactionId, updatedTransaction, pendingReviewLineIds, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled) {
711
+ return {
712
+ payload: {
713
+ transactionId,
714
+ updatedTransaction,
715
+ pendingReviewLineIds,
716
+ uncategorizedIncomeExpense,
717
+ isUncategorizedExpenseCategoryEnabled,
718
+ },
719
+ };
720
+ },
721
+ reducer(draft, action) {
722
+ const { transactionId, updatedTransaction, pendingReviewLineIds, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled, } = action.payload;
723
+ const txnId = transactionId.id;
724
+ const reviewTabView = draft.transactionCategorizationView.review;
725
+ const autoTabView = draft.transactionCategorizationView.autoCategorized;
726
+ const existsInReview = reviewTabView.transactionReviewLocalDataById[txnId] != null;
727
+ const existsInAuto = autoTabView.transactionReviewLocalDataById[txnId] != null;
728
+ if (!existsInReview && !existsInAuto) {
729
+ return;
730
+ }
731
+ const allReviewed = pendingReviewLineIds.length === 0;
732
+ if (allReviewed) {
733
+ if (existsInReview) {
734
+ (0, transactionCategorizationLocalDataHelper_1.removeTransactionFromTabView)(reviewTabView, txnId);
735
+ }
736
+ if (existsInAuto) {
737
+ (0, transactionCategorizationLocalDataHelper_1.removeTransactionFromTabView)(autoTabView, txnId);
738
+ }
739
+ return;
740
+ }
741
+ // Partially reviewed — auto-only: remove transaction from auto tab entirely
742
+ // since pending_review lines don't belong in auto tab and review_complete lines are done
743
+ const isAutoOnly = existsInAuto && !existsInReview;
744
+ if (isAutoOnly) {
745
+ (0, transactionCategorizationLocalDataHelper_1.removeTransactionFromTabView)(autoTabView, txnId);
746
+ return;
747
+ }
748
+ // Review-only or both-tabs: rebuild review tab local data with pending review lines
749
+ if (existsInReview) {
750
+ const newLocalData = (0, transactionCategorizationLocalDataHelper_1.toTransactionDetailLocalData)(updatedTransaction, 'review', pendingReviewLineIds, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled);
751
+ reviewTabView.transactionReviewLocalDataById[txnId] = {
752
+ transactionId: txnId,
753
+ transactionReviewLocalData: {
754
+ ...newLocalData,
755
+ sortedLineItems: updatedTransaction.lines?.map((l) => l.id) ?? [],
756
+ tabSpecificLineItems: {
757
+ review: pendingReviewLineIds,
758
+ },
759
+ },
760
+ };
761
+ reviewTabView.selectedCheckBoxTransactionIds =
762
+ reviewTabView.selectedCheckBoxTransactionIds.filter((id) => id !== txnId);
763
+ reviewTabView.transactionIdsWithUnsavedData =
764
+ reviewTabView.transactionIdsWithUnsavedData.filter((id) => id !== txnId);
765
+ }
766
+ // If both tabs, remove from auto tab entirely
767
+ if (existsInAuto) {
768
+ (0, transactionCategorizationLocalDataHelper_1.removeTransactionFromTabView)(autoTabView, txnId);
769
+ }
770
+ },
771
+ },
709
772
  },
710
773
  });
711
- _a = expenseAutomationTransactionsView.actions, exports.fetchTransactionCategorization = _a.fetchTransactionCategorization, exports.updateTransactionCategorizationUIState = _a.updateTransactionCategorizationUIState, exports.initializeTransactionCategorizationViewLocalData = _a.initializeTransactionCategorizationViewLocalData, exports.saveTransactionCategorizationLocalData = _a.saveTransactionCategorizationLocalData, exports.fetchTransactionCategorizationFailure = _a.fetchTransactionCategorizationFailure, exports.saveTransactionCategorization = _a.saveTransactionCategorization, exports.updateTransactionCategorization = _a.updateTransactionCategorization, exports.updateCurrentSelectedTransactionCategorizationTab = _a.updateCurrentSelectedTransactionCategorizationTab, exports.updateTransactionCategorizationSaveStatus = _a.updateTransactionCategorizationSaveStatus, exports.markTransactionAsNotMiscategorized = _a.markTransactionAsNotMiscategorized, exports.updateStatusForTransactionNotMiscategorizedUpdateForCategorization = _a.updateStatusForTransactionNotMiscategorizedUpdateForCategorization, exports.updateSelectedVendorForTransaction = _a.updateSelectedVendorForTransaction, exports.updateSelectedCustomerForTransaction = _a.updateSelectedCustomerForTransaction, exports.setAllItemsToCategoryClassInLocalDataForCategorization = _a.setAllItemsToCategoryClassInLocalDataForCategorization, exports.updateTotalCountForTransactionCategorization = _a.updateTotalCountForTransactionCategorization, exports.fetchTransactionCategorizationSuccess = _a.fetchTransactionCategorizationSuccess, exports.resetOtherTabsFetchState = _a.resetOtherTabsFetchState, exports.fetchTransactionCategorizationView = _a.fetchTransactionCategorizationView, exports.updateSelectedCheckboxTransactionIds = _a.updateSelectedCheckboxTransactionIds, exports.clearExpenseAutomationTransactionsViewPerTabView = _a.clearExpenseAutomationTransactionsViewPerTabView, exports.clearExpenseAutomationTransactionsView = _a.clearExpenseAutomationTransactionsView, exports.setEntityRecommendationForLineIdsForCategorization = _a.setEntityRecommendationForLineIdsForCategorization, exports.updateSelectedTransactionId = _a.updateSelectedTransactionId;
774
+ _a = expenseAutomationTransactionsView.actions, exports.fetchTransactionCategorization = _a.fetchTransactionCategorization, exports.updateTransactionCategorizationUIState = _a.updateTransactionCategorizationUIState, exports.initializeTransactionCategorizationViewLocalData = _a.initializeTransactionCategorizationViewLocalData, exports.saveTransactionCategorizationLocalData = _a.saveTransactionCategorizationLocalData, exports.fetchTransactionCategorizationFailure = _a.fetchTransactionCategorizationFailure, exports.saveTransactionCategorization = _a.saveTransactionCategorization, exports.updateTransactionCategorization = _a.updateTransactionCategorization, exports.updateCurrentSelectedTransactionCategorizationTab = _a.updateCurrentSelectedTransactionCategorizationTab, exports.updateTransactionCategorizationSaveStatus = _a.updateTransactionCategorizationSaveStatus, exports.markTransactionAsNotMiscategorized = _a.markTransactionAsNotMiscategorized, exports.updateStatusForTransactionNotMiscategorizedUpdateForCategorization = _a.updateStatusForTransactionNotMiscategorizedUpdateForCategorization, exports.updateSelectedVendorForTransaction = _a.updateSelectedVendorForTransaction, exports.updateSelectedCustomerForTransaction = _a.updateSelectedCustomerForTransaction, exports.setAllItemsToCategoryClassInLocalDataForCategorization = _a.setAllItemsToCategoryClassInLocalDataForCategorization, exports.updateTotalCountForTransactionCategorization = _a.updateTotalCountForTransactionCategorization, exports.fetchTransactionCategorizationSuccess = _a.fetchTransactionCategorizationSuccess, exports.resetOtherTabsFetchState = _a.resetOtherTabsFetchState, exports.fetchTransactionCategorizationView = _a.fetchTransactionCategorizationView, exports.updateSelectedCheckboxTransactionIds = _a.updateSelectedCheckboxTransactionIds, exports.clearExpenseAutomationTransactionsViewPerTabView = _a.clearExpenseAutomationTransactionsViewPerTabView, exports.clearExpenseAutomationTransactionsView = _a.clearExpenseAutomationTransactionsView, exports.setEntityRecommendationForLineIdsForCategorization = _a.setEntityRecommendationForLineIdsForCategorization, exports.updateSelectedTransactionId = _a.updateSelectedTransactionId, exports.syncTransactionCategorizationFromDetailSave = _a.syncTransactionCategorizationFromDetailSave;
712
775
  exports.default = expenseAutomationTransactionsView.reducer;
@@ -12,7 +12,7 @@ const transactionDetailReducer_1 = require("../transactionDetailReducer");
12
12
  const transactionDetailState_1 = require("../transactionDetailState");
13
13
  const saveTransactionHelper_1 = require("./saveTransactionHelper");
14
14
  const saveTransactionDetailEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(transactionDetailReducer_1.saveTransactionDetail.match), (0, operators_1.mergeMap)((action) => {
15
- const { transactionId, cotTransactionTracking, isExpenseAutomationEnabled, } = action.payload;
15
+ const { transactionId, cotTransactionTracking, isExpenseAutomationEnabled, isUncategorizedExpenseCategoryEnabled, } = action.payload;
16
16
  const fetchActions = [];
17
17
  const transactionDetailState = state$.value.transactionDetailState;
18
18
  const transactionState = state$.value.transactionState;
@@ -22,7 +22,7 @@ const saveTransactionDetailEpic = (actions$, state$) => actions$.pipe((0, operat
22
22
  if (detail != null && transaction != null) {
23
23
  const localData = detail.transactionDetailLocalData;
24
24
  const transactionSaveUpdates = (0, saveTransactionHelper_1.toTransactionUpdatesFromTransactionDetailLocalData)(localData, transaction, isExpenseAutomationEnabled);
25
- fetchActions.push((0, transactionDetailReducer_1.updateTransactionDetail)(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled, cotTransactionTracking));
25
+ fetchActions.push((0, transactionDetailReducer_1.updateTransactionDetail)(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled, cotTransactionTracking, isUncategorizedExpenseCategoryEnabled));
26
26
  return (0, rxjs_1.from)(fetchActions);
27
27
  }
28
28
  return (0, rxjs_1.from)(fetchActions);
@@ -1,9 +1,10 @@
1
1
  import { ActionsObservable, StateObservable } from 'redux-observable';
2
2
  import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
3
- import { updateTransaction } from '../../../entity/transaction/transactionReducer';
3
+ import { updateTransaction, updateTransactions } from '../../../entity/transaction/transactionReducer';
4
4
  import { updateVendors } from '../../../entity/vendor/vendorReducer';
5
5
  import { RootState } from '../../../reducer';
6
6
  import { ZeniAPI } from '../../../zeniAPI';
7
+ import { syncTransactionCategorizationFromDetailSave } from '../../expenseAutomationView/reducers/transactionsViewReducer';
7
8
  import { initializeTransactionDetailLocalData, markTransactionAsNotMiscategorized, updateStatusConsolidatedSaveTransactionDetail, updateTransactionDetail, updateTransactionDetailSaveStatus, updateTransactionStateIfUpdateActionNotAllowed } from '../transactionDetailReducer';
8
- export type ActionType = ReturnType<typeof updateTransactionDetail> | ReturnType<typeof updateTransaction> | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed> | ReturnType<typeof openSnackbar> | ReturnType<typeof updateTransactionDetailSaveStatus> | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail> | ReturnType<typeof initializeTransactionDetailLocalData> | ReturnType<typeof updateVendors> | ReturnType<typeof markTransactionAsNotMiscategorized>;
9
+ export type ActionType = ReturnType<typeof updateTransactionDetail> | ReturnType<typeof updateTransaction> | ReturnType<typeof updateTransactions> | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed> | ReturnType<typeof openSnackbar> | ReturnType<typeof updateTransactionDetailSaveStatus> | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail> | ReturnType<typeof initializeTransactionDetailLocalData> | ReturnType<typeof updateVendors> | ReturnType<typeof markTransactionAsNotMiscategorized> | ReturnType<typeof syncTransactionCategorizationFromDetailSave>;
9
10
  export declare const updateTransactionDetailEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<ActionType>;
@@ -19,18 +19,21 @@ const otherTransaction_1 = require("../../../entity/transaction/stateTypes/other
19
19
  const transactionType_1 = require("../../../entity/transaction/stateTypes/transactionType");
20
20
  const vendorTransaction_1 = require("../../../entity/transaction/stateTypes/vendorTransaction");
21
21
  const toSupportedTransaction_1 = __importDefault(require("../../../entity/transaction/toSupportedTransaction"));
22
+ const transactionHelper_1 = require("../../../entity/transaction/transactionHelper");
22
23
  const transactionReducer_1 = require("../../../entity/transaction/transactionReducer");
23
24
  const transactionSelector_1 = require("../../../entity/transaction/transactionSelector");
24
25
  const vendorReducer_1 = require("../../../entity/vendor/vendorReducer");
25
26
  const vendorSelector_1 = require("../../../entity/vendor/vendorSelector");
26
27
  const responsePayload_1 = require("../../../responsePayload");
27
28
  const accountListSelector_1 = require("../../accountList/accountListSelector");
29
+ const transactionCategorizationLocalDataHelper_1 = require("../../expenseAutomationView/helpers/transactionCategorizationLocalDataHelper");
30
+ const transactionsViewReducer_1 = require("../../expenseAutomationView/reducers/transactionsViewReducer");
28
31
  const transactionDetailReducer_1 = require("../transactionDetailReducer");
29
32
  const transactionDetailState_1 = require("../transactionDetailState");
30
33
  const saveTransactionHelper_1 = require("./saveTransactionHelper");
31
34
  const updateTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(transactionDetailReducer_1.updateTransactionDetail.match), (0, operators_1.mergeMap)((action) => {
32
35
  const { transactionState, vendorState, transactionDetailState } = state$.value;
33
- const { cotTransactionTracking, transactionId, transactionSaveUpdates } = action.payload;
36
+ const { cotTransactionTracking, transactionId, transactionSaveUpdates, isUncategorizedExpenseCategoryEnabled, } = action.payload;
34
37
  return zeniAPI
35
38
  .putAndGetJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${action.payload.transactionId.id}/categorize`, preparePayload(transactionState, vendorState, transactionDetailState, transactionId, transactionSaveUpdates, cotTransactionTracking))
36
39
  .pipe((0, operators_1.mergeMap)((response) => {
@@ -108,6 +111,12 @@ const updateTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe
108
111
  }));
109
112
  }
110
113
  }
114
+ // Sync transaction categorization list state from detail save
115
+ // Updates list-keyed canonical entity so the list selector reads fresh data
116
+ actions.push((0, transactionReducer_1.updateTransactions)([response.data.transaction], (value) => value.transaction_id, 'merge'));
117
+ const transactionWithCOT = (0, transactionHelper_1.getTransactionWithCOT)(transaction);
118
+ const pendingReviewLineIds = (0, transactionCategorizationLocalDataHelper_1.getPendingReviewLineIdsFromTransaction)(transactionWithCOT);
119
+ actions.push((0, transactionsViewReducer_1.syncTransactionCategorizationFromDetailSave)(transactionIdResp, transactionWithCOT, pendingReviewLineIds, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled));
111
120
  return (0, rxjs_1.from)(actions);
112
121
  }
113
122
  else if ((0, responsePayload_1.isActionNotAllowed)(response)) {
@@ -26,11 +26,12 @@ export declare const downloadAccountingProviderAttachment: import("@reduxjs/tool
26
26
  payload: SupportedTransactionPayload;
27
27
  }, "transactionDetail/uploadMissingAttachmentSuccess", never, {
28
28
  updateType: UpdateType;
29
- }>, updateTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, transactionSaveUpdates: TransactionSaveUpdates, isExpenseAutomationEnabled: boolean, cotTransactionTracking: COTTransactionTracking], {
29
+ }>, updateTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, transactionSaveUpdates: TransactionSaveUpdates, isExpenseAutomationEnabled: boolean, cotTransactionTracking: COTTransactionTracking, isUncategorizedExpenseCategoryEnabled?: boolean | undefined], {
30
30
  transactionId: TransactionID;
31
31
  transactionSaveUpdates: TransactionSaveUpdates;
32
32
  isExpenseAutomationEnabled: boolean;
33
33
  cotTransactionTracking: COTTransactionTracking;
34
+ isUncategorizedExpenseCategoryEnabled: boolean | undefined;
34
35
  }, "transactionDetail/updateTransactionDetail", never, never>, updateTransactionDetailSaveStatus: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, fetchState: FetchState, error?: ZeniAPIStatus<Record<string, unknown>> | undefined], {
35
36
  transactionId: TransactionID;
36
37
  fetchState: FetchState;
@@ -64,6 +65,7 @@ export declare const downloadAccountingProviderAttachment: import("@reduxjs/tool
64
65
  cotTransactionTracking: COTTransactionTracking;
65
66
  isExpenseAutomationEnabled: boolean;
66
67
  transactionId: TransactionID;
68
+ isUncategorizedExpenseCategoryEnabled?: boolean;
67
69
  }, "transactionDetail/saveTransactionDetail">, initializeTransactionDetailLocalData: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
68
70
  transactionId: TransactionID;
69
71
  customerId?: ID;
@@ -112,13 +112,14 @@ const transactionDetail = (0, toolkit_1.createSlice)({
112
112
  };
113
113
  }
114
114
  },
115
- prepare(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled, cotTransactionTracking) {
115
+ prepare(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled, cotTransactionTracking, isUncategorizedExpenseCategoryEnabled) {
116
116
  return {
117
117
  payload: {
118
118
  transactionId,
119
119
  transactionSaveUpdates,
120
120
  isExpenseAutomationEnabled,
121
121
  cotTransactionTracking,
122
+ isUncategorizedExpenseCategoryEnabled,
122
123
  },
123
124
  };
124
125
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "4.19.39",
3
+ "version": "4.19.40-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",