@zeniai/client-epic-state 5.0.83 → 5.0.84-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 (199) hide show
  1. package/lib/common/aiCfo/aiCfoSuggestedQuestionsPageContext.d.ts +1 -1
  2. package/lib/commonStateTypes/animations.d.ts +1 -1
  3. package/lib/commonStateTypes/animations.js +1 -0
  4. package/lib/entity/aiCfo/aiCfoPayload.d.ts +1 -140
  5. package/lib/entity/aiCfo/aiCfoReducer.d.ts +2 -23
  6. package/lib/entity/aiCfo/aiCfoReducer.js +4 -332
  7. package/lib/entity/aiCfo/aiCfoSelector.d.ts +1 -13
  8. package/lib/entity/aiCfo/aiCfoSelector.js +1 -28
  9. package/lib/entity/aiCfo/aiCfoState.d.ts +4 -225
  10. package/lib/entity/aiCfo/aiCfoState.js +1 -30
  11. package/lib/entity/company/companyPayload.d.ts +2 -0
  12. package/lib/entity/company/companyPayload.js +2 -0
  13. package/lib/entity/company/companyStateTypes.d.ts +2 -0
  14. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +1 -1
  15. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksState.d.ts +1 -1
  16. package/lib/entity/paymentAccount/paymentAccountSelector.d.ts +1 -0
  17. package/lib/entity/paymentAccount/paymentAccountSelector.js +4 -0
  18. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  19. package/lib/entity/snackbar/snackbarTypes.js +1 -3
  20. package/lib/entity/tenant/clearAllEpic.d.ts +2 -6
  21. package/lib/entity/tenant/clearAllEpic.js +0 -8
  22. package/lib/entity/tenant/epic/deleteConnectionEpic.d.ts +1 -1
  23. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.d.ts +21 -0
  24. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.js +54 -0
  25. package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.d.ts +1 -1
  26. package/lib/entity/tenant/epic/saveConnectorCredentialsEpic.d.ts +3 -3
  27. package/lib/entity/tenant/epic/saveOAuthConnectionEpic.d.ts +1 -1
  28. package/lib/entity/tenant/tenantPayload.d.ts +19 -0
  29. package/lib/entity/tenant/tenantReducer.d.ts +49 -28
  30. package/lib/entity/tenant/tenantReducer.js +111 -5
  31. package/lib/entity/tenant/tenantState.d.ts +21 -0
  32. package/lib/epic.d.ts +6 -11
  33. package/lib/epic.js +7 -11
  34. package/lib/esm/commonStateTypes/animations.js +1 -0
  35. package/lib/esm/entity/aiCfo/aiCfoReducer.js +4 -332
  36. package/lib/esm/entity/aiCfo/aiCfoSelector.js +1 -26
  37. package/lib/esm/entity/aiCfo/aiCfoState.js +0 -27
  38. package/lib/esm/entity/company/companyPayload.js +2 -0
  39. package/lib/esm/entity/paymentAccount/paymentAccountSelector.js +3 -0
  40. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -3
  41. package/lib/esm/entity/tenant/clearAllEpic.js +0 -8
  42. package/lib/esm/entity/tenant/epic/initEmailConnectOAuthEpic.js +50 -0
  43. package/lib/esm/entity/tenant/tenantReducer.js +108 -3
  44. package/lib/esm/epic.js +7 -11
  45. package/lib/esm/index.js +16 -28
  46. package/lib/esm/reducer.js +0 -12
  47. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +3 -6
  48. package/lib/esm/view/aiCfoView/epics/createSessionAndSubmitEpic.js +2 -5
  49. package/lib/esm/view/aiCfoView/epics/createSessionEpic.js +1 -2
  50. package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +2 -12
  51. package/lib/esm/view/companyView/companyViewReducer.js +45 -1
  52. package/lib/esm/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.js +25 -0
  53. package/lib/esm/view/companyView/epic/companyPassport/updateCapitalizationThresholdEpic.js +79 -0
  54. package/lib/esm/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  55. package/lib/esm/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +45 -0
  56. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +40 -0
  57. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewReducer.js +168 -50
  58. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewSelector.js +14 -0
  59. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewState.js +13 -0
  60. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +0 -25
  61. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +2 -2
  62. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +4 -16
  63. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +0 -38
  64. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +49 -0
  65. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +58 -0
  66. package/lib/esm/view/spendManagement/commonSetup/kycKybAutofillActions.js +12 -0
  67. package/lib/esm/view/spendManagement/commonSetup/kycKybParseMapper.js +205 -0
  68. package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +71 -52
  69. package/lib/esm/view/spendManagement/commonSetup/setupViewSelector.js +2 -0
  70. package/lib/esm/view/spendManagement/commonSetup/types/kycKybAutofill.js +28 -0
  71. package/lib/index.d.ts +19 -28
  72. package/lib/index.js +36 -136
  73. package/lib/reducer.d.ts +0 -12
  74. package/lib/reducer.js +0 -12
  75. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +2 -11
  76. package/lib/view/aiCfoView/aiCfoViewReducer.js +3 -6
  77. package/lib/view/aiCfoView/epics/createSessionAndSubmitEpic.js +2 -5
  78. package/lib/view/aiCfoView/epics/createSessionEpic.js +1 -2
  79. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +1 -8
  80. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +2 -12
  81. package/lib/view/companyView/companyViewReducer.d.ts +11 -1
  82. package/lib/view/companyView/companyViewReducer.js +47 -3
  83. package/lib/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.d.ts +9 -0
  84. package/lib/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.js +29 -0
  85. package/lib/view/companyView/epic/companyPassport/updateCapitalizationThresholdEpic.d.ts +10 -0
  86. package/lib/view/companyView/epic/companyPassport/updateCapitalizationThresholdEpic.js +83 -0
  87. package/lib/view/companyView/types/companyPassport/companyPassportViewState.d.ts +1 -0
  88. package/lib/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  89. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  90. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
  91. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.d.ts +7 -0
  92. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +49 -0
  93. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.d.ts +9 -0
  94. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +44 -0
  95. package/lib/view/onboardingView/customerView/onboardingCustomerViewPayload.d.ts +3 -0
  96. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.d.ts +41 -4
  97. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.js +170 -51
  98. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.d.ts +7 -1
  99. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.js +21 -1
  100. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.d.ts +37 -0
  101. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.js +14 -1
  102. package/lib/view/people/peopleTypes.d.ts +1 -1
  103. package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
  104. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  105. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.d.ts +0 -14
  106. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +1 -27
  107. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.d.ts +2 -2
  108. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +1 -1
  109. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.d.ts +1 -5
  110. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +5 -17
  111. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.d.ts +0 -27
  112. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +1 -43
  113. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardState.d.ts +0 -2
  114. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.d.ts +8 -0
  115. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +53 -0
  116. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.d.ts +8 -0
  117. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +62 -0
  118. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.d.ts +27 -0
  119. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.js +15 -0
  120. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.d.ts +24 -0
  121. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.js +213 -0
  122. package/lib/view/spendManagement/commonSetup/setupViewReducer.d.ts +24 -2
  123. package/lib/view/spendManagement/commonSetup/setupViewReducer.js +72 -53
  124. package/lib/view/spendManagement/commonSetup/setupViewSelector.d.ts +4 -0
  125. package/lib/view/spendManagement/commonSetup/setupViewSelector.js +2 -0
  126. package/lib/view/spendManagement/commonSetup/setupViewState.d.ts +12 -0
  127. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.d.ts +125 -0
  128. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.js +32 -0
  129. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +1 -1
  130. package/package.json +1 -1
  131. package/lib/entity/cardPolicy/cardPolicyPayload.d.ts +0 -277
  132. package/lib/entity/cardPolicy/cardPolicyPayload.js +0 -143
  133. package/lib/entity/cardPolicy/cardPolicyReducer.d.ts +0 -19
  134. package/lib/entity/cardPolicy/cardPolicyReducer.js +0 -265
  135. package/lib/entity/cardPolicy/cardPolicySelector.d.ts +0 -32
  136. package/lib/entity/cardPolicy/cardPolicySelector.js +0 -103
  137. package/lib/entity/cardPolicy/cardPolicyState.d.ts +0 -205
  138. package/lib/entity/cardPolicy/cardPolicyState.js +0 -14
  139. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.d.ts +0 -18
  140. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.js +0 -68
  141. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.d.ts +0 -26
  142. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +0 -47
  143. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.d.ts +0 -25
  144. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +0 -39
  145. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.d.ts +0 -23
  146. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.js +0 -111
  147. package/lib/esm/entity/cardPolicy/cardPolicyPayload.js +0 -130
  148. package/lib/esm/entity/cardPolicy/cardPolicyReducer.js +0 -261
  149. package/lib/esm/entity/cardPolicy/cardPolicySelector.js +0 -79
  150. package/lib/esm/entity/cardPolicy/cardPolicyState.js +0 -9
  151. package/lib/esm/entity/cardPolicy/extractPolicyDocumentEpic.js +0 -64
  152. package/lib/esm/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +0 -43
  153. package/lib/esm/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +0 -35
  154. package/lib/esm/entity/cardPolicy/policyRecommendationFromUploadEpic.js +0 -107
  155. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +0 -70
  156. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +0 -22
  157. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +0 -1
  158. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +0 -56
  159. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +0 -49
  160. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +0 -42
  161. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +0 -72
  162. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +0 -21
  163. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +0 -1
  164. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +0 -56
  165. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +0 -62
  166. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +0 -39
  167. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +0 -1
  168. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +0 -53
  169. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +0 -25
  170. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.d.ts +0 -14
  171. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +0 -74
  172. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.d.ts +0 -21
  173. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +0 -28
  174. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.d.ts +0 -25
  175. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +0 -2
  176. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.d.ts +0 -19
  177. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +0 -60
  178. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.d.ts +0 -18
  179. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +0 -53
  180. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.d.ts +0 -16
  181. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +0 -46
  182. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.d.ts +0 -15
  183. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +0 -76
  184. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.d.ts +0 -21
  185. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +0 -27
  186. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.d.ts +0 -19
  187. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +0 -2
  188. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.d.ts +0 -19
  189. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +0 -60
  190. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.d.ts +0 -13
  191. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +0 -66
  192. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.d.ts +0 -32
  193. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +0 -46
  194. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.d.ts +0 -45
  195. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +0 -2
  196. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.d.ts +0 -25
  197. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +0 -57
  198. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.d.ts +0 -15
  199. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +0 -29
