@zeniai/client-epic-state 5.0.84 → 5.0.85-beta0ND

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 (83) hide show
  1. package/lib/commonStateTypes/animations.d.ts +1 -1
  2. package/lib/commonStateTypes/animations.js +1 -0
  3. package/lib/entity/company/companyPayload.d.ts +2 -0
  4. package/lib/entity/company/companyPayload.js +2 -0
  5. package/lib/entity/company/companyStateTypes.d.ts +2 -0
  6. package/lib/entity/paymentAccount/paymentAccountSelector.d.ts +1 -0
  7. package/lib/entity/paymentAccount/paymentAccountSelector.js +4 -0
  8. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  9. package/lib/entity/snackbar/snackbarTypes.js +1 -0
  10. package/lib/entity/tenant/epic/deleteConnectionEpic.d.ts +1 -1
  11. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.d.ts +21 -0
  12. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.js +54 -0
  13. package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.d.ts +1 -1
  14. package/lib/entity/tenant/epic/saveConnectorCredentialsEpic.d.ts +3 -3
  15. package/lib/entity/tenant/epic/saveOAuthConnectionEpic.d.ts +1 -1
  16. package/lib/entity/tenant/tenantPayload.d.ts +19 -0
  17. package/lib/entity/tenant/tenantReducer.d.ts +49 -28
  18. package/lib/entity/tenant/tenantReducer.js +111 -5
  19. package/lib/entity/tenant/tenantState.d.ts +21 -0
  20. package/lib/epic.d.ts +8 -2
  21. package/lib/epic.js +9 -2
  22. package/lib/esm/commonStateTypes/animations.js +1 -0
  23. package/lib/esm/entity/company/companyPayload.js +2 -0
  24. package/lib/esm/entity/paymentAccount/paymentAccountSelector.js +3 -0
  25. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
  26. package/lib/esm/entity/tenant/epic/initEmailConnectOAuthEpic.js +50 -0
  27. package/lib/esm/entity/tenant/tenantReducer.js +108 -3
  28. package/lib/esm/epic.js +9 -2
  29. package/lib/esm/index.js +12 -9
  30. package/lib/esm/view/companyView/companyViewReducer.js +45 -1
  31. package/lib/esm/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.js +25 -0
  32. package/lib/esm/view/companyView/epic/companyPassport/updateCapitalizationThresholdEpic.js +79 -0
  33. package/lib/esm/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  34. package/lib/esm/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +45 -0
  35. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +40 -0
  36. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewReducer.js +168 -50
  37. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewSelector.js +14 -0
  38. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewState.js +13 -0
  39. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +49 -0
  40. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +58 -0
  41. package/lib/esm/view/spendManagement/commonSetup/kycKybAutofillActions.js +12 -0
  42. package/lib/esm/view/spendManagement/commonSetup/kycKybParseMapper.js +205 -0
  43. package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +71 -52
  44. package/lib/esm/view/spendManagement/commonSetup/setupViewSelector.js +2 -0
  45. package/lib/esm/view/spendManagement/commonSetup/types/kycKybAutofill.js +28 -0
  46. package/lib/index.d.ts +15 -11
  47. package/lib/index.js +56 -34
  48. package/lib/view/companyView/companyViewReducer.d.ts +11 -1
  49. package/lib/view/companyView/companyViewReducer.js +47 -3
  50. package/lib/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.d.ts +9 -0
  51. package/lib/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.js +29 -0
  52. package/lib/view/companyView/epic/companyPassport/updateCapitalizationThresholdEpic.d.ts +10 -0
  53. package/lib/view/companyView/epic/companyPassport/updateCapitalizationThresholdEpic.js +83 -0
  54. package/lib/view/companyView/types/companyPassport/companyPassportViewState.d.ts +1 -0
  55. package/lib/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  56. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  57. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.d.ts +7 -0
  58. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +49 -0
  59. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.d.ts +9 -0
  60. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +44 -0
  61. package/lib/view/onboardingView/customerView/onboardingCustomerViewPayload.d.ts +3 -0
  62. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.d.ts +41 -4
  63. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.js +170 -51
  64. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.d.ts +7 -1
  65. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.js +21 -1
  66. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.d.ts +37 -0
  67. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.js +14 -1
  68. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.d.ts +8 -0
  69. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +53 -0
  70. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.d.ts +8 -0
  71. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +62 -0
  72. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.d.ts +27 -0
  73. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.js +15 -0
  74. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.d.ts +24 -0
  75. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.js +213 -0
  76. package/lib/view/spendManagement/commonSetup/setupViewReducer.d.ts +24 -2
  77. package/lib/view/spendManagement/commonSetup/setupViewReducer.js +72 -53
  78. package/lib/view/spendManagement/commonSetup/setupViewSelector.d.ts +4 -0
  79. package/lib/view/spendManagement/commonSetup/setupViewSelector.js +2 -0
  80. package/lib/view/spendManagement/commonSetup/setupViewState.d.ts +12 -0
  81. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.d.ts +125 -0
  82. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.js +32 -0
  83. package/package.json +1 -1
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ /**
3
+ * Pure mappers from ExtendAI parser payloads to our form-side local-data shapes.
4
+ *
5
+ * Each mapper filters out fields below KYC_KYB_AUTOFILL_MIN_CONFIDENCE and returns
6
+ * both the merged values and the list of field names that were autofilled so the
7
+ * UI can show the ✦ AI badge next to each.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.mapTaxEinToCompanyDetails = exports.mapCoiToCompanyDetails = exports.mapSsnCardToOfficer = exports.mapDrivingLicenseToOfficer = exports.mapPassportToOfficer = void 0;
11
+ const zeniDayJS_1 = require("../../../zeniDayJS");
12
+ const zeniUrl_1 = require("../../../zeniUrl");
13
+ const kycKybAutofill_1 = require("./types/kycKybAutofill");
14
+ const emptyResult = () => ({
15
+ values: {},
16
+ autoFilledFieldNames: [],
17
+ });
18
+ const isConfident = (field) => {
19
+ if (field == null) {
20
+ return false;
21
+ }
22
+ if (field.value == null) {
23
+ return false;
24
+ }
25
+ return field.confidence >= kycKybAutofill_1.KYC_KYB_AUTOFILL_MIN_CONFIDENCE;
26
+ };
27
+ const assignAutofilledValue = (result, key, value) => {
28
+ if (value == null) {
29
+ return;
30
+ }
31
+ if (typeof value === 'string' && value.trim() === '') {
32
+ return;
33
+ }
34
+ result.values[key] = value;
35
+ result.autoFilledFieldNames.push(key);
36
+ };
37
+ const tryParseDate = (rawDate) => {
38
+ const parsedDate = (0, zeniDayJS_1.date)(rawDate);
39
+ if (parsedDate.isValid()) {
40
+ return parsedDate;
41
+ }
42
+ return undefined;
43
+ };
44
+ const normalizeNationality = (rawNationality, countries) => {
45
+ const needle = rawNationality.trim().toLowerCase();
46
+ if (needle === '') {
47
+ return undefined;
48
+ }
49
+ // Exact ISO-2 / ISO-3 match.
50
+ const isoMatch = countries.find((country) => country.countryCode.toLowerCase() === needle);
51
+ if (isoMatch != null) {
52
+ return isoMatch.countryCode;
53
+ }
54
+ // Common nationality adjectives map to country names (e.g. "American" → "United States").
55
+ const adjectiveToCountry = {
56
+ american: 'united states',
57
+ british: 'united kingdom',
58
+ indian: 'india',
59
+ canadian: 'canada',
60
+ australian: 'australia',
61
+ german: 'germany',
62
+ french: 'france',
63
+ chinese: 'china',
64
+ japanese: 'japan',
65
+ mexican: 'mexico',
66
+ brazilian: 'brazil',
67
+ };
68
+ const resolvedName = adjectiveToCountry[needle] ?? needle;
69
+ const nameMatch = countries.find((country) => country.countryName.toLowerCase() === resolvedName);
70
+ return nameMatch?.countryCode;
71
+ };
72
+ const splitFullName = (fullName) => {
73
+ const parts = fullName.trim().split(/\s+/);
74
+ if (parts.length === 1) {
75
+ return { firstName: parts[0], lastName: '' };
76
+ }
77
+ const lastName = parts[parts.length - 1];
78
+ const firstName = parts.slice(0, -1).join(' ');
79
+ return { firstName, lastName };
80
+ };
81
+ /** Passport → Company Officer. */
82
+ const mapPassportToOfficer = (parsed, allNationalityCountries) => {
83
+ const result = emptyResult();
84
+ if (isConfident(parsed.first_name)) {
85
+ assignAutofilledValue(result, 'firstName', parsed.first_name.value);
86
+ }
87
+ if (isConfident(parsed.last_name)) {
88
+ assignAutofilledValue(result, 'lastName', parsed.last_name.value);
89
+ }
90
+ if (isConfident(parsed.date_of_birth)) {
91
+ const parsedDate = tryParseDate(parsed.date_of_birth.value);
92
+ if (parsedDate != null) {
93
+ assignAutofilledValue(result, 'birthday', parsedDate);
94
+ }
95
+ }
96
+ if (isConfident(parsed.nationality)) {
97
+ const isoCode = normalizeNationality(parsed.nationality.value, allNationalityCountries);
98
+ if (isoCode != null) {
99
+ assignAutofilledValue(result, 'nationalityCountryCode', isoCode);
100
+ }
101
+ }
102
+ return result;
103
+ };
104
+ exports.mapPassportToOfficer = mapPassportToOfficer;
105
+ /** Driving License → Company Officer. */
106
+ const mapDrivingLicenseToOfficer = (parsed) => {
107
+ const result = emptyResult();
108
+ if (isConfident(parsed.first_name)) {
109
+ assignAutofilledValue(result, 'firstName', parsed.first_name.value);
110
+ }
111
+ if (isConfident(parsed.last_name)) {
112
+ assignAutofilledValue(result, 'lastName', parsed.last_name.value);
113
+ }
114
+ if (isConfident(parsed.date_of_birth)) {
115
+ const parsedDate = tryParseDate(parsed.date_of_birth.value);
116
+ if (parsedDate != null) {
117
+ assignAutofilledValue(result, 'birthday', parsedDate);
118
+ }
119
+ }
120
+ // address_* fields are mapped at a higher layer (addressView reducer) — kept here as values
121
+ // only, the consuming epic dispatches the address payload separately.
122
+ return result;
123
+ };
124
+ exports.mapDrivingLicenseToOfficer = mapDrivingLicenseToOfficer;
125
+ /** SSN Card → Company Officer (name only — SSN value not yet returned by parser). */
126
+ const mapSsnCardToOfficer = (parsed) => {
127
+ const result = emptyResult();
128
+ if (isConfident(parsed.full_name)) {
129
+ const { firstName, lastName } = splitFullName(parsed.full_name.value);
130
+ if (firstName !== '') {
131
+ assignAutofilledValue(result, 'firstName', firstName);
132
+ }
133
+ if (lastName !== '') {
134
+ assignAutofilledValue(result, 'lastName', lastName);
135
+ }
136
+ }
137
+ return result;
138
+ };
139
+ exports.mapSsnCardToOfficer = mapSsnCardToOfficer;
140
+ /** Certificate of Incorporation → Company Details. */
141
+ const mapCoiToCompanyDetails = (parsed) => {
142
+ const result = emptyResult();
143
+ if (isConfident(parsed.company_legal_name)) {
144
+ assignAutofilledValue(result, 'companyLegalName', parsed.company_legal_name.value);
145
+ }
146
+ if (isConfident(parsed.ein)) {
147
+ assignAutofilledValue(result, 'taxIdOrEIN', parsed.ein.value);
148
+ }
149
+ if (isConfident(parsed.phone_number)) {
150
+ assignAutofilledValue(result, 'phone', parsed.phone_number.value);
151
+ }
152
+ if (isConfident(parsed.product_description)) {
153
+ assignAutofilledValue(result, 'companyDescription', parsed.product_description.value);
154
+ }
155
+ if (isConfident(parsed.website)) {
156
+ try {
157
+ assignAutofilledValue(result, 'website', (0, zeniUrl_1.toZeniUrl)(parsed.website.value));
158
+ }
159
+ catch {
160
+ // ignore — malformed URL string from OCR
161
+ }
162
+ }
163
+ if (isConfident(parsed.industry)) {
164
+ assignAutofilledValue(result, 'companyIndustryType', parsed.industry.value);
165
+ }
166
+ if (isConfident(parsed.sub_industry)) {
167
+ assignAutofilledValue(result, 'companySubIndustry', parsed.sub_industry.value);
168
+ }
169
+ if (isConfident(parsed.type_of_incorporation)) {
170
+ assignAutofilledValue(result, 'typeOfIncorporation', parsed.type_of_incorporation.value);
171
+ }
172
+ if (isConfident(parsed.date_of_incorporation)) {
173
+ const parsedDate = tryParseDate(parsed.date_of_incorporation.value);
174
+ if (parsedDate != null) {
175
+ assignAutofilledValue(result, 'incDate', parsedDate);
176
+ }
177
+ }
178
+ if (isConfident(parsed.state_of_incorporation)) {
179
+ assignAutofilledValue(result, 'stateOfIncorporation', parsed.state_of_incorporation.value);
180
+ }
181
+ if (isConfident(parsed.countries_of_operations)) {
182
+ assignAutofilledValue(result, 'countriesOfOperations', parsed.countries_of_operations.value);
183
+ }
184
+ if (isConfident(parsed.source_of_funds)) {
185
+ assignAutofilledValue(result, 'sourceOfFunds', parsed.source_of_funds.value);
186
+ }
187
+ if (isConfident(parsed.transaction_volume_expectations)) {
188
+ assignAutofilledValue(result, 'transactionVolume', parsed.transaction_volume_expectations.value);
189
+ }
190
+ if (isConfident(parsed.purpose_of_account)) {
191
+ assignAutofilledValue(result, 'purposeOfAccount', parsed.purpose_of_account.value);
192
+ }
193
+ if (isConfident(parsed.regulated_status)) {
194
+ assignAutofilledValue(result, 'regulatedStatus', parsed.regulated_status.value);
195
+ }
196
+ if (isConfident(parsed.us_nexus)) {
197
+ assignAutofilledValue(result, 'usNexus', parsed.us_nexus.value);
198
+ }
199
+ return result;
200
+ };
201
+ exports.mapCoiToCompanyDetails = mapCoiToCompanyDetails;
202
+ /** Tax EIN letter → Company Details. */
203
+ const mapTaxEinToCompanyDetails = (parsed) => {
204
+ const result = emptyResult();
205
+ if (isConfident(parsed.legal_business_name)) {
206
+ assignAutofilledValue(result, 'companyLegalName', parsed.legal_business_name.value);
207
+ }
208
+ if (isConfident(parsed.ein)) {
209
+ assignAutofilledValue(result, 'taxIdOrEIN', parsed.ein.value);
210
+ }
211
+ return result;
212
+ };
213
+ exports.mapTaxEinToCompanyDetails = mapTaxEinToCompanyDetails;
@@ -2,7 +2,7 @@ import { ID } from '../../../commonStateTypes/common';
2
2
  import { ZeniAPIStatus } from '../../../responsePayload';
