@zeniai/client-epic-state 5.1.4 → 5.1.5-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 (87) hide show
  1. package/lib/entity/company/companyPayload.d.ts +4 -0
  2. package/lib/entity/company/companyPayload.js +6 -0
  3. package/lib/entity/company/companyStateTypes.d.ts +7 -0
  4. package/lib/entity/paymentAccount/paymentAccountSelector.d.ts +1 -0
  5. package/lib/entity/paymentAccount/paymentAccountSelector.js +9 -0
  6. package/lib/entity/tenant/epic/deleteConnectionEpic.d.ts +1 -1
  7. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.d.ts +21 -0
  8. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.js +59 -0
  9. package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.d.ts +1 -1
  10. package/lib/entity/tenant/epic/saveConnectorCredentialsEpic.d.ts +3 -3
  11. package/lib/entity/tenant/epic/saveOAuthConnectionEpic.d.ts +1 -1
  12. package/lib/entity/tenant/tenantPayload.d.ts +1 -0
  13. package/lib/entity/tenant/tenantReducer.d.ts +38 -25
  14. package/lib/entity/tenant/tenantReducer.js +65 -5
  15. package/lib/entity/tenant/tenantState.d.ts +1 -0
  16. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +2 -0
  17. package/lib/entity/transaction/payloadTypes/transactionPayload.js +1 -0
  18. package/lib/entity/transaction/stateTypes/transaction.d.ts +2 -0
  19. package/lib/epic.d.ts +6 -1
  20. package/lib/epic.js +7 -1
  21. package/lib/esm/entity/company/companyPayload.js +6 -0
  22. package/lib/esm/entity/paymentAccount/paymentAccountSelector.js +8 -0
  23. package/lib/esm/entity/tenant/epic/initEmailConnectOAuthEpic.js +55 -0
  24. package/lib/esm/entity/tenant/tenantReducer.js +63 -3
  25. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +1 -0
  26. package/lib/esm/epic.js +7 -1
  27. package/lib/esm/index.js +11 -7
  28. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/backgroundRefetchReviewTabEpic.js +7 -1
  29. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +1 -1
  30. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +1 -0
  31. package/lib/esm/view/fileView/epic/deleteFileEpic.js +2 -2
  32. package/lib/esm/view/fileView/epic/deleteFileListEpic.js +2 -2
  33. package/lib/esm/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +40 -0
  34. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +29 -0
  35. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +40 -0
  36. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewEpic.js +24 -18
  37. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewLocalStoreDataEpic.js +29 -17
  38. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewReducer.js +223 -51
  39. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewSelector.js +24 -12
  40. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewState.js +37 -6
  41. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +58 -0
  42. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +77 -0
  43. package/lib/esm/view/spendManagement/commonSetup/kycKybAutofillActions.js +14 -0
  44. package/lib/esm/view/spendManagement/commonSetup/kycKybParseMapper.js +207 -0
  45. package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +106 -52
  46. package/lib/esm/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
  47. package/lib/esm/view/spendManagement/commonSetup/types/kycKybAutofill.js +41 -0
  48. package/lib/index.d.ts +14 -10
  49. package/lib/index.js +64 -35
  50. package/lib/view/expenseAutomationView/epics/transactionCategorization/backgroundRefetchReviewTabEpic.js +7 -1
  51. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +1 -1
  52. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +1 -0
  53. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +2 -0
  54. package/lib/view/fileView/epic/deleteFileEpic.js +1 -1
  55. package/lib/view/fileView/epic/deleteFileListEpic.js +1 -1
  56. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.d.ts +7 -0
  57. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +44 -0
  58. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.d.ts +8 -0
  59. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +33 -0
  60. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.d.ts +9 -0
  61. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +44 -0
  62. package/lib/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewEpic.js +24 -18
  63. package/lib/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewLocalStoreDataEpic.d.ts +2 -2
  64. package/lib/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewLocalStoreDataEpic.js +27 -15
  65. package/lib/view/onboardingView/customerView/onboardingCustomerViewPayload.d.ts +3 -0
  66. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.d.ts +44 -5
  67. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.js +225 -52
  68. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.d.ts +6 -1
  69. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.js +27 -12
  70. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.d.ts +52 -8
  71. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.js +39 -7
  72. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.d.ts +28 -0
  73. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +62 -0
  74. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.d.ts +9 -0
  75. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +81 -0
  76. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.d.ts +24 -0
  77. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.js +17 -0
  78. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.d.ts +29 -0
  79. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.js +215 -0
  80. package/lib/view/spendManagement/commonSetup/setupViewReducer.d.ts +28 -2
  81. package/lib/view/spendManagement/commonSetup/setupViewReducer.js +107 -53
  82. package/lib/view/spendManagement/commonSetup/setupViewSelector.d.ts +7 -2
  83. package/lib/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
  84. package/lib/view/spendManagement/commonSetup/setupViewState.d.ts +19 -0
  85. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.d.ts +154 -0
  86. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.js +46 -0
  87. package/package.json +1 -1
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchAiAgentsActivationStatusEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const responsePayload_1 = require("../../../../../responsePayload");
7
+ const onboardingCustomerViewReducer_1 = require("../../onboardingCustomerViewReducer");
8
+ const toPhaseStatus = (raw) => {
9
+ if (raw === 'idle' ||
10
+ raw === 'starting' ||
11
+ raw === 'building' ||
12
+ raw === 'ready') {
13
+ return raw;
14
+ }
15
+ return 'idle';
16
+ };
17
+ const toPhase = (row) => ({
18
+ key: row.key,
19
+ status: toPhaseStatus(row.status),
20
+ startedAt: row.started_at,
21
+ completedAt: row.completed_at,
22
+ });
23
+ const toCounts = (payload) => ({
24
+ customerCount: payload?.customer_count ?? 0,
25
+ glAccountCount: payload?.gl_account_count ?? 0,
26
+ targetTransactionCount: payload?.target_transaction_count ?? 0,
27
+ transactionCount: payload?.transaction_count ?? 0,
28
+ vendorCount: payload?.vendor_count ?? 0,
29
+ });
30
+ const fetchAiAgentsActivationStatusEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(onboardingCustomerViewReducer_1.fetchAiAgentsActivationStatus.match), (0, operators_1.mergeMap)(() => {
31
+ const url = `${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/ai-agents-activation/status`;
32
+ return zeniAPI.getJSON(url).pipe((0, operators_1.mergeMap)((response) => {
33
+ if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
34
+ const phases = (response.data.phases ?? []).map(toPhase);
35
+ return (0, rxjs_1.of)((0, onboardingCustomerViewReducer_1.fetchAiAgentsActivationStatusSuccess)({
36
+ phases,
37
+ counts: toCounts(response.data.counts),
38
+ }));
39
+ }
40
+ return (0, rxjs_1.of)((0, onboardingCustomerViewReducer_1.fetchAiAgentsActivationStatusFailure)(response.status));
41
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, onboardingCustomerViewReducer_1.fetchAiAgentsActivationStatusFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'fetchAiAgentsActivationStatus errored out ' +
42
+ JSON.stringify(error))))));
43
+ }));
44
+ exports.fetchAiAgentsActivationStatusEpic = fetchAiAgentsActivationStatusEpic;
@@ -0,0 +1,8 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { updateCompanies } from '../../../../../entity/company/companyReducer';
4
+ import { RootState } from '../../../../../reducer';
5
+ import { ZeniAPI } from '../../../../../zeniAPI';
6
+ import { acknowledgeOnboardingAiActivationViewed, acknowledgeOnboardingAiActivationViewedFailure, acknowledgeOnboardingAiActivationViewedSuccess } from '../../onboardingCustomerViewReducer';
7
+ export type ActionType = ReturnType<typeof acknowledgeOnboardingAiActivationViewed> | ReturnType<typeof updateCompanies> | ReturnType<typeof acknowledgeOnboardingAiActivationViewedSuccess> | ReturnType<typeof acknowledgeOnboardingAiActivationViewedFailure>;
8
+ export declare const acknowledgeOnboardingAiActivationViewedEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.acknowledgeOnboardingAiActivationViewedEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const companyReducer_1 = require("../../../../../entity/company/companyReducer");
7
+ const responsePayload_1 = require("../../../../../responsePayload");
8
+ const onboardingCustomerViewReducer_1 = require("../../onboardingCustomerViewReducer");
9
+ const acknowledgeOnboardingAiActivationViewedEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(onboardingCustomerViewReducer_1.acknowledgeOnboardingAiActivationViewed.match), (0, operators_1.mergeMap)((action) => {
10
+ const { companyId } = action.payload;
11
+ const payload = {
12
+ is_onboarding_ai_activation_viewed: true,
13
+ };
14
+ return zeniAPI
15
+ .putAndGetJSON(`${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/companies/${companyId}`, payload)
16
+ .pipe((0, operators_1.mergeMap)((response) => {
17
+ if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
18
+ const actions = [
19
+ (0, companyReducer_1.updateCompanies)({
20
+ payload: response.data.companies,
21
+ schema: {},
22
+ }),
23
+ (0, onboardingCustomerViewReducer_1.acknowledgeOnboardingAiActivationViewedSuccess)(),
24
+ ];
25
+ return (0, rxjs_1.from)(actions);
26
+ }
27
+ return (0, rxjs_1.of)((0, onboardingCustomerViewReducer_1.acknowledgeOnboardingAiActivationViewedFailure)(response.status));
28
+ }),
29
+ // Best-effort — failure is silent; cascade just runs again next visit.
30
+ (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, onboardingCustomerViewReducer_1.acknowledgeOnboardingAiActivationViewedFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Acknowledge - Onboarding AI Activation Viewed errored out' +
31
+ JSON.stringify(error))))));
32
+ }));
33
+ exports.acknowledgeOnboardingAiActivationViewedEpic = acknowledgeOnboardingAiActivationViewedEpic;
@@ -0,0 +1,9 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { updateCompanies } from '../../../../../entity/company/companyReducer';
4
+ import { openSnackbar } from '../../../../../entity/snackbar/snackbarReducer';
5
+ import { RootState } from '../../../../../reducer';
6
+ import { ZeniAPI } from '../../../../../zeniAPI';
7
+ import { acknowledgeOnboardingAiFinanceTeam, acknowledgeOnboardingAiFinanceTeamFailure, acknowledgeOnboardingAiFinanceTeamSuccess } from '../../onboardingCustomerViewReducer';
8
+ export type ActionType = ReturnType<typeof acknowledgeOnboardingAiFinanceTeam> | ReturnType<typeof updateCompanies> | ReturnType<typeof openSnackbar> | ReturnType<typeof acknowledgeOnboardingAiFinanceTeamSuccess> | ReturnType<typeof acknowledgeOnboardingAiFinanceTeamFailure>;
9
+ export declare const acknowledgeOnboardingAiFinanceTeamEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.acknowledgeOnboardingAiFinanceTeamEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const companyReducer_1 = require("../../../../../entity/company/companyReducer");
7
+ const snackbarReducer_1 = require("../../../../../entity/snackbar/snackbarReducer");
8
+ const responsePayload_1 = require("../../../../../responsePayload");
9
+ const onboardingCustomerViewReducer_1 = require("../../onboardingCustomerViewReducer");
10
+ const acknowledgeOnboardingAiFinanceTeamEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(onboardingCustomerViewReducer_1.acknowledgeOnboardingAiFinanceTeam.match), (0, operators_1.mergeMap)((action) => {
11
+ const { companyId } = action.payload;
12
+ const payload = {
13
+ is_onboarding_ai_finance_team_acknowledged: true,
14
+ };
15
+ return zeniAPI
16
+ .putAndGetJSON(`${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/companies/${companyId}`, payload)
17
+ .pipe((0, operators_1.mergeMap)((response) => {
18
+ if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
19
+ const actions = [
20
+ (0, companyReducer_1.updateCompanies)({
21
+ payload: response.data.companies,
22
+ schema: {},
23
+ }),
24
+ (0, onboardingCustomerViewReducer_1.acknowledgeOnboardingAiFinanceTeamSuccess)(),
25
+ ];
26
+ return (0, rxjs_1.from)(actions);
27
+ }
28
+ else {
29
+ return (0, rxjs_1.of)((0, snackbarReducer_1.openSnackbar)({
30
+ messageSection: 'onboarding_customer_view_complete',
31
+ messageText: 'failed',
32
+ type: 'error',
33
+ variables: [
34
+ {
35
+ variableName: '_api-error_',
36
+ variableValue: response.status.message,
37
+ },
38
+ ],
39
+ }), (0, onboardingCustomerViewReducer_1.acknowledgeOnboardingAiFinanceTeamFailure)(response.status));
40
+ }
41
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, onboardingCustomerViewReducer_1.acknowledgeOnboardingAiFinanceTeamFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Acknowledge - Onboarding AI Finance Team errored out' +
42
+ JSON.stringify(error))))));
43
+ }));
44
+ exports.acknowledgeOnboardingAiFinanceTeamEpic = acknowledgeOnboardingAiFinanceTeamEpic;
@@ -21,7 +21,7 @@ const onboardingCustomerViewSelector_1 = require("../../onboardingCustomerViewSe
21
21
  const updateOnboardingCustomerViewEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(onboardingCustomerViewReducer_1.updateOnboardingCustomerView.match), (0, operators_1.mergeMap)((action) => {
22
22
  const { companyId, officerType, sendForVerification, reCalculateCurrentStep = false, isBillingAddressUpdate, } = action.payload;
23
23
  const { onboardingCustomerViewState } = state$.value;
24
- const { companyDetails, primaryContactDetails, companyOfficerUpdateStatus, currentStep, } = onboardingCustomerViewState;
24
+ const { companyDetails, primaryContactDetails, companyOfficerUpdateStatus, currentStep, currentSubStep, } = onboardingCustomerViewState;
25
25
  const companyLocalData = companyDetails.localData;
26
26
  const primaryContactLocalData = primaryContactDetails.localData;
27
27
  let companyOfficerLocalData;
@@ -55,8 +55,12 @@ const updateOnboardingCustomerViewEpic = (actions$, state$, zeniAPI) => actions$
55
55
  Boolean(companyOfficerLocalData.email) === true // Don't save Empty Company Officer details
56
56
  ? (0, updateBusinessVerificationDetailsEpic_1.toBusinessVerificationOfficerDataPayload)(companyOfficerLocalData, false, companyOfficerAddressToCreate)
57
57
  : {};
58
+ // Verification step has two sub-steps that share currentStep but save
59
+ // different payloads — currentSubStep is the source of truth here.
60
+ const isOfficerSave = currentStep === 'verification' &&
61
+ currentSubStep === 'company_officer';
58
62
  if (isBillingAddressUpdate === false) {
59
- if (currentStep === 'company_officer') {
63
+ if (isOfficerSave) {
60
64
  payload = {
61
65
  company: toBusinessVerificationMinimalCompanyDataPayload(companyLocalData),
62
66
  company_officer,
@@ -69,6 +73,11 @@ const updateOnboardingCustomerViewEpic = (actions$, state$, zeniAPI) => actions$
69
73
  };
70
74
  }
71
75
  }
76
+ const section = isBillingAddressUpdate === true
77
+ ? 'setup_billing'
78
+ : isOfficerSave
79
+ ? 'company_officer'
80
+ : 'company_details';
72
81
  const messageSectionMapper = {
73
82
  company_officer: {
74
83
  sendForVerification: 'onboarding_customer_identity_verification_submit',
@@ -78,23 +87,20 @@ const updateOnboardingCustomerViewEpic = (actions$, state$, zeniAPI) => actions$
78
87
  sendForVerification: 'onboarding_customer_business_verification_submit',
79
88
  save: 'onboarding_customer_business_verification_save',
80
89
  },
81
- link_payment_account: {
90
+ setup_billing: {
82
91
  save: 'billing_address_view',
83
92
  sendForVerification: 'billing_address_view',
84
93
  },
85
94
  };
86
95
  let messageSection;
87
96
  if (isBillingAddressUpdate === true) {
88
- messageSection = messageSectionMapper[currentStep].save;
97
+ messageSection = messageSectionMapper[section].save;
98
+ }
99
+ else if (sendForVerification === true) {
100
+ messageSection = messageSectionMapper[section].sendForVerification;
89
101
  }
90
102
  else {
91
- if (sendForVerification === true) {
92
- messageSection =
93
- messageSectionMapper[currentStep].sendForVerification;
94
- }
95
- else {
96
- messageSection = messageSectionMapper[currentStep].save;
97
- }
103
+ messageSection = messageSectionMapper[section].save;
98
104
  }
99
105
  return zeniAPI
100
106
  .putAndGetJSON(`${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/companies/${companyId}`, payload)
@@ -117,18 +123,18 @@ const updateOnboardingCustomerViewEpic = (actions$, state$, zeniAPI) => actions$
117
123
  const externalConnections = currentTenant.externalConnections;
118
124
  const isQBOConnection = externalConnections?.accounting?.some((connection) => connection.connectionName.match(/quickbooks/i)) ?? false;
119
125
  const { allSteps } = (0, onboardingCustomerViewSelector_1.getOnboardingCustomerView)(state$.value, companyId);
120
- if (currentStep === 'link_payment_account') {
126
+ if (currentStep === 'setup_billing') {
121
127
  if (isQBOConnection === true &&
122
- allSteps.includes('qbo_connection')) {
123
- actions.push((0, onboardingCustomerViewReducer_1.updateCurrentStep)({ step: 'qbo_connection' }));
128
+ allSteps.includes('connect_ledger')) {
129
+ actions.push((0, onboardingCustomerViewReducer_1.updateCurrentStep)({ step: 'connect_ledger' }));
124
130
  }
125
131
  else {
126
- actions.push((0, onboardingCustomerViewReducer_1.updateCurrentStep)({ step: 'company_officer' }));
132
+ actions.push((0, onboardingCustomerViewReducer_1.updateCurrentStep)({ step: 'verification' }));
127
133
  }
128
134
  }
129
- if (currentStep === 'company_officer') {
130
- actions.push((0, onboardingCustomerViewReducer_1.updateCurrentStep)({ step: 'company_details' }));
131
- }
135
+ // The officer→details transition is now a sub-step change
136
+ // handled by the page (currentSubStep dispatch). No
137
+ // currentStep update needed for that traversal anymore.
132
138
  actions.push((0, onboardingCustomerViewReducer_1.updateOnboardingCustomerViewLocalStoreData)({
133
139
  companyId: response.data.companies[0].company_id,
134
140
  currentStep,
@@ -1,6 +1,6 @@
1
1
  import { ActionsObservable, StateObservable } from 'redux-observable';
2
2
  import { RootState } from '../../../../../reducer';
3
3
  import { newAddressInLocalStore, resetNewAddressDataInLocalStore, resetNewAddressesInLocalStore } from '../../../../addressView/addressViewReducer';
4
- import { clearOnboardingCustomerViewDataInLocalStore, saveOnboardingCustomerViewDataInLocalStore, updateCurrentStep, updateOnboardingCustomerViewLocalStoreData } from '../../onboardingCustomerViewReducer';
5
- export type ActionType = ReturnType<typeof updateOnboardingCustomerViewLocalStoreData> | ReturnType<typeof saveOnboardingCustomerViewDataInLocalStore> | ReturnType<typeof clearOnboardingCustomerViewDataInLocalStore> | ReturnType<typeof resetNewAddressesInLocalStore> | ReturnType<typeof newAddressInLocalStore> | ReturnType<typeof resetNewAddressDataInLocalStore> | ReturnType<typeof updateCurrentStep>;
4
+ import { clearOnboardingCustomerViewDataInLocalStore, saveOnboardingCustomerViewDataInLocalStore, updateCurrentStep, updateCurrentSubStep, updateOnboardingCustomerViewLocalStoreData } from '../../onboardingCustomerViewReducer';
5
+ export type ActionType = ReturnType<typeof updateOnboardingCustomerViewLocalStoreData> | ReturnType<typeof saveOnboardingCustomerViewDataInLocalStore> | ReturnType<typeof clearOnboardingCustomerViewDataInLocalStore> | ReturnType<typeof resetNewAddressesInLocalStore> | ReturnType<typeof newAddressInLocalStore> | ReturnType<typeof resetNewAddressDataInLocalStore> | ReturnType<typeof updateCurrentStep> | ReturnType<typeof updateCurrentSubStep>;
6
6
  export declare const updateOnboardingCustomerViewLocalStoreDataEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>) => import("rxjs").Observable<ActionType>;
@@ -22,7 +22,7 @@ const onboardingCustomerViewReducer_1 = require("../../onboardingCustomerViewRed
22
22
  const onboardingCustomerViewSelector_1 = require("../../onboardingCustomerViewSelector");
23
23
  const updateOnboardingCustomerViewLocalStoreDataEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(onboardingCustomerViewReducer_1.updateOnboardingCustomerViewLocalStoreData.match), (0, operators_1.mergeMap)((action) => {
24
24
  const { companyId, currentStep, reCalculateCurrentStep } = action.payload;
25
- const { companyState, companyViewState, fileState, userState, userRoleState, onboardingCustomerViewState, subscriptionPaymentAccountState, paymentAccountState, addressState, } = state$.value;
25
+ const { companyState, companyViewState, userState, userRoleState, onboardingCustomerViewState, subscriptionPaymentAccountState, paymentAccountState, addressState, } = state$.value;
26
26
  const { subscriptionPaymentAccountIds } = onboardingCustomerViewState;
27
27
  const subscriptionIDs = (0, get_1.default)(companyViewState.passportView.subscriptionIDsByCompanyID, companyId, undefined);
28
28
  const companyView = (0, getCompanyView_1.getCompanyView)(state$.value, companyId, subscriptionIDs ?? []);
@@ -42,7 +42,12 @@ const updateOnboardingCustomerViewLocalStoreDataEpic = (actions$, state$) => act
42
42
  const onboardingCustomerViewLocalData = toOnboardingCustomerViewLocalData(company, companyOfficers, companyOfficerRoles, primaryContact);
43
43
  const { companyDetails, officers, primaryContactDetails } = onboardingCustomerViewLocalData;
44
44
  let updatedCompanyDetails = companyDetails;
45
- if (currentStep === 'company_officer' &&
45
+ // After an officer sub-step save inside the verification step, propagate
46
+ // the latest syncToken into the cached company-details local data so the
47
+ // user's next details-save doesn't 409.
48
+ const isOfficerSave = currentStep === 'verification' &&
49
+ onboardingCustomerViewState.currentSubStep === 'company_officer';
50
+ if (isOfficerSave &&
46
51
  onboardingCustomerViewState.companyDetails.localData != null) {
47
52
  const { companyInfo } = company;
48
53
  const { syncToken } = companyInfo;
@@ -51,7 +56,7 @@ const updateOnboardingCustomerViewLocalStoreDataEpic = (actions$, state$) => act
51
56
  syncToken,
52
57
  };
53
58
  }
54
- let updatedCurrentStep = 'link_payment_account';
59
+ let updatedCurrentStep = 'setup_billing';
55
60
  let subscriptionPaymentAccount;
56
61
  const { companyOnboardingInfo } = company;
57
62
  const accountingConnectionCreationMode = companyOnboardingInfo?.onboardingInfo
@@ -78,18 +83,17 @@ const updateOnboardingCustomerViewLocalStoreDataEpic = (actions$, state$) => act
78
83
  cardPaymentViewState.cardPaymentsIds.length > 0) &&
79
84
  companyView?.company.company.companyOnboardingInfo
80
85
  .subscriptionBillingAddressId != null) {
81
- updatedCurrentStep = 'qbo_connection';
82
- if (isValidConnection) {
83
- updatedCurrentStep = 'company_officer';
84
- let officerIndex = companyOfficers.length > 0
85
- ? officers.findIndex((officer) => officer?.isSelectedForVerification === true)
86
- : 0;
87
- if (officerIndex === -1) {
88
- officerIndex = 0;
89
- }
90
- if ((0, onboardingCustomerViewSelector_1.isOfficerDetailsCompleted)(companyOfficers, companyOfficerRoles, officers[officerIndex], fileState)) {
91
- updatedCurrentStep = 'company_details';
92
- }
86
+ updatedCurrentStep = 'connect_ledger';
87
+ const isOnboardingAiActivationViewed = companyOnboardingInfo?.onboardingInfo
88
+ ?.onboardingAiActivationInfo?.isOnboardingAiActivationViewed ??
89
+ false;
90
+ // Past the ledger step we always sit on connect_data_source —
91
+ // it has many integrations, so we treat it as never auto-complete
92
+ // and only advance to verification on an explicit user dispatch.
93
+ // While the AI activation interstitial hasn't been viewed yet,
94
+ // stay on connect_ledger so the interstitial gets its chance.
95
+ if (isValidConnection && isOnboardingAiActivationViewed) {
96
+ updatedCurrentStep = 'connect_data_source';
93
97
  }
94
98
  }
95
99
  }
@@ -111,6 +115,14 @@ const updateOnboardingCustomerViewLocalStoreDataEpic = (actions$, state$) => act
111
115
  }
112
116
  if (reCalculateCurrentStep === true) {
113
117
  fetchActions.push((0, onboardingCustomerViewReducer_1.updateCurrentStep)({ step: updatedCurrentStep }));
118
+ // Whenever the recalc lands the user on a different step, reset
119
+ // the sub-step to the step's landing sub-state — otherwise a
120
+ // stale subStep (e.g. 'default' carried over from another step)
121
+ // leaves verification rendering an empty form.
122
+ if (updatedCurrentStep !== onboardingCustomerViewState.currentStep) {
123
+ const targetSubStep = updatedCurrentStep === 'verification' ? 'unlock-stack' : 'default';
124
+ fetchActions.push((0, onboardingCustomerViewReducer_1.updateCurrentSubStep)({ subStep: targetSubStep }));
125
+ }
114
126
  }
115
127
  }
116
128
  if (companyView != null) {
@@ -15,6 +15,9 @@ export interface OnboardingStatusPayload {
15
15
  is_user_landed_to_interim_page: boolean;
16
16
  should_complete_onboarding: boolean;
17
17
  }
18
+ export interface AiFinanceTeamAcknowledgementPayload {
19
+ is_onboarding_ai_finance_team_acknowledged: boolean;
20
+ }
18
21
  interface CompaniesData {
19
22
  companies: CompanyPayload[];
20
23
  }
@@ -1,8 +1,9 @@
1
1
  import { ID } from '../../../commonStateTypes/common';
2
2
  import { ZeniAPIStatus } from '../../../responsePayload';
3
3
  import { CompanyOfficerType } from '../../companyView/types/companyPassport/companyUsersLocalData';
4
+ import { CompanyDetailsLocalData, CompanyOfficerLocalData } from '../../spendManagement/commonSetup/setupViewState';
4
5
  import { PlaidLinkTokenType } from '../../spendManagement/plaidAccount/plaidAccountViewState';
5
- import { OnboardingCustomerViewState, OnboardingCustomerViewUIState, OnboardingStep } from './onboardingCustomerViewState';
6
+ import { AiAgentsActivationCounts, AiAgentsActivationPhase, OnboardingCustomerViewState, OnboardingCustomerViewUIState, OnboardingStep, OnboardingSubStep } from './onboardingCustomerViewState';
6
7
  export declare const initialState: OnboardingCustomerViewState;
7
8
  export declare const fetchOnboardingCustomerView: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[companyId: string, cacheOverride?: any, reCalculateCurrentStep?: any], {
8
9
  companyId: string;
@@ -16,7 +17,17 @@ export declare const fetchOnboardingCustomerView: import("@reduxjs/toolkit").Act
16
17
  companyId: string;
17
18
  checkOnboardingComplete: boolean;
18
19
  productSuitePage: boolean;
19
- }, "onboardingCustomerView/updateOnboardingCustomerViewCompleteStatus", never, never>, updateOnboardingCustomerViewCompleteStatusSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/updateOnboardingCustomerViewCompleteStatusSuccess">, updateOnboardingCustomerViewCompleteStatusFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[error: ZeniAPIStatus<Record<string, unknown>>], ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/updateOnboardingCustomerViewCompleteStatusFailure", never, never>, updateOnboardingCustomerViewDashboardLoaded: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[companyId: string], {
20
+ }, "onboardingCustomerView/updateOnboardingCustomerViewCompleteStatus", never, never>, updateOnboardingCustomerViewCompleteStatusSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/updateOnboardingCustomerViewCompleteStatusSuccess">, updateOnboardingCustomerViewCompleteStatusFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[error: ZeniAPIStatus<Record<string, unknown>>], ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/updateOnboardingCustomerViewCompleteStatusFailure", never, never>, acknowledgeOnboardingAiFinanceTeam: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[companyId: string], {
21
+ companyId: string;
22
+ }, "onboardingCustomerView/acknowledgeOnboardingAiFinanceTeam", never, never>, acknowledgeOnboardingAiFinanceTeamSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/acknowledgeOnboardingAiFinanceTeamSuccess">, acknowledgeOnboardingAiFinanceTeamFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[error: ZeniAPIStatus<Record<string, unknown>>], ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/acknowledgeOnboardingAiFinanceTeamFailure", never, never>, acknowledgeOnboardingAiActivationViewed: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[companyId: string], {
23
+ companyId: string;
24
+ }, "onboardingCustomerView/acknowledgeOnboardingAiActivationViewed", never, never>, acknowledgeOnboardingAiActivationViewedSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/acknowledgeOnboardingAiActivationViewedSuccess">, acknowledgeOnboardingAiActivationViewedFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[error: ZeniAPIStatus<Record<string, unknown>>], ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/acknowledgeOnboardingAiActivationViewedFailure", never, never>, fetchAiAgentsActivationStatus: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/fetchAiAgentsActivationStatus">, fetchAiAgentsActivationStatusSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
25
+ counts: AiAgentsActivationCounts;
26
+ phases: AiAgentsActivationPhase[];
27
+ }], {
28
+ counts: AiAgentsActivationCounts;
29
+ phases: AiAgentsActivationPhase[];
30
+ }, "onboardingCustomerView/fetchAiAgentsActivationStatusSuccess", never, never>, fetchAiAgentsActivationStatusFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[error: ZeniAPIStatus<Record<string, unknown>>], ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/fetchAiAgentsActivationStatusFailure", never, never>, aiAgentsActivationCountsUpdated: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: Partial<AiAgentsActivationCounts>], Partial<AiAgentsActivationCounts>, "onboardingCustomerView/aiAgentsActivationCountsUpdated", never, never>, aiAgentsActivationPhaseChanged: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: AiAgentsActivationPhase], AiAgentsActivationPhase, "onboardingCustomerView/aiAgentsActivationPhaseChanged", never, never>, updateOnboardingCustomerViewDashboardLoaded: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[companyId: string], {
20
31
  companyId: string;
21
32
  }, "onboardingCustomerView/updateOnboardingCustomerViewDashboardLoaded", never, never>, updateOnboardingCustomerViewDashboardLoadedSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/updateOnboardingCustomerViewDashboardLoadedSuccess">, updateOnboardingCustomerViewDashboardLoadedFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[error: ZeniAPIStatus<Record<string, unknown>>], ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/updateOnboardingCustomerViewDashboardLoadedFailure", never, never>, updateOnboardingCustomerView: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[companyId: string, sendForVerification: boolean, reCalculateCurrentStep?: boolean | undefined, isBillingAddressUpdate?: boolean | undefined, officerType?: "Officer_1" | "Officer_3" | "Officer_2" | "Officer_4" | "Officer_5" | "Officer_6" | "Officer_7" | "Officer_8" | "Officer_9" | "Officer_10" | undefined], {
22
33
  companyId: string;
@@ -65,18 +76,46 @@ export declare const fetchOnboardingCustomerView: import("@reduxjs/toolkit").Act
65
76
  linkTokenType: PlaidLinkTokenType;
66
77
  }, "onboardingCustomerView/getOnboardingPlaidLinkTokenFailure", never, never>, updateCurrentStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
67
78
  step: OnboardingStep;
68
- }, "onboardingCustomerView/updateCurrentStep">, updateOnboardingCustomerViewAccountDetails: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[paymentAccountIds: string[], subscriptionPaymentAccountIds: string[]], {
79
+ }, "onboardingCustomerView/updateCurrentStep">, updateCurrentSubStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
80
+ subStep: OnboardingSubStep;
81
+ }, "onboardingCustomerView/updateCurrentSubStep">, updateOnboardingCustomerViewAccountDetails: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[paymentAccountIds: string[], subscriptionPaymentAccountIds: string[]], {
69
82
  paymentAccountIds: string[];
70
83
  subscriptionPaymentAccountIds: string[];
71
84
  }, "onboardingCustomerView/updateOnboardingCustomerViewAccountDetails", never, never>, updateOnboardingCustomerViewLocalStoreData: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
72
85
  companyId: ID;
73
86
  currentStep?: OnboardingStep;
74
87
  reCalculateCurrentStep?: boolean;
75
- }, "onboardingCustomerView/updateOnboardingCustomerViewLocalStoreData">, saveOnboardingCustomerViewDataInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<import("../../..").SetupViewLocalData>, "onboardingCustomerView/saveOnboardingCustomerViewDataInLocalStore">, saveOnboardingCompnayOfficerPhoneInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
88
+ }, "onboardingCustomerView/updateOnboardingCustomerViewLocalStoreData">, saveOnboardingCustomerViewDataInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<import("../../spendManagement/commonSetup/setupViewState").SetupViewLocalData>, "onboardingCustomerView/saveOnboardingCustomerViewDataInLocalStore">, saveOnboardingCompnayOfficerPhoneInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
76
89
  officerType: CompanyOfficerType;
77
90
  phone: string | number;
78
91
  }, "onboardingCustomerView/saveOnboardingCompnayOfficerPhoneInLocalStore">, updateOnboardingCustomerViewUIState: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<OnboardingCustomerViewUIState>, "onboardingCustomerView/updateOnboardingCustomerViewUIState">, sendOnboardingOfficerOtp: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/sendOnboardingOfficerOtp">, sendOnboardingOfficerOtpSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
