@zeniai/client-epic-state 5.1.12 → 5.1.13
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.
- package/lib/common/aiCfo/aiCfoSuggestedQuestionsPageContext.d.ts +1 -1
- package/lib/commonStateTypes/amount.d.ts +1 -0
- package/lib/commonStateTypes/amount.js +9 -1
- package/lib/commonStateTypes/animations.d.ts +1 -1
- package/lib/commonStateTypes/animations.js +1 -0
- package/lib/commonStateTypes/workingDayHelper.d.ts +9 -0
- package/lib/commonStateTypes/workingDayHelper.js +28 -1
- package/lib/entity/aiCfo/aiCfoPayload.d.ts +63 -5
- package/lib/entity/aiCfo/aiCfoReducer.d.ts +23 -2
- package/lib/entity/aiCfo/aiCfoReducer.js +249 -9
- package/lib/entity/aiCfo/aiCfoSelector.d.ts +4 -1
- package/lib/entity/aiCfo/aiCfoSelector.js +19 -1
- package/lib/entity/aiCfo/aiCfoState.d.ts +97 -4
- package/lib/entity/aiCfo/aiCfoState.js +20 -1
- package/lib/entity/approvalRule/approvalRuleConflict.d.ts +56 -0
- package/lib/entity/approvalRule/approvalRuleConflict.js +77 -0
- package/lib/entity/approvalRule/approvalRulePayload.d.ts +34 -5
- package/lib/entity/approvalRule/approvalRulePayload.js +149 -10
- package/lib/entity/approvalRule/approvalRuleSelector.d.ts +25 -1
- package/lib/entity/approvalRule/approvalRuleSelector.js +40 -0
- package/lib/entity/approvalRule/approvalRuleState.d.ts +59 -7
- package/lib/entity/cardPolicy/cardPolicyPayload.d.ts +277 -0
- package/lib/entity/cardPolicy/cardPolicyPayload.js +143 -0
- package/lib/entity/cardPolicy/cardPolicyReducer.d.ts +19 -0
- package/lib/entity/cardPolicy/cardPolicyReducer.js +175 -0
- package/lib/entity/cardPolicy/cardPolicySelector.d.ts +32 -0
- package/lib/entity/cardPolicy/cardPolicySelector.js +99 -0
- package/lib/entity/cardPolicy/cardPolicyState.d.ts +205 -0
- package/lib/entity/cardPolicy/cardPolicyState.js +14 -0
- package/lib/entity/cardPolicy/extractPolicyDocumentEpic.d.ts +18 -0
- package/lib/entity/cardPolicy/extractPolicyDocumentEpic.js +68 -0
- package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.d.ts +26 -0
- package/lib/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +47 -0
- package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.d.ts +25 -0
- package/lib/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +39 -0
- package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.d.ts +24 -0
- package/lib/entity/cardPolicy/policyRecommendationFromUploadEpic.js +105 -0
- package/lib/entity/company/cardsVisibilityHelpers.d.ts +4 -0
- package/lib/entity/company/cardsVisibilityHelpers.js +14 -0
- package/lib/entity/company/companyPayload.d.ts +4 -0
- package/lib/entity/company/companyPayload.js +6 -0
- package/lib/entity/company/companyStateTypes.d.ts +7 -0
- package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +1 -0
- package/lib/entity/jeSchedules/jeSchedulesPayload.js +19 -0
- package/lib/entity/jeSchedules/jeSchedulesState.d.ts +2 -0
- package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +1 -1
- package/lib/entity/monthEndCloseChecks/monthEndCloseChecksState.d.ts +1 -1
- package/lib/entity/paymentAccount/paymentAccountSelector.d.ts +1 -0
- package/lib/entity/paymentAccount/paymentAccountSelector.js +9 -0
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +5 -0
- package/lib/entity/task/taskPayload.d.ts +3 -1
- package/lib/entity/task/taskPayload.js +2 -0
- package/lib/entity/task/taskState.d.ts +2 -0
- package/lib/entity/tenant/clearAllEpic.d.ts +8 -2
- package/lib/entity/tenant/clearAllEpic.js +12 -0
- package/lib/entity/tenant/epic/deleteConnectionEpic.d.ts +1 -1
- package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.d.ts +21 -0
- package/lib/entity/tenant/epic/initEmailConnectOAuthEpic.js +59 -0
- package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.d.ts +1 -1
- package/lib/entity/tenant/epic/saveConnectorCredentialsEpic.d.ts +3 -3
- package/lib/entity/tenant/epic/saveOAuthConnectionEpic.d.ts +1 -1
- package/lib/entity/tenant/tenantPayload.d.ts +1 -0
- package/lib/entity/tenant/tenantReducer.d.ts +38 -25
- package/lib/entity/tenant/tenantReducer.js +70 -10
- package/lib/entity/tenant/tenantState.d.ts +1 -0
- package/lib/entity/transaction/payloadTypes/transactionPayload.js +14 -2
- package/lib/epic.d.ts +31 -3
- package/lib/epic.js +32 -3
- package/lib/esm/commonStateTypes/amount.js +7 -0
- package/lib/esm/commonStateTypes/animations.js +1 -0
- package/lib/esm/commonStateTypes/workingDayHelper.js +26 -0
- package/lib/esm/entity/aiCfo/aiCfoReducer.js +249 -9
- package/lib/esm/entity/aiCfo/aiCfoSelector.js +17 -1
- package/lib/esm/entity/aiCfo/aiCfoState.js +17 -0
- package/lib/esm/entity/approvalRule/approvalRuleConflict.js +74 -0
- package/lib/esm/entity/approvalRule/approvalRulePayload.js +149 -10
- package/lib/esm/entity/approvalRule/approvalRuleSelector.js +35 -0
- package/lib/esm/entity/cardPolicy/cardPolicyPayload.js +130 -0
- package/lib/esm/entity/cardPolicy/cardPolicyReducer.js +171 -0
- package/lib/esm/entity/cardPolicy/cardPolicySelector.js +75 -0
- package/lib/esm/entity/cardPolicy/cardPolicyState.js +9 -0
- package/lib/esm/entity/cardPolicy/extractPolicyDocumentEpic.js +64 -0
- package/lib/esm/entity/cardPolicy/fetchCardPolicyVendorOptionsEpic.js +43 -0
- package/lib/esm/entity/cardPolicy/policyDocumentExtractionToRecommendationBridgeEpic.js +35 -0
- package/lib/esm/entity/cardPolicy/policyRecommendationFromUploadEpic.js +101 -0
- package/lib/esm/entity/company/cardsVisibilityHelpers.js +9 -0
- package/lib/esm/entity/company/companyPayload.js +6 -0
- package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +19 -0
- package/lib/esm/entity/paymentAccount/paymentAccountSelector.js +8 -0
- package/lib/esm/entity/snackbar/snackbarTypes.js +5 -0
- package/lib/esm/entity/task/taskPayload.js +2 -0
- package/lib/esm/entity/tenant/clearAllEpic.js +12 -0
- package/lib/esm/entity/tenant/epic/initEmailConnectOAuthEpic.js +55 -0
- package/lib/esm/entity/tenant/tenantReducer.js +68 -8
- package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +14 -2
- package/lib/esm/epic.js +32 -3
- package/lib/esm/index.js +68 -26
- package/lib/esm/reducer.js +18 -0
- package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +6 -3
- package/lib/esm/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
- package/lib/esm/view/aiCfoView/epics/createSessionEpic.js +2 -1
- package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
- package/lib/esm/view/companyTaskManagerView/companyTaskManagerViewReducer.js +39 -11
- package/lib/esm/view/companyTaskManagerView/companyTaskManagerViewSelector.js +14 -4
- package/lib/esm/view/companyTaskManagerView/epics/fetchCockpitContextEpic.js +38 -0
- package/lib/esm/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +37 -28
- package/lib/esm/view/companyTaskManagerView/epics/updateCompanyTaskManagerViewFiltersEpic.js +16 -0
- package/lib/esm/view/companyView/epic/companyPassport/updateCapitalizationAccountThresholdEpic.js +3 -3
- package/lib/esm/view/companyView/epic/fetchAllCockpitViewsEpic.js +2 -2
- package/lib/esm/view/dashboard/dashboardSelector.js +8 -43
- package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +1 -1
- package/lib/esm/view/fileView/epic/deleteFileEpic.js +2 -2
- package/lib/esm/view/fileView/epic/deleteFileListEpic.js +2 -2
- package/lib/esm/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +40 -0
- package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +29 -0
- package/lib/esm/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +40 -0
- package/lib/esm/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewEpic.js +24 -18
- package/lib/esm/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewLocalStoreDataEpic.js +29 -17
- package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewReducer.js +223 -51
- package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewSelector.js +36 -18
- package/lib/esm/view/onboardingView/customerView/onboardingCustomerViewState.js +45 -6
- package/lib/esm/view/people/initializeEditPersonEpic.js +5 -1
- package/lib/esm/view/people/invitePeopleEpic.js +6 -3
- package/lib/esm/view/people/peopleSaveUpdatesEpic.js +7 -3
- package/lib/esm/view/settingsView/settingsViewHelpers.js +5 -2
- package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +22 -2
- package/lib/esm/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +14 -0
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +109 -12
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +10 -2
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +8 -4
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +11 -7
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +54 -0
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +13 -4
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +144 -16
- package/lib/esm/view/spendManagement/billPay/editBillView/editBillViewSelector.js +60 -4
- package/lib/esm/view/spendManagement/billPay/editBillView/epics/fetchEditBillDetailPageEpic.js +8 -2
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.js +29 -0
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.js +78 -0
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.js +49 -0
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.js +47 -0
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.js +32 -0
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.js +32 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.js +54 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.js +92 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.js +212 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.js +10 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.js +23 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.js +36 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.js +27 -0
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.js +28 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +52 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +22 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +1 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +36 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +39 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +34 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +71 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +21 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +1 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +38 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +289 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +109 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +44 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +111 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +25 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +363 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +36 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +19 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +6 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +119 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +154 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +22 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +1 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +49 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +140 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +20 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +100 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +96 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +59 -0
- package/lib/esm/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +24 -0
- package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +25 -0
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +1 -0
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +34 -0
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +57 -0
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +35 -0
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +2 -2
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +42 -4
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +35 -0
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +62 -0
- package/lib/esm/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +44 -0
- package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +58 -0
- package/lib/esm/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +77 -0
- package/lib/esm/view/spendManagement/commonSetup/kycKybAutofillActions.js +14 -0
- package/lib/esm/view/spendManagement/commonSetup/kycKybParseMapper.js +221 -0
- package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +106 -52
- package/lib/esm/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
- package/lib/esm/view/spendManagement/commonSetup/types/kycKybAutofill.js +41 -0
- package/lib/esm/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +5 -1
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +10 -2
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +8 -2
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +11 -7
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +61 -0
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +13 -4
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +80 -11
- package/lib/esm/view/transactionDetail/epics/saveTransactionHelper.js +1 -0
- package/lib/esm/view/transactionDetail/epics/updateTransactionDetailEpic.js +6 -0
- package/lib/esm/view/transactionDetail/transactionDetailLocalDataHelper.js +7 -1
- package/lib/index.d.ts +83 -32
- package/lib/index.js +264 -29
- package/lib/reducer.d.ts +18 -0
- package/lib/reducer.js +18 -0
- package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +11 -2
- package/lib/view/aiCfoView/aiCfoViewReducer.js +6 -3
- package/lib/view/aiCfoView/epics/createSessionAndSubmitEpic.js +5 -2
- package/lib/view/aiCfoView/epics/createSessionEpic.js +2 -1
- package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +8 -1
- package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +12 -2
- package/lib/view/companyTaskManagerView/companyTaskManagerViewPayload.d.ts +19 -11
- package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +11 -5
- package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.js +40 -12
- package/lib/view/companyTaskManagerView/companyTaskManagerViewSelector.d.ts +2 -0
- package/lib/view/companyTaskManagerView/companyTaskManagerViewSelector.js +13 -3
- package/lib/view/companyTaskManagerView/companyTaskManagerViewState.d.ts +11 -3
- package/lib/view/companyTaskManagerView/epics/fetchCockpitContextEpic.d.ts +10 -0
- package/lib/view/companyTaskManagerView/epics/fetchCockpitContextEpic.js +42 -0
- package/lib/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.d.ts +1 -3
- package/lib/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +37 -28
- package/lib/view/companyTaskManagerView/epics/updateCompanyTaskManagerViewFiltersEpic.d.ts +6 -0
- package/lib/view/companyTaskManagerView/epics/updateCompanyTaskManagerViewFiltersEpic.js +20 -0
- package/lib/view/companyView/epic/companyPassport/updateCapitalizationAccountThresholdEpic.d.ts +1 -1
- package/lib/view/companyView/epic/companyPassport/updateCapitalizationAccountThresholdEpic.js +2 -2
- package/lib/view/companyView/epic/fetchAllCockpitViewsEpic.js +2 -2
- package/lib/view/companyView/types/cockpitTypes.d.ts +3 -2
- package/lib/view/dashboard/dashboardSelector.js +8 -43
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +1 -1
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +1 -1
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +1 -1
- package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
- package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +1 -1
- package/lib/view/fileView/epic/deleteFileEpic.js +1 -1
- package/lib/view/fileView/epic/deleteFileListEpic.js +1 -1
- package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.d.ts +7 -0
- package/lib/view/onboardingView/customerView/epic/aiAgentsActivation/fetchAiAgentsActivationStatusEpic.js +44 -0
- package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.d.ts +8 -0
- package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiActivationViewedEpic.js +33 -0
- package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.d.ts +9 -0
- package/lib/view/onboardingView/customerView/epic/customerDetails/acknowledgeOnboardingAiFinanceTeamEpic.js +44 -0
- package/lib/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewEpic.js +24 -18
- package/lib/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewLocalStoreDataEpic.d.ts +2 -2
- package/lib/view/onboardingView/customerView/epic/customerDetails/updateOnboardingCustomerViewLocalStoreDataEpic.js +27 -15
- package/lib/view/onboardingView/customerView/onboardingCustomerViewPayload.d.ts +3 -0
- package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.d.ts +44 -5
- package/lib/view/onboardingView/customerView/onboardingCustomerViewReducer.js +225 -52
- package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.d.ts +6 -1
- package/lib/view/onboardingView/customerView/onboardingCustomerViewSelector.js +39 -18
- package/lib/view/onboardingView/customerView/onboardingCustomerViewState.d.ts +53 -8
- package/lib/view/onboardingView/customerView/onboardingCustomerViewState.js +47 -7
- package/lib/view/people/initializeEditPersonEpic.js +5 -1
- package/lib/view/people/invitePeopleEpic.js +6 -3
- package/lib/view/people/peopleSaveUpdatesEpic.js +7 -3
- package/lib/view/people/peopleTypes.d.ts +1 -1
- package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
- package/lib/view/settingsView/settingsViewHelpers.js +5 -2
- package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.d.ts +8 -1
- package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +21 -1
- package/lib/view/spendManagement/autotransferRules/autoTransferRulesState.d.ts +22 -0
- package/lib/view/spendManagement/billPay/billPayReview/billPayReviewSelector.d.ts +7 -0
- package/lib/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +14 -0
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.d.ts +14 -3
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +110 -13
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewState.d.ts +16 -0
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +10 -2
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +8 -4
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +10 -6
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.d.ts +23 -0
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +58 -0
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +12 -3
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.d.ts +59 -1
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +146 -17
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonState.d.ts +31 -5
- package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.d.ts +8 -1
- package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.js +60 -4
- package/lib/view/spendManagement/billPay/editBillView/epics/fetchEditBillDetailPageEpic.js +8 -2
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.d.ts +47 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.js +34 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.d.ts +23 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.js +82 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.d.ts +40 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.js +53 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.d.ts +37 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.js +53 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.d.ts +14 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.js +36 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.d.ts +7 -0
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.js +36 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.d.ts +56 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.js +60 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.d.ts +22 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.js +96 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.d.ts +59 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.js +217 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.d.ts +122 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.js +13 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.d.ts +7 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.js +27 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.d.ts +9 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.js +40 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.d.ts +7 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.js +31 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.d.ts +15 -0
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.js +32 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.d.ts +14 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailReducer.js +56 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.d.ts +15 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailSelector.js +28 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/cardPolicyDetailState.js +2 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/fetchCardPolicyDetailEpic.js +40 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyDetail/updateCardPolicyEpic.js +43 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/archiveCardPolicyEpic.js +38 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.d.ts +15 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListReducer.js +75 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.d.ts +15 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListSelector.js +27 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.d.ts +7 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/cardPolicyListState.js +2 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/cardPolicyList/fetchCardPolicyListEpic.js +42 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyAiCardPolicyFormDraftUpdate.js +294 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToAiCardPolicyDraft.js +113 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.d.ts +9 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToDraftEpic.js +48 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyExtractedPolicyToManualCardPolicyDraft.js +115 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.d.ts +13 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/applyUploadPlanToAiCardPolicyDraft.js +29 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.d.ts +14 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildAiCardPolicyFormDraftSeed.js +369 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.d.ts +6 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/buildManualCardPolicyFormDraftSeed.js +40 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.d.ts +7 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyChipIds.js +26 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.d.ts +116 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyFormDraftTypes.js +10 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.d.ts +33 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/cardPolicyRequestParts.js +126 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.d.ts +52 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyReducer.js +158 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.d.ts +11 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicySelector.js +31 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.d.ts +12 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyState.js +2 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.d.ts +9 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/createCardPolicyTemplateEpic.js +53 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.d.ts +10 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/deriveAiPolicyReviewRowsFromInputs.js +144 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.d.ts +7 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/fetchCardPolicyMccCategoriesEpic.js +24 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.d.ts +11 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/seedAiCardPolicyFormDraftEpic.js +104 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.d.ts +22 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toBulkCardPolicyTemplateRequestsFromDraft.js +100 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.d.ts +8 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toCardPolicyTemplateRequestFromDraft.js +63 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.d.ts +3 -0
- package/lib/view/spendManagement/chargeCards/cardPolicy/createCardPolicy/toManualCardPolicyTemplateRequestFromDraft.js +28 -0
- package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
- package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.d.ts +14 -0
- package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +27 -1
- package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.d.ts +34 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/aiCardCreationFormDraftTypes.js +2 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.d.ts +7 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/applyAiCardCreationFormDraftUpdate.js +38 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.d.ts +12 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/buildAiCardCreationFormDraftSeed.js +61 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.d.ts +9 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/deriveAiCardRowsFromTeams.js +39 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.d.ts +2 -2
- package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardEpic.js +1 -1
- package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.d.ts +12 -2
- package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer.js +43 -5
- package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.d.ts +7 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardSelector.js +42 -1
- package/lib/view/spendManagement/chargeCards/issueChargeCard/issueChargeCardState.d.ts +5 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.d.ts +11 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/seedAiCardCreationFormDraftEpic.js +66 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.d.ts +3 -0
- package/lib/view/spendManagement/chargeCards/issueChargeCard/toIssueChargeCardLocalDataFromDraft.js +48 -0
- package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.d.ts +28 -0
- package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKybDocumentEpic.js +62 -0
- package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.d.ts +9 -0
- package/lib/view/spendManagement/commonSetup/epic/setup/parseUploadedKycDocumentEpic.js +81 -0
- package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.d.ts +24 -0
- package/lib/view/spendManagement/commonSetup/kycKybAutofillActions.js +17 -0
- package/lib/view/spendManagement/commonSetup/kycKybParseMapper.d.ts +29 -0
- package/lib/view/spendManagement/commonSetup/kycKybParseMapper.js +229 -0
- package/lib/view/spendManagement/commonSetup/setupViewReducer.d.ts +28 -2
- package/lib/view/spendManagement/commonSetup/setupViewReducer.js +107 -53
- package/lib/view/spendManagement/commonSetup/setupViewSelector.d.ts +7 -2
- package/lib/view/spendManagement/commonSetup/setupViewSelector.js +6 -1
- package/lib/view/spendManagement/commonSetup/setupViewState.d.ts +19 -0
- package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.d.ts +154 -0
- package/lib/view/spendManagement/commonSetup/types/kycKybAutofill.js +46 -0
- package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +5 -1
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +10 -2
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +8 -2
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +10 -6
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.d.ts +14 -0
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +65 -0
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +12 -3
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.d.ts +14 -3
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +81 -12
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewState.d.ts +12 -0
- package/lib/view/taskManager/taskListView/taskList.d.ts +3 -3
- package/lib/view/taskManager/taskListView/taskListReducer.d.ts +1 -1
- package/lib/view/transactionDetail/epics/saveTransactionHelper.js +1 -0
- package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.js +6 -0
- package/lib/view/transactionDetail/journalEntryLinesViewModel.d.ts +1 -1
- package/lib/view/transactionDetail/transactionDetailLocalDataHelper.js +7 -1
- package/lib/view/transactionDetail/transactionDetailState.d.ts +1 -0
- package/lib/view/transactionDetail/transactionDetailTypes.d.ts +1 -0
- package/lib/zeniAPI.d.ts +1 -0
- package/package.json +6 -4
|
@@ -10,6 +10,32 @@ const holidays = dateHolidays
|
|
|
10
10
|
.filter((holiday) => holiday.type === 'public' || holiday.type === 'bank')
|
|
11
11
|
.map((holiday) => zeniDate(holiday.date).toDate()); // https://www.linkedin.com/pulse/fix-invalid-date-safari-ie-hatem-ahmad/
|
|
12
12
|
export const holidaysFormatted = holidays.map((holiday) => zeniDate(holiday.toDateString()).format(standardFormat));
|
|
13
|
+
/**
|
|
14
|
+
* Returns the next scheduled transfer date for a recurring transfer/sweep,
|
|
15
|
+
* given a frequency cadence. Advances by the cadence and then skips past
|
|
16
|
+
* weekends and US holidays. Used by both:
|
|
17
|
+
* - `<ReviewAutoTransferRuleDrawer>` (web-c) for the display "next transfer"
|
|
18
|
+
* - `saveAutoSweepSettingsEpic` for the `first_run_date` PUT payload
|
|
19
|
+
*/
|
|
20
|
+
export const getNextTransferDate = (frequency) => {
|
|
21
|
+
const date = new Date();
|
|
22
|
+
if (frequency === 'daily') {
|
|
23
|
+
date.setDate(date.getDate() + 1);
|
|
24
|
+
}
|
|
25
|
+
else if (frequency === 'weekly') {
|
|
26
|
+
date.setDate(date.getDate() + 7);
|
|
27
|
+
}
|
|
28
|
+
else if (frequency === 'biweekly') {
|
|
29
|
+
date.setDate(date.getDate() + 14);
|
|
30
|
+
}
|
|
31
|
+
else if (frequency === 'monthly') {
|
|
32
|
+
date.setMonth(date.getMonth() + 1);
|
|
33
|
+
}
|
|
34
|
+
const isWeekend = date.getDay() === 0 || date.getDay() === 6;
|
|
35
|
+
const isHolidayDate = isHoliday(zeniDate(date.toDateString()));
|
|
36
|
+
const result = isWeekend || isHolidayDate ? getNextNthWorkingDay(date, [0, 6], 1) : date;
|
|
37
|
+
return zeniDate(result.toDateString());
|
|
38
|
+
};
|
|
13
39
|
export const getNextNthWorkingDay = (date, filterDaysIndex, numberOfWorkingDays) => {
|
|
14
40
|
const currentDate = new Date(date.toDateString());
|
|
15
41
|
const holidaysFormatted = holidays.map((holiday) => zeniDate(holiday.toDateString()).format(standardFormat));
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createSlice } from '@reduxjs/toolkit';
|
|
2
2
|
import { date as zeniDate } from '../../zeniDayJS';
|
|
3
|
-
import { ALL_AI_CFO_ANSWER_RESPONSE_TYPES, toAiCfoAnswerResponseType, toAiCfoAnswerResponseTypeStrict, toAiCfoAnswerStateType, toAiCfoVisualizationTypeStrict, toMessageSender, toMessageType, toYFormatScaleStrict, toYFormatTypeStrict, toYFormatUnitStrict, } from './aiCfoState';
|
|
3
|
+
import { ALL_AI_CFO_ANSWER_RESPONSE_TYPES, toAiCfoAnswerResponseType, toAiCfoAnswerResponseTypeStrict, toAiCfoAnswerStateType, toAiCfoVisualizationTypeStrict, toInteractiveFormTypeStrict, toMessageSender, toMessageType, toYFormatScaleStrict, toYFormatTypeStrict, toYFormatUnitStrict, } from './aiCfoState';
|
|
4
4
|
export const initialAiCfoState = {
|
|
5
5
|
aiCfoByChatSessionId: {},
|
|
6
6
|
partialQuestionAnswers: {},
|
|
7
|
+
syntheticAnswersByChatSessionId: {},
|
|
7
8
|
};
|
|
8
9
|
// Utility: Merge two arrays of Q&A pairs, combining responses for the same question
|
|
9
10
|
function mergeQuestionAnswerPairs(existing, newQAs) {
|
|
@@ -136,9 +137,171 @@ export const toAiCfoVisualization = (visualization) => {
|
|
|
136
137
|
if (visualization.type == null || visualization.data == null) {
|
|
137
138
|
return undefined;
|
|
138
139
|
}
|
|
140
|
+
// Reject unknown viz types; `?? 'table'` used to throw in the chart/table decoder
|
|
141
|
+
// when interactive-form payloads (no `values`) hit it.
|
|
142
|
+
const normalizedType = toAiCfoVisualizationTypeStrict(visualization.type);
|
|
143
|
+
if (normalizedType == null) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
type: normalizedType,
|
|
148
|
+
data: normalizedType === 'interactive_form'
|
|
149
|
+
? toInteractiveFormVisualization(visualization.data)
|
|
150
|
+
: toAiCfoVisualizationData(visualization.data),
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
const toInteractiveFormVisualization = (data) => {
|
|
154
|
+
// When `form_type` is missing / mistyped, infer from payload shape so a malformed
|
|
155
|
+
// card-policy answer doesn't get decoded as cards_creation (wrong form + submit path).
|
|
156
|
+
const formType = toInteractiveFormTypeStrict(data.form_type) ??
|
|
157
|
+
inferInteractiveFormTypeFromPayload(data.payload);
|
|
158
|
+
if (formType === 'card_policy') {
|
|
159
|
+
return {
|
|
160
|
+
formType: 'card_policy',
|
|
161
|
+
payload: toCardPolicyInitialData(data.payload),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
formType: 'cards_creation',
|
|
166
|
+
payload: toCardsCreationInitialData(data.payload),
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
const inferInteractiveFormTypeFromPayload = (payload) => {
|
|
170
|
+
if (payload != null && typeof payload === 'object' && 'mode' in payload) {
|
|
171
|
+
const mode = payload.mode;
|
|
172
|
+
if (mode === 'auto' || mode === 'guided' || mode === 'upload') {
|
|
173
|
+
return 'card_policy';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return 'cards_creation';
|
|
177
|
+
};
|
|
178
|
+
const toCardsCreationInitialData = (payload) => {
|
|
179
|
+
const suggestedCards = payload.suggested_cards ?? [];
|
|
180
|
+
const ordered = [...suggestedCards].sort((a, b) => KIND_RANK[a.card_type] - KIND_RANK[b.card_type]);
|
|
181
|
+
const withUniqueIds = withSynthesizedIds(ordered);
|
|
182
|
+
const suggestedOnly = withUniqueIds.filter(({ card }) => card.is_suggested);
|
|
183
|
+
const cardNameOptions = withUniqueIds.map(({ card, uniqueId }) => ({
|
|
184
|
+
id: uniqueId,
|
|
185
|
+
kind: toCardKind(card.card_type),
|
|
186
|
+
label: card.card_name,
|
|
187
|
+
}));
|
|
188
|
+
const suggestedOwnerUserIdByTeamId = Object.fromEntries(suggestedOnly.map(({ card, uniqueId }) => [
|
|
189
|
+
uniqueId,
|
|
190
|
+
normalizeOwnerId(card.owner_id),
|
|
191
|
+
]));
|
|
192
|
+
const common = {
|
|
193
|
+
cardNameOptions,
|
|
194
|
+
suggestedOwnerUserIdByTeamId,
|
|
195
|
+
};
|
|
196
|
+
if (payload.mode === 'create') {
|
|
197
|
+
return {
|
|
198
|
+
...common,
|
|
199
|
+
mode: 'create',
|
|
200
|
+
cardRows: suggestedOnly.map(({ card, uniqueId }) => ({
|
|
201
|
+
cardKind: toCardKind(card.card_type),
|
|
202
|
+
id: uniqueId,
|
|
203
|
+
label: card.card_name,
|
|
204
|
+
recommendedLimit: card.credit_limit > 0 ? card.credit_limit : undefined,
|
|
205
|
+
suggestedOwnerUserId: normalizeOwnerId(card.owner_id),
|
|
206
|
+
})),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
139
209
|
return {
|
|
140
|
-
|
|
141
|
-
|
|
210
|
+
...common,
|
|
211
|
+
mode: 'review',
|
|
212
|
+
teamRows: suggestedOnly.map(({ card, uniqueId }) => ({
|
|
213
|
+
avgMonthlySpend: CURRENCY_FORMATTER.format(card.avg_spend),
|
|
214
|
+
cardKind: toCardKind(card.card_type),
|
|
215
|
+
id: uniqueId,
|
|
216
|
+
label: card.card_name,
|
|
217
|
+
recommendedLimit: CURRENCY_FORMATTER.format(card.credit_limit),
|
|
218
|
+
recommendedLimitCadence: 'Monthly',
|
|
219
|
+
})),
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
const CURRENCY_FORMATTER = new Intl.NumberFormat('en-US', {
|
|
223
|
+
style: 'currency',
|
|
224
|
+
currency: 'USD',
|
|
225
|
+
maximumFractionDigits: 0,
|
|
226
|
+
});
|
|
227
|
+
// BE emits `null` or `""` for "no owner picked"; collapse both to `undefined`.
|
|
228
|
+
const normalizeOwnerId = (ownerId) => (ownerId != null && ownerId !== '' ? ownerId : undefined);
|
|
229
|
+
const KIND_RANK = {
|
|
230
|
+
vendor: 0,
|
|
231
|
+
category: 1,
|
|
232
|
+
department: 2,
|
|
233
|
+
};
|
|
234
|
+
const toCardKind = (cardType) => {
|
|
235
|
+
if (cardType === 'department') {
|
|
236
|
+
return 'class';
|
|
237
|
+
}
|
|
238
|
+
if (cardType === 'category') {
|
|
239
|
+
return 'category';
|
|
240
|
+
}
|
|
241
|
+
return 'vendor';
|
|
242
|
+
};
|
|
243
|
+
// Falls back to `${kind}__${card_name_id}__${index}` when `card_name_id` collides
|
|
244
|
+
// (sample payloads ship the literal `"vendor_uuid"`), to keep RHF row keys unique.
|
|
245
|
+
const withSynthesizedIds = (cards) => {
|
|
246
|
+
const seen = new Set();
|
|
247
|
+
return cards.map((card, index) => {
|
|
248
|
+
const preferred = card.card_name_id;
|
|
249
|
+
if (preferred != null && preferred !== '' && !seen.has(preferred)) {
|
|
250
|
+
seen.add(preferred);
|
|
251
|
+
return { card, uniqueId: preferred };
|
|
252
|
+
}
|
|
253
|
+
const synthesized = `${card.card_type}__${preferred ?? 'unknown'}__${index}`;
|
|
254
|
+
seen.add(synthesized);
|
|
255
|
+
return { card, uniqueId: synthesized };
|
|
256
|
+
});
|
|
257
|
+
};
|
|
258
|
+
const toCardPolicyDraftPolicy = (payload, index) => ({
|
|
259
|
+
id: `draft-${index}`,
|
|
260
|
+
name: payload.name,
|
|
261
|
+
description: payload.description ?? '',
|
|
262
|
+
mode: payload.mode,
|
|
263
|
+
allowedEntity: {
|
|
264
|
+
categoryCodes: payload.allowed_entity?.category_codes ?? [],
|
|
265
|
+
merchantNames: payload.allowed_entity?.merchant_names ?? [],
|
|
266
|
+
},
|
|
267
|
+
blockedEntity: {
|
|
268
|
+
categoryCodes: payload.blocked_entity?.category_codes ?? [],
|
|
269
|
+
merchantNames: payload.blocked_entity?.merchant_names ?? [],
|
|
270
|
+
},
|
|
271
|
+
applyToCards: payload.apply_to_cards ?? [],
|
|
272
|
+
requiredReceiptThreshold: payload.required_receipt_threshold ?? 0,
|
|
273
|
+
spendLimits: {
|
|
274
|
+
transaction: payload.spend_limits?.transaction ?? 0,
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
const toCardPolicyStep5Review = (payload) => ({
|
|
278
|
+
draftPolicies: (payload.draft_policies ?? []).map(toCardPolicyDraftPolicy),
|
|
279
|
+
groupingSource: payload.grouping_source ?? 'none',
|
|
280
|
+
prompt: payload.prompt ?? '',
|
|
281
|
+
});
|
|
282
|
+
const toCardPolicyWizardPlan = (payload) => ({
|
|
283
|
+
step5Review: toCardPolicyStep5Review(payload.step_5_review),
|
|
284
|
+
});
|
|
285
|
+
const toCardPolicyUploadSource = (payload) => ({
|
|
286
|
+
confidenceScore: payload.confidence_score,
|
|
287
|
+
fileName: payload.file_name,
|
|
288
|
+
lowConfidenceFields: payload.low_confidence_fields ?? [],
|
|
289
|
+
});
|
|
290
|
+
const toCardPolicyInitialData = (payload) => {
|
|
291
|
+
if (payload.mode === 'upload') {
|
|
292
|
+
return {
|
|
293
|
+
policyKind: 'upload',
|
|
294
|
+
wizardPlan: payload.wizard_plan != null
|
|
295
|
+
? toCardPolicyWizardPlan(payload.wizard_plan)
|
|
296
|
+
: undefined,
|
|
297
|
+
source: payload.source != null
|
|
298
|
+
? toCardPolicyUploadSource(payload.source)
|
|
299
|
+
: undefined,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
policyKind: payload.mode,
|
|
304
|
+
wizardPlan: toCardPolicyWizardPlan(payload.wizard_plan),
|
|
142
305
|
};
|
|
143
306
|
};
|
|
144
307
|
const toAiCfoVisualizationData = (data) => {
|
|
@@ -375,10 +538,8 @@ const aiCfo = createSlice({
|
|
|
375
538
|
// Update state - append new complete Q&As to existing ones
|
|
376
539
|
session.questionAnswers = mergeQuestionAnswerPairs(session.questionAnswers, completeQAs);
|
|
377
540
|
},
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
* Used for push notification payloads that may introduce a new question.
|
|
381
|
-
*/
|
|
541
|
+
// Upserts the response block when `questionAnswerId` exists; otherwise adds the Q/A
|
|
542
|
+
// entry. Used for push notification payloads that may introduce a new question.
|
|
382
543
|
upsertOrAddQuestionAnswerPayload(draft, action) {
|
|
383
544
|
const { chatSessionId, questionAnswerId, question: { questionId, createdAt, text }, answerPayload, userId, insertQuestionAnswer, } = action.payload;
|
|
384
545
|
const session = draft.aiCfoByChatSessionId[chatSessionId];
|
|
@@ -455,10 +616,82 @@ const aiCfo = createSlice({
|
|
|
455
616
|
session.questionAnswers.push(qa);
|
|
456
617
|
}
|
|
457
618
|
},
|
|
619
|
+
// Patches an upload-mode card-policy answer with the wizard plan + source returned
|
|
620
|
+
// by `policy-recommendation-from-upload`. No-op for non-upload / missing targets.
|
|
621
|
+
updateAiCfoAnswerCardPolicyWizardPlan(draft, action) {
|
|
622
|
+
const { answerId, chatSessionId, source, wizardPlan } = action.payload;
|
|
623
|
+
const session = draft.aiCfoByChatSessionId[chatSessionId];
|
|
624
|
+
if (session == null) {
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
const qa = session.questionAnswers.find((entry) => entry.questionAnswerId === answerId);
|
|
628
|
+
if (qa == null) {
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
for (const response of Object.values(qa.responses)) {
|
|
632
|
+
const visualization = response?.content.visualization;
|
|
633
|
+
if (visualization == null ||
|
|
634
|
+
visualization.type !== 'interactive_form') {
|
|
635
|
+
continue;
|
|
636
|
+
}
|
|
637
|
+
const data = visualization.data;
|
|
638
|
+
if (data.formType !== 'card_policy' ||
|
|
639
|
+
data.payload.policyKind !== 'upload') {
|
|
640
|
+
continue;
|
|
641
|
+
}
|
|
642
|
+
data.payload = {
|
|
643
|
+
...data.payload,
|
|
644
|
+
wizardPlan,
|
|
645
|
+
source: source ?? data.payload.source,
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
},
|
|
649
|
+
// Renders a "Creating…" placeholder while the cards/policy create mutation runs.
|
|
650
|
+
// Caller supplies a stable `id` (updated in place by `updateSyntheticAiCfoAnswer`).
|
|
651
|
+
appendSyntheticAiCfoAnswer(draft, action) {
|
|
652
|
+
const { chatSessionId, id, kind, createdAt, entityIds, sourceQuestionAnswerId, } = action.payload;
|
|
653
|
+
if (draft.syntheticAnswersByChatSessionId[chatSessionId] == null) {
|
|
654
|
+
draft.syntheticAnswersByChatSessionId[chatSessionId] = [];
|
|
655
|
+
}
|
|
656
|
+
draft.syntheticAnswersByChatSessionId[chatSessionId].push({
|
|
657
|
+
id,
|
|
658
|
+
kind,
|
|
659
|
+
entityIds: entityIds ?? [],
|
|
660
|
+
createdAt,
|
|
661
|
+
sourceQuestionAnswerId,
|
|
662
|
+
});
|
|
663
|
+
},
|
|
664
|
+
// Transitions a bubble from `creating_*` to `created_*` once the mutation completes.
|
|
665
|
+
updateSyntheticAiCfoAnswer(draft, action) {
|
|
666
|
+
const { chatSessionId, id, kind, entityIds } = action.payload;
|
|
667
|
+
const list = draft.syntheticAnswersByChatSessionId[chatSessionId];
|
|
668
|
+
if (list == null) {
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
671
|
+
const entry = list.find((item) => item.id === id);
|
|
672
|
+
if (entry == null) {
|
|
673
|
+
return;
|
|
674
|
+
}
|
|
675
|
+
entry.kind = kind;
|
|
676
|
+
if (entityIds != null) {
|
|
677
|
+
entry.entityIds = entityIds;
|
|
678
|
+
}
|
|
679
|
+
},
|
|
680
|
+
removeSyntheticAiCfoAnswer(draft, action) {
|
|
681
|
+
const { chatSessionId, id } = action.payload;
|
|
682
|
+
const list = draft.syntheticAnswersByChatSessionId[chatSessionId];
|
|
683
|
+
if (list == null) {
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
draft.syntheticAnswersByChatSessionId[chatSessionId] = list.filter((item) => item.id !== id);
|
|
687
|
+
},
|
|
688
|
+
clearSyntheticAiCfoAnswers(draft, action) {
|
|
689
|
+
delete draft.syntheticAnswersByChatSessionId[action.payload];
|
|
690
|
+
},
|
|
458
691
|
clearSession(draft, action) {
|
|
459
692
|
const sessionId = action.payload;
|
|
460
693
|
delete draft.aiCfoByChatSessionId[sessionId];
|
|
461
|
-
|
|
694
|
+
delete draft.syntheticAnswersByChatSessionId[sessionId];
|
|
462
695
|
if (draft.partialQuestionAnswers?.[sessionId] != null) {
|
|
463
696
|
draft.partialQuestionAnswers[sessionId] = undefined;
|
|
464
697
|
}
|
|
@@ -466,6 +699,7 @@ const aiCfo = createSlice({
|
|
|
466
699
|
clearAiCfo(draft) {
|
|
467
700
|
draft.aiCfoByChatSessionId = {};
|
|
468
701
|
draft.partialQuestionAnswers = {};
|
|
702
|
+
draft.syntheticAnswersByChatSessionId = {};
|
|
469
703
|
},
|
|
470
704
|
deleteQuestion(draft, action) {
|
|
471
705
|
const { chatSessionId, questionAnswerId } = action.payload;
|
|
@@ -478,6 +712,12 @@ const aiCfo = createSlice({
|
|
|
478
712
|
if (idx !== -1) {
|
|
479
713
|
session.questionAnswers.splice(idx, 1);
|
|
480
714
|
}
|
|
715
|
+
// Drop synthetic bubbles whose sourceQuestionAnswerId is the deleted Q/A; otherwise "Creating…" / "Created" tiles outlive their Q/A.
|
|
716
|
+
const syntheticAnswers = draft.syntheticAnswersByChatSessionId[chatSessionId];
|
|
717
|
+
if (syntheticAnswers != null) {
|
|
718
|
+
draft.syntheticAnswersByChatSessionId[chatSessionId] =
|
|
719
|
+
syntheticAnswers.filter((answer) => answer.sourceQuestionAnswerId !== questionAnswerId);
|
|
720
|
+
}
|
|
481
721
|
},
|
|
482
722
|
},
|
|
483
723
|
});
|
|
@@ -490,5 +730,5 @@ const toChatSession = (chatSessionPayload) => {
|
|
|
490
730
|
createdAt: zeniDate(created_at),
|
|
491
731
|
};
|
|
492
732
|
};
|
|
493
|
-
export const { setNewSession, clearSession, setSessions, setChatHistory, upsertAnswerPayload, upsertOrAddQuestionAnswerPayload, addQuestionPayload, clearAiCfo, deleteQuestion, } = aiCfo.actions;
|
|
733
|
+
export const { setNewSession, clearSession, setSessions, setChatHistory, upsertAnswerPayload, upsertOrAddQuestionAnswerPayload, addQuestionPayload, clearAiCfo, deleteQuestion, updateAiCfoAnswerCardPolicyWizardPlan, appendSyntheticAiCfoAnswer, updateSyntheticAiCfoAnswer, removeSyntheticAiCfoAnswer, clearSyntheticAiCfoAnswers, } = aiCfo.actions;
|
|
494
734
|
export default aiCfo.reducer;
|
|
@@ -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 {
|
|
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,13 @@ 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
|
+
'errored_cards',
|
|
76
|
+
'errored_policy',
|
|
77
|
+
];
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export function detectRuleOverlap({ candidateCriteria, existingRules, excludeRuleId, }) {
|
|
2
|
+
const candidateAmount = pickAmount(candidateCriteria);
|
|
3
|
+
const candidateVendor = pickVendor(candidateCriteria);
|
|
4
|
+
const candidateDepartment = pickDepartment(candidateCriteria);
|
|
5
|
+
const overlaps = [];
|
|
6
|
+
for (const rule of existingRules) {
|
|
7
|
+
if (rule.approvalRuleId === excludeRuleId) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
if (rule.isFallback === true) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const ruleVendor = pickVendor(rule.criteria);
|
|
14
|
+
const ruleDepartment = pickDepartment(rule.criteria);
|
|
15
|
+
if (!areVendorCriteriaEqual(candidateVendor, ruleVendor)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (!areDepartmentCriteriaEqual(candidateDepartment, ruleDepartment)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const ruleAmount = pickAmount(rule.criteria);
|
|
22
|
+
if (amountsOverlap(candidateAmount, ruleAmount)) {
|
|
23
|
+
overlaps.push({ conflictingRule: rule });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return overlaps;
|
|
27
|
+
}
|
|
28
|
+
const pickAmount = (criteria) => criteria.find((c) => c.type === 'amount');
|
|
29
|
+
const pickVendor = (criteria) => criteria.find((c) => c.type === 'vendor');
|
|
30
|
+
const pickDepartment = (criteria) => criteria.find((c) => c.type === 'department');
|
|
31
|
+
const areVendorCriteriaEqual = (a, b) => {
|
|
32
|
+
if (a == null && b == null) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (a == null || b == null) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
if (a.operator !== b.operator) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return idsEqual(a.vendorIds, b.vendorIds);
|
|
42
|
+
};
|
|
43
|
+
const areDepartmentCriteriaEqual = (a, b) => {
|
|
44
|
+
if (a == null && b == null) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (a == null || b == null) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (a.operator !== b.operator) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return idsEqual(a.departmentIds, b.departmentIds);
|
|
54
|
+
};
|
|
55
|
+
const idsEqual = (a, b) => {
|
|
56
|
+
if (a.length !== b.length) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
const aSorted = [...a].sort();
|
|
60
|
+
const bSorted = [...b].sort();
|
|
61
|
+
return aSorted.every((id, i) => id === bSorted[i]);
|
|
62
|
+
};
|
|
63
|
+
const amountsOverlap = (a, b) => {
|
|
64
|
+
// Absent amount criteria covers the whole real line, so any
|
|
65
|
+
// pairing involving an absent one is a guaranteed overlap.
|
|
66
|
+
if (a == null || b == null) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const aLow = a.min?.amount ?? Number.NEGATIVE_INFINITY;
|
|
70
|
+
const aHigh = a.max?.amount ?? Number.POSITIVE_INFINITY;
|
|
71
|
+
const bLow = b.min?.amount ?? Number.NEGATIVE_INFINITY;
|
|
72
|
+
const bHigh = b.max?.amount ?? Number.POSITIVE_INFINITY;
|
|
73
|
+
return Math.max(aLow, bLow) <= Math.min(aHigh, bHigh);
|
|
74
|
+
};
|
|
@@ -14,18 +14,157 @@ export const toApprovalRule = (payload) => ({
|
|
|
14
14
|
version: payload.version,
|
|
15
15
|
criteria: toApprovalCriteria(payload.criteria),
|
|
16
16
|
steps: toApprovalSteps(payload.steps),
|
|
17
|
+
description: payload.description ?? undefined,
|
|
18
|
+
priority: payload.priority,
|
|
19
|
+
isFallback: payload.is_fallback ?? false,
|
|
20
|
+
separationOfDuties: payload.is_separation_of_duty_enabled ?? false,
|
|
21
|
+
areApprovalsSerialized: payload.are_approvals_serialized,
|
|
22
|
+
pendingApprovalsCount: payload.pending_approvals_count,
|
|
23
|
+
pendingEntityApprovalUpdateStatus: payload.pending_entity_approval_update_status,
|
|
17
24
|
});
|
|
25
|
+
/**
|
|
26
|
+
* Maps the wire-level criteria block into the state-side discriminated
|
|
27
|
+
* `Criteria[]` union.
|
|
28
|
+
*
|
|
29
|
+
* The wire keeps each condition as a flat row inside `conditions[]`.
|
|
30
|
+
* Amount comparisons can show up as a `gte` only, a `lte` only, or a
|
|
31
|
+
* `gte` + `lte` pair — those collapse into a single AmountCriteria whose
|
|
32
|
+
* `comparator` is `greater_than`, `less_than`, or `range` respectively.
|
|
33
|
+
*
|
|
34
|
+
* Vendor and department conditions map one-to-one: `in` becomes `is`,
|
|
35
|
+
* `not_in` becomes `is_not`.
|
|
36
|
+
*
|
|
37
|
+
* Resilient to two forms of upstream drift:
|
|
38
|
+
* - Missing / null criteria → returns [].
|
|
39
|
+
* - Legacy criteria shape (array of amount-range objects, the pre-3.0
|
|
40
|
+
* wire) → converted to an AmountCriteria so existing rules in production
|
|
41
|
+
* still render while the backend rolls out.
|
|
42
|
+
*/
|
|
18
43
|
const toApprovalCriteria = (payload) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
44
|
+
if (payload == null) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(payload)) {
|
|
48
|
+
// Legacy pre-3.0 wire: an array of amount-range entries.
|
|
49
|
+
return legacyAmountRangeToCriteria(payload);
|
|
50
|
+
}
|
|
51
|
+
if (!Array.isArray(payload.conditions)) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const results = [];
|
|
55
|
+
const amountCriteria = toAmountCriteria(payload);
|
|
56
|
+
if (amountCriteria != null) {
|
|
57
|
+
results.push(amountCriteria);
|
|
58
|
+
}
|
|
59
|
+
payload.conditions
|
|
60
|
+
.filter((condition) => condition.field === 'vendor_id')
|
|
61
|
+
.forEach((condition) => {
|
|
62
|
+
const vendor = toVendorCriteria(condition);
|
|
63
|
+
if (vendor != null) {
|
|
64
|
+
results.push(vendor);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
payload.conditions
|
|
68
|
+
// Backend wire name is 'accounting_class_id' — kept in sync with
|
|
69
|
+
// the write-side mapper in 'commonPayload.ts'. State-side and
|
|
70
|
+
// form-side keep 'department' / 'departmentIds' to match product
|
|
71
|
+
// copy.
|
|
72
|
+
.filter((condition) => condition.field === 'accounting_class_id')
|
|
73
|
+
.forEach((condition) => {
|
|
74
|
+
const department = toDepartmentCriteria(condition);
|
|
75
|
+
if (department != null) {
|
|
76
|
+
results.push(department);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return results;
|
|
80
|
+
};
|
|
81
|
+
const legacyAmountRangeToCriteria = (legacy) => {
|
|
82
|
+
if (legacy.length === 0) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
// The state-side 'Criteria[]' model allows at most one
|
|
86
|
+
// 'AmountCriteria' per rule (see 'approvalRuleState.ts'). The legacy
|
|
87
|
+
// wire was an array, so a multi-entry payload can't be represented
|
|
88
|
+
// here without losing data. Read the first entry and log a warning
|
|
89
|
+
// if production rules ever ship more — that would signal a backend
|
|
90
|
+
// regression we want to catch early rather than silently truncating.
|
|
91
|
+
if (legacy.length > 1) {
|
|
92
|
+
console.warn('[approvalRulePayload] legacyAmountRangeToCriteria: received ' +
|
|
93
|
+
legacy.length +
|
|
94
|
+
' entries but the state model only supports one; using the ' +
|
|
95
|
+
'first entry and dropping the rest.');
|
|
96
|
+
}
|
|
97
|
+
const first = legacy[0] ?? {};
|
|
98
|
+
const currency = first.currency_code ?? 'USD';
|
|
99
|
+
const symbol = first.currency_symbol ?? '$';
|
|
100
|
+
const min = typeof first.min === 'number'
|
|
101
|
+
? toAmount(first.min, currency, symbol)
|
|
102
|
+
: undefined;
|
|
103
|
+
const max = typeof first.max === 'number'
|
|
104
|
+
? toAmount(first.max, currency, symbol)
|
|
105
|
+
: undefined;
|
|
106
|
+
if (min == null && max == null) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
const comparator = min != null && max != null
|
|
110
|
+
? 'range'
|
|
111
|
+
: min != null
|
|
112
|
+
? 'greater_than'
|
|
113
|
+
: 'less_than';
|
|
114
|
+
return [{ type: 'amount', comparator, min, max }];
|
|
115
|
+
};
|
|
116
|
+
const toAmountCriteria = (payload) => {
|
|
117
|
+
if (!Array.isArray(payload.conditions)) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
const amountConditions = payload.conditions.filter((condition) => condition.field === 'amount');
|
|
121
|
+
// Approval Rules 3.0 — an 'eq' condition represents min === max. Fold
|
|
122
|
+
// it into both finders so it decodes as comparator: 'range' (closed
|
|
123
|
+
// single-point) rather than 'greater_than' (open upper).
|
|
124
|
+
const gteCondition = amountConditions.find((condition) => condition.type === 'gte' || condition.type === 'eq');
|
|
125
|
+
const lteCondition = amountConditions.find((condition) => condition.type === 'lte' || condition.type === 'eq');
|
|
126
|
+
if (gteCondition == null && lteCondition == null) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
const currencyCode = payload.currency_code ?? 'USD';
|
|
130
|
+
const currencySymbol = payload.currency_symbol ?? '$';
|
|
131
|
+
const min = typeof gteCondition?.value === 'number'
|
|
132
|
+
? toAmount(gteCondition.value, currencyCode, currencySymbol)
|
|
133
|
+
: undefined;
|
|
134
|
+
const max = typeof lteCondition?.value === 'number'
|
|
135
|
+
? toAmount(lteCondition.value, currencyCode, currencySymbol)
|
|
136
|
+
: undefined;
|
|
137
|
+
let comparator;
|
|
138
|
+
if (min != null && max != null) {
|
|
139
|
+
comparator = 'range';
|
|
140
|
+
}
|
|
141
|
+
else if (min != null) {
|
|
142
|
+
comparator = 'greater_than';
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
comparator = 'less_than';
|
|
146
|
+
}
|
|
147
|
+
return { type: 'amount', comparator, min, max };
|
|
148
|
+
};
|
|
149
|
+
const toVendorCriteria = (condition) => {
|
|
150
|
+
if (!Array.isArray(condition.value)) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
type: 'vendor',
|
|
155
|
+
operator: condition.type === 'not_in' ? 'is_not' : 'is',
|
|
156
|
+
vendorIds: condition.value,
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
const toDepartmentCriteria = (condition) => {
|
|
160
|
+
if (!Array.isArray(condition.value)) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
type: 'department',
|
|
165
|
+
operator: condition.type === 'not_in' ? 'is_not' : 'is',
|
|
166
|
+
departmentIds: condition.value,
|
|
167
|
+
};
|
|
29
168
|
};
|
|
30
169
|
const toApprovalSteps = (payload) => {
|
|
31
170
|
return payload.map((step) => ({
|
|
@@ -7,3 +7,38 @@ export function getApprovalRulesByIds(approvalRuleState, approvalRuleIds) {
|
|
|
7
7
|
.filter((value) => value != null);
|
|
8
8
|
return approvalRulesByIds;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Returns the amount-range portion of a rule's criteria, if any.
|
|
12
|
+
*
|
|
13
|
+
* Use this whenever a caller needs to read amount min/max from the new
|
|
14
|
+
* discriminated `Criteria` union without inlining a type guard.
|
|
15
|
+
*/
|
|
16
|
+
export function getAmountCriteria(criteria) {
|
|
17
|
+
return criteria.find((c) => c.type === 'amount');
|
|
18
|
+
}
|
|
19
|
+
export function getVendorCriteria(criteria) {
|
|
20
|
+
return criteria.find((c) => c.type === 'vendor');
|
|
21
|
+
}
|
|
22
|
+
export function getDepartmentCriteria(criteria) {
|
|
23
|
+
return criteria.find((c) => c.type === 'department');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns all rules of the given entityType, sorted by `priority` ascending.
|
|
27
|
+
*
|
|
28
|
+
* Rules without a `priority` value sort to the end (treated as Infinity).
|
|
29
|
+
* Use this for the list page where rules render in evaluation order.
|
|
30
|
+
*/
|
|
31
|
+
export function getApprovalRulesByEntityType(approvalRuleState, entityType) {
|
|
32
|
+
return Object.values(approvalRuleState.approvalRuleById)
|
|
33
|
+
.filter((rule) => rule.entityType === entityType)
|
|
34
|
+
.sort((a, b) => (a.priority ?? Infinity) - (b.priority ?? Infinity));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns the tenant's fallback rule for the given entityType, if one exists.
|
|
38
|
+
*
|
|
39
|
+
* The fallback rule is shown by the "fallback engine active" banner on the
|
|
40
|
+
* list page and is used to handle bills/reimbursements that match no other rule.
|
|
41
|
+
*/
|
|
42
|
+
export function getFallbackApprovalRule(approvalRuleState, entityType) {
|
|
43
|
+
return Object.values(approvalRuleState.approvalRuleById).find((rule) => rule.entityType === entityType && rule.isFallback === true);
|
|
44
|
+
}
|