@zeniai/client-epic-state 4.17.70 → 4.17.71

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.
@@ -7,6 +7,7 @@ export interface RecommendedVendorBasePayload {
7
7
  reason?: string | null;
8
8
  recommendation_hash?: string | null;
9
9
  third_party_merchant_id?: string | null;
10
+ type?: string | null;
10
11
  vendor_name_confidence?: number;
11
12
  website_url?: string | null;
12
13
  }
@@ -26,3 +26,26 @@ export declare const getRecommendationAmountRange: (amountValue: number) => {
26
26
  max?: number;
27
27
  };
28
28
  export declare const mapRecommendedVendorPayloadToBase: (payload: RecommendedVendorBasePayload) => RecommendedVendorBase;
29
+ /**
30
+ * Interface for tracking COT recommendation types viewed
31
+ */
32
+ export interface COTRecommendationTracking {
33
+ recommendationTypesViewed: string[];
34
+ }
35
+ /**
36
+ * Interface for tracking COT line item data
37
+ */
38
+ export interface COTLineItemTracking {
39
+ category: COTRecommendationTracking;
40
+ class: COTRecommendationTracking;
41
+ lineId: ID;
42
+ vendor: COTRecommendationTracking;
43
+ }
44
+ /**
45
+ * Type for COT tracking state (array of line items)
46
+ */
47
+ export type COTTransactionTracking = COTLineItemTracking[];
48
+ /**
49
+ * Type for COT transaction tracking (Record of transaction ID to line items)
50
+ */
51
+ export type COTTransactionTrackingByTransactionId = Record<ID, COTLineItemTracking[]>;
@@ -39,17 +39,18 @@ const getRecommendationAmountRange = (amountValue) => {
39
39
  };
40
40
  exports.getRecommendationAmountRange = getRecommendationAmountRange;
