@zeniai/client-epic-state 5.2.13 → 5.2.14-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 (135) hide show
  1. package/lib/entity/approvalRule/approvalRuleConflict.d.ts +13 -0
  2. package/lib/entity/approvalRule/approvalRuleConflict.js +16 -1
  3. package/lib/entity/jeSchedules/jeScheduleHelper.d.ts +1 -0
  4. package/lib/entity/jeSchedules/jeScheduleHelper.js +7 -0
  5. package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +78 -1
  6. package/lib/entity/jeSchedules/jeSchedulesPayload.js +183 -4
  7. package/lib/entity/jeSchedules/jeSchedulesReducer.d.ts +4 -2
  8. package/lib/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  9. package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +11 -2
  10. package/lib/entity/jeSchedules/jeSchedulesSelector.js +38 -3
  11. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +123 -1
  12. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +24 -1
  13. package/lib/entity/jeSchedules/jeSchedulesTypes.js +96 -1
  14. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  15. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  16. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +2 -0
  17. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  18. package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +2 -0
  19. package/lib/epic.d.ts +9 -1
  20. package/lib/epic.js +16 -0
  21. package/lib/esm/entity/approvalRule/approvalRuleConflict.js +16 -1
  22. package/lib/esm/entity/jeSchedules/jeScheduleHelper.js +6 -0
  23. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +183 -5
  24. package/lib/esm/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  25. package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +36 -2
  26. package/lib/esm/entity/jeSchedules/jeSchedulesTypes.js +86 -0
  27. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  28. package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  29. package/lib/esm/epic.js +16 -0
  30. package/lib/esm/index.js +17 -11
  31. package/lib/esm/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  32. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +9 -1
  33. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +41 -5
  34. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +45 -0
  35. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  36. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +104 -0
  37. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +25 -0
  38. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +138 -0
  39. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +79 -0
  40. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +180 -0
  41. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +111 -0
  42. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +28 -0
  43. package/lib/esm/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +140 -0
  44. package/lib/esm/view/expenseAutomationView/payload/jeSchedulesPayload.js +55 -0
  45. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +319 -29
  46. package/lib/esm/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +1 -0
  47. package/lib/esm/view/expenseAutomationView/selectors/jeAccountSettingsViewSelector.js +1 -0
  48. package/lib/esm/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +106 -0
  49. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +327 -22
  50. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +5 -6
  51. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.js +24 -7
  52. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +1 -1
  53. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer.js +8 -1
  54. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +42 -8
  55. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogSubFamilyEpics.js +8 -2
  56. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +19 -10
  57. package/lib/esm/view/invoicing/invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewSelector.js +2 -0
  58. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingAccountingPickersEpic.js +0 -1
  59. package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +15 -36
  60. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  61. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  62. package/lib/esm/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  63. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +20 -1
  64. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +20 -1
  65. package/lib/index.d.ts +24 -18
  66. package/lib/index.js +93 -48
  67. package/lib/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  68. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +9 -1
  69. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.d.ts +3 -2
  70. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +39 -3
  71. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.d.ts +21 -0
  72. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +49 -0
  73. package/lib/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  74. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.d.ts +9 -0
  75. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +108 -0
  76. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.d.ts +8 -0
  77. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +29 -0
  78. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.d.ts +9 -0
  79. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +142 -0
  80. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.d.ts +8 -0
  81. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +83 -0
  82. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.d.ts +13 -0
  83. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +187 -0
  84. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.d.ts +65 -0
  85. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +115 -0
  86. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.d.ts +6 -0
  87. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +32 -0
  88. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.d.ts +36 -0
  89. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +145 -0
  90. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  91. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +86 -3
  92. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.js +58 -1
  93. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +93 -12
  94. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +321 -29
  95. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +1 -1
  96. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +2 -2
  97. package/lib/view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes.d.ts +1 -0
  98. package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.d.ts +42 -0
  99. package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +2 -0
  100. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +41 -7
  101. package/lib/view/expenseAutomationView/selectors/jeAccountSettingsViewSelector.js +1 -0
  102. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.d.ts +21 -0
  103. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +112 -0
  104. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.d.ts +34 -0
  105. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +335 -21
  106. package/lib/view/expenseAutomationView/types/completedSubTab.d.ts +1 -1
  107. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +83 -8
  108. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +8 -8
  109. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
  110. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.d.ts +13 -21
  111. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.js +24 -7
  112. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.d.ts +7 -0
  113. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +4 -3
  114. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer.d.ts +18 -9
  115. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer.js +9 -2
  116. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.d.ts +15 -5
  117. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +43 -8
  118. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewState.d.ts +24 -0
  119. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogSubFamilyEpics.d.ts +1 -1
  120. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogSubFamilyEpics.js +8 -2
  121. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +18 -9
  122. package/lib/view/invoicing/invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewSelector.d.ts +6 -0
  123. package/lib/view/invoicing/invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewSelector.js +2 -0
  124. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingAccountingPickersEpic.js +0 -1
  125. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.d.ts +13 -13
  126. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +17 -38
  127. package/lib/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  128. package/lib/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  129. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.d.ts +4 -2
  130. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  131. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +20 -1
  132. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelectorTypes.d.ts +3 -0
  133. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +20 -1
  134. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelectorTypes.d.ts +3 -0
  135. package/package.json +1 -1
@@ -5,18 +5,34 @@ import { getClassById } from '../class/classSelector';
5
5
  import { getScheduleTransactionById } from '../transaction/transactionSelector';
6
6
  import { getUserByUserId } from '../user/userSelector';
7
7
  import { getVendorByVendorId } from '../vendor/vendorSelector';
8
+ // Takes the slice, not RootState: an accrual denormalizes its vendor, account and class names, so
9
+ // unlike getJEAccruedScheduleByJEScheduleKey this joins nothing.
10
+ //
11
+ // Spreads the stored entity rather than rebuilding it field by field. That is deliberate — the
12
+ // accrued joiner listed every field explicitly and silently dropped jeScheduleType, which made a
13
+ // whole tab render empty while its reducer test still passed. A spread cannot lose a field.
14
+ export const getJEOneTimeAccrualByKey = (jeOneTimeAccrualKey, jeSchedulesState) => {
15
+ const accrual = recordGet(jeSchedulesState.oneTimeAccrualsByKey, jeOneTimeAccrualKey);
16
+ if (accrual == null) {
17
+ return undefined;
18
+ }
19
+ return { ...accrual, jeOneTimeAccrualKey };
20
+ };
8
21
  export const getJEAccruedScheduleByJEScheduleKey = (JEScheduleKey, state) => {
9
22
  const { jeSchedulesState, vendorState, accountState, userState, classState } = state;
10
23
  const JEAccruedScheduleState = recordGet(jeSchedulesState.schedulesByAccruedJEScheduleKey, JEScheduleKey);
11
24
  if (JEAccruedScheduleState == null) {
12
25
  return undefined;
13
26
  }
14
- const { period, updatedByUserID: updatedBy, vendorId, jeCredit, jeDebit, currencyCode, currencySymbol, balanceAsOfToday, startDate, endDate, status, updatedAt, jeScheduleId, scheduledJournalEntry, dayOfPostingDate: postingDate, lastDayOfMonth, memo, recurringAmount, createTime, otherAttributes, } = JEAccruedScheduleState;
27
+ const { period, updatedByUserID: updatedBy, createdByUserID: createdBy, vendorId, jeCredit, jeDebit, currencyCode, currencySymbol, balanceAsOfToday, startDate, endDate, status, updatedAt, jeScheduleId, scheduledJournalEntry, dayOfPostingDate: postingDate, lastDayOfMonth, memo, recurringAmount, createTime, otherAttributes, jeScheduleType, } = JEAccruedScheduleState;
15
28
  const vendorDetails = getVendorByVendorId(vendorState, vendorId);
16
29
  if (vendorDetails == null) {
17
30
  throw new Error(`Vendor with ${vendorId} doesn't exist`);
18
31
  }
19
32
  const userDetails = updatedBy != null ? getUserByUserId(userState, updatedBy) : undefined;
33
+ // Resolved the same way the prepaid / fixed joiner does. Without it every accrued row rendered a
34
+ // hyphen under "Created by", even though the payload carries created_by.
35
+ const createdByUserDetails = createdBy != null ? getUserByUserId(userState, createdBy) : undefined;
20
36
  const accountCredit = jeCredit.accountId != null
21
37
  ? getAccountBase(accountState, jeCredit.accountId, 'account_list')
22
38
  : undefined;
@@ -35,14 +51,19 @@ export const getJEAccruedScheduleByJEScheduleKey = (JEScheduleKey, state) => {
35
51
  reportId: 'class_list',
36
52
  })
