@zeniai/client-epic-state 5.1.18-betaDI10 → 5.1.18-betaDI12

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 (127) hide show
  1. package/README.md +3 -1
  2. package/lib/commonStateTypes/viewAndReport/agingReportStateTypes.d.ts +1 -1
  3. package/lib/entity/accountRecon/accountReconPayload.d.ts +22 -0
  4. package/lib/entity/accountRecon/accountReconPayload.js +26 -1
  5. package/lib/entity/accountRecon/accountReconReducer.d.ts +5 -2
  6. package/lib/entity/accountRecon/accountReconReducer.js +36 -2
  7. package/lib/entity/accountRecon/accountReconSelector.d.ts +6 -1
  8. package/lib/entity/accountRecon/accountReconSelector.js +5 -0
  9. package/lib/entity/accountRecon/accountReconState.d.ts +22 -0
  10. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksPayload.d.ts +8 -0
  11. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksPayload.js +10 -0
  12. package/lib/entity/monthEndCloseChecks/monthEndCloseChecksState.d.ts +8 -0
  13. package/lib/entity/task/taskReducer.js +3 -0
  14. package/lib/entity/task/taskState.d.ts +1 -1
  15. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +1 -0
  16. package/lib/entity/transaction/payloadTypes/transactionPayload.js +5 -0
  17. package/lib/entity/transaction/stateTypes/transaction.d.ts +1 -0
  18. package/lib/epic.d.ts +7 -2
  19. package/lib/epic.js +7 -2
  20. package/lib/esm/entity/accountRecon/accountReconPayload.js +26 -1
  21. package/lib/esm/entity/accountRecon/accountReconReducer.js +35 -1
  22. package/lib/esm/entity/accountRecon/accountReconSelector.js +5 -0
  23. package/lib/esm/entity/monthEndCloseChecks/monthEndCloseChecksPayload.js +10 -0
  24. package/lib/esm/entity/task/taskReducer.js +3 -0
  25. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +5 -0
  26. package/lib/esm/epic.js +7 -2
  27. package/lib/esm/index.js +9 -9
  28. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +29 -3
  29. package/lib/esm/view/aiCfoView/aiCfoViewSelector.js +11 -0
  30. package/lib/esm/view/aiCfoView/epics/createSessionAndSubmitEpic.js +2 -2
  31. package/lib/esm/view/aiCfoView/epics/fetchSkillsEpic.js +34 -0
  32. package/lib/esm/view/aiCfoView/epics/submitQuestionEpic.js +7 -1
  33. package/lib/esm/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +34 -0
  34. package/lib/esm/view/expenseAutomationView/epics/accountRecon/reparseStatementEpic.js +31 -0
  35. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +57 -0
  36. package/lib/esm/view/expenseAutomationView/epics/fluxAnalysis/fetchFluxAnalysisViewEpic.js +1 -0
  37. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +49 -11
  38. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +30 -3
  39. package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +153 -0
  40. package/lib/esm/view/expenseAutomationView/reducers/fluxAnalysisViewReducer.js +6 -1
  41. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +188 -9
  42. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +37 -17
  43. package/lib/esm/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +2 -1
  44. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +27 -0
  45. package/lib/esm/view/expenseAutomationView/types/reconciliationViewState.js +29 -0
  46. package/lib/esm/view/onboardingView/cockpitView/epic/initializeOnboardingCustomerViewUpdateDataEpic.js +4 -16
  47. package/lib/esm/view/onboardingView/cockpitView/onboardingCockpitViewPayload.js +2 -2
  48. package/lib/esm/view/opExByVendor/opExByVendorReducer.js +28 -5
  49. package/lib/esm/view/opExByVendor/opExByVendorSelector.js +1 -0
  50. package/lib/esm/view/opExByVendor/refreshOpExByVendorReportEpic.js +21 -0
  51. package/lib/esm/view/referralView/epics/sendReferralInviteEpic.js +9 -1
  52. package/lib/esm/view/referralView/referralReducer.js +3 -2
  53. package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +5 -1
  54. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +2 -2
  55. package/lib/esm/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.js +2 -2
  56. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +1 -1
  57. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +3 -1
  58. package/lib/esm/view/transactionDetail/epics/saveTransactionDetailEpic.js +3 -1
  59. package/lib/esm/view/transactionDetail/epics/saveTransactionHelper.js +11 -2
  60. package/lib/esm/view/transactionDetail/epics/updateTransactionDetailEpic.js +34 -5
  61. package/lib/esm/view/transactionDetail/transactionDetailLocalDataHelper.js +17 -0
  62. package/lib/index.d.ts +14 -14
  63. package/lib/index.js +57 -37
  64. package/lib/view/aiCfoView/aiCfoViewPayload.d.ts +14 -0
  65. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +8 -4
  66. package/lib/view/aiCfoView/aiCfoViewReducer.js +30 -4
  67. package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +2 -1
  68. package/lib/view/aiCfoView/aiCfoViewSelector.js +12 -0
  69. package/lib/view/aiCfoView/aiCfoViewState.d.ts +15 -0
  70. package/lib/view/aiCfoView/epics/createSessionAndSubmitEpic.js +2 -2
  71. package/lib/view/aiCfoView/epics/fetchSkillsEpic.d.ts +8 -0
  72. package/lib/view/aiCfoView/epics/fetchSkillsEpic.js +38 -0
  73. package/lib/view/aiCfoView/epics/submitQuestionEpic.js +7 -1
  74. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.d.ts +6 -0
  75. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +38 -0
  76. package/lib/view/expenseAutomationView/epics/accountRecon/reparseStatementEpic.d.ts +26 -0
  77. package/lib/view/expenseAutomationView/epics/accountRecon/reparseStatementEpic.js +35 -0
  78. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.d.ts +27 -0
  79. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +61 -0
  80. package/lib/view/expenseAutomationView/epics/fluxAnalysis/fetchFluxAnalysisViewEpic.js +1 -0
  81. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +47 -9
  82. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +30 -3
  83. package/lib/view/expenseAutomationView/payload/fluxAnalysisPayload.d.ts +8 -0
  84. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +176 -10
  85. package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +159 -0
  86. package/lib/view/expenseAutomationView/payload/transactionCategorizationPayload.d.ts +7 -0
  87. package/lib/view/expenseAutomationView/reducers/fluxAnalysisViewReducer.d.ts +2 -1
  88. package/lib/view/expenseAutomationView/reducers/fluxAnalysisViewReducer.js +6 -1
  89. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +53 -3
  90. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +190 -10
  91. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +37 -17
  92. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +7 -1
  93. package/lib/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +2 -1
  94. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.d.ts +2 -0
  95. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +29 -1
  96. package/lib/view/expenseAutomationView/types/fluxAnalysisViewState.d.ts +2 -0
  97. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +175 -0
  98. package/lib/view/expenseAutomationView/types/reconciliationViewState.js +30 -0
  99. package/lib/view/onboardingView/cockpitView/epic/initializeOnboardingCustomerViewUpdateDataEpic.js +3 -15
  100. package/lib/view/onboardingView/cockpitView/onboardingCockpitViewPayload.js +2 -2
  101. package/lib/view/opExByVendor/opExByVendorReducer.d.ts +6 -1
  102. package/lib/view/opExByVendor/opExByVendorReducer.js +29 -6
  103. package/lib/view/opExByVendor/opExByVendorSelector.d.ts +1 -0
  104. package/lib/view/opExByVendor/opExByVendorSelector.js +1 -0
  105. package/lib/view/opExByVendor/opExByVendorState.d.ts +1 -0
  106. package/lib/view/opExByVendor/refreshOpExByVendorReportEpic.d.ts +17 -0
  107. package/lib/view/opExByVendor/refreshOpExByVendorReportEpic.js +25 -0
  108. package/lib/view/referralView/epics/sendReferralInviteEpic.js +9 -1
  109. package/lib/view/referralView/referralReducer.d.ts +1 -0
  110. package/lib/view/referralView/referralReducer.js +4 -3
  111. package/lib/view/spendManagement/commonSetup/setupViewReducer.js +5 -1
  112. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +2 -2
  113. package/lib/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.d.ts +1 -1
  114. package/lib/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.js +1 -1
  115. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +1 -1
  116. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +1 -1
  117. package/lib/view/taskManager/taskListView/taskListReducer.js +3 -1
  118. package/lib/view/transactionDetail/epics/saveTransactionDetailEpic.js +3 -1
  119. package/lib/view/transactionDetail/epics/saveTransactionHelper.d.ts +1 -1
  120. package/lib/view/transactionDetail/epics/saveTransactionHelper.js +11 -2
  121. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.d.ts +8 -0
  122. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.js +36 -6
  123. package/lib/view/transactionDetail/transactionDetailLocalDataHelper.js +17 -0
  124. package/lib/view/transactionDetail/transactionDetailState.d.ts +1 -0
  125. package/lib/view/transactionDetail/transactionDetailTypes.d.ts +1 -0
  126. package/lib/view/vendorFiling1099/vendorFiling1099List/vendorFiling1099ListState.d.ts +1 -1
  127. package/package.json +5 -2