@@ -0,0 +1,21 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { RootState } from '../../../reducer';
3
+ import { ZeniAPI } from '../../../zeniAPI';
4
+ import { initEmailConnectOAuth, initEmailConnectOAuthFailure, initEmailConnectOAuthSuccess } from '../tenantReducer';
5
+ export type ActionType = ReturnType<typeof initEmailConnectOAuth> | ReturnType<typeof initEmailConnectOAuthSuccess> | ReturnType<typeof initEmailConnectOAuthFailure>;
6
+ export type NavigateFn = (url: string) => void;
7
+ export declare const initEmailConnectOAuthEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI, navigate?: NavigateFn) => import("rxjs").Observable<{
8
+ payload: {
9
+ tenantId: string;
10
+ provider: "gmail" | "outlook";
11
+ authorizationUrl: string;
12
+ };
13
+ type: "tenant/initEmailConnectOAuthSuccess";
14
+ } | {
15
+ payload: {
16
+ tenantId: string;
17
+ provider: "gmail" | "outlook";
18
+ status: import("../../../responsePayload").ZeniAPIStatus<Record<string, unknown>>;
19
+ };
20
+ type: "tenant/initEmailConnectOAuthFailure";
21
+ }>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initEmailConnectOAuthEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const responsePayload_1 = require("../../../responsePayload");
7
+ const tenantReducer_1 = require("../tenantReducer");
8
+ const defaultNavigate = (url) => {
9
+ // Production path: full-page redirect. The user's session continues on the
10
+ // provider's consent screen and lands back on this app via auth's HTML
11
+ // callback page (which itself redirects to redirect_after_url with the
12
+ // result encoded as a query param).
13
+ if (typeof window !== 'undefined') {
14
+ window.location.href = url;
15
+ }
16
+ };
17
+ // Backs the new POST /1.0/connectors/email/<provider>/init endpoint on the
18
+ // auth service. The endpoint creates a CSRF state token in the auth NDB
19
+ // store and returns the provider's authorization_url; this epic then drives
20
+ // a full-page redirect so the user lands on Google's / Microsoft's consent
21
+ // screen. After consent the user lands on auth's callback, which writes the
22
+ // resulting tokens through to tenant and redirects the browser back to
23
+ // ``redirectAfterUrl`` with ``?email_connect_result=<json>`` for the
24
+ // integrations page to consume on mount.
25
+ const initEmailConnectOAuthEpic = (actions$, _state$, zeniAPI,
26
+ // Test seam: callers can override to assert intended URL without actually
27
+ // navigating. Default is full-page redirect via window.location.
28
+ navigate = defaultNavigate) => actions$.pipe((0, operators_1.filter)(tenantReducer_1.initEmailConnectOAuth.match), (0, operators_1.switchMap)((action) => zeniAPI
29
+ .postAndGetJSON(`${zeniAPI.apiEndPoints.authMicroServiceBaseUrl}/1.0/connectors/email/${action.payload.provider}/init`, { redirect_after_url: action.payload.redirectAfterUrl }, { 'zeni-tenant-id': action.payload.tenantId })
30
+ .pipe((0, operators_1.mergeMap)((response) => {
31
+ if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
32
+ // Fire-and-forget side effect — once the browser navigates,
33
+ // any further state we'd dispatch here is irrelevant. We still
34
+ // emit the success action so subscribers (tests, analytics)
35
+ // can observe the URL the epic decided to navigate to.
36
+ navigate(response.data.authorization_url);
37
+ return (0, rxjs_1.from)([
38
+ (0, tenantReducer_1.initEmailConnectOAuthSuccess)(action.payload.tenantId, action.payload.provider, response.data.authorization_url),
39
+ ]);
40
+ }
41
+ const status = response.status ??
42
+ (0, responsePayload_1.createZeniAPIStatus)(`Failed to start ${action.payload.provider} connection. Please try again.`);
43
+ return (0, rxjs_1.from)([
44
+ (0, tenantReducer_1.initEmailConnectOAuthFailure)(action.payload.tenantId, action.payload.provider, status),
45
+ ]);
46
+ }), (0, operators_1.catchError)((error) => {
47
+ const message = error instanceof Error
48
+ ? error.message
49
+ : `Unexpected error starting ${action.payload.provider} connection.`;
50
+ return (0, rxjs_1.from)([
51
+ (0, tenantReducer_1.initEmailConnectOAuthFailure)(action.payload.tenantId, action.payload.provider, (0, responsePayload_1.createZeniAPIStatus)(message)),
52
+ ]);
53
+ }))));
54
+ exports.initEmailConnectOAuthEpic = initEmailConnectOAuthEpic;
@@ -6,7 +6,7 @@ export type ActionType = ReturnType<typeof saveAPIKeyConnection> | ReturnType<ty
6
6
  export declare const saveAPIKeyConnectionEpic: (actions$: ActionsObservable<ActionType>, _: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
7
7
  payload: {
8
8
  tenantId: string;
9
- connectionType: "revenue" | "payments";
9
+ connectionType: "revenue" | "email" | "payments";
10
10
  connectionPayload: import("../tenantPayload").ConnectionDataPayload;
11
11
  };
12
12
  type: "tenant/saveAPIKeyConnectionSuccess";
@@ -6,15 +6,15 @@ export type ActionType = ReturnType<typeof saveConnectorCredentials> | ReturnTyp
6
6
  export declare const saveConnectorCredentialsEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
7
7
  payload: {
8
8
  tenantId: string;
9
- connectionType: "revenue" | "payments";
10
- connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal";
9
+ connectionType: "revenue" | "email" | "payments";
10
+ connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook";
11
11
  connectionPayload: import("../tenantPayload").ConnectionDataPayload;
12
12
  };
13
13
  type: "tenant/saveConnectorCredentialsSuccess";
14
14
  } | {
15
15
  payload: {
16
16
  tenantId: string;
17
- connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal";
17
+ connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook";
18
18
  status: import("../../../responsePayload").ZeniAPIStatus<Record<string, unknown>>;
19
19
  };
20
20
  type: "tenant/saveConnectorCredentialsFailure";
@@ -6,7 +6,7 @@ export type ActionType = ReturnType<typeof saveOAuthConnection> | ReturnType<typ
6
6
  export declare const saveOAuthConnectionEpic: (actions$: ActionsObservable<ActionType>, _: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
7
7
  payload: {
8
8
  tenantId: string;
9
- connectionType: "revenue" | "payments";
9
+ connectionType: "revenue" | "email" | "payments";
10
10
  connectionPayload: import("../tenantPayload").ConnectionDataPayload;
11
11
  };
12
12
  type: "tenant/saveOAuthConnectionSuccess";
@@ -5,6 +5,7 @@ import { ZeniAPIResponse } from '../../responsePayload';
5
5
  import { CompanyPayload, UserReimbursementInfoDataPayload } from '../company/companyPayload';
6
6
  import { SubscriptionSummaryPayload } from '../subscription/subscriptionSummary/subscriptionSummaryPayload';
7
7
  import { MasterTOSInfoPayload } from '../userRole/userRolePayload';
8
+ import { CapitalizableClassificationType, CapitalizableMatchPattern, CapitalizableThresholdSource } from './tenantState';
8
9
  type TenantsResponse = ZeniAPIResponse<TenantsData>;
9
10
  export interface TenantsData {
10
11
  tenants: TenantPayload[];
@@ -86,11 +87,28 @@ interface TenantPayload {
86
87
  user_id: ID;
87
88
  user_last_check_in_time_into_tenant: string;
88
89
  user_role_id: ID;
90
+ capitalizable_accounts?: CapitalizableAccountsPayload | null;
91
+ capitalization_onboarding_shown_for_fixed_asset?: boolean;
92
+ capitalization_onboarding_shown_for_prepaid?: boolean;
93
+ capitalization_threshold?: number | null;
94
+ capitalization_threshold_max_ceiling?: number | null;
89
95
  master_tos_info?: MasterTOSInfoPayload;
90
96
  reimbursement_info?: UserReimbursementInfoDataPayload;
91
97
  zeni_book_close_date?: string;
92
98
  zeni_book_close_month_and_year?: string;
93
99
  }
100
+ export interface CapitalizableAccountPayload {
101
+ account_id: string;
102
+ classification_type: CapitalizableClassificationType;
103
+ match_pattern: CapitalizableMatchPattern;
104
+ sample_count: number;
105
+ threshold_source: CapitalizableThresholdSource | null;
106
+ threshold_value: number | null;
107
+ }
108
+ export interface CapitalizableAccountsPayload {
109
+ accounts: CapitalizableAccountPayload[];
110
+ computed_at: string;
111
+ }
94
112
  interface LoggedInUserPayload {
95
113
  first_name: string | null;
96
114
  last_name: string | null;
@@ -140,6 +158,7 @@ interface ConnectionsPayload {
140
158
  connections: {
141
159
  accounting: ConnectionDataPayload[];
142
160
  payments: ConnectionDataPayload[];
161
+ email?: ConnectionDataPayload[];
143
162
  revenue?: ConnectionDataPayload[];
144
163
  };
145
164
  }
@@ -3,8 +3,8 @@ import { ZeniAPIStatus } from '../../responsePayload';
3
3
  import ZeniUrl from '../../zeniUrl';
4
4
  import { SubscriptionSummaryPayload } from '../subscription/subscriptionSummary/subscriptionSummaryPayload';
5
5
  import { UserRolePayload } from '../userRole/userRolePayload';
6
- import { ConnectionDataPayload, ConnectionWithMetaPayload, ConnectionsPayload, LoggedInUserPayload, RoleResourcePayload, TenantPayload, TenantUserPayload, TenantsData } from './tenantPayload';
7
- import { Connection, RoleResource, TenantState } from './tenantState';
6
+ import { CapitalizableAccountsPayload, ConnectionDataPayload, ConnectionWithMetaPayload, ConnectionsPayload, LoggedInUserPayload, RoleResourcePayload, TenantPayload, TenantUserPayload, TenantsData } from './tenantPayload';
7
+ import { CapitalizableAccounts, Connection, RoleResource, TenantState } from './tenantState';
8
8
  export type AuthProvider = 'google' | 'microsoft' | 'email';
9
9
  export interface DoSignInPayload {
10
10
  appType: 'web' | 'mobile';
@@ -13,9 +13,9 @@ export interface DoSignInPayload {
13
13
  redirectUri: ZeniUrl;
14
14
  sourceUri: ZeniUrl;
15
15
  }
16
- export declare const toExternalIntegrationType: (v: string) => "revenue" | "payments";
16
+ export declare const toExternalIntegrationType: (v: string) => "revenue" | "email" | "payments";
17
17
  export type ExternalIntegrationType = ReturnType<typeof toExternalIntegrationType>;
18
- export declare const toExternalSupportedTool: (v: string) => "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal";
18
+ export declare const toExternalSupportedTool: (v: string) => "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook";
19
19
  export type ExternalSupportedTool = ReturnType<typeof toExternalSupportedTool>;
20
20
  export type ConnectorCredentialsBySlug = {
21
21
  connectionName: 'stripe';
@@ -101,26 +101,26 @@ export declare const updateTenants: import("@reduxjs/toolkit").ActionCreatorWith
101
101
  }, "tenant/fetchExternalConnectionsFailure", never, never>, fetchExternalConnectionsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, externalConnections: ConnectionsPayload], {
102
102
  tenantId: string;
103
103
  externalConnections: ConnectionsPayload;
104
- }, "tenant/fetchExternalConnectionsSuccess", never, never>, saveAPIKeyConnection: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "payments", connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal", credentials: {
104
+ }, "tenant/fetchExternalConnectionsSuccess", never, never>, saveAPIKeyConnection: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "email" | "payments", connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook", credentials: {
105
105
  api_key: string;
106
106
  site: string;
107
107
  }], {
108
108
  tenantId: string;
109
109
  connectionId: string;
110
- connectionType: "revenue" | "payments";
111
- connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal";
110
+ connectionType: "revenue" | "email" | "payments";
111
+ connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook";
112
112
  credentials: {
113
113
  api_key: string;
114
114
  site: string;
115
115
  };
116
- }, "tenant/saveAPIKeyConnection", never, never>, saveAPIKeyConnectionSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "payments", connectionPayload: ConnectionDataPayload], {
116
+ }, "tenant/saveAPIKeyConnection", never, never>, saveAPIKeyConnectionSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "email" | "payments", connectionPayload: ConnectionDataPayload], {
117
117
  tenantId: string;
118
- connectionType: "revenue" | "payments";
118
+ connectionType: "revenue" | "email" | "payments";
119
119
  connectionPayload: ConnectionDataPayload;
120
120
  }, "tenant/saveAPIKeyConnectionSuccess", never, never>, saveAPIKeyConnectionFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, status: ZeniAPIStatus<Record<string, unknown>>], {
121
121
  tenantId: string;
122
122
  status: ZeniAPIStatus<Record<string, unknown>>;
123
- }, "tenant/saveAPIKeyConnectionFailure", never, never>, saveOAuthConnection: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "payments", connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal", credentials: {
123
+ }, "tenant/saveAPIKeyConnectionFailure", never, never>, saveOAuthConnection: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "email" | "payments", connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook", credentials: {
124
124
  authorization_code: string;