37
53
  : undefined;
54
+ const postedCount = scheduledJournalEntry.filter((sje) => sje.status.code === 'posted' || sje.status.code === 'recorded').length;
55
+ const lifecycleTotal = period ?? scheduledJournalEntry.length;
38
56
  return {
39
57
  jeScheduleId,
40
58
  otherAttributes,
41
59
  vendor: vendorDetails,
42
60
  updatedByUser: userDetails,
61
+ createdByUser: createdByUserDetails,
43
62
  updatedAt,
44
63
  currencyCode,
45
64
  currencySymbol,
65
+ lifecycleTotal,
66
+ postedCount,
46
67
  jeCredit: {
47
68
  accountingClass: classCredit,
48
69
  account: accountCredit,
@@ -60,6 +81,7 @@ export const getJEAccruedScheduleByJEScheduleKey = (JEScheduleKey, state) => {
60
81
  memo,
61
82
  createTime,
62
83
  recurringAmount,
84
+ jeScheduleType,
63
85
  jeAccruedScheduleKey: JEScheduleKey,
64
86
  balanceAsOfToday: balanceAsOfToday != null
65
87
  ? toAmount(balanceAsOfToday, currencyCode, currencySymbol)
@@ -70,7 +92,7 @@ export const getJEAccruedScheduleByJEScheduleKey = (JEScheduleKey, state) => {
70
92
  export const getJEScheduledTransactionByJEScheduleTransactionKey = (jeScheduleTransactionKey, state) => {
71
93
  const { jeSchedulesState, vendorState, accountState, userState, classState, transactionState, } = state;
72
94
  const jeScheduleTransactionState = recordGet(jeSchedulesState.schedulesByTransactionKey, jeScheduleTransactionKey);
73
- const { period, updatedByUserID: updatedBy, createdByUserID: createdBy, vendorId, jeCredit, jeDebit, currencyCode, currencySymbol, balanceAsOfToday, baseTransaction, startDate, endDate, status, updatedAt, jeScheduleId, scheduledJournalEntry, dayOfPostingDate: postingDate, lastDayOfMonth, otherAttributes, jeScheduleType, aiSummaries, recommendations, } = jeScheduleTransactionState;
95
+ const { period, updatedByUserID: updatedBy, createdByUserID: createdBy, createTime, vendorId, jeCredit, jeDebit, currencyCode, currencySymbol, balanceAsOfToday, baseTransaction, startDate, endDate, status, updatedAt, jeScheduleId, scheduledJournalEntry, dayOfPostingDate: postingDate, lastDayOfMonth, otherAttributes, jeScheduleType, aiSummaries, confidenceScore, recommendations, recurringAmount, postedCount: postedCountFromServer, } = jeScheduleTransactionState;
74
96
  const vendorDetails = getVendorByVendorId(vendorState, vendorId);
75
97
  if (vendorDetails == null) {
76
98
  throw new Error(`Vendor with ${vendorId} doesn't exist`);
@@ -99,14 +121,24 @@ export const getJEScheduledTransactionByJEScheduleTransactionKey = (jeScheduleTr
99
121
  reportId: 'class_list',
100
122
  })
101
123
  : undefined;
124
+ // The expense-automation response carries no scheduled journal entries for these rows, so the
125
+ // filter below counts an empty array and every schedule reported 0 posted. Prefer the count the
126
+ // server derives, and keep the filter for callers that do have entries (the detail page, and
127
+ // failed postings, which come with theirs).
128
+ const postedCount = postedCountFromServer ??
129
+ scheduledJournalEntry.filter((sje) => sje.status.code === 'posted' || sje.status.code === 'recorded').length;
130
+ const lifecycleTotal = period ?? scheduledJournalEntry.length;
102
131
  return {
103
132
  jeScheduleId,
104
133
  jeScheduleType,
134
+ recurringAmount,
105
135
  jeScheduleTransactionKey: jeScheduleTransactionKey,
106
136
  vendor: vendorDetails,
107
137
  updatedByUser: userDetails,
108
138
  updatedAt: updatedAt,
109
139
  period,
140
+ lifecycleTotal,
141
+ postedCount,
110
142
  balanceAsOfToday: balanceAsOfToday != null
111
143
  ? toAmount(balanceAsOfToday, currencyCode, currencySymbol)
112
144
  : undefined,
@@ -129,7 +161,9 @@ export const getJEScheduledTransactionByJEScheduleTransactionKey = (jeScheduleTr
129
161
  },
130
162
  scheduledJournalEntry,
131
163
  aiSummaries,
164
+ confidenceScore,
132
165
  createdByUser: createdByUserDetails,
166
+ createTime,
133
167
  recommendations,
134
168
  };
135
169
  };
@@ -24,6 +24,92 @@ const SCHEDULE_STATUS_CODE = [
24
24
  'draft',
25
25
  ];
26
26
  export const toScheduleStatusCodeType = (v) => stringToUnion(v, SCHEDULE_STATUS_CODE);
27
+ // One-time accruals come from agent-je's Mongo `accruals` collection, not the JE schedule
28
+ // datastore, so they carry their own status vocabulary rather than SCHEDULE_STATUS_CODE.
29
+ // `posting` and `reversing` are transient claims held while a JE posts.
30
+ /**
31
+ * Mirrors agent-je's own status constants. `reverted` is the terminal state a manual revert writes
32
+ * alongside is_deleted; without it stringToUnion logs an error and passes the raw string through.
33
+ *
34
+ * There is deliberately no `ignored` member -- ignoring an accrual sets the `is_ignored` flag and
35
+ * leaves the status on `draft`.
36
+ */
37
+ const ONE_TIME_ACCRUAL_STATUS_CODE = [
38
+ 'draft',
39
+ 'posting',
40
+ 'posted',
41
+ 'posting_blocked',
42
+ 'reversing',
43
+ 'reversed',
44
+ 'reverted',
45
+ ];
46
+ export const toOneTimeAccrualStatusCodeType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_STATUS_CODE);
47
+ // Who created the accrual. This — not the creator's email — is the authoritative
48
+ // AI-vs-manual signal for the Method column.
49
+ const ONE_TIME_ACCRUAL_ORIGIN = ['agent', 'human'];
50
+ export const toOneTimeAccrualOriginType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_ORIGIN);
51
+ const ONE_TIME_ACCRUAL_AUTOMATION_TIER = ['manual', 'draft', 'auto'];
52
+ export const toOneTimeAccrualAutomationTierType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_AUTOMATION_TIER);
53
+ // How the accrual is allowed to reverse. The two are exclusive: a scheduled row reverses on
54
+ // expectedReversalDate and bills never drive it; an on_bill_match row reverses only when a bill
55
+ // is matched, which is why its lifecycle reads "Reverses on match" rather than showing a date.
56
+ const ONE_TIME_ACCRUAL_REVERSAL_POLICY = [
57
+ 'on_bill_match',
58
+ 'scheduled_date',
59
+ ];
60
+ export const toOneTimeAccrualReversalPolicyType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_REVERSAL_POLICY);
61
+ // What actually caused a reverse. Distinct from a *revert*, which soft-deletes the row and
62
+ // never sets this.
63
+ const ONE_TIME_ACCRUAL_REVERSAL_TRIGGER = [
64
+ 'bill_match',
65
+ 'scheduled_date',
66
+ 'manual_reverse',
67
+ ];
68
+ export const toOneTimeAccrualReversalTriggerType = (v) => stringToUnionStrict(v ?? '', ONE_TIME_ACCRUAL_REVERSAL_TRIGGER);
69
+ // Why a human told the AI Accountant not to accrue this month. The gateway validates against
70
+ // exactly this set, so it is a union rather than a free-text string.
71
+ const ONE_TIME_ACCRUAL_IGNORE_REASON = [
72
+ 'no_activity',
73
+ 'paused',
74
+ 'too_small',
75
+ 'need_invoice',
76
+ 'other_ignore',
77
+ ];
78
+ export const toOneTimeAccrualIgnoreReasonType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_IGNORE_REASON);
79
+ export const ALL_ONE_TIME_ACCRUAL_IGNORE_REASONS = ONE_TIME_ACCRUAL_IGNORE_REASON;
80
+ // Why a recommended prepaid / fixed-asset schedule is being dismissed. A different set from the
81
+ // accrual ignore reasons: the gateway validates each against its own list.
82
+ const JE_SCHEDULE_IGNORE_REASON = [
83
+ 'not_needed',
84
+ 'wrong_account',
85
+ 'duplicate',
86
+ 'already_handled',
87
+ 'other_ignore',
88
+ ];
89
+ export const toJEScheduleIgnoreReasonType = (v) => stringToUnion(v, JE_SCHEDULE_IGNORE_REASON);
90
+ export const ALL_JE_SCHEDULE_IGNORE_REASONS = JE_SCHEDULE_IGNORE_REASON;
91
+ // Why a posted prepaid / fixed-asset schedule is being undone. Note `not_accrual` is accrual-only
92
+ // and rejected here, and `created_by_mistake` is schedule-only.
93
+ const JE_SCHEDULE_REVERT_REASON = [
94
+ 'amount_off',
95
+ 'wrong_period',
96
+ 'duplicate',
97
+ 'created_by_mistake',
98
+ 'other_revert',
99
+ ];
100
+ export const toJEScheduleRevertReasonType = (v) => stringToUnion(v, JE_SCHEDULE_REVERT_REASON);
101
+ export const ALL_JE_SCHEDULE_REVERT_REASONS = JE_SCHEDULE_REVERT_REASON;
102
+ // Why a posted accrual is being undone. A disjoint set from the ignore reasons — the gateway
103
+ // validates each action against its own list and rejects the other's values.
104
+ const ONE_TIME_ACCRUAL_REVERT_REASON = [
105
+ 'amount_off',
106
+ 'wrong_period',
107
+ 'not_accrual',
108
+ 'duplicate',
109
+ 'other_revert',
110
+ ];
111
+ export const toOneTimeAccrualRevertReasonType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_REVERT_REASON);
112
+ export const ALL_ONE_TIME_ACCRUAL_REVERT_REASONS = ONE_TIME_ACCRUAL_REVERT_REASON;
27
113
  const JOURNAL_ENTRY_ERROR_CODE = [
28
114
  'vendor_deleted',
29
115
  'debit_category_deleted',
@@ -116,6 +116,9 @@ const ALL_SNACKBAR_MESSAGE_SECTIONS = [
116
116
  'save_schedule',
117
117
  'delete_schedule',
118
118
  'ignore_schedule',
119
+ 'revert_schedule',
120
+ 'ignore_accrual',
121
+ 'revert_accrual',
119
122
  'save_task_detail',
120
123
  'fetch_task_detail',
121
124
  'delete_task',
@@ -30,5 +30,7 @@ export const toScheduleTransaction = (payload, currency_code, currency_symbol) =
30
30
  currencySymbol: currency_symbol,
31
31
  },
32
32
  description: payload.transaction_description ?? undefined,
33
+ vendorId: payload.vendor_id ?? undefined,
34
+ vendorName: payload.vendor_name ?? undefined,
33
35
  };
