@zeniai/web-components 4.3.76 → 4.3.78-betaRD1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/{SessionTimeoutPopup-e2q-I5j5.cjs → SessionTimeoutPopup-DgRplYVC.cjs} +18112 -17279
  2. package/dist/{SessionTimeoutPopup-z4PrvxTb.js → SessionTimeoutPopup-EsA6cv-u.js} +99448 -95998
  3. package/dist/appLocale.d.ts +124 -0
  4. package/dist/cockpit.cjs.js +2 -2
  5. package/dist/cockpit.esm.js +415 -414
  6. package/dist/components/aiCfo/components/AiCfoRoutinesBrowser.d.ts +1 -1
  7. package/dist/components/expenseAutomation/ExpenseAutomationPage.d.ts +14 -4
  8. package/dist/components/expenseAutomation/components/navbarHeaderData.d.ts +6 -1
  9. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingKpiStrip.d.ts +9 -0
  10. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingList.d.ts +13 -0
  11. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingListRow.d.ts +11 -0
  12. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingMatchDetailPage.d.ts +21 -0
  13. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingMatchNewButton.d.ts +5 -0
  14. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingPage.d.ts +22 -0
  15. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingPageSkeleton.d.ts +3 -0
  16. package/dist/components/expenseAutomation/sections/actualMatching/MatchNewModal.d.ts +12 -0
  17. package/dist/components/expenseAutomation/sections/actualMatching/MatchNewPreview.d.ts +8 -0
  18. package/dist/components/expenseAutomation/sections/actualMatching/ReversesGroupedPill.d.ts +5 -0
  19. package/dist/components/expenseAutomation/sections/actualMatching/actualMatchingHelpers.d.ts +76 -0
  20. package/dist/components/expenseAutomation/sections/actualMatching/actualMatchingHelpers.test.d.ts +1 -0
  21. package/dist/components/expenseAutomation/sections/actualMatching/actualMatchingListConfig.d.ts +12 -0
  22. package/dist/components/expenseAutomation/sections/actualMatching/actualMatchingMatchDetailHelpers.d.ts +18 -0
  23. package/dist/components/expenseAutomation/sections/actualMatching/actualMatchingMatchDetailHelpers.test.d.ts +1 -0
  24. package/dist/components/expenseAutomation/sections/actualMatching/actualMatchingTypes.d.ts +134 -0
  25. package/dist/components/expenseAutomation/sections/actualMatching/matchNewPreviewHelpers.d.ts +12 -0
  26. package/dist/components/expenseAutomation/sections/actualMatching/matchNewPreviewHelpers.test.d.ts +1 -0
  27. package/dist/components/expenseAutomation/sections/actualMatching/stories/ActualMatchingPageQuickViewStoryParts.d.ts +10 -0
  28. package/dist/components/expenseAutomation/sections/jeSchedules/JESchedulePage.d.ts +10 -2
  29. package/dist/components/expenseAutomation/sections/jeSchedules/common/JEGroupSectionHeader.d.ts +2 -1
  30. package/dist/components/expenseAutomation/stories/actualMatchingPageStoryActions.d.ts +2 -0
  31. package/dist/components/reports/PdfColumnLimitPopup.d.ts +8 -0
  32. package/dist/index.cjs.js +1 -1
  33. package/dist/index.d.ts +4 -0
  34. package/dist/index.esm.js +392 -391
  35. package/dist/strings/strings.d.ts +124 -0
  36. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  import { default as React } from 'react';
2
2
  import { Routine } from './helpers/aiCfoRoutines';
