@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.
Files changed (211) hide show
  1. package/lib/commonPayloadTypes/subAccountView/reportBySubAccountPayload.d.ts +0 -2
  2. package/lib/commonStateTypes/common.d.ts +1 -1
  3. package/lib/commonStateTypes/viewAndReport/reportIDHelper.d.ts +0 -1
  4. package/lib/commonStateTypes/viewAndReport/reportIDHelper.js +1 -3
  5. package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
  6. package/lib/commonStateTypes/viewAndReport/viewAndReport.js +1 -1
  7. package/lib/entity/account/accountPayload.d.ts +2 -0
  8. package/lib/entity/account/accountReducer.d.ts +5 -2
  9. package/lib/entity/account/accountReducer.js +10 -7
  10. package/lib/entity/account/accountSelector.d.ts +0 -7
  11. package/lib/entity/account/accountSelector.js +2 -4
  12. package/lib/entity/account/accountState.d.ts +1 -3
  13. package/lib/entity/account/accountState.js +1 -4
  14. package/lib/entity/account/pickAndMergeForecastAccountReport.d.ts +0 -1
  15. package/lib/entity/accountGroup/accountGroupSelector.d.ts +0 -22
  16. package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
  17. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerPayload.d.ts +44 -0
  18. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerPayload.js +55 -0
  19. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerReducer.d.ts +10 -0
  20. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerReducer.js +51 -0
  21. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerSelector.d.ts +48 -0
  22. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerSelector.js +66 -0
  23. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerState.d.ts +52 -0
  24. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerState.js +37 -0
  25. package/lib/entity/billPay/billTransaction/billTransactionState.d.ts +2 -2
  26. package/lib/entity/chargeCard/chargeCard.d.ts +1 -1
  27. package/lib/entity/class/classReducer.d.ts +4 -4
  28. package/lib/entity/class/classState.d.ts +1 -1
  29. package/lib/entity/depositAccountTransaction/depositAccountTransaction.d.ts +1 -1
  30. package/lib/entity/entityApprovalStatus/entityApprovalStatusState.d.ts +2 -2
  31. package/lib/entity/forecast/forecastState.d.ts +1 -1
  32. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +1 -1
  33. package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
  34. package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
  35. package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
  36. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  37. package/lib/entity/tenant/clearAllEpic.d.ts +4 -5
  38. package/lib/entity/tenant/clearAllEpic.js +4 -6
  39. package/lib/entity/tenant/tenantPayload.d.ts +0 -1
  40. package/lib/entity/tenant/tenantReducer.js +0 -1
  41. package/lib/entity/tenant/tenantSelector.d.ts +0 -1
  42. package/lib/entity/tenant/tenantSelector.js +1 -9
  43. package/lib/entity/tenant/tenantState.d.ts +0 -1
  44. package/lib/entity/transaction/payloadTypes/transactionPayload.js +1 -0
  45. package/lib/entity/userRole/userRoleType.d.ts +2 -2
  46. package/lib/epic.d.ts +3 -4
  47. package/lib/epic.js +3 -4
  48. package/lib/esm/commonStateTypes/viewAndReport/reportIDHelper.js +0 -1
  49. package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +1 -1
  50. package/lib/esm/entity/account/accountReducer.js +9 -6
  51. package/lib/esm/entity/account/accountSelector.js +2 -4
  52. package/lib/esm/entity/account/accountState.js +1 -4
  53. package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerPayload.js +49 -0
  54. package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerReducer.js +47 -0
  55. package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerSelector.js +62 -0
  56. package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerState.js +31 -0
  57. package/lib/esm/entity/tenant/clearAllEpic.js +4 -6
  58. package/lib/esm/entity/tenant/tenantReducer.js +0 -1
  59. package/lib/esm/entity/tenant/tenantSelector.js +0 -7
  60. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +1 -0
  61. package/lib/esm/epic.js +3 -4
  62. package/lib/esm/index.js +15 -11
  63. package/lib/esm/reducer.js +6 -9
  64. package/lib/esm/view/aiAccountantView/aiAccountantViewPayload.js +2 -0
  65. package/lib/esm/view/aiAccountantView/aiAccountantViewReducer.js +149 -0
  66. package/lib/esm/view/aiAccountantView/aiAccountantViewSelector.js +72 -0
  67. package/lib/esm/view/aiAccountantView/aiAccountantViewState.js +11 -0
  68. package/lib/esm/view/aiAccountantView/epics/cancelAiAccountantOnboardingEpic.js +46 -0
  69. package/lib/esm/view/aiAccountantView/epics/fetchAiAccountantCustomersEpic.js +27 -0
  70. package/lib/esm/view/aiAccountantView/epics/fetchAiAccountantJobsEpic.js +47 -0
  71. package/lib/esm/view/aiAccountantView/epics/triggerAiAccountantJobEpic.js +52 -0
  72. package/lib/esm/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +44 -0
  73. package/lib/esm/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +4 -9
  74. package/lib/esm/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +44 -0
  75. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +5 -1
  76. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +163 -3
  77. package/lib/esm/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.js +1 -2
  78. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +112 -0
  79. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +10 -6
  80. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +6 -0
  81. package/lib/esm/view/financeStatement/financeStatementSelector.js +1 -12
  82. package/lib/esm/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +4 -2
  83. package/lib/esm/view/reportsResync/reportsClassViewRefetchingEpic.js +0 -4
  84. package/lib/index.d.ts +16 -14
  85. package/lib/index.js +65 -45
  86. package/lib/reducer.d.ts +6 -9
  87. package/lib/reducer.js +6 -9
  88. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  89. package/lib/view/aiAccountantView/aiAccountantViewPayload.d.ts +31 -0
  90. package/lib/view/aiAccountantView/aiAccountantViewPayload.js +8 -0
  91. package/lib/view/aiAccountantView/aiAccountantViewReducer.d.ts +29 -0
  92. package/lib/view/aiAccountantView/aiAccountantViewReducer.js +153 -0
  93. package/lib/view/aiAccountantView/aiAccountantViewSelector.d.ts +14 -0
  94. package/lib/view/aiAccountantView/aiAccountantViewSelector.js +78 -0
  95. package/lib/view/aiAccountantView/aiAccountantViewState.d.ts +27 -0
  96. package/lib/view/aiAccountantView/aiAccountantViewState.js +13 -0
  97. package/lib/view/aiAccountantView/epics/cancelAiAccountantOnboardingEpic.d.ts +33 -0
  98. package/lib/view/aiAccountantView/epics/cancelAiAccountantOnboardingEpic.js +50 -0
  99. package/lib/view/aiAccountantView/epics/fetchAiAccountantCustomersEpic.d.ts +23 -0
  100. package/lib/view/aiAccountantView/epics/fetchAiAccountantCustomersEpic.js +31 -0
  101. package/lib/view/aiAccountantView/epics/fetchAiAccountantJobsEpic.d.ts +33 -0
  102. package/lib/view/aiAccountantView/epics/fetchAiAccountantJobsEpic.js +51 -0
  103. package/lib/view/aiAccountantView/epics/triggerAiAccountantJobEpic.d.ts +28 -0
  104. package/lib/view/aiAccountantView/epics/triggerAiAccountantJobEpic.js +56 -0
  105. package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
  106. package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
  107. package/lib/view/cardBalance/cardBalanceSelector.d.ts +1 -2
  108. package/lib/view/cashBalance/cashBalanceSelector.d.ts +1 -2
  109. package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
  110. package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
  111. package/lib/view/companyView/types/cockpitTypes.d.ts +6 -5
  112. package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
  113. package/lib/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.d.ts +8 -0
  114. package/lib/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +48 -0
  115. package/lib/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +4 -9
  116. package/lib/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.d.ts +9 -0
  117. package/lib/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +48 -0
  118. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  119. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +33 -0
  120. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +5 -1
  121. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +18 -4
  122. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +164 -4
  123. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +6 -2
  124. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.js +2 -2
  125. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +112 -0
  126. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +9 -5
  127. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +3 -0
  128. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +8 -1
  129. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +1 -1
  130. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +13 -0
  131. package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
  132. package/lib/view/financeStatement/financeStatementSelector.d.ts +0 -2
  133. package/lib/view/financeStatement/financeStatementSelector.js +1 -12
  134. package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
  135. package/lib/view/onboardingView/cockpitView/types/onboardingCockpitViewTypes.d.ts +1 -1
  136. package/lib/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +4 -2
  137. package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
  138. package/lib/view/reportsResync/reportsClassViewRefetchingEpic.d.ts +1 -2
  139. package/lib/view/reportsResync/reportsClassViewRefetchingEpic.js +0 -4
  140. package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
  141. package/lib/view/reviewCompanyView/reviewCompanyViewState.d.ts +1 -1
  142. package/lib/view/spendManagement/billPay/billList/billListReducer.d.ts +1 -1
  143. package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
  144. package/lib/view/spendManagement/chargeCards/chargeCardDetail/chargeCardDetail.d.ts +1 -1
  145. package/lib/view/spendManagement/chargeCards/chargeCardDetail/chargeCardDetailReducer.d.ts +4 -4
  146. package/lib/view/spendManagement/reimbursement/remiListView/remiListReducer.d.ts +1 -1
  147. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +3 -3
  148. package/lib/view/subscriptionView/types/subscriptionTypes.d.ts +1 -1
  149. package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
  150. package/lib/view/topEx/topExSelector.d.ts +1 -1
  151. package/package.json +1 -1
  152. package/lib/commonStateTypes/coaBalance/coaBalancesFilterProjectView.d.ts +0 -13
  153. package/lib/commonStateTypes/coaBalance/coaBalancesFilterProjectView.js +0 -9
  154. package/lib/commonStateTypes/projectView/projectViewParentID.d.ts +0 -5
  155. package/lib/commonStateTypes/projectView/projectViewParentID.js +0 -2
  156. package/lib/entity/project/projectPayload.d.ts +0 -13
  157. package/lib/entity/project/projectPayload.js +0 -30
  158. package/lib/entity/project/projectReducer.d.ts +0 -10
  159. package/lib/entity/project/projectReducer.js +0 -31
  160. package/lib/entity/project/projectSelector.d.ts +0 -5
  161. package/lib/entity/project/projectSelector.js +0 -12
  162. package/lib/entity/project/projectState.d.ts +0 -13
  163. package/lib/entity/project/projectState.js +0 -2
  164. package/lib/entity/sectionProjectView/sectionProjectView.d.ts +0 -10
  165. package/lib/entity/sectionProjectView/sectionProjectView.js +0 -6
  166. package/lib/entity/sectionProjectView/sectionProjectViewEpic.d.ts +0 -6
  167. package/lib/entity/sectionProjectView/sectionProjectViewEpic.js +0 -51
  168. package/lib/entity/sectionProjectView/sectionProjectViewHelper.d.ts +0 -9
  169. package/lib/entity/sectionProjectView/sectionProjectViewHelper.js +0 -13
  170. package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +0 -15
  171. package/lib/entity/sectionProjectView/sectionProjectViewReducer.js +0 -50
  172. package/lib/entity/sectionProjectView/sectionProjectViewSelector.d.ts +0 -11
  173. package/lib/entity/sectionProjectView/sectionProjectViewSelector.js +0 -77
  174. package/lib/entity/sectionProjectView/sectionProjectViewSelectorTypes.d.ts +0 -16
  175. package/lib/entity/sectionProjectView/sectionProjectViewSelectorTypes.js +0 -2
  176. package/lib/entity/sectionProjectView/sectionProjectViewState.d.ts +0 -4
  177. package/lib/entity/sectionProjectView/sectionProjectViewState.js +0 -2
  178. package/lib/esm/commonStateTypes/coaBalance/coaBalancesFilterProjectView.js +0 -5
  179. package/lib/esm/commonStateTypes/projectView/projectViewParentID.js +0 -1
  180. package/lib/esm/entity/project/projectPayload.js +0 -26
  181. package/lib/esm/entity/project/projectReducer.js +0 -27
  182. package/lib/esm/entity/project/projectSelector.js +0 -8
  183. package/lib/esm/entity/project/projectState.js +0 -1
  184. package/lib/esm/entity/sectionProjectView/sectionProjectView.js +0 -3
  185. package/lib/esm/entity/sectionProjectView/sectionProjectViewEpic.js +0 -47
  186. package/lib/esm/entity/sectionProjectView/sectionProjectViewHelper.js +0 -9
  187. package/lib/esm/entity/sectionProjectView/sectionProjectViewReducer.js +0 -46
  188. package/lib/esm/entity/sectionProjectView/sectionProjectViewSelector.js +0 -70
  189. package/lib/esm/entity/sectionProjectView/sectionProjectViewSelectorTypes.js +0 -1
  190. package/lib/esm/entity/sectionProjectView/sectionProjectViewState.js +0 -1
  191. package/lib/esm/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.js +0 -45
  192. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewEpic.js +0 -30
  193. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewPayload.js +0 -1
  194. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewReducer.js +0 -113
  195. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewSelector.js +0 -66
  196. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.js +0 -1
  197. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewState.js +0 -1
  198. package/lib/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.d.ts +0 -8
  199. package/lib/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.js +0 -49
  200. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewEpic.d.ts +0 -6
  201. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewEpic.js +0 -34
  202. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewPayload.d.ts +0 -33
  203. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewPayload.js +0 -2
  204. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewReducer.d.ts +0 -33
  205. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewReducer.js +0 -117
  206. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelector.d.ts +0 -9
  207. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelector.js +0 -70
  208. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.d.ts +0 -18
  209. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.js +0 -2
  210. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewState.d.ts +0 -22
  211. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewState.js +0 -2
@@ -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,2 @@
1
+ // Re-export entity payload types and mapping functions.
2
+ export { toAiAccountantCustomer, toAiAccountantEnrollment, toAiAccountantJob, } from '../../entity/aiAccountantCustomer/aiAccountantCustomerPayload';
@@ -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
+ }));
@@ -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
- updateActions.push(updateAccounts(response.data.accounts, 'account_reconciliation'));
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);
@@ -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
+ }));