3
3
  import { ZeniDate } from '../../../zeniDayJS';
4
4
  import { CompanyOfficerType } from '../../companyView/types/companyPassport/companyUsersLocalData';
5
- import { CompanyDetailsLocalData, SetupViewLocalData, SetupViewState } from './setupViewState';
5
+ import { CompanyDetailsLocalData, CompanyOfficerLocalData, SetupViewLocalData, SetupViewState } from './setupViewState';
6
6
  export declare const initialState: SetupViewState;
7
7
  export declare const enableSetup: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[companyId: string, setupViewType: "bill_pay" | "reimbursement" | "zeni_accounts" | "zeni_treasury" | "charge_cards" | "other_connection" | "billing" | "debit_cards" | "charge_cards__debit_cards"], {
8
8
  companyId: string;
@@ -29,6 +29,28 @@ export declare const enableSetup: import("@reduxjs/toolkit").ActionCreatorWithPr
29
29
  }, "setupView/sendOtpSuccess">, sendOtpFailureSpendManagementSetUp: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "setupView/sendOtpFailure">, verifyOtpSpendManagementSetUp: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"setupView/verifyOtp">, verifyOtpSuccessSpendManagementSetUp: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"setupView/verifyOtpSuccess">, verifyOtpFailureSpendManagementSetUp: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "setupView/verifyOtpFailure">, saveIndustryAndIncDateInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