3
3
  export interface AiCfoRoutinesBrowserProps {
4
- /** False withholds "New routine" — the server states the cap, not the client. */
4
+ /** False withholds "New scheduled task" — the server states the cap, not the client. */
5
5
  canCreate: boolean;
6
6
  listError: boolean;
7
7
  /**
@@ -5,6 +5,7 @@ import { DownloadJEScheduleParams } from '../jeSchedules/downloadJESchedules/typ
5
5
  import { ReportTreeScrollPosition } from '../reportTree/ReportTree';
6
6
  import { ExpenseAutomationThreadClickTarget } from './components/ExpenseAutomationCommentingShell';
7
7
  import { MonthEndReportPageProps } from './components/TableSection';
8
+ import { ActualMatchingActionProps } from './sections/actualMatching/actualMatchingTypes';
8
9
  import { JEAccrualFeedbackReason } from './sections/jeSchedules/accrualDetail/JEAccrualFeedbackDialog';
9
10
  import { FormData as JEScheduleAccountSettingsFormData } from './sections/jeSchedules/common/JEScheduleAccountSettings';
10
11
  import { JEScheduleNewEntrySelection } from './sections/jeSchedules/common/JEScheduleNewEntryButton';
@@ -15,7 +16,7 @@ import { TransferDrawerTransactionData } from './sections/transactionCategorizat
15
16
  /**
16
17
  * Component & its Props
17
18
  */
18
- export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
19
+ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps, ActualMatchingActionProps {
19
20
  accountListNestedAccountHierarchy: NestedAccountHierarchyForReport[];
20
21
  authParams: AuthParams;
21
22
  baseTransactionSearchFetchState: FetchStateAndError;
@@ -69,6 +70,12 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
69
70
  isCreateTransferEntryFromExpenseEnabled?: boolean;
70
71
  /** Gates close-management commenting across the 4 tabs. */
71
72
  isExpenseAutomationCommentingEnabled?: boolean;
73
+ /**
74
+ * Match quick view, named apart from page-level `panelContent` the same way
75
+ * `schedulePanelContent` is. Actual Matching renders its own SidePanelLayout
76
+ * so the KPI strip stays full-width above the split.
77
+ */
78
+ isMatchPanelOpen?: boolean;
72
79
  /** Transaction categorization only: when true, the right rail is expanded. */
73
80
  isRightPanelOpen?: boolean;
74
81
  /**
@@ -82,6 +89,7 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
82
89
  */
83
90
  isSchedulePanelOpen?: boolean;
84
91
  loggedInUser?: LoggedInUser;
92
+ matchPanelContent?: ReactNode;
85
93
  newAccrualAccountsView?: NewAccrualAccountsView;
86
94
  /** The draft this form was last left with, for a host that stores it. */
87
95
  newScheduleLocalData?: NewScheduleSaveFormValues;
@@ -193,10 +201,12 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
193
201
  updateSectionIdsForReview: (sectionIds: FluxAnalysisSectionType[]) => void;
194
202
  updateSelectedVendorForTransaction: (selectedTab: ExpenseAutomationTransactionsTab, transactionId: ID, lineId: ID, selectedTransaction: SupportedTransactionWithCOT, updatedVendor?: VendorBase) => void;
195
203
  /**
196
- * When set (e.g. from `withTransactionSidePanel` in the host app), closing the transaction
197
- * quick-view / side panel on Missing Receipts sub-tab changes avoids a stale panel over Unmatched
198
- * or Completed lists.
204
+ * When set (e.g. from `withTransactionSidePanel` in the host app), closing
205
+ * the open quick-view on Missing Receipts sub-tab changes or JE page tab
206
+ * changes avoids a stale panel over the newly selected list. Match QV is
207
+ * closed via `closeMatchSidePanel` instead — it is not page-level.
199
208
  */
209
+ closeMatchSidePanel?: () => void;
200
210
  closeSidePanel?: () => void;
201
211
  onAccountExclude?: (accountId: ID) => void;
202
212
  onAccountInclude?: (accountId: ID) => void;
@@ -47,5 +47,10 @@ missingReceiptsOptions?: {
47
47
  * `missing_receipts`, `flux_analysis`, `je_schedules`). Gated by
48
48
  * `is_expense_automation_commenting_enabled`.
49
49
  */
50
- isExpenseAutomationCommentingEnabled?: boolean, receiptsEmail?: string) => ExpenseAutomationNavbarHeaderData;
50
+ isExpenseAutomationCommentingEnabled?: boolean, receiptsEmail?: string,
51
+ /**
52
+ * Cron-2 live gate (`is_accrual_enabled`). Off hides the Actual Matching JE
53
+ * subtab — there are no one-time accruals to match.
54
+ */
55
+ isAccrualEnabled?: boolean) => ExpenseAutomationNavbarHeaderData;
51
56
  export {};
