@zeniai/client-epic-state 5.2.10 → 5.2.11-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 (145) hide show
  1. package/lib/commonStateTypes/selectorTypes/pickAndMergeForecastSection.d.ts +0 -0
  2. package/lib/commonStateTypes/selectorTypes/pickAndMergeForecastSection.js +1 -0
  3. package/lib/entity/invoicing/coupon/couponConstants.d.ts +11 -0
  4. package/lib/entity/invoicing/coupon/couponConstants.js +29 -0
  5. package/lib/entity/jeSchedules/jeScheduleHelper.d.ts +1 -0
  6. package/lib/entity/jeSchedules/jeScheduleHelper.js +7 -0
  7. package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +66 -1
  8. package/lib/entity/jeSchedules/jeSchedulesPayload.js +135 -0
  9. package/lib/entity/jeSchedules/jeSchedulesReducer.d.ts +4 -2
  10. package/lib/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  11. package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +11 -2
  12. package/lib/entity/jeSchedules/jeSchedulesSelector.js +38 -3
  13. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +79 -1
  14. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +24 -1
  15. package/lib/entity/jeSchedules/jeSchedulesTypes.js +88 -1
  16. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  17. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  18. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +2 -0
  19. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  20. package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +2 -0
  21. package/lib/epic.d.ts +9 -1
  22. package/lib/epic.js +16 -0
  23. package/lib/esm/commonStateTypes/selectorTypes/pickAndMergeForecastSection.js +1 -0
  24. package/lib/esm/entity/invoicing/coupon/couponConstants.js +26 -0
  25. package/lib/esm/entity/jeSchedules/jeScheduleHelper.js +6 -0
  26. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +135 -1
  27. package/lib/esm/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  28. package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +36 -2
  29. package/lib/esm/entity/jeSchedules/jeSchedulesTypes.js +78 -0
  30. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  31. package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  32. package/lib/esm/epic.js +16 -0
  33. package/lib/esm/index.js +14 -8
  34. package/lib/esm/view/companyMonthEndReportView/companyMonthEndReportViewReducer.js +6 -2
  35. package/lib/esm/view/companyMonthEndReportView/companyMonthEndReportViewState.js +4 -0
  36. package/lib/esm/view/companyMonthEndReportView/epics/saveCompanyMonthEndReportEpic.js +10 -6
  37. package/lib/esm/view/companyMonthEndReportView/epics/sendCompanyMonthEndReportEpic.js +9 -5
  38. package/lib/esm/view/companyMonthEndReportView/monthEndTemplateData.js +32 -0
  39. package/lib/esm/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  40. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +41 -5
  41. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +45 -0
  42. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  43. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +99 -0
  44. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +25 -0
  45. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +110 -0
  46. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +79 -0
  47. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +139 -0
  48. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +106 -0
  49. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +22 -0
  50. package/lib/esm/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +140 -0
  51. package/lib/esm/view/expenseAutomationView/payload/jeSchedulesPayload.js +55 -0
  52. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +306 -29
  53. package/lib/esm/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +1 -0
  54. package/lib/esm/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +106 -0
  55. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +294 -22
  56. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +5 -6
  57. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.js +25 -0
  58. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.js +15 -0
  59. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  60. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  61. package/lib/esm/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  62. package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.js +18 -0
  63. package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.js +18 -0
  64. package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryVideoViewedEpic.js +18 -0
  65. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardEpic.js +16 -0
  66. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardPayload.js +1 -0
  67. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardReducer.js +60 -0
  68. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardSelector.js +12 -0
  69. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardState.js +1 -0
  70. package/lib/index.d.ts +19 -13
  71. package/lib/index.js +91 -47
  72. package/lib/view/companyMonthEndReportView/companyMonthEndReportViewPayload.d.ts +8 -0
  73. package/lib/view/companyMonthEndReportView/companyMonthEndReportViewReducer.d.ts +6 -2
  74. package/lib/view/companyMonthEndReportView/companyMonthEndReportViewReducer.js +6 -2
  75. package/lib/view/companyMonthEndReportView/companyMonthEndReportViewState.d.ts +2 -0
  76. package/lib/view/companyMonthEndReportView/companyMonthEndReportViewState.js +4 -0
  77. package/lib/view/companyMonthEndReportView/epics/saveCompanyMonthEndReportEpic.js +10 -6
  78. package/lib/view/companyMonthEndReportView/epics/sendCompanyMonthEndReportEpic.js +9 -5
  79. package/lib/view/companyMonthEndReportView/monthEndTemplateData.d.ts +16 -0
  80. package/lib/view/companyMonthEndReportView/monthEndTemplateData.js +36 -0
  81. package/lib/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  82. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.d.ts +3 -2
  83. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +39 -3
  84. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.d.ts +20 -0
  85. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +49 -0
  86. package/lib/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  87. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.d.ts +8 -0
  88. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +103 -0
  89. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.d.ts +8 -0
  90. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +29 -0
  91. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.d.ts +45 -0
  92. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +114 -0
  93. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.d.ts +8 -0
  94. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +83 -0
  95. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.d.ts +12 -0
  96. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +146 -0
  97. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.d.ts +64 -0
  98. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +110 -0
  99. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.d.ts +6 -0
  100. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +26 -0
  101. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.d.ts +36 -0
  102. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +145 -0
  103. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  104. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +72 -3
  105. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.js +58 -1
  106. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +91 -12
  107. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +308 -29
  108. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +1 -1
  109. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +2 -2
  110. package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.d.ts +42 -0
  111. package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +2 -0
  112. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +36 -7
  113. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.d.ts +21 -0
  114. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +112 -0
  115. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.d.ts +34 -0
  116. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +302 -21
  117. package/lib/view/expenseAutomationView/types/completedSubTab.d.ts +1 -1
  118. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +82 -8
  119. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +8 -8
  120. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
  121. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.d.ts +6 -0
  122. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.js +29 -0
  123. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.d.ts +6 -0
  124. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.js +19 -0
  125. package/lib/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  126. package/lib/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  127. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.d.ts +4 -2
  128. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  129. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.d.ts +8 -0
  130. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.js +22 -0
  131. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.d.ts +8 -0
  132. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.js +22 -0
  133. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryVideoViewedEpic.d.ts +8 -0
  134. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryVideoViewedEpic.js +22 -0
  135. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardEpic.d.ts +13 -0
  136. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardEpic.js +20 -0
  137. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardPayload.d.ts +11 -0
  138. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardPayload.js +2 -0
  139. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardReducer.d.ts +7 -0
  140. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardReducer.js +64 -0
  141. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardSelector.d.ts +12 -0
  142. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardSelector.js +15 -0
  143. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardState.d.ts +9 -0
  144. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardState.js +2 -0
  145. package/package.json +1 -1