30
30
  incDate: ZeniDate;
31
31
  industry: string;
32
- }, "setupView/saveIndustryAndIncDateInLocalStore">, clearSetupViewDataInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"setupView/clearSetupViewDataInLocalStore">, clearSetupView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"setupView/clearSetupView">;
32
+ }, "setupView/saveIndustryAndIncDateInLocalStore">, clearSetupViewDataInLocalStore: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"setupView/clearSetupViewDataInLocalStore">, clearSetupView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"setupView/clearSetupView">, applyKycDocumentAutofillForSetup: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
33
+ autoFilledFieldNames: string[];
34
+ companyId: ID;
35
+ officerType: CompanyOfficerType;
36
+ values: Partial<CompanyOfficerLocalData>;
37
+ }], {
38
+ autoFilledFieldNames: string[];
39
+ companyId: ID;
40
+ officerType: CompanyOfficerType;
41
+ values: Partial<CompanyOfficerLocalData>;
42
+ }, "setupView/applyKycDocumentAutofillForSetup", never, never>, applyKybDocumentAutofillForSetup: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
43
+ autoFilledFieldNames: string[];
44
+ companyId: ID;
45
+ values: Partial<CompanyDetailsLocalData>;
46
+ }], {
47
+ autoFilledFieldNames: string[];
48
+ companyId: ID;
49
+ values: Partial<CompanyDetailsLocalData>;
50
+ }, "setupView/applyKybDocumentAutofillForSetup", never, never>, clearKycKybAutofillForSetup: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload?: {
51
+ officerType?: CompanyOfficerType;
52
+ } | undefined], {
53
+ officerType?: CompanyOfficerType;
54
+ }, "setupView/clearKycKybAutofillForSetup", never, never>;
33
55
  declare const _default: import("redux").Reducer<SetupViewState>;