@@ -0,0 +1,9 @@
1
+ import { Amount, MonthYearPeriod } from '@zeniai/client-epic-state';
2
+ import { ActualMatchingKpiSummary } from './actualMatchingTypes';
3
+ export interface ActualMatchingKpiStripProps {
4
+ displayCurrency: Amount;
5
+ kpiSummary: ActualMatchingKpiSummary;
6
+ selectedPeriod: MonthYearPeriod;
7
+ }
8
+ declare function ActualMatchingKpiStrip({ displayCurrency, kpiSummary, selectedPeriod, }: Readonly<ActualMatchingKpiStripProps>): import("react/jsx-runtime").JSX.Element;
9
+ export default ActualMatchingKpiStrip;
@@ -0,0 +1,13 @@
1
+ import { SortOrder } from '@zeniai/client-epic-state';
2
+ import { ActualMatchingRow, ActualMatchingSortKey, ActualMatchingViewUIState } from './actualMatchingTypes';
3
+ export interface ActualMatchingListProps {
4
+ pendingReview: ActualMatchingRow[];
5
+ reversed: ActualMatchingRow[];
6
+ sortKey?: ActualMatchingSortKey;
7
+ sortOrder?: SortOrder;
8
+ onOpenMatch: (matchId: string) => void;
9
+ onOpenMatchNewModal?: (matchId: string) => void;
10
+ onUpdateActualMatchingUIState?: (uiState: Partial<ActualMatchingViewUIState>) => void;
11
+ }
12
+ declare function ActualMatchingList({ pendingReview, reversed, onOpenMatch, onOpenMatchNewModal, onUpdateActualMatchingUIState, sortKey, sortOrder, }: Readonly<ActualMatchingListProps>): import("react/jsx-runtime").JSX.Element;
13
+ export default ActualMatchingList;
@@ -0,0 +1,11 @@
1
+ import { ActualMatchingColumnKey } from './actualMatchingListConfig';
2
+ import { ActualMatchingRow } from './actualMatchingTypes';
3
+ export interface ActualMatchingListRowProps {
4
+ columns: ActualMatchingColumnKey[];
5
+ gridTemplateColumns: string;
6
+ row: ActualMatchingRow;
7
+ onOpenMatch: (matchId: string) => void;
8
+ onOpenMatchNewModal?: (matchId: string) => void;
9
+ }
10
+ declare function ActualMatchingListRow({ columns, gridTemplateColumns, row, onOpenMatch, onOpenMatchNewModal, }: Readonly<ActualMatchingListRowProps>): import("react/jsx-runtime").JSX.Element;
11
+ export default ActualMatchingListRow;
@@ -0,0 +1,21 @@
1
+ import { FetchState, MatchAndReverseResult, UndoReversalResult } from '@zeniai/client-epic-state';
2
+ import { ActualMatchingMatch } from './actualMatchingTypes';
3
+ export interface ActualMatchingMatchDetailPageProps {
4
+ detailFetchState: FetchState;
5
+ refreshStatus: FetchState;
6
+ isRenderedInPanel?: boolean;
7
+ isUndoInFlight?: boolean;
8
+ lastMatchResults?: MatchAndReverseResult[];
9
+ lastUndoResults?: UndoReversalResult[];
10
+ match?: ActualMatchingMatch;
11
+ onNavigateBack: () => void;
12
+ onRefresh: () => void;
13
+ onContinueMatch?: () => void;
14
+ onOpenBill?: (txn: {
15
+ id: string;
16
+ type: string;
17
+ }) => void;
18
+ onUndoReversal?: (accrualIds: string[]) => void;
19
+ }
20
+ declare function ActualMatchingMatchDetailPage({ detailFetchState, isRenderedInPanel, isUndoInFlight, match, onNavigateBack, onRefresh, onOpenBill, onContinueMatch, onUndoReversal, lastMatchResults, lastUndoResults, refreshStatus, }: Readonly<ActualMatchingMatchDetailPageProps>): import("react/jsx-runtime").JSX.Element;
21
+ export default ActualMatchingMatchDetailPage;
@@ -0,0 +1,5 @@
1
+ export interface ActualMatchingMatchNewButtonProps {
2
+ onClick: () => void;
3
+ }
4
+ declare function ActualMatchingMatchNewButton({ onClick, }: Readonly<ActualMatchingMatchNewButtonProps>): import("react/jsx-runtime").JSX.Element;
5
+ export default ActualMatchingMatchNewButton;
@@ -0,0 +1,22 @@
1
+ import { ReactNode } from 'react';
2
+ import { MonthYearPeriod } from '@zeniai/client-epic-state';
3
+ import { ActualMatchingActionProps, ExpenseAutomationActualMatchingViewSelector } from './actualMatchingTypes';
4
+ export interface ActualMatchingPageProps extends ActualMatchingActionProps {
5
+ actualMatching: ExpenseAutomationActualMatchingViewSelector;
6
+ selectedPeriod: MonthYearPeriod;
7
+ /**
8
+ * Match quick view, named apart from the page-level `panelContent` that drives
9
+ * transaction and reconciliation. This section renders the split so the KPI
10
+ * strip stays full-width above it.
11
+ *
12
+ * There is no full-view flag: expanding leaves for the match's own page.
13
+ */
14
+ isMatchPanelOpen?: boolean;
15
+ matchPanelContent?: ReactNode;
16
+ }
17
+ export declare function ActualMatchingPageKpis({ actualMatching, selectedPeriod, }: Readonly<{
18
+ actualMatching: ExpenseAutomationActualMatchingViewSelector;
19
+ selectedPeriod: MonthYearPeriod;
20
+ }>): import("react/jsx-runtime").JSX.Element;
21
+ declare function ActualMatchingPage({ actualMatching, isMatchPanelOpen, matchPanelContent, onClearMatchNewModal, onCloseMatchNewModal, onMatchAndReverse, onOpenMatch, onOpenMatchNewModal, onSearchMatchAccruals, onSearchMatchTransactions, onUpdateActualMatchingUIState, selectedPeriod, }: Readonly<ActualMatchingPageProps>): import("react/jsx-runtime").JSX.Element;
22
+ export default ActualMatchingPage;
@@ -0,0 +1,3 @@
1
+ export declare function ActualMatchingKpiStripSkeleton(): import("react/jsx-runtime").JSX.Element;
2
+ declare function ActualMatchingPageSkeleton(): import("react/jsx-runtime").JSX.Element;
3
+ export default ActualMatchingPageSkeleton;
@@ -0,0 +1,12 @@
1
+ import { ActualMatchingMatchModalView, MatchAndReverseAccrualsParams, MatchNewFormData } from './actualMatchingTypes';
2
+ export interface MatchNewModalProps {
3
+ matchModal: ActualMatchingMatchModalView;
4
+ initialFormValues?: Partial<MatchNewFormData>;
5
+ onClearMatchNewModal: () => void;
6
+ onCloseMatchNewModal: () => void;
7
+ onMatchAndReverse: (params: MatchAndReverseAccrualsParams) => void;
8
+ onSearchMatchAccruals: (query: string, pageToken?: string) => void;
9
+ onSearchMatchTransactions: (query: string, pageToken?: string) => void;
10
+ }
11
+ declare function MatchNewModal({ initialFormValues, matchModal, onClearMatchNewModal, onCloseMatchNewModal, onMatchAndReverse, onSearchMatchAccruals, onSearchMatchTransactions, }: Readonly<MatchNewModalProps>): import("react/jsx-runtime").JSX.Element;
12
+ export default MatchNewModal;
@@ -0,0 +1,8 @@
1
+ import { JEOneTimeAccrual } from '@zeniai/client-epic-state';
2
+ import { ActualMatchingTransactionSearchResult } from './actualMatchingTypes';
3
+ export interface MatchNewPreviewProps {
4
+ selectedAccruals: JEOneTimeAccrual[];
5
+ selectedTransactions: ActualMatchingTransactionSearchResult[];
6
+ }
7
+ declare function MatchNewPreview({ selectedAccruals, selectedTransactions, }: Readonly<MatchNewPreviewProps>): import("react/jsx-runtime").JSX.Element;
8
+ export default MatchNewPreview;
@@ -0,0 +1,5 @@
1
+ export interface ReversesGroupedPillProps {
2
+ label: string;
3
+ }
4
+ declare function ReversesGroupedPill({ label }: Readonly<ReversesGroupedPillProps>): import("react/jsx-runtime").JSX.Element;
5
+ export default ReversesGroupedPill;
@@ -0,0 +1,76 @@
1
+ import { Amount, ExpenseAutomationViewSelector, MonthYearPeriod, SortOrder } from '@zeniai/client-epic-state';
2
+ import { StyledCapsuleThemeType } from '../../../common/StyledCapsule';
3
+ import { ActualMatchingColumnKey } from './actualMatchingListConfig';
4
+ import { ActualMatchingGroupedAccrual, ActualMatchingKpiSummary, ActualMatchingMatch, ActualMatchingRow, ActualMatchingSortKey, ActualMatchingTransactionSearchResult, ExpenseAutomationActualMatchingViewSelector } from './actualMatchingTypes';
5
+ export declare const EMPTY_ACTUAL_MATCHING_KPI_SUMMARY: ActualMatchingKpiSummary;
6
+ export declare const EMPTY_ACTUAL_MATCHING_VIEW: ExpenseAutomationActualMatchingViewSelector;
7
+ export declare function getActualMatchingFromSelector(selector: ExpenseAutomationViewSelector): ExpenseAutomationActualMatchingViewSelector;
8
+ export declare function getAccruedAmount(row: ActualMatchingRow): number;
9
+ export declare function getActualAmount(row: ActualMatchingRow): number | undefined;
10
+ export declare function getActualMatchingAmount(row: ActualMatchingRow): number;
11
+ export declare function getVariancePercent(row: ActualMatchingRow): number | undefined;
12
+ export declare function formatVariancePercent(percent: number): string;
13
+ export declare function getVarianceCapsuleType(percent: number): StyledCapsuleThemeType;
14
+ export declare function getMatchTierKey(row: ActualMatchingRow): string | undefined;
15
+ export declare function getMatchTierLabel(row: ActualMatchingRow): string;
16
+ export declare function getMatchTierCapsuleType(row: ActualMatchingRow): StyledCapsuleThemeType;
17
+ export declare function getActualMatchingTypeLabel(row: ActualMatchingRow): string;
18
+ export declare function getActualMatchingTypeCapsuleType(row: ActualMatchingRow): StyledCapsuleThemeType;
19
+ export declare function formatActualMatchingServiceMonth(serviceMonth: string): string;
20
+ export declare function formatActualMatchingServiceMonths(months: readonly string[]): string;
21
+ export declare function getActualMatchingServiceMonths(row: ActualMatchingRow): string[];
22
+ export declare function getActualMatchingServiceLabel(row: ActualMatchingRow): string;
23
+ export declare function getReceivedLabel(row: ActualMatchingRow): string;
24
+ export declare function getReversesGroupedCount(row: ActualMatchingRow): number;
25
+ export declare function isGroupedActualMatchingRow(row: ActualMatchingRow): boolean;
26
+ export declare function isGroupedAccrualMenuInteractive(_row: ActualMatchingRow): boolean;
27
+ export declare function getGroupedAccrualMenuItems(row: ActualMatchingRow): ActualMatchingGroupedAccrual[];
28
+ export declare function getReversesLabel(row: ActualMatchingRow): string;
29
+ export declare function getReversesTooltip(row: ActualMatchingRow): string;
30
+ export declare function isSameMatchVendor(transaction: {
31
+ vendorName: string;
32
+ vendorId?: string;
33
+ }, accrual: {
34
+ vendorName: string;
35
+ vendorId?: string;
36
+ }): boolean;
37
+ export declare function getAccruedDisplayAmount(row: ActualMatchingRow): Amount;
38
+ export declare function getActualDisplayAmount(row: ActualMatchingRow): Amount | undefined;
39
+ export declare function sumRowDisplayAmount(rows: ActualMatchingRow[]): Amount;
40
+ export declare function getActualMatchingDisplayCurrency(rows: ActualMatchingRow[]): Amount;
41
+ export declare function formatKpiAmount(amount: number, currency: Amount): string;
42
+ export declare function formatActualMatchingKpiMonth(period: MonthYearPeriod): string;
43
+ export declare function formatGroupAmountSubtitle(template: string, amount: Amount): string;
44
+ export declare function isAiCreatedAccrual(row: ActualMatchingRow): boolean;
45
+ export declare function isHumanReversedRow(row: ActualMatchingRow): boolean;
46
+ export declare function isAiReversedBy(row: ActualMatchingRow): boolean;
47
+ export declare function getReversedByLabel(row: ActualMatchingRow): string;
48
+ export declare function getColumnKeyForActualMatchingSortKey(sortKey: ActualMatchingSortKey): ActualMatchingColumnKey;
49
+ export declare function getActualMatchingColumnSortValue(row: ActualMatchingRow, columnKey: ActualMatchingColumnKey): string | number | null;
50
+ export declare function sortActualMatchingRowsByColumn(rows: ActualMatchingRow[], columnKey: ActualMatchingColumnKey, sortOrder: SortOrder): ActualMatchingRow[];
51
+ export declare function getUndoReversalAccrualIds(row: Pick<ActualMatchingRow, "accrualId" | "groupedMembers">): string[];
52
+ export declare function getMatchedBillTransaction(match: Pick<ActualMatchingMatch, "members" | "transactionType">): {
53
+ id: string;
54
+ type: string;
55
+ } | null;
56
+ export declare function getUndoReversalAccrualIdsFromMatch(match: Pick<ActualMatchingMatch, "members">): string[];
57
+ export declare function getLeftoverWarningTooltip(row: ActualMatchingRow): string;
58
+ export declare function pruneSelectionToVisibleResults(currentKeys: string[], visibleKeys: ReadonlySet<string>, searchFetchState: string): string[];
59
+ export declare function nextSelectedTransactionLines(currentKeys: string[], clickedKey: string, results: ActualMatchingTransactionSearchResult[]): string[];
60
+ export declare function pickPrefillTransactionLines(results: ActualMatchingTransactionSearchResult[], prefill?: {
61
+ actualAmount?: number;
62
+ consumedLineIds?: string[];
63
+ matchedLineId?: string;
64
+ matchedTransactionId?: string;
65
+ }): string[];
66
+ export declare function pickPrefillTransactionLine(results: ActualMatchingTransactionSearchResult[], prefill?: {
67
+ actualAmount?: number;
68
+ matchedLineId?: string;
69
+ matchedTransactionId?: string;
70
+ }): string | null;
71
+ export declare function shouldPromptSelectMatchLine({ isTxnSearchComplete, lineCount, openedFromMatchId, selectedLineKey, }: {
72
+ isTxnSearchComplete: boolean;
73
+ lineCount: number;
74
+ selectedLineKey: string | null;
75
+ openedFromMatchId?: string;
76
+ }): boolean;
@@ -0,0 +1,12 @@
1
+ import { ActualMatchingSortKey } from './actualMatchingTypes';
2
+ export type ActualMatchingColumnKey = "received" | "vendor" | "type" | "reversedBy" | "service" | "reverses" | "matchTier" | "accrued" | "actual" | "variance";
3
+ export interface ActualMatchingHeaderItem {
4
+ key: ActualMatchingColumnKey;
5
+ sortable: boolean;
6
+ value: string;
7
+ width: number;
8
+ sortKey?: ActualMatchingSortKey;
9
+ }
10
+ export declare function isActualMatchingNumericColumn(key: ActualMatchingColumnKey): boolean;
11
+ export declare function getActualMatchingColumns(isQuickViewMode?: boolean): ActualMatchingHeaderItem[];
12
+ export declare function buildActualMatchingGridTemplate(columns: ActualMatchingHeaderItem[]): string;
@@ -0,0 +1,18 @@
1
+ import { FetchState, JEOneTimeAccrual } from '@zeniai/client-epic-state';
2
+ import { ActualMatchingMatch, ActualMatchingRowKind } from './actualMatchingTypes';
3
+ export declare function getMatchServiceMonthsLabel(members: readonly JEOneTimeAccrual[]): string;
4
+ export declare function getMatchSubtitle(match: ActualMatchingMatch): string;
5
+ export declare function getMatchStatusLabel(kind: ActualMatchingRowKind, labels: {
6
+ statusAutoReversed: string;
7
+ statusManuallyReversed: string;
8
+ statusPendingReview: string;
9
+ }): string;
10
+ export declare function getMatchVariancePercent(match: ActualMatchingMatch): number | null;
11
+ export declare function formatMatchVarianceLabel(match: ActualMatchingMatch): string | null;
12
+ export declare function isMatchRefreshSpinning(match: ActualMatchingMatch | undefined, detailFetchState: FetchState, refreshStatus: FetchState): boolean;
13
+ export declare function getOpenMatchedTransactionLabel(transactionType: string, labels: {
14
+ openTransaction: string;
15
+ }): string;
16
+ export declare function getMatchedTransactionSectionTitle(transactionType: string, titles: {
17
+ matchedTransaction: string;
18
+ }): string;
@@ -0,0 +1,134 @@
1
+ import { ExpenseAutomationActualMatchingSortKey as ActualMatchingSortKey, ActualMatchingTransactionSearchResult, ExpenseAutomationActualMatchingViewUIState as ActualMatchingViewUIState, Amount, FetchStateAndError, ID, JEOneTimeAccrual, MatchAndReverseAccrualsParams, MatchAndReverseResult, MatchAndReverseResultStatus, UndoReversalAccrualsParams, UndoReversalResult, UndoReversalResultStatus, ZeniDate } from '@zeniai/client-epic-state';
2
+ export type { ActualMatchingSortKey, ActualMatchingTransactionSearchResult, ActualMatchingViewUIState, MatchAndReverseAccrualsParams, MatchAndReverseResult, MatchAndReverseResultStatus, UndoReversalAccrualsParams, UndoReversalResult, UndoReversalResultStatus, };
3
+ /**
4
+ * WC-only Actual Matching types (page tab, list row extensions, form, handlers).
5
+ * CES-owned result/params types are imported from `@zeniai/client-epic-state`.
6
+ */
7
+ export declare const ACTUAL_MATCHING_PAGE_TAB: "actual_matching";
8
+ export type ActualMatchingPageTab = typeof ACTUAL_MATCHING_PAGE_TAB;
9
+ export type ActualMatchingRowKind = "auto_reversed" | "pending_review" | "manually_reversed";
10
+ export type ActualMatchingCleared = NonNullable<JEOneTimeAccrual["cleared"]> & {
11
+ accrualIds?: ID[];
12
+ groupSum?: Amount;
13
+ };
14
+ export type ActualMatchingGroupedAccrual = {
15
+ accrualId: ID;
16
+ estimatedAmount?: Amount;
17
+ jeDebitAccountName?: string;
18
+ memo?: string;
19
+ serviceMonth?: string;
20
+ };
21
+ export type ActualMatchingRow = JEOneTimeAccrual & {
22
+ kind: ActualMatchingRowKind;
23
+ matchId: string;
24
+ accruedAmount?: Amount;
25
+ actualAmount?: Amount;
26
+ cleared?: ActualMatchingCleared;
27
+ groupedAccrualIds?: ID[];
28
+ groupedMembers?: ActualMatchingGroupedAccrual[];
29
+ intendedAccrualIds?: ID[];
30
+ leftovers?: ActualMatchingGroupedAccrual[];
31
+ matchShape?: string;
32
+ matchSuggestion?: JEOneTimeAccrual["matchSuggestion"] & {
33
+ matchedLineId?: string;
34
+ matchTier?: string;
35
+ };
36
+ matchTier?: string;
37
+ reversalDate?: ZeniDate;
38
+ reversedBy?: JEOneTimeAccrual["createdBy"];
39
+ transactionDate?: string;
40
+ transactionType?: string;
41
+ };
42
+ export interface ActualMatchingKpiSummary {
43
+ actualsReceived: {
44
+ count: number;
45
+ expectedCount: number;
46
+ vendorsPending: number;
47
+ };
48
+ autoReversed: {
49
+ clearedAmount: number;
50
+ count: number;
51
+ percent: number;
52
+ };
53
+ pendingReview: {
54
+ amount: number;
55
+ count: number;
56
+ estimatedMinutesToClear: number;
57
+ };
58
+ variance: {
59
+ averagePercentPerMatch: number;
60
+ netAmount: number;
61
+ percent: number;
62
+ };
63
+ }
64
+ export interface ActualMatchingMatchModalView {
65
+ accrualSearch: {
66
+ fetchState: FetchStateAndError;
67
+ isLoadingMore: boolean;
68
+ nextPageToken: string | null;
69
+ query: string;
70
+ results: JEOneTimeAccrual[];
71
+ };
72
+ confirmStatus: FetchStateAndError;
73
+ isOpen: boolean;
74
+ transactionSearch: {
75
+ fetchState: FetchStateAndError;
76
+ isLoadingMore: boolean;
77
+ nextPageToken: string | null;
78
+ query: string;
79
+ results: ActualMatchingTransactionSearchResult[];
80
+ };
81
+ lastBatchResults?: MatchAndReverseResult[];
82
+ openedFromMatchId?: string;
83
+ prefill?: {
84
+ selectedAccrualIds: string[];
85
+ actualAmount?: number;
86
+ consumedLineIds?: string[];
87
+ matchedLineId?: string;
88
+ matchedTransactionId?: string;
89
+ };
90
+ }
91
+ export interface ExpenseAutomationActualMatchingViewSelector {
92
+ fetchState: FetchStateAndError["fetchState"];
93
+ hasLoadedForSelectedPeriod: boolean;
94
+ kpiSummary: ActualMatchingKpiSummary;
95
+ matchModal: ActualMatchingMatchModalView;
96
+ pendingReview: ActualMatchingRow[];
97
+ refreshStatus: FetchStateAndError;
98
+ reversed: ActualMatchingRow[];
99
+ uiState: ActualMatchingViewUIState;
100
+ error?: FetchStateAndError["error"];
101
+ }
102
+ export interface ActualMatchingMatch {
103
+ accruedAmount: Amount;
104
+ actualAmount: Amount;
105
+ kind: ActualMatchingRowKind;
106
+ matchId: string;
107
+ members: JEOneTimeAccrual[];
108
+ transactionIntegrationId: ID;
109
+ transactionType: string;
110
+ leftovers?: JEOneTimeAccrual[];
111
+ matchShape?: string;
112
+ matchTier?: string;
113
+ transactionDate?: string;
114
+ vendorId?: ID;
115
+ vendorName?: string;
116
+ }
117
+ export interface ActualMatchingActionProps {
118
+ onClearMatchNewModal: () => void;
119
+ onCloseMatchNewModal: () => void;
120
+ onMatchAndReverse: (params: MatchAndReverseAccrualsParams) => void;
121
+ onOpenMatch: (matchId: string) => void;
122
+ onOpenMatchNewModal: (matchId?: string) => void;
123
+ onSearchMatchAccruals: (query: string, pageToken?: string) => void;
124
+ onSearchMatchTransactions: (query: string, pageToken?: string) => void;
125
+ onUpdateActualMatchingUIState?: (uiState: Partial<ActualMatchingViewUIState>) => void;
126
+ }
127
+ export declare const MATCH_NEW_FORM = "expenseAutomationMatchNew";
128
+ export type MatchNewFormData = {
129
+ selectedAccrualIds: string[];
130
+ selectedTransactionLines: string[];
131
+ };
132
+ export declare const MATCH_ACCRUAL_SELECTION_CAP = 50;
133
+ export declare function getTransactionLineKey(transactionId: string, lineId: string): string;
134
+ export declare function isActualMatchingPageTab(tab: string | undefined): tab is ActualMatchingPageTab;
@@ -0,0 +1,12 @@
1
+ import { JEOneTimeAccrual, ZeniDate } from '@zeniai/client-epic-state';
2
+ import { ActualMatchingTransactionSearchResult } from './actualMatchingTypes';
3
+ export declare function formatServiceMonthLabel(serviceMonth: string): string;
4
+ export declare function formatAccrualJeDate(serviceMonth: string, lastDayLabel: string): string;
5
+ export declare function formatJeShortDate(dateValue: string): string;
6
+ export declare function formatReversalJeDate(reversalPostingDate?: ZeniDate): string;
7
+ export declare function sumAccruedAmount(accruals: readonly JEOneTimeAccrual[]): number;
8
+ export declare function variancePercent(transactionAmount: number, accruedAmount: number): number | null;
9
+ export declare function uniqueServiceMonthLabel(accruals: readonly JEOneTimeAccrual[]): string | null;
10
+ export declare function transactionMatchLabel(transaction: ActualMatchingTransactionSearchResult, accruals: readonly JEOneTimeAccrual[]): string;
11
+ export declare function creditAccountName(accrual: JEOneTimeAccrual, fallback: string): string;
12
+ export declare function debitAccountName(accrual: JEOneTimeAccrual, fallback: string): string;
@@ -0,0 +1,10 @@
1
+ import { FetchState } from '@zeniai/client-epic-state';
2
+ import { ActualMatchingMatch } from '../actualMatchingTypes';
3
+ export interface ActualMatchingTabQuickViewProps {
4
+ detailFetchState?: FetchState;
5
+ initiallyOpen?: boolean;
6
+ match?: ActualMatchingMatch;
7
+ refreshStatus?: FetchState;
8
+ onOpenChange?: (isOpen: boolean) => void;
9
+ }
10
+ export declare function ActualMatchingTabQuickView({ detailFetchState, initiallyOpen, match: initialMatch, refreshStatus, onOpenChange, }: Readonly<ActualMatchingTabQuickViewProps>): import("react/jsx-runtime").JSX.Element;
@@ -1,9 +1,10 @@
1
1
  import { ExpenseAutomationViewSelector, FetchStateAndError, NestedAccountHierarchyForReport, NestedClassHierarchyForReport, NewAccrualAccountsView, NewOneTimeAccrualLocalData, ScheduleDetailsLocalDataAccruedExpenses, ScheduleTransaction, TransactionID, ZeniDate } from '@zeniai/client-epic-state';