125
125
  client_id: string;
126
126
  client_secret: string;
@@ -128,35 +128,35 @@ export declare const updateTenants: import("@reduxjs/toolkit").ActionCreatorWith
128
128
  }], {
129
129
  tenantId: string;
130
130
  connectionId: string;
131
- connectionType: "revenue" | "payments";
132
- connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal";
131
+ connectionType: "revenue" | "email" | "payments";
132
+ connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook";
133
133
  credentials: {
134
134
  authorization_code: string;
135
135
  client_id: string;
136
136
  client_secret: string;
137
137
  redirect_uri: string;
138
138
  };
139
- }, "tenant/saveOAuthConnection", never, never>, saveOAuthConnectionSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "payments", connectionPayload: ConnectionDataPayload], {
139
+ }, "tenant/saveOAuthConnection", never, never>, saveOAuthConnectionSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "email" | "payments", connectionPayload: ConnectionDataPayload], {
140
140
  tenantId: string;
141
- connectionType: "revenue" | "payments";
141
+ connectionType: "revenue" | "email" | "payments";
142
142
  connectionPayload: ConnectionDataPayload;
143
143
  }, "tenant/saveOAuthConnectionSuccess", never, never>, saveOAuthConnectionFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, status: ZeniAPIStatus<Record<string, unknown>>], {
144
144
  tenantId: string;
145
145
  status: ZeniAPIStatus<Record<string, unknown>>;
146
- }, "tenant/saveOAuthConnectionFailure", never, never>, saveConnectorCredentials: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "payments", args: ConnectorCredentialsBySlug], {
146
+ }, "tenant/saveOAuthConnectionFailure", never, never>, saveConnectorCredentials: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "email" | "payments", args: ConnectorCredentialsBySlug], {
147
147
  connectionName: "stripe";
148
148
  credentials: {
149
149
  api_key: string;
150
150
  };
151
151
  tenantId: string;
152
- connectionType: "revenue" | "payments";
152
+ connectionType: "revenue" | "email" | "payments";
153
153
  } | {
154
154
  connectionName: "mercury";
155
155
  credentials: {
156
156
  api_key: string;
157
157
  };
158
158
  tenantId: string;
159
- connectionType: "revenue" | "payments";
159
+ connectionType: "revenue" | "email" | "payments";
160
160
  } | {
161
161
  connectionName: "paypal";
162
162
  credentials: {
@@ -164,24 +164,36 @@ export declare const updateTenants: import("@reduxjs/toolkit").ActionCreatorWith
164
164
  client_secret: string;
165
165
  };
166
166
  tenantId: string;
167
- connectionType: "revenue" | "payments";
168
- }, "tenant/saveConnectorCredentials", never, never>, saveConnectorCredentialsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "payments", connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal", connectionPayload: ConnectionDataPayload], {
167
+ connectionType: "revenue" | "email" | "payments";
168
+ }, "tenant/saveConnectorCredentials", never, never>, saveConnectorCredentialsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionType: "revenue" | "email" | "payments", connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook", connectionPayload: ConnectionDataPayload], {
169
169
  tenantId: string;