34
56
  export default _default;
@@ -1,66 +1,32 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearSetupView = exports.clearSetupViewDataInLocalStore = exports.saveIndustryAndIncDateInLocalStore = exports.verifyOtpFailureSpendManagementSetUp = exports.verifyOtpSuccessSpendManagementSetUp = exports.verifyOtpSpendManagementSetUp = exports.sendOtpFailureSpendManagementSetUp = exports.sendOtpSuccessSpendManagementSetUp = exports.resendOtpSpendManagementSetUp = exports.sendOtpSpendManagementSetUp = exports.saveTreasuryAdditionalDocumentsInLocalStore = exports.saveCompnayOfficerAdditionalDocumentsInLocalStore = exports.saveCompnayOfficerPhoneInLocalStore = exports.saveSetupViewDataInLocalStore = exports.updateSetupViewLocalStoreData = exports.updateSelectedCompanyOfficer = exports.updateBusinessVerificationDetailsFailure = exports.updateBusinessVerificationDetailsSuccess = exports.updateBusinessVerificationDetails = exports.enableSetupFailure = exports.enableSetupSuccess = exports.enableSetup = exports.initialState = void 0;
4
+ exports.clearKycKybAutofillForSetup = exports.applyKybDocumentAutofillForSetup = exports.applyKycDocumentAutofillForSetup = exports.clearSetupView = exports.clearSetupViewDataInLocalStore = exports.saveIndustryAndIncDateInLocalStore = exports.verifyOtpFailureSpendManagementSetUp = exports.verifyOtpSuccessSpendManagementSetUp = exports.verifyOtpSpendManagementSetUp = exports.sendOtpFailureSpendManagementSetUp = exports.sendOtpSuccessSpendManagementSetUp = exports.resendOtpSpendManagementSetUp = exports.sendOtpSpendManagementSetUp = exports.saveTreasuryAdditionalDocumentsInLocalStore = exports.saveCompnayOfficerAdditionalDocumentsInLocalStore = exports.saveCompnayOfficerPhoneInLocalStore = exports.saveSetupViewDataInLocalStore = exports.updateSetupViewLocalStoreData = exports.updateSelectedCompanyOfficer = exports.updateBusinessVerificationDetailsFailure = exports.updateBusinessVerificationDetailsSuccess = exports.updateBusinessVerificationDetails = exports.enableSetupFailure = exports.enableSetupSuccess = exports.enableSetup = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const initialFetchStatus = {
7
7
  fetchState: 'Not-Started',
8
8
  error: undefined,
9
9
  };
