@zeniai/client-epic-state 5.0.96 → 5.0.97

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 (272) hide show
  1. package/lib/common/aiCfo/aiCfoSuggestedQuestionsPageContext.d.ts +1 -1
  2. package/lib/commonStateTypes/amount.d.ts +1 -0
  3. package/lib/commonStateTypes/amount.js +9 -1
  4. package/lib/commonStateTypes/workingDayHelper.d.ts +9 -0
  5. package/lib/commonStateTypes/workingDayHelper.js +28 -1
  6. package/lib/entity/aiCfo/aiCfoPayload.d.ts +63 -5
  7. package/lib/entity/aiCfo/aiCfoReducer.d.ts +23 -2
  8. package/lib/entity/aiCfo/aiCfoReducer.js +249 -9
  9. package/lib/entity/aiCfo/aiCfoSelector.d.ts +4 -1
  10. package/lib/entity/aiCfo/aiCfoSelector.js +19 -1
  11. package/lib/entity/aiCfo/aiCfoState.d.ts +97 -4
  12. package/lib/entity/aiCfo/aiCfoState.js +18 -1
  13. package/lib/entity/cardPolicy/cardPolicyPayload.d.ts +277 -0
  14. package/lib/entity/cardPolicy/cardPolicyPayload.js +143 -0
  15. package/lib/entity/cardPolicy/cardPolicyReducer.d.ts +19 -0
  16. package/lib/entity/cardPolicy/cardPolicyReducer.js +175 -0
  17. package/lib/entity/cardPolicy/cardPolicySelector.d.ts +32 -0
  18. package/lib/entity/cardPolicy/cardPolicySelector.js +99 -0
  19. package/lib/entity/cardPolicy/cardPolicyState.d.ts +205 -0
  20. package/lib/entity/cardPolicy/cardPolicyState.js +14 -0
  21. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.d.ts +18 -0
  22. package/lib/entity/cardPolicy/extractPolicyDocumentEpic.js +68 -0
  23. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.d.ts +26 -0
  24. package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +47 -0
  25. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.d.ts +25 -0
  26. package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +39 -0
  27. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.d.ts +24 -0
  28. package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.js +105 -0
  29. package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +1 -0
  30. package/lib/entity/jeSchedules/jeSchedulesPayload.js +7 -0
  31. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +2 -0
  32. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +1 -1
  33. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksState.d.ts +1 -1
  34. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  35. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  36. package/lib/entity/task/taskPayload.d.ts +3 -1
  37. package/lib/entity/task/taskPayload.js +2 -0
  38. package/lib/entity/task/taskState.d.ts +2 -0
  39. package/lib/entity/tenant/clearAllEpic.d.ts +8 -2
  40. package/lib/entity/tenant/clearAllEpic.js +12 -0
  41. package/lib/epic.d.ts +24 -3
  42. package/lib/epic.js +24 -3
  43. package/lib/esm/commonStateTypes/amount.js +7 -0
  44. package/lib/esm/commonStateTypes/workingDayHelper.js +26 -0
  45. package/lib/esm/entity/aiCfo/aiCfoReducer.js +249 -9
  46. package/lib/esm/entity/aiCfo/aiCfoSelector.js +17 -1
  47. package/lib/esm/entity/aiCfo/aiCfoState.js +15 -0
  48. package/lib/esm/entity/cardPolicy/cardPolicyPayload.js +130 -0
  49. package/lib/esm/entity/cardPolicy/cardPolicyReducer.js +171 -0
  50. package/lib/esm/entity/cardPolicy/cardPolicySelector.js +75 -0
  51. package/lib/esm/entity/cardPolicy/cardPolicyState.js +9 -0
  52. package/lib/esm/entity/cardPolicy/extractPolicyDocumentEpic.js +64 -0
  53. package/lib/esm/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +43 -0
  54. package/lib/esm/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +35 -0
  55. package/lib/esm/entity/cardPolicy/policyRecommendationFromUploadEpic.js +101 -0
  56. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +7 -0
  57. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  58. package/lib/esm/entity/task/taskPayload.js +2 -0
  59. package/lib/esm/entity/tenant/clearAllEpic.js +12 -0
  60. package/lib/esm/epic.js +24 -3
  61. package/lib/esm/index.js +47 -12
  62. package/lib/esm/reducer.js +18 -0
  63. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +6 -3
  64. package/lib/esm/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
  65. package/lib/esm/view/aiCfoView/epics/createSessionEpic.js +2 -1
  66. package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
  67. package/lib/esm/view/companyTaskManagerView/companyTaskManagerViewReducer.js +39 -11
  68. package/lib/esm/view/companyTaskManagerView/companyTaskManagerViewSelector.js +14 -4
  69. package/lib/esm/view/companyTaskManagerView/epics/fetchCockpitContextEpic.js +38 -0
  70. package/lib/esm/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +37 -28
  71. package/lib/esm/view/companyTaskManagerView/epics/updateCompanyTaskManagerViewFiltersEpic.js +16 -0
  72. package/lib/esm/view/companyView/epic/fetchAllCockpitViewsEpic.js +2 -2
  73. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +22 -2
  74. package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.js +29 -0
  75. package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.js +78 -0
  76. package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.js +47 -0
  77. package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.js +47 -0
  78. package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.js +34 -0
  79. package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.js +32 -0
  80. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.js +54 -0
  81. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.js +92 -0
  82. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.js +225 -0
  83. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.js +10 -0
  84. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.js +23 -0
  85. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.js +36 -0
  86. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.js +27 -0
  87. package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.js +28 -0
  88. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +52 -0
  89. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +22 -0
  90. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +1 -0
  91. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +36 -0
  92. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +39 -0
  93. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +34 -0
  94. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +58 -0
  95. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +21 -0
  96. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +1 -0
  97. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +38 -0
  98. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +289 -0
  99. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +109 -0
  100. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +44 -0
  101. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +111 -0
  102. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +25 -0
  103. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +363 -0
  104. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +36 -0
  105. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +19 -0
  106. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +6 -0
  107. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +119 -0
  108. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +154 -0
  109. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +22 -0
  110. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +1 -0
  111. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +39 -0
  112. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +140 -0
  113. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +20 -0
  114. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +100 -0
  115. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +96 -0
  116. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +59 -0
  117. package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +24 -0
  118. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +25 -0
  119. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +1 -0
  120. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +34 -0
  121. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +57 -0
  122. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +35 -0
  123. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +2 -2
  124. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +42 -4
  125. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +35 -0
  126. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +62 -0
  127. package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +44 -0
  128. package/lib/index.d.ts +59 -15
  129. package/lib/index.js +213 -22
  130. package/lib/reducer.d.ts +18 -0
  131. package/lib/reducer.js +18 -0
  132. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +11 -2
  133. package/lib/view/aiCfoView/aiCfoViewReducer.js +6 -3
  134. package/lib/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
  135. package/lib/view/aiCfoView/epics/createSessionEpic.js +2 -1
  136. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +8 -1
  137. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
  138. package/lib/view/companyTaskManagerView/companyTaskManagerViewPayload.d.ts +19 -11
  139. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +10 -4
  140. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.js +40 -12
  141. package/lib/view/companyTaskManagerView/companyTaskManagerViewSelector.d.ts +2 -0
  142. package/lib/view/companyTaskManagerView/companyTaskManagerViewSelector.js +13 -3
  143. package/lib/view/companyTaskManagerView/companyTaskManagerViewState.d.ts +11 -3
  144. package/lib/view/companyTaskManagerView/epics/fetchCockpitContextEpic.d.ts +10 -0
  145. package/lib/view/companyTaskManagerView/epics/fetchCockpitContextEpic.js +42 -0
  146. package/lib/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.d.ts +1 -3
  147. package/lib/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +37 -28
  148. package/lib/view/companyTaskManagerView/epics/updateCompanyTaskManagerViewFiltersEpic.d.ts +6 -0
  149. package/lib/view/companyTaskManagerView/epics/updateCompanyTaskManagerViewFiltersEpic.js +20 -0
  150. package/lib/view/companyView/epic/fetchAllCockpitViewsEpic.js +2 -2
  151. package/lib/view/companyView/types/cockpitTypes.d.ts +2 -1
  152. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  153. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
  154. package/lib/view/people/peopleTypes.d.ts +1 -1
  155. package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
  156. package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.d.ts +8 -1
  157. package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +21 -1
  158. package/lib/view/spendManagement/autotransferRules/autoTransferRulesState.d.ts +22 -0
  159. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.d.ts +47 -0
  160. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.js +34 -0
  161. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.d.ts +23 -0
  162. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.js +82 -0
  163. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.d.ts +40 -0
  164. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.js +51 -0
  165. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.d.ts +37 -0
  166. package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.js +53 -0
  167. package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.d.ts +14 -0
  168. package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.js +38 -0
  169. package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.d.ts +7 -0
  170. package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.js +36 -0
  171. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.d.ts +56 -0
  172. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.js +60 -0
  173. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.d.ts +22 -0
  174. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.js +96 -0
  175. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.d.ts +59 -0
  176. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.js +230 -0
  177. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.d.ts +122 -0
  178. package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.js +13 -0
  179. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.d.ts +7 -0
  180. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.js +27 -0
  181. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.d.ts +9 -0
  182. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.js +40 -0
  183. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.d.ts +7 -0
  184. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.js +31 -0
  185. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.d.ts +15 -0
  186. package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.js +32 -0
  187. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.d.ts +14 -0
  188. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +56 -0
  189. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.d.ts +15 -0
  190. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +28 -0
  191. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.d.ts +8 -0
  192. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +2 -0
  193. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.d.ts +8 -0
  194. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +40 -0
  195. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.d.ts +8 -0
  196. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +43 -0
  197. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.d.ts +8 -0
  198. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +38 -0
  199. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.d.ts +15 -0
  200. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +62 -0
  201. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.d.ts +15 -0
  202. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +27 -0
  203. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.d.ts +7 -0
  204. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +2 -0
  205. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.d.ts +8 -0
  206. package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +42 -0
  207. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.d.ts +8 -0
  208. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +294 -0
  209. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.d.ts +8 -0
  210. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +113 -0
  211. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.d.ts +9 -0
  212. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +48 -0
  213. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.d.ts +8 -0
  214. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +115 -0
  215. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.d.ts +13 -0
  216. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +29 -0
  217. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.d.ts +14 -0
  218. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +369 -0
  219. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.d.ts +6 -0
  220. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +40 -0
  221. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.d.ts +7 -0
  222. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +26 -0
  223. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.d.ts +116 -0
  224. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +10 -0
  225. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.d.ts +33 -0
  226. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +126 -0
  227. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.d.ts +52 -0
  228. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +158 -0
  229. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.d.ts +11 -0
  230. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +31 -0
  231. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.d.ts +12 -0
  232. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +2 -0
  233. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.d.ts +8 -0
  234. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +43 -0
  235. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.d.ts +10 -0
  236. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +144 -0
  237. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.d.ts +7 -0
  238. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +24 -0
  239. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.d.ts +11 -0
  240. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +104 -0
  241. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.d.ts +22 -0
  242. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +100 -0
  243. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.d.ts +8 -0
  244. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +63 -0
  245. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.d.ts +3 -0
  246. package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +28 -0
  247. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  248. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.d.ts +14 -0
  249. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +27 -1
  250. package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.d.ts +34 -0
  251. package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +2 -0
  252. package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.d.ts +7 -0
  253. package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +38 -0
  254. package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.d.ts +12 -0
  255. package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +61 -0
  256. package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.d.ts +9 -0
  257. package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +39 -0
  258. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.d.ts +2 -2
  259. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +1 -1
  260. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.d.ts +12 -2
  261. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +43 -5
  262. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.d.ts +7 -0
  263. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +42 -1
  264. package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardState.d.ts +5 -0
  265. package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.d.ts +11 -0
  266. package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +66 -0
  267. package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.d.ts +3 -0
  268. package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +48 -0
  269. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +1 -1
  270. package/lib/view/transactionDetail/journalEntryLinesViewModel.d.ts +1 -1
  271. package/lib/zeniAPI.d.ts +1 -0
  272. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ import { buildMccCategoryChipId, buildVendorChipId } from './cardPolicyChipIds';