34
36
  };
package/lib/esm/epic.js CHANGED
@@ -195,9 +195,17 @@ import { initializeAccountSettingsViewEpic, } from './view/expenseAutomationView
195
195
  import { saveAccountSettingsViewEpic, } from './view/expenseAutomationView/epics/jeSchedule/accountSettings/saveAccountSettingsViewEpic';
196
196
  import { fetchJeSchedulesPageEpic as fetchExpenseAutomationJESchedulesPageEpic, } from './view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic';
197
197
  import { fetchJeSchedulesEpic as fetchExpenseAutomationJeSchedulesEpic, } from './view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic';
198
+ import { fetchOneTimeAccrualEpic, } from './view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic';
198
199
  import { ignoreRecommendedJeScheduleEpic as ignoreExpenseAutomationJEScheduleEpic, } from './view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic';
199
200
  import { initializeJeScheduleLocalDataEpic as initializeExpenseAutomationJeScheduleLocalDataEpic, } from './view/expenseAutomationView/epics/jeSchedule/initializeJeScheduleLocalDataEpic';
201
+ import { createOneTimeAccrualEpic, } from './view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic';
202
+ import { initializeNewScheduleEpic, } from './view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic';
203
+ import { saveNewScheduleEpic, } from './view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic';
204
+ import { searchTransactionsForNewScheduleEpic, } from './view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic';
205
+ import { oneTimeAccrualActionsEpic, } from './view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic';
200
206
  import { retryJeScheduleEpic as retryExpenseAutomationJEScheduleEpic, } from './view/expenseAutomationView/epics/jeSchedule/retryJeSchedulesEpic';
207
+ import { revertJeScheduleEpic, } from './view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic';
208
+ import { switchJESchedulesTabEpic as switchExpenseAutomationJESchedulesTabEpic, } from './view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic';
201
209
  import { bulkUploadMatchResultToastEpic, } from './view/expenseAutomationView/epics/missingReceipts/bulkUploadMatchResultToastEpic';
202
210
  import { bulkUploadReceiptsEpic, } from './view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic';
203
211
  import { confirmBulkUploadMatchEpic, } from './view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic';