10
+ const emptyOfficerSlot = {
11
+ autoFilledFields: [],
12
+ localData: undefined,
13
+ sendOtpStatus: initialFetchStatus,
14
+ otpverificationStatus: initialFetchStatus,
15
+ };
10
16
  exports.initialState = {
11
17
  updateStatus: { fetchState: 'Not-Started', error: undefined },
12
- companyDetails: {},
18
+ companyDetails: { autoFilledFields: [] },
13
19
  companyOfficerUpdateStatus: {
14
- Officer_1: {
15
- localData: undefined,
16
- sendOtpStatus: initialFetchStatus,
17
- otpverificationStatus: initialFetchStatus,
18
- },
19
- Officer_2: {
20
- localData: undefined,
21
- sendOtpStatus: initialFetchStatus,
22
- otpverificationStatus: initialFetchStatus,
23
- },
24
- Officer_3: {
25
- localData: undefined,
26
- sendOtpStatus: initialFetchStatus,
27
- otpverificationStatus: initialFetchStatus,
28
- },
29
- Officer_4: {
30
- localData: undefined,
31
- sendOtpStatus: initialFetchStatus,
32
- otpverificationStatus: initialFetchStatus,
33
- },
34
- Officer_5: {
35
- localData: undefined,
36
- sendOtpStatus: initialFetchStatus,
37
- otpverificationStatus: initialFetchStatus,
38
- },
39
- Officer_6: {
40
- localData: undefined,
41
- sendOtpStatus: initialFetchStatus,
42
- otpverificationStatus: initialFetchStatus,
43
- },
44
- Officer_7: {
45
- localData: undefined,
46
- sendOtpStatus: initialFetchStatus,
47
- otpverificationStatus: initialFetchStatus,
48
- },
49
- Officer_8: {
50
- localData: undefined,
51
- sendOtpStatus: initialFetchStatus,
52
- otpverificationStatus: initialFetchStatus,
53
- },
54
- Officer_9: {
55
- localData: undefined,
56
- sendOtpStatus: initialFetchStatus,
57
- otpverificationStatus: initialFetchStatus,
58
- },
59
- Officer_10: {
60
- localData: undefined,
61
- sendOtpStatus: initialFetchStatus,
62
- otpverificationStatus: initialFetchStatus,
63
- },
20
+ Officer_1: { ...emptyOfficerSlot },
21
+ Officer_2: { ...emptyOfficerSlot },
22
+ Officer_3: { ...emptyOfficerSlot },
23
+ Officer_4: { ...emptyOfficerSlot },
24
+ Officer_5: { ...emptyOfficerSlot },
25
+ Officer_6: { ...emptyOfficerSlot },
26
+ Officer_7: { ...emptyOfficerSlot },
27
+ Officer_8: { ...emptyOfficerSlot },
28
+ Officer_9: { ...emptyOfficerSlot },
29
+ Officer_10: { ...emptyOfficerSlot },
64
30
  },
65
31
  primaryContactDetails: {},
66
32
  };
@@ -301,7 +267,60 @@ const setupView = (0, toolkit_1.createSlice)({
301
267
  clearSetupView(draft) {
302
268
  Object.assign(draft, exports.initialState);
303
269
  },
270
+ /**
271
+ * Merge AI-parsed officer fields into the selected officer's localData and
272
+ * track which field names were autofilled so the form can show the ✦ badge.
273
+ */
274
+ applyKycDocumentAutofillForSetup: {
275
+ reducer(draft, action) {
276
+ const { officerType, values, autoFilledFieldNames } = action.payload;
277
+ const slot = draft.companyOfficerUpdateStatus[officerType];
278
+ slot.localData = Object.assign({}, slot.localData, values);
279
+ slot.autoFilledFields = Array.from(new Set([...slot.autoFilledFields, ...autoFilledFieldNames]));
280
+ },
281
+ prepare(payload) {
282
+ return { payload };
283
+ },
284
+ },
285
+ /**
286
+ * Merge AI-parsed company fields into companyDetails.localData and track
287
+ * which field names were autofilled.
288
+ */
289
+ applyKybDocumentAutofillForSetup: {
290
+ reducer(draft, action) {
291
+ const { values, autoFilledFieldNames } = action.payload;
292
+ draft.companyDetails.localData = Object.assign({}, draft.companyDetails.localData, values);
293
+ draft.companyDetails.autoFilledFields = Array.from(new Set([
294
+ ...draft.companyDetails.autoFilledFields,
295
+ ...autoFilledFieldNames,
296
+ ]));
297
+ },
298
+ prepare(payload) {
299
+ return { payload };
300
+ },
301
+ },
302
+ /**
303
+ * Wipe AI-autofill badges. If `officerType` is provided, clears only that
304
+ * officer; otherwise clears company details too.
305
+ */
306
+ clearKycKybAutofillForSetup: {
307
+ reducer(draft, action) {
308
+ const { officerType } = action.payload;
309
+ if (officerType != null) {
310
+ draft.companyOfficerUpdateStatus[officerType].autoFilledFields = [];
311
+ }
312
+ else {
313
+ draft.companyDetails.autoFilledFields = [];
314
+ Object.keys(draft.companyOfficerUpdateStatus).forEach((key) => {
315
+ draft.companyOfficerUpdateStatus[key].autoFilledFields = [];
316
+ });
317
+ }
318
+ },
319
+ prepare(payload = {}) {
320
+ return { payload };
321
+ },
322
+ },
304
323
  },
305
324
  });
