@zeniai/client-epic-state 5.0.92 → 5.0.93-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 (260) 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 +63 -5
  5. package/lib/entity/aiCfo/aiCfoReducer.d.ts +23 -2
  6. package/lib/entity/aiCfo/aiCfoReducer.js +249 -9
  7. package/lib/entity/aiCfo/aiCfoSelector.d.ts +4 -1
  8. package/lib/entity/aiCfo/aiCfoSelector.js +19 -1
  9. package/lib/entity/aiCfo/aiCfoState.d.ts +97 -4
  10. package/lib/entity/aiCfo/aiCfoState.js +18 -1
  11. package/lib/entity/cardPolicy/cardPolicyPayload.d.ts +277 -0
  12. package/lib/entity/cardPolicy/cardPolicyPayload.js +143 -0
  13. package/lib/entity/cardPolicy/cardPolicyReducer.d.ts +19 -0
  14. package/lib/entity/cardPolicy/cardPolicyReducer.js +175 -0
  15. package/lib/entity/cardPolicy/cardPolicySelector.d.ts +32 -0
  16. package/lib/entity/cardPolicy/cardPolicySelector.js +99 -0
  17. package/lib/entity/cardPolicy/cardPolicyState.d.ts +205 -0
  18. package/lib/entity/cardPolicy/cardPolicyState.js +14 -0
  19. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.d.ts +18 -0
  20. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.js +68 -0
  21. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.d.ts +26 -0
  22. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +47 -0
  23. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.d.ts +25 -0
  24. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +39 -0
  25. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.d.ts +24 -0
  26. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.js +105 -0
  27. package/lib/entity/company/companyPayload.d.ts +4 -0
  28. package/lib/entity/company/companyPayload.js +4 -0
  29. package/lib/entity/company/companyStateTypes.d.ts +4 -0
  30. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +1 -1
  31. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksState.d.ts +1 -1
  32. package/lib/entity/paymentAccount/paymentAccountSelector.d.ts +1 -0
  33. package/lib/entity/paymentAccount/paymentAccountSelector.js +4 -0
  34. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  35. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  36. package/lib/entity/tenant/clearAllEpic.d.ts +6 -2
  37. package/lib/entity/tenant/clearAllEpic.js +8 -0
  38. package/lib/entity/tenant/epic/deleteConnectionEpic.d.ts +1 -1
  39. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.d.ts +21 -0
  40. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.js +54 -0
  41. package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.d.ts +1 -1
  42. package/lib/entity/tenant/epic/saveConnectorCredentialsEpic.d.ts +3 -3
  43. package/lib/entity/tenant/epic/saveOAuthConnectionEpic.d.ts +1 -1
  44. package/lib/entity/tenant/tenantPayload.d.ts +1 -0
  45. package/lib/entity/tenant/tenantReducer.d.ts +38 -25
  46. package/lib/entity/tenant/tenantReducer.js +65 -5
  47. package/lib/entity/tenant/tenantState.d.ts +1 -0
  48. package/lib/epic.d.ts +19 -1
  49. package/lib/epic.js +20 -1
  50. package/lib/esm/commonStateTypes/animations.js +1 -0
  51. package/lib/esm/entity/aiCfo/aiCfoReducer.js +249 -9
  52. package/lib/esm/entity/aiCfo/aiCfoSelector.js +17 -1
  53. package/lib/esm/entity/aiCfo/aiCfoState.js +15 -0
  54. package/lib/esm/entity/cardPolicy/cardPolicyPayload.js +130 -0
  55. package/lib/esm/entity/cardPolicy/cardPolicyReducer.js +171 -0
  56. package/lib/esm/entity/cardPolicy/cardPolicySelector.js +75 -0
  57. package/lib/esm/entity/cardPolicy/cardPolicyState.js +9 -0
  58. package/lib/esm/entity/cardPolicy/extractPolicyDocumentEpic.js +64 -0
  59. package/lib/esm/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +43 -0
  60. package/lib/esm/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +35 -0
  61. package/lib/esm/entity/cardPolicy/policyRecommendationFromUploadEpic.js +101 -0
  62. package/lib/esm/entity/company/companyPayload.js +4 -0
  63. package/lib/esm/entity/paymentAccount/paymentAccountSelector.js +3 -0
  64. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  65. package/lib/esm/entity/tenant/clearAllEpic.js +8 -0
  66. package/lib/esm/entity/tenant/epic/initEmailConnectOAuthEpic.js +50 -0
  67. package/lib/esm/entity/tenant/tenantReducer.js +63 -3
  68. package/lib/esm/epic.js +20 -1
  69. package/lib/esm/index.js +46 -13
  70. package/lib/esm/reducer.js +12 -0
  71. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +6 -3
  72. package/lib/esm/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
  73. package/lib/esm/view/aiCfoView/epics/createSessionEpic.js +2 -1
  74. package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
  75. package/lib/esm/view/fileView/epic/deleteFileEpic.js +2 -2
  76. package/lib/esm/view/fileView/epic/deleteFileListEpic.js +2 -2
  77. package/lib/esm/view/fileView/epic/updateFileNameEpic.js +2 -2
  78. package/lib/esm/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +42 -0
  79. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +29 -0
  80. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +40 -0
  81. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewReducer.js +217 -50
  82. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewSelector.js +7 -1
  83. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewState.js +12 -0
  84. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +52 -0
  85. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +22 -0
  86. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +1 -0
  87. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +36 -0
  88. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +39 -0
  89. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +34 -0
  90. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +58 -0
  91. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +21 -0
  92. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +1 -0
  93. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +38 -0
  94. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +289 -0
  95. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +109 -0
  96. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +44 -0
  97. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +111 -0
  98. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +25 -0
  99. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +363 -0
  100. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +36 -0
  101. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +19 -0
  102. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +6 -0
  103. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +119 -0
  104. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +154 -0
  105. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +22 -0
  106. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +1 -0
  107. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +39 -0
  108. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +140 -0
  109. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +20 -0
  110. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +100 -0
  111. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +96 -0
  112. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +59 -0
  113. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +24 -0
  114. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +25 -0
  115. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +1 -0
  116. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +34 -0
  117. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +57 -0
  118. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +35 -0
  119. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +2 -2
  120. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +42 -4
  121. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +35 -0
  122. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +62 -0
  123. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +44 -0
  124. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +58 -0
  125. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +67 -0
  126. package/lib/esm/view/spendManagement/commonSetup/kycKybAutofillActions.js +14 -0
  127. package/lib/esm/view/spendManagement/commonSetup/kycKybParseMapper.js +205 -0
  128. package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +105 -52
  129. package/lib/esm/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
  130. package/lib/esm/view/spendManagement/commonSetup/types/kycKybAutofill.js +28 -0
  131. package/lib/index.d.ts +52 -14
  132. package/lib/index.js +219 -31
  133. package/lib/reducer.d.ts +12 -0
  134. package/lib/reducer.js +12 -0
  135. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +11 -2
  136. package/lib/view/aiCfoView/aiCfoViewReducer.js +6 -3
  137. package/lib/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
  138. package/lib/view/aiCfoView/epics/createSessionEpic.js +2 -1
  139. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +8 -1
  140. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
  141. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  142. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
  143. package/lib/view/fileView/epic/deleteFileEpic.js +1 -1
  144. package/lib/view/fileView/epic/deleteFileListEpic.js +1 -1
  145. package/lib/view/fileView/epic/updateFileNameEpic.js +1 -1
  146. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.d.ts +7 -0
  147. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +46 -0
  148. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.d.ts +8 -0
  149. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +33 -0
  150. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.d.ts +9 -0
  151. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +44 -0
  152. package/lib/view/onboardingView/customerView/onboardingCustomerViewPayload.d.ts +3 -0
  153. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.d.ts +41 -4
  154. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.js +219 -51
  155. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.d.ts +5 -1
  156. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.js +11 -2
  157. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.d.ts +40 -0
  158. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.js +13 -1
  159. package/lib/view/people/peopleTypes.d.ts +1 -1
  160. package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
  161. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.d.ts +14 -0
  162. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +56 -0
  163. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.d.ts +15 -0
  164. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +28 -0
  165. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.d.ts +8 -0
  166. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +2 -0
  167. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.d.ts +8 -0
  168. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +40 -0
  169. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.d.ts +8 -0
  170. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +43 -0
  171. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.d.ts +8 -0
  172. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +38 -0
  173. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.d.ts +15 -0
  174. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +62 -0
  175. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.d.ts +15 -0
  176. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +27 -0
  177. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.d.ts +7 -0
  178. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +2 -0
  179. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.d.ts +8 -0
  180. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +42 -0
  181. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.d.ts +8 -0
  182. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +294 -0
  183. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.d.ts +8 -0
  184. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +113 -0
  185. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.d.ts +9 -0
  186. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +48 -0
  187. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.d.ts +8 -0
  188. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +115 -0
  189. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.d.ts +13 -0
  190. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +29 -0
  191. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.d.ts +14 -0
  192. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +369 -0
  193. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.d.ts +6 -0
  194. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +40 -0
  195. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.d.ts +7 -0
  196. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +26 -0
  197. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.d.ts +116 -0
  198. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +10 -0
  199. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.d.ts +33 -0
  200. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +126 -0
  201. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.d.ts +52 -0
  202. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +158 -0
  203. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.d.ts +11 -0
  204. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +31 -0
  205. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.d.ts +12 -0
  206. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +2 -0
  207. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.d.ts +8 -0
  208. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +43 -0
  209. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.d.ts +10 -0
  210. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +144 -0
  211. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.d.ts +7 -0
  212. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +24 -0
  213. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.d.ts +11 -0
  214. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +104 -0
  215. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.d.ts +22 -0
  216. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +100 -0
  217. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.d.ts +8 -0
  218. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +63 -0
  219. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.d.ts +3 -0
  220. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +28 -0
  221. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  222. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.d.ts +14 -0
  223. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +27 -1
  224. package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.d.ts +34 -0
  225. package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +2 -0
  226. package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.d.ts +7 -0
  227. package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +38 -0
  228. package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.d.ts +12 -0
  229. package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +61 -0
  230. package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.d.ts +9 -0
  231. package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +39 -0
  232. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.d.ts +2 -2
  233. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +1 -1
  234. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.d.ts +12 -2
  235. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +43 -5
  236. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.d.ts +7 -0
  237. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +42 -1
  238. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardState.d.ts +5 -0
  239. package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.d.ts +11 -0
  240. package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +66 -0
  241. package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.d.ts +3 -0
  242. package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +48 -0
  243. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.d.ts +28 -0
  244. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +62 -0
  245. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.d.ts +30 -0
  246. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +71 -0
  247. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.d.ts +33 -0
  248. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.js +17 -0
  249. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.d.ts +24 -0
  250. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.js +213 -0
  251. package/lib/view/spendManagement/commonSetup/setupViewReducer.d.ts +28 -2
  252. package/lib/view/spendManagement/commonSetup/setupViewReducer.js +106 -53
  253. package/lib/view/spendManagement/commonSetup/setupViewSelector.d.ts +7 -2
  254. package/lib/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
  255. package/lib/view/spendManagement/commonSetup/setupViewState.d.ts +19 -0
  256. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.d.ts +142 -0
  257. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.js +32 -0
  258. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +1 -1
  259. package/lib/view/transactionDetail/journalEntryLinesViewModel.d.ts +1 -1
  260. package/package.json +1 -1
