@zeniai/client-epic-state 4.20.3-betaRD2 → 4.20.3-betaRD21
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/commonPayloadTypes/subAccountView/reportBySubAccountPayload.d.ts +0 -2
- package/lib/commonStateTypes/common.d.ts +1 -1
- package/lib/commonStateTypes/viewAndReport/reportIDHelper.d.ts +0 -1
- package/lib/commonStateTypes/viewAndReport/reportIDHelper.js +1 -3
- package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
- package/lib/commonStateTypes/viewAndReport/viewAndReport.js +1 -1
- package/lib/entity/account/accountPayload.d.ts +2 -0
- package/lib/entity/account/accountReducer.d.ts +5 -2
- package/lib/entity/account/accountReducer.js +10 -7
- package/lib/entity/account/accountSelector.d.ts +0 -7
- package/lib/entity/account/accountSelector.js +2 -4
- package/lib/entity/account/accountState.d.ts +1 -3
- package/lib/entity/account/accountState.js +1 -4
- package/lib/entity/account/pickAndMergeForecastAccountReport.d.ts +0 -1
- package/lib/entity/accountGroup/accountGroupSelector.d.ts +0 -22
- package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerPayload.d.ts +44 -0
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerPayload.js +55 -0
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerReducer.d.ts +10 -0
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerReducer.js +51 -0
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerSelector.d.ts +48 -0
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerSelector.js +66 -0
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerState.d.ts +52 -0
- package/lib/entity/aiAccountantCustomer/aiAccountantCustomerState.js +37 -0
- package/lib/entity/billPay/billTransaction/billTransactionState.d.ts +2 -2
- package/lib/entity/chargeCard/chargeCard.d.ts +1 -1
- package/lib/entity/class/classReducer.d.ts +4 -4
- package/lib/entity/class/classState.d.ts +1 -1
- package/lib/entity/depositAccountTransaction/depositAccountTransaction.d.ts +1 -1
- package/lib/entity/entityApprovalStatus/entityApprovalStatusState.d.ts +2 -2
- package/lib/entity/forecast/forecastState.d.ts +1 -1
- package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +1 -1
- package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
- package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
- package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/tenant/clearAllEpic.d.ts +4 -5
- package/lib/entity/tenant/clearAllEpic.js +4 -6
- package/lib/entity/tenant/tenantPayload.d.ts +0 -1
- package/lib/entity/tenant/tenantReducer.js +0 -1
- package/lib/entity/tenant/tenantSelector.d.ts +0 -1
- package/lib/entity/tenant/tenantSelector.js +1 -9
- package/lib/entity/tenant/tenantState.d.ts +0 -1
- package/lib/entity/transaction/payloadTypes/transactionPayload.js +1 -0
- package/lib/entity/userRole/userRoleType.d.ts +2 -2
- package/lib/epic.d.ts +3 -4
- package/lib/epic.js +3 -4
- package/lib/esm/commonStateTypes/viewAndReport/reportIDHelper.js +0 -1
- package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +1 -1
- package/lib/esm/entity/account/accountReducer.js +9 -6
- package/lib/esm/entity/account/accountSelector.js +2 -4
- package/lib/esm/entity/account/accountState.js +1 -4
- package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerPayload.js +49 -0
- package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerReducer.js +47 -0
- package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerSelector.js +62 -0
- package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerState.js +31 -0
- package/lib/esm/entity/tenant/clearAllEpic.js +4 -6
- package/lib/esm/entity/tenant/tenantReducer.js +0 -1
- package/lib/esm/entity/tenant/tenantSelector.js +0 -7
- package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +1 -0
- package/lib/esm/epic.js +3 -4
- package/lib/esm/index.js +15 -11
- package/lib/esm/reducer.js +6 -9
- package/lib/esm/view/aiAccountantView/aiAccountantViewPayload.js +2 -0
- package/lib/esm/view/aiAccountantView/aiAccountantViewReducer.js +149 -0
- package/lib/esm/view/aiAccountantView/aiAccountantViewSelector.js +72 -0
- package/lib/esm/view/aiAccountantView/aiAccountantViewState.js +11 -0
- package/lib/esm/view/aiAccountantView/epics/cancelAiAccountantOnboardingEpic.js +46 -0
- package/lib/esm/view/aiAccountantView/epics/fetchAiAccountantCustomersEpic.js +27 -0
- package/lib/esm/view/aiAccountantView/epics/fetchAiAccountantJobsEpic.js +47 -0
- package/lib/esm/view/aiAccountantView/epics/triggerAiAccountantJobEpic.js +52 -0
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +44 -0
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +4 -9
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +44 -0
- package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +5 -1
- package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +163 -3
- package/lib/esm/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.js +1 -2
- package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +112 -0
- package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +10 -6
- package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +6 -0
- package/lib/esm/view/financeStatement/financeStatementSelector.js +1 -12
- package/lib/esm/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +4 -2
- package/lib/esm/view/reportsResync/reportsClassViewRefetchingEpic.js +0 -4
- package/lib/index.d.ts +16 -14
- package/lib/index.js +65 -45
- package/lib/reducer.d.ts +6 -9
- package/lib/reducer.js +6 -9
- package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
- package/lib/view/aiAccountantView/aiAccountantViewPayload.d.ts +31 -0
- package/lib/view/aiAccountantView/aiAccountantViewPayload.js +8 -0
- package/lib/view/aiAccountantView/aiAccountantViewReducer.d.ts +29 -0
- package/lib/view/aiAccountantView/aiAccountantViewReducer.js +153 -0
- package/lib/view/aiAccountantView/aiAccountantViewSelector.d.ts +14 -0
- package/lib/view/aiAccountantView/aiAccountantViewSelector.js +78 -0
- package/lib/view/aiAccountantView/aiAccountantViewState.d.ts +27 -0
- package/lib/view/aiAccountantView/aiAccountantViewState.js +13 -0
- package/lib/view/aiAccountantView/epics/cancelAiAccountantOnboardingEpic.d.ts +33 -0
- package/lib/view/aiAccountantView/epics/cancelAiAccountantOnboardingEpic.js +50 -0
- package/lib/view/aiAccountantView/epics/fetchAiAccountantCustomersEpic.d.ts +23 -0
- package/lib/view/aiAccountantView/epics/fetchAiAccountantCustomersEpic.js +31 -0
- package/lib/view/aiAccountantView/epics/fetchAiAccountantJobsEpic.d.ts +33 -0
- package/lib/view/aiAccountantView/epics/fetchAiAccountantJobsEpic.js +51 -0
- package/lib/view/aiAccountantView/epics/triggerAiAccountantJobEpic.d.ts +28 -0
- package/lib/view/aiAccountantView/epics/triggerAiAccountantJobEpic.js +56 -0
- package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
- package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
- package/lib/view/cardBalance/cardBalanceSelector.d.ts +1 -2
- package/lib/view/cashBalance/cashBalanceSelector.d.ts +1 -2
- package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
- package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
- package/lib/view/companyView/types/cockpitTypes.d.ts +6 -5
- package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
- package/lib/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.d.ts +8 -0
- package/lib/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +48 -0
- package/lib/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +4 -9
- package/lib/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.d.ts +9 -0
- package/lib/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +48 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +33 -0
- package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +5 -1
- package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +18 -4
- package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +164 -4
- package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +6 -2
- package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.js +2 -2
- package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +112 -0
- package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +9 -5
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +3 -0
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +8 -1
- package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +1 -1
- package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +13 -0
- package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
- package/lib/view/financeStatement/financeStatementSelector.d.ts +0 -2
- package/lib/view/financeStatement/financeStatementSelector.js +1 -12
- package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
- package/lib/view/onboardingView/cockpitView/types/onboardingCockpitViewTypes.d.ts +1 -1
- package/lib/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +4 -2
- package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
- package/lib/view/reportsResync/reportsClassViewRefetchingEpic.d.ts +1 -2
- package/lib/view/reportsResync/reportsClassViewRefetchingEpic.js +0 -4
- package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
- package/lib/view/reviewCompanyView/reviewCompanyViewState.d.ts +1 -1
- package/lib/view/spendManagement/billPay/billList/billListReducer.d.ts +1 -1
- package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
- package/lib/view/spendManagement/chargeCards/chargeCardDetail/chargeCardDetail.d.ts +1 -1
- package/lib/view/spendManagement/chargeCards/chargeCardDetail/chargeCardDetailReducer.d.ts +4 -4
- package/lib/view/spendManagement/reimbursement/remiListView/remiListReducer.d.ts +1 -1
- package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +3 -3
- package/lib/view/subscriptionView/types/subscriptionTypes.d.ts +1 -1
- package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
- package/lib/view/topEx/topExSelector.d.ts +1 -1
- package/package.json +1 -1
- package/lib/commonStateTypes/coaBalance/coaBalancesFilterProjectView.d.ts +0 -13
- package/lib/commonStateTypes/coaBalance/coaBalancesFilterProjectView.js +0 -9
- package/lib/commonStateTypes/projectView/projectViewParentID.d.ts +0 -5
- package/lib/commonStateTypes/projectView/projectViewParentID.js +0 -2
- package/lib/entity/project/projectPayload.d.ts +0 -13
- package/lib/entity/project/projectPayload.js +0 -30
- package/lib/entity/project/projectReducer.d.ts +0 -10
- package/lib/entity/project/projectReducer.js +0 -31
- package/lib/entity/project/projectSelector.d.ts +0 -5
- package/lib/entity/project/projectSelector.js +0 -12
- package/lib/entity/project/projectState.d.ts +0 -13
- package/lib/entity/project/projectState.js +0 -2
- package/lib/entity/sectionProjectView/sectionProjectView.d.ts +0 -10
- package/lib/entity/sectionProjectView/sectionProjectView.js +0 -6
- package/lib/entity/sectionProjectView/sectionProjectViewEpic.d.ts +0 -6
- package/lib/entity/sectionProjectView/sectionProjectViewEpic.js +0 -51
- package/lib/entity/sectionProjectView/sectionProjectViewHelper.d.ts +0 -9
- package/lib/entity/sectionProjectView/sectionProjectViewHelper.js +0 -13
- package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +0 -15
- package/lib/entity/sectionProjectView/sectionProjectViewReducer.js +0 -50
- package/lib/entity/sectionProjectView/sectionProjectViewSelector.d.ts +0 -11
- package/lib/entity/sectionProjectView/sectionProjectViewSelector.js +0 -77
- package/lib/entity/sectionProjectView/sectionProjectViewSelectorTypes.d.ts +0 -16
- package/lib/entity/sectionProjectView/sectionProjectViewSelectorTypes.js +0 -2
- package/lib/entity/sectionProjectView/sectionProjectViewState.d.ts +0 -4
- package/lib/entity/sectionProjectView/sectionProjectViewState.js +0 -2
- package/lib/esm/commonStateTypes/coaBalance/coaBalancesFilterProjectView.js +0 -5
- package/lib/esm/commonStateTypes/projectView/projectViewParentID.js +0 -1
- package/lib/esm/entity/project/projectPayload.js +0 -26
- package/lib/esm/entity/project/projectReducer.js +0 -27
- package/lib/esm/entity/project/projectSelector.js +0 -8
- package/lib/esm/entity/project/projectState.js +0 -1
- package/lib/esm/entity/sectionProjectView/sectionProjectView.js +0 -3
- package/lib/esm/entity/sectionProjectView/sectionProjectViewEpic.js +0 -47
- package/lib/esm/entity/sectionProjectView/sectionProjectViewHelper.js +0 -9
- package/lib/esm/entity/sectionProjectView/sectionProjectViewReducer.js +0 -46
- package/lib/esm/entity/sectionProjectView/sectionProjectViewSelector.js +0 -70
- package/lib/esm/entity/sectionProjectView/sectionProjectViewSelectorTypes.js +0 -1
- package/lib/esm/entity/sectionProjectView/sectionProjectViewState.js +0 -1
- package/lib/esm/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.js +0 -45
- package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewEpic.js +0 -30
- package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewPayload.js +0 -1
- package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewReducer.js +0 -113
- package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewSelector.js +0 -66
- package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.js +0 -1
- package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewState.js +0 -1
- package/lib/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.d.ts +0 -8
- package/lib/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.js +0 -49
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewEpic.d.ts +0 -6
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewEpic.js +0 -34
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewPayload.d.ts +0 -33
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewPayload.js +0 -2
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewReducer.d.ts +0 -33
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewReducer.js +0 -117
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelector.d.ts +0 -9
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelector.js +0 -70
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.d.ts +0 -18
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.js +0 -2
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewState.d.ts +0 -22
- package/lib/view/profitAndLossProjectView/profitAndLossProjectViewState.js +0 -2
package/lib/esm/reducer.js
CHANGED
|
@@ -14,7 +14,6 @@ import chargeCard, { initialState as initialChargeCardState, } from './entity/ch
|
|
|
14
14
|
import chargeCardRepayment, { initialState as initialChargeCardRepaymentState, } from './entity/chargeCardRepayment/chargeCardRepaymentReducer';
|
|
15
15
|
import chargeCardTransaction, { initialState as initialChargeCardTransactionState, } from './entity/chargeCardTransaction/chargeCardTransactionReducer';
|
|
16
16
|
import classes, { initialState as initialClassState, } from './entity/class/classReducer';
|
|
17
|
-
import project, { initialState as initialProjectState, } from './entity/project/projectReducer';
|
|
18
17
|
import company, { initialState as initialCompanyState, } from './entity/company/companyReducer';
|
|
19
18
|
import companyHealthMetric, { initialState as initialCompanyHealthMetricState, } from './entity/companyHealthMetric/companyHealthMetricReducer';
|
|
20
19
|
import connectedAccount, { initialState as initialConnectedAccountState, } from './entity/connectedAccount/connectedAccountReducer';
|
|
@@ -42,7 +41,6 @@ import accountingSummary, { initialState as initialAccountingSummaryState, } fro
|
|
|
42
41
|
import reimbursement, { initialState as initialReimbursementState, } from './entity/reimbursement/reimbursementReducer';
|
|
43
42
|
import sectionAccountsView, { initialState as initialSectionAccountsViewState, } from './entity/sectionAccountsView/sectionAccountsViewReducer';
|
|
44
43
|
import sectionClassesViewV2, { initialState as initialSectionClassesViewStateV2, } from './entity/sectionClassesViewV2/sectionClassesViewReducer';
|
|
45
|
-
import sectionProjectView, { initialState as initialSectionProjectViewState, } from './entity/sectionProjectView/sectionProjectViewReducer';
|
|
46
44
|
import snackbar, { initialSnackbarState, } from './entity/snackbar/snackbarReducer';
|
|
47
45
|
import subscription, { initialState as initialSubscriptionState, } from './entity/subscription/subscription/subscriptionReducer';
|
|
48
46
|
import subscriptionAddOn, { initialState as initialSubscriptionAddOnState, } from './entity/subscription/subscriptionAddOn/subscriptionAddOnReducer';
|
|
@@ -69,6 +67,8 @@ import accountMapping, { initialState as initialAccountMappingState, } from './v
|
|
|
69
67
|
import addressView, { initialState as initialAddressViewState, } from './view/addressView/addressViewReducer';
|
|
70
68
|
import aggregatedReport, { initialState as initialAggregatedReportViewState, } from './view/aiAgentPerformance/aggregatedReportViewReducer';
|
|
71
69
|
import aiCfoView, { initialAiCfoViewState, } from './view/aiCfoView/aiCfoViewReducer';
|
|
70
|
+
import aiAccountantCustomer, { initialAiAccountantCustomerState, } from './entity/aiAccountantCustomer/aiAccountantCustomerReducer';
|
|
71
|
+
import aiAccountantView, { initialAiAccountantViewState, } from './view/aiAccountantView/aiAccountantViewReducer';
|
|
72
72
|
import apAgingDetail, { initialState as initialApAgingDetailState, } from './view/apAgingView/apAgingDetail/apAgingDetailReducer';
|
|
73
73
|
import apAging, { initialState as initialApAgingState, } from './view/apAgingView/apAgingReport/apAgingReducer';
|
|
74
74
|
import arAgingDetail, { initialState as initialArAgingDetailState, } from './view/arAgingView/arAgingDetail/arAgingDetailReducer';
|
|
@@ -124,7 +124,6 @@ import ownerList, { initialState as initialOwnerListState, } from './view/ownerL
|
|
|
124
124
|
import people, { initialState as initialPeopleState, } from './view/people/peopleReducer';
|
|
125
125
|
import profitAndLoss, { initialState as initialProfitAndLossState, } from './view/profitAndLoss/profitAndLossReducer';
|
|
126
126
|
import profitAndLossClassesView, { initialState as initialProfitAndLossClassesViewState, } from './view/profitAndLossClassesView/profitAndLossClassesViewReducer';
|
|
127
|
-
import profitAndLossProjectView, { initialState as initialProfitAndLossProjectViewState, } from './view/profitAndLossProjectView/profitAndLossProjectViewReducer';
|
|
128
127
|
import recommendation, { initialState as initialEntityRecommendationState, } from './view/recommendation/recommendationReducer';
|
|
129
128
|
import referralView, { initialState as initialReferralViewState, } from './view/referralView/referralReducer';
|
|
130
129
|
import reimbursementCard, { initialState as initialReimbursementCardState, } from './view/reimbursementCard/reimbursementCardReducer';
|
|
@@ -223,6 +222,7 @@ const initialEntitiesState = {
|
|
|
223
222
|
accountReconState: initialAccountReconState,
|
|
224
223
|
accountState: initialAccountState,
|
|
225
224
|
addressState: initialAddressState,
|
|
225
|
+
aiAccountantCustomerState: initialAiAccountantCustomerState,
|
|
226
226
|
aiCfoState: initialAiCfoState,
|
|
227
227
|
approvalRuleState: initialApprovalRuleState,
|
|
228
228
|
bankAccountState: initialBankAccountState,
|
|
@@ -232,7 +232,6 @@ const initialEntitiesState = {
|
|
|
232
232
|
chargeCardRepaymentState: initialChargeCardRepaymentState,
|
|
233
233
|
chargeCardTransactionState: initialChargeCardTransactionState,
|
|
234
234
|
classState: initialClassState,
|
|
235
|
-
projectState: initialProjectState,
|
|
236
235
|
companyHealthMetricState: initialCompanyHealthMetricState,
|
|
237
236
|
companyState: initialCompanyState,
|
|
238
237
|
connectedAccountState: initialConnectedAccountState,
|
|
@@ -261,7 +260,6 @@ const initialEntitiesState = {
|
|
|
261
260
|
reimbursementState: initialReimbursementState,
|
|
262
261
|
sectionAccountsViewState: initialSectionAccountsViewState,
|
|
263
262
|
sectionClassesViewStateV2: initialSectionClassesViewStateV2,
|
|
264
|
-
sectionProjectViewState: initialSectionProjectViewState,
|
|
265
263
|
snackbarState: initialSnackbarState,
|
|
266
264
|
subscriptionAddOnState: initialSubscriptionAddOnState,
|
|
267
265
|
subscriptionCouponState: initialSubscriptionCouponState,
|
|
@@ -291,6 +289,7 @@ const initialViewsState = {
|
|
|
291
289
|
accountMappingState: initialAccountMappingState,
|
|
292
290
|
addressViewState: initialAddressViewState,
|
|
293
291
|
aggregatedReportViewState: initialAggregatedReportViewState,
|
|
292
|
+
aiAccountantViewState: initialAiAccountantViewState,
|
|
294
293
|
aiCfoViewState: initialAiCfoViewState,
|
|
295
294
|
apAgingDetailState: initialApAgingDetailState,
|
|
296
295
|
apAgingState: initialApAgingState,
|
|
@@ -376,7 +375,6 @@ const initialViewsState = {
|
|
|
376
375
|
plaidAccountViewState: initialPlaidAccountViewState,
|
|
377
376
|
previousBillsState: initialPreviousBillsState,
|
|
378
377
|
profitAndLossClassesViewState: initialProfitAndLossClassesViewState,
|
|
379
|
-
profitAndLossProjectViewState: initialProfitAndLossProjectViewState,
|
|
380
378
|
profitAndLossState: initialProfitAndLossState,
|
|
381
379
|
realTimeApprovalState: initialRealTimeApprovalState,
|
|
382
380
|
referralViewState: initialReferralViewState,
|
|
@@ -450,6 +448,7 @@ const entityReducers = {
|
|
|
450
448
|
accountingSummaryState: accountingSummary,
|
|
451
449
|
accountState: account,
|
|
452
450
|
addressState: address,
|
|
451
|
+
aiAccountantCustomerState: aiAccountantCustomer,
|
|
453
452
|
aiCfoState: aiCfo,
|
|
454
453
|
approvalRuleState: approvalRule,
|
|
455
454
|
bankAccountState: bankAccount,
|
|
@@ -460,7 +459,6 @@ const entityReducers = {
|
|
|
460
459
|
chargeCardRepaymentState: chargeCardRepayment,
|
|
461
460
|
chargeCardTransactionState: chargeCardTransaction,
|
|
462
461
|
classState: classes,
|
|
463
|
-
projectState: project,
|
|
464
462
|
companyHealthMetricState: companyHealthMetric,
|
|
465
463
|
companyState: company,
|
|
466
464
|
connectedAccountState: connectedAccount,
|
|
@@ -489,7 +487,6 @@ const entityReducers = {
|
|
|
489
487
|
reimbursementState: reimbursement,
|
|
490
488
|
sectionAccountsViewState: sectionAccountsView,
|
|
491
489
|
sectionClassesViewStateV2: sectionClassesViewV2,
|
|
492
|
-
sectionProjectViewState: sectionProjectView,
|
|
493
490
|
snackbarState: snackbar,
|
|
494
491
|
subscriptionAddOnState: subscriptionAddOn,
|
|
495
492
|
subscriptionCouponState: subscriptionCoupon,
|
|
@@ -519,6 +516,7 @@ const viewReducers = {
|
|
|
519
516
|
accountMappingState: accountMapping,
|
|
520
517
|
addressViewState: addressView,
|
|
521
518
|
aggregatedReportViewState: aggregatedReport,
|
|
519
|
+
aiAccountantViewState: aiAccountantView,
|
|
522
520
|
aiCfoViewState: aiCfoView,
|
|
523
521
|
apAgingDetailState: apAgingDetail,
|
|
524
522
|
apAgingState: apAging,
|
|
@@ -604,7 +602,6 @@ const viewReducers = {
|
|
|
604
602
|
plaidAccountViewState: plaidAccountView,
|
|
605
603
|
previousBillsState: previousBills,
|
|
606
604
|
profitAndLossClassesViewState: profitAndLossClassesView,
|
|
607
|
-
profitAndLossProjectViewState: profitAndLossProjectView,
|
|
608
605
|
profitAndLossState: profitAndLoss,
|
|
609
606
|
realTimeApprovalState: realTimeApproval,
|
|
610
607
|
referralViewState: referralView,
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { createSlice } from '@reduxjs/toolkit';
|
|
2
|
+
export const initialAiAccountantViewState = {
|
|
3
|
+
customersByTenantId: {},
|
|
4
|
+
customersFetchStatus: { fetchState: 'Not-Started' },
|
|
5
|
+
selectedTenantIdsForJobTrigger: [],
|
|
6
|
+
triggerJobStatus: { fetchState: 'Not-Started' },
|
|
7
|
+
uiState: {
|
|
8
|
+
filterText: '',
|
|
9
|
+
filters: {},
|
|
10
|
+
selectedCustomerTenantId: '',
|
|
11
|
+
sortKey: 'companyName',
|
|
12
|
+
sortOrder: 'ascending',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
const aiAccountantView = createSlice({
|
|
16
|
+
name: 'aiAccountantView',
|
|
17
|
+
initialState: initialAiAccountantViewState,
|
|
18
|
+
reducers: {
|
|
19
|
+
// ── Customers ──
|
|
20
|
+
fetchAiAccountantCustomers(draft) {
|
|
21
|
+
draft.customersFetchStatus = { fetchState: 'In-Progress' };
|
|
22
|
+
},
|
|
23
|
+
updateAiAccountantCustomers(draft, action) {
|
|
24
|
+
draft.customersByTenantId = toCustomersByTenantId(action.payload, draft.customersByTenantId);
|
|
25
|
+
draft.customersFetchStatus = { fetchState: 'Completed' };
|
|
26
|
+
},
|
|
27
|
+
updateAiAccountantCustomersFailure(draft, action) {
|
|
28
|
+
draft.customersFetchStatus = {
|
|
29
|
+
fetchState: 'Error',
|
|
30
|
+
error: action.payload,
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
// ── Jobs ──
|
|
34
|
+
fetchAiAccountantJobs: {
|
|
35
|
+
reducer(draft, action) {
|
|
36
|
+
const customerView = draft.customersByTenantId[action.payload.tenantId];
|
|
37
|
+
if (customerView != null) {
|
|
38
|
+
customerView.jobsFetchStatus = { fetchState: 'In-Progress' };
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
prepare(tenantId, fetchNextPage) {
|
|
42
|
+
return { payload: { tenantId, fetchNextPage: fetchNextPage ?? false } };
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
updateAiAccountantJobs: {
|
|
46
|
+
reducer(draft, action) {
|
|
47
|
+
const customerView = draft.customersByTenantId[action.payload.tenantId];
|
|
48
|
+
if (customerView != null) {
|
|
49
|
+
customerView.jobsFetchStatus = { fetchState: 'Completed' };
|
|
50
|
+
customerView.jobsPageToken = action.payload.nextPageToken;
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
prepare(tenantId, nextPageToken) {
|
|
54
|
+
return { payload: { tenantId, nextPageToken: nextPageToken ?? null } };
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
updateAiAccountantJobsFailure(draft, action) {
|
|
58
|
+
const customerView = draft.customersByTenantId[action.payload.tenantId];
|
|
59
|
+
if (customerView != null) {
|
|
60
|
+
customerView.jobsFetchStatus = {
|
|
61
|
+
fetchState: 'Error',
|
|
62
|
+
error: action.payload.error,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
setSelectedTenantIdsForJobTrigger(draft, action) {
|
|
67
|
+
draft.selectedTenantIdsForJobTrigger = action.payload;
|
|
68
|
+
},
|
|
69
|
+
// ── Trigger Job ──
|
|
70
|
+
triggerAiAccountantJob: {
|
|
71
|
+
reducer(draft,
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
73
|
+
_action) {
|
|
74
|
+
draft.triggerJobStatus = { fetchState: 'In-Progress' };
|
|
75
|
+
},
|
|
76
|
+
prepare(operationType, startDate, endDate) {
|
|
77
|
+
return { payload: { operationType, startDate, endDate } };
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
triggerAiAccountantJobSuccess(draft) {
|
|
81
|
+
draft.triggerJobStatus = { fetchState: 'Completed' };
|
|
82
|
+
},
|
|
83
|
+
triggerAiAccountantJobFailure(draft, action) {
|
|
84
|
+
draft.triggerJobStatus = { fetchState: 'Error', error: action.payload };
|
|
85
|
+
},
|
|
86
|
+
// ── Cancel Onboarding ──
|
|
87
|
+
cancelAiAccountantOnboarding: {
|
|
88
|
+
reducer(draft, action) {
|
|
89
|
+
const customerView = draft.customersByTenantId[action.payload.tenantId];
|
|
90
|
+
if (customerView != null) {
|
|
91
|
+
customerView.cancelOnboardingStatus = { fetchState: 'In-Progress' };
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
prepare(companyId, tenantId) {
|
|
95
|
+
return { payload: { companyId, tenantId } };
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
cancelAiAccountantOnboardingSuccess: {
|
|
99
|
+
reducer(draft, action) {
|
|
100
|
+
const customerView = draft.customersByTenantId[action.payload.tenantId];
|
|
101
|
+
if (customerView != null) {
|
|
102
|
+
customerView.cancelOnboardingStatus = { fetchState: 'Completed' };
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
prepare(tenantId) {
|
|
106
|
+
return { payload: { tenantId } };
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
cancelAiAccountantOnboardingFailure: {
|
|
110
|
+
reducer(draft, action) {
|
|
111
|
+
const customerView = draft.customersByTenantId[action.payload.tenantId];
|
|
112
|
+
if (customerView != null) {
|
|
113
|
+
customerView.cancelOnboardingStatus = {
|
|
114
|
+
fetchState: 'Error',
|
|
115
|
+
error: action.payload.error,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
prepare(tenantId, error) {
|
|
120
|
+
return { payload: { tenantId, error } };
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
// ── UI State ──
|
|
124
|
+
updateAiAccountantUIState(draft, action) {
|
|
125
|
+
Object.assign(draft.uiState, action.payload);
|
|
126
|
+
},
|
|
127
|
+
// ── Clear ──
|
|
128
|
+
clearAiAccountantView() {
|
|
129
|
+
return initialAiAccountantViewState;
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
export const { cancelAiAccountantOnboarding, cancelAiAccountantOnboardingFailure, cancelAiAccountantOnboardingSuccess, clearAiAccountantView, fetchAiAccountantCustomers, fetchAiAccountantJobs, setSelectedTenantIdsForJobTrigger, triggerAiAccountantJob, triggerAiAccountantJobFailure, triggerAiAccountantJobSuccess, updateAiAccountantCustomers, updateAiAccountantCustomersFailure, updateAiAccountantJobs, updateAiAccountantJobsFailure, updateAiAccountantUIState, } = aiAccountantView.actions;
|
|
134
|
+
export default aiAccountantView.reducer;
|
|
135
|
+
// ── Helpers ──
|
|
136
|
+
const toCustomersByTenantId = (customers, existing) => {
|
|
137
|
+
const result = {};
|
|
138
|
+
for (const payload of customers) {
|
|
139
|
+
const tenantId = payload.tenant_id;
|
|
140
|
+
const existingState = existing[tenantId];
|
|
141
|
+
result[tenantId] = existingState ?? {
|
|
142
|
+
cancelOnboardingStatus: { fetchState: 'Not-Started' },
|
|
143
|
+
jobsFetchStatus: { fetchState: 'Not-Started' },
|
|
144
|
+
jobsPageToken: null,
|
|
145
|
+
tenantId,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createSelector } from '@reduxjs/toolkit';
|
|
2
|
+
import orderBy from 'lodash/orderBy';
|
|
3
|
+
import { getAiAccountantCustomers, } from '../../entity/aiAccountantCustomer/aiAccountantCustomerSelector';
|
|
4
|
+
export const getAiAccountantCockpitView = createSelector((state) => state.aiAccountantViewState, (state) => state.aiAccountantCustomerState, (state) => state.userState, (viewState, customerEntityState, userState) => {
|
|
5
|
+
const { customersByTenantId, customersFetchStatus, selectedTenantIdsForJobTrigger, triggerJobStatus, uiState, } = viewState;
|
|
6
|
+
const allCustomers = getAiAccountantCustomers(customerEntityState, userState);
|
|
7
|
+
let filteredCustomers = allCustomers;
|
|
8
|
+
// Text filter
|
|
9
|
+
const trimmedFilterText = uiState.filterText.trim();
|
|
10
|
+
if (trimmedFilterText.length > 0) {
|
|
11
|
+
const query = trimmedFilterText.toLowerCase();
|
|
12
|
+
filteredCustomers = filteredCustomers.filter((customer) => customer.companyName.toLowerCase().includes(query) ||
|
|
13
|
+
customer.tenantId.toLowerCase().includes(query));
|
|
14
|
+
}
|
|
15
|
+
// Cockpit filters (e.g. enrollmentStatus)
|
|
16
|
+
const enrollmentStatusFilter = uiState.filters.categories?.find((category) => category.field === 'enrollmentStatus');
|
|
17
|
+
if (enrollmentStatusFilter != null &&
|
|
18
|
+
enrollmentStatusFilter.values.length > 0) {
|
|
19
|
+
const selectedStatuses = enrollmentStatusFilter.values.map(String);
|
|
20
|
+
const isEqual = enrollmentStatusFilter.matchingOperator === 'equal';
|
|
21
|
+
filteredCustomers = filteredCustomers.filter((customer) => {
|
|
22
|
+
const status = customer.enrollment?.status ?? 'unknown';
|
|
23
|
+
const matches = selectedStatuses.includes(status);
|
|
24
|
+
return isEqual ? matches : !matches;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Sorting
|
|
28
|
+
const sortedCustomers = getSortedCustomers(filteredCustomers, uiState.sortKey, uiState.sortOrder);
|
|
29
|
+
const selectedCustomersForJobTrigger = allCustomers.filter((customer) => selectedTenantIdsForJobTrigger.includes(customer.tenantId));
|
|
30
|
+
return {
|
|
31
|
+
averageAccuracy: calcOverallAverageAccuracy(allCustomers),
|
|
32
|
+
fetchState: customersFetchStatus.fetchState,
|
|
33
|
+
error: customersFetchStatus.error,
|
|
34
|
+
customers: sortedCustomers,
|
|
35
|
+
customerViewStateByTenantId: customersByTenantId,
|
|
36
|
+
selectedCustomersForJobTrigger,
|
|
37
|
+
triggerJobStatus,
|
|
38
|
+
uiState,
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
// ── Helpers ──
|
|
42
|
+
const getSortedCustomers = (customers, sortKey, sortOrder) => {
|
|
43
|
+
const direction = sortOrder === 'ascending' ? 'asc' : 'desc';
|
|
44
|
+
return orderBy(customers, (customer) => {
|
|
45
|
+
switch (sortKey) {
|
|
46
|
+
case 'companyName':
|
|
47
|
+
return customer.companyName.toLowerCase();
|
|
48
|
+
case 'status':
|
|
49
|
+
return (customer.enrollment?.status ?? 'unknown').toLowerCase();
|
|
50
|
+
case 'bookcloseDate':
|
|
51
|
+
return customer.bookcloseDate?.valueOf() ?? 0;
|
|
52
|
+
case 'latestTraining':
|
|
53
|
+
return customer.enrollment?.latestTraining?.valueOf() ?? 0;
|
|
54
|
+
case 'latestSync':
|
|
55
|
+
return customer.enrollment?.latestTransactionSync?.valueOf() ?? 0;
|
|
56
|
+
case 'accuracy':
|
|
57
|
+
return customer.averageAccuracy;
|
|
58
|
+
default:
|
|
59
|
+
return customer.companyName.toLowerCase();
|
|
60
|
+
}
|
|
61
|
+
}, direction);
|
|
62
|
+
};
|
|
63
|
+
const calcOverallAverageAccuracy = (customers) => {
|
|
64
|
+
const customerAccuracies = customers
|
|
65
|
+
.map((customer) => customer.averageAccuracy)
|
|
66
|
+
.filter((accuracy) => accuracy > 0);
|
|
67
|
+
if (customerAccuracies.length === 0) {
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
return (customerAccuracies.reduce((sum, accuracy) => sum + accuracy, 0) /
|
|
71
|
+
customerAccuracies.length);
|
|
72
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { stringToUnion } from '../../commonStateTypes/stringToUnion';
|
|
2
|
+
const ALL_AI_ACCOUNTANT_SORT_KEYS = [
|
|
3
|
+
'companyName',
|
|
4
|
+
'status',
|
|
5
|
+
'bookcloseDate',
|
|
6
|
+
'latestTraining',
|
|
7
|
+
'latestSync',
|
|
8
|
+
'accuracy',
|
|
9
|
+
];
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11
|
+
const toAiAccountantSortKeyType = (v) => stringToUnion(v, ALL_AI_ACCOUNTANT_SORT_KEYS);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { from } from 'rxjs';
|
|
2
|
+
import { catchError, filter, mergeMap } from 'rxjs/operators';
|
|
3
|
+
import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
|
|
4
|
+
import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
|
|
5
|
+
import { cancelAiAccountantOnboarding, cancelAiAccountantOnboardingFailure, cancelAiAccountantOnboardingSuccess, fetchAiAccountantCustomers, } from '../aiAccountantViewReducer';
|
|
6
|
+
export const cancelAiAccountantOnboardingEpic = (actions$, _, zeniAPI) => actions$.pipe(filter(cancelAiAccountantOnboarding.match), mergeMap((action) => {
|
|
7
|
+
const { tenantId, companyId } = action.payload;
|
|
8
|
+
const base = `${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/cockpit-panels`;
|
|
9
|
+
const url = `${base}/ai-accountant/cancel-onboarding`;
|
|
10
|
+
return zeniAPI
|
|
11
|
+
.postAndGetJSON(url, {
|
|
12
|
+
tenant_id: tenantId,
|
|
13
|
+
company_id: companyId,
|
|
14
|
+
})
|
|
15
|
+
.pipe(mergeMap((response) => {
|
|
16
|
+
if (isSuccessResponse(response)) {
|
|
17
|
+
return from([
|
|
18
|
+
cancelAiAccountantOnboardingSuccess(tenantId),
|
|
19
|
+
fetchAiAccountantCustomers(),
|
|
20
|
+
openSnackbar({
|
|
21
|
+
messageSection: 'common',
|
|
22
|
+
messageText: 'success',
|
|
23
|
+
type: 'success',
|
|
24
|
+
}),
|
|
25
|
+
]);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return from([
|
|
29
|
+
cancelAiAccountantOnboardingFailure(tenantId, response.status),
|
|
30
|
+
openSnackbar({
|
|
31
|
+
messageSection: 'common',
|
|
32
|
+
messageText: 'failed',
|
|
33
|
+
type: 'error',
|
|
34
|
+
}),
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
}), catchError((error) => from([
|
|
38
|
+
cancelAiAccountantOnboardingFailure(tenantId, createZeniAPIStatus('Unexpected error', 'AI Accountant cancel onboarding failed: ' +
|
|
39
|
+
JSON.stringify(error))),
|
|
40
|
+
openSnackbar({
|
|
41
|
+
messageSection: 'common',
|
|
42
|
+
messageText: 'failed',
|
|
43
|
+
type: 'error',
|
|
44
|
+
}),
|
|
45
|
+
])));
|
|
46
|
+
}));
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { from, of } from 'rxjs';
|
|
2
|
+
import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
|
+
import { updateAiAccountantCustomers as updateAiAccountantCustomerEntities } from '../../../entity/aiAccountantCustomer/aiAccountantCustomerReducer';
|
|
4
|
+
import { updateAllUsers } from '../../../entity/user/userReducer';
|
|
5
|
+
import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
|
|
6
|
+
import { fetchAiAccountantCustomers, updateAiAccountantCustomers, updateAiAccountantCustomersFailure, } from '../aiAccountantViewReducer';
|
|
7
|
+
export const fetchAiAccountantCustomersEpic = (actions$, _, zeniAPI) => actions$.pipe(filter(fetchAiAccountantCustomers.match), switchMap(() => {
|
|
8
|
+
const base = `${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/cockpit-panels`;
|
|
9
|
+
const url = `${base}/ai-accountant/customers`;
|
|
10
|
+
return zeniAPI
|
|
11
|
+
.getJSON(url)
|
|
12
|
+
.pipe(mergeMap((response) => {
|
|
13
|
+
if (isSuccessResponse(response)) {
|
|
14
|
+
const customers = response.data?.customers ?? [];
|
|
15
|
+
const users = response.data?.users ?? [];
|
|
16
|
+
return from([
|
|
17
|
+
updateAiAccountantCustomerEntities(customers),
|
|
18
|
+
updateAllUsers({ users }),
|
|
19
|
+
updateAiAccountantCustomers(customers),
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return of(updateAiAccountantCustomersFailure(response.status));
|
|
24
|
+
}
|
|
25
|
+
}), catchError((error) => of(updateAiAccountantCustomersFailure(createZeniAPIStatus('Unexpected error', 'AI Accountant customers fetch failed: ' +
|
|
26
|
+
JSON.stringify(error))))));
|
|
27
|
+
}));
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { from, of } from 'rxjs';
|
|
2
|
+
import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
|
+
import { updateAiAccountantJobs as updateAiAccountantJobEntities } from '../../../entity/aiAccountantCustomer/aiAccountantCustomerReducer';
|
|
4
|
+
import { updateAllUsers } from '../../../entity/user/userReducer';
|
|
5
|
+
import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
|
|
6
|
+
import { fetchAiAccountantJobs, updateAiAccountantJobs, updateAiAccountantJobsFailure, } from '../aiAccountantViewReducer';
|
|
7
|
+
export const fetchAiAccountantJobsEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchAiAccountantJobs.match), switchMap((action) => {
|
|
8
|
+
const { tenantId, fetchNextPage } = action.payload;
|
|
9
|
+
const rootState = state$.value;
|
|
10
|
+
const customerView = rootState.aiAccountantViewState.customersByTenantId[tenantId];
|
|
11
|
+
const pageToken = fetchNextPage && customerView?.jobsPageToken != null
|
|
12
|
+
? customerView.jobsPageToken
|
|
13
|
+
: null;
|
|
14
|
+
const params = new URLSearchParams({
|
|
15
|
+
page_size: '50',
|
|
16
|
+
tenant_id: tenantId,
|
|
17
|
+
});
|
|
18
|
+
if (pageToken != null) {
|
|
19
|
+
params.set('page_token', pageToken);
|
|
20
|
+
}
|
|
21
|
+
const base = `${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/cockpit-panels`;
|
|
22
|
+
const url = `${base}/ai-accountant/jobs?${params.toString()}`;
|
|
23
|
+
return zeniAPI
|
|
24
|
+
.getJSON(url)
|
|
25
|
+
.pipe(mergeMap((response) => {
|
|
26
|
+
if (isSuccessResponse(response)) {
|
|
27
|
+
const jobs = response.data?.jobs ?? [];
|
|
28
|
+
const users = response.data?.users ?? [];
|
|
29
|
+
const nextPageToken = response.data?.next_page_token ?? null;
|
|
30
|
+
return from([
|
|
31
|
+
updateAllUsers({ users }),
|
|
32
|
+
updateAiAccountantJobEntities(tenantId, jobs, fetchNextPage),
|
|
33
|
+
updateAiAccountantJobs(tenantId, nextPageToken),
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return of(updateAiAccountantJobsFailure({
|
|
38
|
+
tenantId,
|
|
39
|
+
error: response.status,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
}), catchError((error) => of(updateAiAccountantJobsFailure({
|
|
43
|
+
tenantId,
|
|
44
|
+
error: createZeniAPIStatus('Unexpected error', 'AI Accountant jobs fetch failed: ' +
|
|
45
|
+
JSON.stringify(error)),
|
|
46
|
+
}))));
|
|
47
|
+
}));
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { from } from 'rxjs';
|
|
2
|
+
import { catchError, filter, mergeMap } from 'rxjs/operators';
|
|
3
|
+
import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
|
|
4
|
+
import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
|
|
5
|
+
import { fetchAiAccountantCustomers, triggerAiAccountantJob, triggerAiAccountantJobFailure, triggerAiAccountantJobSuccess, } from '../aiAccountantViewReducer';
|
|
6
|
+
export const triggerAiAccountantJobEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(triggerAiAccountantJob.match), mergeMap((action) => {
|
|
7
|
+
const { operationType, startDate, endDate } = action.payload;
|
|
8
|
+
const rootState = state$.value;
|
|
9
|
+
const selectedTenantIds = rootState.aiAccountantViewState.selectedTenantIdsForJobTrigger;
|
|
10
|
+
const base = `${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/cockpit-panels`;
|
|
11
|
+
const url = `${base}/ai-accountant/jobs`;
|
|
12
|
+
return zeniAPI
|
|
13
|
+
.postAndGetJSON(url, {
|
|
14
|
+
tenant_ids: selectedTenantIds,
|
|
15
|
+
operation_type: operationType,
|
|
16
|
+
params: {
|
|
17
|
+
start_date: startDate,
|
|
18
|
+
end_date: endDate,
|
|
19
|
+
},
|
|
20
|
+
})
|
|
21
|
+
.pipe(mergeMap((response) => {
|
|
22
|
+
if (isSuccessResponse(response)) {
|
|
23
|
+
return from([
|
|
24
|
+
triggerAiAccountantJobSuccess(),
|
|
25
|
+
fetchAiAccountantCustomers(),
|
|
26
|
+
openSnackbar({
|
|
27
|
+
messageSection: 'common',
|
|
28
|
+
messageText: 'success',
|
|
29
|
+
type: 'success',
|
|
30
|
+
}),
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return from([
|
|
35
|
+
triggerAiAccountantJobFailure(response.status),
|
|
36
|
+
openSnackbar({
|
|
37
|
+
messageSection: 'common',
|
|
38
|
+
messageText: 'failed',
|
|
39
|
+
type: 'error',
|
|
40
|
+
}),
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
}), catchError((error) => from([
|
|
44
|
+
triggerAiAccountantJobFailure(createZeniAPIStatus('Unexpected error', 'AI Accountant trigger job failed: ' +
|
|
45
|
+
JSON.stringify(error))),
|
|
46
|
+
openSnackbar({
|
|
47
|
+
messageSection: 'common',
|
|
48
|
+
messageText: 'failed',
|
|
49
|
+
type: 'error',
|
|
50
|
+
}),
|
|
51
|
+
])));
|
|
52
|
+
}));
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { of } from 'rxjs';
|
|
2
|
+
import { catchError, filter, mergeMap } from 'rxjs/operators';
|
|
3
|
+
import { changeAccountKey } from '../../../../entity/account/accountReducer';
|
|
4
|
+
import { getAccountKey } from '../../../../entity/account/accountState';
|
|
5
|
+
import { getAccountReconByAccountIdAndSelectedPeriod } from '../../../../entity/accountRecon/accountReconSelector';
|
|
6
|
+
import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
|
|
7
|
+
import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
|
|
8
|
+
import { excludeAccountFromReconciliation, excludeAccountFromReconciliationFailure, excludeAccountFromReconciliationSuccess, } from '../../reducers/reconciliationViewReducer';
|
|
9
|
+
export const excludeAccountFromReconciliationEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(excludeAccountFromReconciliation.match), mergeMap((action) => {
|
|
10
|
+
const { accountId } = action.payload;
|
|
11
|
+
const state = state$.value;
|
|
12
|
+
const currentTenant = getCurrentTenant(state);
|
|
13
|
+
const selectedPeriod = state.expenseAutomationViewState.selectedPeriodByTenantId[currentTenant.tenantId];
|
|
14
|
+
const reconciliationData = getAccountReconByAccountIdAndSelectedPeriod(state, accountId, selectedPeriod);
|
|
15
|
+
const payload = {
|
|
16
|
+
account_id: accountId,
|
|
17
|
+
bank_balance: reconciliationData?.balance?.amount ?? null,
|
|
18
|
+
cleared_balance: reconciliationData?.clearedBalance?.amount ?? null,
|
|
19
|
+
variance: reconciliationData?.variance?.amount ?? null,
|
|
20
|
+
};
|
|
21
|
+
const apiUrl = `${zeniAPI.apiEndPoints.reconciliationMicroServiceBaseUrl}/1.0/reconciliation/excluded-accounts`;
|
|
22
|
+
return zeniAPI
|
|
23
|
+
.postAndGetJSON(apiUrl, payload)
|
|
24
|
+
.pipe(mergeMap((response) => {
|
|
25
|
+
if (isSuccessResponse(response)) {
|
|
26
|
+
const newAccountKey = getAccountKey('excluded_account_reconciliation', accountId);
|
|
27
|
+
const oldAccountKey = getAccountKey('account_reconciliation', accountId);
|
|
28
|
+
return of(excludeAccountFromReconciliationSuccess({
|
|
29
|
+
account: response.data?.excluded_account ?? undefined,
|
|
30
|
+
selectedPeriod,
|
|
31
|
+
}), changeAccountKey({
|
|
32
|
+
oldKey: oldAccountKey,
|
|
33
|
+
newKey: newAccountKey,
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return of(excludeAccountFromReconciliationFailure({
|
|
38
|
+
error: response.status,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
}), catchError((error) => of(excludeAccountFromReconciliationFailure({
|
|
42
|
+
error: createZeniAPIStatus('Unexpected Error', `Exclude account from reconciliation REST API call errored out ${JSON.stringify(error)}`),
|
|
43
|
+
}))));
|
|
44
|
+
}));
|
package/lib/esm/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js
CHANGED
|
@@ -53,22 +53,17 @@ export const fetchReconciliationViewEpic = (actions$, state$, zeniAPI) => action
|
|
|
53
53
|
return zeniAPI.getJSON(apiUrl).pipe(mergeMap((response) => {
|
|
54
54
|
if (isSuccessResponse(response) && response.data != null) {
|
|
55
55
|
const updateActions = [];
|
|
56
|
-
|
|
57
|
-
updateActions.push(updateAllUsers({
|
|
56
|
+
const allTransactionsPerRecon = getAllReviewTransactionsFromReconcilePayload(response.data.reconciliation);
|
|
57
|
+
updateActions.push(updateAccounts(response.data.accounts, 'account_reconciliation'), updateAccounts(response.data.excluded_accounts ?? [], 'excluded_account_reconciliation'), updateAllUsers({
|
|
58
58
|
users: response.data.users ?? [],
|
|
59
59
|
updateType: 'merge',
|
|
60
|
-
}));
|
|
61
|
-
updateActions.push(updateFiles({ files: response.data.files ?? [] }));
|
|
62
|
-
const allTransactionsPerRecon = getAllReviewTransactionsFromReconcilePayload(response.data.reconciliation);
|
|
63
|
-
updateActions.push(updateMultipleReconcileTransactions(allTransactionsPerRecon, 'merge'));
|
|
64
|
-
updateActions.push(updateAccountRecon(selectedPeriod, response.data.reconciliation));
|
|
60
|
+
}), updateFiles({ files: response.data.files ?? [] }), updateMultipleReconcileTransactions(allTransactionsPerRecon, 'merge'), updateAccountRecon(selectedPeriod, response.data.reconciliation));
|
|
65
61
|
const reviewTabLocalData = prepareReviewTabLocalData(response.data.reconciliation[0]?.transactions?.review ?? []);
|
|
66
62
|
if (accountId != null) {
|
|
67
63
|
const selectedTransactionIds = getTransactionIdFromCheckedMatchedTransactionPayload(response.data.reconciliation[0].transactions.reconcile);
|
|
68
64
|
updateActions.push(updateReconcileTabLocalData({
|
|
69
65
|
selectedTransactionIds: selectedTransactionIds,
|
|
70
|
-
}));
|
|
71
|
-
updateActions.push(initializeReconciliationReviewTabLocalData(reviewTabLocalData));
|
|
66
|
+
}), initializeReconciliationReviewTabLocalData(reviewTabLocalData));
|
|
72
67
|
}
|
|
73
68
|
updateActions.push(fetchReconciliationSuccess(selectedPeriod, response.data, refreshViewInBackground, accountId));
|
|
74
69
|
return from(updateActions);
|
package/lib/esm/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { of } from 'rxjs';
|
|
2
|
+
import { catchError, filter, mergeMap } from 'rxjs/operators';
|
|
3
|
+
import { convertToPeriod } from '../../../../commonStateTypes/timePeriod';
|
|
4
|
+
import { changeAccountKey } from '../../../../entity/account/accountReducer';
|
|
5
|
+
import { getAccountKey } from '../../../../entity/account/accountState';
|
|
6
|
+
import { updateAccountRecon } from '../../../../entity/accountRecon/accountReconReducer';
|
|
7
|
+
import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
|
|
8
|
+
import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
|
|
9
|
+
import { includeAccountInReconciliation, includeAccountInReconciliationFailure, includeAccountInReconciliationSuccess, } from '../../reducers/reconciliationViewReducer';
|
|
10
|
+
export const includeAccountInReconciliationEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(includeAccountInReconciliation.match), mergeMap((action) => {
|
|
11
|
+
const { accountId } = action.payload;
|
|
12
|
+
const state = state$.value;
|
|
13
|
+
const currentTenant = getCurrentTenant(state);
|
|
14
|
+
const selectedPeriod = state.expenseAutomationViewState.selectedPeriodByTenantId[currentTenant.tenantId];
|
|
15
|
+
const period = convertToPeriod(selectedPeriod, true);
|
|
16
|
+
const query = JSON.stringify({
|
|
17
|
+
start_date: period.start,
|
|
18
|
+
end_date: period.end,
|
|
19
|
+
});
|
|
20
|
+
const apiUrl = `${zeniAPI.apiEndPoints.reconciliationMicroServiceBaseUrl}/1.0/reconciliation/excluded-accounts/${accountId}?query=${encodeURIComponent(query)}`;
|
|
21
|
+
return zeniAPI
|
|
22
|
+
.deleteAndGetJSON(apiUrl)
|
|
23
|
+
.pipe(mergeMap((response) => {
|
|
24
|
+
if (isSuccessResponse(response) && response.data != null) {
|
|
25
|
+
const reconciliation = response.data.reconciliation;
|
|
26
|
+
const oldAccountKey = getAccountKey('excluded_account_reconciliation', reconciliation.account_id);
|
|
27
|
+
const newAccountKey = getAccountKey('account_reconciliation', reconciliation.account_id);
|
|
28
|
+
return of(updateAccountRecon(selectedPeriod, [reconciliation]), includeAccountInReconciliationSuccess({
|
|
29
|
+
reconciliation,
|
|
30
|
+
selectedPeriod,
|
|
31
|
+
}), changeAccountKey({
|
|
32
|
+
oldKey: oldAccountKey,
|
|
33
|
+
newKey: newAccountKey,
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return of(includeAccountInReconciliationFailure({
|
|
38
|
+
error: response.status,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
}), catchError((error) => of(includeAccountInReconciliationFailure({
|
|
42
|
+
error: createZeniAPIStatus('Unexpected Error', `Include account in reconciliation REST API call errored out ${JSON.stringify(error)}`),
|
|
43
|
+
}))));
|
|
44
|
+
}));
|