@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.
- package/lib/entity/accountRecon/accountReconReducer.d.ts +2 -1
- package/lib/entity/accountRecon/accountReconReducer.js +22 -10
- package/lib/entity/accountRecon/accountReconSelector.d.ts +1 -0
- package/lib/entity/accountRecon/accountReconSelector.js +1 -0
- package/lib/entity/approvalRule/approvalRuleConflict.d.ts +13 -0
- package/lib/entity/approvalRule/approvalRuleConflict.js +16 -1
- package/lib/entity/jeSchedules/jeScheduleHelper.d.ts +1 -0
- package/lib/entity/jeSchedules/jeScheduleHelper.js +7 -0
- package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +78 -1
- package/lib/entity/jeSchedules/jeSchedulesPayload.js +183 -4
- package/lib/entity/jeSchedules/jeSchedulesReducer.d.ts +4 -2
- package/lib/entity/jeSchedules/jeSchedulesReducer.js +30 -2
- package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +11 -2
- package/lib/entity/jeSchedules/jeSchedulesSelector.js +38 -3
- package/lib/entity/jeSchedules/jeSchedulesState.d.ts +123 -1
- package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +24 -1
- package/lib/entity/jeSchedules/jeSchedulesTypes.js +96 -1
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +3 -0
- package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +2 -0
- package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
- package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +2 -0
- package/lib/epic.d.ts +10 -1
- package/lib/epic.js +18 -0
- package/lib/esm/entity/accountRecon/accountReconReducer.js +22 -10
- package/lib/esm/entity/accountRecon/accountReconSelector.js +1 -0
- package/lib/esm/entity/approvalRule/approvalRuleConflict.js +16 -1
- package/lib/esm/entity/jeSchedules/jeScheduleHelper.js +6 -0
- package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +183 -5
- package/lib/esm/entity/jeSchedules/jeSchedulesReducer.js +30 -2
- package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +36 -2
- package/lib/esm/entity/jeSchedules/jeSchedulesTypes.js +86 -0
- package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
- package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
- package/lib/esm/epic.js +18 -0
- package/lib/esm/index.js +16 -10
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +2 -2
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/deleteCombinedStatementEpic.js +54 -0
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +1 -1
- package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +3 -6
- package/lib/esm/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +9 -1
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +41 -5
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +45 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +104 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +25 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +138 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +79 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +180 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +111 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +28 -0
- package/lib/esm/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +140 -0
- package/lib/esm/view/expenseAutomationView/helpers/reconciliationHelpers.js +12 -0
- package/lib/esm/view/expenseAutomationView/payload/jeSchedulesPayload.js +55 -0
- package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +319 -29
- package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +20 -2
- package/lib/esm/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +1 -0
- package/lib/esm/view/expenseAutomationView/selectors/jeAccountSettingsViewSelector.js +1 -0
- package/lib/esm/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +106 -0
- package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +327 -22
- package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +5 -6
- package/lib/esm/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
- package/lib/esm/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
- package/lib/esm/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +20 -1
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +20 -1
- package/lib/index.d.ts +18 -13
- package/lib/index.js +92 -47
- package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.d.ts +10 -2
- package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +1 -1
- package/lib/view/expenseAutomationView/epics/accountRecon/deleteCombinedStatementEpic.d.ts +9 -0
- package/lib/view/expenseAutomationView/epics/accountRecon/deleteCombinedStatementEpic.js +58 -0
- package/lib/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +1 -1
- package/lib/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +3 -6
- package/lib/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
- package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +9 -1
- package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.d.ts +3 -2
- package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +39 -3
- package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.d.ts +21 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +49 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.d.ts +9 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +108 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.d.ts +8 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +29 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.d.ts +9 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +142 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.d.ts +8 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +83 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.d.ts +13 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +187 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.d.ts +65 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +115 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.d.ts +6 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +32 -0
- package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.d.ts +36 -0
- package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +145 -0
- package/lib/view/expenseAutomationView/helpers/reconciliationHelpers.d.ts +6 -0
- package/lib/view/expenseAutomationView/helpers/reconciliationHelpers.js +13 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +86 -3
- package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.js +58 -1
- package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +4 -0
- package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +93 -12
- package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +321 -29
- package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +1 -1
- package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +6 -1
- package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +22 -4
- package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +2 -2
- package/lib/view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes.d.ts +1 -0
- package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.d.ts +42 -0
- package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +2 -0
- package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +41 -7
- package/lib/view/expenseAutomationView/selectors/jeAccountSettingsViewSelector.js +1 -0
- package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.d.ts +21 -0
- package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +112 -0
- package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.d.ts +34 -0
- package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +335 -21
- package/lib/view/expenseAutomationView/types/completedSubTab.d.ts +1 -1
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +83 -8
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +8 -8
- package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
- package/lib/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
- package/lib/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
- package/lib/view/scheduleView/scheduleListView/scheduleListReducer.d.ts +4 -2
- package/lib/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +20 -1
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelectorTypes.d.ts +3 -0
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +20 -1
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelectorTypes.d.ts +3 -0
- 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
|
};
|
package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts
CHANGED
|
@@ -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 {
|
|
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;
|