@@ -1,9 +1,11 @@
1
1
  import { toAmount } from '../../commonStateTypes/amount';
2
2
  import { LAST_SCHEDULE_DAY_OF_MONTH, MAX_SCHEDULE_DAY_OF_MONTH, MIN_SCHEDULE_DAY_OF_MONTH, toScheduleDaysOfMonth, } from '../../commonStateTypes/timePeriod';
3
3
  import { date } from '../../zeniDayJS';
4
+ import { toZeniUrl } from '../../zeniUrl';
4
5
  import { toTransactionID, } from '../transaction/payloadTypes/transactionIDPayload';
5
6
  import { generateJEScheduleKey } from './jeScheduleHelper';
6
- import { getJEScheduleTransactionKey, toJournalEntryErrorCodeType, toScheduleJournalEntryStatusCodeType, toScheduleStatusCodeType, toScheduleTypesTypeStrict, } from './jeSchedulesTypes';
7
+ import { getJEScheduleTransactionKey, toJournalEntryErrorCodeType, toOneTimeAccrualAutomationTierType, toOneTimeAccrualOriginType, toOneTimeAccrualReversalPolicyType, toOneTimeAccrualReversalTriggerType, toOneTimeAccrualStatusCodeType, toScheduleJournalEntryStatusCodeType, toScheduleStatusCodeType, toScheduleTypesTypeStrict, } from './jeSchedulesTypes';
8
+ const USD_CURRENCY_CODE = 'USD';
7
9
  export function toScheduledJournalEntryState(payload, currency_code, currency_symbol) {
8
10
  return {
9
11
  status: {
@@ -248,9 +250,18 @@ export function toJEScheduledTransaction(payload) {
248
250
  startDate: payload.start_date != null ? date(payload.start_date) : undefined,
249
251
  endDate: payload.end_date != null ? date(payload.end_date) : undefined,
250
252
  period: payload.period != null ? Number(payload.period) : undefined,
253
+ recurringAmount: payload.recurring_amount != null
254
+ ? {
255
+ amount: payload.recurring_amount,
256
+ currencyCode: payload.currency_code,
257
+ currencySymbol: payload.currency_symbol,
258
+ }
259
+ : undefined,
260
+ postedCount: payload.posted_count ?? undefined,
251
261
  updatedByUserID: payload.updated_by.user_id,
252
262
  balanceAsOfToday: payload.balance ?? undefined,
253
263
  updatedAt: payload.updated_at != null ? date(payload.updated_at) : undefined,
264
+ createTime: payload.create_time != null ? date(payload.create_time) : undefined,
254
265
  jeCredit: {
255
266
  accountId: payload.je_credit_account_id ?? undefined,
256
267
  accountingClassId: payload.je_credit_accounting_class_id ?? undefined,
@@ -275,6 +286,7 @@ export function toJEScheduledTransaction(payload) {
275
286
  : {},
276
287
  scheduledJournalEntry: [],
277
288
  aiSummaries: toJEScheduleAISummaries(payload.ai_summaries),
289
+ confidenceScore: payload.confidence_score ?? undefined,
278
290
  createdByUserID: payload.created_by?.user_id ?? undefined,
279
291
  recommendations: toJEScheduleRecommendations(payload.recommendations),
280
292
  };
@@ -332,3 +344,125 @@ export function toJEAccruedScheduledTransaction(payload) {
332
344
  jeScheduleType: toScheduleTypesTypeStrict(payload.je_schedule_type),
333
345
  };
334
346
  }
347
+ /**
348
+ * Reads the months in the order the snapshot gives them rather than deriving a range: a vendor that
349
+ * skipped a month has no entry for it, so filling gaps would invent history that was never billed.
350
+ */
351
+ function toJEOneTimeAccrualMonthlyTotals(snapshot, currencyCode) {
352
+ const monthlyTotals = snapshot.monthly_totals;
353
+ if (monthlyTotals == null) {
354
+ return [];
355
+ }
356
+ const months = snapshot.sorted_months ?? Object.keys(monthlyTotals).sort();
357
+ return months
358
+ .filter((month) => monthlyTotals[month] != null)
359
+ .map((month) => ({
360
+ month,
361
+ amount: toOneTimeAccrualAmount(monthlyTotals[month], currencyCode),
362
+ }));
363
+ }
364
+ function toJEOneTimeAccrualProfileSnapshot(payload, currencyCode) {
365
+ if (payload == null) {
366
+ return undefined;
367
+ }
368
+ const billingPattern = payload.billing_pattern;
369
+ return {
370
+ monthlyTotals: toJEOneTimeAccrualMonthlyTotals(payload, currencyCode),
371
+ billingPattern: billingPattern != null
372
+ ? {
373
+ frequency: billingPattern.frequency ?? undefined,
374
+ monthsOfHistory: billingPattern.months_of_history ?? undefined,
375
+ consistencyScore: billingPattern.consistency_score ?? undefined,
376
+ billingLagDays: billingPattern.billing_lag_days ?? undefined,
377
+ typicalBillDay: billingPattern.typical_bill_day ?? undefined,
378
+ avgAmount: billingPattern.avg_amount != null
379
+ ? toOneTimeAccrualAmount(billingPattern.avg_amount, currencyCode)
380
+ : undefined,
381
+ lastBillAmount: billingPattern.last_bill_amount != null
382
+ ? toOneTimeAccrualAmount(billingPattern.last_bill_amount, currencyCode)
383
+ : undefined,
384
+ lastBillDate: billingPattern.last_bill_date != null
385
+ ? date(billingPattern.last_bill_date)
386
+ : undefined,
387
+ }
388
+ : undefined,
389
+ };
390
+ }
391
+ function toJEOneTimeAccrualAiSuggestion(payload, currencyCode) {
392
+ if (payload == null) {
393
+ return undefined;
394
+ }
395
+ return {
396
+ memo: payload.memo ?? undefined,
397
+ jeDebitAccountName: payload.je_debit_account_name ?? undefined,
398
+ jeCreditAccountName: payload.je_credit_account_name ?? undefined,
399
+ estimatedAmount: payload.estimated_amount != null
400
+ ? toOneTimeAccrualAmount(payload.estimated_amount, currencyCode)
401
+ : undefined,
402
+ };
403
+ }
404
+ export function toJEOneTimeAccrual(payload) {
405
+ return {
406
+ accrualId: payload._id,
407
+ vendorId: payload.vendor_id,
408
+ vendorName: payload.vendor_name,
409
+ serviceMonth: payload.service_month,
410
+ accrualStatus: toOneTimeAccrualStatusCodeType(payload.status),
411
+ origin: toOneTimeAccrualOriginType(payload.origin),
412
+ automationTier: payload.automation_tier != null
413
+ ? toOneTimeAccrualAutomationTierType(payload.automation_tier)
414
+ : undefined,
415
+ estimatedAmount: toOneTimeAccrualAmount(payload.estimated_amount, payload.currency),
416
+ memo: payload.memo ?? '',
417
+ profileSnapshot: toJEOneTimeAccrualProfileSnapshot(payload.profile_snapshot, payload.currency),
418
+ aiSuggestion: toJEOneTimeAccrualAiSuggestion(payload.ai_suggestion, payload.currency),
419
+ // Exclusive by contract: a scheduled row reverses on expectedReversalDate and bills never
420
+ // drive it, so the two never need reconciling. Defaulting to on_bill_match matches the
421
+ // create path's default when the field is absent on an older document.
422
+ reversalPolicy: toOneTimeAccrualReversalPolicyType(payload.reversal_policy ?? 'on_bill_match'),
423
+ reversalTrigger: toOneTimeAccrualReversalTriggerType(payload.reversal_trigger ?? undefined),
424
+ expectedReversalDate: payload.expected_reversal_date != null
425
+ ? date(payload.expected_reversal_date)
426
+ : undefined,
427
+ postingDate: payload.posting_date != null ? date(payload.posting_date) : undefined,
428
+ actualPostDate: payload.actual_post_date != null
429
+ ? date(payload.actual_post_date)
430
+ : undefined,
431
+ actualReversalPostDate: payload.actual_reversal_post_date != null
432
+ ? date(payload.actual_reversal_post_date)
433
+ : undefined,
434
+ jeDebitAccountId: payload.je_debit_account_id ?? undefined,
435
+ jeDebitAccountName: payload.je_debit_account_name ?? undefined,
436
+ jeDebitAccountingClassId: payload.je_debit_accounting_class_id ?? undefined,
437
+ jeDebitAccountingClassName: payload.je_debit_accounting_class_name ?? undefined,
438
+ jeCreditAccountId: payload.je_credit_account_id ?? undefined,
439
+ jeCreditAccountName: payload.je_credit_account_name ?? undefined,
440
+ jeCreditAccountingClassId: payload.je_credit_accounting_class_id ?? undefined,
441
+ jeCreditAccountingClassName: payload.je_credit_accounting_class_name ?? undefined,
442
+ transactionId: payload.transaction_id ?? undefined,
443
+ transactionIntegrationId: payload.transaction_integration_id ?? undefined,
444
+ reversalTransactionId: payload.reversal_transaction_id ?? undefined,
445
+ createdBy: toJEOneTimeAccrualCreator(payload.created_by_user),
446
+ };
447
+ }
448
+ // The accrual wire format carries a currency CODE but no symbol, so the symbol has to be derived.
449
+ // Only USD has a known glyph today (the create path is USD-only); anything else falls back to the
450
+ // code, which reads correctly as "EUR 1,200" rather than silently rendering a wrong "$".
451
+ function toOneTimeAccrualAmount(amount, currencyCode) {
452
+ const code = currencyCode ?? USD_CURRENCY_CODE;
453
+ return toAmount(amount, code, code === USD_CURRENCY_CODE ? '$' : code);
454
+ }
455
+ function toJEOneTimeAccrualCreator(payload) {
456
+ if (payload == null) {
457
+ return undefined;
458
+ }
459
+ return {
460
+ userId: payload.user_id,
461
+ email: payload.email ?? undefined,
462
+ firstName: payload.first_name ?? undefined,
463
+ lastName: payload.last_name ?? undefined,
464
+ photo: payload.photo?.original != null
465
+ ? toZeniUrl(payload.photo.original)
466
+ : undefined,
467
+ };
468
+ }
@@ -1,10 +1,12 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
2
  import assignWith from 'lodash/assignWith';
3
3
  import { clearAll } from '../../rootActions';
4
- import { getJEScheduleKey, getJEScheduleTransactionDetailKeyPayload, toJEAccruedScheduledTransaction, toJEScheduledTransaction, toScheduledJournalEntryState, } from './jeSchedulesPayload';
4
+ import { generateJEOneTimeAccrualKey } from './jeScheduleHelper';
5
+ import { getJEScheduleKey, getJEScheduleTransactionDetailKeyPayload, toJEAccruedScheduledTransaction, toJEOneTimeAccrual, toJEScheduledTransaction, toScheduledJournalEntryState, } from './jeSchedulesPayload';
5
6
  export const initialState = {
6
7
  schedulesByTransactionKey: {},
7
8
  schedulesByAccruedJEScheduleKey: {},
9
+ oneTimeAccrualsByKey: {},
8
10
  };
9
11
  const jeSchedules = createSlice({
10
12
  name: 'jeSchedules',
@@ -109,15 +111,41 @@ const jeSchedules = createSlice({
109
111
  delete draft.schedulesByAccruedJEScheduleKey[JEScheduleKey];
110
112
  },
111
113
  },
114
+ // Writes directly, unlike updateAccruedJESchedules / updateJESchedules, which are no-op
115
+ // actions whose only job is to trigger the entity fan-out epic that fetches vendors,
116
+ // accounts, classes and users. An accrual denormalizes all of those as names on the document,
117
+ // so there is nothing to fan out to.
118
+ updateJEOneTimeAccruals: {
119
+ prepare(jeOneTimeAccrualsPayload) {
120
+ return {
121
+ payload: {
122
+ jeOneTimeAccrualsPayload,
123
+ },
124
+ };
125
+ },
126
+ reducer(draft, action) {
127
+ action.payload.jeOneTimeAccrualsPayload.forEach((accrualPayload) => {
128
+ const accrual = toJEOneTimeAccrual(accrualPayload);
129
+ draft.oneTimeAccrualsByKey[generateJEOneTimeAccrualKey(accrual.accrualId)] = accrual;
130
+ });
131
+ },
132
+ },
133
+ clearAllJEScheduleTransactions(draft) {
134
+ draft.schedulesByTransactionKey = {};
135
+ },
136
+ clearAllAccruedJESchedules(draft) {
137
+ draft.schedulesByAccruedJEScheduleKey = {};
138
+ },
112
139
  },
113
140
  extraReducers: (builder) => {
114
141
  builder.addCase(clearAll, (draft) => {
115
142
  draft.schedulesByAccruedJEScheduleKey = {};
116
143
  draft.schedulesByTransactionKey = {};
144
+ draft.oneTimeAccrualsByKey = {};
117
145
  });
118
146
  },
119
147
  });
120
- export const { updateJESchedules, updateAccruedJESchedules, updateJEScheduledTransaction, updateAccruedJEScheduledTransaction, updateJESchedulesDetails, updateAccruedJESchedulesDetails, deleteJESchedulesDetails, deleteAccruedJESchedulesDetails, } = jeSchedules.actions;
148
+ export const { updateJESchedules, updateAccruedJESchedules, updateJEScheduledTransaction, updateAccruedJEScheduledTransaction, updateJESchedulesDetails, updateAccruedJESchedulesDetails, deleteJESchedulesDetails, deleteAccruedJESchedulesDetails, clearAllAccruedJESchedules, clearAllJEScheduleTransactions, updateJEOneTimeAccruals, } = jeSchedules.actions;
121
149
  export default jeSchedules.reducer;
122
150
  /**
123
151
  * Helper functions
@@ -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,84 @@ 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
+ const ONE_TIME_ACCRUAL_STATUS_CODE = [
31
+ 'draft',
32
+ 'posting',
33
+ 'posted',
34
+ 'posting_blocked',
35
+ 'reversing',
36
+ 'reversed',
37
+ ];
38
+ export const toOneTimeAccrualStatusCodeType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_STATUS_CODE);
39
+ // Who created the accrual. This — not the creator's email — is the authoritative
40
+ // AI-vs-manual signal for the Method column.
41
+ const ONE_TIME_ACCRUAL_ORIGIN = ['agent', 'human'];
42
+ export const toOneTimeAccrualOriginType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_ORIGIN);
43
+ const ONE_TIME_ACCRUAL_AUTOMATION_TIER = ['manual', 'draft', 'auto'];
44
+ export const toOneTimeAccrualAutomationTierType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_AUTOMATION_TIER);
45
+ // How the accrual is allowed to reverse. The two are exclusive: a scheduled row reverses on
46
+ // expectedReversalDate and bills never drive it; an on_bill_match row reverses only when a bill
47
+ // is matched, which is why its lifecycle reads "Reverses on match" rather than showing a date.
48
+ const ONE_TIME_ACCRUAL_REVERSAL_POLICY = [
49
+ 'on_bill_match',
50
+ 'scheduled_date',
51
+ ];
52
+ export const toOneTimeAccrualReversalPolicyType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_REVERSAL_POLICY);
53
+ // What actually caused a reverse. Distinct from a *revert*, which soft-deletes the row and
54
+ // never sets this.
55
+ const ONE_TIME_ACCRUAL_REVERSAL_TRIGGER = [
56
+ 'bill_match',
57
+ 'scheduled_date',
58
+ 'manual_reverse',
59
+ ];
60
+ export const toOneTimeAccrualReversalTriggerType = (v) => stringToUnionStrict(v ?? '', ONE_TIME_ACCRUAL_REVERSAL_TRIGGER);
61
+ // Why a human told the AI Accountant not to accrue this month. The gateway validates against
62
+ // exactly this set, so it is a union rather than a free-text string.
63
+ const ONE_TIME_ACCRUAL_IGNORE_REASON = [
64
+ 'no_activity',
65
+ 'paused',
66
+ 'too_small',
67
+ 'need_invoice',
68
+ 'other_ignore',
69
+ ];
70
+ export const toOneTimeAccrualIgnoreReasonType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_IGNORE_REASON);
71
+ export const ALL_ONE_TIME_ACCRUAL_IGNORE_REASONS = ONE_TIME_ACCRUAL_IGNORE_REASON;
72
+ // Why a recommended prepaid / fixed-asset schedule is being dismissed. A different set from the
73
+ // accrual ignore reasons: the gateway validates each against its own list.
74
+ const JE_SCHEDULE_IGNORE_REASON = [
75
+ 'not_needed',
76
+ 'wrong_account',
77
+ 'duplicate',
78
+ 'already_handled',
79
+ 'other_ignore',
80
+ ];
81
+ export const toJEScheduleIgnoreReasonType = (v) => stringToUnion(v, JE_SCHEDULE_IGNORE_REASON);
82
+ export const ALL_JE_SCHEDULE_IGNORE_REASONS = JE_SCHEDULE_IGNORE_REASON;
83
+ // Why a posted prepaid / fixed-asset schedule is being undone. Note `not_accrual` is accrual-only
84
+ // and rejected here, and `created_by_mistake` is schedule-only.
85
+ const JE_SCHEDULE_REVERT_REASON = [
86
+ 'amount_off',
87
+ 'wrong_period',
88
+ 'duplicate',
89
+ 'created_by_mistake',
90
+ 'other_revert',
91
+ ];
92
+ export const toJEScheduleRevertReasonType = (v) => stringToUnion(v, JE_SCHEDULE_REVERT_REASON);
93
+ export const ALL_JE_SCHEDULE_REVERT_REASONS = JE_SCHEDULE_REVERT_REASON;
94
+ // Why a posted accrual is being undone. A disjoint set from the ignore reasons — the gateway
95
+ // validates each action against its own list and rejects the other's values.
96
+ const ONE_TIME_ACCRUAL_REVERT_REASON = [
97
+ 'amount_off',
98
+ 'wrong_period',
99
+ 'not_accrual',
100
+ 'duplicate',
101
+ 'other_revert',
102
+ ];
103
+ export const toOneTimeAccrualRevertReasonType = (v) => stringToUnion(v, ONE_TIME_ACCRUAL_REVERT_REASON);
104
+ export const ALL_ONE_TIME_ACCRUAL_REVERT_REASONS = ONE_TIME_ACCRUAL_REVERT_REASON;
27
105
  const JOURNAL_ENTRY_ERROR_CODE = [
28
106
  'vendor_deleted',
29
107
  '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';
@@ -779,6 +787,7 @@ const ALL_EPICS = [
779
787
  createNewSchedulesAccruedEpic,
780
788
  createNewSchedulesEpic,
781
789
  createNewTaskGroupEpic,
790
+ createOneTimeAccrualEpic,
782
791
  createPaymentInstrumentEpic,
783
792
  createSessionAndSubmitEpic,
784
793
  createSessionEpic,
@@ -1058,6 +1067,7 @@ const ALL_EPICS = [
1058
1067
  fetchOnboardingCustomerSetupViewEpic,
1059
1068
  fetchOnboardingCustomerViewEpic,
1060
1069
  fetchOnboardingViewEpic,
1070
+ fetchOneTimeAccrualEpic,
1061
1071
  fetchOpExByVendorEpic,
1062
1072
  fetchOpExByVendorReportForTimeframeEpic,
1063
1073
  fetchOpExByVendorReportSummaryEpic,
@@ -1212,6 +1222,7 @@ const ALL_EPICS = [
1212
1222
  initializeInvoicingCustomerAddressEpic,
1213
1223
  initializeInvoicingSubscriptionAddressEpic,
1214
1224
  initializeMyProfileLocalDataEpic,
1225
+ initializeNewScheduleEpic,
1215
1226
  initializeOnboardingCustomerViewUpdateDataEpic,
1216
1227
  initializeRemiSetupApproverViewUpdateDataEpic,
1217
1228
  initializeRemiToLocalStoreEpic,
@@ -1234,6 +1245,7 @@ const ALL_EPICS = [
1234
1245
  markAsCompleteScheduleDetailEpic,
1235
1246
  markTransactionAsNotMiscategorizedEpic,
1236
1247
  notifyMeForFeatureEpic,
1248
+ oneTimeAccrualActionsEpic,
1237
1249
  parallelFetchAccountTransactionListEpic,
1238
1250
  parallelFetchClassTransactionListEpic,
1239
1251
  parallelFetchEntityTransactionListEpic,
@@ -1277,6 +1289,7 @@ const ALL_EPICS = [
1277
1289
  retryExpenseAutomationJEScheduleEpic,
1278
1290
  retryInvoicingQboSyncTaskEpic,
1279
1291
  retryOrRefundBillEpic,
1292
+ revertJeScheduleEpic,
1280
1293
  reviewDraftRemisBulkActionEpic,
1281
1294
  reviewExpenseAutomationFluxAnalysisViewEpic,
1282
1295
  revokeCardInviteEpic,
@@ -1312,6 +1325,7 @@ const ALL_EPICS = [
1312
1325
  saveInvoicingSubscriptionEpic,
1313
1326
  saveMagicLinkBankAccountEpic,
1314
1327
  saveNewAddressEpic,
1328
+ saveNewScheduleEpic,
1315
1329
  saveNotificationPreferencesEpic,
1316
1330
  saveNotificationSettingsEpic,
1317
1331
  saveOAuthConnectionEpic,
@@ -1336,6 +1350,7 @@ const ALL_EPICS = [
1336
1350
  saveVendorsTabVendorEpic,
1337
1351
  scheduleTenantCreditScoreCronEpic,
1338
1352
  searchTransactionsForManualMatchEpic,
1353
+ searchTransactionsForNewScheduleEpic,
1339
1354
  seedAiCardCreationFormDraftEpic,
1340
1355
  seedAiCardPolicyFormDraftEpic,
1341
1356
  sendCompanyMonthEndReportEpic,
@@ -1358,6 +1373,7 @@ const ALL_EPICS = [
1358
1373
  submitIntlVerificationEpic,
1359
1374
  submitInvoicingBrandingFormEpic,
1360
1375
  submitQuestionEpic,
1376
+ switchExpenseAutomationJESchedulesTabEpic,
1361
1377
  syncInvoicingSubscriptionCouponsEpic,
1362
1378
  syncTabsAfterAutomatchEpic,
1363
1379
  toggleReportUIOptionForecastModeEpic,