@@ -10,6 +10,7 @@ const classListReducer_1 = require("../../../classList/classListReducer");
10
10
  const ownerListReducer_1 = require("../../../ownerList/ownerListReducer");
11
11
  const projectListReducer_1 = require("../../../projectList/projectListReducer");
12
12
  const transactionsViewReducer_1 = require("../../reducers/transactionsViewReducer");
13
+ const transactionsViewState_1 = require("../../types/transactionsViewState");
13
14
  const fetchTransactionCategorizationViewEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(transactionsViewReducer_1.fetchTransactionCategorizationView.match), (0, operators_1.mergeMap)((action) => {
14
15
  const { selectedTab, cacheOverride, keepExistingListItems, pageToken, period, refreshViewInBackground, searchString, resetListItems, isUncategorizedExpenseCategoryEnabled, } = action.payload;
15
16
  const updateActions = [];
@@ -19,8 +20,8 @@ const fetchTransactionCategorizationViewEpic = (actions$, state$) => actions$.pi
19
20
  month: period.start.month,
20
21
  year: period.start.year,
21
22
  };
22
- const transactionIds = transactionIdsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(monthYearPeriod)] ??
23
- [];
23
+ const periodId = (0, timePeriod_1.toMonthYearPeriodId)(monthYearPeriod);
24
+ const transactionIds = transactionIdsBySelectedPeriod[periodId] ?? [];
24
25
  const accountList = state$.value.accountListState.byReportId['accountList'];
25
26
  if (accountList.hasValidState() === false &&
26
27
  accountList.fetchState === 'Not-Started') {
@@ -42,11 +43,37 @@ const fetchTransactionCategorizationViewEpic = (actions$, state$) => actions$.pi
42
43
  vendorOwnerList.fetchState === 'Not-Started') {
43
44
  updateActions.push((0, ownerListReducer_1.fetchOwnerList)());
44
45
  }