306
- _a = setupView.actions, exports.enableSetup = _a.enableSetup, exports.enableSetupSuccess = _a.enableSetupSuccess, exports.enableSetupFailure = _a.enableSetupFailure, exports.updateBusinessVerificationDetails = _a.updateBusinessVerificationDetails, exports.updateBusinessVerificationDetailsSuccess = _a.updateBusinessVerificationDetailsSuccess, exports.updateBusinessVerificationDetailsFailure = _a.updateBusinessVerificationDetailsFailure, exports.updateSelectedCompanyOfficer = _a.updateSelectedCompanyOfficer, exports.updateSetupViewLocalStoreData = _a.updateSetupViewLocalStoreData, exports.saveSetupViewDataInLocalStore = _a.saveSetupViewDataInLocalStore, exports.saveCompnayOfficerPhoneInLocalStore = _a.saveCompnayOfficerPhoneInLocalStore, exports.saveCompnayOfficerAdditionalDocumentsInLocalStore = _a.saveCompnayOfficerAdditionalDocumentsInLocalStore, exports.saveTreasuryAdditionalDocumentsInLocalStore = _a.saveTreasuryAdditionalDocumentsInLocalStore, exports.sendOtpSpendManagementSetUp = _a.sendOtp, exports.resendOtpSpendManagementSetUp = _a.resendOtp, exports.sendOtpSuccessSpendManagementSetUp = _a.sendOtpSuccess, exports.sendOtpFailureSpendManagementSetUp = _a.sendOtpFailure, exports.verifyOtpSpendManagementSetUp = _a.verifyOtp, exports.verifyOtpSuccessSpendManagementSetUp = _a.verifyOtpSuccess, exports.verifyOtpFailureSpendManagementSetUp = _a.verifyOtpFailure, exports.saveIndustryAndIncDateInLocalStore = _a.saveIndustryAndIncDateInLocalStore, exports.clearSetupViewDataInLocalStore = _a.clearSetupViewDataInLocalStore, exports.clearSetupView = _a.clearSetupView;
325
+ _a = setupView.actions, exports.enableSetup = _a.enableSetup, exports.enableSetupSuccess = _a.enableSetupSuccess, exports.enableSetupFailure = _a.enableSetupFailure, exports.updateBusinessVerificationDetails = _a.updateBusinessVerificationDetails, exports.updateBusinessVerificationDetailsSuccess = _a.updateBusinessVerificationDetailsSuccess, exports.updateBusinessVerificationDetailsFailure = _a.updateBusinessVerificationDetailsFailure, exports.updateSelectedCompanyOfficer = _a.updateSelectedCompanyOfficer, exports.updateSetupViewLocalStoreData = _a.updateSetupViewLocalStoreData, exports.saveSetupViewDataInLocalStore = _a.saveSetupViewDataInLocalStore, exports.saveCompnayOfficerPhoneInLocalStore = _a.saveCompnayOfficerPhoneInLocalStore, exports.saveCompnayOfficerAdditionalDocumentsInLocalStore = _a.saveCompnayOfficerAdditionalDocumentsInLocalStore, exports.saveTreasuryAdditionalDocumentsInLocalStore = _a.saveTreasuryAdditionalDocumentsInLocalStore, exports.sendOtpSpendManagementSetUp = _a.sendOtp, exports.resendOtpSpendManagementSetUp = _a.resendOtp, exports.sendOtpSuccessSpendManagementSetUp = _a.sendOtpSuccess, exports.sendOtpFailureSpendManagementSetUp = _a.sendOtpFailure, exports.verifyOtpSpendManagementSetUp = _a.verifyOtp, exports.verifyOtpSuccessSpendManagementSetUp = _a.verifyOtpSuccess, exports.verifyOtpFailureSpendManagementSetUp = _a.verifyOtpFailure, exports.saveIndustryAndIncDateInLocalStore = _a.saveIndustryAndIncDateInLocalStore, exports.clearSetupViewDataInLocalStore = _a.clearSetupViewDataInLocalStore, exports.clearSetupView = _a.clearSetupView, exports.applyKycDocumentAutofillForSetup = _a.applyKycDocumentAutofillForSetup, exports.applyKybDocumentAutofillForSetup = _a.applyKybDocumentAutofillForSetup, exports.clearKycKybAutofillForSetup = _a.clearKycKybAutofillForSetup;
307
326
  exports.default = setupView.reducer;
@@ -54,6 +54,8 @@ export interface FundingAccount {
54
54
  }