170
- connectionType: "revenue" | "payments";
171
- connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal";
170
+ connectionType: "revenue" | "email" | "payments";
171
+ connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook";
172
172
  connectionPayload: ConnectionDataPayload;
173
- }, "tenant/saveConnectorCredentialsSuccess", never, never>, saveConnectorCredentialsFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal", status: ZeniAPIStatus<Record<string, unknown>>], {
173
+ }, "tenant/saveConnectorCredentialsSuccess", never, never>, saveConnectorCredentialsFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook", status: ZeniAPIStatus<Record<string, unknown>>], {
174
174
  tenantId: string;
175
- connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal";
175
+ connectionName: "chargebee" | "hubspot" | "stripe" | "mercury" | "paypal" | "gmail" | "outlook";
176
176
  status: ZeniAPIStatus<Record<string, unknown>>;
177
- }, "tenant/saveConnectorCredentialsFailure", never, never>, deleteConnection: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "payments"], {
177
+ }, "tenant/saveConnectorCredentialsFailure", never, never>, initEmailConnectOAuth: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, provider: "gmail" | "outlook", redirectAfterUrl: string], {
178
+ tenantId: string;
179
+ provider: "gmail" | "outlook";
180
+ redirectAfterUrl: string;
181
+ }, "tenant/initEmailConnectOAuth", never, never>, initEmailConnectOAuthSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, provider: "gmail" | "outlook", authorizationUrl: string], {
182
+ tenantId: string;
183
+ provider: "gmail" | "outlook";
184
+ authorizationUrl: string;
185
+ }, "tenant/initEmailConnectOAuthSuccess", never, never>, initEmailConnectOAuthFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, provider: "gmail" | "outlook", status: ZeniAPIStatus<Record<string, unknown>>], {
186
+ tenantId: string;
187
+ provider: "gmail" | "outlook";
188
+ status: ZeniAPIStatus<Record<string, unknown>>;
189
+ }, "tenant/initEmailConnectOAuthFailure", never, never>, deleteConnection: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "email" | "payments"], {
178
190
  tenantId: string;
179
191
  connectionId: string;
180
- connectionType: "revenue" | "payments";
181
- }, "tenant/deleteConnection", never, never>, deleteConnectionSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "payments"], {
192
+ connectionType: "revenue" | "email" | "payments";
193
+ }, "tenant/deleteConnection", never, never>, deleteConnectionSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, connectionId: string, connectionType: "revenue" | "email" | "payments"], {
182
194
  tenantId: string;
183
195
  connectionId: string;
184
- connectionType: "revenue" | "payments";
196
+ connectionType: "revenue" | "email" | "payments";
185
197
  }, "tenant/deleteConnectionSuccess", never, never>, deleteConnectionFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenantId: string, status: ZeniAPIStatus<Record<string, unknown>>], {
186
198
  tenantId: string;
187
199
  status: ZeniAPIStatus<Record<string, unknown>>;
@@ -205,7 +217,14 @@ export declare const updateTenants: import("@reduxjs/toolkit").ActionCreatorWith
205
217
  }, "tenant/trigger2FA", never, never>, updateTenantAccountingClassesEnabled: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
206
218
  enabled: boolean;
207
219
  tenantId: ID;
