@zeniai/client-epic-state 5.1.29 → 5.1.30

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 (80) hide show
  1. package/README.md +3 -1
  2. package/lib/entity/genericEntity/entity.d.ts +1 -1
  3. package/lib/entity/jeSchedules/jeSchedulesPayload.js +2 -2
  4. package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +1 -1
  5. package/lib/entity/jeSchedules/jeSchedulesSelector.js +4 -4
  6. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +1 -1
  7. package/lib/entity/vendor/vendorPayload.d.ts +3 -1
  8. package/lib/entity/vendor/vendorPayload.js +3 -1
  9. package/lib/epic.d.ts +2 -1
  10. package/lib/epic.js +2 -1
  11. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +2 -2
  12. package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +4 -4
  13. package/lib/esm/entity/vendor/vendorPayload.js +3 -1
  14. package/lib/esm/epic.js +2 -1
  15. package/lib/esm/index.js +4 -4
  16. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +29 -3
  17. package/lib/esm/view/aiCfoView/aiCfoViewSelector.js +11 -0
  18. package/lib/esm/view/aiCfoView/epics/createSessionAndSubmitEpic.js +2 -2
  19. package/lib/esm/view/aiCfoView/epics/fetchSkillsEpic.js +34 -0
  20. package/lib/esm/view/aiCfoView/epics/submitQuestionEpic.js +7 -1
  21. package/lib/esm/view/commonVendorView/transactionVendorView/epics/saveTransactionVendorEpic.js +5 -3
  22. package/lib/esm/view/createTransferEntry/epics/createTransferEntryEpic.js +5 -1
  23. package/lib/esm/view/expenseAutomationView/payload/jeSchedulesPayload.js +4 -1
  24. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +1 -1
  25. package/lib/esm/view/onboardingView/cockpitView/epic/initializeOnboardingCustomerViewUpdateDataEpic.js +4 -16
  26. package/lib/esm/view/onboardingView/cockpitView/onboardingCockpitViewPayload.js +2 -2
  27. package/lib/esm/view/referralView/epics/sendReferralInviteEpic.js +9 -1
  28. package/lib/esm/view/referralView/referralReducer.js +3 -2
  29. package/lib/esm/view/scheduleView/scheduleAccruedDetailView/epics/deleteScheduleAccruedDetailEpic.js +1 -1
  30. package/lib/esm/view/scheduleView/scheduleAccruedDetailView/epics/fetchRecommendedTransactionRowIndexEpic.js +11 -5
  31. package/lib/esm/view/scheduleView/scheduleAccruedDetailView/scheduleAccruedDetailPayload.js +4 -1
  32. package/lib/esm/view/scheduleView/scheduleDetailView/epics/createNewSchedulesEpic.js +1 -1
  33. package/lib/esm/view/scheduleView/scheduleDetailView/epics/deleteScheduleDetailEpic.js +1 -1
  34. package/lib/esm/view/scheduleView/scheduleDetailView/epics/markAsCompleteScheduleDetailEpic.js +1 -1
  35. package/lib/esm/view/scheduleView/scheduleDetailView/epics/saveScheduleDetailsEpic.js +1 -1
  36. package/lib/esm/view/scheduleView/scheduleDetailView/scheduleDetailPayload.js +12 -3
  37. package/lib/esm/view/scheduleView/scheduleListView/scheduleListSelector.js +8 -7
  38. package/lib/esm/view/spendManagement/billPay/billDetailView/epics/fetchBillDetailEpic.js +8 -3
  39. package/lib/esm/view/transactionDetail/epics/updateTransactionDetailEpic.js +5 -1
  40. package/lib/esm/view/trendWithTransactions/fetchTrendForEntityEpic.js +3 -1
  41. package/lib/esm/view/vendorFiling1099/vendorFiling1099List/vendorFiling1099ListReducer.js +4 -3
  42. package/lib/esm/view/vendorList/vendorListReducer.js +4 -3
  43. package/lib/esm/view/vendorReviewView/vendorFirstReviewView/vendorFirstReviewViewReducer.js +11 -3
  44. package/lib/index.d.ts +6 -6
  45. package/lib/index.js +11 -6
  46. package/lib/view/aiCfoView/aiCfoViewPayload.d.ts +14 -0
  47. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +8 -4
  48. package/lib/view/aiCfoView/aiCfoViewReducer.js +30 -4
  49. package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +2 -1
  50. package/lib/view/aiCfoView/aiCfoViewSelector.js +12 -0
  51. package/lib/view/aiCfoView/aiCfoViewState.d.ts +15 -0
  52. package/lib/view/aiCfoView/epics/createSessionAndSubmitEpic.js +2 -2
  53. package/lib/view/aiCfoView/epics/fetchSkillsEpic.d.ts +8 -0
  54. package/lib/view/aiCfoView/epics/fetchSkillsEpic.js +38 -0
  55. package/lib/view/aiCfoView/epics/submitQuestionEpic.js +7 -1
  56. package/lib/view/commonVendorView/transactionVendorView/epics/saveTransactionVendorEpic.js +5 -3
  57. package/lib/view/createTransferEntry/epics/createTransferEntryEpic.js +5 -1
  58. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.js +4 -1
  59. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +1 -1
  60. package/lib/view/onboardingView/cockpitView/epic/initializeOnboardingCustomerViewUpdateDataEpic.js +3 -15
  61. package/lib/view/onboardingView/cockpitView/onboardingCockpitViewPayload.js +2 -2
  62. package/lib/view/referralView/epics/sendReferralInviteEpic.js +9 -1
  63. package/lib/view/referralView/referralReducer.d.ts +1 -0
  64. package/lib/view/referralView/referralReducer.js +4 -3
  65. package/lib/view/scheduleView/scheduleAccruedDetailView/epics/deleteScheduleAccruedDetailEpic.js +1 -1
  66. package/lib/view/scheduleView/scheduleAccruedDetailView/epics/fetchRecommendedTransactionRowIndexEpic.js +11 -5
  67. package/lib/view/scheduleView/scheduleAccruedDetailView/scheduleAccruedDetailPayload.js +4 -1
  68. package/lib/view/scheduleView/scheduleDetailView/epics/createNewSchedulesEpic.js +1 -1
  69. package/lib/view/scheduleView/scheduleDetailView/epics/deleteScheduleDetailEpic.js +1 -1
  70. package/lib/view/scheduleView/scheduleDetailView/epics/markAsCompleteScheduleDetailEpic.js +1 -1
  71. package/lib/view/scheduleView/scheduleDetailView/epics/saveScheduleDetailsEpic.js +1 -1
  72. package/lib/view/scheduleView/scheduleDetailView/scheduleDetailPayload.js +12 -3
  73. package/lib/view/scheduleView/scheduleListView/scheduleListSelector.js +8 -7
  74. package/lib/view/spendManagement/billPay/billDetailView/epics/fetchBillDetailEpic.js +8 -3
  75. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.js +5 -1
  76. package/lib/view/trendWithTransactions/fetchTrendForEntityEpic.js +3 -1
  77. package/lib/view/vendorFiling1099/vendorFiling1099List/vendorFiling1099ListReducer.js +4 -3
  78. package/lib/view/vendorList/vendorListReducer.js +4 -3
  79. package/lib/view/vendorReviewView/vendorFirstReviewView/vendorFirstReviewViewReducer.js +11 -3
  80. package/package.json +5 -2