2
2
  import { FooterFormIdType } from '../../common';
3
+ import { ActualMatchingActionProps } from '../actualMatching/actualMatchingTypes';
3
4
  import { FormData as JEScheduleAccountSettingsFormData } from './common/JEScheduleAccountSettings';
4
5
  import { JESchedulesSectionProps } from './sections/JESchedulesSection';
5
6
  import { NewScheduleSaveFormValues } from './sections/NewJEScheduleSection';
6
- export interface JESchedulePageProps extends Omit<JESchedulesSectionProps, "jeSchedules" | "isAccountingClassesEnabled" | "isPanelOpen" | "panelContent" | "pendingDiscardConfirmation"> {
7
+ export interface JESchedulePageProps extends Omit<JESchedulesSectionProps, "jeSchedules" | "isAccountingClassesEnabled" | "isPanelOpen" | "panelContent" | "pendingDiscardConfirmation">, Partial<ActualMatchingActionProps> {
7
8
  accountListNestedAccountHierarchy: NestedAccountHierarchyForReport[];
8
9
  baseTransactionSearchFetchState: FetchStateAndError;
9
10
  baseTransactionSearchResults: ScheduleTransaction[];
@@ -23,6 +24,12 @@ export interface JESchedulePageProps extends Omit<JESchedulesSectionProps, "jeSc
23
24
  /** The draft this form was last left with, for a host that stores it. */
24
25
  /** Cron-2's live gate for this company. Off hides one-time accrual creation. */
25
26
  isAccrualEnabled?: boolean;
27
+ /**
28
+ * Match quick view, named apart from page-level `panelContent` the same way
29
+ * `schedulePanelContent` is. Actual Matching renders its own SidePanelLayout
30
+ * so the KPI strip stays full-width above the split.
31
+ */
32
+ isMatchPanelOpen?: boolean;
26
33
  /**
27
34
  * Schedule side panel, named apart from the page-level `panelContent` that drives the
28
35
  * transaction and reconciliation panels: ExpenseAutomationPage spreads its own props into
@@ -31,6 +38,7 @@ export interface JESchedulePageProps extends Omit<JESchedulesSectionProps, "jeSc
31
38
  * There is no full-view flag: expanding leaves for the schedule's own page.
32
39
  */
33
40
  isSchedulePanelOpen?: boolean;
41
+ matchPanelContent?: React.ReactNode;
34
42
  newAccrualAccountsView?: NewAccrualAccountsView;
35
43
  newScheduleLocalData?: NewScheduleSaveFormValues;
36
44
  schedulePanelContent?: React.ReactNode;
@@ -51,5 +59,5 @@ export interface JESchedulePageProps extends Omit<JESchedulesSectionProps, "jeSc
51
59
  setResetJeAccountSettingsForm: (resetFn: () => void) => void;
52
60
  onNewScheduleFormChange?: (scheduleType: string, formValues: NewScheduleSaveFormValues) => void;
53
61
  }
54
- declare function JESchedulePage({ accountListNestedAccountHierarchy, baseTransactionSearchFetchState, baseTransactionSearchResults, classListNestedAccountHierarchy, expenseAutomationViewSelector, currentFooterFormId, isAccountingClassesEnabled, isCreatingNewSchedule, newScheduleSaveStatus, allDepreciationAccountListNestedAccountHierarchy, closeMonth, initialScheduleDetailsMode, initialScheduleType, newAccrualAccountsView, onCreateAccruedSchedule, onCreateOneTimeAccrual, setResetJeAccountSettingsForm, vendorSearchAutoCompleteData, onJESchedulesFormDataChange, onPostJESchedule, handleJeScheduleClick, onOneTimeAccrualClick, onOneTimeAccrualFeedback, onJeAccountSettingsChange, onSaveJeAccountSettingsClick, onSaveSchedule, onScheduleTypeChange, onSearchBaseTransaction, onViewTransaction, newScheduleLocalData, initialSelectedBaseTransaction, isAccrualEnabled, onNewScheduleFormChange, ignoreRecommendedJeSchedule, vendorSearchAutoCompleteActions, isSchedulePanelOpen, schedulePanelContent, schedulePendingDiscardConfirmation, setCurrentFooterFormId, setIsCreatingNewSchedule, setIsJeAccountSettingsOpened, onRevertJeSchedule, onToggleCreatedGroupCollapsed, onTogglePendingGroupCollapsed, onUpdateJEScheduleTypeFilter, onUpdateJESchedulesUIState, }: Readonly<JESchedulePageProps>): import("react/jsx-runtime").JSX.Element;
62
+ declare function JESchedulePage({ accountListNestedAccountHierarchy, baseTransactionSearchFetchState, baseTransactionSearchResults, classListNestedAccountHierarchy, expenseAutomationViewSelector, currentFooterFormId, isAccountingClassesEnabled, isCreatingNewSchedule, newScheduleSaveStatus, allDepreciationAccountListNestedAccountHierarchy, closeMonth, initialScheduleDetailsMode, initialScheduleType, newAccrualAccountsView, onCreateAccruedSchedule, onCreateOneTimeAccrual, setResetJeAccountSettingsForm, vendorSearchAutoCompleteData, onJESchedulesFormDataChange, onPostJESchedule, handleJeScheduleClick, onOneTimeAccrualClick, onOneTimeAccrualFeedback, onJeAccountSettingsChange, onSaveJeAccountSettingsClick, onSaveSchedule, onScheduleTypeChange, onSearchBaseTransaction, onViewTransaction, newScheduleLocalData, initialSelectedBaseTransaction, isAccrualEnabled, onNewScheduleFormChange, ignoreRecommendedJeSchedule, vendorSearchAutoCompleteActions, isMatchPanelOpen, isSchedulePanelOpen, matchPanelContent, schedulePanelContent, schedulePendingDiscardConfirmation, setCurrentFooterFormId, setIsCreatingNewSchedule, setIsJeAccountSettingsOpened, onRevertJeSchedule, onToggleCreatedGroupCollapsed, onTogglePendingGroupCollapsed, onUpdateJEScheduleTypeFilter, onUpdateJESchedulesUIState, onClearMatchNewModal, onCloseMatchNewModal, onMatchAndReverse, onOpenMatch, onOpenMatchNewModal, onSearchMatchAccruals, onSearchMatchTransactions, onUpdateActualMatchingUIState, }: Readonly<JESchedulePageProps>): import("react/jsx-runtime").JSX.Element;
55
63
  export default JESchedulePage;
@@ -2,7 +2,8 @@ export interface JEGroupSectionHeaderProps {
2
2
  count: number;
3
3
  isCollapsed: boolean;
4
4
  title: string;
5
+ subtitle?: string;
5
6
  onToggle: () => void;
6
7
  }
7
- declare function JEGroupSectionHeader({ title, count, isCollapsed, onToggle, }: Readonly<JEGroupSectionHeaderProps>): import("react/jsx-runtime").JSX.Element;
8
+ declare function JEGroupSectionHeader({ title, count, isCollapsed, onToggle, subtitle, }: Readonly<JEGroupSectionHeaderProps>): import("react/jsx-runtime").JSX.Element;
8
9
  export default JEGroupSectionHeader;
@@ -0,0 +1,2 @@
1
+ import { ActualMatchingActionProps } from '../sections/actualMatching/actualMatchingTypes';
2
+ export declare const actualMatchingPageStoryActions: ActualMatchingActionProps;
@@ -0,0 +1,8 @@
1
+ export interface PdfColumnLimitPopupProps {
2
+ maxColumns: number;
3
+ selectedColumns: number;
4
+ onCancel: () => void;
5
+ onDownloadExcel: () => void;
6
+ }
7
+ declare const PdfColumnLimitPopup: ({ maxColumns, selectedColumns, onCancel, onDownloadExcel, }: Readonly<PdfColumnLimitPopupProps>) => import("react/jsx-runtime").JSX.Element;
8
+ export default PdfColumnLimitPopup;