@zeniai/client-epic-state 4.20.11 → 5.0.0-betaRD1

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 (350) hide show
  1. package/lib/common/aiCfo/aiCfoSuggestedQuestionsPageContext.d.ts +19 -0
  2. package/lib/common/aiCfo/aiCfoSuggestedQuestionsPageContext.js +2 -0
  3. package/lib/commonPayloadTypes/subAccountView/reportBySubAccountPayload.d.ts +2 -0
  4. package/lib/commonStateTypes/animations.d.ts +1 -1
  5. package/lib/commonStateTypes/animations.js +3 -0
  6. package/lib/commonStateTypes/coaBalance/coaBalancesFilterProjectView.d.ts +13 -0
  7. package/lib/commonStateTypes/coaBalance/coaBalancesFilterProjectView.js +9 -0
  8. package/lib/commonStateTypes/common.d.ts +1 -1
  9. package/lib/commonStateTypes/projectView/projectViewParentID.d.ts +5 -0
  10. package/lib/commonStateTypes/projectView/projectViewParentID.js +2 -0
  11. package/lib/commonStateTypes/viewAndReport/reportIDHelper.d.ts +1 -0
  12. package/lib/commonStateTypes/viewAndReport/reportIDHelper.js +3 -1
  13. package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
  14. package/lib/commonStateTypes/viewAndReport/viewAndReport.js +2 -0
  15. package/lib/entity/account/accountPayload.d.ts +2 -0
  16. package/lib/entity/account/accountReducer.d.ts +5 -2
  17. package/lib/entity/account/accountReducer.js +12 -5
  18. package/lib/entity/account/accountSelector.d.ts +7 -0
  19. package/lib/entity/account/accountSelector.js +4 -2
  20. package/lib/entity/account/accountState.d.ts +3 -1
  21. package/lib/entity/account/accountState.js +4 -1
  22. package/lib/entity/account/pickAndMergeForecastAccountReport.d.ts +1 -0
  23. package/lib/entity/account/subAccountSelector.d.ts +2 -0
  24. package/lib/entity/account/subAccountSelector.js +2 -0
  25. package/lib/entity/accountGroup/accountGroupSelector.d.ts +22 -0
  26. package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
  27. package/lib/entity/accountRecon/accountReconPayload.d.ts +1 -1
  28. package/lib/entity/accountRecon/accountReconPayload.js +4 -2
  29. package/lib/entity/aiCfo/aiCfoSelector.d.ts +1 -2
  30. package/lib/entity/billPay/billTransaction/billTransactionState.d.ts +2 -2
  31. package/lib/entity/class/classReducer.d.ts +4 -4
  32. package/lib/entity/class/classState.d.ts +1 -1
  33. package/lib/entity/forecast/forecastState.d.ts +1 -1
  34. package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +38 -0
  35. package/lib/entity/jeSchedules/jeSchedulesPayload.js +78 -0
  36. package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +4 -1
  37. package/lib/entity/jeSchedules/jeSchedulesSelector.js +5 -1
  38. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +37 -0
  39. package/lib/entity/project/projectPayload.d.ts +13 -0
  40. package/lib/entity/project/projectPayload.js +30 -0
  41. package/lib/entity/project/projectReducer.d.ts +10 -0
  42. package/lib/entity/project/projectReducer.js +31 -0
  43. package/lib/entity/project/projectSelector.d.ts +5 -0
  44. package/lib/entity/project/projectSelector.js +12 -0
  45. package/lib/entity/project/projectState.d.ts +13 -0
  46. package/lib/entity/project/projectState.js +2 -0
  47. package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
  48. package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
  49. package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
  50. package/lib/entity/sectionProjectView/sectionProjectView.d.ts +11 -0
  51. package/lib/entity/sectionProjectView/sectionProjectView.js +6 -0
  52. package/lib/entity/sectionProjectView/sectionProjectViewEpic.d.ts +6 -0
  53. package/lib/entity/sectionProjectView/sectionProjectViewEpic.js +56 -0
  54. package/lib/entity/sectionProjectView/sectionProjectViewHelper.d.ts +10 -0
  55. package/lib/entity/sectionProjectView/sectionProjectViewHelper.js +14 -0
  56. package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +15 -0
  57. package/lib/entity/sectionProjectView/sectionProjectViewReducer.js +56 -0
  58. package/lib/entity/sectionProjectView/sectionProjectViewSelector.d.ts +11 -0
  59. package/lib/entity/sectionProjectView/sectionProjectViewSelector.js +94 -0
  60. package/lib/entity/sectionProjectView/sectionProjectViewSelectorTypes.d.ts +16 -0
  61. package/lib/entity/sectionProjectView/sectionProjectViewSelectorTypes.js +2 -0
  62. package/lib/entity/sectionProjectView/sectionProjectViewState.d.ts +4 -0
  63. package/lib/entity/sectionProjectView/sectionProjectViewState.js +2 -0
  64. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  65. package/lib/entity/snackbar/snackbarTypes.js +7 -0
  66. package/lib/entity/tenant/clearAllEpic.d.ts +5 -2
  67. package/lib/entity/tenant/clearAllEpic.js +6 -0
  68. package/lib/entity/tenant/tenantPayload.d.ts +2 -0
  69. package/lib/entity/tenant/tenantReducer.d.ts +5 -2
  70. package/lib/entity/tenant/tenantReducer.js +10 -2
  71. package/lib/entity/tenant/tenantSelector.d.ts +2 -0
  72. package/lib/entity/tenant/tenantSelector.js +17 -1
  73. package/lib/entity/tenant/tenantState.d.ts +2 -0
  74. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +4 -1
  75. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +1 -0
  76. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +9 -0
  77. package/lib/entity/transaction/payloadTypes/transactionPayload.js +79 -1
  78. package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +1 -0
  79. package/lib/entity/transaction/stateTypes/transaction.d.ts +11 -0
  80. package/lib/entity/transaction/stateTypes/transactionLine.d.ts +1 -1
  81. package/lib/epic.d.ts +18 -1
  82. package/lib/epic.js +18 -1
  83. package/lib/esm/common/aiCfo/aiCfoSuggestedQuestionsPageContext.js +1 -0
  84. package/lib/esm/commonStateTypes/animations.js +3 -0
  85. package/lib/esm/commonStateTypes/coaBalance/coaBalancesFilterProjectView.js +5 -0
  86. package/lib/esm/commonStateTypes/projectView/projectViewParentID.js +1 -0
  87. package/lib/esm/commonStateTypes/viewAndReport/reportIDHelper.js +1 -0
  88. package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +2 -0
  89. package/lib/esm/entity/account/accountReducer.js +11 -4
  90. package/lib/esm/entity/account/accountSelector.js +4 -2
  91. package/lib/esm/entity/account/accountState.js +4 -1
  92. package/lib/esm/entity/account/subAccountSelector.js +2 -0
  93. package/lib/esm/entity/accountRecon/accountReconPayload.js +4 -2
  94. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +78 -0
  95. package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +5 -1
  96. package/lib/esm/entity/project/projectPayload.js +26 -0
  97. package/lib/esm/entity/project/projectReducer.js +27 -0
  98. package/lib/esm/entity/project/projectSelector.js +8 -0
  99. package/lib/esm/entity/project/projectState.js +1 -0
  100. package/lib/esm/entity/sectionProjectView/sectionProjectView.js +3 -0
  101. package/lib/esm/entity/sectionProjectView/sectionProjectViewEpic.js +52 -0
  102. package/lib/esm/entity/sectionProjectView/sectionProjectViewHelper.js +10 -0
  103. package/lib/esm/entity/sectionProjectView/sectionProjectViewReducer.js +52 -0
  104. package/lib/esm/entity/sectionProjectView/sectionProjectViewSelector.js +87 -0
  105. package/lib/esm/entity/sectionProjectView/sectionProjectViewSelectorTypes.js +1 -0
  106. package/lib/esm/entity/sectionProjectView/sectionProjectViewState.js +1 -0
  107. package/lib/esm/entity/snackbar/snackbarTypes.js +7 -0
  108. package/lib/esm/entity/tenant/clearAllEpic.js +6 -0
  109. package/lib/esm/entity/tenant/tenantReducer.js +9 -1
  110. package/lib/esm/entity/tenant/tenantSelector.js +14 -0
  111. package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +1 -0
  112. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +79 -1
  113. package/lib/esm/epic.js +18 -1
  114. package/lib/esm/index.js +23 -17
  115. package/lib/esm/reducer.js +12 -0
  116. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +82 -1
  117. package/lib/esm/view/aiCfoView/aiCfoViewSelector.js +8 -2
  118. package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +29 -0
  119. package/lib/esm/view/classList/fetchClassListEpic.js +9 -2
  120. package/lib/esm/view/commonVendorView/vendorView/vendorViewSelector.js +18 -5
  121. package/lib/esm/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.js +6 -2
  122. package/lib/esm/view/companyTaskManagerView/companyTaskManagerViewReducer.js +19 -1
  123. package/lib/esm/view/companyTaskManagerView/companyTaskManagerViewSelector.js +3 -1
  124. package/lib/esm/view/companyTaskManagerView/epics/fetchTaskManagerMetricsEpic.js +17 -0
  125. package/lib/esm/view/companyView/companyViewReducer.js +26 -1
  126. package/lib/esm/view/companyView/epic/companyPassport/updateAccountingClassesEnabledEpic.js +61 -0
  127. package/lib/esm/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  128. package/lib/esm/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +44 -0
  129. package/lib/esm/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +4 -9
  130. package/lib/esm/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +44 -0
  131. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +2 -2
  132. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadMatchResultToastEpic.js +33 -0
  133. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +3 -3
  134. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +6 -4
  135. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/refetchCompletedTransactionsOnBulkUploadSortEpic.js +12 -0
  136. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/restoreBulkUploadAutomatchingOnMountEpic.js +98 -0
  137. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +7 -13
  138. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +13 -5
  139. package/lib/esm/view/expenseAutomationView/expenseAutomationViewSelector.js +0 -1
  140. package/lib/esm/view/expenseAutomationView/{bulkUploadTiming.js → helpers/bulkUploadTiming.js} +6 -0
  141. package/lib/esm/view/expenseAutomationView/helpers/rollingCalendarDateRangeInclusive.js +13 -0
  142. package/lib/esm/view/expenseAutomationView/helpers/saveTransactionHelper.js +2 -2
  143. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +2 -2
  144. package/lib/esm/view/expenseAutomationView/payload/missingReceiptsPayload.js +9 -0
  145. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +21 -1
  146. package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +26 -3
  147. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +167 -3
  148. package/lib/esm/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.js +1 -2
  149. package/lib/esm/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +10 -2
  150. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +63 -6
  151. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +14 -4
  152. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +136 -9
  153. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +15 -5
  154. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +24 -1
  155. package/lib/esm/view/financeStatement/financeStatementSelector.js +12 -1
  156. package/lib/esm/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +3 -0
  157. package/lib/esm/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.js +47 -0
  158. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewEpic.js +30 -0
  159. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewPayload.js +1 -0
  160. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewReducer.js +113 -0
  161. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewSelector.js +67 -0
  162. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.js +1 -0
  163. package/lib/esm/view/profitAndLossProjectView/profitAndLossProjectViewState.js +1 -0
  164. package/lib/esm/view/reportsResync/reportsClassViewRefetchingEpic.js +4 -0
  165. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesPayload.js +26 -0
  166. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesReducer.js +199 -0
  167. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +52 -0
  168. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesState.js +1 -0
  169. package/lib/esm/view/spendManagement/autotransferRules/epics/createAutoTransferRuleEpic.js +100 -0
  170. package/lib/esm/view/spendManagement/autotransferRules/epics/deleteAutoTransferRuleEpic.js +48 -0
  171. package/lib/esm/view/spendManagement/autotransferRules/epics/fetchAutoTransferReviewDetailEpic.js +36 -0
  172. package/lib/esm/view/spendManagement/autotransferRules/epics/fetchAutoTransferRuleHistory.js +45 -0
  173. package/lib/esm/view/spendManagement/autotransferRules/epics/fetchAutoTransferRulesEpic.js +50 -0
  174. package/lib/esm/view/spendManagement/autotransferRules/epics/updateAutoTransferRuleEpic.js +69 -0
  175. package/lib/esm/view/spendManagement/billPay/billList/billListSelector.js +10 -0
  176. package/lib/esm/view/spendManagement/billPay/billList/billListState.js +1 -0
  177. package/lib/esm/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +7 -3
  178. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +5 -5
  179. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPayApproversDetailsEpic.js +7 -2
  180. package/lib/esm/view/spendManagement/billPay/editBillView/editBillViewSelector.js +13 -6
  181. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +1 -0
  182. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +2 -0
  183. package/lib/esm/view/spendManagement/reimbursement/editRemiView/editRemiViewSelector.js +7 -4
  184. package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListSelector.js +12 -0
  185. package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListState.js +1 -0
  186. package/lib/esm/view/spendManagement/treasury/treasuryList/epics/fetchTreasuryDetailEpic.js +2 -2
  187. package/lib/esm/view/spendManagement/treasury/treasuryList/treasuryDetailReducer.js +2 -1
  188. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +2 -2
  189. package/lib/esm/view/transactionDetail/epics/saveTransactionHelper.js +2 -2
  190. package/lib/esm/view/transactionDetail/transactionDetailLocalDataHelper.js +16 -14
  191. package/lib/esm/view/transactionDetail/transactionDetailSelector.js +9 -2
  192. package/lib/index.d.ts +37 -23
  193. package/lib/index.js +78 -34
  194. package/lib/reducer.d.ts +12 -0
  195. package/lib/reducer.js +12 -0
  196. package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
  197. package/lib/view/aiCfoView/aiCfoViewPayload.d.ts +7 -0
  198. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +15 -1
  199. package/lib/view/aiCfoView/aiCfoViewReducer.js +83 -2
  200. package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +4 -1
  201. package/lib/view/aiCfoView/aiCfoViewSelector.js +9 -2
  202. package/lib/view/aiCfoView/aiCfoViewState.d.ts +15 -1
  203. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +8 -0
  204. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +33 -0
  205. package/lib/view/auditReportView/auditReportViewState.d.ts +2 -2
  206. package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
  207. package/lib/view/cardBalance/cardBalanceSelector.d.ts +2 -1
  208. package/lib/view/cashBalance/cashBalanceSelector.d.ts +2 -1
  209. package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
  210. package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
  211. package/lib/view/classList/fetchClassListEpic.d.ts +1 -1
  212. package/lib/view/classList/fetchClassListEpic.js +8 -1
  213. package/lib/view/commonVendorView/vendorView/vendorViewSelector.d.ts +1 -0
  214. package/lib/view/commonVendorView/vendorView/vendorViewSelector.js +18 -5
  215. package/lib/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.d.ts +1 -0
  216. package/lib/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.js +6 -2
  217. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +2 -2
  218. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.js +20 -2
  219. package/lib/view/companyTaskManagerView/companyTaskManagerViewSelector.d.ts +4 -1
  220. package/lib/view/companyTaskManagerView/companyTaskManagerViewSelector.js +3 -1
  221. package/lib/view/companyTaskManagerView/companyTaskManagerViewState.d.ts +9 -1
  222. package/lib/view/companyTaskManagerView/epics/fetchTaskManagerMetricsEpic.d.ts +7 -0
  223. package/lib/view/companyTaskManagerView/epics/fetchTaskManagerMetricsEpic.js +21 -0
  224. package/lib/view/companyView/companyViewReducer.d.ts +6 -1
  225. package/lib/view/companyView/companyViewReducer.js +28 -2
  226. package/lib/view/companyView/epic/companyPassport/updateAccountingClassesEnabledEpic.d.ts +10 -0
  227. package/lib/view/companyView/epic/companyPassport/updateAccountingClassesEnabledEpic.js +65 -0
  228. package/lib/view/companyView/types/companyPassport/companyPassportViewState.d.ts +1 -0
  229. package/lib/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  230. package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
  231. package/lib/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.d.ts +8 -0
  232. package/lib/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +48 -0
  233. package/lib/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +4 -9
  234. package/lib/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.d.ts +9 -0
  235. package/lib/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +48 -0
  236. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +2 -2
  237. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadMatchResultToastEpic.d.ts +13 -0
  238. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadMatchResultToastEpic.js +37 -0
  239. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +2 -2
  240. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +5 -3
  241. package/lib/view/expenseAutomationView/epics/missingReceipts/refetchCompletedTransactionsOnBulkUploadSortEpic.d.ts +10 -0
  242. package/lib/view/expenseAutomationView/epics/missingReceipts/refetchCompletedTransactionsOnBulkUploadSortEpic.js +16 -0
  243. package/lib/view/expenseAutomationView/epics/missingReceipts/restoreBulkUploadAutomatchingOnMountEpic.d.ts +18 -0
  244. package/lib/view/expenseAutomationView/epics/missingReceipts/restoreBulkUploadAutomatchingOnMountEpic.js +102 -0
  245. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +7 -13
  246. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +2 -2
  247. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +12 -4
  248. package/lib/view/expenseAutomationView/expenseAutomationViewSelector.js +0 -1
  249. package/lib/view/expenseAutomationView/{bulkUploadTiming.d.ts → helpers/bulkUploadTiming.d.ts} +6 -0
  250. package/lib/view/expenseAutomationView/{bulkUploadTiming.js → helpers/bulkUploadTiming.js} +7 -1
  251. package/lib/view/expenseAutomationView/helpers/rollingCalendarDateRangeInclusive.d.ts +7 -0
  252. package/lib/view/expenseAutomationView/helpers/rollingCalendarDateRangeInclusive.js +16 -0
  253. package/lib/view/expenseAutomationView/helpers/saveTransactionHelper.js +2 -2
  254. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  255. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +2 -2
  256. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +1 -1
  257. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +5 -0
  258. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +10 -0
  259. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +45 -0
  260. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +2 -2
  261. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +22 -2
  262. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +12 -2
  263. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +27 -4
  264. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +18 -4
  265. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +168 -4
  266. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +2 -0
  267. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +2 -0
  268. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +7 -2
  269. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.js +2 -2
  270. package/lib/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +10 -2
  271. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +63 -6
  272. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +14 -4
  273. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +136 -9
  274. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +13 -3
  275. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +8 -0
  276. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +27 -0
  277. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +4 -0
  278. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +14 -0
  279. package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
  280. package/lib/view/financeStatement/financeStatementSelector.d.ts +2 -0
  281. package/lib/view/financeStatement/financeStatementSelector.js +12 -1
  282. package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
  283. package/lib/view/onboardingView/cockpitView/types/onboardingCockpitViewTypes.d.ts +1 -1
  284. package/lib/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +3 -0
  285. package/lib/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.d.ts +9 -0
  286. package/lib/view/profitAndLossProjectView/profitAndLossForTimeframeProjectViewEpic.js +51 -0
  287. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewEpic.d.ts +6 -0
  288. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewEpic.js +34 -0
  289. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewPayload.d.ts +33 -0
  290. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewPayload.js +2 -0
  291. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewReducer.d.ts +33 -0
  292. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewReducer.js +117 -0
  293. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelector.d.ts +9 -0
  294. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelector.js +71 -0
  295. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.d.ts +19 -0
  296. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewSelectorTypes.js +2 -0
  297. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewState.d.ts +22 -0
  298. package/lib/view/profitAndLossProjectView/profitAndLossProjectViewState.js +2 -0
  299. package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
  300. package/lib/view/reportsResync/reportsClassViewRefetchingEpic.d.ts +2 -1
  301. package/lib/view/reportsResync/reportsClassViewRefetchingEpic.js +4 -0
  302. package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
  303. package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
  304. package/lib/view/spendManagement/autotransferRules/autoTransferRulesPayload.d.ts +75 -0
  305. package/lib/view/spendManagement/autotransferRules/autoTransferRulesPayload.js +30 -0
  306. package/lib/view/spendManagement/autotransferRules/autoTransferRulesReducer.d.ts +50 -0
  307. package/lib/view/spendManagement/autotransferRules/autoTransferRulesReducer.js +206 -0
  308. package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.d.ts +24 -0
  309. package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +61 -0
  310. package/lib/view/spendManagement/autotransferRules/autoTransferRulesState.d.ts +38 -0
  311. package/lib/view/spendManagement/autotransferRules/autoTransferRulesState.js +2 -0
  312. package/lib/view/spendManagement/autotransferRules/epics/createAutoTransferRuleEpic.d.ts +12 -0
  313. package/lib/view/spendManagement/autotransferRules/epics/createAutoTransferRuleEpic.js +106 -0
  314. package/lib/view/spendManagement/autotransferRules/epics/deleteAutoTransferRuleEpic.d.ts +8 -0
  315. package/lib/view/spendManagement/autotransferRules/epics/deleteAutoTransferRuleEpic.js +52 -0
  316. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferReviewDetailEpic.d.ts +7 -0
  317. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferReviewDetailEpic.js +40 -0
  318. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRuleHistory.d.ts +7 -0
  319. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRuleHistory.js +52 -0
  320. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRulesEpic.d.ts +10 -0
  321. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRulesEpic.js +54 -0
  322. package/lib/view/spendManagement/autotransferRules/epics/updateAutoTransferRuleEpic.d.ts +8 -0
  323. package/lib/view/spendManagement/autotransferRules/epics/updateAutoTransferRuleEpic.js +73 -0
  324. package/lib/view/spendManagement/billPay/billList/billListSelector.js +10 -0
  325. package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
  326. package/lib/view/spendManagement/billPay/billList/billListState.js +1 -0
  327. package/lib/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +7 -3
  328. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +5 -5
  329. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPayApproversDetailsEpic.js +7 -2
  330. package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.js +13 -6
  331. package/lib/view/spendManagement/chargeCards/chargeCardDetail/chargeCardDetail.d.ts +1 -1
  332. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  333. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +1 -0
  334. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +2 -0
  335. package/lib/view/spendManagement/reimbursement/editRemiView/editRemiViewSelector.js +6 -3
  336. package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.d.ts +1 -0
  337. package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.js +12 -0
  338. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +1 -1
  339. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.js +1 -0
  340. package/lib/view/spendManagement/treasury/treasuryList/epics/fetchTreasuryDetailEpic.js +2 -2
  341. package/lib/view/spendManagement/treasury/treasuryList/treasuryDetailReducer.d.ts +2 -1
  342. package/lib/view/spendManagement/treasury/treasuryList/treasuryDetailReducer.js +2 -1
  343. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +2 -2
  344. package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
  345. package/lib/view/topEx/topExSelector.d.ts +1 -1
  346. package/lib/view/transactionDetail/epics/saveTransactionHelper.js +2 -2
  347. package/lib/view/transactionDetail/transactionDetailLocalDataHelper.js +16 -14
  348. package/lib/view/transactionDetail/transactionDetailSelector.d.ts +1 -0
  349. package/lib/view/transactionDetail/transactionDetailSelector.js +9 -2
  350. package/package.json +1 -1