45
- if (cacheOverride === true ||
46
+ if (searchString === '' ||
47
+ cacheOverride === true ||
46
48
  fetchState === 'Not-Started' ||
47
49
  transactionIds.length === 0) {
48
50
  updateActions.push((0, transactionsViewReducer_1.fetchTransactionCategorization)(selectedTab, period, cacheOverride, keepExistingListItems, searchString, pageToken, refreshViewInBackground, resetListItems, isUncategorizedExpenseCategoryEnabled));
49
51
  }
52
+ // On the initial load of a tab (searchString undefined = non-search fetch),
53
+ // preload every other tab that hasn't been fetched yet for this period.
54
+ // This makes switching to the other tab instant instead of triggering a
55
+ // fresh fetch on click. refreshViewInBackground=true keeps it silent.
56
+ if (searchString === undefined) {
57
+ transactionsViewState_1.TRANSACTIONS_TABS.filter((tab) => tab !== selectedTab).forEach((otherTab) => {
58
+ const otherTabFetchState = expenseAutomationTransactionsViewState.transactionCategorizationView[otherTab].fetchState;
59
+ if (otherTabFetchState === 'Not-Started') {
60
+ updateActions.push((0, transactionsViewReducer_1.fetchTransactionCategorization)(otherTab, period, false, false, undefined, undefined, true, undefined, isUncategorizedExpenseCategoryEnabled));
61
+ }
62
+ });
63
+ }
64
+ // When search changes (searchString defined, including empty string to
65
+ // clear), also update every other tab so all tabs always reflect the same
66
+ // search query. Skip if the other tab already has this search string to
67
+ // avoid redundant work on noop updates. On clear, restore from snapshot
68
+ // if available; otherwise issue a background fetch.
69
+ if (searchString !== undefined) {
70
+ transactionsViewState_1.TRANSACTIONS_TABS.filter((tab) => tab !== selectedTab).forEach((otherTab) => {
71
+ const otherTabSearchString = expenseAutomationTransactionsViewState.transactionCategorizationView[otherTab].uiState.searchString;
72
+ if (searchString !== otherTabSearchString) {
73
+ updateActions.push((0, transactionsViewReducer_1.fetchTransactionCategorization)(otherTab, period, true, keepExistingListItems, searchString, undefined, true, true, isUncategorizedExpenseCategoryEnabled));
74
+ }
75
+ });
76
+ }
50
77
  return (0, rxjs_1.from)(updateActions);
51
78
  }));
52
79
  exports.fetchTransactionCategorizationViewEpic = fetchTransactionCategorizationViewEpic;
@@ -58,6 +58,13 @@ export interface FluxAnalysisTotalPayload {
58
58
  reimbursement: MonthBalanceAndVariancePayload;
59
59
  total: MonthBalanceAndVariancePayload;
60
60
  }