@@ -783,6 +791,7 @@ const ALL_EPICS = [
783
791
  createNewSchedulesAccruedEpic,
784
792
  createNewSchedulesEpic,
785
793
  createNewTaskGroupEpic,
794
+ createOneTimeAccrualEpic,
786
795
  createPaymentInstrumentEpic,
787
796
  createSessionAndSubmitEpic,
788
797
  createSessionEpic,
@@ -1062,6 +1071,7 @@ const ALL_EPICS = [
1062
1071
  fetchOnboardingCustomerSetupViewEpic,
1063
1072
  fetchOnboardingCustomerViewEpic,
1064
1073
  fetchOnboardingViewEpic,
1074
+ fetchOneTimeAccrualEpic,
1065
1075
  fetchOpExByVendorEpic,
1066
1076
  fetchOpExByVendorReportForTimeframeEpic,
1067
1077
  fetchOpExByVendorReportSummaryEpic,
@@ -1216,6 +1226,7 @@ const ALL_EPICS = [
1216
1226
  initializeInvoicingCustomerAddressEpic,
1217
1227
  initializeInvoicingSubscriptionAddressEpic,
1218
1228
  initializeMyProfileLocalDataEpic,
1229
+ initializeNewScheduleEpic,
1219
1230
  initializeOnboardingCustomerViewUpdateDataEpic,
1220
1231
  initializeRemiSetupApproverViewUpdateDataEpic,
1221
1232
  initializeRemiToLocalStoreEpic,
@@ -1238,6 +1249,7 @@ const ALL_EPICS = [
1238
1249
  markAsCompleteScheduleDetailEpic,
1239
1250
  markTransactionAsNotMiscategorizedEpic,
1240
1251
  notifyMeForFeatureEpic,
1252
+ oneTimeAccrualActionsEpic,
1241
1253
  parallelFetchAccountTransactionListEpic,
1242
1254
  parallelFetchClassTransactionListEpic,
1243
1255
  parallelFetchEntityTransactionListEpic,
@@ -1281,6 +1293,7 @@ const ALL_EPICS = [
1281
1293
  retryExpenseAutomationJEScheduleEpic,
1282
1294
  retryInvoicingQboSyncTaskEpic,
1283
1295
  retryOrRefundBillEpic,
1296
+ revertJeScheduleEpic,
1284
1297
  reviewDraftRemisBulkActionEpic,
1285
1298
  reviewExpenseAutomationFluxAnalysisViewEpic,
1286
1299
  revokeCardInviteEpic,
@@ -1316,6 +1329,7 @@ const ALL_EPICS = [
1316
1329
  saveInvoicingSubscriptionEpic,
1317
1330
  saveMagicLinkBankAccountEpic,
1318
1331
  saveNewAddressEpic,
1332
+ saveNewScheduleEpic,
1319
1333
  saveNotificationPreferencesEpic,
1320
1334
  saveNotificationSettingsEpic,
1321
1335
  saveOAuthConnectionEpic,
@@ -1340,6 +1354,7 @@ const ALL_EPICS = [
1340
1354
  saveVendorsTabVendorEpic,
1341
1355
  scheduleTenantCreditScoreCronEpic,
1342
1356
  searchTransactionsForManualMatchEpic,
1357
+ searchTransactionsForNewScheduleEpic,
1343
1358
  seedAiCardCreationFormDraftEpic,
1344
1359
  seedAiCardPolicyFormDraftEpic,
1345
1360
  sendCompanyMonthEndReportEpic,
@@ -1363,6 +1378,7 @@ const ALL_EPICS = [
1363
1378
  submitInvoicingBrandingFormEpic,
1364
1379
  submitInvoicingQboSettingsEpic,
1365
1380
  submitQuestionEpic,
1381
+ switchExpenseAutomationJESchedulesTabEpic,
1366
1382
  syncInvoicingSubscriptionCouponsEpic,
1367
1383
  syncTabsAfterAutomatchEpic,
1368
1384
  toggleReportUIOptionForecastModeEpic,
package/lib/esm/index.js CHANGED
@@ -60,7 +60,7 @@ import { getForecast } from './entity/forecast/forecastSelector';
60
60
  import { toEntityType, } from './entity/genericEntity/entity';
61
61
  import { updateEntities } from './entity/genericEntity/entityReducer';
62
62
  import { getEntityByEntityIDs } from './entity/genericEntity/entitySelector';
63
- import { ALL_SCHEDULES_TYPES, getJEScheduleTransactionKey, toScheduleTypesType, toScheduleTypesTypeStrict, } from './entity/jeSchedules/jeSchedulesTypes';
63
+ import { ALL_JE_SCHEDULE_IGNORE_REASONS, ALL_JE_SCHEDULE_REVERT_REASONS, ALL_ONE_TIME_ACCRUAL_IGNORE_REASONS, ALL_ONE_TIME_ACCRUAL_REVERT_REASONS, ALL_SCHEDULES_TYPES, getJEScheduleTransactionKey, toScheduleTypesType, toScheduleTypesTypeStrict, } from './entity/jeSchedules/jeSchedulesTypes';
64
64
  import { ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, } from './entity/monthEndCloseChecks/monthEndCloseChecksState';
65
65
  import { updateCommentsNotifications, updateCommentsNotificationsStatuses, } from './entity/notification/notificationReducer';
66
66
  import { toNotificationModeStrict, } from './entity/notification/types/notificationTypes';
@@ -83,7 +83,7 @@ import { isTransferTransaction, } from './entity/transaction/stateTypes/otherTra
83
83
  import { toPlatformLineDetailType, } from './entity/transaction/stateTypes/transactionLine';
84
84
  import { toTransactionCategory, toTransactionType, toTransactionTypeStrict, } from './entity/transaction/stateTypes/transactionType';
85
85
  import { isVendorTransaction, isVendorTransactionWithCustomer, } from './entity/transaction/stateTypes/vendorTransaction';
86
- import { getSupportedTransactionById } from './entity/transaction/transactionSelector';
86
+ import { getScheduleTransactionById, getSupportedTransactionById, } from './entity/transaction/transactionSelector';
87
87
  import { getUserRoleByUserId, getUserRoleByUserIds, } from './entity/userRole/userRoleSelector';
88
88
  import { hasBillPayAccessible, hasBillPayFallbackAdminLevelAccess, hasChargeCardAccessible, hasReimbursementAccessible, hasReimbursementUserAccess, hasRemiFallbackAdminLevelAccess, hasTreasuryAccessible, hasZeniAccountsAccessible, isZeniSignedInUser, } from './entity/userRole/userRoleTenantAccess';
89
89
  import { getUserRoleMap, hasAICFOAccess, hasAdminLevelAccess, hasAnyCompanyRole, hasAnyFinOpRole, hasBillPayAccess, hasBillPayAdminLevelAccess, hasBookKeepingAdminLevelAccess, hasBookKeepingUserLevelAccess, hasChargeCardAccess, hasChargeCardAdminLevelAccess, hasEmployeeLevelAccess, hasFullOrAdminLevelAccess, hasInvestorBankerLevelAccess, hasInvoicingAdminLevelAccess, hasOnlyBillPayAccess, hasOnlyChargeCardAccess, hasOnlyReimbursementAccess, hasOnlyZeniAccountsAccess, hasReimbursementAccess, hasReimbursementAdminLevelAccess, hasSpendManagementAccess, hasSpendManagementAdminLevelAccess, hasSuperAdminLevelAccess, hasTreasuryAccess, hasTreasuryAdminLevelAccess, hasZeniAccountsAccess, hasZeniAccountsAdminLevelAccess, hasZeniRoleOrCompanyOfficerAccess, isFinOpsUserRoleType, isNonZeniRole, toUserRoleType, toUserRoleTypeStrict, } from './entity/userRole/userRoleType';
@@ -181,20 +181,22 @@ import uploadAccountStatementIntoDocumentAI from './view/expenseAutomationView/e
181
181
  import { fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedPeriod, updateCurrentSelectedView, } from './view/expenseAutomationView/expenseAutomationViewReducer';
182
182
  import { getExpenseAutomationView } from './view/expenseAutomationView/expenseAutomationViewSelector';
183
183
  import { toExpenseAutomationViewType, } from './view/expenseAutomationView/expenseAutomationViewState';
184
+ import { computeNewScheduleJeDetails } from './view/expenseAutomationView/helpers/newScheduleLocalDataHelper';
184
185
  import { isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardCreditType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, } from './view/expenseAutomationView/helpers/reconciliationHelpers';
185
186
  import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, } from './view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';
186
187
  import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview, } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
187
- import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryJeSchedule as retryExpenseAutomationJESchedule, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys, } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
188
+ import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, clearSearchTransactionsForNewSchedule as clearJeSearchTransactionsForNewSchedule, createOneTimeAccrual, createOneTimeAccrualFailure, createOneTimeAccrualSuccess, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, fetchOneTimeAccrual, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, ignoreOneTimeAccrual, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeNewSchedule as initializeJeNewSchedule, initializeJeScheduleLocalData, promoteOneTimeAccrual, removeJeScheduleTransactionKey, resetNewScheduleLocalData as resetJeNewScheduleLocalData, retryJeSchedule as retryExpenseAutomationJESchedule, revertJeSchedule, revertOneTimeAccrual, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, saveNewSchedule as saveJeNewSchedule, saveNewScheduleFailure as saveJeNewScheduleFailure, saveNewScheduleSuccess as saveJeNewScheduleSuccess, searchTransactionsForNewSchedule as searchJeTransactionsForNewSchedule, searchTransactionsForNewScheduleFailure as searchJeTransactionsForNewScheduleFailure, searchTransactionsForNewScheduleSuccess as searchJeTransactionsForNewScheduleSuccess, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJEScheduleTypeFilter, updateNewScheduleLocalData as updateJeNewScheduleLocalData, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys, } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
188
189
  import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearBulkUploadBatchDetailsForScopeChange, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markBatchDetailRefreshAttempted, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, refreshBatchDetailsForBatchId, requestMissingReceiptsTabNavigation, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, searchTransactionsForManualMatch, searchTransactionsForManualMatchFailure, searchTransactionsForManualMatchSuccess, setBulkUploadCompletedSubTab, setBulkUploadResultsTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, storeBatchDetails, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess, } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
189
190
  import { clearStatementDateConflict, confirmStatementMapping, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseCombinedStatement, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, setStatementProcessingDismissedToBackground, submitCombinedStatementUpdate, submitStatementUpdate, updateAccountReconciliationLocalData as updateExpenseAutomationAccountReconciliationLocalData, updateSelectedAccountId as updateExpenseAutomationAccountReconciliationSelectedAccountId, updateSelectedTab as updateExpenseAutomationAccountReconciliationSelectedTab, updateReconListScrollPosition as updateExpenseAutomationReconListScrollPosition, updateReviewTabSortState as updateExpenseAutomationReconReviewTabListSortState, updateReviewTabLocalData as updateExpenseAutomationReconReviewTabLocalData, updateReconcileTabListScrollState as updateExpenseAutomationReconcileTabListScrollState, updateReconcileTabListSortState as updateExpenseAutomationReconcileTabListSortState, updateReconcileTabLocalData as updateExpenseAutomationReconcileTabLocalData, updateSelectedDrawerAccountId as updateExpenseAutomationSelectedDrawerAccountId, updateNodeCollapseState, updateParsedStatementData, updateStatementProcessingBackgroundCompletedSteps, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement, } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
190
191
  import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markCategoryClassRecommendationsFailureForCategorization, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, updateTransactionFilters, updateTransactionGroup, uploadTransactionCategorizationReceiptSuccess, } from './view/expenseAutomationView/reducers/transactionsViewReducer';
191
192
  import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
193
+ import { getNewAccrualAccountsView as getJeNewAccrualAccountsView, getNewScheduleSearchTransactionsView as getJeNewScheduleSearchTransactionsView, getNewScheduleView as getJeNewScheduleView, } from './view/expenseAutomationView/selectors/jeNewScheduleViewSelector';
192
194
  import { getExpenseAutomationReconciliationView, getLedgerAccountIdsWithStatementOverrideWarning, getLedgerAccountsForCombinedStatementMapping, getReparseStatementStatusByAccountId, getUnavailableLedgerAccountIds, isAccountReconReport, } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
193
195
  import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement, } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
194
196
  import { applyTransactionFilters } from './view/expenseAutomationView/transactionFilterHelpers';
195
197
  import { TRANSACTION_FILTER_CATEGORIES, } from './view/expenseAutomationView/transactionFilterTypes';
196
198
  import { DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab, } from './view/expenseAutomationView/types/completedSubTab';
197
- import { toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey, } from './view/expenseAutomationView/types/jeSchedulesViewState';
199
+ import { toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey, toJEPageTab, } from './view/expenseAutomationView/types/jeSchedulesViewState';
198
200
  import { BATCH_FILE_STATUSES, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toMatchSource, toMissingReceiptsTab, } from './view/expenseAutomationView/types/missingReceiptsViewState';
199
201
  import { toMissingReceiptsSortKey as toExpenseAutomationMissingReceiptsSortKey, } from './view/expenseAutomationView/types/missingReceiptsViewState';
200
202
  import { toReconciliationTabsType, } from './view/expenseAutomationView/types/reconciliationViewState';
@@ -483,9 +485,10 @@ export { stringToUnion, stringToUnionStrict };
483
485
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, getMonthEndCloseChecksViewByTenantId, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, };
484
486
  export {
485
487
  // Bulk Upload Types
486
- BATCH_FILE_STATUSES, isUnmatchedTabFileStatus, DEFAULT_COMPLETED_SUB_TAB, DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, toTransactionGroup, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionGroup, fetchExpenseAutomationMissingReceipts,
488
+ BATCH_FILE_STATUSES, isUnmatchedTabFileStatus, DEFAULT_COMPLETED_SUB_TAB, DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, toTransactionGroup, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, toExpenseAutomationJEScheduleSortKey, toJEPageTab, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJEScheduleTypeFilter, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionGroup, fetchExpenseAutomationMissingReceipts,
487
489
  // Bulk Upload Actions
488
490
  bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, getExpenseAutomationFluxAnalysisView, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, updateFluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, getExpenseAutomationReconciliationView, getLedgerAccountIdsWithStatementOverrideWarning, getLedgerAccountsForCombinedStatementMapping, getReparseStatementStatusByAccountId, getUnavailableLedgerAccountIds, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, getAccountReconByAccountIdAndSelectedPeriod, toReconciliationTabsType, isAccountReconReport, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, toReconciliationAccountSource, deleteAccountStatement, uploadAccountStatement, parseCombinedStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, updateStatementUploadChosen, submitCombinedStatementUpdate, submitStatementUpdate, clearStatementDateConflict, confirmStatementMapping, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, };
