@zeniai/client-epic-state 5.0.92-betaNB2 → 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 (289) 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/commonStateTypes/viewAndReport/agingReportStateTypes.d.ts +1 -1
  5. package/lib/entity/accountRecon/accountReconPayload.d.ts +1 -20
  6. package/lib/entity/accountRecon/accountReconPayload.js +1 -23
  7. package/lib/entity/accountRecon/accountReconSelector.d.ts +1 -6
  8. package/lib/entity/accountRecon/accountReconSelector.js +0 -5
  9. package/lib/entity/accountRecon/accountReconState.d.ts +0 -19
  10. package/lib/entity/aiCfo/aiCfoPayload.d.ts +63 -5
  11. package/lib/entity/aiCfo/aiCfoReducer.d.ts +23 -2
  12. package/lib/entity/aiCfo/aiCfoReducer.js +249 -9
  13. package/lib/entity/aiCfo/aiCfoSelector.d.ts +4 -1
  14. package/lib/entity/aiCfo/aiCfoSelector.js +19 -1
  15. package/lib/entity/aiCfo/aiCfoState.d.ts +97 -4
  16. package/lib/entity/aiCfo/aiCfoState.js +18 -1
  17. package/lib/entity/cardPolicy/cardPolicyPayload.d.ts +277 -0
  18. package/lib/entity/cardPolicy/cardPolicyPayload.js +143 -0
  19. package/lib/entity/cardPolicy/cardPolicyReducer.d.ts +19 -0
  20. package/lib/entity/cardPolicy/cardPolicyReducer.js +175 -0
  21. package/lib/entity/cardPolicy/cardPolicySelector.d.ts +32 -0
  22. package/lib/entity/cardPolicy/cardPolicySelector.js +99 -0
  23. package/lib/entity/cardPolicy/cardPolicyState.d.ts +205 -0
  24. package/lib/entity/cardPolicy/cardPolicyState.js +14 -0
  25. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.d.ts +18 -0
  26. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.js +68 -0
  27. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.d.ts +26 -0
  28. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +47 -0
  29. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.d.ts +25 -0
  30. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +39 -0
  31. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.d.ts +24 -0
  32. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.js +105 -0
  33. package/lib/entity/company/companyPayload.d.ts +4 -0
  34. package/lib/entity/company/companyPayload.js +4 -0
  35. package/lib/entity/company/companyStateTypes.d.ts +4 -0
  36. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +1 -1
  37. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksPayload.d.ts +0 -7
  38. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksPayload.js +0 -9
  39. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksState.d.ts +1 -8
  40. package/lib/entity/paymentAccount/paymentAccountSelector.d.ts +1 -0
  41. package/lib/entity/paymentAccount/paymentAccountSelector.js +4 -0
  42. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  43. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  44. package/lib/entity/tenant/clearAllEpic.d.ts +6 -2
  45. package/lib/entity/tenant/clearAllEpic.js +8 -0
  46. package/lib/entity/tenant/epic/deleteConnectionEpic.d.ts +1 -1
  47. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.d.ts +21 -0
  48. package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.js +54 -0
  49. package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.d.ts +1 -1
  50. package/lib/entity/tenant/epic/saveConnectorCredentialsEpic.d.ts +3 -3
  51. package/lib/entity/tenant/epic/saveOAuthConnectionEpic.d.ts +1 -1
  52. package/lib/entity/tenant/tenantPayload.d.ts +1 -0
  53. package/lib/entity/tenant/tenantReducer.d.ts +38 -25
  54. package/lib/entity/tenant/tenantReducer.js +65 -5
  55. package/lib/entity/tenant/tenantState.d.ts +1 -0
  56. package/lib/epic.d.ts +19 -3
  57. package/lib/epic.js +20 -3
  58. package/lib/esm/commonStateTypes/animations.js +1 -0
  59. package/lib/esm/entity/accountRecon/accountReconPayload.js +1 -23
  60. package/lib/esm/entity/accountRecon/accountReconSelector.js +0 -5
  61. package/lib/esm/entity/aiCfo/aiCfoReducer.js +249 -9
  62. package/lib/esm/entity/aiCfo/aiCfoSelector.js +17 -1
  63. package/lib/esm/entity/aiCfo/aiCfoState.js +15 -0
  64. package/lib/esm/entity/cardPolicy/cardPolicyPayload.js +130 -0
  65. package/lib/esm/entity/cardPolicy/cardPolicyReducer.js +171 -0
  66. package/lib/esm/entity/cardPolicy/cardPolicySelector.js +75 -0
  67. package/lib/esm/entity/cardPolicy/cardPolicyState.js +9 -0
  68. package/lib/esm/entity/cardPolicy/extractPolicyDocumentEpic.js +64 -0
  69. package/lib/esm/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +43 -0
  70. package/lib/esm/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +35 -0
  71. package/lib/esm/entity/cardPolicy/policyRecommendationFromUploadEpic.js +101 -0
  72. package/lib/esm/entity/company/companyPayload.js +4 -0
  73. package/lib/esm/entity/monthEndCloseChecks/monthEndCloseChecksPayload.js +0 -9
  74. package/lib/esm/entity/paymentAccount/paymentAccountSelector.js +3 -0
  75. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  76. package/lib/esm/entity/tenant/clearAllEpic.js +8 -0
  77. package/lib/esm/entity/tenant/epic/initEmailConnectOAuthEpic.js +50 -0
  78. package/lib/esm/entity/tenant/tenantReducer.js +63 -3
  79. package/lib/esm/epic.js +20 -3
  80. package/lib/esm/index.js +48 -15
  81. package/lib/esm/reducer.js +12 -0
  82. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +6 -3
  83. package/lib/esm/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
  84. package/lib/esm/view/aiCfoView/epics/createSessionEpic.js +2 -1
  85. package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
  86. package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +0 -73
  87. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +4 -98
  88. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +0 -20
  89. package/lib/esm/view/expenseAutomationView/types/reconciliationViewState.js +0 -20
  90. package/lib/esm/view/fileView/epic/deleteFileEpic.js +2 -2
  91. package/lib/esm/view/fileView/epic/deleteFileListEpic.js +2 -2
  92. package/lib/esm/view/fileView/epic/updateFileNameEpic.js +2 -2
  93. package/lib/esm/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +42 -0
  94. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +29 -0
  95. package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +40 -0
  96. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewReducer.js +217 -50
  97. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewSelector.js +7 -1
  98. package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewState.js +12 -0
  99. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +52 -0
  100. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +22 -0
  101. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +1 -0
  102. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +36 -0
  103. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +39 -0
  104. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +34 -0
  105. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +58 -0
  106. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +21 -0
  107. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +1 -0
  108. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +38 -0
  109. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +289 -0
  110. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +109 -0
  111. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +44 -0
  112. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +111 -0
  113. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +25 -0
  114. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +363 -0
  115. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +36 -0
  116. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +19 -0
  117. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +6 -0
  118. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +119 -0
  119. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +154 -0
  120. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +22 -0
  121. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +1 -0
  122. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +39 -0
  123. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +140 -0
  124. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +20 -0
  125. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +100 -0
  126. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +96 -0
  127. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +59 -0
  128. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +24 -0
  129. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +25 -0
  130. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +1 -0
  131. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +34 -0
  132. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +57 -0
  133. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +35 -0
  134. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +2 -2
  135. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +42 -4
  136. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +35 -0
  137. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +62 -0
  138. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +44 -0
  139. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +58 -0
  140. package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +67 -0
  141. package/lib/esm/view/spendManagement/commonSetup/kycKybAutofillActions.js +14 -0
  142. package/lib/esm/view/spendManagement/commonSetup/kycKybParseMapper.js +205 -0
  143. package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +105 -52
  144. package/lib/esm/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
  145. package/lib/esm/view/spendManagement/commonSetup/types/kycKybAutofill.js +28 -0
  146. package/lib/index.d.ts +57 -19
  147. package/lib/index.js +217 -37
  148. package/lib/reducer.d.ts +12 -0
  149. package/lib/reducer.js +12 -0
  150. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +11 -2
  151. package/lib/view/aiCfoView/aiCfoViewReducer.js +6 -3
  152. package/lib/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
  153. package/lib/view/aiCfoView/epics/createSessionEpic.js +2 -1
  154. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +8 -1
  155. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
  156. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  157. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +1 -83
  158. package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +0 -75
  159. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +3 -35
  160. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +5 -99
  161. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +1 -5
  162. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +0 -20
  163. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -129
  164. package/lib/view/expenseAutomationView/types/reconciliationViewState.js +0 -21
  165. package/lib/view/fileView/epic/deleteFileEpic.js +1 -1
  166. package/lib/view/fileView/epic/deleteFileListEpic.js +1 -1
  167. package/lib/view/fileView/epic/updateFileNameEpic.js +1 -1
  168. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.d.ts +7 -0
  169. package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +46 -0
  170. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.d.ts +8 -0
  171. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +33 -0
  172. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.d.ts +9 -0
  173. package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +44 -0
  174. package/lib/view/onboardingView/customerView/onboardingCustomerViewPayload.d.ts +3 -0
  175. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.d.ts +41 -4
  176. package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.js +219 -51
  177. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.d.ts +5 -1
  178. package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.js +11 -2
  179. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.d.ts +40 -0
  180. package/lib/view/onboardingView/customerView/onboardingCustomerViewState.js +13 -1
  181. package/lib/view/people/peopleTypes.d.ts +1 -1
  182. package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
  183. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.d.ts +14 -0
  184. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +56 -0
  185. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.d.ts +15 -0
  186. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +28 -0
  187. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.d.ts +8 -0
  188. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +2 -0
  189. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.d.ts +8 -0
  190. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +40 -0
  191. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.d.ts +8 -0
  192. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +43 -0
  193. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.d.ts +8 -0
  194. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +38 -0
  195. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.d.ts +15 -0
  196. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +62 -0
  197. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.d.ts +15 -0
  198. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +27 -0
  199. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.d.ts +7 -0
  200. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +2 -0
  201. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.d.ts +8 -0
  202. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +42 -0
  203. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.d.ts +8 -0
  204. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +294 -0
  205. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.d.ts +8 -0
  206. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +113 -0
  207. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.d.ts +9 -0
  208. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +48 -0
  209. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.d.ts +8 -0
  210. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +115 -0
  211. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.d.ts +13 -0
  212. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +29 -0
  213. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.d.ts +14 -0
  214. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +369 -0
  215. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.d.ts +6 -0
  216. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +40 -0
  217. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.d.ts +7 -0
  218. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +26 -0
  219. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.d.ts +116 -0
  220. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +10 -0
  221. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.d.ts +33 -0
  222. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +126 -0
  223. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.d.ts +52 -0
  224. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +158 -0
  225. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.d.ts +11 -0
  226. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +31 -0
  227. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.d.ts +12 -0
  228. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +2 -0
  229. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.d.ts +8 -0
  230. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +43 -0
  231. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.d.ts +10 -0
  232. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +144 -0
  233. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.d.ts +7 -0
  234. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +24 -0
  235. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.d.ts +11 -0
  236. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +104 -0
  237. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.d.ts +22 -0
  238. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +100 -0
  239. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.d.ts +8 -0
  240. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +63 -0
  241. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.d.ts +3 -0
  242. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +28 -0
  243. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  244. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.d.ts +14 -0
  245. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +27 -1
  246. package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.d.ts +34 -0
  247. package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +2 -0
  248. package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.d.ts +7 -0
  249. package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +38 -0
  250. package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.d.ts +12 -0
  251. package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +61 -0
  252. package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.d.ts +9 -0
  253. package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +39 -0
  254. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.d.ts +2 -2
  255. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +1 -1
  256. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.d.ts +12 -2
  257. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +43 -5
  258. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.d.ts +7 -0
  259. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +42 -1
  260. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardState.d.ts +5 -0
  261. package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.d.ts +11 -0
  262. package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +66 -0
  263. package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.d.ts +3 -0
  264. package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +48 -0
  265. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.d.ts +28 -0
  266. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +62 -0
  267. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.d.ts +30 -0
  268. package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +71 -0
  269. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.d.ts +33 -0
  270. package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.js +17 -0
  271. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.d.ts +24 -0
  272. package/lib/view/spendManagement/commonSetup/kycKybParseMapper.js +213 -0
  273. package/lib/view/spendManagement/commonSetup/setupViewReducer.d.ts +28 -2
  274. package/lib/view/spendManagement/commonSetup/setupViewReducer.js +106 -53
  275. package/lib/view/spendManagement/commonSetup/setupViewSelector.d.ts +7 -2
  276. package/lib/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
  277. package/lib/view/spendManagement/commonSetup/setupViewState.d.ts +19 -0
  278. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.d.ts +142 -0
  279. package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.js +32 -0
  280. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +1 -1
  281. package/lib/view/transactionDetail/journalEntryLinesViewModel.d.ts +1 -1
  282. package/lib/view/vendorFiling1099/vendorFiling1099List/vendorFiling1099ListState.d.ts +1 -1
  283. package/package.json +1 -1
  284. package/lib/esm/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +0 -34
  285. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +0 -42
  286. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.d.ts +0 -6
  287. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +0 -38
  288. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.d.ts +0 -19
  289. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +0 -46
