@zeniai/client-epic-state 5.2.14 → 5.2.16

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 (132) hide show
  1. package/lib/entity/accountRecon/accountReconReducer.d.ts +2 -1
  2. package/lib/entity/accountRecon/accountReconReducer.js +22 -10
  3. package/lib/entity/accountRecon/accountReconSelector.d.ts +1 -0
  4. package/lib/entity/accountRecon/accountReconSelector.js +1 -0
  5. package/lib/entity/approvalRule/approvalRuleConflict.d.ts +13 -0
  6. package/lib/entity/approvalRule/approvalRuleConflict.js +16 -1
  7. package/lib/entity/jeSchedules/jeScheduleHelper.d.ts +1 -0
  8. package/lib/entity/jeSchedules/jeScheduleHelper.js +7 -0
  9. package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +78 -1
  10. package/lib/entity/jeSchedules/jeSchedulesPayload.js +183 -4
  11. package/lib/entity/jeSchedules/jeSchedulesReducer.d.ts +4 -2
  12. package/lib/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  13. package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +11 -2
  14. package/lib/entity/jeSchedules/jeSchedulesSelector.js +38 -3
  15. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +123 -1
  16. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +24 -1
  17. package/lib/entity/jeSchedules/jeSchedulesTypes.js +96 -1
  18. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  19. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  20. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +2 -0
  21. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  22. package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +2 -0
  23. package/lib/epic.d.ts +10 -1
  24. package/lib/epic.js +18 -0
  25. package/lib/esm/entity/accountRecon/accountReconReducer.js +22 -10
  26. package/lib/esm/entity/accountRecon/accountReconSelector.js +1 -0
  27. package/lib/esm/entity/approvalRule/approvalRuleConflict.js +16 -1
  28. package/lib/esm/entity/jeSchedules/jeScheduleHelper.js +6 -0
  29. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +183 -5
  30. package/lib/esm/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  31. package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +36 -2
  32. package/lib/esm/entity/jeSchedules/jeSchedulesTypes.js +86 -0
  33. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  34. package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  35. package/lib/esm/epic.js +18 -0
  36. package/lib/esm/index.js +16 -10
  37. package/lib/esm/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +2 -2
  38. package/lib/esm/view/expenseAutomationView/epics/accountRecon/deleteCombinedStatementEpic.js +54 -0
  39. package/lib/esm/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +1 -1
  40. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +3 -6
  41. package/lib/esm/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  42. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +9 -1
  43. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +41 -5
  44. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +45 -0
  45. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  46. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +104 -0
  47. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +25 -0
  48. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +138 -0
  49. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +79 -0
  50. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +180 -0
  51. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +111 -0
  52. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +28 -0
  53. package/lib/esm/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +140 -0
  54. package/lib/esm/view/expenseAutomationView/helpers/reconciliationHelpers.js +12 -0
  55. package/lib/esm/view/expenseAutomationView/payload/jeSchedulesPayload.js +55 -0
  56. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +319 -29
  57. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +20 -2
  58. package/lib/esm/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +1 -0
  59. package/lib/esm/view/expenseAutomationView/selectors/jeAccountSettingsViewSelector.js +1 -0
  60. package/lib/esm/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +106 -0
  61. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +327 -22
  62. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +5 -6
  63. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  64. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  65. package/lib/esm/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  66. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +20 -1
  67. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +20 -1
  68. package/lib/index.d.ts +18 -13
  69. package/lib/index.js +92 -47
  70. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.d.ts +10 -2
  71. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +1 -1
  72. package/lib/view/expenseAutomationView/epics/accountRecon/deleteCombinedStatementEpic.d.ts +9 -0
  73. package/lib/view/expenseAutomationView/epics/accountRecon/deleteCombinedStatementEpic.js +58 -0
  74. package/lib/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +1 -1
  75. package/lib/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +3 -6
  76. package/lib/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  77. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +9 -1
  78. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.d.ts +3 -2
  79. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +39 -3
  80. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.d.ts +21 -0
  81. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +49 -0
  82. package/lib/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  83. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.d.ts +9 -0
  84. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +108 -0
  85. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.d.ts +8 -0
  86. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +29 -0
  87. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.d.ts +9 -0
  88. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +142 -0
  89. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.d.ts +8 -0
  90. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +83 -0
  91. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.d.ts +13 -0
  92. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +187 -0
  93. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.d.ts +65 -0
  94. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +115 -0
  95. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.d.ts +6 -0
  96. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +32 -0
  97. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.d.ts +36 -0
  98. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +145 -0
  99. package/lib/view/expenseAutomationView/helpers/reconciliationHelpers.d.ts +6 -0
  100. package/lib/view/expenseAutomationView/helpers/reconciliationHelpers.js +13 -0
  101. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  102. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +86 -3
  103. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.js +58 -1
  104. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +4 -0
  105. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +93 -12
  106. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +321 -29
  107. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +1 -1
  108. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +6 -1
  109. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +22 -4
  110. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +2 -2
  111. package/lib/view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes.d.ts +1 -0
  112. package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.d.ts +42 -0
  113. package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +2 -0
  114. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +41 -7
  115. package/lib/view/expenseAutomationView/selectors/jeAccountSettingsViewSelector.js +1 -0
  116. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.d.ts +21 -0
  117. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +112 -0
  118. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.d.ts +34 -0
  119. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +335 -21
  120. package/lib/view/expenseAutomationView/types/completedSubTab.d.ts +1 -1
  121. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +83 -8
  122. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +8 -8
  123. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
  124. package/lib/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  125. package/lib/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  126. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.d.ts +4 -2
  127. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  128. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +20 -1
  129. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelectorTypes.d.ts +3 -0
  130. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +20 -1
  131. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelectorTypes.d.ts +3 -0
  132. package/package.json +1 -1
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.switchJESchedulesTabEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const timePeriod_1 = require("../../../../commonStateTypes/timePeriod");
7
+ const tenantSelector_1 = require("../../../../entity/tenant/tenantSelector");
8
+ const jeSchedulesViewReducer_1 = require("../../reducers/jeSchedulesViewReducer");
9
+ const switchJESchedulesTabEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(jeSchedulesViewReducer_1.updateJESchedulesUIState.match), (0, operators_1.filter)((action) => action.payload.selectedPageTab != null), (0, operators_1.mergeMap)(() => {
10
+ const state = state$.value;
11
+ const { fetchState, refreshStatus } = state.expenseAutomationJESchedulesViewState;
12
+ if (fetchState === 'In-Progress' ||
13
+ refreshStatus.fetchState === 'In-Progress') {
14
+ return rxjs_1.EMPTY;
15
+ }
16
+ const currentTenant = (0, tenantSelector_1.getCurrentTenant)(state);
17
+ const selectedPeriod = state.expenseAutomationViewState.selectedPeriodByTenantId[currentTenant.tenantId];
18
+ // convertToPeriod destructures, so an unset period throws and takes this epic's subscription
19
+ // down for the rest of the session -- every later tab switch would then stop refreshing. A
20
+ // skipped refresh is the cheaper failure, as in refreshCurrentPage.
21
+ if (selectedPeriod == null) {
22
+ return rxjs_1.EMPTY;
23
+ }
24
+ const period = (0, timePeriod_1.convertToPeriod)(selectedPeriod);
25
+ const timePeriodStart = (0, timePeriod_1.toAbsoluteDay)(period.start);
26
+ const timePeriodEnd = (0, timePeriod_1.toAbsoluteDay)(period.end);
27
+ if (timePeriodStart == null || timePeriodEnd == null) {
28
+ return rxjs_1.EMPTY;
29
+ }
30
+ return (0, rxjs_1.of)((0, jeSchedulesViewReducer_1.fetchJeSchedulesPage)({ start: timePeriodStart, end: timePeriodEnd }, true));
31
+ }));
32
+ exports.switchJESchedulesTabEpic = switchJESchedulesTabEpic;
@@ -0,0 +1,36 @@
1
+ import { Amount } from '../../../commonStateTypes/amount';
2
+ import { ScheduleTypes } from '../../../entity/jeSchedules/jeSchedulesTypes';
3
+ import { ScheduleTransaction } from '../../../entity/transaction/stateTypes/scheduleTransaction';
4
+ import { JESchedulePayload, SaveJESchedulePayload } from '../../scheduleView/scheduleDetailView/scheduleDetailPayload';
5
+ import { NewJeDetailLocalData, NewScheduleLocalData, NewScheduleLocalDataFixedAssets } from '../types/jeSchedulesViewState';
6
+ /**
7
+ * Computes the month-by-month JE schedule breakdown for a brand-new schedule
8
+ * (no linked transaction yet) — replicates createNewSchedulesHelper's math
9
+ * (scheduleDetailLocalDataHelper.ts) exactly: lump-sum total split evenly
10
+ * across months with the rounding remainder absorbed by the last month, and a
11
+ * running balance that decrements each month and is forced to exactly 0 on
12
+ * the last row.
13
+ */
14
+ export declare const computeNewScheduleJeDetails: (localData: NewScheduleLocalData | NewScheduleLocalDataFixedAssets, totalAmount: Amount, vendorName: string) => NewJeDetailLocalData[];
15
+ export interface NewSchedulePayload {
16
+ je_schedules: JESchedulePayload[];
17
+ scheduled_journal_entries: SaveJESchedulePayload[];
18
+ }
19
+ export type PrepareNewSchedulePayloadFailureReason = 'missing_third_party_id' | 'missing_vendor';
20
+ export type PrepareNewSchedulePayloadResult = {
21
+ ok: true;
22
+ payload: NewSchedulePayload;
23
+ } | {
24
+ ok: false;
25
+ reason: PrepareNewSchedulePayloadFailureReason;
26
+ };
27
+ /**
28
+ * Builds a savable schedule payload directly from a Base Transaction search
29
+ * result and the New Schedule form's local data — bypassing the legacy
30
+ * getJEScheduledTransactionByJEScheduleTransactionKey selector entirely,
31
+ * since that selector throws unless the entity has already round-tripped
32
+ * through a real GET /1.0/schedules/:id. A brand-new schedule has no such
33
+ * history, so this reads only from data already in hand (the selected
34
+ * transaction/line plus what the user filled into the form).
35
+ */
36
+ export declare const prepareNewSchedulePayload: (transaction: ScheduleTransaction, localData: NewScheduleLocalData | NewScheduleLocalDataFixedAssets, scheduleType: ScheduleTypes) => PrepareNewSchedulePayloadResult;
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareNewSchedulePayload = exports.computeNewScheduleJeDetails = void 0;
4
+ const amount_1 = require("../../../commonStateTypes/amount");
5
+ const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
6
+ const formatZeniDateFY_1 = require("../../../commonStateTypes/fiscalYearHelpers/formatZeniDateFY");
7
+ const timePeriod_2 = require("../../../commonStateTypes/timePeriod");
8
+ const scheduleDetailLocalDataHelper_1 = require("../../scheduleView/scheduleDetailView/scheduleDetailLocalDataHelper");
9
+ const scheduleDetailPayload_1 = require("../../scheduleView/scheduleDetailView/scheduleDetailPayload");
10
+ const getNewScheduleMemo = (vendorName, schedulePostingDate, currentPeriod, totalPeriod, assetId) => {
11
+ const addAsset = assetId != null && assetId !== '' ? ` - ${assetId}` : '';
12
+ return `${vendorName} - ${schedulePostingDate.format(formatZeniDateFY_1.MONTH_YEAR_FORMAT)} (${currentPeriod} of ${totalPeriod})${addAsset}`;
13
+ };
14
+ /**
15
+ * Computes the month-by-month JE schedule breakdown for a brand-new schedule
16
+ * (no linked transaction yet) — replicates createNewSchedulesHelper's math
17
+ * (scheduleDetailLocalDataHelper.ts) exactly: lump-sum total split evenly
18
+ * across months with the rounding remainder absorbed by the last month, and a
19
+ * running balance that decrements each month and is forced to exactly 0 on
20
+ * the last row.
21
+ */
22
+ const computeNewScheduleJeDetails = (localData, totalAmount, vendorName) => {
23
+ const period = localData.selectedMonths;
24
+ const startingMonth = localData.selectedDate;
25
+ if (startingMonth == null || period == null) {
26
+ return [];
27
+ }
28
+ const assetId = 'assetId' in localData ? localData.assetId : undefined;
29
+ const averageAmount = Math.abs(Math.round((totalAmount.amount / period) * 100) / 100);
30
+ const lastMonthAmount = Math.abs(Math.round((Math.abs(totalAmount.amount) - averageAmount * (period - 1)) * 100) / 100);
31
+ let runningBalance = Math.abs(totalAmount.amount);
32
+ const negativeNumbers = totalAmount.amount < 0 || runningBalance < 0;
33
+ const newJeDetails = [];
34
+ for (let index = 0; index < period; index++) {
35
+ if (runningBalance > averageAmount) {
36
+ runningBalance = Math.round((runningBalance - averageAmount) * 100) / 100;
37
+ }
38
+ else {
39
+ runningBalance = 0;
40
+ }
41
+ const amount = index === period - 1 ? lastMonthAmount : averageAmount;
42
+ runningBalance = index === period - 1 ? 0 : runningBalance;
43
+ const schedulePostingDate = startingMonth.add(index, 'month');
44
+ const { postingDate, postingStatus } = (0, scheduleDetailLocalDataHelper_1.getPostingDateAndStatusForIndex)(schedulePostingDate.month(), schedulePostingDate.year(), localData.lastDayOfMonth === true
45
+ ? undefined
46
+ : localData.selectedDayOfMonth);
47
+ newJeDetails.push({
48
+ postingDate,
49
+ amount: (0, amount_1.toAmount)(negativeNumbers ? -amount : amount, totalAmount.currencyCode, totalAmount.currencySymbol),
50
+ runningBalance: (0, amount_1.toAmount)(negativeNumbers ? -runningBalance : runningBalance, totalAmount.currencyCode, totalAmount.currencySymbol),
51
+ postingStatus,
52
+ memo: getNewScheduleMemo(vendorName, schedulePostingDate, index + 1, period, assetId),
53
+ jeLink: { type: 'unknown' },
54
+ });
55
+ }
56
+ return newJeDetails;
57
+ };
58
+ exports.computeNewScheduleJeDetails = computeNewScheduleJeDetails;
59
+ const mapNewJeDetailsToScheduledJournalEntryPayload = (jeScheduleDetails) => jeScheduleDetails.map((journalEntry) => ({
60
+ status: {
61
+ code: journalEntry.postingStatus,
62
+ label: journalEntry.postingStatus,
63
+ },
64
+ transaction_memo: journalEntry.memo,
65
+ third_party_id: journalEntry.jeLink.thirdPartyTransactionId ?? null,
66
+ expected_post_date: journalEntry.postingDate.format(timePeriod_1.DEFAULT_DATE_FORMAT),
67
+ amount: journalEntry.amount.amount,
68
+ balance: journalEntry.runningBalance.amount,
69
+ // Brand-new schedule — there is no prior scheduled-journal-entry history
70
+ // to cross-reference (unlike the legacy edit flow's equivalent mapper).
71
+ scheduled_journal_entry_id: null,
72
+ actual_post_date: null,
73
+ is_platform_generated: null,
74
+ je_schedule_id: null,
75
+ update_time: null,
76
+ create_time: null,
77
+ }));
78
+ /**
79
+ * Builds a savable schedule payload directly from a Base Transaction search
80
+ * result and the New Schedule form's local data — bypassing the legacy
81
+ * getJEScheduledTransactionByJEScheduleTransactionKey selector entirely,
82
+ * since that selector throws unless the entity has already round-tripped
83
+ * through a real GET /1.0/schedules/:id. A brand-new schedule has no such
84
+ * history, so this reads only from data already in hand (the selected
85
+ * transaction/line plus what the user filled into the form).
86
+ */
87
+ const prepareNewSchedulePayload = (transaction, localData, scheduleType) => {
88
+ if (transaction.thirdPartyTransactionId == null ||
89
+ transaction.thirdPartyTransactionId === '') {
90
+ return { ok: false, reason: 'missing_third_party_id' };
91
+ }
92
+ const scheduleTransaction = transaction;
93
+ const vendorId = localData.selectedVendor?.id ?? transaction.vendorId ?? '';
94
+ const vendorName = localData.selectedVendor?.name ?? transaction.vendorName ?? '';
95
+ if (vendorId === '' || vendorName === '') {
96
+ return { ok: false, reason: 'missing_vendor' };
97
+ }
98
+ const vendor = {
99
+ vendor_id: vendorId,
100
+ vendor_name: vendorName,
101
+ };
102
+ const jeScheduleDetails = (0, exports.computeNewScheduleJeDetails)(localData, scheduleTransaction.amount, vendorName);
103
+ const postingDate = localData.selectedDayOfMonth ??
104
+ (localData.lastDayOfMonth === true ? timePeriod_2.LAST_SCHEDULE_DAY_OF_MONTH : null);
105
+ const firstJEScheduleDate = jeScheduleDetails.length > 0
106
+ ? jeScheduleDetails[0].postingDate.format(timePeriod_1.DEFAULT_DATE_FORMAT)
107
+ : null;
108
+ const lastJEScheduleDate = jeScheduleDetails.length > 0
109
+ ? jeScheduleDetails[jeScheduleDetails.length - 1].postingDate.format(timePeriod_1.DEFAULT_DATE_FORMAT)
110
+ : null;
111
+ const isFixedAssets = scheduleType === 'fixed_assets';
112
+ const assetId = 'assetId' in localData ? localData.assetId : undefined;
113
+ const selectedAccumulatedDepreciationCategory = 'selectedAccumulatedDepreciationCategory' in localData
114
+ ? localData.selectedAccumulatedDepreciationCategory
115
+ : undefined;
116
+ const status = { code: 'new', label: 'New' };
117
+ const jeSchedulePayload = {
118
+ status,
119
+ vendor,
120
+ currency_code: scheduleTransaction.currency.currencyCode,
121
+ currency_symbol: scheduleTransaction.currency.currencySymbol,
122
+ period: localData.selectedMonths ?? null,
123
+ je_schedule_type: scheduleType,
124
+ posting_date: postingDate,
125
+ balance: scheduleTransaction.amount.amount,
126
+ start_date: firstJEScheduleDate,
127
+ end_date: lastJEScheduleDate,
128
+ je_credit_accounting_class_id: scheduleTransaction.classBase?.classId ?? null,
129
+ je_credit_account_id: isFixedAssets
130
+ ? (selectedAccumulatedDepreciationCategory ?? null)
131
+ : scheduleTransaction.account.accountId,
132
+ je_debit_account_id: localData.selectedAccount ?? null,
133
+ je_debit_accounting_class_id: localData.selectedClass ?? null,
134
+ other_attributes: assetId != null ? { asset_id: assetId } : {},
135
+ base_transaction: (0, scheduleDetailPayload_1.mapScheduleTransactionToBaseScheduleTransactionPayload)(scheduleTransaction),
136
+ };
137
+ return {
138
+ ok: true,
139
+ payload: {
140
+ je_schedules: [jeSchedulePayload],
141
+ scheduled_journal_entries: mapNewJeDetailsToScheduledJournalEntryPayload(jeScheduleDetails),
142
+ },
143
+ };
144
+ };
145
+ exports.prepareNewSchedulePayload = prepareNewSchedulePayload;
@@ -3,10 +3,16 @@ import { AccountType } from '../../../entity/account/accountState';
3
3
  import { ReconciliationDataPayload } from '../../../entity/accountRecon/accountReconPayload';