55
55
  export interface CompanyOfficersDetails extends CompanyOfficerLocalData {
56
56
  additionalFiles: File[];
57
+ /** Field names in this officer's localData populated by AI doc autofill. */
58
+ autoFilledFields: string[];
57
59
  deleteFileStatusById: Record<ID, FetchStateAndError | undefined>;
58
60
  otpverificationStatus: FetchStateAndError;
59
61
  sendOtpStatus: FetchStateAndError;
@@ -62,6 +64,8 @@ export interface CompanyOfficersDetails extends CompanyOfficerLocalData {
62
64
  addressStatus?: NewAddressData;
63
65
  }
64
66
  export interface CompanyDetails {
67
+ /** Field names in companyDetails localData populated by AI doc autofill. */
68
+ autoFilledFields: string[];
65
69
  companyFiles: File[];
66
70
  companyId: ID;
67
71
  deleteFileStatusById: Record<ID, FetchStateAndError | undefined>;
@@ -124,6 +124,7 @@ const getCompanyAndIdentityDetails = (state, companyId, companyAndIdentityDetail
124
124
  const companyAddress = addressViewState.newAddressState?.company_address;
125
125
  const registeredCompanyAddress = addressViewState.newAddressState?.company_registered_address;
126
126
  companyDetailsLocalData = {
127
+ autoFilledFields: companyDetails.autoFilledFields,
127
128
  companyId,
128
129
  companyDescription,
129
130
  companyLegalName,
@@ -196,6 +197,7 @@ const getCompanyAndIdentityDetails = (state, companyId, companyAndIdentityDetail
196
197
  const companyOfficerAddress = addressViewState.newAddressState?.[addressType];
197
198
  companyOfficerLocalData[officerType] = {
198
199
  ...companyOfficer.localData,
200
+ autoFilledFields: companyOfficer.autoFilledFields,
199
201
  userFiles: (0, fileSelector_1.getFilesByFileIds)(fileState, fileIds),
200
202
  additionalFiles: (0, fileSelector_1.getFilesByFileIds)(fileState, additionalSubmittedDocumentsForVerificationFileIds),
201
203
  deleteFileStatusById,
@@ -81,9 +81,21 @@ export interface SetupViewLocalData {
81
81
  */
82
82
  export interface CompanyAndIdentityDetails {
83
83
  companyDetails: {
84
+ /**
85
+ * Field names from {@link CompanyDetailsLocalData} that were populated by AI
86
+ * autofill from an uploaded KYB document. Drives the ✦ sparkle in the form.
87
+ * Always present (empty when no autofill has run yet).
88
+ */
89
+ autoFilledFields: string[];
84
90
  localData?: CompanyDetailsLocalData;
85
91
  };
86
92
  companyOfficerUpdateStatus: Record<CompanyOfficerType, {
93
+ /**
94
+ * Field names from {@link CompanyOfficerLocalData} populated by AI autofill
95
+ * from an uploaded KYC identity document. Drives the ✦ sparkle in the form.
96
+ * Always present (empty when no autofill has run yet).
97
+ */
98
+ autoFilledFields: string[];
87
99
  otpverificationStatus: FetchStateAndError;
88
100
  sendOtpStatus: FetchStateAndError;
89
101
  localData?: CompanyOfficerLocalData;
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Shared types for the KYC / KYB document autofill flow that lives inside the
3
+ * commonSetup feature (Setup pages + Onboarding both consume it via the same
4
+ * selector view; there is no separate state slice).
5
+ *
6
+ * Backed by document-communication-agent `POST /1.0/documents/process/sync`,
7
+ * which proxies document-service ExtendAI parsers and returns one of the
8
+ * parser payloads below — each value shaped as `{value, confidence}` per field.
9
+ */
10
+ import { ID } from '../../../../commonStateTypes/common';
11
+ /**
12
+ * Form-side identity document types as picked in `SelectDocumentField`.
13
+ * These are camelCase per the web-components convention.
14
+ */
15
+ export type KycSelectDocumentType = 'driverLicense' | 'passport' | 'ssnCard' | 'stateId';
16
+ /**
17
+ * KYC document types accepted by the document-service parsers (snake_case).
18
+ * Subset of {@link KycKybProvidedDocumentType}. `stateId` from the form maps
19
+ * to no parser today and is skipped at dispatch time.
20
+ */
21
+ export type KycProvidedDocumentType = 'passport' | 'driving_license' | 'social_security_card';
22
+ /** KYB document types accepted by the document-service parsers. */
23
+ export type KybProvidedDocumentType = 'certificate_of_incorporation' | 'tax_ein';
24
+ /** All KYC / KYB document types accepted by document-communication-agent. */
25
+ export type KycKybProvidedDocumentType = KycProvidedDocumentType | KybProvidedDocumentType;
26
+ /** Field value with model confidence (0..1) as returned by ExtendAI parsers. */
27
+ export interface FieldWithConfidence<T = string | null> {
28
+ confidence: number;
29
+ value: T | null;
30
+ }
31
+ /**
32
+ * Parser payloads — keep in sync with document-service
33
+ * `processors/parsers/extend_*_parser.py`.
34
+ */
35
+ export interface ExtendPassportParsed {
36
+ date_of_birth?: FieldWithConfidence;
37
+ date_of_expiry?: FieldWithConfidence;
38
+ date_of_issue?: FieldWithConfidence;
39
+ first_name?: FieldWithConfidence;
40
+ gender?: FieldWithConfidence;
41
+ issuing_authority?: FieldWithConfidence;
42
+ last_name?: FieldWithConfidence;
43
+ mrz_line_1?: FieldWithConfidence;
44
+ mrz_line_2?: FieldWithConfidence;
45
+ nationality?: FieldWithConfidence;
46
+ passport_number?: FieldWithConfidence;
47
+ place_of_birth?: FieldWithConfidence;
48
+ }
49
+ export interface ExtendDrivingLicenseParsed {
50
+ address_city?: FieldWithConfidence;
51
+ address_state?: FieldWithConfidence;
52
+ address_street?: FieldWithConfidence;
53
+ address_zip?: FieldWithConfidence;
54
+ date_of_birth?: FieldWithConfidence;
55
+ date_of_expiry?: FieldWithConfidence;
56
+ date_of_issue?: FieldWithConfidence;
57
+ first_name?: FieldWithConfidence;
58
+ issuing_state?: FieldWithConfidence;
59
+ last_name?: FieldWithConfidence;
60
+ license_number?: FieldWithConfidence;
61
+ middle_name?: FieldWithConfidence;
62
+ }
63
+ export interface ExtendSsnCardParsed {
64
+ full_name?: FieldWithConfidence;
65
+ }
66
+ export interface ExtendCertificateOfIncorporationParsed {
67
+ company_address?: FieldWithConfidence;
68
+ company_legal_name?: FieldWithConfidence;
69
+ countries_of_operations?: FieldWithConfidence<string[]>;
70
+ date_of_incorporation?: FieldWithConfidence;
71
+ ein?: FieldWithConfidence;
72
+ industry?: FieldWithConfidence;
73
+ phone_number?: FieldWithConfidence;
74
+ product_description?: FieldWithConfidence;
75
+ purpose_of_account?: FieldWithConfidence;
76
+ registered_address?: FieldWithConfidence;
77
+ regulated_status?: FieldWithConfidence;
78
+ source_of_funds?: FieldWithConfidence;
79
+ state_of_incorporation?: FieldWithConfidence;
80
+ sub_industry?: FieldWithConfidence;
81
+ sub_us_nexus?: FieldWithConfidence;
82
+ transaction_volume_expectations?: FieldWithConfidence;
83
+ type_of_incorporation?: FieldWithConfidence;
84
+ us_nexus?: FieldWithConfidence;
85
+ website?: FieldWithConfidence;
86
+ }
87
+ export interface ExtendTaxEinParsed {
88
+ ein?: FieldWithConfidence;
89
+ irs_address?: FieldWithConfidence;
90
+ legal_business_name?: FieldWithConfidence;
91
+ trade_name?: FieldWithConfidence;
92
+ }
93
+ /** POST /1.0/documents/process/sync request body. */
94
+ export interface SyncDocumentsProcessRequest {
95
+ files: Array<{
96
+ file_id: ID;
97
+ }>;
98
+ provided_document_type: KycKybProvidedDocumentType;
99
+ metadata?: {
100
+ source?: string;
101
+ } & Record<string, unknown>;
102
+ processing_priority?: number;
103
+ }
104
+ /** POST /1.0/documents/process/sync response body. */
105
+ export interface SyncDocumentsProcessResponse {
106
+ data: ExtendPassportParsed | ExtendDrivingLicenseParsed | ExtendSsnCardParsed | ExtendCertificateOfIncorporationParsed | ExtendTaxEinParsed | null;
107
+ status: {
108
+ code: number;
109
+ message: string;
110
+ };
111
+ }
112
+ /**
113
+ * Discriminator for which Redux slice to apply the autofill to — setup pages
114
+ * (`spendManagement/commonSetup`) and onboarding (`onboardingView/customerView`)
115
+ * share the same field shapes but live in separate slices.
116
+ */
117
+ export type KycKybAutofillTarget = 'setup' | 'onboarding';
118
+ /** Confidence floor below which we drop an autofill candidate. */
119
+ export declare const KYC_KYB_AUTOFILL_MIN_CONFIDENCE = 0.5;
120
+ /**
121
+ * Maps the form-side {@link KycSelectDocumentType} (camelCase) to the
122
+ * parser-side {@link KycProvidedDocumentType} (snake_case). Returns `null` for
123
+ * `stateId`, which has no parser today.
124
+ */
125
+ export declare const toKycProvidedDocumentType: (selectType: KycSelectDocumentType) => KycProvidedDocumentType | null;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * Shared types for the KYC / KYB document autofill flow that lives inside the
4
+ * commonSetup feature (Setup pages + Onboarding both consume it via the same
5
+ * selector view; there is no separate state slice).
6
+ *
7
+ * Backed by document-communication-agent `POST /1.0/documents/process/sync`,
8
+ * which proxies document-service ExtendAI parsers and returns one of the
9
+ * parser payloads below — each value shaped as `{value, confidence}` per field.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.toKycProvidedDocumentType = exports.KYC_KYB_AUTOFILL_MIN_CONFIDENCE = void 0;
13
+ /** Confidence floor below which we drop an autofill candidate. */
14
+ exports.KYC_KYB_AUTOFILL_MIN_CONFIDENCE = 0.5;
15
+ /**
16
+ * Maps the form-side {@link KycSelectDocumentType} (camelCase) to the
17
+ * parser-side {@link KycProvidedDocumentType} (snake_case). Returns `null` for
18
+ * `stateId`, which has no parser today.
19
+ */
20
+ const toKycProvidedDocumentType = (selectType) => {
21
+ switch (selectType) {
22
+ case 'driverLicense':
23
+ return 'driving_license';
24
+ case 'passport':
25
+ return 'passport';
26
+ case 'ssnCard':
27
+ return 'social_security_card';
28
+ case 'stateId':
29
+ return null;
30
+ }
31
+ };
32
+ exports.toKycProvidedDocumentType = toKycProvidedDocumentType;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.0.84",
3
+ "version": "5.0.85-beta0ND",
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",