@zeniai/client-epic-state 4.19.37-betaAS2 → 4.19.37-betaVR10

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 (70) hide show
  1. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  2. package/lib/entity/snackbar/snackbarTypes.js +1 -0
  3. package/lib/epic.d.ts +10 -1
  4. package/lib/epic.js +10 -1
  5. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
  6. package/lib/esm/epic.js +10 -1
  7. package/lib/esm/index.js +8 -6
  8. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +24 -0
  9. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +49 -0
  10. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +31 -0
  11. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +41 -0
  12. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +57 -0
  13. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +31 -0
  14. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +39 -0
  15. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +27 -0
  16. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +44 -0
  17. package/lib/esm/view/expenseAutomationView/payload/missingReceiptsPayload.js +96 -1
  18. package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +280 -1
  19. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +134 -1
  20. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +1 -10
  21. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +2 -4
  22. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +2 -5
  23. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +1 -10
  24. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +2 -4
  25. package/lib/esm/zeniAPI.js +41 -3
  26. package/lib/index.d.ts +11 -9
  27. package/lib/index.js +60 -32
  28. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.d.ts +15 -0
  29. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +28 -0
  30. package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.d.ts +7 -0
  31. package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +53 -0
  32. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.d.ts +8 -0
  33. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +35 -0
  34. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.d.ts +7 -0
  35. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +45 -0
  36. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.d.ts +8 -0
  37. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +61 -0
  38. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.d.ts +8 -0
  39. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +35 -0
  40. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.d.ts +9 -0
  41. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +44 -0
  42. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.d.ts +6 -0
  43. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +31 -0
  44. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +8 -0
  45. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +49 -0
  46. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  47. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +98 -0
  48. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +102 -0
  49. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +53 -3
  50. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +281 -2
  51. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +64 -1
  52. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.d.ts +1 -1
  53. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +133 -0
  54. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +106 -0
  55. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.d.ts +1 -1
  56. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +2 -11
  57. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +2 -4
  58. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelectorTypes.d.ts +0 -2
  59. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewState.d.ts +0 -1
  60. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.d.ts +0 -1
  61. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +2 -5
  62. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonState.d.ts +0 -2
  63. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.d.ts +1 -1
  64. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +2 -11
  65. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector.js +2 -4
  66. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelectorTypes.d.ts +0 -2
  67. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewState.d.ts +0 -1
  68. package/lib/zeniAPI.d.ts +9 -0
  69. package/lib/zeniAPI.js +40 -2
  70. package/package.json +2 -2
@@ -1,5 +1,8 @@
1
+ import { URLPayload } from '../../../commonPayloadTypes/urlPayload';
1
2
  import { TransactionPayload } from '../../../entity/transaction/payloadTypes/transactionPayload';
3
+ import { SupportedTransactionPayload } from '../../../entity/transaction/transactionState';
2
4
  import { ZeniAPIResponse } from '../../../responsePayload';