2
+ import { CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION, } from './cardPolicyFormDraftTypes';
3
+ // Mirrors the AI variant plus name overwrite from `extracted.policyName`;
4
+ // description / mode / cardSelections are preserved (extract API doesn't return them).
5
+ export const applyExtractedPolicyToManualCardPolicyDraft = ({ extracted, current, vendorSearchOptions, categorySearchOptions, }) => ({
6
+ ...current,
7
+ name: extracted.policyName ?? current.name,
8
+ description: current.description,
9
+ vendorPolicy: buildAllowBlockField({
10
+ allowList: extracted.allowedEntity.merchantNames,
11
+ blockList: extracted.blockedEntity.merchantNames,
12
+ currentAllowItems: current.vendorPolicy.allowItems,
13
+ currentBlockItems: current.vendorPolicy.blockItems,
14
+ universe: vendorSearchOptions,
15
+ matchOnCode: false,
16
+ }),
17
+ categoryPolicy: buildAllowBlockField({
18
+ allowList: extracted.allowedEntity.categoryCodes,
19
+ blockList: extracted.blockedEntity.categoryCodes,
20
+ currentAllowItems: current.categoryPolicy.allowItems,
21
+ currentBlockItems: current.categoryPolicy.blockItems,
22
+ universe: categorySearchOptions,
23
+ matchOnCode: true,
24
+ }),
25
+ limits: buildLimitRows({
26
+ current: current.limits,
27
+ transactionLimit: extracted.transactionLimit,
28
+ requiredReceiptThreshold: extracted.requiredReceiptThreshold,
29
+ }),
30
+ });
31
+ const buildAllowBlockField = ({ allowList, blockList, currentAllowItems, currentBlockItems, universe, matchOnCode, }) => {
32
+ const allowItems = buildSideItems({
33
+ selectedValues: allowList,
34
+ currentItems: currentAllowItems,
35
+ universe,
36
+ matchOnCode,
37
+ });
38
+ const blockItems = buildSideItems({
39
+ selectedValues: blockList,
40
+ currentItems: currentBlockItems,
41
+ universe,
42
+ matchOnCode,
43
+ });
44
+ const mode = allowList.length === 0 && blockList.length > 0 ? 'block' : 'allow';
45
+ return { mode, allowItems, blockItems };
46
+ };
47
+ const buildSideItems = ({ selectedValues, currentItems, universe, matchOnCode, }) => {
48
+ const selectedKeys = new Set(selectedValues
49
+ .map((value) => normalizeKey(value))
50
+ .filter((key) => key != null));
51
+ const items = [];
52
+ const seenIds = new Set();
53
+ for (const item of currentItems) {
54
+ const key = normalizeKey(matchOnCode ? item.optionalCode : item.label);
55
+ const isSelected = key != null && selectedKeys.has(key);
56
+ items.push({ ...item, isSelected });
57
+ seenIds.add(item.id);
58
+ if (isSelected && key != null) {
59
+ selectedKeys.delete(key);
60
+ }
61
+ }
62
+ for (const option of universe) {
63
+ if (selectedKeys.size === 0) {
64
+ break;
65
+ }
66
+ const key = normalizeKey(matchOnCode ? option.optionalCode : option.label);
67
+ if (key == null || !selectedKeys.has(key) || seenIds.has(option.id)) {
68
+ continue;
69
+ }
70
+ items.push({ ...option, isSelected: true });
71
+ seenIds.add(option.id);
72
+ selectedKeys.delete(key);
73
+ }
74
+ for (const value of selectedValues) {
75
+ const key = normalizeKey(value);
76
+ if (key == null || !selectedKeys.has(key)) {
77
+ continue;
78
+ }
79
+ const id = matchOnCode
80
+ ? buildMccCategoryChipId(value)
81
+ : buildVendorChipId(value);
82
+ if (seenIds.has(id)) {
83
+ continue;
84
+ }
85
+ items.push({
86
+ id,
87
+ label: value,
88
+ isSelected: true,
89
+ ...(matchOnCode ? { optionalCode: value } : {}),
90
+ });
91
+ seenIds.add(id);
92
+ selectedKeys.delete(key);
93
+ }
94
+ return items;
95
+ };
96
+ const buildLimitRows = ({ current, transactionLimit, requiredReceiptThreshold, }) => current.map((row) => {
97
+ if (row.id === CARD_POLICY_LIMIT_ROW_ID_TRANSACTION) {
98
+ return amountToLimitRow(row, transactionLimit);
99
+ }
100
+ if (row.id === CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT) {
101
+ return amountToLimitRow(row, requiredReceiptThreshold);
102
+ }
103
+ return row;
104
+ });
105
+ const amountToLimitRow = (row, amount) => {
106
+ if (amount > 0) {
107
+ return { ...row, isEnabled: true, amount };
108
+ }
109
+ return { ...row, isEnabled: false, amount: row.amount };
110
+ };
111
+ const normalizeKey = (value) => value == null || value.length === 0 ? undefined : value.toLowerCase().trim();
@@ -0,0 +1,25 @@
1
+ import { buildUploadReviewRows } from './buildAiCardPolicyFormDraftSeed';
2
+ // Re-derives Step 5 review from a fresh `wizardPlan` while preserving the
3
+ // user's Step 2 `cardSelections` and Step 1 `limits`. No-op outside upload mode.
4
+ export const applyUploadPlanToAiCardPolicyDraft = ({ current, context, wizardPlan, source, }) => {
5
+ if (current.policyKind !== 'upload') {
6
+ return { draft: current, context };
7
+ }
8
+ const policiesReview = buildUploadReviewRows(wizardPlan.step5Review.draftPolicies, context.cardsMasterList, context.categorySearchOptions);
9
+ return {
10
+ draft: {
11
+ ...current,
12
+ policiesReview,
13
+ },
14
+ context: {
15
+ ...context,
16
+ wizardPlan,
17
+ source: source ?? context.source,
18
+ suggestedPoliciesSeed: wizardPlan.step5Review.draftPolicies.map((draft) => ({
19
+ id: draft.id,
20
+ name: draft.name,
21
+ isChecked: true,
22
+ })),
23
+ },
24
+ };
25
+ };
@@ -0,0 +1,363 @@
1
+ import { buildVendorChipId, toMccCategoryChipFieldValue, toVendorChipFieldValue, } from './cardPolicyChipIds';
2
+ import { CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT, CARD_POLICY_LIMIT_ROW_ID_TRANSACTION, } from './cardPolicyFormDraftTypes';
3
+ const EMPTY_ALLOW_BLOCK = {
4
+ mode: 'allow',
5
+ allowItems: [],
6
+ blockItems: [],
7
+ };
8
+ const EMPTY_FORM_VALUES = {
9
+ vendorPolicy: EMPTY_ALLOW_BLOCK,
10
+ categoryPolicy: EMPTY_ALLOW_BLOCK,
11
+ cardSelections: [],
12
+ limits: [],
13
+ policiesReview: [],
14
+ };
15
+ export const buildEmptyLimitRows = () => [
16
+ { id: CARD_POLICY_LIMIT_ROW_ID_TRANSACTION, isEnabled: false },
17
+ { id: CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT, isEnabled: false },
18
+ ];
19
+ // Build the initial draft + seed context per `policyKind`:
20
+ // - auto: 1-step review with chip groups built eagerly from `draftPolicies`.
21
+ // - guided: 5-step wizard; Steps 1–4 from `draftPolicies[0]`, review re-derived.
22
+ // - upload: empty scaffold pre-recommendation; post-recommendation seeds review.
23
+ export const buildAiCardPolicyFormDraftSeed = ({ initialData, cardsMasterList = [], categorySearchOptions, suggestedAllowMerchants, suggestedBlockMerchants, suggestedAllowCategories, suggestedBlockCategories, }) => {
24
+ const suggestedPoliciesSeed = buildSuggestedPoliciesSeed(initialData);
25
+ const wizardPlan = 'wizardPlan' in initialData ? initialData.wizardPlan : undefined;
26
+ const source = initialData.policyKind === 'upload' ? initialData.source : undefined;
27
+ const context = {
28
+ policyKind: initialData.policyKind,
29
+ cardsMasterList,
30
+ categorySearchOptions: categorySearchOptions ?? [],
31
+ suggestedAllowMerchants,
32
+ suggestedBlockMerchants,
33
+ suggestedAllowCategories,
34
+ suggestedBlockCategories,
35
+ suggestedPoliciesSeed,
36
+ wizardPlan,
37
+ source,
38
+ };
39
+ const draft = buildDraftFromInitialData({
40
+ initialData,
41
+ cardsMasterList,
42
+ categorySearchOptions,
43
+ suggestedAllowMerchants,
44
+ suggestedBlockMerchants,
45
+ suggestedAllowCategories,
46
+ suggestedBlockCategories,
47
+ });
48
+ return { draft, context };
49
+ };
50
+ const buildDraftFromInitialData = ({ initialData, cardsMasterList, categorySearchOptions, suggestedAllowMerchants, suggestedBlockMerchants, suggestedAllowCategories, suggestedBlockCategories, }) => {
51
+ const vendorAllowSeed = merchantsToChips(suggestedAllowMerchants);
52
+ const vendorBlockSeed = merchantsToChips(suggestedBlockMerchants);
53
+ const categoryAllowSeed = categoriesToChips(suggestedAllowCategories);
54
+ const categoryBlockSeed = categoriesToChips(suggestedBlockCategories);
55
+ if (initialData.policyKind === 'auto') {
56
+ const autoDraftPolicies = initialData.wizardPlan?.step5Review?.draftPolicies ?? [];
57
+ return {
58
+ ...EMPTY_FORM_VALUES,
59
+ policyKind: 'auto',
60
+ policiesReview: buildAutoReviewRows(autoDraftPolicies, cardsMasterList, categorySearchOptions),
61
+ };
62
+ }
63
+ if (initialData.policyKind === 'upload') {
64
+ const uploadDraftPolicies = initialData.wizardPlan?.step5Review?.draftPolicies;
65
+ if (uploadDraftPolicies == null) {
66
+ return {
67
+ ...EMPTY_FORM_VALUES,
68
+ policyKind: 'upload',
69
+ cardSelections: cardsMasterList.map((row) => ({
70
+ ...row,
71
+ isChecked: false,
72
+ })),
73
+ limits: buildEmptyLimitRows(),
74
+ };
75
+ }
76
+ return {
77
+ ...EMPTY_FORM_VALUES,
78
+ policyKind: 'upload',
79
+ cardSelections: cardsMasterList.map((row) => ({
80
+ ...row,
81
+ isChecked: false,
82
+ })),
83
+ limits: buildEmptyLimitRows(),
84
+ policiesReview: buildUploadReviewRows(uploadDraftPolicies, cardsMasterList, categorySearchOptions),
85
+ };
86
+ }
87
+ // Guided
88
+ const draftPolicies = initialData.wizardPlan?.step5Review?.draftPolicies ?? [];
89
+ const primary = draftPolicies[0];
90
+ if (primary == null) {
91
+ return {
92
+ policyKind: 'guided',
93
+ vendorPolicy: buildAllowBlockFromSeeds(vendorAllowSeed, vendorBlockSeed),
94
+ categoryPolicy: buildAllowBlockFromSeeds(categoryAllowSeed, categoryBlockSeed),
95
+ cardSelections: cardsMasterList.map((row) => ({
96
+ ...row,
97
+ isChecked: false,
98
+ })),
99
+ limits: buildEmptyLimitRows(),
100
+ policiesReview: [],
101
+ };
102
+ }
103
+ const mccCodeToCategory = buildMccCodeToCategoryMap(categorySearchOptions);
104
+ const vendorMode = inferAllowBlockMode(primary.allowedEntity.merchantNames.length, primary.blockedEntity.merchantNames.length);
105
+ const aiVendorAllow = draftMerchantsToChips(primary.allowedEntity.merchantNames);
106
+ const aiVendorBlock = draftMerchantsToChips(primary.blockedEntity.merchantNames);
107
+ const vendorPolicy = {
108
+ mode: vendorMode,
109
+ allowItems: mergeAiAndSeedChips(aiVendorAllow, vendorAllowSeed),
110
+ blockItems: mergeAiAndSeedChips(aiVendorBlock, vendorBlockSeed),
111
+ };
112
+ const categoryMode = inferAllowBlockMode(primary.allowedEntity.categoryCodes.length, primary.blockedEntity.categoryCodes.length);
113
+ const aiCategoryAllow = draftCategoryCodesToChips(primary.allowedEntity.categoryCodes, mccCodeToCategory);
114
+ const aiCategoryBlock = draftCategoryCodesToChips(primary.blockedEntity.categoryCodes, mccCodeToCategory);
115
+ const categoryPolicy = {
116
+ mode: categoryMode,
117
+ allowItems: mergeAiAndSeedChips(aiCategoryAllow, categoryAllowSeed),
118
+ blockItems: mergeAiAndSeedChips(aiCategoryBlock, categoryBlockSeed),
119
+ };
120
+ const cardSelections = cardsMasterList.map((row) => ({
121
+ ...row,
122
+ isChecked: primary.applyToCards.includes(row.id),
123
+ }));
124
+ const limits = [
125
+ {
126
+ id: CARD_POLICY_LIMIT_ROW_ID_TRANSACTION,
127
+ isEnabled: primary.spendLimits.transaction > 0,
128
+ amount: primary.spendLimits.transaction > 0
129
+ ? primary.spendLimits.transaction
130
+ : undefined,
131
+ },
132
+ {
133
+ id: CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT,
134
+ isEnabled: primary.requiredReceiptThreshold > 0,
135
+ amount: primary.requiredReceiptThreshold > 0
136
+ ? primary.requiredReceiptThreshold
137
+ : undefined,
138
+ },
139
+ ];
140
+ return {
141
+ policyKind: 'guided',
142
+ vendorPolicy,
143
+ categoryPolicy,
144
+ cardSelections,
145
+ limits,
146
+ policiesReview: draftPolicies.map((p) => ({
147
+ id: p.id,
148
+ isChecked: true,
149
+ name: p.name,
150
+ chipGroups: [],
151
+ })),
152
+ };
153
+ };
154
+ const buildSuggestedPoliciesSeed = (initialData) => (initialData.wizardPlan?.step5Review?.draftPolicies ?? []).map((draft) => ({
155
+ id: draft.id,
156
+ name: draft.name,
157
+ isChecked: true,
158
+ }));
159
+ const merchantsToChips = (names) => (names ?? []).map((name) => toVendorChipFieldValue(name, false));
160
+ const categoriesToChips = (categories) => (categories ?? []).map((category) => toMccCategoryChipFieldValue(category, false));
161
+ const buildAllowBlockFromSeeds = (allowItems, blockItems) => {
162
+ if (allowItems.length === 0 && blockItems.length === 0) {
163
+ return EMPTY_ALLOW_BLOCK;
164
+ }
165
+ return { mode: 'allow', allowItems, blockItems };
166
+ };
167
+ const buildMccCodeToCategoryMap = (categories) => {
168
+ const map = new Map();
169
+ for (const category of categories ?? []) {
170
+ for (const code of category.mccCodes) {
171
+ if (!map.has(code)) {
172
+ map.set(code, category);
173
+ }
174
+ }
175
+ }
176
+ return map;
177
+ };
178
+ const buildOwnerSummaries = (cardIds, cardsMasterList) => {
179
+ const cardsById = new Map(cardsMasterList.map((card) => [card.id, card]));
180
+ const summaries = new Map();
181
+ for (const cardId of cardIds) {
182
+ const card = cardsById.get(cardId);
183
+ if (card == null) {
184
+ continue;
185
+ }
186
+ const existing = summaries.get(card.owner.userId);
187
+ if (existing != null) {
188
+ existing.cardIds.push(cardId);
189
+ continue;
190
+ }
191
+ summaries.set(card.owner.userId, {
192
+ userId: card.owner.userId,
193
+ displayName: card.owner.displayName,
194
+ cardIds: [cardId],
195
+ });
196
+ }
197
+ return Array.from(summaries.values());
198
+ };
199
+ const buildAutoReviewChipGroupsForDraft = (draft, cardsMasterList, mccCodeToCategory) => {
200
+ const groups = [];
201
+ if (draft.allowedEntity.merchantNames.length > 0) {
202
+ groups.push({
203
+ id: 'allowed-vendors',
204
+ label: 'Allowed Vendors',
205
+ chips: draft.allowedEntity.merchantNames.map((name) => ({
206
+ id: buildVendorChipId(name),
207
+ label: name,
208
+ chipKind: 'positive',
209
+ isSelected: true,
210
+ })),
211
+ });
212
+ }
213
+ if (draft.blockedEntity.merchantNames.length > 0) {
214
+ groups.push({
215
+ id: 'blocked-vendors',
216
+ label: 'Blocked Vendors',
217
+ chips: draft.blockedEntity.merchantNames.map((name) => ({
218
+ id: buildVendorChipId(name),
219
+ label: name,
220
+ chipKind: 'negative',
221
+ isSelected: true,
222
+ })),
223
+ });
224
+ }
225
+ if (draft.allowedEntity.categoryCodes.length > 0) {
226
+ groups.push({
227
+ id: 'allowed-categories',
228
+ label: 'Allowed Categories',
229
+ chips: draft.allowedEntity.categoryCodes.map((code) => {
230
+ const category = mccCodeToCategory.get(code);
231
+ const label = category != null ? `${category.name} (${code})` : code;
232
+ return {
233
+ id: code,
234
+ label,
235
+ chipKind: 'positive',
236
+ isSelected: true,
237
+ optionalCode: code,
238
+ };
239
+ }),
240
+ });
241
+ }
242
+ if (draft.blockedEntity.categoryCodes.length > 0) {
243
+ groups.push({
244
+ id: 'restricted-categories',
245
+ label: 'Restricted Categories',
246
+ chips: draft.blockedEntity.categoryCodes.map((code) => {
247
+ const category = mccCodeToCategory.get(code);
248
+ const label = category != null ? `${category.name} (${code})` : code;
249
+ return {
250
+ id: code,
251
+ label,
252
+ chipKind: 'negative',
253
+ isSelected: true,
254
+ optionalCode: code,
255
+ };
256
+ }),
257
+ });
258
+ }
259
+ if (draft.applyToCards.length > 0) {
260
+ const owners = buildOwnerSummaries(draft.applyToCards, cardsMasterList);
261
+ if (owners.length > 0) {
262
+ groups.push({
263
+ id: 'applied-to-cards',
264
+ label: 'Applied to Cards',
265
+ chips: owners.map((owner) => ({
266
+ id: owner.userId,
267
+ label: owner.displayName,
268
+ chipKind: 'avatar',
269
+ cardIds: owner.cardIds,
270
+ isSelected: true,
271
+ })),
272
+ });
273
+ }
274
+ }
275
+ return groups;
276
+ };
277
+ const buildAutoReviewRows = (draftPolicies, cardsMasterList, categorySearchOptions) => {
278
+ const mccCodeToCategory = buildMccCodeToCategoryMap(categorySearchOptions);
279
+ return draftPolicies.map((draft) => ({
280
+ id: draft.id,
281
+ isChecked: true,
282
+ name: draft.name,
283
+ chipGroups: buildAutoReviewChipGroupsForDraft(draft, cardsMasterList, mccCodeToCategory),
284
+ }));
285
+ };
286
+ // Numeric value stashed on `optionalCode` so the bulk-submit builder can
287
+ // recover it without re-parsing the label.
288
+ const buildUploadLimitsChipGroup = (draft) => {
289
+ const transactionEnabled = draft.spendLimits.transaction > 0;
290
+ const receiptEnabled = draft.requiredReceiptThreshold > 0;
291
+ return {
292
+ id: 'limits',
293
+ label: 'Limits',
294
+ kind: 'limits',
295
+ chips: [
296
+ {
297
+ id: 'limit-transaction',
298
+ label: 'Transaction Limit',
299
+ helperText: 'Maximum amount per single transaction',
300
+ placeholder: '$0',
301
+ chipKind: 'positive',
302
+ isSelected: transactionEnabled,
303
+ optionalCode: transactionEnabled
304
+ ? String(draft.spendLimits.transaction)
305
+ : undefined,
306
+ },
307
+ {
308
+ id: 'limit-receipt',
309
+ label: 'Require Receipt',
310
+ helperText: 'Require a receipt above this amount',
311
+ placeholder: '$0',
312
+ chipKind: 'positive',
313
+ isSelected: receiptEnabled,
314
+ optionalCode: receiptEnabled
315
+ ? String(draft.requiredReceiptThreshold)
316
+ : undefined,
317
+ },
318
+ ],
319
+ };
320
+ };
321
+ export const buildUploadReviewRows = (draftPolicies, cardsMasterList, categorySearchOptions) => {
322
+ const mccCodeToCategory = buildMccCodeToCategoryMap(categorySearchOptions);
323
+ return draftPolicies.map((draft) => {
324
+ const chipGroups = buildAutoReviewChipGroupsForDraft(draft, cardsMasterList, mccCodeToCategory);
325
+ chipGroups.push(buildUploadLimitsChipGroup(draft));
326
+ return {
327
+ id: draft.id,
328
+ isChecked: true,
329
+ name: draft.name,
330
+ chipGroups,
331
+ };
332
+ });
333
+ };
334
+ // BE doesn't pre-select the radio: allow-wins when either side is populated,
335
+ // otherwise default to allow. Matches `applyExtractedPolicyTo*FormValues`.
336
+ const inferAllowBlockMode = (allowCount, blockCount) => {
337
+ if (allowCount > 0) {
338
+ return 'allow';
339
+ }
340
+ if (blockCount > 0) {
341
+ return 'block';
342
+ }
343
+ return 'allow';
344
+ };
345
+ const draftMerchantsToChips = (names) => names.map((name) => toVendorChipFieldValue(name, true));
346
+ const draftCategoryCodesToChips = (codes, mccCodeToCategory) => codes.map((code) => {
347
+ const category = mccCodeToCategory.get(code);
348
+ if (category != null) {
349
+ return toMccCategoryChipFieldValue(category, true);
350
+ }
351
+ return {
352
+ id: code,
353
+ label: code,
354
+ isSelected: true,
355
+ optionalCode: code,
356
+ optionalCodes: [code],
357
+ };
358
+ });
359
+ const mergeAiAndSeedChips = (aiChips, seedChips) => {
360
+ const seenIds = new Set(aiChips.map((chip) => chip.id));
361
+ const extraSeeds = seedChips.filter((chip) => !seenIds.has(chip.id));
362
+ return [...aiChips, ...extraSeeds];
363
+ };
@@ -0,0 +1,36 @@
1
+ import { buildEmptyLimitRows } from './buildAiCardPolicyFormDraftSeed';
2
+ import { toMccCategoryChipFieldValue, toVendorChipFieldValue, } from './cardPolicyChipIds';
3
+ import { CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT, } from './cardPolicyFormDraftTypes';
4
+ const EMPTY_ALLOW_BLOCK = {
5
+ mode: 'allow',
6
+ allowItems: [],
7
+ blockItems: [],
8
+ };
9
+ // Mirrors the AI guided seed minus the wizard plan: BE suggestions land
10
+ // `isSelected: false` so the user opts in explicitly.
11
+ export const buildManualCardPolicyFormDraftSeed = ({ cardsMasterList = [], defaultRequireReceiptAmount, suggestedAllowMerchants, suggestedBlockMerchants, suggestedAllowCategories, suggestedBlockCategories, }) => {
12
+ const vendorAllow = (suggestedAllowMerchants ?? []).map((name) => toVendorChipFieldValue(name, false));
13
+ const vendorBlock = (suggestedBlockMerchants ?? []).map((name) => toVendorChipFieldValue(name, false));
14
+ const categoryAllow = (suggestedAllowCategories ?? []).map((category) => toMccCategoryChipFieldValue(category, false));
15
+ const categoryBlock = (suggestedBlockCategories ?? []).map((category) => toMccCategoryChipFieldValue(category, false));
16
+ const vendorPolicy = vendorAllow.length === 0 && vendorBlock.length === 0
17
+ ? EMPTY_ALLOW_BLOCK
18
+ : { mode: 'allow', allowItems: vendorAllow, blockItems: vendorBlock };
19
+ const categoryPolicy = categoryAllow.length === 0 && categoryBlock.length === 0
20
+ ? EMPTY_ALLOW_BLOCK
21
+ : { mode: 'allow', allowItems: categoryAllow, blockItems: categoryBlock };
22
+ const limits = buildEmptyLimitRows().map((row) => row.id === CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT &&
23
+ defaultRequireReceiptAmount != null &&
24
+ defaultRequireReceiptAmount > 0
25
+ ? { ...row, amount: defaultRequireReceiptAmount }
26
+ : row);
27
+ return {
28
+ name: '',
29
+ description: '',
30
+ mode: 'strict',
31
+ vendorPolicy,
32
+ categoryPolicy,
33
+ cardSelections: cardsMasterList.map((row) => ({ ...row, isChecked: false })),
34
+ limits,
35
+ };
36
+ };
@@ -0,0 +1,19 @@
1
+ // All chip-id producers MUST funnel through here — the picker's dedupe is content-blind
2
+ // (`existing.id === option.id`), so vendors collapse on display name and MCC ids must
3
+ // match the legacy convention saved templates use.
4
+ export const VENDOR_CHIP_ID_PREFIX = 'vendor-';
5
+ export const MCC_CHIP_ID_PREFIX = 'mcc-';
6
+ export const buildVendorChipId = (name) => `${VENDOR_CHIP_ID_PREFIX}${name.trim().toLowerCase()}`;
7
+ export const buildMccCategoryChipId = (name) => `${MCC_CHIP_ID_PREFIX}${name}`;
8
+ export const toVendorChipFieldValue = (name, isSelected) => ({
9
+ id: buildVendorChipId(name),
10
+ label: name,
11
+ isSelected,
12
+ });
13
+ export const toMccCategoryChipFieldValue = (category, isSelected) => ({
14
+ id: buildMccCategoryChipId(category.name),
15
+ label: category.name,
16
+ isSelected,
17
+ optionalCode: category.mccCodes[0],
18
+ optionalCodes: [...category.mccCodes],
19
+ });
@@ -0,0 +1,6 @@
1
+ export const CARD_POLICY_LIMIT_ROW_ID_TRANSACTION = 'transactionLimit';
2
+ export const CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT = 'requireReceipt';
3
+ export const toMccCategoryLike = (category) => ({
4
+ name: category.name,
5
+ mccCodes: category.mccCodes,
6
+ });
@@ -0,0 +1,119 @@
1
+ // Wire builders shared by manual and AI CFO drafts.
2
+ // Inactive-side chips stay in form state for fast mode-flip but never go on the wire.
3
+ export const collectMerchantNames = (field, forMode) => {
4
+ if (field.mode !== forMode) {
5
+ return [];
6
+ }
7
+ const items = forMode === 'allow' ? field.allowItems : field.blockItems;
8
+ return items.filter((item) => item.isSelected).map((item) => item.label);
9
+ };
10
+ // `optionalCodes` (plural) emits every code; falls back to the singular
11
+ // `optionalCode`; chips with neither are dropped silently.
12
+ export const collectCategoryCodes = (field, forMode) => {
13
+ if (field.mode !== forMode) {
14
+ return [];
15
+ }
16
+ const items = forMode === 'allow' ? field.allowItems : field.blockItems;
17
+ return items
18
+ .filter((item) => item.isSelected)
19
+ .flatMap((item) => {
20
+ if (item.optionalCodes != null && item.optionalCodes.length > 0) {
21
+ return item.optionalCodes;
22
+ }
23
+ return item.optionalCode != null ? [item.optionalCode] : [];
24
+ });
25
+ };
26
+ // `null` when the toggle is off (BE: "no threshold"); else `amount` (or 0).
27
+ export const amountFromLimitRow = (limits, rowId) => {
28
+ const row = limits.find((entry) => entry.id === rowId);
29
+ if (row == null || !row.isEnabled) {
30
+ return null;
31
+ }
32
+ return row.amount ?? 0;
33
+ };
34
+ const REVIEW_GROUP_ID_ALLOWED_VENDORS = 'allowed-vendors';
35
+ const REVIEW_GROUP_ID_BLOCKED_VENDORS = 'blocked-vendors';
36
+ const REVIEW_GROUP_ID_ALLOWED_CATEGORIES = 'allowed-categories';
37
+ const REVIEW_GROUP_ID_RESTRICTED_CATEGORIES = 'restricted-categories';
38
+ const REVIEW_GROUP_ID_APPLIED_TO_CARDS = 'applied-to-cards';
39
+ const REVIEW_GROUP_ID_LIMITS = 'limits';
40
+ const REVIEW_LIMIT_CHIP_ID_TRANSACTION = 'limit-transaction';
41
+ const REVIEW_LIMIT_CHIP_ID_RECEIPT = 'limit-receipt';
42
+ const isChipOn = (chip) => chip.isSelected !== false;
43
+ const findGroup = (row, groupId) => row.chipGroups.find((group) => group.id === groupId);
44
+ const projectMerchantNamesFromGroup = (group) => group == null ? [] : group.chips.filter(isChipOn).map((chip) => chip.label);
45
+ const projectCategoryCodesFromGroup = (group) => {
46
+ if (group == null) {
47
+ return [];
48
+ }
49
+ const codes = [];
50
+ for (const chip of group.chips) {
51
+ if (!isChipOn(chip)) {
52
+ continue;
53
+ }
54
+ if (chip.optionalCode != null && chip.optionalCode.length > 0) {
55
+ codes.push(chip.optionalCode);
56
+ }
57
+ }
58
+ return codes;
59
+ };
60
+ const projectApplyToCardsFromGroup = (group) => {
61
+ if (group == null) {
62
+ return [];
63
+ }
64
+ const cardIds = [];
65
+ for (const chip of group.chips) {
66
+ if (!isChipOn(chip)) {
67
+ continue;
68
+ }
69
+ if (chip.cardIds != null && chip.cardIds.length > 0) {
70
+ cardIds.push(...chip.cardIds);
71
+ continue;
72
+ }
73
+ cardIds.push(chip.id);
74
+ }
75
+ return cardIds;
76
+ };
77
+ const amountFromLimitsChip = (chip) => {
78
+ if (chip == null || chip.isSelected !== true) {
79
+ return null;
80
+ }
81
+ if (chip.optionalCode == null || chip.optionalCode.length === 0) {
82
+ return 0;
83
+ }
84
+ const parsed = Number(chip.optionalCode);
85
+ return Number.isFinite(parsed) ? parsed : 0;
86
+ };
87
+ // Used when `policyKind === "auto"`, where the row's chip groups are canonical
88
+ // and source slices are empty.
89
+ export const projectAutoReviewRowToCardPolicyRequestParts = (row) => {
90
+ const limitsGroup = findGroup(row, REVIEW_GROUP_ID_LIMITS);
91
+ const transactionChip = limitsGroup?.chips.find((chip) => chip.id === REVIEW_LIMIT_CHIP_ID_TRANSACTION);
92
+ const receiptChip = limitsGroup?.chips.find((chip) => chip.id === REVIEW_LIMIT_CHIP_ID_RECEIPT);
93
+ return {
94
+ allowedEntity: {
95
+ merchantNames: projectMerchantNamesFromGroup(findGroup(row, REVIEW_GROUP_ID_ALLOWED_VENDORS)),
96
+ categoryCodes: projectCategoryCodesFromGroup(findGroup(row, REVIEW_GROUP_ID_ALLOWED_CATEGORIES)),
97
+ },
98
+ blockedEntity: {
99
+ merchantNames: projectMerchantNamesFromGroup(findGroup(row, REVIEW_GROUP_ID_BLOCKED_VENDORS)),
100
+ categoryCodes: projectCategoryCodesFromGroup(findGroup(row, REVIEW_GROUP_ID_RESTRICTED_CATEGORIES)),
101
+ },
102
+ applyToCards: projectApplyToCardsFromGroup(findGroup(row, REVIEW_GROUP_ID_APPLIED_TO_CARDS)),
103
+ spendLimits: { transaction: amountFromLimitsChip(transactionChip) },
104
+ requiredReceiptThreshold: amountFromLimitsChip(receiptChip),
105
+ };
106
+ };
107
+ // Shared by both auto and bulk wire builders.
108
+ export const REVIEW_GROUP_IDS = {
109
+ allowedVendors: REVIEW_GROUP_ID_ALLOWED_VENDORS,
110
+ blockedVendors: REVIEW_GROUP_ID_BLOCKED_VENDORS,
111
+ allowedCategories: REVIEW_GROUP_ID_ALLOWED_CATEGORIES,
112
+ restrictedCategories: REVIEW_GROUP_ID_RESTRICTED_CATEGORIES,
113
+ appliedToCards: REVIEW_GROUP_ID_APPLIED_TO_CARDS,
114
+ limits: REVIEW_GROUP_ID_LIMITS,
115
+ };
116
+ export const REVIEW_LIMIT_CHIP_IDS = {
117
+ transaction: REVIEW_LIMIT_CHIP_ID_TRANSACTION,
118
+ receipt: REVIEW_LIMIT_CHIP_ID_RECEIPT,
119
+ };