4
4
  import { TransactionsToReview } from '../../../entity/accountRecon/accountReconState';
5
5
  import { MatchedTransactionPayload } from '../../../entity/transaction/payloadTypes/reconciliationTransactionPayloads';
6
+ import { AccountReconciliationDataWithTransactionFetchState } from '../types/reconciliationViewState';
6
7
  export declare const getAllReviewTransactionsFromReconcilePayload: (reconcilePayload: ReconciliationDataPayload[]) => {
7
8
  allReconciledTransactions: MatchedTransactionPayload[];
8
9
  currencyPayload: CurrencyPayload;
9
10
  }[];
11
+ /**
12
+ * Resolves combined group id from view record fields that may hold it after
13
+ * parse / mapping confirm (top-level, statement meta, or combined details).
14
+ */
15
+ export declare function resolveCombinedStatementGroupId(accountRecon: Pick<AccountReconciliationDataWithTransactionFetchState, 'combinedStatementGroupId' | 'parsedStatementData'> | undefined): string;
10
16
  export declare const isReviewTransactionBillPaymentType: (transaction: TransactionsToReview) => boolean;
11
17
  export declare const isReviewTransactionExpenseType: (transaction: TransactionsToReview) => boolean;
12
18
  export declare const isReviewTransactionDepositType: (transaction: TransactionsToReview) => boolean;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isReviewTransactionCreditCardCreditType = exports.isReviewTransactionCreditCardPaymentType = exports.isReviewTransactionBankTransferType = exports.isReviewTransactionDepositType = exports.isReviewTransactionExpenseType = exports.isReviewTransactionBillPaymentType = exports.getAllReviewTransactionsFromReconcilePayload = void 0;