5
+ import type { BatchDetails, BatchFile, BatchListItem, BatchSummary, ManualSearchResult } from '../types/missingReceiptsViewState';
3
6
  export interface MissingReceiptsQueryPayload {
4
7
  end_date: string;
5
8
  is_attachment_missing_only: boolean;
@@ -13,4 +16,99 @@ interface MissingReceiptsPayload {
13
16
  transactions: TransactionPayload[];
14
17
  }
15
18
  export type MissingReceiptsResponse = ZeniAPIResponse<MissingReceiptsPayload>;
19
+ export interface BulkUploadResponsePayload {
20
+ batch_id: string;
21
+ status: string;
22
+ total_files: number;
23
+ }
24
+ export type BulkUploadResponse = ZeniAPIResponse<BulkUploadResponsePayload>;
25
+ export interface BatchListResponsePayload {
26
+ batches: BatchListItemPayload[];
27
+ }
28
+ export interface BatchListItemPayload {
29
+ batch_id: string;
30
+ created_at: string;
31
+ failed_count: number;
32
+ matched_count: number;
33
+ no_match_count: number;
34
+ possible_matches_count: number;
35
+ status: string;
36
+ total_files: number;
37
+ }
38
+ export type BatchListResponse = ZeniAPIResponse<BatchListResponsePayload>;
39
+ export interface MatchedTransactionPayload {
40
+ amount: number;
41
+ currency_code: string;
42
+ transaction_date: string | null;
43
+ transaction_id: string;
44
+ vendor_name: string;
45
+ transaction_type?: string;
46
+ vendor_logo?: URLPayload | null;
47
+ }
48
+ export interface MatchCandidatePayload extends MatchedTransactionPayload {
49
+ match_score: number;
50
+ }
51
+ export interface BatchFilePayload {
52
+ attachment_id: string;
53
+ file_id: string;
54
+ file_preview_url: string | null;
55
+ filename: string;
56
+ status: string;
57
+ candidates?: MatchCandidatePayload[];
58
+ match_source?: string;
59
+ matched_transaction?: MatchedTransactionPayload;
60
+ }
61
+ export interface BatchDetailsResponsePayload {
62
+ batch_id: string;
63
+ created_at: string;
64
+ files: BatchFilePayload[];
65
+ status: string;
66
+ summary: {
67
+ failed: number;
68
+ matched: number;
69
+ no_match: number;
70
+ possible_matches: number;
71
+ total: number;
72
+ };
73
+ }
74
+ export type BatchDetailsResponse = ZeniAPIResponse<BatchDetailsResponsePayload>;
75
+ export declare function toBatchFile(payload: BatchFilePayload, filesEndPoint?: string): BatchFile;
76
+ export declare function extractTransactionPayloadsFromBatchFiles(files: BatchFilePayload[]): SupportedTransactionPayload[];
77
+ export declare function toBatchSummary(payload: BatchDetailsResponsePayload['summary']): BatchSummary;
78
+ export declare function toBatchDetails(payload: BatchDetailsResponsePayload, filesEndPoint?: string): BatchDetails;
79
+ export declare function toBatchListItem(payload: BatchListItemPayload): BatchListItem;
80
+ export interface TransactionSearchQueryPayload {
81
+ search_text: string;
82
+ search_fields?: string[];
83
+ }
84
+ export interface TransactionSearchItemPayload {
85
+ amount: number;
86
+ currency: string;
87
+ entity_id: string;
88
+ memo: string;
89
+ transaction_date: string;
90
+ transaction_id: string;
91
+ transaction_type: string;
92
+ vendor_name: string;
93
+ }
94
+ export interface TransactionSearchResponsePayload {
95
+ transactions: TransactionSearchItemPayload[];
96
+ }
97
+ export type TransactionSearchResponse = ZeniAPIResponse<TransactionSearchResponsePayload>;
98
+ export declare function toManualSearchResult(payload: TransactionSearchItemPayload): ManualSearchResult;
99
+ export interface CompletedTransactionsQueryPayload {
100
+ end_date?: string;
101
+ match_type?: string;
102
+ page_size?: number;
103
+ page_token?: string | null;
104
+ sort_by?: string;
105
+ sort_order?: string;
106
+ start_date?: string;
107
+ }
108
+ export interface CompletedTransactionsResponsePayload {
109
+ next_page_token: string | null;
110
+ total_count: number;
111
+ transactions: SupportedTransactionPayload[];
112
+ }
113
+ export type CompletedTransactionsResponse = ZeniAPIResponse<CompletedTransactionsResponsePayload>;
16
114
  export {};
@@ -1,2 +1,104 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toBatchFile = toBatchFile;
4
+ exports.extractTransactionPayloadsFromBatchFiles = extractTransactionPayloadsFromBatchFiles;
5
+ exports.toBatchSummary = toBatchSummary;
6
+ exports.toBatchDetails = toBatchDetails;
7
+ exports.toBatchListItem = toBatchListItem;
8
+ exports.toManualSearchResult = toManualSearchResult;
9
+ const urlPayload_1 = require("../../../commonPayloadTypes/urlPayload");
10
+ // -- Converter functions --
11
+ function toBatchFile(payload, filesEndPoint) {
12
+ return {
13
+ attachmentId: payload.attachment_id,
14
+ candidates: payload.candidates?.map((c) => ({
15
+ transactionId: c.transaction_id,
16
+ matchScore: c.match_score,
17
+ })),
18
+ fileDownloadUrl: payload.file_id != null && filesEndPoint != null
19
+ ? `${filesEndPoint}/1.0/files/${payload.file_id}?query=${encodeURIComponent(JSON.stringify({ download_file: true }))}`
20
+ : null,
21
+ fileId: payload.file_id,
22
+ filePreviewUrl: payload.file_preview_url,
23
+ filename: payload.filename,
24
+ matchSource: payload.match_source,
25
+ matchedTransactionId: payload.matched_transaction?.transaction_id,
26
+ status: payload.status,
27
+ };
28
+ }
29
+ function extractTransactionPayloadsFromBatchFiles(files) {
30
+ const seen = new Set();
31
+ const payloads = [];
32
+ for (const file of files) {
33
+ if (file.matched_transaction != null) {
34
+ const id = file.matched_transaction.transaction_id;
35
+ if (!seen.has(id)) {
36
+ seen.add(id);
37
+ payloads.push(matchedTransactionPayloadToSupportedTransactionPayload(file.matched_transaction));
38
+ }
39
+ }
40
+ if (file.candidates != null) {
41
+ for (const candidate of file.candidates) {
42
+ const id = candidate.transaction_id;
43
+ if (!seen.has(id)) {
44
+ seen.add(id);
45
+ payloads.push(matchedTransactionPayloadToSupportedTransactionPayload(candidate));
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return payloads;
51
+ }
52
+ function matchedTransactionPayloadToSupportedTransactionPayload(payload) {
53
+ return {
54
+ transaction_id: payload.transaction_id,
55
+ transaction_type: payload.transaction_type ?? 'expense',
56
+ transaction_date: payload.transaction_date ?? '',
57
+ currency_code: payload.currency_code,
58
+ total_amount: payload.amount,
59
+ vendor_name: payload.vendor_name,
60
+ logo: payload.vendor_logo == null ? undefined : (0, urlPayload_1.toURL)(payload.vendor_logo),
61
+ };
62
+ }
63
+ function toBatchSummary(payload) {
64
+ return {
65
+ failed: payload.failed,
66
+ matched: payload.matched,
67
+ noMatch: payload.no_match,
68
+ possibleMatches: payload.possible_matches,
69
+ total: payload.total,
70
+ };
71
+ }
72
+ function toBatchDetails(payload, filesEndPoint) {
73
+ return {
74
+ batchId: payload.batch_id,
75
+ createdAt: payload.created_at,
76
+ files: payload.files.map((f) => toBatchFile(f, filesEndPoint)),
77
+ status: payload.status,
78
+ summary: toBatchSummary(payload.summary),
79
+ };
80
+ }
81
+ function toBatchListItem(payload) {
82
+ return {
83
+ batchId: payload.batch_id,
84
+ createdAt: payload.created_at,
85
+ failedCount: payload.failed_count,
86
+ matchedCount: payload.matched_count,
87
+ noMatchCount: payload.no_match_count,
88
+ possibleMatchesCount: payload.possible_matches_count,
89
+ status: payload.status,
90
+ totalFiles: payload.total_files,
91
+ };
92
+ }
93
+ function toManualSearchResult(payload) {
94
+ return {
95
+ amount: payload.amount,
96
+ currencyCode: payload.currency,
97
+ entityId: payload.entity_id,
98
+ memo: payload.memo,
99
+ transactionDate: payload.transaction_date,
100
+ transactionId: payload.transaction_id,
101
+ transactionType: payload.transaction_type,
102
+ vendorName: payload.vendor_name,
103
+ };
104
+ }
@@ -1,10 +1,12 @@
1
1
  import { Amount } from '../../../commonStateTypes/amount';
2
- import { FetchStateAndError, UpdateType } from '../../../commonStateTypes/common';
2
+ import { FetchStateAndError, ID, UpdateType } from '../../../commonStateTypes/common';
3
+ import { SortOrder } from '../../../commonStateTypes/selectorTypes/sortOrderTypes';
3
4
  import { MonthYearPeriod, TimePeriod } from '../../../commonStateTypes/timePeriod';
4
5
  import { TransactionPayload } from '../../../entity/transaction/payloadTypes/transactionPayload';
5
6
  import { SupportedTransactionPayload } from '../../../entity/transaction/transactionState';
6
7
  import { ZeniAPIStatus } from '../../../responsePayload';
7
- import { MissingReceiptsViewState, MissingReceiptsViewUIState } from '../types/missingReceiptsViewState';
8
+ import type { BatchDetails, BatchListItem, BatchStatus, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CompletedSubTab, ManualSearchResult, MissingReceiptsViewState, MissingReceiptsViewUIState } from '../types/missingReceiptsViewState';
9
+ export declare const initialBulkUploadState: BulkUploadState;
8
10
  export declare const initialState: MissingReceiptsViewState;
9
11
  export declare const fetchMissingReceipts: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[period: TimePeriod, minimumTransactionAmount: Amount, cacheOverride?: any, refreshViewInBackground?: any], {
10
12
  period: TimePeriod;
@@ -26,6 +28,54 @@ export declare const fetchMissingReceipts: import("@reduxjs/toolkit").ActionCrea
26
28
  }, "expenseAutomationMissingReceiptsView/updateMissingReceiptUploadState", never, never>, updateMissingReceiptsUIState: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<MissingReceiptsViewUIState>, "expenseAutomationMissingReceiptsView/updateMissingReceiptsUIState">, markMissingReceiptAsDone: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[transactionPayload: SupportedTransactionPayload, selectedPeriod: MonthYearPeriod], {
27
29
  transactionPayload: SupportedTransactionPayload;
28
30
  selectedPeriod: MonthYearPeriod;
29
- }, "expenseAutomationMissingReceiptsView/markMissingReceiptAsDone", never, never>, clearExpenseAutomationMissingReceiptsView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/clearExpenseAutomationMissingReceiptsView">;
31
+ }, "expenseAutomationMissingReceiptsView/markMissingReceiptAsDone", never, never>, clearExpenseAutomationMissingReceiptsView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/clearExpenseAutomationMissingReceiptsView">, bulkUploadReceipts: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[files: File[]], {
32
+ files: File[];
33
+ }, "expenseAutomationMissingReceiptsView/bulkUploadReceipts", never, never>, updateBulkUploadProgress: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "expenseAutomationMissingReceiptsView/updateBulkUploadProgress">, bulkUploadReceiptsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
34
+ batchId: ID;
35
+ }, "expenseAutomationMissingReceiptsView/bulkUploadReceiptsSuccess">, bulkUploadReceiptsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
36
+ error: ZeniAPIStatus;
37
+ }, "expenseAutomationMissingReceiptsView/bulkUploadReceiptsFailure">, pusherBatchStatusUpdate: import("@reduxjs/toolkit").ActionCreatorWithPayload<BatchStatus, "expenseAutomationMissingReceiptsView/pusherBatchStatusUpdate">, fetchBulkUploadBatchDetails: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/fetchBulkUploadBatchDetails">, fetchBulkUploadBatchDetailsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<BatchDetails, "expenseAutomationMissingReceiptsView/fetchBulkUploadBatchDetailsSuccess">, fetchBulkUploadBatchDetailsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
38
+ error: ZeniAPIStatus;
39
+ }, "expenseAutomationMissingReceiptsView/fetchBulkUploadBatchDetailsFailure">, storeBatchDetails: import("@reduxjs/toolkit").ActionCreatorWithPayload<BatchDetails, "expenseAutomationMissingReceiptsView/storeBatchDetails">, fetchMoreBatchDetails: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/fetchMoreBatchDetails">, fetchMoreBatchDetailsComplete: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/fetchMoreBatchDetailsComplete">, fetchMoreBatchDetailsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
40
+ error: ZeniAPIStatus;
41
+ }, "expenseAutomationMissingReceiptsView/fetchMoreBatchDetailsFailure">, fetchBulkUploadBatches: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[cacheOverride?: any], {
42
+ cacheOverride: any;
43
+ }, "expenseAutomationMissingReceiptsView/fetchBulkUploadBatches", never, never>, fetchBulkUploadBatchesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
44
+ batchList: BatchListItem[];
45
+ selectedPeriod: MonthYearPeriod;
46
+ }, "expenseAutomationMissingReceiptsView/fetchBulkUploadBatchesSuccess">, fetchBulkUploadBatchesFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
47
+ error: ZeniAPIStatus;
48
+ selectedPeriod: MonthYearPeriod;
49
+ }, "expenseAutomationMissingReceiptsView/fetchBulkUploadBatchesFailure">, confirmBulkUploadMatch: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[batchId: string, attachmentId: string, transactionId: string, transactionType: string, fileName: string], {
50
+ batchId: string;
51
+ attachmentId: string;
52
+ transactionId: string;
53
+ transactionType: string;
54
+ fileName: string;
55
+ }, "expenseAutomationMissingReceiptsView/confirmBulkUploadMatch", never, never>, confirmBulkUploadMatchSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
56
+ attachmentId: ID;
57
+ batchId: ID;
58
+ transactionId: ID;
59
+ }, "expenseAutomationMissingReceiptsView/confirmBulkUploadMatchSuccess">, confirmBulkUploadMatchFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
60
+ error: ZeniAPIStatus;
61
+ }, "expenseAutomationMissingReceiptsView/confirmBulkUploadMatchFailure">, setBulkUploadResultsTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<BulkUploadResultsTab, "expenseAutomationMissingReceiptsView/setBulkUploadResultsTab">, setBulkUploadCompletedSubTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<CompletedSubTab, "expenseAutomationMissingReceiptsView/setBulkUploadCompletedSubTab">, setBulkUploadSortConfig: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
62
+ sortKey: BulkUploadSortKey;
63
+ sortOrder: SortOrder;
64
+ }, "expenseAutomationMissingReceiptsView/setBulkUploadSortConfig">, clearBulkUpload: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/clearBulkUpload">, searchTransactionsForManualMatch: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[query: string], {
65
+ query: string;
66
+ }, "expenseAutomationMissingReceiptsView/searchTransactionsForManualMatch", never, never>, searchTransactionsForManualMatchSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<ManualSearchResult[], "expenseAutomationMissingReceiptsView/searchTransactionsForManualMatchSuccess">, searchTransactionsForManualMatchFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
67
+ error: ZeniAPIStatus;
68
+ }, "expenseAutomationMissingReceiptsView/searchTransactionsForManualMatchFailure">, clearManualSearchResults: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/clearManualSearchResults">, fetchCompletedTransactions: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[pageToken?: string | undefined], {
69
+ pageToken: string | undefined;
70
+ }, "expenseAutomationMissingReceiptsView/fetchCompletedTransactions", never, never>, fetchCompletedTransactionsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
71
+ isInitialLoad: boolean;
72
+ nextPageToken: string | null;
73
+ selectedPeriod: MonthYearPeriod;
74
+ totalCount: number;
75
+ transactionIds: ID[];
76
+ }, "expenseAutomationMissingReceiptsView/fetchCompletedTransactionsSuccess">, fetchCompletedTransactionsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
77
+ error: ZeniAPIStatus;
78
+ selectedPeriod: MonthYearPeriod;
79
+ }, "expenseAutomationMissingReceiptsView/fetchCompletedTransactionsFailure">;
30
80
  declare const _default: import("redux").Reducer<MissingReceiptsViewState>;