@@ -73,7 +73,8 @@ const saveTransactionVendorEpic = (actions$, state$, zeniAPI) => actions$.pipe((
73
73
  name: response.data.vendors[0].vendor_name,
74
74
  id: response.data.vendors[0].qbo_id,
75
75
  type: 'vendor',
76
- zeniId: savedVendor.vendor_id ?? '',
76
+ // Zeni platform id (vendor_id field), not the resolved id used for local-data keys.
77
+ zeniId: savedVendor.vendor_id ?? undefined,
77
78
  qboId: response.data.vendors[0].qbo_id,
78
79
  logo: (0, zeniUrl_1.toZeniUrlWithoutBaseURL)(response.data.vendors[0].logo?.url ?? ''),
79
80
  },
@@ -86,14 +87,15 @@ const saveTransactionVendorEpic = (actions$, state$, zeniAPI) => actions$.pipe((
86
87
  transactionId: action.payload.transactionId,
87
88
  vendorUpdates: {
88
89
  name: response.data.vendors[0].vendor_name,
89
- id: savedVendor.vendor_id ?? '',
90
+ id: savedVendor.vendor_id ?? undefined,
90
91
  qboId: response.data.vendors[0].qbo_id,
91
92
  },
92
93
  entity: {
93
94
  name: response.data.vendors[0].vendor_name,
94
95
  id: response.data.vendors[0].qbo_id,
95
96
  type: 'vendor',
96
- zeniId: savedVendor.vendor_id ?? '',
97
+ // Zeni platform id (vendor_id field), not the resolved id used for local-data keys.
98
+ zeniId: savedVendor.vendor_id ?? undefined,
97
99
  qboId: response.data.vendors[0].qbo_id,
98
100
  logo: (0, zeniUrl_1.toZeniUrlWithoutBaseURL)(response.data.vendors[0].logo?.url ?? ''),
99
101
  },
@@ -6,6 +6,7 @@ const operators_1 = require("rxjs/operators");
6
6
  const snackbarReducer_1 = require("../../../entity/snackbar/snackbarReducer");
7
7
  const transactionIDPayload_1 = require("../../../entity/transaction/payloadTypes/transactionIDPayload");
8
8
  const transactionReducer_1 = require("../../../entity/transaction/transactionReducer");
9
+ const vendorPayload_1 = require("../../../entity/vendor/vendorPayload");
9
10
  const responsePayload_1 = require("../../../responsePayload");
10
11
  const transactionsViewReducer_1 = require("../../expenseAutomationView/reducers/transactionsViewReducer");
11
12
  const transactionDetailReducer_1 = require("../../transactionDetail/transactionDetailReducer");
@@ -88,11 +89,14 @@ function handleSuccessWithoutTransactionBody(transactionId) {
88
89
  function handleSuccessWithTransactionBody(transactionPayload, vendorPayload, previousTransactionId, sourceTransactionId) {
89
90
  const newTransactionId = (0, transactionIDPayload_1.toTransactionID)(transactionPayload);
90
91
  const replaced = !transactionIdsAreEqual(previousTransactionId, newTransactionId);
92
+ const firstVendor = vendorPayload?.[0];
91
93
  const immediate = [
92
94
  (0, transactionReducer_1.updateTransaction)((0, transactionDetailState_1.getTransactionDetailKey)(newTransactionId), transactionPayload),
93
95
  (0, transactionDetailReducer_1.initializeTransactionDetailLocalData)({
94
96
  transactionId: newTransactionId,
95
- vendorId: vendorPayload?.[0]?.vendor_id ?? undefined,
97
+ vendorId: firstVendor != null
98
+ ? (0, vendorPayload_1.getVendorPayloadIdentifier)(firstVendor) ?? undefined
99
+ : undefined,
96
100
  }),
97
101
  ...buildSuccessSideEffects(sourceTransactionId),
98
102
  ];
@@ -6,7 +6,10 @@ const scheduleDetailPayload_1 = require("../../scheduleView/scheduleDetailView/s
6
6
  const prepareIgnoreSchedulePayload = (scheduleType, jeScheduleTransaction, state) => {
7
7
  const { vendorState } = state;
8
8
  const { vendor, currencyCode, currencySymbol, baseTransaction, status, balanceAsOfToday, period, startDate, endDate, jeCredit, jeDebit, } = jeScheduleTransaction;
9
- const vendorID = vendor.id;
9
+ const vendorID = vendor?.id;
10
+ if (vendorID == null) {
11
+ throw new Error('Vendor is required to build JE schedule payload');
12
+ }
10
13
  const vendorDetails = vendorState.vendorByID[vendorID];
11
14
  const jeSchedulePayload = {
12
15
  status: status,
@@ -21,7 +21,7 @@ const jeAccountSettingsViewSelector_1 = require("./jeAccountSettingsViewSelector
21
21
  function getJEScheduleSortAccessor(sortKey) {
22
22
  switch (sortKey) {
23
23
  case 'vendor':
24
- return (s) => s.vendor.name?.toLowerCase();
24
+ return (s) => s.vendor?.name?.toLowerCase();
25
25
  case 'category':
26
26
  return (s) => s.jeDebit.account?.accountName?.toLowerCase();
27
27
  case 'class':
@@ -116,32 +116,20 @@ const getSelectedProducts = (isDebitCardFlagEnabled, tenant) => {
116
116
  const isBookkeepingEnabled = (0, tenantSelector_1.isTenantBookkeepingEnabled)(tenant);
117
117
  const isOtherProductsEnabled = (0, tenantSelector_1.isOtherProductsEnabledForTenant)(tenant);
118
118
  const isCardsEnabled = (0, tenantSelector_1.isTenantCardsOnly)(tenant);
119
- const isTreasuryEnabled = (0, tenantSelector_1.isTenantTreasuryEnabled)(tenant);
120
119
  if (isCardsEnabled && isBankingOnly) {
121
- const selectedProducts = ['zeni_cards', 'zeni_checking'];
122
- if (isTreasuryEnabled) {
123
- selectedProducts.push('zeni_treasury');
124
- }
125
- return selectedProducts;
120
+ return [];
126
121
  }
127
122
  else if (isBankingOnly) {
128
- const selectedProducts = ['zeni_checking'];
129
- if (isTreasuryEnabled) {
130
- selectedProducts.push('zeni_treasury');
131
- }
132
- return selectedProducts;
123
+ return [];
133
124
  }
134
125
  else if (isCardsEnabled) {
135
- return ['zeni_cards'];
126
+ return [];
136
127
  }
137
128
  else if (isBookkeepingEnabled) {
138
129
  return [
139
130
  'bookkeeping',
140
131
  'zeni_bill_pay',
141
- 'zeni_checking',
142
132
  'zeni_reimbursements',
143
- 'zeni_treasury',
144
- 'zeni_cards',
145
133
  ];
146
134
  }
147
135
  else if (isOtherProductsEnabled) {
@@ -51,9 +51,9 @@ const toOnboardingCustomerPayload = (onboardingCustomer, sendInvite, company, te
51
51
  const isTreasury = selectedProducts.includes('zeni_treasury');
52
52
  if (isBookkeeping) {
53
53
  onboardingCustomerPayload.is_book_keeping_enabled = true;
54
- onboardingCustomerPayload.is_banking_enabled = true;
54
+ onboardingCustomerPayload.is_banking_enabled = isChecking;
55
55
  onboardingCustomerPayload.is_spend_management_enabled = true;
56
- onboardingCustomerPayload.is_card_enabled = true;
56
+ onboardingCustomerPayload.is_card_enabled = isCards;
57
57
  onboardingCustomerPayload.is_treasury_enabled = isTreasury;
58
58
  }
59
59
  else if (isChecking && isCards) {
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sendReferralInviteEpic = void 0;
4
4
  const rxjs_1 = require("rxjs");
5
5
  const operators_1 = require("rxjs/operators");
6
+ const snackbarReducer_1 = require("../../../entity/snackbar/snackbarReducer");
6
7
  const responsePayload_1 = require("../../../responsePayload");
7
8
  const referralReducer_1 = require("../referralReducer");
8
9
  const sendReferralInviteEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(referralReducer_1.sendReferralInvite.match), (0, operators_1.switchMap)(() => {
@@ -16,7 +17,14 @@ const sendReferralInviteEpic = (actions$, state$, zeniAPI) => actions$.pipe((0,
16
17
  .postAndGetJSON(`${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/company-referrals`, invitePayload)
17
18
  .pipe((0, operators_1.mergeMap)((response) => {
18
19
  if ((0, responsePayload_1.isSuccessStatus)(response)) {
19
- const actions = [(0, referralReducer_1.sendReferralInviteSuccess)()];
20
+ const actions = [
21
+ (0, referralReducer_1.sendReferralInviteSuccess)(),
22
+ (0, snackbarReducer_1.openSnackbar)({
23
+ messageSection: 'referral_invite_sent',
24
+ messageText: 'success',
25
+ type: 'success',
26
+ }),
27
+ ];
20
28
  return actions;
21
29
  }
22
30
  else {
@@ -2,6 +2,7 @@ import { SortOrder } from '../../commonStateTypes/selectorTypes/sortOrderTypes';
2
2
  import { ZeniAPIStatus } from '../../responsePayload';
3
3
  import { FetchRewardsPayload, FetchRewardsPlanPayload } from './referralPayload';
4
4
  import { InviteCompanyLocalData, ReferralListViewSortKey, ReferralViewState } from './referralState';
5
+ export declare const DEFAULT_REFERRER_AMOUNT = 4000;
5
6
  export declare const initialState: ReferralViewState;
6
7
  export declare const fetchReferrals: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[cacheOverride?: any, refreshViewInBackground?: any], {
7
8
  cacheOverride: any;
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.updateRewardsPlanFailure = exports.updateRewardsPlan = exports.fetchRewardsPlan = exports.clearReferrals = exports.updateReferViewedFailure = exports.updateReferViewedSuccess = exports.updateReferViewed = exports.resendReferralInviteSuccess = exports.resendReferralInvite = exports.sendReferralInviteFailure = exports.sendReferralInviteSuccess = exports.sendReferralInvite = exports.clearReferralFormDataInLocalStore = exports.saveReferralFormDataInLocalStore = exports.updateReferralsFailure = exports.updateReferralListSortUiState = exports.updateReferrals = exports.fetchReferrals = exports.initialState = void 0;
4
+ exports.updateRewardsPlanFailure = exports.updateRewardsPlan = exports.fetchRewardsPlan = exports.clearReferrals = exports.updateReferViewedFailure = exports.updateReferViewedSuccess = exports.updateReferViewed = exports.resendReferralInviteSuccess = exports.resendReferralInvite = exports.sendReferralInviteFailure = exports.sendReferralInviteSuccess = exports.sendReferralInvite = exports.clearReferralFormDataInLocalStore = exports.saveReferralFormDataInLocalStore = exports.updateReferralsFailure = exports.updateReferralListSortUiState = exports.updateReferrals = exports.fetchReferrals = exports.initialState = exports.DEFAULT_REFERRER_AMOUNT = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const amount_1 = require("../../commonStateTypes/amount");
7
7
  const zeniDayJS_1 = require("../../zeniDayJS");
8
8
  const zeniUrl_1 = require("../../zeniUrl");
9
9
  const referralPayload_1 = require("./referralPayload");
10
10
  const referralState_1 = require("./referralState");
11
+ exports.DEFAULT_REFERRER_AMOUNT = 4000;
11
12
  exports.initialState = {
12
13
  fetchState: 'Not-Started',
13
14
  error: undefined,
@@ -48,7 +49,7 @@ exports.initialState = {
48
49
  },
49
50
  rewardsPlan: {
50
51
  referrerAmount: {
51
- amount: 0,
52
+ amount: exports.DEFAULT_REFERRER_AMOUNT,
52
53
  currencyCode: 'USD',
53
54
  currencySymbol: '$',
54
55
  },
@@ -57,7 +58,7 @@ exports.initialState = {
57
58
  currencyCode: 'USD',
58
59
  currencySymbol: '$',
59
60
  },
60
- planName: 'PLAN_1000',
61
+ planName: 'PLAN_4000',
61
62
  planId: 'dummy',
62
63
  referralLink: (0, zeniUrl_1.toZeniUrl)(''),
63
64
  },
@@ -23,7 +23,7 @@ const deleteScheduleAccruedDetailEpic = (actions$, state$, zeniAPI) => actions$.
23
23
  return (0, rxjs_1.from)(actions);
24
24
  }
25
25
  const scheduleDetailId = jeScheduleState.jeScheduleId;
26
- const vendorName = jeScheduleState.vendor.name;
26
+ const vendorName = jeScheduleState.vendor?.name ?? '';
27
27
  const scheduleDetailsUpdated = state.scheduleAccruedDetailState.editScheduleStateByDetailId[scheduleDetailId];
28
28
  const payload = {
29
29
  ...(0, scheduleAccruedDetailPayload_1.prepareScheduleAccruedDetailPayload)(state, scheduleDetailsUpdated, selectedJEScheduleKey, true),
@@ -6,14 +6,13 @@ const operators_1 = require("rxjs/operators");
6
6
  const formatZeniDateFY_1 = require("../../../../commonStateTypes/fiscalYearHelpers/formatZeniDateFY");
7
7
  const jeSchedulesSelector_1 = require("../../../../entity/jeSchedules/jeSchedulesSelector");
8
8
  const transactionReducer_1 = require("../../../../entity/transaction/transactionReducer");
9
- const vendorSelector_1 = require("../../../../entity/vendor/vendorSelector");
10
9
  const responsePayload_1 = require("../../../../responsePayload");
11
10
  const zeniDayJS_1 = require("../../../../zeniDayJS");
12
11
  const scheduleAccruedDetailReducer_1 = require("../scheduleAccruedDetailReducer");
13
12
  const fetchRecommendedTransactionRowIndexEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(scheduleAccruedDetailReducer_1.fetchRecommendedTransactionRowIndex.match), (0, operators_1.mergeMap)((action) => {
14
13
  const state = state$.value;
15
14
  const { selectedJELinkRowIndex } = action.payload;
16
- const { scheduleAccruedDetailState, vendorState } = state;
15
+ const { scheduleAccruedDetailState } = state;
17
16
  const actions = [];
18
17
  const { selectedJEAccruedScheduleKey } = scheduleAccruedDetailState;
19
18
  if (selectedJEAccruedScheduleKey == null ||
@@ -30,14 +29,21 @@ const fetchRecommendedTransactionRowIndexEpic = (actions$, state$, zeniAPI) => a
30
29
  const { amount, runningBalance: accruedBalance, expectedPostDate, } = selectedJournalEntry;
31
30
  const endDate = (0, zeniDayJS_1.dateNow)().endOf('month').format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT);
32
31
  const { vendor } = jeScheduleState;
33
- const vendorId = vendor.id;
34
- const vendorEntity = (0, vendorSelector_1.getVendorByVendorId)(vendorState, vendorId);
32
+ if (vendor?.id == null) {
33
+ return (0, rxjs_1.from)([
34
+ (0, scheduleAccruedDetailReducer_1.updateFetchedTransactionIds)([], (value) => value.transaction_id),
35
+ (0, scheduleAccruedDetailReducer_1.updatedFetchRecommendationBillExpenseSuccessOrFailure)({
36
+ fetchState: 'Completed',
37
+ error: undefined,
38
+ }),
39
+ ]);
40
+ }
35
41
  const queryParam = {
36
42
  start_date: expectedPostDate.format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT),
37
43
  end_date: endDate,
38
44
  amount: amount?.amount ?? 0,
39
45
  accrued_balance: accruedBalance?.amount ?? 0,
40
- vendor_id: vendorEntity?.id ?? '',
46
+ vendor_id: vendor.id,
41
47
  account_name: account?.accountName ?? '',
42
48
  class_name: accountingClass?.className ?? '',
43
49
  };
@@ -210,7 +210,10 @@ const mapAccruedExpenseJEScheduleTransactionToPayload = (jeScheduleAccruedExpens
210
210
  const lastJEScheduleDate = scheduleLength > 0
211
211
  ? scheduleDetailsLocalDataAccruedExpenses.jeScheduleDetails[scheduleLength - 1].postingDate.format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT)
212
212
  : null;
213
- const vendorID = vendor.id;
213
+ const vendorID = vendor?.id;
214
+ if (vendorID == null) {
215
+ throw new Error('Vendor is required to build accrued schedule detail payload');
216
+ }
214
217
  const vendorDetails = vendorState.vendorByID[vendorID];
215
218
  const payload = {
216
219
  status: status,
@@ -15,7 +15,7 @@ const createNewSchedulesEpic = (actions$, state$) => actions$.pipe((0, operators
15
15
  if (selectedJEScheduleKey != null) {
16
16
  const jeScheduleTransactionState = (0, jeSchedulesSelector_1.getJEScheduledTransactionByJEScheduleTransactionKey)(selectedJEScheduleKey, state);
17
17
  const totalAmount = jeScheduleTransactionState.baseTransaction.amount;
18
- const vendorName = jeScheduleTransactionState.vendor.name;
18
+ const vendorName = jeScheduleTransactionState.vendor?.name ?? '';
19
19
  const currentLocalData = jeScheduleTransactionState.jeScheduleId != null
20
20
  ? scheduleDetailState.editScheduleStateByDetailId[scheduleType][jeScheduleTransactionState.jeScheduleId]
21
21
  : scheduleDetailState.newScheduleState[scheduleType];
@@ -19,7 +19,7 @@ const deleteScheduleDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe((0
19
19
  return (0, rxjs_1.from)(actions);
20
20
  }
21
21
  const jeScheduleTransactionState = (0, jeSchedulesSelector_1.getJEScheduledTransactionByJEScheduleTransactionKey)(selectedJEScheduleKey, state);
22
- const vendorName = jeScheduleTransactionState.vendor.name;
22
+ const vendorName = jeScheduleTransactionState.vendor?.name ?? '';
23
23
  const scheduleDetailId = jeScheduleTransactionState.jeScheduleId ?? selectedJeScheduleDetailId;
24
24
  if (scheduleDetailId == null) {
25
25
  return (0, rxjs_1.from)(actions);
@@ -15,7 +15,7 @@ const markAsCompleteScheduleDetailEpic = (actions$, state$, zeniAPI) => actions$
15
15
  const actions = [];
16
16
  const jeScheduleTransactionState = (0, jeSchedulesSelector_1.getJEScheduledTransactionByJEScheduleTransactionKey)(jeScheduleKey, state);
17
17
  const scheduleDetailId = jeScheduleTransactionState.jeScheduleId;
18
- const vendorName = jeScheduleTransactionState.vendor.name;
18
+ const vendorName = jeScheduleTransactionState.vendor?.name ?? '';
19
19
  const scheduleDetailsUpdated = scheduleDetailId != null
20
20
  ? state.scheduleDetailState.editScheduleStateByDetailId[scheduleType][scheduleDetailId]
21
21
  : state.scheduleDetailState.newScheduleState[scheduleType];
@@ -19,7 +19,7 @@ const saveScheduleDetailsEpic = (actions$, state$, zeniAPI) => actions$.pipe((0,
19
19
  return (0, rxjs_1.from)(actions);
20
20
  }
21
21
  const jeScheduleTransactionState = (0, jeSchedulesSelector_1.getJEScheduledTransactionByJEScheduleTransactionKey)(selectedJEScheduleKey, state);
22
- const vendorName = jeScheduleTransactionState.vendor.name;
22
+ const vendorName = jeScheduleTransactionState.vendor?.name ?? '';
23
23
  const scheduleDetailId = jeScheduleTransactionState.jeScheduleId ?? selectedJeScheduleDetailId;
24
24
  const scheduleDetailsUpdated = scheduleDetailId != null
25
25
  ? state.scheduleDetailState.editScheduleStateByDetailId[scheduleType][scheduleDetailId]
@@ -125,7 +125,10 @@ const mapJEScheduleTransactionToPayload = (jeScheduleTransactionState, vendorSta
125
125
  const lastJEScheduleDate = scheduleLength > 0
126
126
  ? scheduleDetailsLocalData.jeScheduleDetails[scheduleLength - 1].postingDate.format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT)
127
127
  : null;
128
- const vendorID = vendor.id;
128
+ const vendorID = vendor?.id;
129
+ if (vendorID == null) {
130
+ throw new Error('Vendor is required to build schedule detail payload (mapJEScheduleTransactionToPayload)');
131
+ }
129
132
  const vendorDetails = vendorState.vendorByID[vendorID];
130
133
  const updatedVendor = {
131
134
  vendor_id: selectedVendor?.id ?? '',
@@ -200,7 +203,10 @@ const mapFixedAssetJEScheduleTransactionToPayload = (jeScheduleTransactionState,
200
203
  const lastJEScheduleDate = scheduleLength > 0
201
204
  ? scheduleDetailsLocalData.jeScheduleDetails[scheduleLength - 1].postingDate.format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT)
202
205
  : null;
203
- const vendorID = vendor.id;
206
+ const vendorID = vendor?.id;
207
+ if (vendorID == null) {
208
+ throw new Error('Vendor is required to build schedule detail payload (mapFixedAssetJEScheduleTransactionToPayload)');
209
+ }
204
210
  const vendorDetails = vendorState.vendorByID[vendorID];
205
211
  const updatedVendor = {
206
212
  vendor_id: selectedVendor?.id ?? '',
@@ -278,7 +284,10 @@ const mapAccruedExpenseJEScheduleTransactionToPayload = (jeScheduleTransactionSt
278
284
  const lastJEScheduleDate = scheduleLength > 0
279
285
  ? scheduleDetailsLocalData.jeScheduleDetails[scheduleLength - 1].postingDate.format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT)
280
286
  : null;
281
- const vendorID = vendor.id;
287
+ const vendorID = vendor?.id;
288
+ if (vendorID == null) {
289
+ throw new Error('Vendor is required to build schedule detail payload (mapAccruedExpenseJEScheduleTransactionToPayload)');
290
+ }
282
291
  const vendorDetails = vendorState.vendorByID[vendorID];
283
292
  const payload = {
284
293
  status: updatedStatus,
@@ -18,9 +18,9 @@ const sortedJETransactionsView = (jeTransactions, sortKey, sortOrder) => {
18
18
  case 'transactionDate':
19
19
  return jeTransaction.baseTransaction.date.valueOf();
20
20
  case 'vendor':
21
- return jeTransaction.vendor.name != null
21
+ return jeTransaction.vendor?.name != null
22
22
  ? jeTransaction.vendor.name.toLowerCase()
23
- : jeTransaction.vendor.name;
23
+ : jeTransaction.vendor?.name;
24
24
  case 'scheduleCategory':
25
25
  return jeTransaction.baseTransaction.account.accountName.toLowerCase();
26
26
  case 'expenseCategory':
@@ -81,9 +81,9 @@ const sortedJEAccruedSchedules = (jeAccruedSchedules, sortKey, sortOrder) => {
81
81
  case 'createTime':
82
82
  return jeAccruedSchedule.createTime.valueOf();
83
83
  case 'vendor':
84
- return jeAccruedSchedule.vendor.name != null
84
+ return jeAccruedSchedule.vendor?.name != null
85
85
  ? jeAccruedSchedule.vendor.name.toLowerCase()
86
- : jeAccruedSchedule.vendor.name;
86
+ : jeAccruedSchedule.vendor?.name;
87
87
  case 'expenseCategory':
88
88
  return jeAccruedSchedule.jeDebit.account != null
89
89
  ? jeAccruedSchedule.jeDebit.account.accountName.toLowerCase()
@@ -208,7 +208,7 @@ const getScheduleListReport = (state, scheduleType) => {
208
208
  .trim()
209
209
  .toLowerCase();
210
210
  const sortedJETransactionView = sortedJETransactionsView(jeTransactionsView.filter((jeTransaction) => {
211
- return ((jeTransaction.vendor.name != null &&
211
+ return ((jeTransaction.vendor?.name != null &&
212
212
  jeTransaction.vendor.name
213
213
  .toLowerCase()
214
214
  .includes(loweredSearchText) === true) ||
@@ -329,8 +329,9 @@ const getAccruedScheduleListReport = (state, scheduleType) => {
329
329
  .trim()
330
330
  .toLocaleLowerCase();
331
331
  const sortedJESchedules = sortedJEAccruedSchedules(jeScheduleAccrued.filter((jeSchedule) => {
332
- return (jeSchedule.vendor.name.toLowerCase().includes(loweredSearchText) ===
333
- true ||
332
+ return (jeSchedule.vendor?.name
333
+ ?.toLowerCase()
334
+ ?.includes(loweredSearchText) === true ||
334
335
  jeSchedule.memo.toLowerCase().includes(loweredSearchText) === true);
335
336
  }), sortKey, sortOrder);
336
337
  const totalBalances = (0, scheduleListHelper_1.getCalculatedAccruedScheduleTotal)(sortedJESchedules);
@@ -20,6 +20,7 @@ const entityApprovalStatusReducer_1 = require("../../../../../entity/entityAppro
20
20
  const paymentAccountReducer_1 = require("../../../../../entity/paymentAccount/paymentAccountReducer");
21
21
  const paymentInstrumentReducer_1 = require("../../../../../entity/paymentInstrument/paymentInstrumentReducer");
22
22
  const userReducer_1 = require("../../../../../entity/user/userReducer");
23
+ const vendorPayload_1 = require("../../../../../entity/vendor/vendorPayload");
23
24
  const vendorReducer_1 = require("../../../../../entity/vendor/vendorReducer");
24
25
  const responsePayload_1 = require("../../../../../responsePayload");
25
26
  const commonVendorViewHelper_1 = require("../../../../commonVendorView/commonVendorViewHelper");
@@ -104,12 +105,16 @@ const fetchBillDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, ope
104
105
  }
105
106
  else {
106
107
  fetchActions.push((0, billDetailViewReducer_1.updateBillDetail)({ billId, billDetail: response.data }));
107
- fetchActions.push((0, billDetailViewReducer_1.updateBillDetailFetchState)(transcationId, 'Completed', undefined, vendorInResponse?.vendor_id ?? undefined));
108
108
  const transactionInResponse = response.data?.transaction;
109
+ const resolvedVendorId = vendorInResponse != null
110
+ ? (0, vendorPayload_1.getVendorPayloadIdentifier)(vendorInResponse)
111
+ : null;
112
+ fetchActions.push((0, billDetailViewReducer_1.updateBillDetailFetchState)(transcationId, 'Completed', undefined, resolvedVendorId ?? undefined));
109
113
  if (transactionInResponse != null &&
110
114
  transactionInResponse.total_amount != null &&
111
- vendorInResponse.vendor_id != null) {
112
- fetchActions.push((0, billPayReviewReducer_1.fetchDuplicateBill)(vendorInResponse.vendor_name, vendorInResponse.vendor_id, transactionInResponse.total_amount, transactionInResponse.recipient_total_amount, transactionInResponse.document_id, billId));
115
+ resolvedVendorId != null &&
116
+ vendorInResponse != null) {
117
+ fetchActions.push((0, billPayReviewReducer_1.fetchDuplicateBill)(vendorInResponse.vendor_name, resolvedVendorId, transactionInResponse.total_amount, transactionInResponse.recipient_total_amount, transactionInResponse.document_id, billId));
113
118
  }
114
119
  const billHasPaymentError = [
115
120
  'failed',
@@ -23,6 +23,7 @@ const transactionHelper_1 = require("../../../entity/transaction/transactionHelp
23
23
  const transactionReducer_1 = require("../../../entity/transaction/transactionReducer");
24
24
  const transactionSelector_1 = require("../../../entity/transaction/transactionSelector");
25
25
  const vendorReducer_1 = require("../../../entity/vendor/vendorReducer");
26
+ const vendorPayload_1 = require("../../../entity/vendor/vendorPayload");
26
27
  const vendorSelector_1 = require("../../../entity/vendor/vendorSelector");
27
28
  const responsePayload_1 = require("../../../responsePayload");
28
29
  const tenantSelector_1 = require("../../../entity/tenant/tenantSelector");
@@ -65,9 +66,12 @@ const updateTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe
65
66
  actions.push((0, vendorReducer_1.updateVendors)(response.data.vendors, 'merge'));
66
67
  }
67
68
  actions.push((0, transactionReducer_1.updateTransaction)(transactionDetailKeyForResponse, response.data.transaction));
69
+ const updatedVendor = response.data.vendors?.[0];
68
70
  actions.push((0, transactionDetailReducer_1.initializeTransactionDetailLocalData)({
69
71
  transactionId: transactionIdResp,
70
- vendorId: response.data.vendors?.[0]?.vendor_id ?? undefined,
72
+ vendorId: updatedVendor != null
73
+ ? (0, vendorPayload_1.getVendorPayloadIdentifier)(updatedVendor) ?? undefined
74
+ : undefined,
71
75
  }));
72
76
  actions.push((0, transactionDetailReducer_1.updateTransactionDetailSaveStatus)(transactionIdResp, 'Completed'));
73
77
  let callMarkTransactionAsNotMiscategorized = true;
@@ -13,7 +13,9 @@ _state$) => actions$.pipe((0, operators_1.filter)(trendWithTransactionsReducer_1
13
13
  return (0, rxjs_1.of)((0, trendReducer_1.fetchIncomeTrend)(entity.id, entity.name));
14
14
  }
15
15
  if (entity.type === 'vendor') {
16
- return (0, rxjs_1.of)((0, trendReducer_1.fetchExpenseTrend)(entity.id, entity.name, entity.zeniId));
16
+ // QBO-only vendors may lack zeniId; fall back to entity.id so spend
17
+ // trend state still keys off the resolved vendor identifier.
18
+ return (0, rxjs_1.of)((0, trendReducer_1.fetchExpenseTrend)(entity.id, entity.name, entity.zeniId ?? entity.id));
17
19
  }
18
20
  return (0, rxjs_1.from)([]);
19
21
  }));
@@ -3,6 +3,7 @@ var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.updateVendorFiling1099DownloadData = exports.fetchVendorsFiling1099Download = exports.updateFiling1099SearchUIState = exports.updateFiling1099SortUIState = exports.updateFiling1099ScrollYOffset = exports.clearVendorsFiling1099List = exports.updateVendorFiling1099ListFailure = exports.updateVendorsFiling1099List = exports.fetchVendorsFiling1099List = exports.fetchVendorsFiling1099All = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
+ const vendorPayload_1 = require("../../../entity/vendor/vendorPayload");
6
7
  const zeniDayJS_1 = require("../../../zeniDayJS");
7
8
  exports.initialState = {
8
9
  fetchState: 'Not-Started',
@@ -79,9 +80,9 @@ const vendorFiling1099List = (0, toolkit_1.createSlice)({
79
80
  },
80
81
  updateVendorsFiling1099List(draft, action) {
81
82
  const { response } = action.payload;
82
- const newVendorIds = response.data?.report.vendors
83
- ?.map((vendor) => vendor.vendor_id)
84
- .filter((vendorId) => vendorId != null) ?? [];
83
+ const newVendorIds = (response.data?.report.vendors
84
+ ?.map((vendor) => (0, vendorPayload_1.getVendorPayloadIdentifier)(vendor))
85
+ .filter((vendorId) => vendorId != null)) ?? [];
85
86
  draft.vendorIds = [...new Set([...draft.vendorIds, ...newVendorIds])];
86
87
  draft.isVendor1099Populated =
87
88
  response.data?.report.is_vendor_1099_populated ?? true;
@@ -3,6 +3,7 @@ var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.updateYTDSelectionUIState = exports.updatePageToken = exports.updateSortUiState = exports.updateScrollYOffset = exports.clearVendorsList = exports.updateVendorListFailure = exports.updateVendorsList = exports.fetchVendorsList = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
+ const vendorPayload_1 = require("../../entity/vendor/vendorPayload");
6
7
  const zeniDayJS_1 = require("../../zeniDayJS");
7
8
  exports.initialState = {
8
9
  fetchState: 'Not-Started',
@@ -88,9 +89,9 @@ const vendorList = (0, toolkit_1.createSlice)({
88
89
  },
89
90
  updateVendorsList(draft, action) {
90
91
  const { response, searchString, view } = action.payload;
91
- const newVendorIds = response.data?.vendors
92
- ?.map((vendor) => vendor.vendor_id)
93
- .filter((vendorId) => vendorId != null) ?? [];
92
+ const newVendorIds = (response.data?.vendors
93
+ ?.map((vendor) => (0, vendorPayload_1.getVendorPayloadIdentifier)(vendor))
94
+ .filter((vendorId) => vendorId != null)) ?? [];
94
95
  if (searchString.length > 0) {
95
96
  if (action.payload.keepExistingListItems === false) {
96
97
  draft.searchResults = newVendorIds;
@@ -5,6 +5,7 @@ exports.updateVendorDetailsViewFailureOrSuccess = exports.saveVendorDetailsView
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const attachmentPayload_1 = require("../../../entity/transaction/payloadTypes/attachmentPayload");
7
7
  const commonTypes_1 = require("../common/state/commonTypes");
8
+ const vendorPayload_1 = require("../../../entity/vendor/vendorPayload");
8
9
  exports.initialState = {
9
10
  vendorFirstReviewViewLocalDataById: {},
10
11
  fetchState: 'Not-Started',
@@ -303,7 +304,14 @@ const toVendorReviewViewUpdatedVendorLocalData = (vendorId, vendorPayload) => {
303
304
  const toVendorReviewViewLocalDataById = (vendorsPayload) => {
304
305
  const vendorById = {};
305
306
  vendorsPayload.forEach((vendor) => {
306
- const vendorView = mapPayloadToVendorFirstReviewView(vendor);
307
+ const resolvedVendorId = (0, vendorPayload_1.getVendorPayloadIdentifier)(vendor);
308
+ if (resolvedVendorId == null) {
309
+ return;
310
+ }
311
+ const vendorView = mapPayloadToVendorFirstReviewView({
312
+ ...vendor,
313
+ vendor_id: resolvedVendorId,
314
+ });
307
315
  vendorById[vendorView.selectedVendorId] = {
308
316
  vendorFirstReviewViewLocalData: vendorView,
309
317
  saveStatus: {
@@ -317,8 +325,8 @@ const toVendorReviewViewLocalDataById = (vendorsPayload) => {
317
325
  const mapPayloadToVendorFirstReviewView = (payload) => {
318
326
  const { recommendationIds, nonExistingRecommendations } = (0, commonTypes_1.toAllRecommendationsFromPayload)(payload.recommendations);
319
327
  return {
320
- vendorId: payload.vendor_id ?? '',
321
- selectedVendorId: payload.vendor_id ?? '',
328
+ vendorId: payload.vendor_id,
329
+ selectedVendorId: payload.vendor_id,
322
330
  status: {
323
331
  code: (0, commonTypes_1.toVendorFirstReviewViewStatusesTypeStrict)(payload.status.code),
324
332
  name: payload.status.name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.1.29",
3
+ "version": "5.1.30",
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",
@@ -79,6 +79,7 @@
79
79
  "ts-prune": "^0.10.3",
80
80
  "ts-unused-exports": "^11.0.1",
81
81
  "typescript": "^5.7.3",
82
+ "vite": "^7.3.5",
82
83
  "vitest": "^4.1.8"
83
84
  },
84
85
  "dependencies": {
@@ -129,7 +130,9 @@
129
130
  "postversion": "git push && git push --tags",
130
131
  "check-dependencies": "node ./scripts/check_dependencies.js",
131
132
  "clean-overrides": "node ./scripts/clean_overrides.js",
132
- "create-release-branch": "chmod +x ./scripts/create_release_branch.sh && ./scripts/create_release_branch.sh",
133
+ "create-or-update-release-branch": "chmod +x ./scripts/create_or_update_release_branch.sh && ./scripts/create_or_update_release_branch.sh",
134
+ "bump-versions-master": "chmod +x ./scripts/bump_versions_master.sh && ./scripts/bump_versions_master.sh",
135
+ "bump-versions-beta": "chmod +x ./scripts/bump_versions_beta.sh && ./scripts/bump_versions_beta.sh",
133
136
  "bump-update-web-app-cockpit-beta": "chmod +x ./scripts/bump_and_update_web_app_ui_beta.sh && ./scripts/bump_and_update_web_app_ui_beta.sh",
134
137
  "send-release-notes": "chmod +x ./scripts/send_release_notes.sh && ./scripts/send_release_notes.sh",
135
138
  "update-slack-group-topic": "chmod +x ./scripts/update-slack-group-topic.sh && ./scripts/update-slack-group-topic.sh",