491
+ export { computeNewScheduleJeDetails, createOneTimeAccrual, createOneTimeAccrualFailure, createOneTimeAccrualSuccess, fetchOneTimeAccrual, getJeNewAccrualAccountsView, ignoreOneTimeAccrual, promoteOneTimeAccrual, revertJeSchedule, revertOneTimeAccrual, getJeNewScheduleSearchTransactionsView, getJeNewScheduleView, };
489
492
  export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateTransactionFilters, updateSelectedCheckboxTransactionIds, markCategoryClassRecommendationsFailureForCategorization, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, clearTransferEntryRouteReplacement, fetchAccountsForTransferFlow, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, toTransactionsSortKey, };
490
493
  export { TOP_EX_TIME_PERIODS };
491
494
  export { toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsoluteDay, toMonthYearPeriodId, convertToPeriod, };
@@ -541,7 +544,7 @@ export { toTransactionType, toTransactionTypeStrict, toTransactionCategory, };
541
544
  export { defaultVendorCurrency, updateVendors };
542
545
  export { isVendorTransaction, isVendorTransactionWithCustomer, };
543
546
  export { isTransferTransaction };
544
- export { getSupportedTransactionById, };
547
+ export { getScheduleTransactionById, getSupportedTransactionById, };
545
548
  export { updateLatestTransactionId, parallelFetchAccountTransactionList, parallelFetchEntityTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, updateTransactionListByClassUIState, updateTransactionListByClass, parallelFetchProjectTransactionList, updateTransactionListByProjectUIState, updateTransactionListByProject, updateTransactionListUIStateByCategoryType, parallelFetchTransactionListByCategoryType, };