208
- }, "tenant/updateTenantAccountingClassesEnabled">, updateTenantMasterTOSInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<UserRolePayload, "tenant/updateTenantMasterTOSInfo">, verifyDeviceWithTwoFA: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[otp: any, deviceId: any, userEmail: any, otpChallenge: any], {
220
+ }, "tenant/updateTenantAccountingClassesEnabled">, updateTenantCapitalizationOnboardingDismissed: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
221
+ popupType: "prepaid" | "fixed_asset";
222
+ tenantId: ID;
223
+ }, "tenant/updateTenantCapitalizationOnboardingDismissed">, updateTenantCapitalizationThreshold: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
224
+ capitalizationThreshold: number | null;
225
+ capitalizationThresholdMaxCeiling: number | null;
226
+ tenantId: ID;
227
+ }, "tenant/updateTenantCapitalizationThreshold">, updateTenantMasterTOSInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<UserRolePayload, "tenant/updateTenantMasterTOSInfo">, verifyDeviceWithTwoFA: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[otp: any, deviceId: any, userEmail: any, otpChallenge: any], {
209
228
  otp: any;
210
229
  deviceId: any;
211
230
  userEmail: any;
@@ -224,6 +243,7 @@ export declare const updateTenants: import("@reduxjs/toolkit").ActionCreatorWith
224
243
  }, "tenant/resendVerifyDeviceOTPSuccess", never, never>, resendVerifyDeviceOTPFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "tenant/resendVerifyDeviceOTPFailure">;
225
244
  declare const _default: import("redux").Reducer<TenantState>;
226
245
  export default _default;
246
+ export declare function mapCapitalizableAccountsPayload(payload: CapitalizableAccountsPayload): CapitalizableAccounts;
227
247
  export declare const toRoleResource: (payload: RoleResourcePayload) => RoleResource;
228
248
  /**
229
249
  * Converts Connections payload to Connection State
@@ -232,6 +252,7 @@ export declare const toRoleResource: (payload: RoleResourcePayload) => RoleResou
232
252
  */
233
253
  export declare function mapConnectionsPayloadToState(connectionsPayload: ConnectionsPayload): {
234
254
  accounting: Connection[];
255
+ email: Connection[];
235
256
  payments: Connection[];
236
257
  revenue: Connection[];
237
258
  };
@@ -4,8 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  var _a;
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.updateSubscriptionSummaryForTenantFailure = exports.updateSubscriptionSummaryForTenantSuccess = exports.fetchSubscriptionSummaryForTenant = exports.clearAll = exports.deleteConnectionFailure = exports.deleteConnectionSuccess = exports.deleteConnection = exports.saveConnectorCredentialsFailure = exports.saveConnectorCredentialsSuccess = exports.saveConnectorCredentials = exports.saveOAuthConnectionFailure = exports.saveOAuthConnectionSuccess = exports.saveOAuthConnection = exports.saveAPIKeyConnectionFailure = exports.saveAPIKeyConnectionSuccess = exports.saveAPIKeyConnection = exports.fetchExternalConnectionsSuccess = exports.fetchExternalConnectionsFailure = exports.saveExternalConnectionFailure = exports.saveExternalConnectionSuccess = exports.saveExternalConnection = exports.fetchExternalConnections = exports.updateLoggedInUser = exports.sessionHeartbeatFailure = exports.sessionHeartbeatSuccess = exports.sendSessionHeartbeat = exports.signOutSuccess = exports.doSignOut = exports.updateSignInState = exports.sendEmailMagicLinkToUserFailure = exports.sendEmailMagicLinkToUserSuccess = exports.sendEmailMagicLinkToUser = exports.magicLinkSignInFailure = exports.magicLinkSignInSuccess = exports.doMagicLinkSignIn = exports.doSignIn = exports.updateExcludedResourcesFailure = exports.updateExcludedResourcesSuccess = exports.fetchExcludedResources = exports.updateCurrentTenant = exports.updateTenantFailure = exports.updateTenantSuccess = exports.fetchActiveTenant = exports.updateTenantsFailure = exports.updateTenantsSuccess = exports.fetchAllTenants = exports.updateTenants = exports.initialState = exports.toExternalSupportedTool = exports.toExternalIntegrationType = void 0;
8
- exports.toConnection = exports.toRoleResource = exports.resendVerifyDeviceOTPFailure = exports.resendVerifyDeviceOTPSuccess = exports.resendVerifyDeviceOTP = exports.verifyDeviceWithTwoFAFailure = exports.verifyDeviceWithTwoFASuccess = exports.verifyDeviceWithTwoFA = exports.updateTenantMasterTOSInfo = exports.updateTenantAccountingClassesEnabled = exports.trigger2FA = exports.resetSignInState = exports.updateTreasuryVideoViewedForLoggedInUser = exports.updateReferViewedForLoggedInUser = exports.updateTenantReimbursementInfo = exports.removeOnboardingTenant = exports.updateOnboardingTenants = void 0;
7
+ exports.clearAll = exports.deleteConnectionFailure = exports.deleteConnectionSuccess = exports.deleteConnection = exports.initEmailConnectOAuthFailure = exports.initEmailConnectOAuthSuccess = exports.initEmailConnectOAuth = exports.saveConnectorCredentialsFailure = exports.saveConnectorCredentialsSuccess = exports.saveConnectorCredentials = exports.saveOAuthConnectionFailure = exports.saveOAuthConnectionSuccess = exports.saveOAuthConnection = exports.saveAPIKeyConnectionFailure = exports.saveAPIKeyConnectionSuccess = exports.saveAPIKeyConnection = exports.fetchExternalConnectionsSuccess = exports.fetchExternalConnectionsFailure = exports.saveExternalConnectionFailure = exports.saveExternalConnectionSuccess = exports.saveExternalConnection = exports.fetchExternalConnections = exports.updateLoggedInUser = exports.sessionHeartbeatFailure = exports.sessionHeartbeatSuccess = exports.sendSessionHeartbeat = exports.signOutSuccess = exports.doSignOut = exports.updateSignInState = exports.sendEmailMagicLinkToUserFailure = exports.sendEmailMagicLinkToUserSuccess = exports.sendEmailMagicLinkToUser = exports.magicLinkSignInFailure = exports.magicLinkSignInSuccess = exports.doMagicLinkSignIn = exports.doSignIn = exports.updateExcludedResourcesFailure = exports.updateExcludedResourcesSuccess = exports.fetchExcludedResources = exports.updateCurrentTenant = exports.updateTenantFailure = exports.updateTenantSuccess = exports.fetchActiveTenant = exports.updateTenantsFailure = exports.updateTenantsSuccess = exports.fetchAllTenants = exports.updateTenants = exports.initialState = exports.toExternalSupportedTool = exports.toExternalIntegrationType = void 0;
8
+ exports.toConnection = exports.toRoleResource = exports.resendVerifyDeviceOTPFailure = exports.resendVerifyDeviceOTPSuccess = exports.resendVerifyDeviceOTP = exports.verifyDeviceWithTwoFAFailure = exports.verifyDeviceWithTwoFASuccess = exports.verifyDeviceWithTwoFA = exports.updateTenantMasterTOSInfo = exports.updateTenantCapitalizationThreshold = exports.updateTenantCapitalizationOnboardingDismissed = exports.updateTenantAccountingClassesEnabled = exports.trigger2FA = exports.resetSignInState = exports.updateTreasuryVideoViewedForLoggedInUser = exports.updateReferViewedForLoggedInUser = exports.updateTenantReimbursementInfo = exports.removeOnboardingTenant = exports.updateOnboardingTenants = exports.updateSubscriptionSummaryForTenantFailure = exports.updateSubscriptionSummaryForTenantSuccess = exports.fetchSubscriptionSummaryForTenant = void 0;
9
+ exports.mapCapitalizableAccountsPayload = mapCapitalizableAccountsPayload;
9
10
  exports.mapConnectionsPayloadToState = mapConnectionsPayloadToState;
10
11
  const toolkit_1 = require("@reduxjs/toolkit");
11
12
  const js_base64_1 = require("js-base64");