31
81
  export default _default;
@@ -1,10 +1,33 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearExpenseAutomationMissingReceiptsView = exports.markMissingReceiptAsDone = exports.updateMissingReceiptsUIState = exports.updateMissingReceiptUploadState = exports.uploadMissingReceiptSuccess = exports.fetchMissingReceiptsFailure = exports.fetchMissingReceiptsSuccess = exports.fetchMissingReceipts = exports.initialState = void 0;
4
+ exports.fetchCompletedTransactionsFailure = exports.fetchCompletedTransactionsSuccess = exports.fetchCompletedTransactions = exports.clearManualSearchResults = exports.searchTransactionsForManualMatchFailure = exports.searchTransactionsForManualMatchSuccess = exports.searchTransactionsForManualMatch = exports.clearBulkUpload = exports.setBulkUploadSortConfig = exports.setBulkUploadCompletedSubTab = exports.setBulkUploadResultsTab = exports.confirmBulkUploadMatchFailure = exports.confirmBulkUploadMatchSuccess = exports.confirmBulkUploadMatch = exports.fetchBulkUploadBatchesFailure = exports.fetchBulkUploadBatchesSuccess = exports.fetchBulkUploadBatches = exports.fetchMoreBatchDetailsFailure = exports.fetchMoreBatchDetailsComplete = exports.fetchMoreBatchDetails = exports.storeBatchDetails = exports.fetchBulkUploadBatchDetailsFailure = exports.fetchBulkUploadBatchDetailsSuccess = exports.fetchBulkUploadBatchDetails = exports.pusherBatchStatusUpdate = exports.bulkUploadReceiptsFailure = exports.bulkUploadReceiptsSuccess = exports.updateBulkUploadProgress = exports.bulkUploadReceipts = exports.clearExpenseAutomationMissingReceiptsView = exports.markMissingReceiptAsDone = exports.updateMissingReceiptsUIState = exports.updateMissingReceiptUploadState = exports.uploadMissingReceiptSuccess = exports.fetchMissingReceiptsFailure = exports.fetchMissingReceiptsSuccess = exports.fetchMissingReceipts = exports.initialState = exports.initialBulkUploadState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
7
+ exports.initialBulkUploadState = {
8
+ batchDetailsById: {},
9
+ batchDetailsPaginationState: { fetchState: 'Not-Started', error: undefined },
10
+ batchListByPeriod: {},
11
+ batchListFetchState: { fetchState: 'Not-Started', error: undefined },
12
+ batchStatusById: {},
13
+ completedSubTab: 'all',
14
+ completedTransactionsByPeriod: {},
15
+ confirmMatchStatus: { fetchState: 'Not-Started', error: undefined },
16
+ currentBatchId: undefined,
17
+ currentResultsTab: 'unmatched',
18
+ manualSearch: {
19
+ fetchState: { fetchState: 'Not-Started', error: undefined },
20
+ results: [],
21
+ searchQuery: '',
22
+ },
23
+ phase: 'idle',
24
+ sortKey: 'date',
25
+ sortOrder: 'descending',
26
+ uploadProgress: 0,
27
+ uploadStatus: { fetchState: 'Not-Started', error: undefined },
28
+ };
7
29
  exports.initialState = {
30
+ bulkUpload: exports.initialBulkUploadState,
8
31
  uploadReceiptStatusById: {},
9
32
  refreshStatus: {
10
33
  fetchState: 'Not-Started',
@@ -124,7 +147,263 @@ const expenseAutomationMissingReceiptsView = (0, toolkit_1.createSlice)({
124
147
  clearExpenseAutomationMissingReceiptsView(draft) {
125
148
  Object.assign(draft, exports.initialState);
126
149
  },
150
+ // -- Bulk Upload Actions --
151
+ bulkUploadReceipts: {
152
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
153
+ reducer(draft, _action) {
154
+ draft.bulkUpload.phase = 'uploading';
155
+ draft.bulkUpload.uploadProgress = 0;
156
+ draft.bulkUpload.uploadStatus = {
157
+ fetchState: 'In-Progress',
158
+ error: undefined,
159
+ };
160
+ },
161
+ prepare(files) {
162
+ return { payload: { files } };
163
+ },
164
+ },
165
+ updateBulkUploadProgress(draft, action) {
166
+ draft.bulkUpload.uploadProgress = action.payload;
167
+ },
168
+ bulkUploadReceiptsSuccess(draft, action) {
169
+ draft.bulkUpload.currentBatchId = action.payload.batchId;
170
+ draft.bulkUpload.uploadStatus = {
171
+ fetchState: 'Completed',
172
+ error: undefined,
173
+ };
174
+ draft.bulkUpload.phase = 'matching';
175
+ },
176
+ bulkUploadReceiptsFailure(draft, action) {
177
+ draft.bulkUpload.uploadStatus = {
178
+ fetchState: 'Error',
179
+ error: action.payload.error,
180
+ };
181
+ draft.bulkUpload.phase = 'idle';
182
+ },
183
+ pusherBatchStatusUpdate(draft, action) {
184
+ const batchStatus = action.payload;
185
+ draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
186
+ },
187
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
188
+ fetchBulkUploadBatchDetails(_draft) {
189
+ // trigger epic, no state change needed
190
+ },
191
+ fetchBulkUploadBatchDetailsSuccess(draft, action) {
192
+ const details = action.payload;
193
+ draft.bulkUpload.batchDetailsById[details.batchId] = details;
194
+ draft.bulkUpload.phase = 'completed';
195
+ },
196
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
197
+ fetchBulkUploadBatchDetailsFailure(draft, _action) {
198
+ draft.bulkUpload.phase = 'completed';
199
+ },
200
+ storeBatchDetails(draft, action) {
201
+ const details = action.payload;
202
+ draft.bulkUpload.batchDetailsById[details.batchId] = details;
203
+ },
204
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
205
+ fetchMoreBatchDetails(_draft) {
206
+ _draft.bulkUpload.batchDetailsPaginationState = {
207
+ fetchState: 'In-Progress',
208
+ error: undefined,
209
+ };
210
+ },
211
+ fetchMoreBatchDetailsComplete(draft) {
212
+ draft.bulkUpload.batchDetailsPaginationState = {
213
+ fetchState: 'Completed',
214
+ error: undefined,
215
+ };
216
+ },
217
+ fetchMoreBatchDetailsFailure(draft, action) {
218
+ draft.bulkUpload.batchDetailsPaginationState = {
219
+ fetchState: 'Error',
220
+ error: action.payload.error,
221
+ };
222
+ },
223
+ fetchBulkUploadBatches: {
224
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
225
+ reducer(draft, _action) {
226
+ draft.bulkUpload.batchListFetchState = {
227
+ fetchState: 'In-Progress',
228
+ error: undefined,
229
+ };
230
+ },
231
+ prepare(cacheOverride = false) {
232
+ return { payload: { cacheOverride } };
233
+ },
234
+ },
235
+ fetchBulkUploadBatchesSuccess(draft, action) {
236
+ const periodId = (0, timePeriod_1.toMonthYearPeriodId)(action.payload.selectedPeriod);
237
+ draft.bulkUpload.batchListByPeriod[periodId] = action.payload.batchList;
238
+ draft.bulkUpload.batchListFetchState = {
239
+ fetchState: 'Completed',
240
+ error: undefined,
241
+ };
242
+ },
243
+ fetchBulkUploadBatchesFailure(draft, action) {
244
+ draft.bulkUpload.batchListFetchState = {
245
+ fetchState: 'Error',
246
+ error: action.payload.error,
247
+ };
248
+ },
249
+ confirmBulkUploadMatch: {
250
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
251
+ reducer(draft, _action) {
252
+ draft.bulkUpload.confirmMatchStatus = {
253
+ fetchState: 'In-Progress',
254
+ error: undefined,
255
+ };
256
+ },
257
+ prepare(batchId, attachmentId, transactionId, transactionType, fileName) {
258
+ return { payload: { batchId, attachmentId, transactionId, transactionType, fileName } };
259
+ },
260
+ },
261
+ confirmBulkUploadMatchSuccess(draft, action) {
262
+ const { batchId, attachmentId, transactionId } = action.payload;
263
+ draft.bulkUpload.confirmMatchStatus = {
264
+ fetchState: 'Completed',
265
+ error: undefined,
266
+ };
267
+ const details = draft.bulkUpload.batchDetailsById[batchId];
268
+ if (details != null) {
269
+ const file = details.files.find((f) => f.attachmentId === attachmentId);
270
+ if (file != null) {
271
+ const originalStatus = file.status;
272
+ file.status = 'matched';
273
+ file.matchedTransactionId = transactionId;
274
+ file.candidates = undefined;
275
+ details.summary.matched += 1;
276
+ if (originalStatus === 'no_match') {
277
+ details.summary.noMatch = Math.max(0, details.summary.noMatch - 1);
278
+ }
279
+ else {
280
+ details.summary.possibleMatches = Math.max(0, details.summary.possibleMatches - 1);
281
+ }
282
+ }
283
+ }
284
+ },
285
+ confirmBulkUploadMatchFailure(draft, action) {
286
+ draft.bulkUpload.confirmMatchStatus = {
287
+ fetchState: 'Error',
288
+ error: action.payload.error,
289
+ };
290
+ },
291
+ setBulkUploadResultsTab(draft, action) {
292
+ draft.bulkUpload.currentResultsTab = action.payload;
293
+ },
294
+ setBulkUploadCompletedSubTab(draft, action) {
295
+ draft.bulkUpload.completedSubTab = action.payload;
296
+ draft.bulkUpload.completedTransactionsByPeriod = {};
297
+ },
298
+ setBulkUploadSortConfig(draft, action) {
299
+ draft.bulkUpload.sortKey = action.payload.sortKey;
300
+ draft.bulkUpload.sortOrder = action.payload.sortOrder;
301
+ },
302
+ clearBulkUpload(draft) {
303
+ Object.assign(draft.bulkUpload, exports.initialBulkUploadState);
304
+ },
305
+ searchTransactionsForManualMatch: {
306
+ reducer(draft, action) {
307
+ draft.bulkUpload.manualSearch.searchQuery = action.payload.query;
308
+ draft.bulkUpload.manualSearch.fetchState = {
309
+ fetchState: 'In-Progress',
310
+ error: undefined,
311
+ };
312
+ draft.bulkUpload.manualSearch.results = [];
313
+ },
314
+ prepare(query) {
315
+ return { payload: { query } };
316
+ },
317
+ },
318
+ searchTransactionsForManualMatchSuccess(draft, action) {
319
+ draft.bulkUpload.manualSearch.results = action.payload;
320
+ draft.bulkUpload.manualSearch.fetchState = {
321
+ fetchState: 'Completed',
322
+ error: undefined,
323
+ };
324
+ },
325
+ searchTransactionsForManualMatchFailure(draft, action) {
326
+ draft.bulkUpload.manualSearch.fetchState = {
327
+ fetchState: 'Error',
328
+ error: action.payload.error,
329
+ };
330
+ },
331
+ clearManualSearchResults(draft) {
332
+ draft.bulkUpload.manualSearch = exports.initialBulkUploadState.manualSearch;
333
+ },
334
+ // -- Completed Transactions Actions --
335
+ fetchCompletedTransactions: {
336
+ reducer(draft, action) {
337
+ const { pageToken } = action.payload;
338
+ if (pageToken != null) {
339
+ const periods = draft.bulkUpload.completedTransactionsByPeriod;
340
+ for (const entry of Object.values(periods)) {
341
+ if (entry.nextPageToken === pageToken) {
342
+ entry.fetchState = {
343
+ fetchState: 'In-Progress',
344
+ error: undefined,
345
+ };
346
+ break;
347
+ }
348
+ }
349
+ }
350
+ },
351
+ prepare(pageToken) {
352
+ return { payload: { pageToken } };
353
+ },
354
+ },
355
+ fetchCompletedTransactionsSuccess(draft, action) {
356
+ const { transactionIds, nextPageToken, totalCount, selectedPeriod, isInitialLoad } = action.payload;
357
+ const periodId = (0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod);
358
+ if (isInitialLoad) {
359
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
360
+ transactionIds,
361
+ nextPageToken,
362
+ totalCount,
363
+ fetchState: { fetchState: 'Completed', error: undefined },
364
+ };
365
+ }
366
+ else {
367
+ const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
368
+ if (existing != null) {
369
+ existing.transactionIds.push(...transactionIds);
370
+ existing.nextPageToken = nextPageToken;
371
+ existing.totalCount = totalCount;
372
+ existing.fetchState = { fetchState: 'Completed', error: undefined };
373
+ }
374
+ else {
375
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
376
+ transactionIds,
377
+ nextPageToken,
378
+ totalCount,
379
+ fetchState: { fetchState: 'Completed', error: undefined },
380
+ };
381
+ }
382
+ }
383
+ },
384
+ fetchCompletedTransactionsFailure(draft, action) {
385
+ const periodId = (0, timePeriod_1.toMonthYearPeriodId)(action.payload.selectedPeriod);
386
+ const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
387
+ if (existing != null) {
388
+ existing.fetchState = {
389
+ fetchState: 'Error',
390
+ error: action.payload.error,
391
+ };
392
+ }
393
+ else {
394
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
395
+ fetchState: { fetchState: 'Error', error: action.payload.error },
396
+ nextPageToken: null,
397
+ totalCount: 0,
398
+ transactionIds: [],
399
+ };
400
+ }
401
+ },
127
402
  },