546
549
  export { getTransactionListByAccount, getTransactionListUIStateByAccountKey, };
547
550
  export { fetchEntityTransactionList, updateTransactionListByEntity, saveTransactionDetailLocalData, clearTransactionDetailSaveStatus, updateTransactionListByEntityFailure, resetLineItemsCategoryClassInLocalData, setAllLineItemsToCategoryClassInLocalData, saveTransactionDetail, setAllLineItemsLocalDataIsUpdateAllChecked, initializeTransactionDetailLocalData, markCategoryClassRecommendationsFailureForTransactionDetail, removeEntityRecommendationForLineIdForTransactionDetail, updateSelectedVendor, updateSelectedCustomer, resetSelectedCustomer, resetVendor, updateLocalDataWithTransactionsUpdateWithVendorCheckbox, updateVendorToAllLineItems, resetAllLineItemsToVendor, updateLatestSelectedEntity, updateVendorBulkRecommendationsFetchStatus, setIsVendorUpdateAllChecked, addSplitLine, deleteSplitLine, toggleSplitEditMode, };
@@ -652,9 +655,9 @@ export { updateChargeCardTransactionAttachments, updateChargeCardStatusFromPushe
652
655
  export { TIME_SERIES_DURATIONS, convertToTimeSeriesSelectionRange, toTimeSeriesDuration, fetchAggregatedReport, aggregatedReportView, };
653
656
  export { fetchApAging, getApAgingReport, updateApAgingUIState, };
654
657
  export { fetchApAgingDetail, getApAgingDetailForVendor, updateApAgingDetailUIState, };
655
- export { clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchExpenseAutomationJESchedulesPage, ignoreExpenseAutomationJESchedule, initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryExpenseAutomationJESchedule, updateExpenseAutomationJESchedulesUIState, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys, };
658
+ export { clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, clearJeSearchTransactionsForNewSchedule, fetchExpenseAutomationJESchedulesPage, ignoreExpenseAutomationJESchedule, initializeJeAccountSettingsView, initializeJeNewSchedule, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, resetJeNewScheduleLocalData, retryExpenseAutomationJESchedule, saveJeNewSchedule, saveJeNewScheduleFailure, saveJeNewScheduleSuccess, searchJeTransactionsForNewSchedule, searchJeTransactionsForNewScheduleFailure, searchJeTransactionsForNewScheduleSuccess, updateExpenseAutomationJESchedulesUIState, updateJeNewScheduleLocalData, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys, };
656
659
  export { createNewSchedulesAccrued, deleteScheduleAccruedDetail, cancelScheduleAccruedJournalEntry, fetchScheduleAccruedDetails, fetchScheduleAccruedDetailsPage, resetJEAccruedLinkInLocalData, saveScheduleAccruedDetails, updateAmountsInScheduleAccruedDetail, updatedJEAccruedLinkWithRecommendedLocalData, updatedJELinkInLocalDataAccruedExpenses, fetchRecommendedTransactionRowIndex, clearSelectedJELinkRowIndex, updateLinkBillExpenseLocalData, updateScheduleAccruedDetailsLocalData, updateSelectedJEAccruedScheduleKey, resetSelectedJEAccruedScheduleKey, resetAccruedDetailNewScheduleState, };
657
- export { getJEScheduleTransactionKey, ALL_SCHEDULES_TYPES, getScheduleListReport, getAccruedScheduleListReport, fetchScheduleList, fetchAccruedScheduleList, fetchDownloadSchedules, fetchSchedulesAccount, updateScheduleListLocalData, getFetchStateForScheduleAccountList, toScheduleTypesType, toScheduleTypesTypeStrict, toScheduleListTabsFileTypeStrict, toScheduleSubTabType, updateScheduleListSubTab, updateScheduleListSearchText, updateScheduleListScrollState, updateScheduleListSortState, updateSelectedJEScheduleKey, fetchScheduleDetails, getScheduleDetailsView, getAccruedScheduleDetailsView, fetchScheduleDetailsPage, saveScheduleDetails, deleteScheduleDetail, createNewSchedules, updateScheduleDetailsLocalData, updateScheduleListDownloadState, updateAccruedJEScheduleAccruedByListKey, updatedSelectedJELinkRowIndex, getQBOUrlForLink, getThirdPartyIDFromQBOURL, updatedJELinkInLocalData, updateAmountsInScheduleDetail, resetJELinkInLocalData, updatedJELinkWithRecommendedLocalData, getFetchStateForScheduleListByType, getDefaultSelectedTimeframeForScheduleType, markAsCompleteScheduleDetail, resetMarkAsCompleteStatus, fetchVendorTabView, updateVendorTabViewTab, getVendorTabView, };
660
+ export { getJEScheduleTransactionKey, ALL_JE_SCHEDULE_IGNORE_REASONS, ALL_JE_SCHEDULE_REVERT_REASONS, ALL_ONE_TIME_ACCRUAL_IGNORE_REASONS, ALL_ONE_TIME_ACCRUAL_REVERT_REASONS, ALL_SCHEDULES_TYPES, getScheduleListReport, getAccruedScheduleListReport, fetchScheduleList, fetchAccruedScheduleList, fetchDownloadSchedules, fetchSchedulesAccount, updateScheduleListLocalData, getFetchStateForScheduleAccountList, toScheduleTypesType, toScheduleTypesTypeStrict, toScheduleListTabsFileTypeStrict, toScheduleSubTabType, updateScheduleListSubTab, updateScheduleListSearchText, updateScheduleListScrollState, updateScheduleListSortState, updateSelectedJEScheduleKey, fetchScheduleDetails, getScheduleDetailsView, getAccruedScheduleDetailsView, fetchScheduleDetailsPage, saveScheduleDetails, deleteScheduleDetail, createNewSchedules, updateScheduleDetailsLocalData, updateScheduleListDownloadState, updateAccruedJEScheduleAccruedByListKey, updatedSelectedJELinkRowIndex, getQBOUrlForLink, getThirdPartyIDFromQBOURL, updatedJELinkInLocalData, updateAmountsInScheduleDetail, resetJELinkInLocalData, updatedJELinkWithRecommendedLocalData, getFetchStateForScheduleListByType, getDefaultSelectedTimeframeForScheduleType, markAsCompleteScheduleDetail, resetMarkAsCompleteStatus, fetchVendorTabView, updateVendorTabViewTab, getVendorTabView, };
658
661
  export { toVendorFirstReviewViewColumnKeyType, getGlobalMerchantAutoCompleteResults, getVendorFirstReviewView, getVendorFirstReviewAttachmentView, fetchVendorFirstReviewView, fetchVendorFirstReviewAttachments, updateVendorFirstReviewViewScrollYOffset, resetVendorFirstReviewLocalData, updateVendorFirstReviewViewPageToken, clearRecentlySavedErroredVendorData, saveVendorFirstReviewView, updateVendorFirstReviewViewLocalData, updateVendorFirstReviewSortUiState, fetchGlobalMerchantAutoCompleteView, clearGlobalMerchantAutoCompleteResults, updateReviewVendorDetailLocalData, saveVendorDetailsView, getVendorDetailSelectorView, };
659
662
  export { fetchGlobalMerchantRecommendation, createGlobalMerchant, updateCreateGlobalMerchantLocalData, clearGlobalMerchantView, getGlobalMerchantView, };
660
663
  export { approveVendorGlobalReview, rejectVendorGlobalReview, fetchVendorGlobalReviewView, updateSelectedGlobalMerchant, updateVendorGlobalReviewViewUIState, getVendorGlobalReviewView, getTenantMerchantByMerchantId, toVendorGlobalReviewColumnSortKeyType, updateVendorGlobalReviewViewLocalData, };
@@ -766,9 +769,9 @@ export { getInvoicingCustomerFormView } from './view/invoicing/editInvoicingCust
766
769
  export { fetchInvoicingSubscriptionFormPage, initializeInvoicingSubscriptionAddress, resetEditInvoicingSubscriptionDetailView, submitInvoicingSubscriptionForm, updateInvoicingSubscriptionFormDraft, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewReducer';
767
770
  export { INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE, entityToInvoicingSubscriptionFormLocalData, initialInvoicingSubscriptionFormLocalData, invoicingSubscriptionTodayIso, toInvoicingSubscriptionQuantity, } from './view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig';
768
771
  export { getEditInvoicingSubscriptionDetailViewState, getInvoicingSubscriptionFormView, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector';
769
- export { archiveInvoicingCatalogSubFamily, createInvoicingCatalogSubFamily, resetEditInvoicingCatalogItemDetailView, saveInvoicingCatalogItem, submitInvoicingCatalogItemForm, updateInvoicingCatalogItemFormDraft, } from './view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer';
772
+ export { archiveInvoicingCatalogSubFamily, createInvoicingCatalogSubFamily, resetEditInvoicingCatalogItemDetailView, saveInvoicingCatalogItem, submitInvoicingCatalogItemForm, updateInvoicingCatalogItemDetailEditDraft, updateInvoicingCatalogItemFormDraft, } from './view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer';
770
773
  export { catalogDetailEditValuesToSavePayload, createSubFamilyFormToPayload, planToCatalogDetailEditValues, productToCreateSubFamilyFormValues, } from './view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload';
771
- export { INVOICING_CATALOG_APPLICABILITY_VALUES, INVOICING_CATALOG_PRICING_MODEL_VALUES, INVOICING_CATALOG_PRORATION_VALUES, INVOICING_CATALOG_TIER_TYPE_VALUES, blankInvoicingCatalogSubFamily, blankInvoicingCatalogTier, entityToInvoicingCatalogItemFormLocalData, initialInvoicingCatalogItemFormLocalData, isTieredCatalogPricingModel, } from './view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig';
774
+ export { INVOICING_CATALOG_APPLICABILITY_VALUES, INVOICING_CATALOG_PRICING_MODEL_VALUES, INVOICING_CATALOG_PRORATION_VALUES, INVOICING_CATALOG_TIER_TYPE_VALUES, blankInvoicingCatalogSubFamily, blankInvoicingCatalogTier, entityToInvoicingCatalogItemFormLocalData, invoicingProductToCatalogItemFormSubFamily, initialInvoicingCatalogItemFormLocalData, isTieredCatalogPricingModel, } from './view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig';
772
775
  export { getEditInvoicingCatalogItemDetailViewState, getInvoicingApplicableCatalogItemOptions, getInvoicingCatalogItemFormView, getSavedInvoicingCatalogItemId, getSavedInvoicingCatalogItemKind, } from './view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector';
773
776
  export { resetEditInvoicingCouponDetailView, saveInvoicingCoupon, submitInvoicingCouponForm, updateInvoicingCouponFormDraft, } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewReducer';
774
777
  export { entityToInvoicingCouponFormLocalData, initialInvoicingCouponFormLocalData, } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewState';
@@ -856,10 +859,13 @@ export { INVOICING_BUSINESS_ADDRESS_TYPE, entityToInvoicingBrandingFormLocalData
856
859
  export { isStripeConnectedFromSettings } from './view/invoicing/settingsView/invoicingSettingsHelpers';
857
860
  // ── Invoicing: QBO integration ────────────────────────────────────────────────
858
861
  export { fetchInvoicingAccountingPickers, fetchInvoicingQboConnection, fetchInvoicingQboSyncHealth, retryInvoicingQboSyncTask, startInvoicingQboBackfill, } from './view/invoicing/invoicingQboView/invoicingQboViewReducer';
859
- export { INVOICING_INCOME_ACCOUNT_TYPES, invoicingAccountsForQboAccountTypes, } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
862
+ export { invoicingAccountsForQboAccountTypes } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
860
863
  export { getInvoicingQboView } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
861
864
  export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingNamedOptionsByKey, toInvoicingQboCustomerMatchingMode, } from './entity/invoicing/invoicingCommonPayload';
862
865
  // ── Invoicing: config ─────────────────────────────────────────────────────────
863
866
  export { acceptInvoicingTerms, enableInvoicing, fetchInvoicingConfig, resetInvoicingConfigActionStates, updateInvoicingConfig, } from './view/invoicing/invoicingConfigView/invoicingConfigViewReducer';
864
867
  export { getInvoicingConfigView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
865
868
  export { getInvoicingOnboardingGateView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
869
+ // Accrued JE schedules are not a discriminated union member, so consumers need this guard to
870
+ // narrow a JEScheduleRow before reading baseTransaction / recurringAmount.
871
+ export { getExpenseAutomationJEOneTimeAccrualDetailView, getJEScheduleRowType, isAccruedScheduleRow, isAiAccountantSchedule, isExistingTabRow, isOneTimeAccrualRow, isRenderableOneTimeAccrual, isPendingReviewRow, } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
@@ -8,6 +8,7 @@ import { fetchJeSchedulesPage } from '../../reducers/jeSchedulesViewReducer';
8
8
  import { fetchMissingReceipts } from '../../reducers/missingReceiptsViewReducer';
9
9
  import { fetchReconciliation } from '../../reducers/reconciliationViewReducer';
10
10
  import { fetchTransactionCategorizationView } from '../../reducers/transactionsViewReducer';
11
+ import { getJESchedulePeriodTabKey } from '../../types/jeSchedulesViewState';
11
12
  export const fetchAllExpenseAutomationTabsEpic = (actions$, state$) => actions$.pipe(filter(fetchAllExpenseAutomationTabs.match), switchMap((action) => {
12
13
  const { cacheOverride, refreshViewInBackground } = action.payload;
13
14
  const state = state$.value;
@@ -59,14 +60,16 @@ export const fetchAllExpenseAutomationTabsEpic = (actions$, state$) => actions$.
59
60
  state.expenseAutomationFluxAnalysisViewState.groupsBySelectedPeriod[monthYearPeriodId] == null)) {
60
61
  fetchActions.push(fetchFluxAnalysisView(selectedPeriod, cacheOverride, refreshViewInBackground, null));
61
62
  }
63
+ // The two JE tabs cache separately, so only the tab actually being shown decides whether a
64
+ // fetch is still needed.
65
+ const jeSchedulesPeriodTabKey = getJESchedulePeriodTabKey(state.expenseAutomationJESchedulesViewState.uiState.selectedPageTab, monthYearPeriodId);
62
66
  if (state.expenseAutomationJESchedulesViewState.fetchState !==
63
67
  'In-Progress' &&
64
68
  (!state.expenseAutomationJESchedulesViewState.hasValidState() ||
65
69
  state.expenseAutomationJESchedulesViewState
66
- .jeScheduleTransactionKeysByPeriod[monthYearPeriodId] == null ||
70
+ .jeScheduleTransactionKeysByPeriodAndTab[jeSchedulesPeriodTabKey] == null ||
67
71
  state.expenseAutomationJESchedulesViewState
68
- .failedJeScheduleTransactionKeysByPeriod[monthYearPeriodId] ==
69
- null)) {
72
+ .failedJeScheduleTransactionKeysByPeriodAndTab[jeSchedulesPeriodTabKey] == null)) {
70
73
  fetchActions.push(fetchJeSchedulesPage({ start: timePeriodStart, end: timePeriodEnd }, cacheOverride));
71
74
  }
72
75
  if (state.expenseAutomationReconciliationViewState.fetchState !==
@@ -14,6 +14,14 @@ export const fetchJeSchedulesPageEpic = (actions$, state$) => actions$.pipe(filt
14
14
  jeSchedulePageActions.push(fetchAccountList(accountType.accountListKey, true, false, false, false, accountType.allowedAccountList));
15
15
  }
16
16
  jeSchedulePageActions.push(fetchJeSchedules(period, refreshViewInBackground));
17
- jeSchedulePageActions.push(initializeAccountSettingsView());
17
+ // Only on the first page load. Account settings cannot change from a tab switch or a
18
+ // refresh, and re-initializing puts accountSettingsView back to 'In-Progress' -- which the
19
+ // page reads as "still loading" and answers with a full skeleton over rows it already has.
20
+ // The action also resets localData, so re-dispatching it blindly would empty the settings
21
+ // form until the refetch lands. Saving account settings still re-initializes explicitly.
22
+ if (!state$.value.expenseAutomationJESchedulesViewState.accountSettings
23
+ .hasLoadedAccountSettings) {
24
+ jeSchedulePageActions.push(initializeAccountSettingsView());
25
+ }
18
26
  return concat(from(jeSchedulePageActions));
19
27
  }));
@@ -1,9 +1,12 @@
1
1
  import { from, of } from 'rxjs';
2
- import { catchError, filter, mergeMap } from 'rxjs/operators';
3
- import { toString } from '../../../../commonStateTypes/timePeriod';
4
- import { updateJESchedules, updateJESchedulesDetails, } from '../../../../entity/jeSchedules/jeSchedulesReducer';
2
+ import { catchError, filter, mergeMap, takeUntil } from 'rxjs/operators';
3
+ import { DEFAULT_DATE_FORMAT } from '../../../../commonStateTypes/timePeriod';
4
+ import { toAbsoluteDay, toString } from '../../../../commonStateTypes/timePeriod';
5
+ import { updateAccruedJESchedules, updateAccruedJESchedulesDetails, updateJEOneTimeAccruals, updateJESchedules, updateJESchedulesDetails, } from '../../../../entity/jeSchedules/jeSchedulesReducer';
5
6
  import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
6
7
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
8
+ import { clearAll } from '../../../../rootActions';
9
+ import { date } from '../../../../zeniDayJS';
7
10
  import { fetchJeSchedules, fetchJeSchedulesFailure, fetchJeSchedulesSuccess, initializeJeScheduleLocalData, } from '../../reducers/jeSchedulesViewReducer';
8
11
  export const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchJeSchedules.match), mergeMap((action) => {
9
12
  const state = state$.value;
@@ -11,27 +14,54 @@ export const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe
11
14
  const { period, refreshViewInBackground } = action.payload;
12
15
  const currentTenant = getCurrentTenant(state);
13
16
  const selectedPeriod = selectedPeriodByTenantId[currentTenant.tenantId];
17
+ const { selectedPageTab } = state.expenseAutomationJESchedulesViewState.uiState;
18
+ const isClosePeriodTab = selectedPageTab === 'schedules';
19
+ const existingEndDate = toAbsoluteDay(date(toString(period.start))
20
+ .subtract(1, 'month')
21
+ .endOf('month')
22
+ .format(DEFAULT_DATE_FORMAT));
14
23
  const queryParam = {
15
24
  start_date: toString(period.start),
16
- end_date: toString(period.end),
25
+ end_date: isClosePeriodTab || existingEndDate == null
26
+ ? toString(period.end)
27
+ : toString(existingEndDate),
28
+ include_accrued: true,
29
+ ...(isClosePeriodTab
30
+ ? { close_period_start_date: toString(period.start) }
31
+ : {}),
17
32
  };
18
33
  return zeniAPI
19
34
  .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/expenses_automation/je_schedules?query=${encodeURIComponent(JSON.stringify(queryParam))}`)
20
35
  .pipe(mergeMap((response) => {
21
36
  if (isSuccessResponse(response) && response.data != null) {
22
37
  const updateActions = [];
38
+ const accruedJeSchedules = response.data.accrued_je_schedules?.je_schedules ?? [];
39
+ const oneTimeAccruals = response.data.one_time_accruals ?? [];
23
40
  updateActions.push(updateJESchedules([
24
41
  ...response.data.je_schedules,
25
42
  ...response.data.failed_je_postings.je_schedules,
26
43
  ]), updateJESchedulesDetails([...response.data.failed_je_postings.je_schedules], response.data.failed_je_postings.scheduled_journal_entries), initializeJeScheduleLocalData([
27
44
  ...response.data.failed_je_postings.je_schedules,
28
45
  ]));
46
+ if (accruedJeSchedules.length > 0) {
47
+ updateActions.push(updateAccruedJESchedules(accruedJeSchedules), updateAccruedJESchedulesDetails(accruedJeSchedules, response.data.accrued_je_schedules
48
+ ?.scheduled_journal_entries));
49
+ }
50
+ if (oneTimeAccruals.length > 0) {
51
+ // Single action, unlike the accrued pair above: this one writes the entity
52
+ // directly because an accrual denormalizes its vendor, accounts and classes, so
53
+ // there is no fan-out fetch to trigger.
54
+ updateActions.push(updateJEOneTimeAccruals(oneTimeAccruals));
55
+ }
29
56
  updateActions.push(fetchJeSchedulesSuccess({
30
57
  jeSchedules: [...response.data.je_schedules],
31
58
  failedJeSchedules: [
32
59
  ...response.data.failed_je_postings.je_schedules,
33
60
  ],
61
+ accruedJeSchedules: accruedJeSchedules,
62
+ oneTimeAccruals: oneTimeAccruals,
34
63
  selectedPeriod: selectedPeriod,
64
+ selectedPageTab: selectedPageTab,
35
65
  refreshViewInBackground: refreshViewInBackground,
36
66
  }));
37
67
  return from(updateActions);
@@ -40,11 +70,17 @@ export const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe
40
70
  return of(fetchJeSchedulesFailure({
41
71
  status: response.status,
42
72
  selectedPeriod,
73
+ selectedPageTab,
43
74
  }));
44
75
  }
45
76
  }), catchError((error) => of(fetchJeSchedulesFailure({
46
77
  status: createZeniAPIStatus('Unexpected Error', 'fetch JE schedules REST API call errored out' +
47
78
  JSON.stringify(error)),
48
79
  selectedPeriod,
49
- }))));
80
+ selectedPageTab,
81
+ }))),
82
+ // A tenant switch clears the store while this request is still in flight. Without this
83
+ // the old tenant's rows are written back into the freshly cleared store and stay on
84
+ // screen under the new tenant until a manual refresh.
85
+ takeUntil(actions$.pipe(filter(clearAll.match))));
50
86
  }));