41
41
  const mapRecommendedVendorPayloadToBase = (payload) => {
42
- var _a, _b, _c, _d, _e, _f, _g;
42
+ var _a, _b, _c, _d, _e, _f, _g, _h;
43
43
  return {
44
44
  name: payload.vendor_name,
45
45
  thirdPartyMerchantId: (_a = payload.third_party_merchant_id) !== null && _a !== void 0 ? _a : undefined,
46
46
  id: (_b = payload.vendor_id) !== null && _b !== void 0 ? _b : undefined,
47
47
  qboId: (_c = payload.qbo_id) !== null && _c !== void 0 ? _c : undefined,
48
48
  reason: (_d = payload.reason) !== null && _d !== void 0 ? _d : undefined,
49
- recommendationHash: (_e = payload.recommendation_hash) !== null && _e !== void 0 ? _e : undefined,
49
+ type: (_e = payload.type) !== null && _e !== void 0 ? _e : undefined,
50
+ recommendationHash: (_f = payload.recommendation_hash) !== null && _f !== void 0 ? _f : undefined,
50
51
  vendorNameConfidence: payload.vendor_name_confidence,
51
- logo: Boolean((_f = payload.logo) === null || _f === void 0 ? void 0 : _f.url) === true
52
- ? (0, zeniUrl_1.toZeniUrlWithoutBaseURL)((_g = payload.logo) === null || _g === void 0 ? void 0 : _g.url)
52
+ logo: Boolean((_g = payload.logo) === null || _g === void 0 ? void 0 : _g.url) === true
53
+ ? (0, zeniUrl_1.toZeniUrlWithoutBaseURL)((_h = payload.logo) === null || _h === void 0 ? void 0 : _h.url)
53
54
  : undefined,
54
55
  websiteUrl: payload.website_url != null
55
56
  ? (0, zeniUrl_1.toZeniUrlWithoutBaseURL)(payload.website_url)
@@ -8,6 +8,7 @@ export interface RecommendedVendorBase {
8
8
  reason?: string;
9
9
  recommendationHash?: ID;
10
10
  thirdPartyMerchantId?: ID;
11
+ type?: string;
11
12
  vendorNameConfidence?: number;
12
13
  websiteUrl?: ZeniUrl;
13
14
  }
@@ -49,6 +49,9 @@ export interface TransactionWithAccountAndClassLinePayload extends TransactionLi
49
49
  is_class_miscategorized?: boolean;
50
50
  recipient_amount?: number;
51
51
  }
52
+ /**
53
+ * Transaction with account and class line payload with COT tracking
54
+ */
52
55
  export declare const toTransactionWithAccountAndClassLine: (payload: TransactionWithAccountAndClassLinePayload, currency: Currency, type?: LineType) => TransactionWithAccountAndClassLine;
53
56
  /**
54
57
  * Transaction with product or service line payload
@@ -25,6 +25,9 @@ const toTransactionLineBase = (payload, lineType, currency) => ({
25
25
  : undefined,
26
26
  });
27
27
  const toLinkedTransactionLine = (payload, currency) => (Object.assign(Object.assign({}, toTransactionLineBase(payload, 'linked_transaction_line', currency)), { linkedTransactions: payload.linked_transactions.map((transactionIDPayload) => (0, transactionIDPayload_1.toTransactionID)(transactionIDPayload)) }));
28
+ /**
29
+ * Transaction with account and class line payload with COT tracking
30
+ */
28
31
  const toTransactionWithAccountAndClassLine = (payload, currency, type = 'transaction_with_account_and_class_line') => {
29
32
  var _a, _b, _c, _d, _e;
30
33
  return (Object.assign(Object.assign({}, toTransactionLineBase(payload, type, currency)), { class: (0, classPayload_1.mapClassBasePayloadToClassBase)((_a = payload.line_detail.class) !== null && _a !== void 0 ? _a : {}), account: (0, accountPayload_1.mapAccountBasePayloadToAccountBase)(payload.line_detail.account), customer: payload.line_detail.customer != null &&
@@ -39,8 +39,26 @@ export interface TransactionPayload extends TransactionIDPayload, AccountBasePay
39
39
  vendor_id?: string | null;
40
40
  vendor_name?: string | null;
41
41
  }
42
+ type LinesWithCOTTracking = LinePayload & {
43
+ cot_viewing_flags?: {
44
+ category: {
45
+ types_viewed: string[];
46
+ };
47
+ class: {
48
+ types_viewed: string[];
49
+ };
50
+ vendor: {
51
+ types_viewed: string[];
52
+ };
53
+ };
54
+ };
55
+ export interface TransactionPayloadWithCOTTracking extends TransactionPayload {
56
+ lines: LinesWithCOTTracking[];
57
+ }
42
58
  export declare const getTransactionPayloadAmount: (payload: TransactionPayload) => Amount;
43
59
  export declare const toTransaction: (payload: TransactionPayload) => Transaction;
44
60
  export declare const toTransactionPayload: (transaction: Transaction) => Partial<TransactionPayload>;
61
+ export declare const injectCOTFlagsIntoTransactionPayload: (payload: Partial<TransactionPayload>, transaction: Transaction) => Partial<TransactionPayloadWithCOTTracking>;
45
62
  export declare const transformRecommendation: (recommendation: RecommendationPayload) => Recommendation[];
46
63
  export declare const getRecommendationsPerLine: (lines?: LinePayload[], recommendations?: RecommendationPayload[]) => RecommendationByLineId | undefined;
64
+ export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRecommendationsPerLine = exports.transformRecommendation = exports.toTransactionPayload = exports.toTransaction = exports.getTransactionPayloadAmount = void 0;
3
+ exports.getRecommendationsPerLine = exports.transformRecommendation = exports.injectCOTFlagsIntoTransactionPayload = exports.toTransactionPayload = exports.toTransaction = exports.getTransactionPayloadAmount = void 0;
4
4
  const recommendationPayload_1 = require("../../../commonPayloadTypes/recommendationPayload");
5
5
  const urlPayload_1 = require("../../../commonPayloadTypes/urlPayload");
6
6
  const amount_1 = require("../../../commonStateTypes/amount");
@@ -86,6 +86,38 @@ const toTransactionPayload = (transaction) => {
86
86
  return transactionPayload;
87
87
  };
88
88
  exports.toTransactionPayload = toTransactionPayload;
89
+ const injectCOTFlagsIntoTransactionPayload = (payload, transaction) => {
90
+ var _a, _b;
91
+ // Traverse payload.lines and inject cot_viewing_flags from corresponding transaction lines
92
+ const linesWithCOTFlags = (_b = (_a = payload.lines) === null || _a === void 0 ? void 0 : _a.map((payloadLine) => {
93
+ var _a, _b, _c, _d;
94
+ // Find the corresponding transaction line
95
+ const transactionLine = (_a = transaction.lines) === null || _a === void 0 ? void 0 : _a.find((line) => line.id === payloadLine.line_id);
96
+ if (transactionLine &&
97
+ 'cotViewingFlags' in transactionLine &&
98
+ transactionLine.cotViewingFlags != null) {
99
+ // Type assertion to access COT viewing flags
100
+ const cotFlags = transactionLine
101
+ .cotViewingFlags;
102
+ // Inject COT flags into the payload line
103
+ return Object.assign(Object.assign({}, payloadLine), { cot_viewing_flags: {
104
+ category: {
105
+ types_viewed: (_b = cotFlags === null || cotFlags === void 0 ? void 0 : cotFlags.category.recommendationTypesViewed) !== null && _b !== void 0 ? _b : [],
106
+ },
107
+ class: {
108
+ types_viewed: (_c = cotFlags === null || cotFlags === void 0 ? void 0 : cotFlags.class.recommendationTypesViewed) !== null && _c !== void 0 ? _c : [],
109
+ },
110
+ vendor: {
111
+ types_viewed: (_d = cotFlags === null || cotFlags === void 0 ? void 0 : cotFlags.vendor.recommendationTypesViewed) !== null && _d !== void 0 ? _d : [],
112
+ },
113
+ } });
114
+ }
115
+ // Return original payload line if no COT flags
116
+ return payloadLine;
117
+ })) !== null && _b !== void 0 ? _b : [];
118
+ return Object.assign(Object.assign({}, payload), { lines: linesWithCOTFlags });
119
+ };
120
+ exports.injectCOTFlagsIntoTransactionPayload = injectCOTFlagsIntoTransactionPayload;
89
121
  const transformRecommendation = (recommendation) => {
90
122
  var _a, _b, _c, _d;
91
123
  const accounts = recommendation.accounts;
@@ -1,5 +1,6 @@
1
1
  import { Amount } from '../../../commonStateTypes/amount';
2
2
  import { ID } from '../../../commonStateTypes/common';
3
+ import { COTLineItemTracking } from '../../../commonStateTypes/recommendationBase';
3
4
  import { AccountBase } from '../../account/accountState';
4
5
  import { ClassBase } from '../../class/classState';
5
6
  import { CustomerBase } from '../../customer/customerState';
@@ -40,6 +41,9 @@ export interface TransactionWithAccountAndClassLine extends TransactionLineBase
40
41
  customer?: CustomerBase;
41
42
  vendor?: VendorBase;
42
43
  }
44
+ export interface TransactionWithAccountAndClassLineWithCOTTracking extends TransactionWithAccountAndClassLine {
45
+ cotViewingFlags?: COTLineItemTracking;
46
+ }
43
47
  export interface TransactionWithProductOrServiceLine extends TransactionWithAccountAndClassLine {
44
48
  item: ProductOrService;
45
49
  lineDetailType: PlatformLineDetailType;
@@ -53,6 +57,9 @@ export interface TransactionInfoLine extends TransactionLineBase {
53
57
  lineDetailType: PlatformLineDetailType;
54
58
  }
55
59
  export type Line = TransactionWithProductOrServiceLine | JournalEntryTransactionLine | TransactionWithAccountAndClassLine | TransactionInfoLine | LinkedTransactionLine | TransactionLineBase;
60
+ export type LineWithCOTTracking = Line & {
61
+ cotViewingFlags?: COTLineItemTracking;
62
+ };
56
63
  export type LineType = 'linked_transaction_line' | 'transaction_with_account_and_class_line' | 'transaction_with_product_or_service_line' | 'journal_entry_transaction_line' | 'transaction_info_line' | 'transaction_line_base';
57
64
  export default Line;
58
65
  export interface ProductOrService {
package/lib/index.d.ts CHANGED
@@ -23,7 +23,7 @@ import { getActualPeriodOfFY, getActualPeriodOfFYQtr } from './commonStateTypes/
23
23
  import { getFYMonths } from './commonStateTypes/fiscalYearHelpers/getFYMonths';
24
24
  import { getFYQuarterAndYear, getLastMonthOfFYQuarter, getLastMonthOfFYYear } from './commonStateTypes/fiscalYearHelpers/getFYQuarterAndYear';
25
25
  import { getStartOfAndEndOfTimeframeForFY } from './commonStateTypes/fiscalYearHelpers/getStartOfAndEndOfTimeframeFY';
26
- import { Recommendation, RecommendationWithCOT, TransactionLineRecommendationFieldTypes } from './commonStateTypes/recommendationBase';
26
+ import { COTLineItemTracking, COTRecommendationTracking, COTTransactionTracking, COTTransactionTrackingByTransactionId, Recommendation, RecommendationWithCOT, TransactionLineRecommendationFieldTypes } from './commonStateTypes/recommendationBase';
27
27
  import { isAllFetchCompleted, isAnyFetchInProgress, reduceAllFetchState, reduceAnyCompletedFetchState, reduceAnyFetchState, reduceFetchState } from './commonStateTypes/reduceFetchState';
28
28
  import { toReimbursementTypeCode } from './commonStateTypes/reimbursementTypeCode';
29
29
  import { ClassesViewSelectorReportV2 } from './commonStateTypes/selectorTypes/classesViewSelectorReport';
@@ -774,7 +774,7 @@ export { openSnackbar, closeSnackbar, getSnackbar, SnackbarMessageType, Snackbar
774
774
  export { getSpendManagementEffectiveListPeriod, getSelectedCompanyOfficer, showBillPayPromoPage, showReimbursementPromoPage, getActualPaymentDate, isVerifiedStatusCode, isBulkProcessing, getBillListUniqueType, getRemiListUniqueType, BulkOperationType, BulkOperationFinishedType, getBulkOperationSuffix, ZeniAccountsPromoConfig, toAccountsPromoConfig, isPaymentMethodOutsideZeni, isAwaitingMarkAsPaid, checkIfLowBalance, };
775
775
  export { FilterCategoryValueType, canSendMonthEndEmailReport, shouldEnableCalendarPickerForLastReportSent, };
776
776
  export { BillPayConfig, BillPaymentConfigCodeType, BillPaymentSubConfigCodeType, getInternationalSubConfigCodeKey, InternationalSubConfigCodeType, BILL_NEW_PAYMENT_METHODS, NEW_INTERNATIONAL_METHOD_SUBTEXT, SWIFT_OUR_INTERNATIONAL_METHOD_SUBTEXT, LOCAL_CURRENCY_INTERNATIONAL_METHOD_SUBTEXT, AccountTypeSubConfigCodeKeyType, };
777
- export { Recommendation, TransactionLineRecommendationFieldTypes, RecommendationWithCOT, };
777
+ export { Recommendation, TransactionLineRecommendationFieldTypes, RecommendationWithCOT, COTLineItemTracking, COTRecommendationTracking, COTTransactionTrackingByTransactionId, COTTransactionTracking, };
778
778
  export { Filing1099TinType };
779
779
  export { BillPayCardReport };
780
780
  export { ReimbursementCardReport };
@@ -108,6 +108,7 @@ const saveTransactionVendorEpic = (actions$, state$, zeniAPI) => actions$.pipe((
108
108
  actions.push((0, transactionDetailReducer_1.saveTransactionDetail)({
109
109
  transactionId: action.payload.transactionId,
110
110
  isExpenseAutomationEnabled: action.payload.isExpenseAutomationEnabled,
111
+ cotTransactionTracking: [], // We don't need to pass COT tracking for vendor save
111
112
  }));
112
113
  }
113
114
  return (0, rxjs_1.from)(actions);
@@ -12,7 +12,7 @@ const accountListSelector_1 = require("../../../accountList/accountListSelector"
12
12
  const saveTransactionHelper_1 = require("../../helpers/saveTransactionHelper");
13
13
  const transactionsViewReducer_1 = require("../../reducers/transactionsViewReducer");
14
14
  const saveTransactionCategorizationEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(transactionsViewReducer_1.saveTransactionCategorization.match), (0, operators_1.mergeMap)((action) => {
15
- const { transactionIds, selectedTab } = action.payload;
15
+ const { transactionIds, cotTrackingByTransactionId, selectedTab } = action.payload;
16
16
  const fetchActions = [];
17
17
  const { transactionState, expenseAutomationTransactionsViewState } = state$.value;
18
18
  const transactionSaveUpdates = [];
@@ -25,7 +25,7 @@ const saveTransactionCategorizationEpic = (actions$, state$) => actions$.pipe((0
25
25
  transactionSaveUpdates.push((0, saveTransactionHelper_1.toTransactionUpdatesFromTransactionCategorizationLocalData)(localData, transaction, uncategorizedIncomeExpense));
26
26
  }
27
27
  });
28
- fetchActions.push((0, transactionsViewReducer_1.updateTransactionCategorization)(selectedTab, transactionIds, transactionSaveUpdates));
28
+ fetchActions.push((0, transactionsViewReducer_1.updateTransactionCategorization)(selectedTab, transactionIds, transactionSaveUpdates, cotTrackingByTransactionId));
29
29
  return (0, rxjs_1.from)(fetchActions);
30
30
  }));
31
31
  exports.saveTransactionCategorizationEpic = saveTransactionCategorizationEpic;
@@ -21,9 +21,9 @@ const vendorSelector_1 = require("../../../../entity/vendor/vendorSelector");
21
21
  const responsePayload_1 = require("../../../../responsePayload");
22
22
  const transactionsViewReducer_1 = require("../../reducers/transactionsViewReducer");
23
23
  const updateTransactionCategorizationEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(transactionsViewReducer_1.updateTransactionCategorization.match), (0, operators_1.mergeMap)((action) => {
24
- const { selectedTab } = action.payload;
24
+ const { selectedTab, transactionIds, transactionSaveUpdates, cotTrackingByTransactionId, } = action.payload;
25
25
  const { transactionState, vendorState, expenseAutomationTransactionsViewState, } = state$.value;
26
- const payloadArray = preparePayload(selectedTab, transactionState, vendorState, expenseAutomationTransactionsViewState, action.payload.transactionIds, action.payload.transactionSaveUpdates).filter((payload) => payload != null);
26
+ const payloadArray = preparePayload(selectedTab, transactionState, vendorState, expenseAutomationTransactionsViewState, transactionIds, transactionSaveUpdates, cotTrackingByTransactionId).filter((payload) => payload != null);
27
27
  return zeniAPI
28
28
  .putAndGetJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/expense-automation/transactions/categorize`, { transactions: payloadArray })
29
29
  .pipe((0, operators_1.mergeMap)((response) => {
@@ -39,7 +39,7 @@ const updateTransactionCategorizationEpic = (actions$, state$, zeniAPI) => actio
39
39
  }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, transactionsViewReducer_1.updateTransactionCategorizationSaveStatus)(selectedTab, 'Error', (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', `REST API call errored out ${JSON.stringify(error)}`)))));
40
40
  }));
41
41
  exports.updateTransactionCategorizationEpic = updateTransactionCategorizationEpic;
42
- function prepareTransactionPayload(selectedTab, transactionState, vendorState, transactionsViewState, transactionId, saveUpdates) {
42
+ function prepareTransactionPayload(selectedTab, transactionState, vendorState, transactionsViewState, transactionId, saveUpdates, cotTrackingByTransactionId) {
43
43
  var _a, _b, _c;
44
44
  const detail = (0, transactionSelector_1.getSupportedTransactionById)(transactionState, transactionId);
45
45
  const tranDetail = (0, get_1.default)(transactionsViewState.transactionCategorizationView[selectedTab]
@@ -81,7 +81,7 @@ function prepareTransactionPayload(selectedTab, transactionState, vendorState, t
81
81
  }
82
82
  }
83
83
  if (detail != null) {
84
- const transUpdates = toTransactionUpdatePayload(saveUpdates.updates, detail, vendorUpdates, customerUpdates, tranSelectedEntity);
84
+ const transUpdates = toTransactionUpdatePayload(saveUpdates.updates, detail, transactionId, cotTrackingByTransactionId, vendorUpdates, customerUpdates, tranSelectedEntity);
85
85
  const entityUpdates = toEntityUpdatePayload(saveUpdates.entityRelatedUpdates);
86
86
  return {
87
87
  entity_related_updates: entityUpdates,
@@ -92,12 +92,12 @@ function prepareTransactionPayload(selectedTab, transactionState, vendorState, t
92
92
  }
93
93
  return undefined;
94
94
  }
95
- function preparePayload(selectedTab, transactionState, vendorState, transactionsViewState, transactionIds, saveUpdates) {
95
+ function preparePayload(selectedTab, transactionState, vendorState, transactionsViewState, transactionIds, saveUpdates, cotTrackingByTransactionId) {
96
96
  const payload = [];
97
97
  transactionIds.forEach((transactionId) => {
98
98
  const saveUpdate = saveUpdates.find((update) => update.transactionId === transactionId);
99
99
  if (saveUpdate != null) {
100
- const transactionPayload = prepareTransactionPayload(selectedTab, transactionState, vendorState, transactionsViewState, transactionId, saveUpdate);
100
+ const transactionPayload = prepareTransactionPayload(selectedTab, transactionState, vendorState, transactionsViewState, transactionId, saveUpdate, cotTrackingByTransactionId);
101
101
  if (transactionPayload != null) {
102
102
  payload.push(transactionPayload);
103
103
  }
@@ -110,7 +110,7 @@ function preparePayload(selectedTab, transactionState, vendorState, transactions
110
110
  return payload;
111
111
  }
112
112
  }
113
- const toTransactionUpdatePayload = (updates, detail, vendorUpdates, customerUpdates, tranSelectedEntity) => {
113
+ const toTransactionUpdatePayload = (updates, detail, transactionId, cotTrackingByTransactionId, vendorUpdates, customerUpdates, tranSelectedEntity) => {
114
114
  var _a, _b;
115
115
  const transaction = Object.assign({}, detail);
116
116
  transaction.memo = (_a = updates.memo) !== null && _a !== void 0 ? _a : '';
@@ -143,6 +143,17 @@ const toTransactionUpdatePayload = (updates, detail, vendorUpdates, customerUpda
143
143
  if (lineUpdates.recommendation != null) {
144
144
  recommendationUpdates[line.id] = lineUpdates.recommendation;
145
145
  }
146
+ // Add COT viewing flags to the line from cotTrackingByTransactionId
147
+ const cotTrackingForTransaction = cotTrackingByTransactionId[transactionId];
148
+ const cotTrackingForLine = cotTrackingForTransaction === null || cotTrackingForTransaction === void 0 ? void 0 : cotTrackingForTransaction.find((item) => item.lineId === line.id);
149
+ if (cotTrackingForLine != null) {
150
+ lineToBeUpdated.cotViewingFlags = {
151
+ vendor: cotTrackingForLine.vendor,
152
+ category: cotTrackingForLine.category,
153
+ class: cotTrackingForLine.class,
154
+ lineId: cotTrackingForLine.lineId,
155
+ };
156
+ }
146
157
  return lineToBeUpdated;
147
158
  }
148
159
  return line;
@@ -150,24 +161,27 @@ const toTransactionUpdatePayload = (updates, detail, vendorUpdates, customerUpda
150
161
  transaction.lines = newLineMap;
151
162
  }
152
163
  transaction.recommendations = recommendationUpdates;
153
- // Added this check because now customer are also part of Expense,Journal Entry and Check type of transactions
164
+ // Convert transaction to payload first
165
+ let basePayload;
154
166
  if ((0, customerTransaction_1.isCustomerTransaction)(transaction)) {
155
- return (0, customerTransactionPayload_1.toCustomerTransactionPayload)(transaction);
167
+ basePayload = (0, customerTransactionPayload_1.toCustomerTransactionPayload)(transaction);
156
168
  }
157
169
  else if ((0, vendorTransaction_1.isVendorTransaction)(transaction)) {
158
170
  if (tranSelectedEntity != null && tranSelectedEntity.type === 'customer') {
159
- return (0, vendorTransactionPayload_1.toVendorTransactionWithCustomerPayload)(transaction, customerUpdates);
171
+ basePayload = (0, vendorTransactionPayload_1.toVendorTransactionWithCustomerPayload)(transaction, customerUpdates);
160
172
  }
161
173
  else {
162
- return (0, vendorTransactionPayload_1.toVendorTransactionPayload)(transaction, vendorUpdates);
174
+ basePayload = (0, vendorTransactionPayload_1.toVendorTransactionPayload)(transaction, vendorUpdates);
163
175
  }
164
176
  }
165
177
  else if ((0, otherTransaction_1.isTransferTransaction)(transaction)) {
166
- return (0, otherTransactionPayload_1.toTransferTransactionPayload)(transaction);
178
+ basePayload = (0, otherTransactionPayload_1.toTransferTransactionPayload)(transaction);
167
179
  }
168
180
  else {
169
- return (0, transactionPayload_1.toTransactionPayload)(transaction);
181
+ basePayload = (0, transactionPayload_1.toTransactionPayload)(transaction);
170
182
  }
183
+ // Inject COT flags into the payload
184
+ return (0, transactionPayload_1.injectCOTFlagsIntoTransactionPayload)(basePayload, transaction);
171
185
  };
172
186
  const toEntityUpdatePayload = (entityUpdates) => {
173
187
  const entityUpdatesPayload = [];
@@ -1,5 +1,5 @@
1
1
  import { FetchState, ID } from '../../../commonStateTypes/common';
2
- import { RecommendationWithCOT } from '../../../commonStateTypes/recommendationBase';
2
+ import { COTTransactionTrackingByTransactionId, RecommendationWithCOT } from '../../../commonStateTypes/recommendationBase';
3
3
  import { MonthYearPeriod, TimePeriod } from '../../../commonStateTypes/timePeriod';
4
4
  import { PageToken } from '../../../commonStateTypes/viewAndReport/viewAndReport';
5
5
  import { AccountBase } from '../../../entity/account/accountState';
@@ -49,13 +49,15 @@ export declare const fetchTransactionCategorization: import("@reduxjs/toolkit").
49
49
  selectedPeriod: MonthYearPeriod;
50
50
  selectedTab: TransactionsTab;
51
51
  status: ZeniAPIStatus;
52
- }, "expenseAutomationTransactionsView/fetchTransactionCategorizationFailure">, saveTransactionCategorization: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[selectedTab: "review" | "autoCategorized", transactionIds: string[]], {
52
+ }, "expenseAutomationTransactionsView/fetchTransactionCategorizationFailure">, saveTransactionCategorization: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[selectedTab: "review" | "autoCategorized", transactionIds: string[], cotTrackingByTransactionId: COTTransactionTrackingByTransactionId], {
53
53
  selectedTab: "review" | "autoCategorized";
54
54
  transactionIds: string[];
55
- }, "expenseAutomationTransactionsView/saveTransactionCategorization", never, never>, updateTransactionCategorization: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[selectedTab: "review" | "autoCategorized", transactionIds: string[], transactionSaveUpdates: TransactionSaveUpdates[]], {
55
+ cotTrackingByTransactionId: COTTransactionTrackingByTransactionId;
56
+ }, "expenseAutomationTransactionsView/saveTransactionCategorization", never, never>, updateTransactionCategorization: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[selectedTab: "review" | "autoCategorized", transactionIds: string[], transactionSaveUpdates: TransactionSaveUpdates[], cotTrackingByTransactionId: COTTransactionTrackingByTransactionId], {
56
57
  selectedTab: "review" | "autoCategorized";
57
58
  transactionIds: string[];
58
59
  transactionSaveUpdates: TransactionSaveUpdates[];
60
+ cotTrackingByTransactionId: COTTransactionTrackingByTransactionId;
59
61
  }, "expenseAutomationTransactionsView/updateTransactionCategorization", never, never>, updateCurrentSelectedTransactionCategorizationTab: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[newSelectedTab: "review" | "autoCategorized"], {
60
62
  newSelectedTab: "review" | "autoCategorized";
61
63
  }, "expenseAutomationTransactionsView/updateCurrentSelectedTransactionCategorizationTab", never, never>, updateTransactionCategorizationSaveStatus: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[selectedTab: "review" | "autoCategorized", fetchState: FetchState, error?: ZeniAPIStatus<Record<string, unknown>> | undefined], {
@@ -225,11 +225,12 @@ const expenseAutomationTransactionsView = (0, toolkit_1.createSlice)({
225
225
  }
226
226
  },
227
227
  saveTransactionCategorization: {
228
- prepare(selectedTab, transactionIds) {
228
+ prepare(selectedTab, transactionIds, cotTrackingByTransactionId) {
229
229
  return {
230
230
  payload: {
231
231
  selectedTab,
232
232
  transactionIds,
233
+ cotTrackingByTransactionId,
233
234
  },
234
235
  };
235
236
  },
@@ -254,12 +255,13 @@ const expenseAutomationTransactionsView = (0, toolkit_1.createSlice)({
254
255
  fetchState: 'In-Progress',
255
256
  };
256
257
  },
257
- prepare(selectedTab, transactionIds, transactionSaveUpdates) {
258
+ prepare(selectedTab, transactionIds, transactionSaveUpdates, cotTrackingByTransactionId) {
258
259
  return {
259
260
  payload: {
260
261
  selectedTab,
261
262
  transactionIds,
262
263
  transactionSaveUpdates,
264
+ cotTrackingByTransactionId,
263
265
  },
264
266
  };
265
267
  },
@@ -12,8 +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 = action.payload.transactionId;
16
- const isExpenseAutomationEnabled = action.payload.isExpenseAutomationEnabled;
15
+ const { transactionId, cotTransactionTracking, isExpenseAutomationEnabled, } = action.payload;
17
16
  const fetchActions = [];
18
17
  const transactionDetailState = state$.value.transactionDetailState;
19
18
  const transactionState = state$.value.transactionState;
@@ -23,7 +22,7 @@ const saveTransactionDetailEpic = (actions$, state$) => actions$.pipe((0, operat
23
22
  if (detail != null && transaction != null) {
24
23
  const localData = detail.transactionDetailLocalData;
25
24
  const transactionSaveUpdates = (0, saveTransactionHelper_1.toTransactionUpdatesFromTransactionDetailLocalData)(localData, transaction, isExpenseAutomationEnabled);
26
- fetchActions.push((0, transactionDetailReducer_1.updateTransactionDetail)(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled));
25
+ fetchActions.push((0, transactionDetailReducer_1.updateTransactionDetail)(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled, cotTransactionTracking));
27
26
  return (0, rxjs_1.from)(fetchActions);
28
27
  }
29
28
  return (0, rxjs_1.from)(fetchActions);
@@ -30,8 +30,9 @@ const transactionDetailState_1 = require("../transactionDetailState");
30
30
  const saveTransactionHelper_1 = require("./saveTransactionHelper");
31
31
  const updateTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(transactionDetailReducer_1.updateTransactionDetail.match), (0, operators_1.mergeMap)((action) => {
32
32
  const { transactionState, vendorState, transactionDetailState } = state$.value;
33
+ const { cotTransactionTracking, transactionId, transactionSaveUpdates } = action.payload;
33
34
  return zeniAPI
34
- .putAndGetJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${action.payload.transactionId.id}/categorize`, preparePayload(transactionState, vendorState, transactionDetailState, action.payload.transactionId, action.payload.transactionSaveUpdates))
35
+ .putAndGetJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${action.payload.transactionId.id}/categorize`, preparePayload(transactionState, vendorState, transactionDetailState, transactionId, transactionSaveUpdates, cotTransactionTracking))
35
36
  .pipe((0, operators_1.mergeMap)((response) => {
36
37
  var _a, _b;
37
38
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
@@ -121,7 +122,7 @@ const updateTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe
121
122
  }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, transactionDetailReducer_1.updateTransactionDetailSaveStatus)(action.payload.transactionId, 'Error', (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', `REST API call errored out ${error}`)))));
122
123
  }));
123
124
  exports.updateTransactionDetailEpic = updateTransactionDetailEpic;
124
- function preparePayload(transactionState, vendorState, transactionDetailState, transactionId, saveUpdates) {
125
+ function preparePayload(transactionState, vendorState, transactionDetailState, transactionId, saveUpdates, cotTransactionTracking) {
125
126
  const transactionDetailKey = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
126
127
  const detail = (0, transactionSelector_1.getSupportedTransactionById)(transactionState, transactionDetailKey);
127
128
  const tranDetail = (0, get_1.default)(transactionDetailState.transactionDetailById, transactionDetailKey, undefined);
@@ -156,7 +157,7 @@ function preparePayload(transactionState, vendorState, transactionDetailState, t
156
157
  };
157
158
  }
158
159
  if (detail != null) {
159
- const transUpdates = toTransactionUpdatePayload(saveUpdates.updates, detail, vendorUpdates, customerUpdates, currentSelectedEntity);
160
+ const transUpdates = toTransactionUpdatePayload(saveUpdates.updates, detail, cotTransactionTracking, vendorUpdates, customerUpdates, currentSelectedEntity);
160
161
  const entityUpdates = toEntityUpdatePayload(saveUpdates.entityRelatedUpdates);
161
162
  return {
162
163
  entity_related_updates: entityUpdates,
@@ -166,7 +167,7 @@ function preparePayload(transactionState, vendorState, transactionDetailState, t
166
167
  }
167
168
  return undefined;
168
169
  }
169
- const toTransactionUpdatePayload = (updates, detail, vendorUpdates, customerUpdates, tranSelectedEntity) => {
170
+ const toTransactionUpdatePayload = (updates, detail, cotTransactionTracking, vendorUpdates, customerUpdates, tranSelectedEntity) => {
170
171
  var _a, _b;
171
172
  const transaction = Object.assign({}, detail);
172
173
  transaction.memo = (_a = updates.memo) !== null && _a !== void 0 ? _a : '';
@@ -199,6 +200,16 @@ const toTransactionUpdatePayload = (updates, detail, vendorUpdates, customerUpda
199
200
  if (lineUpdates.recommendation != null) {
200
201
  recommendationUpdates[line.id] = lineUpdates.recommendation;
201
202
  }
203
+ // Add COT viewing flags to the line from cotTransactionTracking
204
+ const cotTrackingForLine = cotTransactionTracking === null || cotTransactionTracking === void 0 ? void 0 : cotTransactionTracking.find((item) => item.lineId === line.id);
205
+ if (cotTrackingForLine) {
206
+ lineTobeUpdated.cotViewingFlags = {
207
+ vendor: cotTrackingForLine.vendor,
208
+ category: cotTrackingForLine.category,
209
+ class: cotTrackingForLine.class,
210
+ lineId: cotTrackingForLine.lineId,
211
+ };
212
+ }
202
213
  return lineTobeUpdated;
203
214
  }
204
215
  return line;
@@ -206,23 +217,27 @@ const toTransactionUpdatePayload = (updates, detail, vendorUpdates, customerUpda
206
217
  transaction.lines = newLineMap;
207
218
  }
208
219
  transaction.recommendations = recommendationUpdates;
220
+ // Convert transaction to payload first
221
+ let basePayload;
209
222
  if ((0, customerTransaction_1.isCustomerTransaction)(transaction)) {
210
- return (0, customerTransactionPayload_1.toCustomerTransactionPayload)(transaction);
223
+ basePayload = (0, customerTransactionPayload_1.toCustomerTransactionPayload)(transaction);
211
224
  }
212
225
  else if ((0, vendorTransaction_1.isVendorTransaction)(transaction)) {
213
226
  if (tranSelectedEntity != null && tranSelectedEntity.type === 'customer') {
214
- return (0, vendorTransactionPayload_1.toVendorTransactionWithCustomerPayload)(transaction, customerUpdates);
227
+ basePayload = (0, vendorTransactionPayload_1.toVendorTransactionWithCustomerPayload)(transaction, customerUpdates);
215
228
  }
216
229
  else {
217
- return (0, vendorTransactionPayload_1.toVendorTransactionPayload)(transaction, vendorUpdates);
230
+ basePayload = (0, vendorTransactionPayload_1.toVendorTransactionPayload)(transaction, vendorUpdates);
218
231
  }
219
232
  }
220
233
  else if ((0, otherTransaction_1.isTransferTransaction)(transaction)) {
221
- return (0, otherTransactionPayload_1.toTransferTransactionPayload)(transaction);
234
+ basePayload = (0, otherTransactionPayload_1.toTransferTransactionPayload)(transaction);
222
235
  }
223
236
  else {
224
- return (0, transactionPayload_1.toTransactionPayload)(transaction);
237
+ basePayload = (0, transactionPayload_1.toTransactionPayload)(transaction);
225
238
  }
239
+ // Inject COT flags into the payload
240
+ return (0, transactionPayload_1.injectCOTFlagsIntoTransactionPayload)(basePayload, transaction);
226
241
  };
227
242
  const checkIfClassMissingForAnyLineItem = (transactionPayload) => {
228
243
  let isAnyClassMissing = false;
@@ -1,5 +1,5 @@
1
1
  import { FetchState, ID, UpdateType } from '../../commonStateTypes/common';
2
- import { Recommendation } from '../../commonStateTypes/recommendationBase';
2
+ import { COTTransactionTracking, Recommendation } from '../../commonStateTypes/recommendationBase';
3
3
  import { AccountBase } from '../../entity/account/accountState';
4
4
  import { ClassBase } from '../../entity/class/classState';
5
5
  import { Entity } from '../../entity/genericEntity/entity';
@@ -26,10 +26,11 @@ 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], {
29
+ }>, updateTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, transactionSaveUpdates: TransactionSaveUpdates, isExpenseAutomationEnabled: boolean, cotTransactionTracking: COTTransactionTracking], {
30
30
  transactionId: TransactionID;
31
31
  transactionSaveUpdates: TransactionSaveUpdates;
32
32
  isExpenseAutomationEnabled: boolean;
33
+ cotTransactionTracking: COTTransactionTracking;
33
34
  }, "transactionDetail/updateTransactionDetail", never, never>, updateTransactionDetailSaveStatus: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionId: TransactionID, fetchState: FetchState, error?: ZeniAPIStatus<Record<string, unknown>> | undefined], {
34
35
  transactionId: TransactionID;
35
36
  fetchState: FetchState;
@@ -60,6 +61,7 @@ export declare const downloadAccountingProviderAttachment: import("@reduxjs/tool
60
61
  }, "transactionDetail/updateStatusConsolidatedSaveTransactionDetail">, updateTransactionStateIfUpdateActionNotAllowed: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
61
62
  transactionId: TransactionID;
62
63
  }, "transactionDetail/updateTransactionStateIfUpdateActionNotAllowed">, saveTransactionDetail: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
64
+ cotTransactionTracking: COTTransactionTracking;
63
65
  isExpenseAutomationEnabled: boolean;
64
66
  transactionId: TransactionID;
65
67
  }, "transactionDetail/saveTransactionDetail">, initializeTransactionDetailLocalData: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
@@ -97,12 +97,13 @@ const transactionDetail = (0, toolkit_1.createSlice)({
97
97
  } }) });
98
98
  }
99
99
  },
100
- prepare(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled) {
100
+ prepare(transactionId, transactionSaveUpdates, isExpenseAutomationEnabled, cotTransactionTracking) {
101
101
  return {
102
102
  payload: {
103
103
  transactionId,
104
104
  transactionSaveUpdates,
105
105
  isExpenseAutomationEnabled,
106
+ cotTransactionTracking,
106
107
  },
107
108
  };
108
109
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "4.17.70",
3
+ "version": "4.17.71",
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
  "types": "lib/index.d.ts",