@@ -32,5 +32,21 @@ export function getAiCfoSelectorView(state) {
32
32
  : [],
33
33
  }))
34
34
  .sort((a, b) => b.chatSession.createdAt.valueOf() - a.chatSession.createdAt.valueOf());
35
- return { allSessionsWithOrderedQuestionAnswers };
35
+ return {
36
+ allSessionsWithOrderedQuestionAnswers,
37
+ syntheticAnswersByChatSessionId: state.syntheticAnswersByChatSessionId ?? {},
38
+ };
39
+ }
40
+ export function getSyntheticAiCfoAnswersForChatSession(state, chatSessionId) {
41
+ const arr = state.syntheticAnswersByChatSessionId?.[chatSessionId] ?? [];
42
+ return arr
43
+ .slice()
44
+ .sort((a, b) => a.createdAt.valueOf() - b.createdAt.valueOf());
45
+ }
46
+ export function getSyntheticAiCfoAnswerByQuestionAnswerId(state, chatSessionId, questionAnswerId) {
47
+ const arr = state.syntheticAnswersByChatSessionId?.[chatSessionId];
48
+ if (arr == null) {
49
+ return undefined;
50
+ }
51
+ return arr.find((answer) => answer.sourceQuestionAnswerId === questionAnswerId);
36
52
  }