@@ -5,10 +5,18 @@ export const initialUIState = {
5
5
  sortOrder: 'descending',
6
6
  pageToken: null,
7
7
  };
8
+ const initialMetrics = {
9
+ closed: 0,
10
+ open: 0,
11
+ overdue: 0,
12
+ total: 0,
13
+ };
8
14
  export const initialState = {
9
15
  taskIds: [],
10
16
  fetchState: 'Not-Started',
11
17
  error: undefined,
18
+ metrics: initialMetrics,
19
+ metricsFetchState: 'Not-Started',
12
20
  uiState: initialUIState,
13
21
  hasValidState() {
14
22
  return this.fetchState == 'Completed';
@@ -67,10 +75,20 @@ const companyTaskManagerView = createSlice({
67
75
  return { payload: { error } };
68
76
  },
69
77
  },
78
+ fetchTaskManagerMetrics(draft) {
79
+ draft.metricsFetchState = 'In-Progress';
80
+ },
81
+ updateTaskManagerMetrics(draft, action) {
82
+ draft.metrics = action.payload;
83
+ draft.metricsFetchState = 'Completed';
84
+ },
85
+ updateTaskManagerMetricsOnFailure(draft) {
86
+ draft.metricsFetchState = 'Error';
87
+ },
70
88
  clearCompanyTaskManagerView(draft) {
71
89
  Object.assign(draft, initialState);
72
90
  },
73
91
  },
74
92
  });