@@ -0,0 +1,96 @@
1
+ import { CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION, } from './cardPolicyFormDraftTypes';
2
+ import { REVIEW_GROUP_IDS, REVIEW_LIMIT_CHIP_IDS, amountFromLimitRow, collectCategoryCodes, collectMerchantNames, } from './cardPolicyRequestParts';
3
+ const isSelectedChip = (chip) => chip.isSelected !== false;
4
+ const chipsInGroup = (row, groupId) => {
5
+ const group = row.chipGroups.find((g) => g.id === groupId);
6
+ if (group == null) {
7
+ return [];
8
+ }
9
+ return group.chips.filter(isSelectedChip);
10
+ };
11
+ const collectVendorLabelsFromReviewRow = (row, groupId) => chipsInGroup(row, groupId).map((chip) => chip.label);
12
+ const collectCategoryCodesFromReviewRow = (row, groupId) => chipsInGroup(row, groupId).map((chip) => chip.optionalCode ?? chip.id);
13
+ const collectCardIdsFromReviewRow = (row) => chipsInGroup(row, REVIEW_GROUP_IDS.appliedToCards).flatMap((chip) => chip.cardIds ?? []);
14
+ const limitValueFromReviewRow = (row, chipId) => {
15
+ const group = row.chipGroups.find((g) => g.id === REVIEW_GROUP_IDS.limits);
16
+ if (group == null) {
17
+ return null;
18
+ }
19
+ const chip = group.chips.find((c) => c.id === chipId && isSelectedChip(c));
20
+ if (chip == null) {
21
+ return null;
22
+ }
23
+ if (chip.optionalCode != null) {
24
+ const parsed = Number(chip.optionalCode);
25
+ return Number.isFinite(parsed) ? parsed : null;
26
+ }
27
+ const labelDigits = chip.label.match(/\d+(?:\.\d+)?/);
28
+ if (labelDigits == null) {
29
+ return null;
30
+ }
31
+ const parsed = Number(labelDigits[0]);
32
+ return Number.isFinite(parsed) ? parsed : null;
33
+ };
34
+ const buildGuidedEntry = (row, draft, guidedMode, description) => ({
35
+ allowedEntity: {
36
+ categoryCodes: collectCategoryCodes(draft.categoryPolicy, 'allow'),
37
+ merchantNames: collectMerchantNames(draft.vendorPolicy, 'allow'),
38
+ },
39
+ applyToCards: draft.cardSelections
40
+ .filter((card) => card.isChecked)
41
+ .map((card) => card.id),
42
+ blockedEntity: {
43
+ categoryCodes: collectCategoryCodes(draft.categoryPolicy, 'block'),
44
+ merchantNames: collectMerchantNames(draft.vendorPolicy, 'block'),
45
+ },
46
+ description: description.trim(),
47
+ mode: guidedMode,
48
+ name: row.name.trim(),
49
+ requiredReceiptThreshold: amountFromLimitRow(draft.limits, CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT),
50
+ spendLimits: {
51
+ transaction: amountFromLimitRow(draft.limits, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION),
52
+ },
53
+ });
54
+ const buildAutoEntry = (row, description) => ({
55
+ allowedEntity: {
56
+ categoryCodes: collectCategoryCodesFromReviewRow(row, REVIEW_GROUP_IDS.allowedCategories),
57
+ merchantNames: collectVendorLabelsFromReviewRow(row, REVIEW_GROUP_IDS.allowedVendors),
58
+ },
59
+ applyToCards: collectCardIdsFromReviewRow(row),
60
+ blockedEntity: {
61
+ categoryCodes: collectCategoryCodesFromReviewRow(row, REVIEW_GROUP_IDS.restrictedCategories),
62
+ merchantNames: collectVendorLabelsFromReviewRow(row, REVIEW_GROUP_IDS.blockedVendors),
63
+ },
64
+ description: description.trim(),
65
+ name: row.name.trim(),
66
+ });
67
+ const buildUploadEntry = (row, draft, description) => ({
68
+ allowedEntity: {
69
+ categoryCodes: collectCategoryCodesFromReviewRow(row, REVIEW_GROUP_IDS.allowedCategories),
70
+ merchantNames: collectVendorLabelsFromReviewRow(row, REVIEW_GROUP_IDS.allowedVendors),
71
+ },
72
+ applyToCards: draft.cardSelections
73
+ .filter((card) => card.isChecked)
74
+ .map((card) => card.id),
75
+ blockedEntity: {
76
+ categoryCodes: collectCategoryCodesFromReviewRow(row, REVIEW_GROUP_IDS.restrictedCategories),
77
+ merchantNames: collectVendorLabelsFromReviewRow(row, REVIEW_GROUP_IDS.blockedVendors),
78
+ },
79
+ description: description.trim(),
80
+ name: row.name.trim(),
81
+ requiredReceiptThreshold: limitValueFromReviewRow(row, REVIEW_LIMIT_CHIP_IDS.receipt),
82
+ spendLimits: {
83
+ transaction: limitValueFromReviewRow(row, REVIEW_LIMIT_CHIP_IDS.transaction),
84
+ },
85
+ });
86
+ // One entry per checked review row; per-mode key contract enforced internally.
87
+ export const toBulkCardPolicyTemplateRequestsFromDraft = ({ draft, description = '', guidedMode = 'strict', }) => {
88
+ const checkedRows = draft.policiesReview.filter((row) => row.isChecked);
89
+ if (draft.policyKind === 'guided') {
90
+ return checkedRows.map((row) => buildGuidedEntry(row, draft, guidedMode, description));
91
+ }
92
+ if (draft.policyKind === 'upload') {
93
+ return checkedRows.map((row) => buildUploadEntry(row, draft, description));
94
+ }
95
+ return checkedRows.map((row) => buildAutoEntry(row, description));
96
+ };
@@ -0,0 +1,59 @@
1
+ import { CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION, } from './cardPolicyFormDraftTypes';
2
+ import { amountFromLimitRow, collectCategoryCodes, collectMerchantNames, projectAutoReviewRowToCardPolicyRequestParts, } from './cardPolicyRequestParts';
3
+ // auto/upload project from the active review row's chip groups; guided reads source slices.
4
+ // Active row = first checked, else first; name follows the same rule.
5
+ export const toCardPolicyTemplateRequestFromDraft = ({ draft, description = '', mode = 'strict', }) => {
6
+ const name = pickPolicyName(draft);
7
+ const base = {
8
+ description: description.trim(),
9
+ mode,
10
+ name: name.trim(),
11
+ };
12
+ if (draft.policyKind === 'auto' || draft.policyKind === 'upload') {
13
+ const activeRow = draft.policiesReview.find((row) => row.isChecked) ??
14
+ draft.policiesReview[0];
15
+ if (activeRow == null) {
16
+ return {
17
+ ...base,
18
+ allowedEntity: { categoryCodes: [], merchantNames: [] },
19
+ applyToCards: [],
20
+ blockedEntity: { categoryCodes: [], merchantNames: [] },
21
+ requiredReceiptThreshold: null,
22
+ spendLimits: { transaction: null },
23
+ };
24
+ }
25
+ return {
26
+ ...base,
27
+ ...projectAutoReviewRowToCardPolicyRequestParts(activeRow),
28
+ };
29
+ }
30
+ // Guided
31
+ return {
32
+ ...base,
33
+ allowedEntity: {
34
+ categoryCodes: collectCategoryCodes(draft.categoryPolicy, 'allow'),
35
+ merchantNames: collectMerchantNames(draft.vendorPolicy, 'allow'),
36
+ },
37
+ applyToCards: draft.cardSelections
38
+ .filter((row) => row.isChecked)
39
+ .map((row) => row.id),
40
+ blockedEntity: {
41
+ categoryCodes: collectCategoryCodes(draft.categoryPolicy, 'block'),
42
+ merchantNames: collectMerchantNames(draft.vendorPolicy, 'block'),
43
+ },
44
+ requiredReceiptThreshold: amountFromLimitRow(draft.limits, CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT),
45
+ spendLimits: {
46
+ transaction: amountFromLimitRow(draft.limits, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION),
47
+ },
48
+ };
49
+ };
50
+ const pickPolicyName = (draft) => {
51
+ const checked = draft.policiesReview.find((row) => row.isChecked);
52
+ if (checked != null) {
53
+ return checked.name;
54
+ }
55
+ if (draft.policiesReview.length > 0) {
56
+ return draft.policiesReview[0].name;
57
+ }
58
+ return '';
59
+ };
@@ -0,0 +1,24 @@
1
+ import { CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION, } from './cardPolicyFormDraftTypes';
2
+ import { amountFromLimitRow, collectCategoryCodes, collectMerchantNames, } from './cardPolicyRequestParts';
3
+ // Mirrors the AI guided builder without the `policiesReview` projection;
4
+ // disabled limit toggles emit `null` (BE: "not configured").
5
+ export const toManualCardPolicyTemplateRequestFromDraft = (draft) => ({
6
+ allowedEntity: {
7
+ categoryCodes: collectCategoryCodes(draft.categoryPolicy, 'allow'),
8
+ merchantNames: collectMerchantNames(draft.vendorPolicy, 'allow'),
9
+ },
10
+ applyToCards: draft.cardSelections
11
+ .filter((row) => row.isChecked)
12
+ .map((row) => row.id),
13
+ blockedEntity: {
14
+ categoryCodes: collectCategoryCodes(draft.categoryPolicy, 'block'),
15
+ merchantNames: collectMerchantNames(draft.vendorPolicy, 'block'),
16
+ },
17
+ description: draft.description.trim(),
18
+ mode: draft.mode,
19
+ name: draft.name.trim(),
20
+ requiredReceiptThreshold: amountFromLimitRow(draft.limits, CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT),
21
+ spendLimits: {
22
+ transaction: amountFromLimitRow(draft.limits, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION),
23
+ },
24
+ });
@@ -87,6 +87,31 @@ export const getChargeCardListView = (state, includeCreditAccountDebitSummaryAnd
87
87
  hasDebitCard,
88
88
  };