61
+ export interface FluxAnalysisReportStatusPayload {
62
+ code?: number;
63
+ description?: string;
64
+ last_refresh_attempt_time?: string | null;
65
+ last_refresh_success_time?: string | null;
66
+ message?: string;
67
+ }
61
68
  export interface FluxAnalysisReportPayload {
62
69
  accounting_class: ClassBasePayload[];
63
70
  accounts: AccountBasePayload[];
@@ -67,6 +74,7 @@ export interface FluxAnalysisReportPayload {
67
74
  vendors: VendorPayload[];
68
75
  flux_analysis_entities?: FluxAnalysisEntitiesPayload;
69
76
  page_metadata?: PageMetadataPayload;
77
+ status?: FluxAnalysisReportStatusPayload;
70
78
  }
71
79
  export interface FluxAnalysisResponsePayload extends FluxAnalysisReportPayload {
72
80
  query: {
@@ -8,8 +8,8 @@ import { FilePayload } from '../../../entity/file/filePayload';
8
8
  import { MatchedTransactionPayload } from '../../../entity/transaction/payloadTypes/reconciliationTransactionPayloads';
9
9
  import { UserPayload } from '../../../entity/user/userPayload';
10
10
  import { RootState } from '../../../reducer';
11
- import { ZeniAPIResponse } from '../../../responsePayload';
12
- import { BalancesLocalData, SaveReconcileDetailActionPayload } from '../types/reconciliationViewState';
11
+ import { ZeniAPIResponse, ZeniAPIStatus } from '../../../responsePayload';
12
+ import { BalancesLocalData, ParsedStatementData, SaveReconcileDetailActionPayload, StatementDateConflict, StatementUpdateLocalData, StatementUpdateLocalDataPayload } from '../types/reconciliationViewState';
13
13
  export interface DetectionInfoPayload {
14
14
  account_id: string;
15
15
  bank_balance: number | null;
@@ -31,6 +31,31 @@ interface ExclusionInfoPayload {
31
31
  export interface ExcludedAccountPayload extends AccountAndPaymentAccountPayload {
32
32
  exclusion_info: ExclusionInfoPayload;
33
33
  }
34
+ export interface ReconciliationProgressBarPayload {
35
+ ai_percentage_share: number;
36
+ complete_percentage: number;
37
+ human_percentage_share: number;
38
+ remaining_percentage: number;
39
+ }
40
+ export interface ReconciliationSummaryPayload {
41
+ accounts: {
42
+ done: number;
43
+ failed: number;
44
+ in_progress: number;
45
+ total: number;
46
+ };
47
+ accounts_to_connect_count: number;
48
+ auto_matched: {
49
+ matched_txns: number;
50
+ total_txns: number;
51
+ };
52
+ needs_review: {
53
+ account_count: number;
54
+ txn_count: number;
55
+ };
56
+ time_saved_percentage: number;
57
+ progress_bar?: ReconciliationProgressBarPayload;
58
+ }
34
59
  export interface ReconciliationPayload {
35
60
  accounts: AccountAndPaymentAccountPayload[];
36
61
  files: FilePayload[];
@@ -39,6 +64,7 @@ export interface ReconciliationPayload {
39
64
  detection_info?: DetectionInfoPayload;
40
65
  detection_reason?: string;
41
66
  excluded_accounts?: ExcludedAccountPayload[];
67
+ summary?: ReconciliationSummaryPayload;
42
68
  }
43
69
  export type ReconciliationResponse = ZeniAPIResponse<ReconciliationPayload>;
44
70
  export interface SaveReconciliationReviewPayload {
@@ -86,16 +112,156 @@ export interface UploadStatementDocumentAIPayload {
86
112
  processor_run_id: string;
87
113
  }
88
114
  export type UploadStatementDocumentAIResponse = ZeniAPIResponse<UploadStatementDocumentAIPayload>;
115
+ export interface StatementUploadSummaryPayload {
116
+ account_type: string;
117
+ statement_data_status: StatusCodeWithLabelPayload;
118
+ statement_end_date: string;
119
+ statement_start_date: string;
120
+ statement_status: StatusCodeWithLabelPayload;
121
+ statement_upload_id: string;
122
+ }
89
123
  export interface UploadStatementResponsePayload {
90
124
  file: FilePayload;
91
- statement_upload: {
92
- account_type: string;
93
- statement_data_status: StatusCodeWithLabelPayload;
94
- statement_end_date: string;
95
- statement_start_date: string;
96
- statement_status: StatusCodeWithLabelPayload;
97
- statement_upload_id: string;
98
- };
125
+ statement_upload: StatementUploadSummaryPayload;
99
126
  }
100
127
  export type UploadStatementResponse = ZeniAPIResponse<UploadStatementResponsePayload>;
128
+ export interface PolygonPointPayload {
129
+ x: number;
130
+ y: number;
131
+ }
132
+ export interface CitationPayload {
133
+ page: number;
134
+ page_height: number;
135
+ page_width: number;
136
+ polygon: PolygonPointPayload[];
137
+ reference_text: string;
138
+ }
139
+ export interface StatementTransactionPayload {
140
+ amount: number;
141
+ citation: CitationPayload[];
142
+ is_user_added: boolean;
143
+ is_user_edited: boolean;
144
+ statement_transaction_id: string;
145
+ transaction_date: string;
146
+ transaction_direction: 'debit' | 'credit';
147
+ transaction_memo: string;
148
+ }
149
+ export interface ReconciliationMetaPayload {
150
+ end_date: string;
151
+ reconciliation_id: string;
152
+ start_date: string;
153
+ status: string;
154
+ }
155
+ export interface StatementMetaPayload {
156
+ closing_balance: number;
157
+ opening_balance: number;
158
+ statement_data_status: StatusCodeWithLabelPayload;
159
+ statement_end_date: string;
160
+ statement_start_date: string;
161
+ statement_status: StatusCodeWithLabelPayload;
162
+ statement_upload_id: string;
163
+ total_deposits: number;
164
+ total_payments: number;
165
+ }
166
+ export interface AccountInfoPayload {
167
+ account_id: string;
168
+ account_name: string;
169
+ account_type: string;
170
+ currency_code: string;
171
+ last_4_digits: string | null;
172
+ }
173
+ export interface FileInfoPayload {
174
+ file_id: string;
175
+ file_name: string;
176
+ signed_url: string;
177
+ }
178
+ export interface AiSummaryFieldPayload {
179
+ code: string;
180
+ label: string;
181
+ }
182
+ export interface PreviousReconciliationInfoPayload {
183
+ end_date: string;
184
+ reconciled_at: string;
185
+ reconciled_by_user_id: string;
186
+ reconciliation_id: string;
187
+ start_date: string;
188
+ }
189
+ export interface AiSummaryChainStatusPayload {
190
+ code: string;
191
+ expected_start_date: string | null;
192
+ label: string;
193
+ previous_reconciliation_info: PreviousReconciliationInfoPayload | null;
194
+ }
195
+ export interface AiSummaryPayload {
196
+ account_identified: string | null;
197
+ chain_status: AiSummaryChainStatusPayload;
198
+ exceptions_detected: number;
199
+ fields_captured: AiSummaryFieldPayload[];
200
+ transactions_extracted: number;
201
+ }
202
+ export interface StatementUploadPayload {
203
+ account: AccountInfoPayload;
204
+ file: FileInfoPayload | null;
205
+ statement_meta: StatementMetaPayload;
206
+ statement_transactions: StatementTransactionPayload[];
207
+ ai_summary?: AiSummaryPayload | null;
208
+ }
209
+ export interface ParseStatementResponsePayload {
210
+ reconciliation: ReconciliationMetaPayload;
211
+ statement_upload: StatementUploadPayload;
212
+ }
213
+ export interface ReparseStatementResponsePayload {
214
+ statement_upload: StatementUploadSummaryPayload;
215
+ }
216
+ export type ParseStatementResponse = ZeniAPIResponse<ParseStatementResponsePayload>;
217
+ export type ReparseStatementResponse = ZeniAPIResponse<ReparseStatementResponsePayload>;
218
+ /**
219
+ * Statement period chain validation (Confirm & Save).
220
+ *
221
+ * - 200 (auto-trim): the BE trimmed the start date and returns a
222
+ * `date_adjustment` block alongside the usual reconciliation /
223
+ * statement_upload data.
224
+ * - 409: the upload was rejected (total overlap or gap). The error fields
225
+ * (`error_code`, `expected_start_date`, `previous_reconciliation_info`)
226
+ * live at the top level of the response, next to `status`.
227
+ */
228
+ export type StatementChainErrorCode = 'STATEMENT_RANGE_ALREADY_RECONCILED' | 'STATEMENT_RANGE_HAS_GAP';
229
+ export interface StatementDateAdjustmentPayload {
230
+ adjusted_start_date: string;
231
+ original_start_date: string;
232
+ previous_reconciliation_info: PreviousReconciliationInfoPayload;
233
+ reason: string;
234
+ }
235
+ export interface UpdateStatementInfoResponsePayload {
236
+ reconciliation: ReconciliationMetaPayload;
237
+ statement_upload: StatementUploadPayload;
238
+ date_adjustment?: StatementDateAdjustmentPayload | null;
239
+ }
240
+ /** 2xx Confirm & Save — carries parsed statement data, no chain-validation errors. */
241
+ export interface UpdateStatementInfoSuccessResponse extends ZeniAPIResponse<UpdateStatementInfoResponsePayload> {
242
+ error_code?: undefined;
243
+ expected_start_date?: undefined;
244
+ previous_reconciliation_info?: undefined;
245
+ }
246
+ /** 409 Confirm & Save — chain validation rejected the statement period. */
247
+ export interface UpdateStatementInfoConflictResponse extends ZeniAPIResponse<UpdateStatementInfoResponsePayload | undefined> {
248
+ error_code: StatementChainErrorCode;
249
+ status: ZeniAPIStatus & {
250
+ code: 409;
251
+ };
252
+ expected_start_date?: string | null;
253
+ previous_reconciliation_info?: PreviousReconciliationInfoPayload | null;
254
+ }
255
+ export type UpdateStatementInfoResponse = UpdateStatementInfoSuccessResponse | UpdateStatementInfoConflictResponse;
256
+ export declare function isStatementDateConflictResponse(response: UpdateStatementInfoResponse): response is UpdateStatementInfoConflictResponse;
257
+ /**
258
+ * Builds date-conflict state from a 409 Confirm & Save response.
259
+ * Returns null for non-409 responses or 409s without a recognized error code.
260
+ */
261
+ export declare function transformStatementDateConflictToState(response: UpdateStatementInfoResponse): StatementDateConflict | null;
262
+ export declare function transformParseStatementPayloadToState(payload: ParseStatementResponsePayload): ParsedStatementData;
263
+ export declare function transformUpdateStatementInfoPayloadToState(payload: UpdateStatementInfoResponsePayload): ParsedStatementData;
264
+ export declare function transformStatementUpdateStateToPayload(localData: StatementUpdateLocalData): StatementUpdateLocalDataPayload;
265
+ /** API request body for PUT statement-uploads; cast lives here for putAndGetJSON. */
266
+ export declare function toStatementUpdateRequestBody(localData: StatementUpdateLocalData): Record<string, unknown>;
101
267
  export {};
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSaveReconciliationPayloadBasedOnActionAndMethod = createSaveReconciliationPayloadBasedOnActionAndMethod;
4
+ exports.isStatementDateConflictResponse = isStatementDateConflictResponse;
5
+ exports.transformStatementDateConflictToState = transformStatementDateConflictToState;
6
+ exports.transformParseStatementPayloadToState = transformParseStatementPayloadToState;
7
+ exports.transformUpdateStatementInfoPayloadToState = transformUpdateStatementInfoPayloadToState;
8
+ exports.transformStatementUpdateStateToPayload = transformStatementUpdateStateToPayload;
9
+ exports.toStatementUpdateRequestBody = toStatementUpdateRequestBody;
4
10
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
5
11
  const accountReconPayload_1 = require("../../../entity/accountRecon/accountReconPayload");
6
12
  const reconciliationTransactionPayloads_1 = require("../../../entity/transaction/payloadTypes/reconciliationTransactionPayloads");
@@ -70,3 +76,156 @@ function createReviewTransactionPayload(accountReconciliationEntity) {
70
76
  });
71
77
  return reviewTransactionsPayload;
72
78
  }
79
+ function isStatementDateConflictResponse(response) {
80
+ return response.status.code === 409 && response.error_code != null;
81
+ }
82
+ function transformStatementUploadPayloadToState(statementUploadPayload) {
83
+ return {
84
+ account: {
85
+ accountId: statementUploadPayload.account.account_id,
86
+ accountName: statementUploadPayload.account.account_name,
87
+ accountType: statementUploadPayload.account.account_type,
88
+ currencyCode: statementUploadPayload.account.currency_code,
89
+ last4Digits: statementUploadPayload.account.last_4_digits,
90
+ },
91
+ file: statementUploadPayload.file != null
92
+ ? {
93
+ fileId: statementUploadPayload.file.file_id,
94
+ fileName: statementUploadPayload.file.file_name,
95
+ signedUrl: statementUploadPayload.file.signed_url,
96
+ }
97
+ : null,
98
+ statementMeta: {
99
+ closingBalance: statementUploadPayload.statement_meta.closing_balance,
100
+ openingBalance: statementUploadPayload.statement_meta.opening_balance,
101
+ statementDataStatus: statementUploadPayload.statement_meta.statement_data_status,
102
+ statementEndDate: statementUploadPayload.statement_meta.statement_end_date,
103
+ statementStartDate: statementUploadPayload.statement_meta.statement_start_date,
104
+ statementStatus: statementUploadPayload.statement_meta.statement_status,
105
+ statementUploadId: statementUploadPayload.statement_meta.statement_upload_id,
106
+ totalDeposits: statementUploadPayload.statement_meta.total_deposits,
107
+ totalPayments: statementUploadPayload.statement_meta.total_payments,
108
+ },
109
+ statementTransactions: (statementUploadPayload.statement_transactions ?? []).map((txn) => ({
110
+ amount: txn.amount,
111
+ citations: (txn.citation ?? []).map((c) => ({
112
+ page: c.page,
113
+ pageHeight: c.page_height,
114
+ pageWidth: c.page_width,
115
+ polygon: (c.polygon ?? []).map((point) => ({
116
+ x: point.x,
117
+ y: point.y,
118
+ })),
119
+ referenceText: c.reference_text,
120
+ })),
121
+ isUserAdded: txn.is_user_added,
122
+ isUserEdited: txn.is_user_edited,
123
+ statementTransactionId: txn.statement_transaction_id,
124
+ transactionDate: txn.transaction_date,
125
+ transactionDirection: txn.transaction_direction,
126
+ transactionMemo: txn.transaction_memo,
127
+ })),
128
+ aiSummary: transformAiSummaryPayloadToState(statementUploadPayload.ai_summary),
129
+ };
130
+ }
131
+ function transformPreviousReconciliationInfoToState(payload) {
132
+ if (payload == null) {
133
+ return null;
134
+ }
135
+ return {
136
+ endDate: payload.end_date,
137
+ reconciledAt: payload.reconciled_at,
138
+ reconciledByUserId: payload.reconciled_by_user_id,
139
+ reconciliationId: payload.reconciliation_id,
140
+ startDate: payload.start_date,
141
+ };
142
+ }
143
+ function transformAiSummaryPayloadToState(aiSummaryPayload) {
144
+ if (aiSummaryPayload == null) {
145
+ return null;
146
+ }
147
+ const { chain_status: chainStatus } = aiSummaryPayload;
148
+ return {
149
+ accountIdentified: aiSummaryPayload.account_identified,
150
+ transactionsExtracted: aiSummaryPayload.transactions_extracted,
151
+ exceptionsDetected: aiSummaryPayload.exceptions_detected,
152
+ fieldsCaptured: (aiSummaryPayload.fields_captured ?? []).map((field) => ({
153
+ code: field.code,
154
+ label: field.label,
155
+ })),
156
+ chainStatus: {
157
+ code: chainStatus?.code ?? '',
158
+ label: chainStatus?.label ?? '',
159
+ expectedStartDate: chainStatus?.expected_start_date ?? null,
160
+ previousReconciliationInfo: transformPreviousReconciliationInfoToState(chainStatus?.previous_reconciliation_info),
161
+ },
162
+ };
163
+ }
164
+ /**
165
+ * Builds date-conflict state from a 409 Confirm & Save response.
166
+ * Returns null for non-409 responses or 409s without a recognized error code.
167
+ */
168
+ function transformStatementDateConflictToState(response) {
169
+ if (isStatementDateConflictResponse(response) === false) {
170
+ return null;
171
+ }
172
+ const previousReconciliationInfo = transformPreviousReconciliationInfoToState(response.previous_reconciliation_info);
173
+ if (response.error_code === 'STATEMENT_RANGE_ALREADY_RECONCILED' &&
174
+ previousReconciliationInfo == null) {
175
+ return null;
176
+ }
177
+ if (response.error_code === 'STATEMENT_RANGE_HAS_GAP' &&
178
+ response.expected_start_date == null &&
179
+ previousReconciliationInfo == null) {
180
+ return null;
181
+ }
182
+ return {
183
+ errorCode: response.error_code,
184
+ expectedStartDate: response.expected_start_date ?? null,
185
+ ...(previousReconciliationInfo != null ? { previousReconciliationInfo } : {}),
186
+ };
187
+ }
188
+ function transformParseStatementPayloadToState(payload) {
189
+ return {
190
+ statementUpload: transformStatementUploadPayloadToState(payload.statement_upload),
191
+ };
192
+ }
193
+ function transformUpdateStatementInfoPayloadToState(payload) {
194
+ return {
195
+ statementUpload: transformStatementUploadPayloadToState(payload.statement_upload),
196
+ };
197
+ }
198
+ function transformStatementUpdateStateToPayload(localData) {
199
+ const { statementMeta, statementTransactions } = localData;
200
+ return {
201
+ statement_meta: {
202
+ opening_balance: statementMeta.openingBalance,
203
+ statement_end_date: statementMeta.statementEndDate,
204
+ statement_start_date: statementMeta.statementStartDate,
205
+ total_deposits: statementMeta.totalDeposits,
206
+ total_payments: statementMeta.totalPayments,
207
+ },
208
+ statement_transactions: {
209
+ added: statementTransactions.added.map((txn) => ({
210
+ amount: txn.amount,
211
+ transaction_date: txn.transactionDate,
212
+ transaction_direction: txn.transactionDirection,
213
+ transaction_memo: txn.transactionMemo,
214
+ })),
215
+ deleted_ids: statementTransactions.deletedIds,
216
+ updated: statementTransactions.updated
217
+ .filter((txn) => txn.statementTransactionId != null)
218
+ .map((txn) => ({
219
+ amount: txn.amount,
220
+ statement_transaction_id: txn.statementTransactionId,
221
+ transaction_date: txn.transactionDate,
222
+ transaction_direction: txn.transactionDirection,
223
+ transaction_memo: txn.transactionMemo,
224
+ })),
225
+ },
226
+ };
227
+ }
228
+ /** API request body for PUT statement-uploads; cast lives here for putAndGetJSON. */
229
+ function toStatementUpdateRequestBody(localData) {
230
+ return transformStatementUpdateStateToPayload(localData);
231
+ }
@@ -19,6 +19,13 @@ export interface TransactionCategorizationQueryPayload {
19
19
  * on the backend.
20
20
  */
21
21
  sub_tab: CompletedSubTab;
22
+ /**
23
+ * When `false`, the backend scopes the search to the active tab's
24
+ * categorization status (respects `auto_categorized`). When `true` or
25
+ * omitted, the backend searches across all statuses — the legacy behaviour
26
+ * that the Receipts manual-match flow relies on.
27
+ */
28
+ search_all_statuses?: boolean;
22
29
  }
23
30
  export interface TransactionCategorizationPayload {
24
31
  next_page_token: string | null;
@@ -3,7 +3,7 @@ import { ID } from '../../../commonStateTypes/common';
3
3
  import { MonthYearPeriod } from '../../../commonStateTypes/timePeriod';
4
4
  import { PageToken } from '../../../commonStateTypes/viewAndReport/viewAndReport';
5
5
  import { ZeniAPIStatus } from '../../../responsePayload';
6
- import { FluxAnalysisOperatingExpensePayload, FluxAnalysisTotalPayload, PageMetadataPayload } from '../payload/fluxAnalysisPayload';
6
+ import { FluxAnalysisOperatingExpensePayload, FluxAnalysisReportStatusPayload, FluxAnalysisTotalPayload, PageMetadataPayload } from '../payload/fluxAnalysisPayload';
7
7
  import { FluxAnalysisSectionType } from '../selectorTypes/fluxAnalysisViewSelectorTypes';
8
8
  import { FluxAnalysisActionType, FluxAnalysisViewState, FluxAnalysisViewUIState } from '../types/fluxAnalysisViewState';
9
9
  export declare const initialState: FluxAnalysisViewState;
@@ -21,6 +21,7 @@ export declare const fetchFluxAnalysisView: import("@reduxjs/toolkit").ActionCre
21
21
  fetchReimbursement: boolean;
22
22
  selectedPeriod: MonthYearPeriod;
23
23
  keepExistingListItems?: boolean;
24
+ status?: FluxAnalysisReportStatusPayload;
24
25
  totalsPayload?: FluxAnalysisTotalPayload;
25
26
  }, "expenseAutomationFluxAnalysisView/fetchFluxAnalysisViewSuccess">, fetchFluxAnalysisViewFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
26
27
  fetchReimbursement: boolean;
@@ -5,6 +5,7 @@ exports.updateSelectedSectionIdsForReview = exports.updateFluxAnalysisViewPageMe
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
7
7
  const vendorState_1 = require("../../../entity/vendor/vendorState");
8
+ const zeniDayJS_1 = require("../../../zeniDayJS");
8
9
  const helpers_1 = require("../helpers/helpers");
9
10
  exports.initialState = {
10
11
  fluxAnalysisEntities: { operatingExpenses: [] },
@@ -35,6 +36,7 @@ exports.initialState = {
35
36
  fetchState: 'Not-Started',
36
37
  error: undefined,
37
38
  currency: vendorState_1.defaultVendorCurrency,
39
+ lastRefreshSuccessTime: undefined,
38
40
  totalBalancesAndVariance: undefined,
39
41
  hasValidState() {
40
42
  return this.fetchState == 'Completed';
@@ -103,7 +105,7 @@ const expenseAutomationFluxAnalysisView = (0, toolkit_1.createSlice)({
103
105
  },
104
106
  },
105
107
  fetchFluxAnalysisViewSuccess(draft, action) {
106
- const { expensesPayload, selectedPeriod, keepExistingListItems, fetchReimbursement, currency, totalsPayload, } = action.payload;
108
+ const { expensesPayload, selectedPeriod, keepExistingListItems, fetchReimbursement, currency, status, totalsPayload, } = action.payload;
107
109
  const periodId = (0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod);
108
110
  const group = draft.groupsBySelectedPeriod[periodId];
109
111
  const groupToBeFetched = fetchReimbursement
@@ -113,6 +115,9 @@ const expenseAutomationFluxAnalysisView = (0, toolkit_1.createSlice)({
113
115
  // Handle fetch completion
114
116
  handleFetchCompletion(draft, selectedPeriod, fetchReimbursement, groupToBeFetched);
115
117
  draft.fetchState = 'Completed';
118
+ if (status?.last_refresh_success_time != null) {
119
+ draft.lastRefreshSuccessTime = (0, zeniDayJS_1.date)(status.last_refresh_success_time);
120
+ }
116
121
  // Update flux analysis entities
117
122
  const allFluxAnalysisEntities = updateFluxAnalysisEntities(draft.fluxAnalysisEntities, expensesPayload, currency);
118
123
  // Update operating expense ids based on the "keepExistingListItems" flag
@@ -5,7 +5,7 @@ import { MonthYearPeriod } from '../../../commonStateTypes/timePeriod';
5
5
  import { ReconciliationDataPayload } from '../../../entity/accountRecon/accountReconPayload';
6
6
  import { ZeniAPIStatus } from '../../../responsePayload';
7
7
  import { ExcludedAccountFromReconciliationPayload, ReconciliationPayload, UploadStatementDocumentAIPayload } from '../payload/reconciliationPayload';
8
- import { AccountReconciliationLocalData, ActionFetchStates, ExcludeAccountFromReconciliationPayload, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, ReconciliationTabsState, ReconciliationViewState, ReconciliationViewTabType, SaveReconcileDetailActionPayload, SaveReconciliationDetailFailurePayload, TransactionSummary } from '../types/reconciliationViewState';
8
+ import { AccountReconciliationLocalData, ActionFetchStates, ExcludeAccountFromReconciliationPayload, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, ReconciliationTabsState, ReconciliationViewState, ReconciliationViewTabType, SaveReconcileDetailActionPayload, SaveReconciliationDetailFailurePayload, StatementDateConflict, StatementUpdateLocalData, TransactionSummary } from '../types/reconciliationViewState';
9
9
  export declare const initialReconciliationTabsState: ReconciliationTabsState;
10
10
  export declare const initialActionFetchState: ActionFetchStates;
11
11
  export declare const initialState: ReconciliationViewState;
@@ -52,7 +52,9 @@ export declare const fetchReconciliation: import("@reduxjs/toolkit").ActionCreat
52
52
  variancePercentage?: number;
53
53
  }, "expenseAutomationReconciliationView/updateBalancesLocalData">, initialiseLocalDataForSelectedAccountId: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationReconciliationView/initialiseLocalDataForSelectedAccountId">, clearExpenseAutomationReconciliationView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationReconciliationView/clearExpenseAutomationReconciliationView">, updateSelectedDrawerAccountId: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
54
54
  selectedDrawerAccountId?: ID;
55
- }, "expenseAutomationReconciliationView/updateSelectedDrawerAccountId">, updateReviewTabSortState: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
55
+ }, "expenseAutomationReconciliationView/updateSelectedDrawerAccountId">, updateStatementProcessingFailed: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
56
+ statementProcessingFailed: boolean;
57
+ }, "expenseAutomationReconciliationView/updateStatementProcessingFailed">, updateReviewTabSortState: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
56
58
  sortKey: ReconReviewSortKey;
57
59
  sortOrder: SortOrder;
58
60
  }, "expenseAutomationReconciliationView/updateReviewTabSortState">, initializeReconciliationReviewTabLocalData: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[localData: Record<string, ReconciliationReviewTabLocalData>], {
@@ -108,7 +110,55 @@ export declare const fetchReconciliation: import("@reduxjs/toolkit").ActionCreat
108
110
  accountId: ID;
109
111
  error: ZeniAPIStatus;
110
112
  selectedPeriod: MonthYearPeriod;
111
- }, "expenseAutomationReconciliationView/uploadAccountStatementFailure">, updateStatementUploadChosen: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
113
+ }, "expenseAutomationReconciliationView/uploadAccountStatementFailure">, parseStatement: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
114
+ accountId: ID;
115
+ selectedPeriod: MonthYearPeriod;
116
+ statementUploadId: ID;
117
+ }, "expenseAutomationReconciliationView/parseStatement">, parseStatementSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
118
+ accountId: ID;
119
+ selectedPeriod: MonthYearPeriod;
120
+ }, "expenseAutomationReconciliationView/parseStatementSuccess">, parseStatementFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
121
+ accountId: ID;
122
+ error: ZeniAPIStatus;
123
+ selectedPeriod: MonthYearPeriod;
124
+ }, "expenseAutomationReconciliationView/parseStatementFailure">, reparseStatement: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
125
+ accountId: ID;
126
+ selectedPeriod: MonthYearPeriod;
127
+ statementUploadId: ID;
128
+ }, "expenseAutomationReconciliationView/reparseStatement">, reparseStatementSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
129
+ accountId: ID;
130
+ selectedPeriod: MonthYearPeriod;
131
+ }, "expenseAutomationReconciliationView/reparseStatementSuccess">, reparseStatementFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
132
+ accountId: ID;
133
+ error: ZeniAPIStatus;
134
+ selectedPeriod: MonthYearPeriod;
135
+ }, "expenseAutomationReconciliationView/reparseStatementFailure">, resetReparseStatementStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
136
+ accountId: ID;
137
+ selectedPeriod: MonthYearPeriod;
138
+ }, "expenseAutomationReconciliationView/resetReparseStatementStatus">, updateParsedStatementData: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
139
+ accountId: ID;
140
+ parsedStatementData: ParsedStatementData;
141
+ selectedPeriod: MonthYearPeriod;
142
+ }, "expenseAutomationReconciliationView/updateParsedStatementData">, updateStatementUpdateLocalData: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
143
+ accountId: ID;
144
+ selectedPeriod: MonthYearPeriod;
145
+ statementUpdateLocalData: StatementUpdateLocalData;
146
+ }, "expenseAutomationReconciliationView/updateStatementUpdateLocalData">, submitStatementUpdate: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
147
+ accountId: ID;
148
+ selectedPeriod: MonthYearPeriod;
149
+ statementUploadId: ID;
150
+ }, "expenseAutomationReconciliationView/submitStatementUpdate">, submitStatementUpdateSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
151
+ accountId: ID;
152
+ selectedPeriod: MonthYearPeriod;
153
+ }, "expenseAutomationReconciliationView/submitStatementUpdateSuccess">, submitStatementUpdateFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
154
+ accountId: ID;
155
+ error: ZeniAPIStatus;
156
+ selectedPeriod: MonthYearPeriod;
157
+ dateConflict?: StatementDateConflict | null;
158
+ }, "expenseAutomationReconciliationView/submitStatementUpdateFailure">, clearStatementDateConflict: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
159
+ accountId: ID;
160
+ selectedPeriod: MonthYearPeriod;
161
+ }, "expenseAutomationReconciliationView/clearStatementDateConflict">, updateStatementUploadChosen: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
112
162
  statementUploadChosen: boolean;
113
163
  }, "expenseAutomationReconciliationView/updateStatementUploadChosen">, updateNodeCollapseState: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
114
164
  collapsed: boolean;