@@ -18,7 +19,7 @@ const netBurnOrIncomeStoryCardState_1 = require("../../view/netBurnOrIncomeStory
18
19
  const zeniDayJS_1 = require("../../zeniDayJS");
19
20
  const subscriptionSummaryReducer_1 = require("../subscription/subscriptionSummary/subscriptionSummaryReducer");
20
21
  const userRolePayload_1 = require("../userRole/userRolePayload");
21
- const EXTERNAL_INTEGRATION_TYPES = ['revenue', 'payments'];
22
+ const EXTERNAL_INTEGRATION_TYPES = ['revenue', 'payments', 'email'];
22
23
  const toExternalIntegrationType = (v) => (0, stringToUnion_1.stringToUnion)(v, EXTERNAL_INTEGRATION_TYPES);
23
24
  exports.toExternalIntegrationType = toExternalIntegrationType;
24
25
  const EXTERNAL_SUPPORTED_TOOLS = [
@@ -27,6 +28,8 @@ const EXTERNAL_SUPPORTED_TOOLS = [
27
28
  'stripe',
28
29
  'mercury',
29
30
  'paypal',
31
+ 'gmail',
32
+ 'outlook',
30
33
  ];
31
34
  const toExternalSupportedTool = (v) => (0, stringToUnion_1.stringToUnion)(v, EXTERNAL_SUPPORTED_TOOLS);
32
35
  exports.toExternalSupportedTool = toExternalSupportedTool;
@@ -153,6 +156,25 @@ const tenant = (0, toolkit_1.createSlice)({
153
156
  draft.tenantsById[tenantId].isAccountingClassesEnabled = enabled;
154
157
  }
155
158
  },
159
+ updateTenantCapitalizationThreshold(draft, action) {
160
+ const { tenantId, capitalizationThreshold, capitalizationThresholdMaxCeiling } = action.payload;
161
+ if (draft.tenantsById[tenantId] != null) {
162
+ draft.tenantsById[tenantId].capitalizationThreshold = capitalizationThreshold;
163
+ draft.tenantsById[tenantId].capitalizationThresholdMaxCeiling =
164
+ capitalizationThresholdMaxCeiling;
165
+ }
166
+ },
167
+ updateTenantCapitalizationOnboardingDismissed(draft, action) {
168
+ const { tenantId, popupType } = action.payload;
169
+ if (draft.tenantsById[tenantId] != null) {
170
+ if (popupType === 'prepaid') {
171
+ draft.tenantsById[tenantId].capitalizationOnboardingShownForPrepaid = true;
172
+ }
173
+ else {
174
+ draft.tenantsById[tenantId].capitalizationOnboardingShownForFixedAsset = true;
175
+ }
176
+ }
177
+ },
156
178
  updateTenantMasterTOSInfo(draft, action) {
157
179
  const { tenant_id, user_role_id, master_tos_info } = action.payload;
158
180
  if (draft.tenantsById[tenant_id] != null &&
@@ -353,6 +375,7 @@ const tenant = (0, toolkit_1.createSlice)({
353
375
  draft.externalConnectionsByTenant[action.payload.tenantId] = {
354
376
  fetchState: 'In-Progress',
355
377
  accounting: [],
378
+ email: [],
356
379
  payments: [],
357
380
  revenue: [],
358
381
  saveConnectionState: 'Not-Started',
@@ -370,10 +393,11 @@ const tenant = (0, toolkit_1.createSlice)({
370
393
  return { payload: { tenantId, externalConnections } };
371
394
  },
372
395
  reducer(draft, action) {
373
- const { accounting, payments, revenue } = mapConnectionsPayloadToState(action.payload.externalConnections);
396
+ const { accounting, email, payments, revenue } = mapConnectionsPayloadToState(action.payload.externalConnections);
374
397
  draft.externalConnectionsByTenant[action.payload.tenantId] = {
375
398
  fetchState: 'Completed',
376
399
  accounting,
400
+ email,
377
401
  payments,
378
402
  revenue,
379
403
  saveConnectionState: 'Completed',
@@ -395,6 +419,7 @@ const tenant = (0, toolkit_1.createSlice)({
395
419
  draft.externalConnectionsByTenant[tenantId] = {
396
420
  fetchState: 'Error',
397
421
  accounting: [],
422
+ email: [],
398
423
  payments: [],
399
424
  revenue: [],
400
425
  saveConnectionState: 'Error',
@@ -608,6 +633,56 @@ const tenant = (0, toolkit_1.createSlice)({
608
633
  }
609
634
  },
610
635
  },
636
+ // Email-connect (Gmail / Outlook) OAuth init. Distinct from the other
637
+ // connector saves because the FE never sees the access_token — the
638
+ // user-facing redirect lands on the auth service's callback, auth
639
+ // exchanges code → tokens and posts them to tenant, then redirects the
640
+ // browser back to ``redirectAfterUrl`` with ``?email_connect_result=...``.
641
+ // The success action carries the provider's authorization_url so the
642
+ // epic can drive a full-page redirect, mirroring the legacy HubSpot
643
+ // flow in zeni-web-app-ui/IntegrationsScreen.
644
+ initEmailConnectOAuth: {
645
+ prepare(tenantId, provider, redirectAfterUrl) {
646
+ return { payload: { tenantId, provider, redirectAfterUrl } };
647
+ },
648
+ reducer(draft, action) {
649
+ const existing = draft.externalConnectionsByTenant[action.payload.tenantId];
650
+ if (existing != null) {
651
+ // Reuse the per-slug saveConnectorCredentialsStateBySlug bucket so
652
+ // the IntegrationsSettingsPage shows the same loading affordance
653
+ // it already uses for Stripe/Mercury/PayPal connect flows.
654
+ existing.saveConnectorCredentialsStateBySlug[action.payload.provider] = 'In-Progress';
655
+ delete existing.saveConnectorCredentialsErrorBySlug[action.payload.provider];
656
+ }
657
+ },
658
+ },
659
+ initEmailConnectOAuthSuccess: {
660
+ prepare(tenantId, provider, authorizationUrl) {
661
+ return { payload: { tenantId, provider, authorizationUrl } };
662
+ },
663
+ reducer(draft, action) {
664
+ // Intentionally leave state as 'In-Progress' — the epic is about to
665
+ // do a full-page redirect, so any UI state we set here would be
666
+ // overwritten by the navigation anyway. Setting Completed would
667
+ // briefly flash a success state before the redirect, which reads
668
+ // wrong because the connection isn't actually saved yet at this
669
+ // point (it lands after the OAuth round-trip).
670
+ void draft;
671
+ void action;
672
+ },
673
+ },
674
+ initEmailConnectOAuthFailure: {
675
+ prepare(tenantId, provider, status) {
676
+ return { payload: { tenantId, provider, status } };
677
+ },
678
+ reducer(draft, action) {
679
+ const existing = draft.externalConnectionsByTenant[action.payload.tenantId];
680
+ if (existing != null) {
681
+ existing.saveConnectorCredentialsStateBySlug[action.payload.provider] = 'Error';
682
+ existing.saveConnectorCredentialsErrorBySlug[action.payload.provider] = action.payload.status;
683
+ }
684
+ },
685
+ },
611
686
  deleteConnection: {
612
687
  prepare(tenantId, connectionId, connectionType) {
613
688
  return { payload: { tenantId, connectionId, connectionType } };
@@ -796,7 +871,7 @@ const tenant = (0, toolkit_1.createSlice)({
796
871
  },
797
872
  },
798
873
  });
799
- _a = tenant.actions, exports.updateTenants = _a.updateTenants, exports.fetchAllTenants = _a.fetchAllTenants, exports.updateTenantsSuccess = _a.updateTenantsSuccess, exports.updateTenantsFailure = _a.updateTenantsFailure, exports.fetchActiveTenant = _a.fetchActiveTenant, exports.updateTenantSuccess = _a.updateTenantSuccess, exports.updateTenantFailure = _a.updateTenantFailure, exports.updateCurrentTenant = _a.updateCurrentTenant, exports.fetchExcludedResources = _a.fetchExcludedResources, exports.updateExcludedResourcesSuccess = _a.updateExcludedResourcesSuccess, exports.updateExcludedResourcesFailure = _a.updateExcludedResourcesFailure, exports.doSignIn = _a.doSignIn, exports.doMagicLinkSignIn = _a.doMagicLinkSignIn, exports.magicLinkSignInSuccess = _a.magicLinkSignInSuccess, exports.magicLinkSignInFailure = _a.magicLinkSignInFailure, exports.sendEmailMagicLinkToUser = _a.sendEmailMagicLinkToUser, exports.sendEmailMagicLinkToUserSuccess = _a.sendEmailMagicLinkToUserSuccess, exports.sendEmailMagicLinkToUserFailure = _a.sendEmailMagicLinkToUserFailure, exports.updateSignInState = _a.updateSignInState, exports.doSignOut = _a.doSignOut, exports.signOutSuccess = _a.signOutSuccess, exports.sendSessionHeartbeat = _a.sendSessionHeartbeat, exports.sessionHeartbeatSuccess = _a.sessionHeartbeatSuccess, exports.sessionHeartbeatFailure = _a.sessionHeartbeatFailure, exports.updateLoggedInUser = _a.updateLoggedInUser, exports.fetchExternalConnections = _a.fetchExternalConnections, exports.saveExternalConnection = _a.saveExternalConnection, exports.saveExternalConnectionSuccess = _a.saveExternalConnectionSuccess, exports.saveExternalConnectionFailure = _a.saveExternalConnectionFailure, exports.fetchExternalConnectionsFailure = _a.fetchExternalConnectionsFailure, exports.fetchExternalConnectionsSuccess = _a.fetchExternalConnectionsSuccess, exports.saveAPIKeyConnection = _a.saveAPIKeyConnection, exports.saveAPIKeyConnectionSuccess = _a.saveAPIKeyConnectionSuccess, exports.saveAPIKeyConnectionFailure = _a.saveAPIKeyConnectionFailure, exports.saveOAuthConnection = _a.saveOAuthConnection, exports.saveOAuthConnectionSuccess = _a.saveOAuthConnectionSuccess, exports.saveOAuthConnectionFailure = _a.saveOAuthConnectionFailure, exports.saveConnectorCredentials = _a.saveConnectorCredentials, exports.saveConnectorCredentialsSuccess = _a.saveConnectorCredentialsSuccess, exports.saveConnectorCredentialsFailure = _a.saveConnectorCredentialsFailure, exports.deleteConnection = _a.deleteConnection, exports.deleteConnectionSuccess = _a.deleteConnectionSuccess, exports.deleteConnectionFailure = _a.deleteConnectionFailure, exports.clearAll = _a.clearAll, exports.fetchSubscriptionSummaryForTenant = _a.fetchSubscriptionSummaryForTenant, exports.updateSubscriptionSummaryForTenantSuccess = _a.updateSubscriptionSummaryForTenantSuccess, exports.updateSubscriptionSummaryForTenantFailure = _a.updateSubscriptionSummaryForTenantFailure, exports.updateOnboardingTenants = _a.updateOnboardingTenants, exports.removeOnboardingTenant = _a.removeOnboardingTenant, exports.updateTenantReimbursementInfo = _a.updateTenantReimbursementInfo, exports.updateReferViewedForLoggedInUser = _a.updateReferViewedForLoggedInUser, exports.updateTreasuryVideoViewedForLoggedInUser = _a.updateTreasuryVideoViewedForLoggedInUser, exports.resetSignInState = _a.resetSignInState, exports.trigger2FA = _a.trigger2FA, exports.updateTenantAccountingClassesEnabled = _a.updateTenantAccountingClassesEnabled, exports.updateTenantMasterTOSInfo = _a.updateTenantMasterTOSInfo, exports.verifyDeviceWithTwoFA = _a.verifyDeviceWithTwoFA, exports.verifyDeviceWithTwoFASuccess = _a.verifyDeviceWithTwoFASuccess, exports.verifyDeviceWithTwoFAFailure = _a.verifyDeviceWithTwoFAFailure, exports.resendVerifyDeviceOTP = _a.resendVerifyDeviceOTP, exports.resendVerifyDeviceOTPSuccess = _a.resendVerifyDeviceOTPSuccess, exports.resendVerifyDeviceOTPFailure = _a.resendVerifyDeviceOTPFailure;
874
+ _a = tenant.actions, exports.updateTenants = _a.updateTenants, exports.fetchAllTenants = _a.fetchAllTenants, exports.updateTenantsSuccess = _a.updateTenantsSuccess, exports.updateTenantsFailure = _a.updateTenantsFailure, exports.fetchActiveTenant = _a.fetchActiveTenant, exports.updateTenantSuccess = _a.updateTenantSuccess, exports.updateTenantFailure = _a.updateTenantFailure, exports.updateCurrentTenant = _a.updateCurrentTenant, exports.fetchExcludedResources = _a.fetchExcludedResources, exports.updateExcludedResourcesSuccess = _a.updateExcludedResourcesSuccess, exports.updateExcludedResourcesFailure = _a.updateExcludedResourcesFailure, exports.doSignIn = _a.doSignIn, exports.doMagicLinkSignIn = _a.doMagicLinkSignIn, exports.magicLinkSignInSuccess = _a.magicLinkSignInSuccess, exports.magicLinkSignInFailure = _a.magicLinkSignInFailure, exports.sendEmailMagicLinkToUser = _a.sendEmailMagicLinkToUser, exports.sendEmailMagicLinkToUserSuccess = _a.sendEmailMagicLinkToUserSuccess, exports.sendEmailMagicLinkToUserFailure = _a.sendEmailMagicLinkToUserFailure, exports.updateSignInState = _a.updateSignInState, exports.doSignOut = _a.doSignOut, exports.signOutSuccess = _a.signOutSuccess, exports.sendSessionHeartbeat = _a.sendSessionHeartbeat, exports.sessionHeartbeatSuccess = _a.sessionHeartbeatSuccess, exports.sessionHeartbeatFailure = _a.sessionHeartbeatFailure, exports.updateLoggedInUser = _a.updateLoggedInUser, exports.fetchExternalConnections = _a.fetchExternalConnections, exports.saveExternalConnection = _a.saveExternalConnection, exports.saveExternalConnectionSuccess = _a.saveExternalConnectionSuccess, exports.saveExternalConnectionFailure = _a.saveExternalConnectionFailure, exports.fetchExternalConnectionsFailure = _a.fetchExternalConnectionsFailure, exports.fetchExternalConnectionsSuccess = _a.fetchExternalConnectionsSuccess, exports.saveAPIKeyConnection = _a.saveAPIKeyConnection, exports.saveAPIKeyConnectionSuccess = _a.saveAPIKeyConnectionSuccess, exports.saveAPIKeyConnectionFailure = _a.saveAPIKeyConnectionFailure, exports.saveOAuthConnection = _a.saveOAuthConnection, exports.saveOAuthConnectionSuccess = _a.saveOAuthConnectionSuccess, exports.saveOAuthConnectionFailure = _a.saveOAuthConnectionFailure, exports.saveConnectorCredentials = _a.saveConnectorCredentials, exports.saveConnectorCredentialsSuccess = _a.saveConnectorCredentialsSuccess, exports.saveConnectorCredentialsFailure = _a.saveConnectorCredentialsFailure, exports.initEmailConnectOAuth = _a.initEmailConnectOAuth, exports.initEmailConnectOAuthSuccess = _a.initEmailConnectOAuthSuccess, exports.initEmailConnectOAuthFailure = _a.initEmailConnectOAuthFailure, exports.deleteConnection = _a.deleteConnection, exports.deleteConnectionSuccess = _a.deleteConnectionSuccess, exports.deleteConnectionFailure = _a.deleteConnectionFailure, exports.clearAll = _a.clearAll, exports.fetchSubscriptionSummaryForTenant = _a.fetchSubscriptionSummaryForTenant, exports.updateSubscriptionSummaryForTenantSuccess = _a.updateSubscriptionSummaryForTenantSuccess, exports.updateSubscriptionSummaryForTenantFailure = _a.updateSubscriptionSummaryForTenantFailure, exports.updateOnboardingTenants = _a.updateOnboardingTenants, exports.removeOnboardingTenant = _a.removeOnboardingTenant, exports.updateTenantReimbursementInfo = _a.updateTenantReimbursementInfo, exports.updateReferViewedForLoggedInUser = _a.updateReferViewedForLoggedInUser, exports.updateTreasuryVideoViewedForLoggedInUser = _a.updateTreasuryVideoViewedForLoggedInUser, exports.resetSignInState = _a.resetSignInState, exports.trigger2FA = _a.trigger2FA, exports.updateTenantAccountingClassesEnabled = _a.updateTenantAccountingClassesEnabled, exports.updateTenantCapitalizationOnboardingDismissed = _a.updateTenantCapitalizationOnboardingDismissed, exports.updateTenantCapitalizationThreshold = _a.updateTenantCapitalizationThreshold, exports.updateTenantMasterTOSInfo = _a.updateTenantMasterTOSInfo, exports.verifyDeviceWithTwoFA = _a.verifyDeviceWithTwoFA, exports.verifyDeviceWithTwoFASuccess = _a.verifyDeviceWithTwoFASuccess, exports.verifyDeviceWithTwoFAFailure = _a.verifyDeviceWithTwoFAFailure, exports.resendVerifyDeviceOTP = _a.resendVerifyDeviceOTP, exports.resendVerifyDeviceOTPSuccess = _a.resendVerifyDeviceOTPSuccess, exports.resendVerifyDeviceOTPFailure = _a.resendVerifyDeviceOTPFailure;
800
875
  exports.default = tenant.reducer;
801
876
  /**
802
877
  * Converts tenants payload to Tenant and User State
@@ -880,9 +955,35 @@ function mapTenantPayloadToTenant(payload, userTenantPayload) {
880
955
  zeniBookCloseMonthAndYear: payload.zeni_book_close_month_and_year != null
881
956
  ? (0, timePeriod_1.toMonthYearPeriod)(payload.zeni_book_close_month_and_year)
882
957
  : undefined,
958
+ capitalizationThreshold: payload.capitalization_threshold ?? null,
959
+ capitalizationThresholdMaxCeiling: payload.capitalization_threshold_max_ceiling ?? null,
960
+ capitalizableAccounts: payload.capitalizable_accounts != null
961
+ ? mapCapitalizableAccountsPayload(payload.capitalizable_accounts)
962
+ : null,
963
+ capitalizationOnboardingShownForPrepaid: payload.capitalization_onboarding_shown_for_prepaid ?? false,
964
+ capitalizationOnboardingShownForFixedAsset: payload.capitalization_onboarding_shown_for_fixed_asset ?? false,
883
965
  };
884
966
  return tenant;
885
967
  }
968
+ // Exported for unit testing — the snake→camel + date() transform here is the
969
+ // only place the wire format is reshaped, and Nikunj called out we need
970
+ // coverage for the populated + null-accounts cases on this mapper specifically.
971
+ function mapCapitalizableAccountsPayload(payload) {
972
+ return {
973
+ computedAt: (0, zeniDayJS_1.date)(payload.computed_at),
974
+ // Defensive `?? []` because the API has historically been generous with
975
+ // `null` on nested fields; without this an `{accounts: null}` response
976
+ // throws on `.map`.
977
+ accounts: (payload.accounts ?? []).map((acc) => ({
978
+ accountId: acc.account_id,
979
+ classificationType: acc.classification_type,
980
+ matchPattern: acc.match_pattern,
981
+ thresholdValue: acc.threshold_value,
982
+ thresholdSource: acc.threshold_source,
983
+ sampleCount: acc.sample_count,
984
+ })),
985
+ };
986
+ }
886
987
  function mapTenantPayloadToUser(payload) {
887
988
  const user = {
888
989
  userId: payload.user_id,
@@ -924,6 +1025,11 @@ function mapConnectionsPayloadToState(connectionsPayload) {
924
1025
  const { connections } = connectionsPayload;
925
1026
  return {
926
1027
  accounting: connections.accounting.map((payload) => (0, exports.toConnection)(payload)),
1028
+ // Tenant materializes gmail/outlook under the `email` bucket via
1029
+ // _THIRD_PARTY_CONNECTORS_TO_MATERIALIZE when their slugs are enabled in
1030
+ // third_party_enabled_connectors Statsig config. Default to [] so older
1031
+ // tenant deploys (or disabled-everywhere envs) don't blow up here.
1032
+ email: (connections.email ?? []).map((payload) => (0, exports.toConnection)(payload)),
927
1033
  payments: connections.payments.map((payload) => (0, exports.toConnection)(payload)),
928
1034
  revenue: (connections.revenue ?? []).map((payload) => (0, exports.toConnection)(payload)),
929
1035
  };
@@ -13,6 +13,7 @@ import { AuthProvider, ExternalSupportedTool } from './tenantReducer';
13
13
  export interface TenantExternalConnections {
14
14
  accounting: Connection[];
15
15
  deleteConnectionState: FetchState;
16
+ email: Connection[];
16
17
  fetchState: FetchState;
17
18
  payments: Connection[];
18
19
  revenue: Connection[];
@@ -70,6 +71,11 @@ export interface TenantProductSettings {
70
71
  }
71
72
  export interface Tenant {
72
73
  accountingClassIDs: ID[];
74
+ capitalizableAccounts: CapitalizableAccounts | null;
75
+ capitalizationOnboardingShownForFixedAsset: boolean;
76
+ capitalizationOnboardingShownForPrepaid: boolean;
77
+ capitalizationThreshold: number | null;
78
+ capitalizationThresholdMaxCeiling: number | null;
73
79
  chargebeeId: ID;
74
80
  companyId: ID;
75
81
  companyName: string;
@@ -107,6 +113,21 @@ export interface Tenant {
107
113
  zeniBookCloseDate?: ZeniDate;
108
114
  zeniBookCloseMonthAndYear?: MonthYearPeriod;
109
115
  }
116
+ export type CapitalizableClassificationType = 'prepaid' | 'fixed_asset';
117
+ export type CapitalizableMatchPattern = 'LABEL' | 'TYPE_SUBTYPE_AND_JE_HISTORY' | 'TYPE_ONLY';
118
+ export type CapitalizableThresholdSource = 'LEARNED';
119
+ export interface CapitalizableAccount {
120
+ accountId: string;
121
+ classificationType: CapitalizableClassificationType;
122
+ matchPattern: CapitalizableMatchPattern;
123
+ sampleCount: number;
124
+ thresholdSource: CapitalizableThresholdSource | null;
125
+ thresholdValue: number | null;
126
+ }
127
+ export interface CapitalizableAccounts {
128
+ accounts: CapitalizableAccount[];
129
+ computedAt: ZeniDate;
130
+ }
110
131
  export interface LoggedInUser {
111
132
  userId: ID;
112
133
  authProvider?: AuthProvider;