75
- export const { fetchCompanyTaskManagerView, updateCompanyTaskManagerViewOnSuccess, updateCompanyTaskManagerViewOnFailure, clearCompanyTaskManagerView, } = companyTaskManagerView.actions;
93
+ export const { fetchCompanyTaskManagerView, updateCompanyTaskManagerViewOnSuccess, updateCompanyTaskManagerViewOnFailure, fetchTaskManagerMetrics, updateTaskManagerMetrics, updateTaskManagerMetricsOnFailure, clearCompanyTaskManagerView, } = companyTaskManagerView.actions;
76
94
  export default companyTaskManagerView.reducer;
@@ -4,7 +4,7 @@ import { getTagsByIds } from '../../entity/tag/tagSelector';
4
4
  import { getTaskById } from '../../entity/task/taskSelector';
5
5
  import { getUserByUserId, getUsersByUserIds, } from '../../entity/user/userSelector';
6
6
  export const getCompanyTaskManagerView = createSelector((state) => state.companyTaskManagerViewState, (state) => state.companyState, (state) => state.userState, (state) => state.taskState, (state) => state.tagState, (companyTaskManagerViewState, companyState, userState, taskState, tagState) => {
7
- const { taskIds, uiState, fetchState, error, totalTaskCount } = companyTaskManagerViewState;
7
+ const { taskIds, uiState, fetchState, error, totalTaskCount, metrics, metricsFetchState } = companyTaskManagerViewState;
8
8
  const tasksList = [];
9
9
  taskIds.forEach((taskId) => {
10
10
  const task = getTaskById(taskState, taskId);
@@ -27,6 +27,8 @@ export const getCompanyTaskManagerView = createSelector((state) => state.company
27
27
  }
28
28
  });
29
29
  return {
30
+ metrics,
31
+ metricsFetchState,
30
32
  tasksList,
31
33
  uiState,
32
34
  fetchState,
@@ -0,0 +1,17 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { isSuccessResponse, } from '../../../responsePayload';
4
+ import { fetchTaskManagerMetrics, updateTaskManagerMetrics, updateTaskManagerMetricsOnFailure, } from '../companyTaskManagerViewReducer';
5
+ export const fetchTaskManagerMetricsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchTaskManagerMetrics.match), switchMap(() => {
6
+ const query = JSON.stringify({ is_filter_by_logged_in_user: true });
7
+ return zeniAPI
8
+ .getJSON(`${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/cockpit-panels/tasks-es-metrics?query=${encodeURIComponent(query)}`)
9
+ .pipe(mergeMap((response) => {
10
+ if (isSuccessResponse(response) && response.data != null) {
11
+ return of(updateTaskManagerMetrics(response.data.summary));
12
+ }
13
+ else {
14
+ return of(updateTaskManagerMetricsOnFailure());
15
+ }
16
+ }), catchError(() => of(updateTaskManagerMetricsOnFailure())));
17
+ }));
@@ -284,6 +284,31 @@ const companyView = createSlice({
284
284
  error: status,
285
285
  };
286
286
  },
287
+ updateAccountingClassesEnabled: {
288
+ reducer(draft,
289
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
290
+ _action) {
291
+ draft.passportView.accountingClassesUpdateStatus = {
292
+ fetchState: 'In-Progress',
293
+ error: undefined,
294
+ };
295
+ },
296
+ prepare(companyId, enabled) {
297
+ return { payload: { companyId, enabled } };
298
+ },
299
+ },
300
+ updateAccountingClassesEnabledSuccess(draft) {
301
+ draft.passportView.accountingClassesUpdateStatus = {
302
+ fetchState: 'Completed',
303
+ error: undefined,
304
+ };
305
+ },
306
+ updateAccountingClassesEnabledFailure(draft, action) {
307
+ draft.passportView.accountingClassesUpdateStatus = {
308
+ fetchState: 'Error',
309
+ error: action.payload.status,
310
+ };
311
+ },
287
312
  companyPassportUpdatePrimaryContact: {
288
313
  reducer(draft, action) {
289
314
  const { primaryContact } = action.payload;
@@ -557,5 +582,5 @@ const companyView = createSlice({
557
582
  },
558
583
  },
559
584
  });
560
- export const { fetchCompanyPassportView, fetchAllCockpitViews, fetchOnboardingView, fetchManagementView, fetchSubscriptionView, fetchPortfolioView, fetchCompanyManagementView, companyManagementSaveUpdates, companyManagementSavePendingUpdates, companyManagementDiscardUpdates, companyManagementSaveUpdatesSuccess, companyManagementSaveUpdatesFailure, updateCompanyViewOnSuccess, updateCompanyViewOnFailure, fetchCompanyPortfolioView, fetchZeniUsers, updateZeniUsersOnSuccess, updateZeniUsersOnFailure, clearCompanyView, updateCompanyPortfolioUIState, updateCompanyManagementUIState, companyPassportSaveDataInLocalStore, deleteCompanyOfficerInLocalStore, companyPassportClearDataInLocalStore, companyPassportUpdateCompanyDetails, companyPassportUpdateCompanyDetailsSuccess, companyPassportUpdateCompanyDetailsFailure, companyPassportUpdatePrimaryContact, companyPassportUpdatePrimaryContactSuccess, companyPassportUpdatePrimaryContactFailure, companyPassportUpdateCompanyOfficer, companyPassportUpdateCompanyOfficerSuccess, companyPassportUpdateCompanyOfficerFailure, companyPassportCreateCompanyOfficers, companyPassportCreateCompanyOfficersSuccess, companyPassportCreateCompanyOfficersFailure, updateCompanyPassportLocalStoreData, saveIndustryAndIncDateInCompanyPassportLocalStore, saveCompanyPassportDetails, fetchParentSubsidiaryManagementView, updateParentSubsidiaryView, updateParentSubsidiaryViewOnFailure, updateCompanyDownloadState, fetchCompanyMetaData, updateCompanyMetaDataOnSuccess, updateCompanyMetaDataOnFailure, updateMetaDataOnSendMonthEndReport, } = companyView.actions;
585
+ export const { fetchCompanyPassportView, fetchAllCockpitViews, fetchOnboardingView, fetchManagementView, fetchSubscriptionView, fetchPortfolioView, fetchCompanyManagementView, companyManagementSaveUpdates, companyManagementSavePendingUpdates, companyManagementDiscardUpdates, companyManagementSaveUpdatesSuccess, companyManagementSaveUpdatesFailure, updateCompanyViewOnSuccess, updateCompanyViewOnFailure, fetchCompanyPortfolioView, fetchZeniUsers, updateZeniUsersOnSuccess, updateZeniUsersOnFailure, clearCompanyView, updateCompanyPortfolioUIState, updateCompanyManagementUIState, companyPassportSaveDataInLocalStore, deleteCompanyOfficerInLocalStore, companyPassportClearDataInLocalStore, companyPassportUpdateCompanyDetails, companyPassportUpdateCompanyDetailsSuccess, companyPassportUpdateCompanyDetailsFailure, updateAccountingClassesEnabled, updateAccountingClassesEnabledSuccess, updateAccountingClassesEnabledFailure, companyPassportUpdatePrimaryContact, companyPassportUpdatePrimaryContactSuccess, companyPassportUpdatePrimaryContactFailure, companyPassportUpdateCompanyOfficer, companyPassportUpdateCompanyOfficerSuccess, companyPassportUpdateCompanyOfficerFailure, companyPassportCreateCompanyOfficers, companyPassportCreateCompanyOfficersSuccess, companyPassportCreateCompanyOfficersFailure, updateCompanyPassportLocalStoreData, saveIndustryAndIncDateInCompanyPassportLocalStore, saveCompanyPassportDetails, fetchParentSubsidiaryManagementView, updateParentSubsidiaryView, updateParentSubsidiaryViewOnFailure, updateCompanyDownloadState, fetchCompanyMetaData, updateCompanyMetaDataOnSuccess, updateCompanyMetaDataOnFailure, updateMetaDataOnSendMonthEndReport, } = companyView.actions;
561
586
  export default companyView.reducer;
@@ -0,0 +1,61 @@
1
+ import { from } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { updateCompanies } from '../../../../entity/company/companyReducer';
4
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
5
+ import { updateTenantAccountingClassesEnabled } from '../../../../entity/tenant/tenantReducer';
6
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
7
+ import { updateAccountingClassesEnabled, updateAccountingClassesEnabledFailure, updateAccountingClassesEnabledSuccess, } from '../../companyViewReducer';
8
+ export const updateAccountingClassesEnabledEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(updateAccountingClassesEnabled.match), switchMap((action) => {
9
+ const { companyId, enabled } = action.payload;
10
+ const tenantId = Object.values(state$.value.tenantState.tenantsById).find((t) => t.companyId === companyId)?.tenantId;
11
+ return zeniAPI
12
+ .putAndGetJSON(`${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/companies/${companyId}`, { is_accounting_classes_enabled: enabled })
13
+ .pipe(mergeMap((response) => {
14
+ const companies = response.data?.companies ?? [];
15
+ if (isSuccessResponse(response) && companies.length > 0) {
16
+ const actions = [
17
+ updateCompanies({
18
+ payload: companies,
19
+ schema: {},
20
+ }),
21
+ ];
22
+ if (tenantId != null) {
23
+ actions.push(updateTenantAccountingClassesEnabled({
24
+ enabled,
25
+ tenantId,
26
+ }));
27
+ }
28
+ actions.push(updateAccountingClassesEnabledSuccess());
29
+ actions.push(openSnackbar({
30
+ messageSection: 'accounting_classes_enabled_update',
31
+ messageText: 'success',
32
+ type: 'success',
33
+ }));
34
+ return from(actions);
35
+ }
36
+ else {
37
+ return from([
38
+ updateAccountingClassesEnabledFailure({
39
+ status: response.status,
40
+ }),
41
+ openSnackbar({
42
+ messageSection: 'accounting_classes_enabled_update',
43
+ messageText: 'failed',
44
+ type: 'error',
45
+ }),
46
+ ]);
47
+ }
48
+ }), catchError((error) => from([
49
+ updateAccountingClassesEnabledFailure({
50
+ status: createZeniAPIStatus('Unexpected error', 'Update Accounting Classes Enabled errored out' +
51
+ (error instanceof Error
52
+ ? error.message
53
+ : JSON.stringify(error))),
54
+ }),
55
+ openSnackbar({
56
+ messageSection: 'accounting_classes_enabled_update',
57
+ messageText: 'failed',
58
+ type: 'error',
59
+ }),
60
+ ])));
61
+ }));
@@ -1,6 +1,10 @@
1
1
  import { initialCommonState } from '../commonState';