128
403
  });
129
- _a = expenseAutomationMissingReceiptsView.actions, exports.fetchMissingReceipts = _a.fetchMissingReceipts, exports.fetchMissingReceiptsSuccess = _a.fetchMissingReceiptsSuccess, exports.fetchMissingReceiptsFailure = _a.fetchMissingReceiptsFailure, exports.uploadMissingReceiptSuccess = _a.uploadMissingReceiptSuccess, exports.updateMissingReceiptUploadState = _a.updateMissingReceiptUploadState, exports.updateMissingReceiptsUIState = _a.updateMissingReceiptsUIState, exports.markMissingReceiptAsDone = _a.markMissingReceiptAsDone, exports.clearExpenseAutomationMissingReceiptsView = _a.clearExpenseAutomationMissingReceiptsView;
404
+ _a = expenseAutomationMissingReceiptsView.actions, exports.fetchMissingReceipts = _a.fetchMissingReceipts, exports.fetchMissingReceiptsSuccess = _a.fetchMissingReceiptsSuccess, exports.fetchMissingReceiptsFailure = _a.fetchMissingReceiptsFailure, exports.uploadMissingReceiptSuccess = _a.uploadMissingReceiptSuccess, exports.updateMissingReceiptUploadState = _a.updateMissingReceiptUploadState, exports.updateMissingReceiptsUIState = _a.updateMissingReceiptsUIState, exports.markMissingReceiptAsDone = _a.markMissingReceiptAsDone, exports.clearExpenseAutomationMissingReceiptsView = _a.clearExpenseAutomationMissingReceiptsView,
405
+ // Bulk Upload
406
+ exports.bulkUploadReceipts = _a.bulkUploadReceipts, exports.updateBulkUploadProgress = _a.updateBulkUploadProgress, exports.bulkUploadReceiptsSuccess = _a.bulkUploadReceiptsSuccess, exports.bulkUploadReceiptsFailure = _a.bulkUploadReceiptsFailure, exports.pusherBatchStatusUpdate = _a.pusherBatchStatusUpdate, exports.fetchBulkUploadBatchDetails = _a.fetchBulkUploadBatchDetails, exports.fetchBulkUploadBatchDetailsSuccess = _a.fetchBulkUploadBatchDetailsSuccess, exports.fetchBulkUploadBatchDetailsFailure = _a.fetchBulkUploadBatchDetailsFailure, exports.storeBatchDetails = _a.storeBatchDetails, exports.fetchMoreBatchDetails = _a.fetchMoreBatchDetails, exports.fetchMoreBatchDetailsComplete = _a.fetchMoreBatchDetailsComplete, exports.fetchMoreBatchDetailsFailure = _a.fetchMoreBatchDetailsFailure, exports.fetchBulkUploadBatches = _a.fetchBulkUploadBatches, exports.fetchBulkUploadBatchesSuccess = _a.fetchBulkUploadBatchesSuccess, exports.fetchBulkUploadBatchesFailure = _a.fetchBulkUploadBatchesFailure, exports.confirmBulkUploadMatch = _a.confirmBulkUploadMatch, exports.confirmBulkUploadMatchSuccess = _a.confirmBulkUploadMatchSuccess, exports.confirmBulkUploadMatchFailure = _a.confirmBulkUploadMatchFailure, exports.setBulkUploadResultsTab = _a.setBulkUploadResultsTab, exports.setBulkUploadCompletedSubTab = _a.setBulkUploadCompletedSubTab, exports.setBulkUploadSortConfig = _a.setBulkUploadSortConfig, exports.clearBulkUpload = _a.clearBulkUpload, exports.searchTransactionsForManualMatch = _a.searchTransactionsForManualMatch, exports.searchTransactionsForManualMatchSuccess = _a.searchTransactionsForManualMatchSuccess, exports.searchTransactionsForManualMatchFailure = _a.searchTransactionsForManualMatchFailure, exports.clearManualSearchResults = _a.clearManualSearchResults,
407
+ // Completed Transactions
408
+ exports.fetchCompletedTransactions = _a.fetchCompletedTransactions, exports.fetchCompletedTransactionsSuccess = _a.fetchCompletedTransactionsSuccess, exports.fetchCompletedTransactionsFailure = _a.fetchCompletedTransactionsFailure;
130
409
  exports.default = expenseAutomationMissingReceiptsView.reducer;