89
89
  };
90
+ /**
91
+ * Returns every enriched `ChargeCardWithUser` for the tenant, without
92
+ * applying the cards-list screen's `searchText` filter or its column
93
+ * `sortKey/sortOrder`. Used by surfaces that need the raw card universe
94
+ * decoupled from whatever the user has typed/sorted on the cards list
95
+ * (e.g. the Card Policy "Apply to Cards" picker, which owns its own
96
+ * search + sort UI). The list-screen's filter/sort state is intentionally
97
+ * left untouched so revisits to the cards list still restore the user's
98
+ * search.
99
+ */
100
+ export const getAllChargeCardsWithUser = (state) => {
101
+ const { chargeCardListState, chargeCardState, chargeCardConfigState } = state;
102
+ const cards = getChargeCardsByIds(chargeCardState, chargeCardListState.cardIds);
103
+ const chargeCardsWithUser = getChargeCardsWithUser(cards, state);
104
+ const fetchState = reduceFetchState([
105
+ chargeCardListState,
106
+ chargeCardConfigState,
107
+ ]).fetchState;
108
+ return {
109
+ fetchState,
110
+ error: chargeCardListState.error,
111
+ cards: chargeCardsWithUser,
112
+ version: '1.0',
113
+ };
114
+ };
90
115
  export const getMyPendingActivationChargeCardListView = (state) => {
91
116
  const { tenantState, chargeCardListState, chargeCardState } = state;
92
117
  const cards = getChargeCardsByIds(chargeCardState, chargeCardListState.cardIds);
@@ -0,0 +1,34 @@
1
+ import { deriveAiCardRowsFromTeams } from './deriveAiCardRowsFromTeams';
2
+ // Re-derives step-2 `cardRows` only when step-1 team selection changed.
3
+ // Step-2-only edits must skip the re-derive: `deriveAiCardRowsFromTeams` keys
4
+ // off `cardRow.id`, and a dropdown swap has just mutated it — re-running would
5
+ // revert the edit to the source team's id/label.
6
+ export const applyAiCardCreationFormDraftUpdate = ({ next, prev, context, }) => {
7
+ if (context == null || context.mode === 'create') {
8
+ return next;
9
+ }
10
+ if (!haveCheckedTeamRowsChanged(prev?.teamRows, next.teamRows)) {
11
+ return next;
12
+ }
13
+ return {
14
+ teamRows: next.teamRows,
15
+ cardRows: deriveAiCardRowsFromTeams({
16
+ teamRows: next.teamRows,
17
+ prevCardRows: next.cardRows,
18
+ allUsers: context.allUsers,
19
+ suggestedOwnerUserIdByTeamId: context.suggestedOwnerUserIdByTeamId,
20
+ }),
21
+ };
22
+ };
23
+ const haveCheckedTeamRowsChanged = (prevTeamRows, nextTeamRows) => {
24
+ const prevCheckedIds = (prevTeamRows ?? [])
25
+ .filter((row) => row.isChecked)
26
+ .map((row) => row.id);
27
+ const nextCheckedIds = nextTeamRows
28
+ .filter((row) => row.isChecked)
29
+ .map((row) => row.id);
30
+ if (prevCheckedIds.length !== nextCheckedIds.length) {
31
+ return true;
32
+ }
33
+ return prevCheckedIds.some((id, idx) => id !== nextCheckedIds[idx]);
34
+ };
@@ -0,0 +1,57 @@
1
+ import { deriveAiCardRowsFromTeams } from './deriveAiCardRowsFromTeams';
2
+ // Branches on `initialData.mode`:
3
+ // - review: step-1 teams start checked; step-2 `cardRows` pre-derived so the
4
+ // happy path (no toggle) lands on a populated table.
5
+ // - create: seed `cardRows` from AI's suggested cards; `teamRows` stays empty.
6
+ export const buildAiCardCreationFormDraftSeed = ({ initialData, allUsers, }) => {
7
+ const context = {
8
+ allUsers,
9
+ mode: initialData.mode,
10
+ suggestedOwnerUserIdByTeamId: initialData.suggestedOwnerUserIdByTeamId,
11
+ };
12
+ if (initialData.mode === 'create') {
13
+ return {
14
+ context,
15
+ draft: {
16
+ teamRows: [],
17
+ cardRows: initialData.cardRows.map((seed) => buildCardRowFromSeed(seed, allUsers)),
18
+ },
19
+ };
20
+ }
21
+ const teamRows = initialData.teamRows.map((row) => ({
22
+ cardKind: row.cardKind,
23
+ id: row.id,
24
+ isChecked: true,
25
+ label: row.label,
26
+ value: row.avgMonthlySpend,
27
+ rightLabel: row.recommendedLimit,
28
+ rightSubLabel: row.recommendedLimitCadence,
29
+ }));
30
+ return {
31
+ context,
32
+ draft: {
33
+ teamRows,
34
+ cardRows: deriveAiCardRowsFromTeams({
35
+ teamRows,
36
+ prevCardRows: [],
37
+ allUsers,
38
+ suggestedOwnerUserIdByTeamId: initialData.suggestedOwnerUserIdByTeamId,
39
+ }),
40
+ },
41
+ };
42
+ };
43
+ const buildCardRowFromSeed = (seed, allUsers) => {
44
+ const selectedUser = seed.suggestedOwnerUserId != null
45
+ ? allUsers.find((user) => user.userId === seed.suggestedOwnerUserId)
46
+ : undefined;
47
+ return {
48
+ cardKind: seed.cardKind,
49
+ id: seed.id,
50
+ label: seed.label,
51
+ owner: {
52
+ allUsers,
53
+ selectedUser,
54
+ },
55
+ recommendedLimit: seed.recommendedLimit,
56
+ };
57
+ };
@@ -0,0 +1,35 @@
1
+ // One row per checked team in source order. Existing rows are preserved
2
+ // verbatim so step-2 user edits survive upstream re-derives; new teams seed
3
+ // owner from the suggestion map and `recommendedLimit` by parsing `rightLabel`.
4
+ export const deriveAiCardRowsFromTeams = ({ teamRows, prevCardRows = [], allUsers, suggestedOwnerUserIdByTeamId, }) => {
5
+ const prevById = new Map(prevCardRows.map((row) => [row.id, row]));
6
+ const userById = new Map(allUsers.map((user) => [user.userId, user]));
7
+ return teamRows
8
+ .filter((row) => row.isChecked)
9
+ .map((teamRow) => {
10
+ const previous = prevById.get(teamRow.id);
11
+ if (previous != null) {
12
+ return previous;
13
+ }
14
+ const suggestedUserId = suggestedOwnerUserIdByTeamId[teamRow.id];
15
+ const selectedUser = suggestedUserId != null ? userById.get(suggestedUserId) : undefined;
16
+ return {
17
+ cardKind: teamRow.cardKind,
18
+ id: teamRow.id,
19
+ label: teamRow.label,
20
+ owner: {
21
+ allUsers,
22
+ selectedUser,
23
+ },
24
+ recommendedLimit: parseLimitToFloat(teamRow.rightLabel),
25
+ };
26
+ });
27
+ };
28
+ const parseLimitToFloat = (raw) => {
29
+ const cleaned = raw.replace(/[^0-9.-]/g, '');
30
+ if (cleaned.length === 0) {
31
+ return undefined;
32
+ }
33
+ const parsed = Number(cleaned);
34
+ return Number.isFinite(parsed) ? parsed : undefined;
35
+ };
@@ -7,7 +7,7 @@ import { updateAllUsers } from '../../../../entity/user/userReducer';
7
7
  import { updateUserRoles } from '../../../../entity/userRole/userRoleReducer';
8
8
  import { createZeniAPIStatus, isSuccessStatus, } from '../../../../responsePayload';
9
9
  import { updateChargeCardList } from '../chargeCardList/chargeCardListReducer';
10
- import { issueChargeCardSuccessOrFailure, issueChargeCards, updateChargeCardCount, updateDebitCardCount, updateLastSelfIssuedDebitCardId, } from './issueChargeCardReducer';
10
+ import { issueChargeCardSuccessOrFailure, issueChargeCards, updateChargeCardCount, updateDebitCardCount, updateLastIssuedCardIds, updateLastSelfIssuedDebitCardId, } from './issueChargeCardReducer';
11
11
  export const issueChargeCardEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(issueChargeCards.match), switchMap(() => {
12
12
  const state = state$.value;
13
13
  const loggedInUserId = state$.value.tenantState.loggedInUser?.userId;
@@ -87,7 +87,7 @@ export const issueChargeCardEpic = (actions$, state$, zeniAPI) => actions$.pipe(
87
87
  actions.push(updateChargeCards(issuedCards), updateAllUsers({ users: response.data.users }), updateUserRoles(response.data.user_roles), updateChargeCardList({
88
88
  chargeCardListPayload: response.data,
89
89
  keepExistingListItems: true,
90
- }), updateAddresses(response.data.addresses), updateChargeCardCount(response.data?.cards_count_by_user_id ?? []), updateDebitCardCount(response.data?.debit_cards_count_by_deposit_account_id ?? {}), issueChargeCardSuccessOrFailure({ fetchState: 'Completed' }));
90
+ }), updateAddresses(response.data.addresses), updateChargeCardCount(response.data?.cards_count_by_user_id ?? []), updateDebitCardCount(response.data?.debit_cards_count_by_deposit_account_id ?? {}), updateLastIssuedCardIds(issuedCards.map((card) => card.card_id)), issueChargeCardSuccessOrFailure({ fetchState: 'Completed' }));
91
91
  if (issuedCards.length === 1 &&
92
92
  (issuedCards[0].card_type.code ===
93
93
  'business_virtual_debit_card' ||
@@ -1,4 +1,6 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
+ import { applyAiCardCreationFormDraftUpdate } from './applyAiCardCreationFormDraftUpdate';
3
+ import { buildAiCardCreationFormDraftSeed } from './buildAiCardCreationFormDraftSeed';
2
4
  export const initialState = {
3
5
  depositAccountIds: [],
4
6
  depositAccountsFetchState: { fetchState: 'Not-Started', error: undefined },
@@ -14,6 +16,7 @@ export const initialState = {
14
16
  },
15
17
  activeChargeCardCount: {},
16
18
  activeDebitCardCountByDepositAccountId: {},
19
+ lastIssuedCardIds: [],
17
20
  };
18
21
  const issueChargeCard = createSlice({
19
22
  name: 'issueChargeCard',
@@ -34,14 +37,19 @@ const issueChargeCard = createSlice({
34
37
  },
35
38
  },
36
39
  issueChargeCards: {
37
- prepare() {
38
- return { payload: {} };
40
+ prepare(payload) {
41
+ return { payload: payload ?? {} };
39
42
  },
40
- reducer(draft) {
43
+ reducer(draft, action) {
41
44
  draft.saveStatus.fetchState = 'In-Progress';
42
45
  draft.saveStatus.error = undefined;
46
+ draft.lastIssueSourceChatSessionId = action.payload.sourceChatSessionId;
47
+ draft.lastIssuedCardIds = [];
43
48
  },
44
49
  },
50
+ updateLastIssuedCardIds(draft, action) {
51
+ draft.lastIssuedCardIds = action.payload;
52
+ },
45
53
  updateChargeCardsLocalStore(draft, action) {
46
54
  draft.localData = action.payload;
47
55
  },
@@ -49,6 +57,8 @@ const issueChargeCard = createSlice({
49
57
  draft.localData = [...initialState.localData];
50
58
  draft.saveStatus = initialState.saveStatus;
51
59
  draft.lastSelfIssuedDebitCardId = undefined;
60
+ draft.lastIssueSourceChatSessionId = undefined;
61
+ draft.lastIssuedCardIds = [];
52
62
  },
53
63
  updateLastSelfIssuedDebitCardId(draft, action) {
54
64
  draft.lastSelfIssuedDebitCardId = action.payload;
@@ -124,10 +134,38 @@ const issueChargeCard = createSlice({
124
134
  draft.depositAccountsFetchState.fetchState = action.payload.fetchState;
125
135
  draft.depositAccountsFetchState.error = action.payload.error;
126
136
  },
137
+ // Dispatched once when `CardsCreationInteractiveForm` mounts (or the AI
138
+ // payload arrives).
139
+ seedAiCardCreationFormDraft: {
140
+ reducer(draft, action) {
141
+ const { draft: nextDraft, context } = buildAiCardCreationFormDraftSeed({
142
+ allUsers: action.payload.allUsers,
143
+ initialData: action.payload.initialData,
144
+ });
145
+ draft.aiCardCreationFormDraft = nextDraft;
146
+ draft.aiCardCreationFormDraftContext = context;
147
+ },
148
+ prepare(allUsers, initialData) {
149
+ return { payload: { allUsers, initialData } };
150
+ },
151
+ },
152
+ // Derivation lives in `applyAiCardCreationFormDraftUpdate` so the
153
+ // Storybook owner harness shares the same rules.
154
+ updateAiCardCreationFormDraft(draft, action) {
155
+ draft.aiCardCreationFormDraft = applyAiCardCreationFormDraftUpdate({
156
+ prev: draft.aiCardCreationFormDraft,
157
+ next: action.payload,
158
+ context: draft.aiCardCreationFormDraftContext,
159
+ });
160
+ },
161
+ clearAiCardCreationFormDraft(draft) {
162
+ draft.aiCardCreationFormDraft = undefined;
163
+ draft.aiCardCreationFormDraftContext = undefined;
164
+ },
127
165
  clearIssueChargeCard(draft) {
128
166
  Object.assign(draft, initialState);
129
167
  },
130
168
  },
131
169
  });
132
- export const { issueChargeCards, updateChargeCardsLocalStore, updateLastSelfIssuedDebitCardId, issueChargeCardSuccessOrFailure, resetIssueChargeCardForm, updateCustomAddressId, updateChargeCardCount, updateDebitCardCount, fetchIssueCardPage, updateDepositAccountsInCards, fetchDepositAccountListForCards, updateDepositAccountListForCardsFetchStatus, clearIssueChargeCard, } = issueChargeCard.actions;
170
+ export const { issueChargeCards, updateChargeCardsLocalStore, updateLastSelfIssuedDebitCardId, updateLastIssuedCardIds, issueChargeCardSuccessOrFailure, resetIssueChargeCardForm, updateCustomAddressId, updateChargeCardCount, updateDebitCardCount, fetchIssueCardPage, updateDepositAccountsInCards, fetchDepositAccountListForCards, updateDepositAccountListForCardsFetchStatus, seedAiCardCreationFormDraft, updateAiCardCreationFormDraft, clearAiCardCreationFormDraft, clearIssueChargeCard, } = issueChargeCard.actions;
133
171
  export default issueChargeCard.reducer;
@@ -5,6 +5,7 @@ import { getDepositAccountLimitsForChargeCardByDepositAccountIds } from '../../.
5
5
  import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
6
6
  import { getNewAddress } from '../../../addressView/addressViewSelector';
7
7
  import { getUserList } from '../../../userListView/userListViewSelector';
8
+ import { toIssueChargeCardLocalDataFromDraft } from './toIssueChargeCardLocalDataFromDraft';
8
9
  export const getIssueChargeCardView = (state, isCreditCardEnabled, isDebitCardEnabled) => {
9
10
  const { issueChargeCardState, userState, userRoleState, userListViewState, chargeCardConfigState, chargeCardListState, addressState, classState, depositAccountState, classListState, } = state;
10
11
  const userListSelectorView = getUserList(userState, userRoleState, userListViewState, 'cardHolderCandidate');
@@ -93,3 +94,37 @@ export const getIssueChargeCardView = (state, isCreditCardEnabled, isDebitCardEn
93
94
  lastSelfIssuedDebitCardId: issueChargeCardState.lastSelfIssuedDebitCardId,
94
95
  };
95
96
  };
97
+ // AI CFO chat session that triggered the most recent issue; lets the cards
98
+ // list screen attribute the pending placeholder + synthetic drawer bubble.
99
+ export const getLastIssueChargeCardsSourceChatSessionId = (state) => {
100
+ return state.issueChargeCardState.lastIssueSourceChatSessionId;
101
+ };
102
+ // Cards created by the most recent successful issue; AI CFO drawer's "Created"
103
+ // bubble maps back through these.
104
+ export const getLastIssuedChargeCardIds = (state) => {
105
+ return state.issueChargeCardState.lastIssuedCardIds;
106
+ };
107
+ export const getIssueChargeCardsSaveStatus = (state) => {
108
+ return state.issueChargeCardState.saveStatus;
109
+ };
110
+ // Mirrors `localData.length` while in flight so the list can render N skeleton
111
+ // rows at the top of the table.
112
+ export const getInFlightIssueChargeCardsCount = (state) => {
113
+ if (state.issueChargeCardState.saveStatus.fetchState !== 'In-Progress') {
114
+ return 0;
115
+ }
116
+ return state.issueChargeCardState.localData.length;
117
+ };
118
+ // Hydrates `CardsCreationInteractiveForm`'s RHF; `undefined` outside the
119
+ // seed/clear window.
120
+ export const getAiCardCreationFormDraft = (state) => {
121
+ return state.issueChargeCardState.aiCardCreationFormDraft;
122
+ };
123
+ // Returns [] when the draft is absent so callers can short-circuit submission.
124
+ export const selectIssueChargeCardLocalDataFromDraft = (state) => {
125
+ const draft = state.issueChargeCardState.aiCardCreationFormDraft;
126
+ if (draft == null) {
127
+ return [];
128
+ }
129
+ return toIssueChargeCardLocalDataFromDraft(draft);
130
+ };
@@ -0,0 +1,62 @@
1
+ import { EMPTY, concat, of } from 'rxjs';
2
+ import { distinctUntilChanged, filter, map, mergeMap, take, } from 'rxjs/operators';
3
+ import { upsertAnswerPayload, upsertOrAddQuestionAnswerPayload, } from '../../../../entity/aiCfo/aiCfoReducer';
4
+ import { getQuestionAnswerByIdForChatSession } from '../../../../entity/aiCfo/aiCfoSelector';
5
+ import { fetchUserListByType } from '../../../userListView/userListViewReducer';
6
+ import { getUserList } from '../../../userListView/userListViewSelector';
7
+ import { clearAiCardCreationFormDraft, issueChargeCardSuccessOrFailure, seedAiCardCreationFormDraft, } from './issueChargeCardReducer';
8
+ const readAllUsersAsUserArray = (state) => getUserList(state.userState, state.userRoleState, state.userListViewState, 'cardHolderCandidate')
9
+ .users.map((person) => person.user)
10
+ .filter((user) => user != null);
11
+ const readCardsCreationPayload = (state, chatSessionId, questionAnswerId) => {
12
+ const qa = getQuestionAnswerByIdForChatSession(state.aiCfoState, chatSessionId, questionAnswerId);
13
+ const visualization = qa?.responses.answer?.content.visualization;
14
+ if (visualization?.type !== 'interactive_form') {
15
+ return undefined;
16
+ }
17
+ const data = visualization.data;
18
+ if (!('formType' in data) || data.formType !== 'cards_creation') {
19
+ return undefined;
20
+ }
21
+ return data.payload;
22
+ };
23
+ // Pusher may target "latest QA"; REST always carries the id. Either way,
24
+ // resolve to the QA the reducer just wrote so we can read it off state.
25
+ const resolveQuestionAnswerId = (state, action) => {
26
+ if (action.payload.questionAnswerId != null) {
27
+ return action.payload.questionAnswerId;
28
+ }
29
+ const session = state.aiCfoState.aiCfoByChatSessionId[action.payload.chatSessionId];
30
+ return session?.questionAnswers.slice(-1)[0]?.questionAnswerId;
31
+ };
32
+ const isSeedTrigger = (action) => upsertAnswerPayload.match(action) ||
33
+ upsertOrAddQuestionAnswerPayload.match(action);
34
+ export const seedAiCardCreationFormDraftEpic = (actions$, state$) => actions$.pipe(mergeMap((action) => {
35
+ if (issueChargeCardSuccessOrFailure.match(action) &&
36
+ action.payload.fetchState === 'Completed') {
37
+ return of(clearAiCardCreationFormDraft());
38
+ }
39
+ if (!isSeedTrigger(action)) {
40
+ return EMPTY;
41
+ }
42
+ const state = state$.value;
43
+ const questionAnswerId = resolveQuestionAnswerId(state, action);
44
+ if (questionAnswerId == null) {
45
+ return EMPTY;
46
+ }
47
+ const payload = readCardsCreationPayload(state, action.payload.chatSessionId, questionAnswerId);
48
+ if (payload == null) {
49
+ return EMPTY;
50
+ }
51
+ const allUsersNow = readAllUsersAsUserArray(state);
52
+ if (allUsersNow.length > 0) {
53
+ return of(seedAiCardCreationFormDraft(allUsersNow, payload));
54
+ }
55
+ const seedWhenUsersLoaded$ = state$.pipe(map(readAllUsersAsUserArray), distinctUntilChanged((prev, next) => prev.length === next.length &&
56
+ prev.every((user, idx) => user === next[idx])), filter((users) => users.length > 0), take(1), map((users) => seedAiCardCreationFormDraft(users, payload)));
57
+ const userListFetchState = state.userListViewState.userListByType.cardHolderCandidate.fetchState;
58
+ if (userListFetchState === 'In-Progress') {
59
+ return seedWhenUsersLoaded$;
60
+ }
61
+ return concat(of(fetchUserListByType('cardHolderCandidate', false)), seedWhenUsersLoaded$);
62
+ }));
@@ -0,0 +1,44 @@
1
+ // V1: AI CFO only issues monthly business_virtual_credit_cards. Form has no
2
+ // frequency field; the unused physicalCard/debitCard slots are filled with
3
+ // empty defaults the epic ignores.
4
+ const DEFAULT_FREQUENCY = 'monthly';
5
+ const DEFAULT_CURRENCY_CODE = 'USD';
6
+ const DEFAULT_CURRENCY_SYMBOL = '$';
7
+ const mapCardRow = (row) => {
8
+ const ownerUserId = row.owner.selectedUser?.userId;
9
+ return {
10
+ lineId: row.id,
11
+ chargeCardType: 'credit_card',
12
+ creditCard: {
13
+ cardType: 'business_virtual_credit_card',
14
+ virtualCard: {
15
+ cardName: row.label,
16
+ frequency: DEFAULT_FREQUENCY,
17
+ userIds: ownerUserId != null ? [ownerUserId] : [],
18
+ amount: {
19
+ amount: row.recommendedLimit ?? 0,
20
+ currencyCode: DEFAULT_CURRENCY_CODE,
21
+ currencySymbol: DEFAULT_CURRENCY_SYMBOL,
22
+ },
23
+ },
24
+ physicalCard: {
25
+ cardName: '',
26
+ frequency: DEFAULT_FREQUENCY,
27
+ },
28
+ },
29
+ debitCard: {
30
+ cardType: 'business_virtual_debit_card',
31
+ virtualCard: {
32
+ cardName: '',
33
+ frequency: DEFAULT_FREQUENCY,
34
+ userIds: [],
35
+ },
36
+ physicalCard: {
37
+ cardName: '',
38
+ frequency: DEFAULT_FREQUENCY,
39
+ },
40
+ },
41
+ };
42
+ };
43
+ // Returns [] when `cardRows` is empty so callers can short-circuit submission.
44
+ export const toIssueChargeCardLocalDataFromDraft = (draft) => draft.cardRows.map(mapCardRow);
@@ -0,0 +1,58 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
3
+ import { isSuccessResponse } from '../../../../../responsePayload';
4
+ import { applyKybDocumentAutofillForOnboarding } from '../../../../onboardingView/customerView/onboardingCustomerViewReducer';
5
+ import { parseUploadedKybDocument, parseUploadedKybDocumentFailure, } from '../../kycKybAutofillActions';
6
+ import { mapCoiToCompanyDetails, mapTaxEinToCompanyDetails, } from '../../kycKybParseMapper';
7
+ import { applyKybDocumentAutofillForSetup } from '../../setupViewReducer';
8
+ const PROCESS_DOCUMENT_SYNC_PATH = '/1.0/documents/process/sync';
9
+ export const parseUploadedKybDocumentEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(parseUploadedKybDocument.match), mergeMap((action) => {
10
+ const { target, companyId, fileId, documentType } = action.payload;
11
+ const url = `${zeniAPI.apiEndPoints.communicationAgentMicroServiceBaseUrl}${PROCESS_DOCUMENT_SYNC_PATH}`;
12
+ const requestPayload = {
13
+ provided_document_type: documentType,
14
+ files: [{ file_id: fileId }],
15
+ processing_priority: 10,
16
+ metadata: { source: 'kyc_kyb_autofill' },
17
+ };
18
+ const failureAction = parseUploadedKybDocumentFailure({ target, fileId });
19
+ return zeniAPI
20
+ .postAndGetJSON(url, requestPayload)
21
+ .pipe(mergeMap((response) => {
22
+ if (!isSuccessResponse(response) || response.data == null) {
23
+ return of(failureAction);
24
+ }
25
+ // Sync API returns a batch envelope: `data.files[0].extracted_data`
26
+ // is the parser payload; `data` itself is the request-level wrapper.
27
+ const extracted = response.data.files?.[0]?.extracted_data;
28
+ if (extracted == null) {
29
+ return of(failureAction);
30
+ }
31
+ let result;
32
+ switch (documentType) {
33
+ case 'certificate_of_incorporation':
34
+ result = mapCoiToCompanyDetails(extracted);
35
+ break;
36
+ case 'tax_ein':
37
+ result = mapTaxEinToCompanyDetails(extracted);
38
+ break;
39
+ }
40
+ if (result.autoFilledFieldNames.length === 0) {
41
+ return of(failureAction);
42
+ }
43
+ const applyAction = target === 'setup'
44
+ ? applyKybDocumentAutofillForSetup({
45
+ companyId,
46
+ fileId,
47
+ values: result.values,
48
+ autoFilledFieldNames: result.autoFilledFieldNames,
49
+ })
50
+ : applyKybDocumentAutofillForOnboarding({
51
+ companyId,
52
+ fileId,
53
+ values: result.values,
54
+ autoFilledFieldNames: result.autoFilledFieldNames,
55
+ });
56
+ return of(applyAction);
57
+ }), catchError(() => of(failureAction)));
58
+ }));