2
2
  export const initialCompanyPassportView = {
3
3
  ...initialCommonState,
4
+ accountingClassesUpdateStatus: {
5
+ fetchState: 'Not-Started',
6
+ error: undefined,
7
+ },
4
8
  companyDetails: {
5
9
  localData: undefined,
6
10
  updateStatus: {
@@ -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
+ }));
@@ -21,13 +21,13 @@ export const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe
21
21
  if (isSuccessResponse(response) && response.data != null) {
22
22
  const updateActions = [];
23
23
  updateActions.push(updateJESchedules([
24
- ...response.data.draft_je_schedules,
24
+ ...response.data.je_schedules,
25
25
  ...response.data.failed_je_postings.je_schedules,
26
26
  ]), updateJESchedulesDetails([...response.data.failed_je_postings.je_schedules], response.data.failed_je_postings.scheduled_journal_entries), initializeJeScheduleLocalData([
27
27
  ...response.data.failed_je_postings.je_schedules,
28
28
  ]));
29
29
  updateActions.push(fetchJeSchedulesSuccess({
30
- jeSchedules: [...response.data.draft_je_schedules],
30
+ jeSchedules: [...response.data.je_schedules],
31
31
  failedJeSchedules: [
32
32
  ...response.data.failed_je_postings.je_schedules,
33
33
  ],
@@ -0,0 +1,33 @@
1
+ import { merge, of } from 'rxjs';
2
+ import { filter, mergeMap, switchMap, take, takeUntil } from 'rxjs/operators';
3
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
+ import { bulkUploadReceiptsSuccess, clearBulkUpload, fetchBulkUploadBatchDetailsSuccess, restoreBulkUploadMatchingState, storeBatchDetails, } from '../../reducers/missingReceiptsViewReducer';
5
+ /**
6
+ * Show a success toast when batch details arrive for the current upload batch,
7
+ * e.g. "17 out of 20 Receipts Matched". Scoped per upload session so it fires
8
+ * only once: starts on `bulkUploadReceiptsSuccess` (or `restoreBulkUploadMatchingState`
9
+ * for a restored session), waits for the first batch-details action for that batch,
10
+ * emits the toast, then stops. `clearBulkUpload` cancels the in-flight wait.
11
+ */
12
+ export const bulkUploadMatchResultToastEpic = (actions$) => actions$.pipe(filter((action) => bulkUploadReceiptsSuccess.match(action) ||
13
+ restoreBulkUploadMatchingState.match(action)), switchMap((uploadAction) => {
14
+ const { batchId } = uploadAction.payload;
15
+ return merge(actions$.pipe(filter(fetchBulkUploadBatchDetailsSuccess.match)), actions$.pipe(filter(storeBatchDetails.match))).pipe(filter((a) => a.payload.batchId === batchId), take(1), mergeMap((action) => {
16
+ const { summary } = action.payload;
17
+ return of(openSnackbar({
18
+ messageSection: 'receipts_bulk_match',
19
+ messageText: 'success',
20
+ type: 'success',
21
+ variables: [
22
+ {
23
+ variableName: '_matched_',
24
+ variableValue: String(summary.matched),
25
+ },
26
+ {
27
+ variableName: '_total_',
28
+ variableValue: String(summary.total),
29
+ },
30
+ ],
31
+ }));
32
+ }), takeUntil(actions$.pipe(filter(clearBulkUpload.match))));
33
+ }));
@@ -1,9 +1,9 @@
1
1
  import { concat, of, timer } from 'rxjs';
2
- import { catchError, filter, mergeMap } from 'rxjs/operators';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
3
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
- import { BULK_UPLOAD_BAR_COMPLETE_HOLD_MS } from '../../bulkUploadTiming';
4
+ import { BULK_UPLOAD_BAR_COMPLETE_HOLD_MS } from '../../helpers/bulkUploadTiming';
5
5
  import { bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, updateBulkUploadProgress, } from '../../reducers/missingReceiptsViewReducer';
6
- export const bulkUploadReceiptsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(bulkUploadReceipts.match), mergeMap((action) => {
6
+ export const bulkUploadReceiptsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(bulkUploadReceipts.match), switchMap((action) => {
7
7
  const { files } = action.payload;
8
8
  const formData = new FormData();
9
9
  for (const file of files) {
@@ -1,10 +1,12 @@
1
1
  import { of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
- import { convertToPeriod, toMonthYearPeriodId, } from '../../../../commonStateTypes/timePeriod';
3
+ import { toMonthYearPeriodId } from '../../../../commonStateTypes/timePeriod';
4
4
  import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
5
5
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
6
  import { toBatchListItem, } from '../../payload/missingReceiptsPayload';
7
7
  import { fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, } from '../../reducers/missingReceiptsViewReducer';
8
+ import { BULK_UPLOAD_BATCH_LIST_DATE_RANGE_DAYS } from '../../helpers/bulkUploadTiming';
9
+ import { rollingCalendarDateRangeInclusive } from '../../helpers/rollingCalendarDateRangeInclusive';
8
10
  export const fetchBulkUploadBatchesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchBulkUploadBatches.match), switchMap((action) => {
9
11
  const { cacheOverride } = action.payload;
10
12
  const state = state$.value;
@@ -19,10 +21,10 @@ export const fetchBulkUploadBatchesEpic = (actions$, state$, zeniAPI) => actions
19
21
  selectedPeriod,
20
22
  }));
21
23
  }
22
- const period = convertToPeriod(selectedPeriod);
24
+ const { end, start } = rollingCalendarDateRangeInclusive(BULK_UPLOAD_BATCH_LIST_DATE_RANGE_DAYS);
23
25
  const queryParam = {
24
- start_date: period.start,
25
- end_date: period.end,
26
+ start_date: start,
27
+ end_date: end,
26
28
  sort_order: 'desc',
27
29
  };
28
30
  return zeniAPI
@@ -0,0 +1,12 @@
1
+ import { of } from 'rxjs';
2
+ import { filter, mergeMap } from 'rxjs/operators';
3
+ import { fetchCompletedTransactions, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, } from '../../reducers/missingReceiptsViewReducer';
4
+ /**
5
+ * Completed transactions are cached per sort key/order/sub-tab. After a sort or sub-tab
6
+ * change, the fetch epic would otherwise skip the network when that cache entry already
7
+ * exists — dispatch a cache-bypassing initial fetch whenever either changes from the UI.
8
+ */
9
+ export const refetchCompletedTransactionsOnBulkUploadSortEpic = (actions$) => {
10
+ return actions$.pipe(filter((action) => setBulkUploadSortConfig.match(action) ||
11
+ setBulkUploadCompletedSubTab.match(action)), mergeMap(() => of(fetchCompletedTransactions(undefined, true))));
12
+ };
@@ -0,0 +1,98 @@
1
+ import { EMPTY, concat, from, of } from 'rxjs';
2
+ import { catchError, concatMap, filter, mergeMap, take } from 'rxjs/operators';
3
+ import { isSuccessResponse } from '../../../../responsePayload';
4
+ import { isBatchDetailsStatusPendingOrProcessing, toBatchListItem, } from '../../payload/missingReceiptsPayload';
5
+ import { fetchBulkUploadBatchesSuccess, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, } from '../../reducers/missingReceiptsViewReducer';
6
+ import { BULK_UPLOAD_BATCH_LIST_DATE_RANGE_DAYS } from '../../helpers/bulkUploadTiming';
7
+ import { rollingCalendarDateRangeInclusive } from '../../helpers/rollingCalendarDateRangeInclusive';
8
+ import { toMonthYearPeriodId } from '../../../../commonStateTypes/timePeriod';
9
+ import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
10
+ /**
11
+ * On missing-receipts entry / period switch, hydrate the automatching banner for the logged-in
12
+ * user without relying on UI-driven list fetches (the Missing tab does not fetch the batch list
13
+ * while `phase === 'idle'`). Flow:
14
+ * 1. Call `GET /1.0/batches` (rolling 30-day window).
15
+ * 2. Emit `fetchBulkUploadBatchesSuccess` so `batchListByPeriod` is populated for the selected
16
+ * period (prevents a duplicate list fetch when the user switches to the Unmatched tab).
17
+ * 3. For each `processing|pending` row, call `GET /1.0/batches/:id` in order; for the first row
18
+ * whose details `user_id` matches the logged-in user and whose status is still
19
+ * pending/processing, dispatch `restoreBulkUploadMatchingState` and stop.
20
+ */
21
+ export const restoreBulkUploadAutomatchingOnMountEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(restoreBulkUploadAutomatchingOnMount.match), mergeMap(() => {
22
+ const state = state$.value;
23
+ const { expenseAutomationMissingReceiptsViewState: { bulkUpload }, expenseAutomationViewState: { selectedPeriodByTenantId }, } = state;
24
+ if (bulkUpload.phase !== 'idle') {
25
+ return EMPTY;
26
+ }
27
+ if (bulkUpload.batchListFetchState.fetchState === 'In-Progress') {
28
+ return EMPTY;
29
+ }
30
+ const loggedInUserId = state.tenantState.loggedInUser?.userId;
31
+ if (loggedInUserId == null) {
32
+ return EMPTY;
33
+ }
34
+ const currentTenant = getCurrentTenant(state);
35
+ const selectedPeriod = selectedPeriodByTenantId[currentTenant.tenantId];
36
+ if (selectedPeriod == null) {
37
+ return EMPTY;
38
+ }
39
+ const { end, start } = rollingCalendarDateRangeInclusive(BULK_UPLOAD_BATCH_LIST_DATE_RANGE_DAYS);
40
+ const queryParam = {
41
+ start_date: start,
42
+ end_date: end,
43
+ sort_order: 'desc',
44
+ };
45
+ const listUrl = `${zeniAPI.apiEndPoints.communicationAgentMicroServiceBaseUrl}/1.0/batches?query=${encodeURIComponent(JSON.stringify(queryParam))}`;
46
+ const detailsBaseUrl = `${zeniAPI.apiEndPoints.communicationAgentMicroServiceBaseUrl}/1.0/batches/`;
47
+ const periodId = toMonthYearPeriodId(selectedPeriod);
48
+ const alreadyCached = (bulkUpload.batchListByPeriod[periodId] ?? []).length > 0 &&
49
+ bulkUpload.batchListFetchState.fetchState === 'Completed';
50
+ const listSource = alreadyCached
51
+ ? of(null)
52
+ : zeniAPI.getJSON(listUrl).pipe(catchError(() => of(null)));
53
+ return listSource.pipe(mergeMap((listResponse) => {
54
+ const batchList = alreadyCached
55
+ ? bulkUpload.batchListByPeriod[periodId] ?? []
56
+ : listResponse != null &&
57
+ isSuccessResponse(listResponse) &&
58
+ listResponse.data != null
59
+ ? listResponse.data.batches.map(toBatchListItem)
60
+ : null;
61
+ if (batchList == null) {
62
+ return EMPTY;
63
+ }
64
+ const successAction = alreadyCached
65
+ ? null
66
+ : fetchBulkUploadBatchesSuccess({
67
+ batchList,
68
+ selectedPeriod,
69
+ });
70
+ const processingBatches = batchList.filter((b) => {
71
+ const status = b.status.toLowerCase();
72
+ return status === 'processing' || status === 'pending';
73
+ });
74
+ const restoreStream = from(processingBatches).pipe(concatMap((batch) => zeniAPI
75
+ .getJSON(`${detailsBaseUrl}${batch.batchId}`)
76
+ .pipe(mergeMap((response) => {
77
+ if (!isSuccessResponse(response) || response.data == null) {
78
+ return EMPTY;
79
+ }
80
+ const data = response.data;
81
+ const detailsUserId = data.user_id;
82
+ if (detailsUserId == null ||
83
+ detailsUserId !== loggedInUserId) {
84
+ return EMPTY;
85
+ }
86
+ if (!isBatchDetailsStatusPendingOrProcessing(data.status)) {
87
+ return EMPTY;
88
+ }
89
+ return of(restoreBulkUploadMatchingState({
90
+ batchId: batch.batchId,
91
+ totalFiles: batch.totalFiles,
92
+ }));
93
+ }), catchError(() => EMPTY))), take(1));
94
+ return successAction != null
95
+ ? concat(of(successAction), restoreStream)
96
+ : restoreStream;
97
+ }));
98
+ }));
@@ -1,18 +1,19 @@
1
1
  import { EMPTY, from, merge, of } from 'rxjs';
2
2
  import { catchError, debounceTime, filter, mergeMap, switchMap, } from 'rxjs/operators';
3
- import { convertToPeriod } from '../../../../commonStateTypes/timePeriod';
4
- import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
5
3
  import { updateTransactions } from '../../../../entity/transaction/transactionReducer';
6
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
7
5
  import { supportedTransactionPayloadToManualSearchResult } from '../../payload/missingReceiptsPayload';
8
6
  import { searchTransactionsForManualMatch, searchTransactionsForManualMatchFailure, searchTransactionsForManualMatchSuccess, } from '../../reducers/missingReceiptsViewReducer';
9
7
  import { toTransactionsSortKey } from '../../types/transactionsViewState';
8
+ import { rollingCalendarDateRangeInclusive } from '../../helpers/rollingCalendarDateRangeInclusive';
10
9
  /**
11
10
  * `auto_categorized` for manual transaction search (Unmatched).
12
11
  * Backend contract TBD — align with `fetchTransactionCategorizationEpic` (`selectedTab === 'autoCategorized'`)
13
12
  * when the expense-automation API documents the intended filter for this flow.
14
13
  */
15
14
  export const MANUAL_TRANSACTION_SEARCH_AUTO_CATEGORIZED = false;
15
+ /** Inclusive rolling window for manual match search (ignores accounting period picker). */
16
+ const MANUAL_SEARCH_TRANSACTION_DATE_RANGE_DAYS = 90;
16
17
  export const searchTransactionsForManualMatchEpic = (actions$, state$, zeniAPI) => {
17
18
  const searchActions$ = actions$.pipe(filter(searchTransactionsForManualMatch.match));
18
19
  const pagination$ = searchActions$.pipe(filter((action) => action.payload.pageToken != null));
@@ -29,18 +30,11 @@ export const searchTransactionsForManualMatchEpic = (actions$, state$, zeniAPI)
29
30
  return EMPTY;
30
31
  }
31
32
  const state = state$.value;
32
- const { expenseAutomationViewState: { selectedPeriodByTenantId }, expenseAutomationMissingReceiptsViewState: { bulkUpload: { manualSearch, sortKey, sortOrder }, }, } = state;
33
- const currentTenant = getCurrentTenant(state);
34
- const selectedPeriod = selectedPeriodByTenantId[currentTenant.tenantId];
35
- if (selectedPeriod == null) {
36
- return of(searchTransactionsForManualMatchFailure({
37
- error: createZeniAPIStatus('Unexpected Error', 'Manual search requires a selected accounting period.'),
38
- }));
39
- }
40
- const period = convertToPeriod(selectedPeriod);
33
+ const { expenseAutomationMissingReceiptsViewState: { bulkUpload: { manualSearch, sortKey, sortOrder }, }, } = state;
34
+ const { end, start } = rollingCalendarDateRangeInclusive(MANUAL_SEARCH_TRANSACTION_DATE_RANGE_DAYS);
41
35
  const queryParam = {
42
- start_date: period.start,
43
- end_date: period.end,
36
+ start_date: start,
37
+ end_date: end,
44
38
  auto_categorized: MANUAL_TRANSACTION_SEARCH_AUTO_CATEGORIZED,
45
39
  sort_by: toTransactionsSortKey(sortKey),
46
40
  sort_order: sortOrder === 'ascending' ? 'asc' : 'desc',
@@ -3,11 +3,13 @@ import { catchError, debounceTime, filter, mergeMap, switchMap, takeUntil, } fro
3
3
  import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
4
  import { updateTransactions } from '../../../../entity/transaction/transactionReducer';
5
5
  import { isSuccessResponse } from '../../../../responsePayload';
6
- import { BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS } from '../../bulkUploadTiming';
6
+ import { BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS } from '../../helpers/bulkUploadTiming';
7
7
  import { extractTransactionPayloadsFromBatchFiles, isBatchDetailsApiStatusCompleted, toBatchDetails, } from '../../payload/missingReceiptsPayload';
8
- import { bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, clearBulkUpload, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, } from '../../reducers/missingReceiptsViewReducer';
8
+ import { bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, clearBulkUpload, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, restoreBulkUploadMatchingState, } from '../../reducers/missingReceiptsViewReducer';
9
9
  /** First poll after upload; then interval while batch not resolved via Pusher or API. */
10
10
  const FALLBACK_FIRST_DELAY_MS = 30000;
11
+ /** Shorter first poll for restored sessions — batch may already be near completion. */
12
+ const RESTORE_FIRST_DELAY_MS = 5000;
11
13
  const FALLBACK_POLL_INTERVAL_MS = 10000;
12
14
  /**
13
15
  * On Pusher batch completion: refresh batch list (then fetchMultipleBatchDetailsEpic runs),
@@ -25,7 +27,8 @@ export const pusherBatchStatusCompletionEpic = (actions$) => actions$.pipe(filte
25
27
  * force `phase` to `completed` (dismiss automatching banner) and refresh the batch list.
26
28
  * Cancels when the batch completes normally, bulk state is cleared, or another upload supersedes.
27
29
  */
28
- export const bulkUploadAutomatchingTimeoutEpic = (actions$, state$) => actions$.pipe(filter(bulkUploadReceiptsSuccess.match), mergeMap((action) => {
30
+ export const bulkUploadAutomatchingTimeoutEpic = (actions$, state$) => actions$.pipe(filter((action) => bulkUploadReceiptsSuccess.match(action) ||
31
+ restoreBulkUploadMatchingState.match(action)), mergeMap((action) => {
29
32
  const { batchId } = action.payload;
30
33
  return timer(BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS).pipe(mergeMap(() => {
31
34
  const bulk = state$.value.expenseAutomationMissingReceiptsViewState.bulkUpload;
@@ -44,10 +47,15 @@ export const bulkUploadAutomatchingTimeoutEpic = (actions$, state$) => actions$.
44
47
  * error snackbar per upload session (first failure only) so the user is not spammed every
45
48
  * interval; Pusher or a later successful poll still completes the flow.
46
49
  */
47
- export const pollBulkUploadBatchStatusEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(bulkUploadReceiptsSuccess.match), mergeMap((action) => {
50
+ export const pollBulkUploadBatchStatusEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter((action) => bulkUploadReceiptsSuccess.match(action) ||
51
+ restoreBulkUploadMatchingState.match(action)), mergeMap((action) => {
48
52
  const { batchId } = action.payload;
49
53
  let pollErrorNotified = false;
50
- return timer(FALLBACK_FIRST_DELAY_MS, FALLBACK_POLL_INTERVAL_MS).pipe(takeUntil(merge(actions$.pipe(filter(clearBulkUpload.match)), actions$.pipe(filter(pusherBatchStatusUpdate.match), filter((action) => action.payload.batchId === batchId)), actions$.pipe(filter(fetchBulkUploadBatchDetailsSuccess.match), filter((action) => action.payload.batchId === batchId)), actions$.pipe(filter(bulkUploadAutomatchingTimedOut.match), filter((action) => action.payload.batchId === batchId)))), switchMap(() => zeniAPI
54
+ const firstDelay = restoreBulkUploadMatchingState.match(action)
55
+ ? RESTORE_FIRST_DELAY_MS
56
+ : FALLBACK_FIRST_DELAY_MS;
57
+ return timer(firstDelay, FALLBACK_POLL_INTERVAL_MS).pipe(takeUntil(merge(actions$.pipe(filter(clearBulkUpload.match)), actions$.pipe(filter(pusherBatchStatusUpdate.match), filter((action) => action.payload.batchId === batchId &&
58
+ action.payload.status === 'completed')), actions$.pipe(filter(fetchBulkUploadBatchDetailsSuccess.match), filter((action) => action.payload.batchId === batchId)), actions$.pipe(filter(bulkUploadAutomatchingTimedOut.match), filter((action) => action.payload.batchId === batchId)))), switchMap(() => zeniAPI
51
59
  .getJSON(`${zeniAPI.apiEndPoints.communicationAgentMicroServiceBaseUrl}/1.0/batches/${batchId}`)
52
60
  .pipe(mergeMap((response) => {
53
61
  /** Same batch-details URL; polls until `status` is completed (Pusher may win first). */
@@ -91,7 +91,6 @@ export function getExpenseAutomationView(state) {
91
91
  const fetchStateVariables = [
92
92
  expenseAutomationMissingReceiptsViewState,
93
93
  expenseAutomationJESchedulesViewState,
94
- monthEndCloseChecksView,
95
94
  expenseAutomationTransactionsView,
96
95
  expenseAutomationReconciliationViewState,
97
96
  ];
@@ -8,3 +8,9 @@ export const BULK_UPLOAD_BAR_COMPLETE_HOLD_MS = 400;
8
8
  * fallback polling, clear the automatching banner (`phase` → completed), and refresh batch list.
9
9
  */
10
10
  export const BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS = 300000;
11
+ /**
12
+ * Rolling window (in days) for the bulk-upload batch list API. Period-agnostic — the batch list
13
+ * ignores the accounting month picker. Shared between the regular batch-list fetch and the
14
+ * restore-on-mount hydration so both flows always query the same window.
15
+ */
16
+ export const BULK_UPLOAD_BATCH_LIST_DATE_RANGE_DAYS = 30;