4
+ exports.resolveCombinedStatementGroupId = resolveCombinedStatementGroupId;
4
5
  const getAllReviewTransactionsFromReconcilePayload = (reconcilePayload) => {
5
6
  const transactionsPerRecon = reconcilePayload.map((reconcile) => {
6
7
  const allReconciledTransactions = [];
@@ -16,6 +17,18 @@ const getAllReviewTransactionsFromReconcilePayload = (reconcilePayload) => {
16
17
  return transactionsPerRecon;
17
18
  };
18
19
  exports.getAllReviewTransactionsFromReconcilePayload = getAllReviewTransactionsFromReconcilePayload;
20
+ /**
21
+ * Resolves combined group id from view record fields that may hold it after
22
+ * parse / mapping confirm (top-level, statement meta, or combined details).
23
+ */
24
+ function resolveCombinedStatementGroupId(accountRecon) {
25
+ return (accountRecon?.combinedStatementGroupId ??
26
+ accountRecon?.parsedStatementData?.statementUpload.statementMeta
27
+ .combinedStatementGroupId ??
28
+ accountRecon?.parsedStatementData?.statementUpload
29
+ .combinedStatementDetails?.combinedStatementGroupId ??
30
+ '');
31
+ }
19
32
  const isReviewTransactionBillPaymentType = (transaction) => {
20
33
  return transaction.recommendedAction.action === 'record_bill_payment';
21
34
  };
@@ -39,7 +39,7 @@ export declare const getLineItemsByTransactionsIdsFromResponse: (transactions: S
39
39
  export declare const getLineItemsByTransactionIdsFromLocalData: (transactionLocalData: TransactionReviewLocalDataSelectorView[], selectedTab: TransactionsTab) => Record<ID, string[]>;
40
40
  export declare const mergeTabSpecificLineItems: (currentTabSpecificLineItems: TabSpecificLineItems, selectedTab: TransactionsTab, newLineItems: TabSpecificLineItems) => TabSpecificLineItems;
41
41
  export declare const getSnackbarMessageForTransactionReview: (updatedCount: number, failedCount: number, categorizedCount: number) => {
42
- messageSection: "common" | "transactionDetails_updatingPastTransactions" | "transactionDetails_transactionUpdated" | "cockpit_month_end_email_sent" | "cockpit_month_end_email_save" | "cockpit_month_end_email_attachment_upload" | "je_bill_link" | "je_posted" | "audit_score_updated" | "people_invite_people" | "people_invite_multiple_people" | "people_delete_person" | "people_update_person" | "reimbursement_updated" | "reimbursement_deleted" | "reimbursement_cancelled_deleted" | "reimbursement_cancelled" | "reimbursement_approved" | "reimbursement_rejected" | "reimbursement_sent_for_approval" | "account_added" | "business_verification_save" | "business_verification_submit" | "business_verification_from_bills_submit" | "plaid_connection" | "unlink_deposit_account" | "reimbursement_setup" | "reimbursement_approval_create" | "reimbursement_duplicate_approval_create" | "reimbursement_approval_update" | "reimbursement_duplicate_approval_update" | "reimbursement_approval_delete" | "reimbursement_approval_reorder" | "reimbursement_create_mileage" | "reimbursement_update_mileage" | "reimbursement_accept_term" | "reimbursement_accept_employee_term" | "reimbursement_bulk_submit" | "reimbursement_bulk_processed" | "bill_pay_setup" | "zeni_accounts_setup" | "bill_pay_approval_create" | "bill_pay_duplicate_approval_create" | "bill_pay_approval_update" | "bill_pay_duplicate_approval_update" | "bill_pay_approval_delete" | "bill_pay_approval_reorder" | "bill_pay_updated" | "bill_pay_deleted" | "bill_pay_cancelled_deleted" | "bill_pay_cancelled" | "bill_pay_approved" | "real_time_approver_added" | "bill_pay_rejected" | "bill_pay_sent_for_approval" | "bill_pay_accept_term" | "bill_pay_bulk_submit" | "bill_pay_bulk_processed" | "bill_pay_refund" | "bill_pay_retry" | "bill_pay_marked_as_paid" | "zeni_account_accept_term" | "update_vendor" | "data_refresh_update" | "delete_bank_account" | "create_bank_account" | "create_bank_account_ach" | "create_bank_account_wire" | "create_bank_account_international" | "transfer_money" | "update_zeni_account_nickname" | "create_checking_account" | "deposit_check" | "create_vendor" | "onboarding_customer_view" | "onboarding_customer_view_complete" | "onboarding_customer_identity_verification_save" | "onboarding_customer_identity_verification_submit" | "onboarding_customer_business_verification_save" | "onboarding_customer_business_verification_submit" | "retry_bank_account_connection" | "dashboard_invite_sent" | "onboarding_info_saved" | "approve_original_merchant" | "approve_global_merchant" | "reject_global_merchant" | "create_global_merchant" | "fetch_global_merchant_no_recommendation" | "save_vendor_renamed" | "save_vendor_sent_for_review" | "save_vendor_marked_as_employee" | "save_vendor_marked_as_local_contractor" | "charge_card_setup" | "charge_card_accept_term" | "charge_card_receipt_upload" | "charge_card_resend_invite" | "charge_card_revoke_invite" | "card_policy_created" | "card_policy_updated" | "card_policy_deleted" | "charge_card_update_limit" | "charge_cards_update_limit" | "close_charge_card" | "lock_charge_card" | "lock_charge_card_card_user" | "lock_charge_cards" | "unlock_charge_card" | "unlock_charge_card_card_user" | "unlock_charge_cards" | "close_charge_cards" | "revoke_invite_charge_cards" | "charge_card_express_interest" | "create_schedule" | "save_schedule" | "delete_schedule" | "ignore_schedule" | "save_task_detail" | "fetch_task_detail" | "delete_task" | "archive_task" | "snooze_task" | "unsnooze_task" | "create_tag" | "delete_tag" | "update_charge_card" | "update_charge_card_name" | "update_charge_card_name_card_user" | "issue_charge_card" | "issue_charge_cards" | "notification_settings_saved" | "referral_invite_sent" | "notification_mark_as_read" | "mark_as_complete_schedule" | "cancel_journal_entry" | "settings_accounting_accounts_updated" | "create_card_setup" | "confirm_card_setup" | "add_card_payment_source" | "fetch_payment_sources" | "task_assigned_toast_notification" | "task_due_tomorrow_toast_notification" | "task_deleted_toast_notification" | "task_archived_toast_notification" | "task_overdue_toast_notification" | "task_overdue_toast_notification_creator" | "task_notification_count" | "task_activities_toast_notification" | "task_created_toast_notification" | "task_group_creation_success" | "task_group_deletion_success" | "task_group_update_success" | "primary_funding_account_updated" | "task_time_spent_validation" | "missing_receipts_attachment" | "flux_analysis_unreviewed" | "flux_analysis_reviewed" | "receipt_match" | "receipts_upload" | "receipts_bulk_match" | "billing_address_view" | "express_pay_submit" | "exclude_transaction" | "reconcile" | "save_reconcile_for_later" | "recon_transaction_categorize" | "recon_transaction_match" | "update_debit_card_pin_attempt" | "set_debit_card_pin" | "ai_cfo_create_session_and_submit" | "ai_cfo_chat_session_deleted" | "charge_card_auto_pay_enable" | "charge_card_auto_pay_disable" | "treasury_setup" | "treasury_accept_term" | "treasury_transfer_money" | "treasury_transfer_money_failed" | "auto_transfer_rule_create" | "auto_transfer_rule_update" | "auto_transfer_rule_delete" | "auto_transfer_rule_pause" | "auto_transfer_rule_resume" | "treasury_update_portfolio_allocation" | "send_email_magic_link_to_user" | "complete_profile_done" | "create_transfer_entry" | "reports_resync" | "invalid_phone_number" | "transactions_categorized_updated_failed" | "transaction_categorized_updated_failed" | "transactionsCategorized_transactionsUpdated" | "transactionsCategorized_transactionUpdated" | "transactionCategorized_transactionsUpdated" | "transactionCategorized_transactionUpdated" | "transactionsCategorized_transactionsFailed" | "transactionsCategorized_transactionFailed" | "transactionCategorized_transactionsFailed" | "transactionCategorized_transactionFailed" | "transactionsUpdated_transactionsFailed" | "transactionsUpdated_transactionFailed" | "transactionUpdated_transactionsFailed" | "transactionUpdated_transactionFailed" | "transactionsCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionsUpdated_transactionFailed" | "transactionsCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionUpdated_transactionFailed" | "transactionCategorized_transactionsUpdated_transactionFailed" | "transactionCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionUpdated_transactionFailed" | "accounting_classes_enabled_update" | "accounting_projects_enabled_update" | "accounting_projects_qbo_not_enabled" | "capitalization_threshold_update" | "account_excluded_from_reconciliation" | "account_included_in_reconciliation" | "confirm_statement_mapping" | "statement_parsing_in_progress" | "statement_parsing_complete" | "ai_accountant_trigger_job" | "oauth_consent_approve" | "oauth_consent_invalid_request" | "credit_agent_update_profile" | "credit_agent_save_macro" | "credit_agent_schedule_cron" | "create_sub_task" | "qbo_connection_already_linked" | "qbo_connection_failed" | "accounting_projects_qbo_reconnect_failed" | "product_services_update" | "qbo_realm_id_update" | "invoicing_dunning_case_resolved" | "invoicing_dunning_retry" | "invoicing_dunning_cancel" | "invoicing_dunning_settings_save" | "invoicing_qbo_backfill" | "invoicing_qbo_sync_health_retry" | "invoicing_qbo_settings_save" | "invoicing_branding_save" | "invoicing_discount_archive" | "invoicing_discount_unarchive" | "invoicing_discount_delete" | "invoicing_invoice_reminder_sent" | "invoicing_invoice_regenerated" | "invoicing_invoice_voided" | "invoicing_catalog_item_saved" | "invoicing_customer_saved" | "invoicing_subscription_saved" | "invoicing_coupon_saved" | "invoicing_invoice_saved" | "invoicing_credit_note_saved" | "invoicing_payment_recorded" | "invoicing_subscription_activated" | "invoicing_subscription_cancellation_removed" | "invoicing_subscription_cancelled" | "invoicing_subscription_non_renewing" | "invoicing_subscription_paused" | "invoicing_subscription_reactivated" | "invoicing_subscription_resumed" | "invoicing_subscription_term_end_changed";
42
+ messageSection: "common" | "transactionDetails_updatingPastTransactions" | "transactionDetails_transactionUpdated" | "cockpit_month_end_email_sent" | "cockpit_month_end_email_save" | "cockpit_month_end_email_attachment_upload" | "je_bill_link" | "je_posted" | "audit_score_updated" | "people_invite_people" | "people_invite_multiple_people" | "people_delete_person" | "people_update_person" | "reimbursement_updated" | "reimbursement_deleted" | "reimbursement_cancelled_deleted" | "reimbursement_cancelled" | "reimbursement_approved" | "reimbursement_rejected" | "reimbursement_sent_for_approval" | "account_added" | "business_verification_save" | "business_verification_submit" | "business_verification_from_bills_submit" | "plaid_connection" | "unlink_deposit_account" | "reimbursement_setup" | "reimbursement_approval_create" | "reimbursement_duplicate_approval_create" | "reimbursement_approval_update" | "reimbursement_duplicate_approval_update" | "reimbursement_approval_delete" | "reimbursement_approval_reorder" | "reimbursement_create_mileage" | "reimbursement_update_mileage" | "reimbursement_accept_term" | "reimbursement_accept_employee_term" | "reimbursement_bulk_submit" | "reimbursement_bulk_processed" | "bill_pay_setup" | "zeni_accounts_setup" | "bill_pay_approval_create" | "bill_pay_duplicate_approval_create" | "bill_pay_approval_update" | "bill_pay_duplicate_approval_update" | "bill_pay_approval_delete" | "bill_pay_approval_reorder" | "bill_pay_updated" | "bill_pay_deleted" | "bill_pay_cancelled_deleted" | "bill_pay_cancelled" | "bill_pay_approved" | "real_time_approver_added" | "bill_pay_rejected" | "bill_pay_sent_for_approval" | "bill_pay_accept_term" | "bill_pay_bulk_submit" | "bill_pay_bulk_processed" | "bill_pay_refund" | "bill_pay_retry" | "bill_pay_marked_as_paid" | "zeni_account_accept_term" | "update_vendor" | "data_refresh_update" | "delete_bank_account" | "create_bank_account" | "create_bank_account_ach" | "create_bank_account_wire" | "create_bank_account_international" | "transfer_money" | "update_zeni_account_nickname" | "create_checking_account" | "deposit_check" | "create_vendor" | "onboarding_customer_view" | "onboarding_customer_view_complete" | "onboarding_customer_identity_verification_save" | "onboarding_customer_identity_verification_submit" | "onboarding_customer_business_verification_save" | "onboarding_customer_business_verification_submit" | "retry_bank_account_connection" | "dashboard_invite_sent" | "onboarding_info_saved" | "approve_original_merchant" | "approve_global_merchant" | "reject_global_merchant" | "create_global_merchant" | "fetch_global_merchant_no_recommendation" | "save_vendor_renamed" | "save_vendor_sent_for_review" | "save_vendor_marked_as_employee" | "save_vendor_marked_as_local_contractor" | "charge_card_setup" | "charge_card_accept_term" | "charge_card_receipt_upload" | "charge_card_resend_invite" | "charge_card_revoke_invite" | "card_policy_created" | "card_policy_updated" | "card_policy_deleted" | "charge_card_update_limit" | "charge_cards_update_limit" | "close_charge_card" | "lock_charge_card" | "lock_charge_card_card_user" | "lock_charge_cards" | "unlock_charge_card" | "unlock_charge_card_card_user" | "unlock_charge_cards" | "close_charge_cards" | "revoke_invite_charge_cards" | "charge_card_express_interest" | "create_schedule" | "save_schedule" | "delete_schedule" | "ignore_schedule" | "revert_schedule" | "ignore_accrual" | "revert_accrual" | "save_task_detail" | "fetch_task_detail" | "delete_task" | "archive_task" | "snooze_task" | "unsnooze_task" | "create_tag" | "delete_tag" | "update_charge_card" | "update_charge_card_name" | "update_charge_card_name_card_user" | "issue_charge_card" | "issue_charge_cards" | "notification_settings_saved" | "referral_invite_sent" | "notification_mark_as_read" | "mark_as_complete_schedule" | "cancel_journal_entry" | "settings_accounting_accounts_updated" | "create_card_setup" | "confirm_card_setup" | "add_card_payment_source" | "fetch_payment_sources" | "task_assigned_toast_notification" | "task_due_tomorrow_toast_notification" | "task_deleted_toast_notification" | "task_archived_toast_notification" | "task_overdue_toast_notification" | "task_overdue_toast_notification_creator" | "task_notification_count" | "task_activities_toast_notification" | "task_created_toast_notification" | "task_group_creation_success" | "task_group_deletion_success" | "task_group_update_success" | "primary_funding_account_updated" | "task_time_spent_validation" | "missing_receipts_attachment" | "flux_analysis_unreviewed" | "flux_analysis_reviewed" | "receipt_match" | "receipts_upload" | "receipts_bulk_match" | "billing_address_view" | "express_pay_submit" | "exclude_transaction" | "reconcile" | "save_reconcile_for_later" | "recon_transaction_categorize" | "recon_transaction_match" | "update_debit_card_pin_attempt" | "set_debit_card_pin" | "ai_cfo_create_session_and_submit" | "ai_cfo_chat_session_deleted" | "charge_card_auto_pay_enable" | "charge_card_auto_pay_disable" | "treasury_setup" | "treasury_accept_term" | "treasury_transfer_money" | "treasury_transfer_money_failed" | "auto_transfer_rule_create" | "auto_transfer_rule_update" | "auto_transfer_rule_delete" | "auto_transfer_rule_pause" | "auto_transfer_rule_resume" | "treasury_update_portfolio_allocation" | "send_email_magic_link_to_user" | "complete_profile_done" | "create_transfer_entry" | "reports_resync" | "invalid_phone_number" | "transactions_categorized_updated_failed" | "transaction_categorized_updated_failed" | "transactionsCategorized_transactionsUpdated" | "transactionsCategorized_transactionUpdated" | "transactionCategorized_transactionsUpdated" | "transactionCategorized_transactionUpdated" | "transactionsCategorized_transactionsFailed" | "transactionsCategorized_transactionFailed" | "transactionCategorized_transactionsFailed" | "transactionCategorized_transactionFailed" | "transactionsUpdated_transactionsFailed" | "transactionsUpdated_transactionFailed" | "transactionUpdated_transactionsFailed" | "transactionUpdated_transactionFailed" | "transactionsCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionsUpdated_transactionFailed" | "transactionsCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionUpdated_transactionFailed" | "transactionCategorized_transactionsUpdated_transactionFailed" | "transactionCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionUpdated_transactionFailed" | "accounting_classes_enabled_update" | "accounting_projects_enabled_update" | "accounting_projects_qbo_not_enabled" | "capitalization_threshold_update" | "account_excluded_from_reconciliation" | "account_included_in_reconciliation" | "confirm_statement_mapping" | "statement_parsing_in_progress" | "statement_parsing_complete" | "ai_accountant_trigger_job" | "oauth_consent_approve" | "oauth_consent_invalid_request" | "credit_agent_update_profile" | "credit_agent_save_macro" | "credit_agent_schedule_cron" | "create_sub_task" | "qbo_connection_already_linked" | "qbo_connection_failed" | "accounting_projects_qbo_reconnect_failed" | "product_services_update" | "qbo_realm_id_update" | "invoicing_dunning_case_resolved" | "invoicing_dunning_retry" | "invoicing_dunning_cancel" | "invoicing_dunning_settings_save" | "invoicing_qbo_backfill" | "invoicing_qbo_sync_health_retry" | "invoicing_qbo_settings_save" | "invoicing_branding_save" | "invoicing_discount_archive" | "invoicing_discount_unarchive" | "invoicing_discount_delete" | "invoicing_invoice_reminder_sent" | "invoicing_invoice_regenerated" | "invoicing_invoice_voided" | "invoicing_catalog_item_saved" | "invoicing_customer_saved" | "invoicing_subscription_saved" | "invoicing_coupon_saved" | "invoicing_invoice_saved" | "invoicing_credit_note_saved" | "invoicing_payment_recorded" | "invoicing_subscription_activated" | "invoicing_subscription_cancellation_removed" | "invoicing_subscription_cancelled" | "invoicing_subscription_non_renewing" | "invoicing_subscription_paused" | "invoicing_subscription_reactivated" | "invoicing_subscription_resumed" | "invoicing_subscription_term_end_changed";
43
43
  messageText: "notification" | "failed" | "success";
44
44
  type: "error" | "success" | "info";
45
45
  variables: {
@@ -1,13 +1,17 @@
1
- import { JEScheduledTransactionPayload, ScheduledJournalEntryPayload } from '../../../entity/jeSchedules/jeSchedulesPayload';
1
+ import { ID } from '../../../commonStateTypes/common';
2
+ import { JEAccruedScheduledTransactionPayload, JEOneTimeAccrualPayload, JEScheduledTransactionPayload, ScheduledJournalEntryPayload } from '../../../entity/jeSchedules/jeSchedulesPayload';
2
3
  import { JEScheduledTransaction } from '../../../entity/jeSchedules/jeSchedulesSelector';
3
- import { ScheduleTypes } from '../../../entity/jeSchedules/jeSchedulesTypes';
4
+ import { OneTimeAccrualIgnoreReasonType, OneTimeAccrualRevertReasonType, ScheduleTypes } from '../../../entity/jeSchedules/jeSchedulesTypes';
4
5
  import { ZeniAPIResponse } from '../../../responsePayload';
5
6
  import { RootState } from '../../../rootStateTypes';
7
+ import { ZeniDate } from '../../../zeniDayJS';
6
8
  import { JESchedulePayload, SaveJESchedulePayload } from '../../scheduleView/scheduleDetailView/scheduleDetailPayload';
7
- import { JEScheduleLocalData } from '../types/jeSchedulesViewState';
9
+ import { JEScheduleLocalData, NewOneTimeAccrualLocalData } from '../types/jeSchedulesViewState';
8
10
  export interface ExpenseAutomationJESchedulesQueryPayload {
9
11
  end_date: string;
12
+ include_accrued: boolean;
10
13
  start_date: string;
14
+ close_period_start_date?: string;
11
15
  }
12
16
  interface ExpenseAutomationJESchedulesPayload {
13
17
  failed_je_postings: {
@@ -15,8 +19,87 @@ interface ExpenseAutomationJESchedulesPayload {
15
19
  scheduled_journal_entries: ScheduledJournalEntryPayload[];
16
20
  };
17
21
  je_schedules: JEScheduledTransactionPayload[];
22
+ accrued_je_schedules?: {
23
+ je_schedules: JEAccruedScheduledTransactionPayload[];
24
+ scheduled_journal_entries?: ScheduledJournalEntryPayload[];
25
+ };
26
+ one_time_accruals?: JEOneTimeAccrualPayload[];
18
27
  }
19
28
  export type ExpenseAutomationJESchedulesResponse = ZeniAPIResponse<ExpenseAutomationJESchedulesPayload>;
29
+ export interface CreateOneTimeAccrualPayload {
30
+ amount: number;
31
+ je_credit_account_id: ID;
32
+ je_debit_account_id: ID;
33
+ memo: string;
34
+ service_month: string;
35
+ vendor_id: ID;
36
+ vendor_name: string;
37
+ expected_reversal_date?: string;
38
+ je_credit_account_name?: string;
39
+ je_credit_accounting_class_id?: ID;
40
+ je_credit_accounting_class_name?: string;
41
+ je_debit_account_name?: string;
42
+ je_debit_accounting_class_id?: ID;
43
+ je_debit_accounting_class_name?: string;
44
+ reversal_policy?: string;
45
+ reverse_next_month?: boolean;
46
+ }
47
+ export type CreateOneTimeAccrualResponse = ZeniAPIResponse<{
48
+ accrual: JEOneTimeAccrualPayload;
49
+ }>;
50
+ /**
51
+ * Promote body. `vendor_id`, `vendor_name` and `service_month` are deliberately absent: promote
52
+ * treats them as immutable and takes them from the existing draft, so sending them would imply a
53
+ * reassignment the API silently ignores.
54
+ */
55
+ /**
56
+ * The body agent-je's `promote_draft` reads. Promote is the only write path for a draft accrual --
57
+ * it applies the body and posts the JE in one step -- so every field a human can edit on the detail
58
+ * page travels here.
59
+ *
60
+ * `posting_date` is absent on purpose: agent-je derives it from the accrual's service month and
61
+ * ignores any value sent for it.
62
+ */
63
+ export interface PromoteOneTimeAccrualPayload {
64
+ amount: number;
65
+ je_credit_account_id: ID;
66
+ je_debit_account_id: ID;
67
+ memo: string;
68
+ expected_reversal_date?: string;
69
+ je_credit_accounting_class_id?: ID;
70
+ je_credit_accounting_class_name?: string;
71
+ je_debit_accounting_class_id?: ID;
72
+ je_debit_accounting_class_name?: string;
73
+ reverse_next_month?: boolean;
74
+ }
75
+ /**
76
+ * Ignore body. `scope` is deliberately absent — the API returns 400 if it is sent, which is why the
77
+ * design's "Apply to" selector cannot be built yet.
78
+ */
79
+ /**
80
+ * Revert deletes the accrual's journal entry in QBO and soft-deletes the row. `scope` is rejected
81
+ * with a 400, exactly as on ignore.
82
+ */
83
+ export interface RevertOneTimeAccrualPayload {
84
+ reason: OneTimeAccrualRevertReasonType;
85
+ note?: string;
86
+ }
87
+ export interface IgnoreOneTimeAccrualPayload {
88
+ reason: OneTimeAccrualIgnoreReasonType;
89
+ note?: string;
90
+ }
91
+ /**
92
+ * The credit line is the accrued liability, which always sits on the balance sheet — the
93
+ * recurring accrued path resolves the same class the same way (see
94
+ * prepareNewScheduleAccruedDetailPayload). Omitted rather than sent empty when the tenant has
95
+ * no balance_sheet class, since the API treats the field as optional.
96
+ */
97
+ export declare const prepareCreateOneTimeAccrualPayload: (state: RootState, localData: NewOneTimeAccrualLocalData) => CreateOneTimeAccrualPayload;
98
+ /**
99
+ * The API defaults this to the 1st of the month after service_month. We send it explicitly so the
100
+ * date the form promised the user is the date that gets stored.
101
+ */
102
+ export declare const getExpectedReversalDate: (serviceMonth: ZeniDate) => ZeniDate;
20
103
  export interface IgnoreDraftJESchedulePayload {
21
104
  je_schedules: JEScheduledTransactionPayload[];
22
105
  scheduled_journal_entries: SaveJESchedulePayload[];
@@ -1,8 +1,65 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.preparePayloadForRetryPosting = exports.prepareIgnoreSchedulePayload = void 0;
3
+ exports.preparePayloadForRetryPosting = exports.prepareIgnoreSchedulePayload = exports.getExpectedReversalDate = exports.prepareCreateOneTimeAccrualPayload = void 0;
4
4
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
5
+ const classListSelector_1 = require("../../classList/classListSelector");
5
6
  const scheduleDetailPayload_1 = require("../../scheduleView/scheduleDetailView/scheduleDetailPayload");
7
+ const BALANCE_SHEET_CLASS_LABEL = 'balance_sheet';
8
+ const SERVICE_MONTH_FORMAT = 'YYYY-MM';
9
+ /**
10
+ * The credit line is the accrued liability, which always sits on the balance sheet — the
11
+ * recurring accrued path resolves the same class the same way (see
12
+ * prepareNewScheduleAccruedDetailPayload). Omitted rather than sent empty when the tenant has
13
+ * no balance_sheet class, since the API treats the field as optional.
14
+ */
15
+ const prepareCreateOneTimeAccrualPayload = (state, localData) => {
16
+ const { classListState, classState } = state;
17
+ const balanceSheetClass = (0, classListSelector_1.getClassList)(classState, classListState).classes.find((accountingClass) => accountingClass.labels?.includes(BALANCE_SHEET_CLASS_LABEL) === true);
18
+ // reverse_next_month alone decides reversal_policy server-side, so reversal_policy is
19
+ // deliberately not sent — the API documents it only as an alternate way to say on_bill_match,
20
+ // and sending both would be two sources of truth for one toggle.
21
+ const reversalFields = localData.reverseNextMonth
22
+ ? {
23
+ reverse_next_month: true,
24
+ expected_reversal_date: (0, exports.getExpectedReversalDate)(localData.serviceMonth).format(timePeriod_1.DEFAULT_DATE_FORMAT),
25
+ }
26
+ : { reverse_next_month: false };
27
+ return {
28
+ vendor_id: localData.vendorId,
29
+ vendor_name: localData.vendorName,
30
+ service_month: localData.serviceMonth.format(SERVICE_MONTH_FORMAT),
31
+ amount: localData.amount,
32
+ memo: localData.memo,
33
+ je_debit_account_id: localData.debitAccountId,
34
+ je_credit_account_id: localData.creditAccountId,
35
+ ...(localData.debitAccountName != null
36
+ ? { je_debit_account_name: localData.debitAccountName }
37
+ : {}),
38
+ ...(localData.creditAccountName != null
39
+ ? { je_credit_account_name: localData.creditAccountName }
40
+ : {}),
41
+ ...(localData.debitClassId != null
42
+ ? { je_debit_accounting_class_id: localData.debitClassId }
43
+ : {}),
44
+ ...(localData.debitClassName != null
45
+ ? { je_debit_accounting_class_name: localData.debitClassName }
46
+ : {}),
47
+ ...(balanceSheetClass != null
48
+ ? {
49
+ je_credit_accounting_class_id: balanceSheetClass.classId,
50
+ je_credit_accounting_class_name: balanceSheetClass.className,
51
+ }
52
+ : {}),
53
+ ...reversalFields,
54
+ };
55
+ };
56
+ exports.prepareCreateOneTimeAccrualPayload = prepareCreateOneTimeAccrualPayload;
57
+ /**
58
+ * The API defaults this to the 1st of the month after service_month. We send it explicitly so the
59
+ * date the form promised the user is the date that gets stored.
60
+ */
61
+ const getExpectedReversalDate = (serviceMonth) => serviceMonth.add(1, 'month').startOf('month');
62
+ exports.getExpectedReversalDate = getExpectedReversalDate;
6
63
  const prepareIgnoreSchedulePayload = (scheduleType, jeScheduleTransaction, state) => {
7
64
  const { vendorState } = state;
8
65
  const { vendor, currencyCode, currencySymbol, baseTransaction, status, balanceAsOfToday, period, startDate, endDate, jeCredit, jeDebit, } = jeScheduleTransaction;
@@ -99,6 +99,10 @@ export interface DeleteStatementResponsePayload {
99
99
  };
100
100
  }
101
101
  export type DeleteStatementResponse = ZeniAPIResponse<DeleteStatementResponsePayload>;
102
+ export interface DeleteCombinedStatementResponsePayload extends DeleteStatementResponsePayload {
103
+ deleted_statement_upload_ids: ID[];
104
+ }
105
+ export type DeleteCombinedStatementResponse = ZeniAPIResponse<DeleteCombinedStatementResponsePayload>;
102
106
  export interface UploadStatementDocumentAIPayload {
103
107
  files: FilePayload[];
104
108
  processor_run_id: string;