79
92
  otpChallenge: string;
80
- }, "onboardingCustomerView/sendOnboardingOfficerOtpSuccess">, sendOnboardingOfficerOtpFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/sendOnboardingOfficerOtpFailure">, resendOnboardingOfficerOtp: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/resendOnboardingOfficerOtp">, verifyOnboardingOfficerOtp: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/verifyOnboardingOfficerOtp">, verifyOnboardingOfficerOtpSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/verifyOnboardingOfficerOtpSuccess">, verifyOnboardingOfficerOtpFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/verifyOnboardingOfficerOtpFailure">, clearOnboardingCustomerViewDataInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/clearOnboardingCustomerViewDataInLocalStore">, clearOnboardingCustomerView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/clearOnboardingCustomerView">;
93
+ }, "onboardingCustomerView/sendOnboardingOfficerOtpSuccess">, sendOnboardingOfficerOtpFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/sendOnboardingOfficerOtpFailure">, resendOnboardingOfficerOtp: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/resendOnboardingOfficerOtp">, verifyOnboardingOfficerOtp: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/verifyOnboardingOfficerOtp">, verifyOnboardingOfficerOtpSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/verifyOnboardingOfficerOtpSuccess">, verifyOnboardingOfficerOtpFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "onboardingCustomerView/verifyOnboardingOfficerOtpFailure">, clearOnboardingCustomerViewDataInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/clearOnboardingCustomerViewDataInLocalStore">, clearOnboardingCustomerView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"onboardingCustomerView/clearOnboardingCustomerView">, applyKycDocumentAutofillForOnboarding: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
94
+ autoFilledFieldNames: string[];
95
+ companyId: ID;
96
+ fileId: ID;
97
+ officerType: CompanyOfficerType;
98
+ values: Partial<CompanyOfficerLocalData>;
99
+ }], {
100
+ autoFilledFieldNames: string[];
101
+ companyId: ID;
102
+ fileId: ID;
103
+ officerType: CompanyOfficerType;
104
+ values: Partial<CompanyOfficerLocalData>;
105
+ }, "onboardingCustomerView/applyKycDocumentAutofillForOnboarding", never, never>, applyKybDocumentAutofillForOnboarding: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
106
+ autoFilledFieldNames: string[];
107
+ companyId: ID;
108
+ fileId: ID;
109
+ values: Partial<CompanyDetailsLocalData>;
110
+ }], {
111
+ autoFilledFieldNames: string[];
112
+ companyId: ID;
113
+ fileId: ID;
114
+ values: Partial<CompanyDetailsLocalData>;
115
+ }, "onboardingCustomerView/applyKybDocumentAutofillForOnboarding", never, never>, clearKycKybAutofillForOnboarding: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload?: {
116
+ officerType?: CompanyOfficerType;
117
+ } | undefined], {
118
+ officerType?: CompanyOfficerType;
119
+ }, "onboardingCustomerView/clearKycKybAutofillForOnboarding", never, never>;
81
120
  declare const _default: import("redux").Reducer<OnboardingCustomerViewState>;
82
121
  export default _default;