@@ -7,7 +7,14 @@ export const ALL_AI_CFO_CHARTS_TYPES = [
7
7
  export const ALL_AI_CFO_VISUALIZATION_TYPES = [
8
8
  ...ALL_AI_CFO_CHARTS_TYPES,
9
9
  'table',
10
+ 'interactive_form',
10
11
  ];
12
+ export const ALL_INTERACTIVE_FORM_TYPES = [
13
+ 'cards_creation',
14
+ 'card_policy',
15
+ ];
16
+ export const toInteractiveFormType = (v) => stringToUnion(v, ALL_INTERACTIVE_FORM_TYPES);
17
+ export const toInteractiveFormTypeStrict = (v) => stringToUnionStrict(v, ALL_INTERACTIVE_FORM_TYPES);
11
18
  export const toAiCfoVisualizationType = (v) => stringToUnion(v, ALL_AI_CFO_VISUALIZATION_TYPES);
12
19
  export const toAiCfoVisualizationTypeStrict = (v) => stringToUnionStrict(v, ALL_AI_CFO_VISUALIZATION_TYPES);
13
20
  export const toAiCfoChartType = (v) => stringToUnion(v, ALL_AI_CFO_CHARTS_TYPES);
@@ -58,3 +65,11 @@ export const toMessageSender = (v) => stringToUnion(v, ALL_MESSAGE_SENDERS);
58
65
  export const toMessageType = (v) => stringToUnion(v, ALL_MESSAGE_TYPES);
59
66
  export const toMessageSenderStrict = (v) => stringToUnionStrict(v, ALL_MESSAGE_SENDERS);
60
67
  export const toMessageTypeStrict = (v) => stringToUnionStrict(v, ALL_MESSAGE_TYPES);
68
+ // Client-synthesized AI CFO answer bubbles (Creating…/Created) pushed when the user
69
+ // submits an interactive form; not streamed from the backend.
70
+ export const ALL_SYNTHETIC_AI_CFO_ANSWER_KINDS = [
71
+ 'creating_cards',
72
+ 'creating_policy',
73
+ 'created_cards',
74
+ 'created_policy',
75
+ ];
@@ -0,0 +1,130 @@
1
+ import { date } from '../../zeniDayJS';
2
+ import { toCardPolicyTemplateMode, toCardPolicyTemplateStatus, } from './cardPolicyState';
3
+ export const toMccCategory = (payload) => ({
4
+ count: payload.count,
5
+ mccCodes: payload.mcc_codes ?? [],
6
+ name: payload.name,
7
+ });
8
+ export const toCardPolicyVendorSearchOption = (payload) => ({
9
+ vendorId: payload.vendor_id,
10
+ name: payload.vendor_name,
11
+ });
12
+ export const toCardPolicyStats = (payload) => ({
13
+ activePolicies: payload.active_policies,
14
+ totalCards: payload.total_cards,
15
+ totalTemplates: payload.total_templates,
16
+ });
17
+ export const toCardPolicyTemplateList = (data) => (data.templates ?? []).map((row) => toCardPolicyTemplate(row.data.template));
18
+ const toCardPolicyTemplateEntityList = (payload) => ({
19
+ categoryCodes: payload.category_codes ?? [],
20
+ merchantNames: payload.merchant_names ?? [],
21
+ });
22
+ export const toCardPolicyTemplate = (payload) => ({
23
+ allowedEntity: toCardPolicyTemplateEntityList(payload.allowed_entity),
24
+ appliedCards: payload.applied_cards ?? [],
25
+ blockedEntity: toCardPolicyTemplateEntityList(payload.blocked_entity),
26
+ cardsCount: payload.cards_count,
27
+ categoryRestrictions: payload.category_restrictions ?? [],
28
+ createdAt: date(payload.created_at),
29
+ createdBy: payload.created_by,
30
+ description: payload.description,
31
+ mode: toCardPolicyTemplateMode(payload.mode),
32
+ name: payload.name,
33
+ requiredReceiptThreshold: payload.required_receipt_threshold,
34
+ spendLimits: {
35
+ transaction: payload.spend_limits.transaction,
36
+ },
37
+ status: toCardPolicyTemplateStatus(payload.status),
38
+ templateId: payload.template_id,
39
+ tenantId: payload.tenant_id,
40
+ updatedAt: date(payload.updated_at),
41
+ });
42
+ /**
43
+ * Re-shape a single camelCase create request into the snake_case wire
44
+ * body. Used by the bulk-create mapper to build each entry of the
45
+ * `templates` array, and directly by the update epic (PUT) since the
46
+ * update endpoint still consumes a single object.
47
+ */
48
+ export const toCreateCardPolicyTemplateRequestBody = (request) => ({
49
+ allowed_entity: {
50
+ category_codes: request.allowedEntity.categoryCodes,
51
+ merchant_names: request.allowedEntity.merchantNames,
52
+ },
53
+ apply_to_cards: request.applyToCards,
54
+ blocked_entity: {
55
+ category_codes: request.blockedEntity.categoryCodes,
56
+ merchant_names: request.blockedEntity.merchantNames,
57
+ },
58
+ description: request.description,
59
+ mode: request.mode ?? 'strict',
60
+ name: request.name,
61
+ required_receipt_threshold: request.requiredReceiptThreshold,
62
+ spend_limits: {
63
+ transaction: request.spendLimits.transaction,
64
+ },
65
+ });
66
+ /**
67
+ * Re-shape a bulk create request into the snake_case wire body for
68
+ * `POST /cards/1.0/policy-templates`. Maps each entry through
69
+ * `toCreateCardPolicyTemplateRequestBody` and only emits
70
+ * `source_chat_session_id` when the camelCase counterpart is defined,
71
+ * so manual-create callers don't ship a stray `undefined` over the wire.
72
+ */
73
+ export const toCreateCardPolicyTemplatesRequestBody = (request) => {
74
+ const body = {
75
+ templates: request.templates.map(toCreateCardPolicyTemplateRequestBody),
76
+ };
77
+ if (request.sourceChatSessionId != null) {
78
+ body.source_chat_session_id = request.sourceChatSessionId;
79
+ }
80
+ return body;
81
+ };
82
+ /**
83
+ * Map a single bulk-response error payload to its camelCased view shape.
84
+ * Defensive against missing optional fields (see `BulkCreateCardPolicyTemplateErrorPayload`
85
+ * docstring — the BE contract isn't fully locked yet).
86
+ */
87
+ export const toBulkCreateCardPolicyTemplateError = (payload) => ({
88
+ message: payload.message,
89
+ code: payload.code,
90
+ index: payload.index,
91
+ name: payload.name,
92
+ });
93
+ // Update body uses the exact same wire shape as create — the PUT
94
+ // endpoint is a full replace and was not affected by the bulk migration.
95
+ export const toUpdateCardPolicyTemplateRequestBody = toCreateCardPolicyTemplateRequestBody;
96
+ /**
97
+ * Seed an edit-form draft (`CreateCardPolicyTemplateRequest`) from an
98
+ * existing camelCased `CardPolicyTemplate`. Used by the detail-fetch
99
+ * epic so the edit page can render with the saved values pre-populated.
100
+ */
101
+ export const toCardPolicyEditFormDraft = (template) => ({
102
+ allowedEntity: {
103
+ categoryCodes: [...template.allowedEntity.categoryCodes],
104
+ merchantNames: [...template.allowedEntity.merchantNames],
105
+ },
106
+ applyToCards: [...template.appliedCards],
107
+ blockedEntity: {
108
+ categoryCodes: [...template.blockedEntity.categoryCodes],
109
+ merchantNames: [...template.blockedEntity.merchantNames],
110
+ },
111
+ description: template.description,
112
+ mode: template.mode,
113
+ name: template.name,
114
+ requiredReceiptThreshold: template.requiredReceiptThreshold,
115
+ spendLimits: { transaction: template.spendLimits.transaction },
116
+ });
117
+ export const toExtractedCardPolicyRules = (payload) => ({
118
+ allowedEntity: {
119
+ categoryCodes: payload.allowed_entity?.category_codes ?? [],
120
+ merchantNames: payload.allowed_entity?.merchant_names ?? [],
121
+ },
122
+ blockedEntity: {
123
+ categoryCodes: payload.blocked_entity?.category_codes ?? [],
124
+ merchantNames: payload.blocked_entity?.merchant_names ?? [],
125
+ },
126
+ confidenceScore: payload.confidence_score,
127
+ policyName: payload.policy_name,
128
+ requiredReceiptThreshold: payload.required_receipt_threshold,
129
+ transactionLimit: payload.transaction_limit,
130
+ });
@@ -0,0 +1,171 @@
1
+ import { createSlice } from '@reduxjs/toolkit';
2
+ import { toCardPolicyTemplate, toCardPolicyVendorSearchOption, toExtractedCardPolicyRules, toMccCategory, } from './cardPolicyPayload';
3
+ // `buildVendorChipId(name)` calls `name.trim().toLowerCase()`; empty/whitespace names would crash or collapse into one colliding chip-id.
4
+ const isUsableMerchantName = (name) => typeof name === 'string' && name.trim() !== '';
5
+ const initialPolicyDocumentExtractionState = {
6
+ fetchState: 'Not-Started',
7
+ error: undefined,
8
+ extractedRules: undefined,
9
+ uploadedFileName: undefined,
10
+ };
11
+ const initialPolicyRecommendationFromUploadState = {
12
+ fetchState: 'Not-Started',
13
+ answerId: undefined,
14
+ chatSessionId: undefined,
15
+ error: undefined,
16
+ };
17
+ const initialVendorSearchState = {
18
+ fetchState: 'Not-Started',
19
+ searchString: '',
20
+ vendors: [],
21
+ error: undefined,
22
+ };
23
+ export const initialState = {
24
+ cardPolicyTemplateById: {},
25
+ mccCategories: [],
26
+ mccCategoriesError: undefined,
27
+ mccCategoriesFetchState: 'Not-Started',
28
+ policyDocumentExtraction: initialPolicyDocumentExtractionState,
29
+ policyRecommendationFromUpload: initialPolicyRecommendationFromUploadState,
30
+ suggestedAllowCategories: [],
31
+ suggestedAllowMerchants: [],
32
+ suggestedBlockCategories: [],
33
+ suggestedBlockMerchants: [],
34
+ vendorSearch: initialVendorSearchState,
35
+ cardPolicyStats: undefined,
36
+ };
37
+ const cardPolicy = createSlice({
38
+ name: 'cardPolicy',
39
+ initialState,
40
+ reducers: {
41
+ fetchCardPolicyMccCategories(draft) {
42
+ draft.mccCategoriesFetchState = 'In-Progress';
43
+ draft.mccCategoriesError = undefined;
44
+ },
45
+ updateCardPolicyMccCategories(draft, action) {
46
+ draft.mccCategories = (action.payload.categories ?? []).map(toMccCategory);
47
+ // BE-suggested seeds pre-populate the chip cloud; `isUsableMerchantName` drops names that would break `buildVendorChipId`.
48
+ draft.suggestedAllowMerchants = (action.payload.suggested_allow_merchants ?? []).filter(isUsableMerchantName);
49
+ draft.suggestedBlockMerchants = (action.payload.suggested_block_merchants ?? []).filter(isUsableMerchantName);
50
+ draft.suggestedAllowCategories = (action.payload.suggested_allow_catagories ?? []).map(toMccCategory);
51
+ draft.suggestedBlockCategories = (action.payload.suggested_block_catagories ?? []).map(toMccCategory);
52
+ draft.mccCategoriesFetchState = 'Completed';
53
+ draft.mccCategoriesError = undefined;
54
+ },
55
+ updateCardPolicyMccCategoriesFailure(draft, action) {
56
+ draft.mccCategoriesFetchState = 'Error';
57
+ draft.mccCategoriesError = action.payload;
58
+ },
59
+ updateCreatedCardPolicyTemplate(draft, action) {
60
+ const template = toCardPolicyTemplate(action.payload);
61
+ draft.cardPolicyTemplateById[template.templateId] = template;
62
+ },
63
+ // Full replace so server-side deletes evict locally too; the view slice owns the ordered ID list.
64
+ updateCardPolicyTemplates(draft, action) {
65
+ const byId = {};
66
+ for (const template of action.payload) {
67
+ byId[template.templateId] = template;
68
+ }
69
+ draft.cardPolicyTemplateById = byId;
70
+ },
71
+ removeCardPolicyTemplate(draft, action) {
72
+ delete draft.cardPolicyTemplateById[action.payload];
73
+ },
74
+ updateCardPolicyStats(draft, action) {
75
+ draft.cardPolicyStats = action.payload;
76
+ },
77
+ // Captures the first file name so the upload pill can render without callers retaining a File ref.
78
+ extractPolicyDocument: {
79
+ reducer(draft, action) {
80
+ draft.policyDocumentExtraction.fetchState = 'In-Progress';
81
+ draft.policyDocumentExtraction.error = undefined;
82
+ draft.policyDocumentExtraction.extractedRules = undefined;
83
+ draft.policyDocumentExtraction.uploadedFileName =
84
+ action.meta.uploadedFileName;
85
+ draft.policyDocumentExtraction.aiCfoAnswerId =
86
+ action.payload.aiCfoAnswerId;
87
+ draft.policyDocumentExtraction.aiCfoChatSessionId =
88
+ action.payload.aiCfoChatSessionId;
89
+ // Extraction + recommendation model one upload lifecycle; reset together so a re-upload doesn't read stale lifecycle from the prior chain.
90
+ draft.policyRecommendationFromUpload = {
91
+ ...initialPolicyRecommendationFromUploadState,
92
+ };
93
+ },
94
+ prepare(files, aiCfoAnswerId, aiCfoChatSessionId) {
95
+ return {
96
+ payload: { files, aiCfoAnswerId, aiCfoChatSessionId },
97
+ meta: { uploadedFileName: files[0]?.name },
98
+ };
99
+ },
100
+ },
101
+ updatePolicyDocumentExtractionSuccess(draft, action) {
102
+ draft.policyDocumentExtraction.fetchState = 'Completed';
103
+ draft.policyDocumentExtraction.error = undefined;
104
+ draft.policyDocumentExtraction.extractedRules =
105
+ toExtractedCardPolicyRules(action.payload);
106
+ },
107
+ updatePolicyDocumentExtractionFailure(draft, action) {
108
+ draft.policyDocumentExtraction.fetchState = 'Error';
109
+ draft.policyDocumentExtraction.error = action.payload;
110
+ draft.policyDocumentExtraction.extractedRules = undefined;
111
+ },
112
+ clearPolicyDocumentExtraction(draft) {
113
+ draft.policyDocumentExtraction = {
114
+ ...initialPolicyDocumentExtractionState,
115
+ };
116
+ // Pair with extractPolicyDocument: the two sub-slices reset and advance together.
117
+ draft.policyRecommendationFromUpload = {
118
+ ...initialPolicyRecommendationFromUploadState,
119
+ };
120
+ },
121
+ // Chained after extractPolicyDocument; epic merges the returned wizard plan into the AI CFO answer identified by answerId + chatSessionId.
122
+ fetchCardPolicyRecommendationFromUpload: {
123
+ reducer(draft, action) {
124
+ draft.policyRecommendationFromUpload.fetchState = 'In-Progress';
125
+ draft.policyRecommendationFromUpload.answerId = action.payload.answerId;
126
+ draft.policyRecommendationFromUpload.chatSessionId =
127
+ action.payload.chatSessionId;
128
+ draft.policyRecommendationFromUpload.error = undefined;
129
+ },
130
+ prepare(answerId, chatSessionId, extractedRules) {
131
+ return { payload: { answerId, chatSessionId, extractedRules } };
132
+ },
133
+ },
134
+ updatePolicyRecommendationFromUploadSuccess(draft) {
135
+ draft.policyRecommendationFromUpload.fetchState = 'Completed';
136
+ draft.policyRecommendationFromUpload.error = undefined;
137
+ },
138
+ updatePolicyRecommendationFromUploadFailure(draft, action) {
139
+ draft.policyRecommendationFromUpload.fetchState = 'Error';
140
+ draft.policyRecommendationFromUpload.error = action.payload;
141
+ },
142
+ // Empty searchString = top vendors by YTD spend; non-empty filters server-side.
143
+ fetchCardPolicyVendorOptions: {
144
+ reducer(draft, action) {
145
+ draft.vendorSearch.fetchState = 'In-Progress';
146
+ draft.vendorSearch.searchString = action.payload.searchString;
147
+ draft.vendorSearch.error = undefined;
148
+ },
149
+ prepare(searchString) {
150
+ return { payload: { searchString: searchString ?? '' } };
151
+ },
152
+ },
153
+ updateCardPolicyVendorOptions(draft, action) {
154
+ // Same `buildVendorChipId` guard as the suggested-merchants seeds above.
155
+ draft.vendorSearch.vendors = (action.payload.vendors ?? [])
156
+ .map(toCardPolicyVendorSearchOption)
157
+ .filter((vendor) => isUsableMerchantName(vendor.name));
158
+ draft.vendorSearch.fetchState = 'Completed';
159
+ draft.vendorSearch.error = undefined;
160
+ },
161
+ updateCardPolicyVendorOptionsFailure(draft, action) {
162
+ draft.vendorSearch.fetchState = 'Error';
163
+ draft.vendorSearch.error = action.payload;
164
+ },
165
+ clearCardPolicy(draft) {
166
+ Object.assign(draft, initialState);
167
+ },
168
+ },
169
+ });
170
+ export const { fetchCardPolicyMccCategories, fetchCardPolicyVendorOptions, updateCardPolicyMccCategories, updateCardPolicyMccCategoriesFailure, updateCardPolicyVendorOptions, updateCardPolicyVendorOptionsFailure, updateCreatedCardPolicyTemplate, updateCardPolicyTemplates, removeCardPolicyTemplate, updateCardPolicyStats, extractPolicyDocument, updatePolicyDocumentExtractionSuccess, updatePolicyDocumentExtractionFailure, clearPolicyDocumentExtraction, fetchCardPolicyRecommendationFromUpload, updatePolicyRecommendationFromUploadSuccess, updatePolicyRecommendationFromUploadFailure, clearCardPolicy, } = cardPolicy.actions;
171
+ export default cardPolicy.reducer;
@@ -0,0 +1,75 @@
1
+ export function getCardPolicyMccCategories(state) {
2
+ return state.mccCategories;
3
+ }
4
+ export function getCardPolicyMccCategoriesFetchState(state) {
5
+ return state.mccCategoriesFetchState;
6
+ }
7
+ export function getCardPolicyMccCategoriesError(state) {
8
+ return state.mccCategoriesError;
9
+ }
10
+ export function getCardPolicyTemplateById(state, templateId) {
11
+ return state.cardPolicyTemplateById[templateId];
12
+ }
13
+ export function getAllCardPolicyTemplates(state) {
14
+ return Object.values(state.cardPolicyTemplateById);
15
+ }
16
+ /**
17
+ * Resolve an ordered list of `templateId`s against the entity store and
18
+ * return the corresponding `CardPolicyTemplate[]` in the same order.
19
+ * Missing IDs (e.g. stale local state during a refetch) are silently
20
+ * dropped. Pair with `getCardPolicyTemplateIds` from the view slice to
21
+ * render the Policy List page in server order.
22
+ */
23
+ export function getCardPolicyTemplatesByIds(state, templateIds) {
24
+ return templateIds
25
+ .map((id) => state.cardPolicyTemplateById[id])
26
+ .filter((template) => template != null);
27
+ }
28
+ export function getCardPolicyStats(state) {
29
+ return state.cardPolicyStats;
30
+ }
31
+ export function getPolicyDocumentExtractionFetchState(state) {
32
+ return state.policyDocumentExtraction.fetchState;
33
+ }
34
+ export function getPolicyDocumentExtractionError(state) {
35
+ return state.policyDocumentExtraction.error;
36
+ }
37
+ export function getExtractedCardPolicyRules(state) {
38
+ return state.policyDocumentExtraction.extractedRules;
39
+ }
40
+ export function getUploadedPolicyDocumentFileName(state) {
41
+ return state.policyDocumentExtraction.uploadedFileName;
42
+ }
43
+ export function getPolicyRecommendationFromUploadFetchState(state) {
44
+ return state.policyRecommendationFromUpload.fetchState;
45
+ }
46
+ export function getPolicyRecommendationFromUploadError(state) {
47
+ return state.policyRecommendationFromUpload.error;
48
+ }
49
+ export function getPolicyRecommendationFromUploadAnswerId(state) {
50
+ return state.policyRecommendationFromUpload.answerId;
51
+ }
52
+ export function getPolicyRecommendationFromUploadChatSessionId(state) {
53
+ return state.policyRecommendationFromUpload.chatSessionId;
54
+ }
55
+ export function getCardPolicySuggestedAllowMerchants(state) {
56
+ return state.suggestedAllowMerchants;
57
+ }
58
+ export function getCardPolicySuggestedBlockMerchants(state) {
59
+ return state.suggestedBlockMerchants;
60
+ }
61
+ export function getCardPolicySuggestedAllowCategories(state) {
62
+ return state.suggestedAllowCategories;
63
+ }
64
+ export function getCardPolicySuggestedBlockCategories(state) {
65
+ return state.suggestedBlockCategories;
66
+ }
67
+ export function getCardPolicyVendorSearchOptions(state) {
68
+ return state.vendorSearch.vendors;
69
+ }
70
+ export function getCardPolicyVendorSearchFetchState(state) {
71
+ return state.vendorSearch.fetchState;
72
+ }
73
+ export function getCardPolicyVendorSearchString(state) {
74
+ return state.vendorSearch.searchString;
75
+ }
@@ -0,0 +1,9 @@
1
+ import { stringToUnion } from '../../commonStateTypes/stringToUnion';
2
+ export const ALL_CARD_POLICY_TEMPLATE_MODES = ['strict', 'flexible'];
3
+ export const toCardPolicyTemplateMode = (v) => stringToUnion(v, ALL_CARD_POLICY_TEMPLATE_MODES);
4
+ export const ALL_CARD_POLICY_TEMPLATE_STATUSES = [
5
+ 'active',
6
+ 'inactive',
7
+ 'archived',
8
+ ];
9
+ export const toCardPolicyTemplateStatus = (v) => stringToUnion(v, ALL_CARD_POLICY_TEMPLATE_STATUSES);
@@ -0,0 +1,64 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap, takeUntil } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessStatus } from '../../responsePayload';
4
+ import { clearPolicyDocumentExtraction, extractPolicyDocument, updatePolicyDocumentExtractionFailure, updatePolicyDocumentExtractionSuccess, } from './cardPolicyReducer';
5
+ /**
6
+ * Build a multipart `FormData` body for `POST /cards/1.0/policy-documents/extract`.
7
+ *
8
+ * Uses the same `attachment_file_<i>` / `attachment_json_<i>` field-naming
9
+ * convention as the charge-card receipt upload (`uploadReceipts.ts` in
10
+ * `web-components`) so backends that already support that wire shape
11
+ * accept this endpoint without bespoke parsing.
12
+ */
13
+ const buildPolicyDocumentFormData = (files) => {
14
+ const data = new FormData();
15
+ files.forEach((file, index) => {
16
+ data.append(`attachment_file_${index}`, file);
17
+ const attachmentJson = JSON.stringify({
18
+ file_name: file.name,
19
+ content_type: file.type,
20
+ size: file.size,
21
+ });
22
+ data.append(`attachment_json_${index}`, attachmentJson);
23
+ });
24
+ return data;
25
+ };
26
+ /**
27
+ * Listens for `extractPolicyDocument`, POSTs the file(s) as multipart
28
+ * form-data to the cards micro-service's policy-document extract endpoint,
29
+ * and dispatches success / failure into the entity slice.
30
+ *
31
+ * Consumed by:
32
+ * - Manual `CardPolicyCreatePage` (read result via
33
+ * `getExtractedCardPolicyRules` then pre-fill the RHF form via
34
+ * `applyExtractedPolicyRulesToFormValues` from `@zeniai/web-components`).
35
+ * - (Future) AI CFO upload surface — same action + selector contract.
36
+ */
37
+ export const extractPolicyDocumentEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(extractPolicyDocument.match),
38
+ // `switchMap` (vs `mergeMap`) cancels any in-flight extract whenever a
39
+ // new upload is dispatched. With `mergeMap` an older, slower response
40
+ // could win the race: `updatePolicyDocumentExtractionSuccess` would
41
+ // fire with stale `extractedRules` and the chained bridge epic would
42
+ // pair them with whatever `aiCfoAnswerId` / `aiCfoChatSessionId` are
43
+ // currently in state — recommending the old file's rules against the
44
+ // wrong AI CFO answer.
45
+ switchMap((action) => {
46
+ const formData = buildPolicyDocumentFormData(action.payload.files);
47
+ return zeniAPI
48
+ .postFormData(`${zeniAPI.apiEndPoints.cardMicroServiceBaseUrl}/1.0/policy-documents/extract`, formData)
49
+ .pipe(mergeMap((response) => {
50
+ if (isSuccessStatus(response) &&
51
+ response.data != null &&
52
+ response.data.extracted_rules != null) {
53
+ return of(updatePolicyDocumentExtractionSuccess(response.data.extracted_rules));
54
+ }
55
+ return of(updatePolicyDocumentExtractionFailure(response.status));
56
+ }), catchError((error) => of(updatePolicyDocumentExtractionFailure(createZeniAPIStatus('Unexpected Error', 'Extract card-policy document REST API call errored out' +
57
+ JSON.stringify(error))))),
58
+ // `clearPolicyDocumentExtraction` (e.g. user clicks the "× Policy.pdf"
59
+ // pill) tears down the in-flight extract subscription, so a late
60
+ // response can't re-flip `policyDocumentExtraction.fetchState` back
61
+ // to `Completed` or repopulate `extractedRules` after the user
62
+ // already dismissed the upload.
63
+ takeUntil(actions$.pipe(filter(clearPolicyDocumentExtraction.match))));
64
+ }));
@@ -0,0 +1,43 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, switchMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessStatus } from '../../responsePayload';
4
+ import { fetchCardPolicyVendorOptions, updateCardPolicyVendorOptions, updateCardPolicyVendorOptionsFailure, } from './cardPolicyReducer';
5
+ const buildQuery = (searchString) => ({
6
+ view: 'vendor_list',
7
+ page_token: null,
8
+ sort_by: 'year_to_date_spend',
9
+ sort_order: 'desc',
10
+ search_text: searchString,
11
+ vendor_name: searchString,
12
+ });
13
+ /**
14
+ * Card-policy vendor search.
15
+ *
16
+ * Listens for `fetchCardPolicyVendorOptions` and hits the same
17
+ * `/accounting/1.0/vendors` endpoint the Vendors-tab uses, but writes
18
+ * results onto the dedicated `cardPolicyState.vendorSearch` slice — no
19
+ * fan-out to the global `vendor` / `account` / `class` / `vendorList`
20
+ * entities. That isolation is important: the user may be configuring a
21
+ * card policy in parallel with browsing the Vendors tab, and we don't
22
+ * want either flow to clobber the other's list state.
23
+ *
24
+ * Uses `switchMap` so the latest typed search wins — earlier in-flight
25
+ * requests are abandoned, which is the right semantics for a
26
+ * search-as-you-type UX.
27
+ *
28
+ * Consumers:
29
+ * - Manual `CardPolicyCreate / EditScreen`
30
+ * - AI CFO `CardPolicyInteractiveForm` (vendor step)
31
+ */
32
+ export const fetchCardPolicyVendorOptionsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchCardPolicyVendorOptions.match), switchMap((action) => {
33
+ const query = buildQuery(action.payload.searchString);
34
+ const apiUrl = `${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/vendors` +
35
+ `?query=${encodeURIComponent(JSON.stringify(query))}`;
36
+ return zeniAPI.getJSON(apiUrl).pipe(switchMap((response) => {
37
+ if (isSuccessStatus(response) && response.data != null) {
38
+ return of(updateCardPolicyVendorOptions(response.data));
39
+ }
40
+ return of(updateCardPolicyVendorOptionsFailure(response.status));
41
+ }), catchError((error) => of(updateCardPolicyVendorOptionsFailure(createZeniAPIStatus('Unexpected Error', 'Fetch card policy vendor options REST API call errored out' +
42
+ JSON.stringify(error))))));
43
+ }));
@@ -0,0 +1,35 @@
1
+ import { EMPTY, of } from 'rxjs';
2
+ import { filter, mergeMap } from 'rxjs/operators';
3
+ import { fetchCardPolicyRecommendationFromUpload, updatePolicyDocumentExtractionSuccess, } from './cardPolicyReducer';
4
+ /**
5
+ * Bridge epic — chains the AI CFO `upload`-mode flow's two API hops.
6
+ *
7
+ * The first hop (`extractPolicyDocument` → multipart POST to
8
+ * `policy-documents/extract`) lives on the cardPolicy slice and is
9
+ * shared with the manual `CardPolicyCreatePage`. The second hop
10
+ * (`fetchCardPolicyRecommendationFromUpload` → JSON POST to
11
+ * `ai-cfo/policy-recommendation-from-upload`) is AI-CFO only.
12
+ *
13
+ * The chain is gated on `policyDocumentExtraction.aiCfoAnswerId` being
14
+ * populated — manual callers leave it undefined, so the bridge is a
15
+ * silent no-op there.
16
+ *
17
+ * Splitting this off from `policyRecommendationFromUploadEpic` keeps
18
+ * the wizard component a pure renderer: it dispatches
19
+ * `extractPolicyDocument(files, answerId, chatSessionId)` once, then
20
+ * subscribes to `cardPolicyState` lifecycle flags to drive its
21
+ * "Extracting…" / "Recommending…" pill.
22
+ */
23
+ export const policyDocumentExtractionToRecommendationBridgeEpic = (actions$, state$) => actions$.pipe(filter(updatePolicyDocumentExtractionSuccess.match), mergeMap((action) => {
24
+ const extraction = state$.value.cardPolicyState.policyDocumentExtraction;
25
+ const aiCfoAnswerId = extraction.aiCfoAnswerId;
26
+ const aiCfoChatSessionId = extraction.aiCfoChatSessionId;
27
+ const extractedRules = extraction.extractedRules;
28
+ if (aiCfoAnswerId == null ||
29
+ aiCfoChatSessionId == null ||
30
+ extractedRules == null) {
31
+ return EMPTY;
32
+ }
33
+ void action;
34
+ return of(fetchCardPolicyRecommendationFromUpload(aiCfoAnswerId, aiCfoChatSessionId, extractedRules));
35
+ }));