@@ -1,8 +1,71 @@
1
1
  import { CompletionStatusType, FetchStateAndError, ID } from '../../../commonStateTypes/common';
2
2
  import { SelectorView } from '../../../commonStateTypes/viewAndReport/viewAndReport';
3
3
  import { SupportedTransaction } from '../../../entity/transaction/transactionState';
4
- import { MissingReceiptsViewUIState } from '../types/missingReceiptsViewState';
4
+ import { SortOrder } from '../../../commonStateTypes/selectorTypes/sortOrderTypes';
5
+ import type { BatchFileStatus, BatchListItem, BatchStatus, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, CompletedSubTab, ManualSearchState, MatchSource, MissingReceiptsViewUIState } from '../types/missingReceiptsViewState';
6
+ export interface CompletedTransactionsSelectorData {
7
+ fetchState: FetchStateAndError;
8
+ nextPageToken: string | null;
9
+ totalCount: number;
10
+ transactions: SupportedTransaction[];
11
+ }
12
+ export interface ResolvedCandidate {
13
+ matchScore: number;
14
+ transaction: SupportedTransaction;
15
+ }
16
+ export interface ResolvedBatchFile {
17
+ attachmentId: ID;
18
+ fileDownloadUrl: string | null;
19
+ fileId: ID;
20
+ filename: string;
21
+ filePreviewUrl: string | null;
22
+ status: BatchFileStatus;
23
+ candidates?: ResolvedCandidate[];
24
+ matchedTransaction?: SupportedTransaction;
25
+ matchSource?: MatchSource;
26
+ }
27
+ export interface BulkUploadSelectorData {
28
+ batchDetails: ResolvedBatchDetails | undefined;
29
+ batchDetailsPaginationState: FetchStateAndError;
30
+ batchList: BatchListItem[];
31
+ batchListFetchState: FetchStateAndError;
32
+ batchStatus: BatchStatus | undefined;
33
+ completedSubTab: CompletedSubTab;
34
+ completedTransactions: CompletedTransactionsSelectorData;
35
+ confirmMatchStatus: FetchStateAndError;
36
+ currentResultsTab: BulkUploadResultsTab;
37
+ hasMoreBatchDetails: boolean;
38
+ manualSearch: ManualSearchState;
39
+ matchedFiles: ResolvedBatchFile[];
40
+ pastBatches: BatchListItem[];
41
+ pastUnmatchedFiles: ResolvedBatchFile[];
42
+ phase: BulkUploadPhase;
43
+ progress: {
44
+ percentage: number;
45
+ processed: number;
46
+ total: number;
47
+ };
48
+ sortKey: BulkUploadSortKey;
49
+ sortOrder: SortOrder;
50
+ unmatchedFiles: ResolvedBatchFile[];
51
+ uploadProgress: number;
52
+ uploadStatus: FetchStateAndError;
53
+ }
54
+ export interface ResolvedBatchDetails {
55
+ batchId: ID;
56
+ createdAt: string;
57
+ files: ResolvedBatchFile[];
58
+ status: string;
59
+ summary: {
60
+ failed: number;
61
+ matched: number;
62
+ noMatch: number;
63
+ possibleMatches: number;
64
+ total: number;
65
+ };
66
+ }
5
67
  export interface ExpenseAutomationMissingReceiptsViewSelector extends SelectorView {
68
+ bulkUpload: BulkUploadSelectorData;
6
69
  completionStatus: CompletionStatusType;
7
70
  refreshStatus: FetchStateAndError;
8
71
  transactions: SupportedTransaction[];
@@ -1,3 +1,3 @@
1
1
  import { RootState } from '../../../reducer';
2
- import { ExpenseAutomationMissingReceiptsViewSelector } from '../selectorTypes/missingReceiptsSelectorTypes';
2
+ import type { ExpenseAutomationMissingReceiptsViewSelector } from '../selectorTypes/missingReceiptsSelectorTypes';
3
3
  export declare function getExpenseAutomationMissingReceiptsView(state: RootState): ExpenseAutomationMissingReceiptsViewSelector;