@zeniai/client-epic-state 5.2.0 → 5.2.1

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 (57) hide show
  1. package/lib/entity/accountRecon/accountReconReducer.js +4 -0
  2. package/lib/entity/accountRecon/accountReconState.d.ts +4 -1
  3. package/lib/entity/accountRecon/accountReconState.js +1 -0
  4. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  5. package/lib/entity/snackbar/snackbarTypes.js +1 -0
  6. package/lib/epic.d.ts +4 -1
  7. package/lib/epic.js +4 -1
  8. package/lib/esm/entity/accountRecon/accountReconReducer.js +4 -0
  9. package/lib/esm/entity/accountRecon/accountReconState.js +1 -0
  10. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
  11. package/lib/esm/epic.js +4 -1
  12. package/lib/esm/index.js +3 -3
  13. package/lib/esm/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +43 -0
  14. package/lib/esm/view/expenseAutomationView/epics/accountRecon/deleteAccountStatementEpic.js +1 -2
  15. package/lib/esm/view/expenseAutomationView/epics/accountRecon/parseCombinedStatementEpic.js +31 -0
  16. package/lib/esm/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +15 -18
  17. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +68 -0
  18. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +10 -10
  19. package/lib/esm/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +12 -4
  20. package/lib/esm/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementEpic.js +8 -2
  21. package/lib/esm/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +20 -5
  22. package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +135 -0
  23. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +120 -16
  24. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +38 -7
  25. package/lib/esm/view/expenseAutomationView/selectors/statementParseViewSelector.js +43 -10
  26. package/lib/esm/view/expenseAutomationView/types/reconciliationViewState.js +15 -1
  27. package/lib/index.d.ts +4 -4
  28. package/lib/index.js +51 -46
  29. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.d.ts +34 -0
  30. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +47 -0
  31. package/lib/view/expenseAutomationView/epics/accountRecon/deleteAccountStatementEpic.d.ts +2 -2
  32. package/lib/view/expenseAutomationView/epics/accountRecon/deleteAccountStatementEpic.js +0 -1
  33. package/lib/view/expenseAutomationView/epics/accountRecon/parseCombinedStatementEpic.d.ts +26 -0
  34. package/lib/view/expenseAutomationView/epics/accountRecon/parseCombinedStatementEpic.js +35 -0
  35. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.d.ts +21 -1
  36. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +15 -18
  37. package/lib/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.d.ts +27 -0
  38. package/lib/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +72 -0
  39. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +10 -10
  40. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.d.ts +1 -1
  41. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +12 -4
  42. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementEpic.js +7 -1
  43. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.d.ts +1 -0
  44. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +20 -4
  45. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  46. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +109 -4
  47. package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +143 -0
  48. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +32 -4
  49. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +122 -18
  50. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +5 -1
  51. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.d.ts +4 -1
  52. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +40 -7
  53. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.d.ts +3 -2
  54. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.js +44 -10
  55. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +74 -1
  56. package/lib/view/expenseAutomationView/types/reconciliationViewState.js +19 -1
  57. package/package.json +1 -1
@@ -9,7 +9,7 @@ import { MatchedTransactionPayload } from '../../../entity/transaction/payloadTy
9
9
  import { UserPayload } from '../../../entity/user/userPayload';
10
10
  import { RootState } from '../../../reducer';
11
11
  import { ZeniAPIResponse, ZeniAPIStatus } from '../../../responsePayload';
12
- import { BalancesLocalData, ParsedStatementData, SaveReconcileDetailActionPayload, StatementDateConflict, StatementUpdateLocalData, StatementUpdateLocalDataPayload } from '../types/reconciliationViewState';
12
+ import { BalancesLocalData, ConfirmStatementMappingConflict, ConfirmedCombinedStatementUpload, ParsedStatementData, SaveReconcileDetailActionPayload, StatementDateConflict, StatementUpdateLocalData, StatementUpdateLocalDataPayload } from '../types/reconciliationViewState';
13
13
  export interface DetectionInfoPayload {
14
14
  account_id: string;
15
15
  bank_balance: number | null;
@@ -119,6 +119,9 @@ export interface StatementUploadSummaryPayload {
119
119
  statement_start_date: string;
120
120
  statement_status: StatusCodeWithLabelPayload;
121
121
  statement_upload_id: string;
122
+ combined_statement_group_id?: string | null;
123
+ is_combined_statement?: boolean | null;
124
+ is_combined_statement_anchor?: boolean | null;
122
125
  }
123
126
  export interface UploadStatementResponsePayload {
124
127
  file: FilePayload;
@@ -162,6 +165,10 @@ export interface StatementMetaPayload {
162
165
  statement_upload_id: string;
163
166
  total_deposits: number;
164
167
  total_payments: number;
168
+ balance_source?: string | null;
169
+ combined_statement_group_id?: string | null;
170
+ is_combined_statement?: boolean | null;
171
+ is_combined_statement_anchor?: boolean | null;
165
172
  }
166
173
  export interface AccountInfoPayload {
167
174
  account_id: string;
@@ -199,17 +206,85 @@ export interface AiSummaryPayload {
199
206
  fields_captured: AiSummaryFieldPayload[];
200
207
  transactions_extracted: number;
201
208
  }
209
+ export interface CombinedStatementAccountSuggestionPayload {
210
+ account_id: string;
211
+ account_name: string;
212
+ match_confidence: number;
213
+ matched_by: string;
214
+ }
215
+ export interface CombinedStatementAccountPayload {
216
+ account_name: string;
217
+ account_type: string;
218
+ closing_balance: number;
219
+ is_upload_context: boolean;
220
+ ledger_identifier: string;
221
+ masked_account_number: string;
222
+ opening_balance: number;
223
+ transaction_count: number;
224
+ existing_statement_status?: StatusCodeWithLabelPayload | null;
225
+ suggestion?: CombinedStatementAccountSuggestionPayload | null;
226
+ }
227
+ export interface ConfirmedCombinedStatementUploadPayload {
228
+ account_id: string;
229
+ is_combined_statement_anchor: boolean;
230
+ ledger_identifiers: string[];
231
+ statement_upload_id: string;
232
+ }
233
+ export interface CombinedStatementDetailsPayload {
234
+ accounts: CombinedStatementAccountPayload[];
235
+ combined_statement_group_id: string;
236
+ is_mapping_confirmed: boolean;
237
+ statement_uploads: ConfirmedCombinedStatementUploadPayload[];
238
+ }
202
239
  export interface StatementUploadPayload {
203
240
  account: AccountInfoPayload;
204
241
  file: FileInfoPayload | null;
205
242
  statement_meta: StatementMetaPayload;
206
243
  statement_transactions: StatementTransactionPayload[];
207
244
  ai_summary?: AiSummaryPayload | null;
245
+ combined_statement_details?: CombinedStatementDetailsPayload | null;
208
246
  }
209
- export interface ParseStatementResponsePayload {
210
- reconciliation: ReconciliationMetaPayload;
247
+ /** Single-account parse GET — unchanged. */
248
+ export interface ParseStatementSingleResponsePayload {
249
+ reconciliation: ReconciliationMetaPayload | null;
250
+ statement_upload: StatementUploadPayload;
251
+ }
252
+ /** Combined multi-account parse GET (after mapping confirm). */
253
+ export interface ParseStatementCombinedResponsePayload {
254
+ reconciliation: ReconciliationMetaPayload | null;
255
+ statement_uploads: StatementUploadPayload[];
256
+ }
257
+ export type ParseStatementResponsePayload = ParseStatementSingleResponsePayload | ParseStatementCombinedResponsePayload;
258
+ export declare function isParseStatementCombinedResponsePayload(payload: ParseStatementResponsePayload): payload is ParseStatementCombinedResponsePayload;
259
+ /** Batch GET …/combined-statement-groups/<id> — one entry per mapped account. */
260
+ export interface CombinedStatementGroupUploadEntryPayload {
261
+ reconciliation: ReconciliationMetaPayload | null;
211
262
  statement_upload: StatementUploadPayload;
212
263
  }
264
+ export interface CombinedStatementGroupResponsePayload {
265
+ combined_statement_group_id: string;
266
+ statement_uploads: CombinedStatementGroupUploadEntryPayload[];
267
+ }
268
+ export type CombinedStatementGroupResponse = ZeniAPIResponse<CombinedStatementGroupResponsePayload>;
269
+ export interface ConfirmStatementMappingRequestPayload {
270
+ account_mappings: Array<{
271
+ account_id: string;
272
+ ledger_identifier: string;
273
+ }>;
274
+ }
275
+ export interface ConfirmStatementMappingResponsePayload {
276
+ statement_uploads: ConfirmedCombinedStatementUploadPayload[];
277
+ }
278
+ export type ConfirmStatementMappingSuccessResponse = ZeniAPIResponse<ConfirmStatementMappingResponsePayload>;
279
+ export interface ConfirmStatementMappingConflictResponse extends ZeniAPIResponse<ConfirmStatementMappingResponsePayload | undefined> {
280
+ status: ZeniAPIStatus & {
281
+ code: 409;
282
+ };
283
+ colliding_account_id?: string | null;
284
+ colliding_ledger_identifiers?: string[] | null;
285
+ previous_reconciliation_info?: PreviousReconciliationInfoPayload | null;
286
+ }
287
+ export type ConfirmStatementMappingResponse = ConfirmStatementMappingSuccessResponse | ConfirmStatementMappingConflictResponse;
213
288
  export interface ReparseStatementResponsePayload {
214
289
  statement_upload: StatementUploadSummaryPayload;
215
290
  }
@@ -232,11 +307,28 @@ export interface StatementDateAdjustmentPayload {
232
307
  previous_reconciliation_info: PreviousReconciliationInfoPayload;
233
308
  reason: string;
234
309
  }
235
- export interface UpdateStatementInfoResponsePayload {
310
+ /** Single-account Confirm & Save response — unchanged. */
311
+ export interface UpdateStatementInfoSingleResponsePayload {
236
312
  reconciliation: ReconciliationMetaPayload;
237
313
  statement_upload: StatementUploadPayload;
238
314
  date_adjustment?: StatementDateAdjustmentPayload | null;
239
315
  }
316
+ /** Combined multi-account bulk Confirm & Save response. */
317
+ export interface UpdateStatementInfoCombinedResponsePayload {
318
+ reconciliation: ReconciliationMetaPayload;
319
+ statement_uploads: StatementUploadPayload[];
320
+ date_adjustment?: StatementDateAdjustmentPayload | null;
321
+ }
322
+ export type UpdateStatementInfoResponsePayload = UpdateStatementInfoSingleResponsePayload | UpdateStatementInfoCombinedResponsePayload;
323
+ export declare function isUpdateStatementInfoCombinedResponsePayload(payload: UpdateStatementInfoResponsePayload): payload is UpdateStatementInfoCombinedResponsePayload;
324
+ export interface BulkStatementUpdateUploadPayload {
325
+ statement_meta: StatementUpdateLocalDataPayload['statement_meta'];
326
+ statement_transactions: StatementUpdateLocalDataPayload['statement_transactions'];
327
+ statement_upload_id: string;
328
+ }
329
+ export interface BulkStatementUpdateRequestPayload {
330
+ statement_uploads: BulkStatementUpdateUploadPayload[];
331
+ }
240
332
  /** 2xx Confirm & Save — carries parsed statement data, no chain-validation errors. */
241
333
  export interface UpdateStatementInfoSuccessResponse extends ZeniAPIResponse<UpdateStatementInfoResponsePayload> {
242
334
  error_code?: undefined;
@@ -260,8 +352,21 @@ export declare function isStatementDateConflictResponse(response: UpdateStatemen
260
352
  */
261
353
  export declare function transformStatementDateConflictToState(response: UpdateStatementInfoResponse): StatementDateConflict | null;
262
354
  export declare function transformParseStatementPayloadToState(payload: ParseStatementResponsePayload): ParsedStatementData;
355
+ export declare function transformCombinedStatementGroupPayloadToState(payload: CombinedStatementGroupResponsePayload): ParsedStatementData;
356
+ export declare function isConfirmStatementMappingConflictResponse(response: ConfirmStatementMappingResponse): response is ConfirmStatementMappingConflictResponse;
357
+ export declare function transformConfirmStatementMappingPayloadToState(payload: ConfirmStatementMappingResponsePayload): ConfirmedCombinedStatementUpload[];
358
+ export declare function transformConfirmStatementMappingConflictToState(response: ConfirmStatementMappingResponse): ConfirmStatementMappingConflict | null;
263
359
  export declare function transformUpdateStatementInfoPayloadToState(payload: UpdateStatementInfoResponsePayload): ParsedStatementData;
264
360
  export declare function transformStatementUpdateStateToPayload(localData: StatementUpdateLocalData): StatementUpdateLocalDataPayload;
265
361
  /** API request body for PUT statement-uploads; cast lives here for putAndGetJSON. */
266
362
  export declare function toStatementUpdateRequestBody(localData: StatementUpdateLocalData): Record<string, unknown>;
363
+ export declare function transformBulkStatementUpdateStateToPayload(updates: Array<{
364
+ localData: StatementUpdateLocalData;
365
+ statementUploadId: string;
366
+ }>): BulkStatementUpdateRequestPayload;
367
+ /** Bulk PUT body for combined multi-account Confirm & Save. */
368
+ export declare function toBulkStatementUpdateRequestBody(updates: Array<{
369
+ localData: StatementUpdateLocalData;
370
+ statementUploadId: string;
371
+ }>): Record<string, unknown>;
267
372
  export {};
@@ -1,15 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSaveReconciliationPayloadBasedOnActionAndMethod = createSaveReconciliationPayloadBasedOnActionAndMethod;
4
+ exports.isParseStatementCombinedResponsePayload = isParseStatementCombinedResponsePayload;
5
+ exports.isUpdateStatementInfoCombinedResponsePayload = isUpdateStatementInfoCombinedResponsePayload;
4
6
  exports.isStatementDateConflictResponse = isStatementDateConflictResponse;
5
7
  exports.transformStatementDateConflictToState = transformStatementDateConflictToState;
6
8
  exports.transformParseStatementPayloadToState = transformParseStatementPayloadToState;
9
+ exports.transformCombinedStatementGroupPayloadToState = transformCombinedStatementGroupPayloadToState;
10
+ exports.isConfirmStatementMappingConflictResponse = isConfirmStatementMappingConflictResponse;
11
+ exports.transformConfirmStatementMappingPayloadToState = transformConfirmStatementMappingPayloadToState;
12
+ exports.transformConfirmStatementMappingConflictToState = transformConfirmStatementMappingConflictToState;
7
13
  exports.transformUpdateStatementInfoPayloadToState = transformUpdateStatementInfoPayloadToState;
8
14
  exports.transformStatementUpdateStateToPayload = transformStatementUpdateStateToPayload;
9
15
  exports.toStatementUpdateRequestBody = toStatementUpdateRequestBody;
16
+ exports.transformBulkStatementUpdateStateToPayload = transformBulkStatementUpdateStateToPayload;
17
+ exports.toBulkStatementUpdateRequestBody = toBulkStatementUpdateRequestBody;
10
18
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
11
19
  const accountReconPayload_1 = require("../../../entity/accountRecon/accountReconPayload");
12
20
  const reconciliationTransactionPayloads_1 = require("../../../entity/transaction/payloadTypes/reconciliationTransactionPayloads");
21
+ const reconciliationViewState_1 = require("../types/reconciliationViewState");
13
22
  function createSaveReconciliationPayloadBasedOnActionAndMethod(state, selectedPeriod, localData, accountReconciliationEntity, action, method) {
14
23
  const { balance, initialClearedBalance } = accountReconciliationEntity;
15
24
  const { expenseAutomationReconciliationViewState: { selectedAccountId, reconTabsState: { reconcile: { localData: { selectedTransactionIds }, }, }, }, } = state;
@@ -76,10 +85,60 @@ function createReviewTransactionPayload(accountReconciliationEntity) {
76
85
  });
77
86
  return reviewTransactionsPayload;
78
87
  }
88
+ function isParseStatementCombinedResponsePayload(payload) {
89
+ return ('statement_uploads' in payload &&
90
+ Array.isArray(payload.statement_uploads) &&
91
+ payload.statement_uploads.length > 0 &&
92
+ // Batch group GET nests each upload under statement_upload — exclude that shape.
93
+ 'statement_upload' in (payload.statement_uploads[0] ?? {}) === false);
94
+ }
95
+ function isUpdateStatementInfoCombinedResponsePayload(payload) {
96
+ return ('statement_uploads' in payload &&
97
+ Array.isArray(payload.statement_uploads) &&
98
+ payload.statement_uploads.length > 0);
99
+ }
79
100
  function isStatementDateConflictResponse(response) {
80
101
  return response.status.code === 409 && response.error_code != null;
81
102
  }
103
+ function transformConfirmedCombinedStatementUploadsToState(statementUploads) {
104
+ return (statementUploads ?? []).map((statementUpload) => ({
105
+ accountId: statementUpload.account_id,
106
+ isCombinedStatementAnchor: statementUpload.is_combined_statement_anchor,
107
+ ledgerIdentifiers: statementUpload.ledger_identifiers ?? [],
108
+ statementUploadId: statementUpload.statement_upload_id,
109
+ }));
110
+ }
111
+ function transformCombinedStatementDetailsToState(details) {
112
+ if (details == null) {
113
+ return undefined;
114
+ }
115
+ return {
116
+ combinedStatementGroupId: details.combined_statement_group_id,
117
+ isMappingConfirmed: details.is_mapping_confirmed,
118
+ accounts: (details.accounts ?? []).map((account) => ({
119
+ ledgerIdentifier: account.ledger_identifier,
120
+ accountName: account.account_name,
121
+ accountType: account.account_type,
122
+ maskedAccountNumber: account.masked_account_number,
123
+ openingBalance: account.opening_balance,
124
+ closingBalance: account.closing_balance,
125
+ transactionCount: account.transaction_count,
126
+ isUploadContext: account.is_upload_context,
127
+ existingStatementStatus: account.existing_statement_status ?? null,
128
+ suggestion: account.suggestion != null
129
+ ? {
130
+ accountId: account.suggestion.account_id,
131
+ accountName: account.suggestion.account_name,
132
+ matchedBy: account.suggestion.matched_by,
133
+ matchConfidence: account.suggestion.match_confidence,
134
+ }
135
+ : null,
136
+ })),
137
+ statementUploads: transformConfirmedCombinedStatementUploadsToState(details.statement_uploads),
138
+ };
139
+ }
82
140
  function transformStatementUploadPayloadToState(statementUploadPayload) {
141
+ const balanceSource = (0, reconciliationViewState_1.toStatementBalanceSourceStrict)(statementUploadPayload.statement_meta.balance_source);
83
142
  return {
84
143
  account: {
85
144
  accountId: statementUploadPayload.account.account_id,
@@ -105,6 +164,13 @@ function transformStatementUploadPayloadToState(statementUploadPayload) {
105
164
  statementUploadId: statementUploadPayload.statement_meta.statement_upload_id,
106
165
  totalDeposits: statementUploadPayload.statement_meta.total_deposits,
107
166
  totalPayments: statementUploadPayload.statement_meta.total_payments,
167
+ isCombinedStatement: statementUploadPayload.statement_meta.is_combined_statement ??
168
+ undefined,
169
+ isCombinedStatementAnchor: statementUploadPayload.statement_meta.is_combined_statement_anchor ??
170
+ undefined,
171
+ combinedStatementGroupId: statementUploadPayload.statement_meta.combined_statement_group_id ??
172
+ undefined,
173
+ ...(balanceSource != null ? { balanceSource } : {}),
108
174
  },
109
175
  statementTransactions: (statementUploadPayload.statement_transactions ?? []).map((txn) => ({
110
176
  amount: txn.amount,
@@ -126,6 +192,7 @@ function transformStatementUploadPayloadToState(statementUploadPayload) {
126
192
  transactionMemo: txn.transaction_memo,
127
193
  })),
128
194
  aiSummary: transformAiSummaryPayloadToState(statementUploadPayload.ai_summary),
195
+ combinedStatementDetails: transformCombinedStatementDetailsToState(statementUploadPayload.combined_statement_details),
129
196
  };
130
197
  }
131
198
  function transformPreviousReconciliationInfoToState(payload) {
@@ -186,11 +253,71 @@ function transformStatementDateConflictToState(response) {
186
253
  };
187
254
  }
188
255
  function transformParseStatementPayloadToState(payload) {
256
+ if (isParseStatementCombinedResponsePayload(payload) === true) {
257
+ const statementUploads = payload.statement_uploads.map(transformStatementUploadPayloadToState);
258
+ const anchorUpload = statementUploads.find((upload) => upload.statementMeta.isCombinedStatementAnchor === true) ?? statementUploads[0];
259
+ return {
260
+ statementUpload: anchorUpload,
261
+ statementUploads,
262
+ };
263
+ }
189
264
  return {
190
265
  statementUpload: transformStatementUploadPayloadToState(payload.statement_upload),
191
266
  };
192
267
  }
268
+ function transformCombinedStatementGroupPayloadToState(payload) {
269
+ const groupId = payload.combined_statement_group_id;
270
+ const statementUploads = (payload.statement_uploads ?? []).map((entry) => {
271
+ const upload = transformStatementUploadPayloadToState(entry.statement_upload);
272
+ if ((upload.statementMeta.combinedStatementGroupId == null ||
273
+ upload.statementMeta.combinedStatementGroupId === '') &&
274
+ groupId !== '') {
275
+ return {
276
+ ...upload,
277
+ statementMeta: {
278
+ ...upload.statementMeta,
279
+ combinedStatementGroupId: groupId,
280
+ },
281
+ };
282
+ }
283
+ return upload;
284
+ });
285
+ if (statementUploads.length === 0) {
286
+ throw new Error('Combined statement response has no statement uploads');
287
+ }
288
+ const anchorUpload = statementUploads.find((upload) => upload.statementMeta.isCombinedStatementAnchor === true) ?? statementUploads[0];
289
+ return {
290
+ statementUpload: anchorUpload,
291
+ statementUploads,
292
+ };
293
+ }
294
+ function isConfirmStatementMappingConflictResponse(response) {
295
+ return response.status.code === 409;
296
+ }
297
+ function transformConfirmStatementMappingPayloadToState(payload) {
298
+ return transformConfirmedCombinedStatementUploadsToState(payload.statement_uploads);
299
+ }
300
+ function transformConfirmStatementMappingConflictToState(response) {
301
+ if (isConfirmStatementMappingConflictResponse(response) === false) {
302
+ return null;
303
+ }
304
+ return {
305
+ collidingAccountId: response.colliding_account_id != null
306
+ ? response.colliding_account_id
307
+ : undefined,
308
+ collidingLedgerIdentifiers: response.colliding_ledger_identifiers ?? [],
309
+ previousReconciliationInfo: transformPreviousReconciliationInfoToState(response.previous_reconciliation_info),
310
+ };
311
+ }
193
312
  function transformUpdateStatementInfoPayloadToState(payload) {
313
+ if (isUpdateStatementInfoCombinedResponsePayload(payload) === true) {
314
+ const statementUploads = payload.statement_uploads.map(transformStatementUploadPayloadToState);
315
+ const anchorUpload = statementUploads.find((upload) => upload.statementMeta.isCombinedStatementAnchor === true) ?? statementUploads[0];
316
+ return {
317
+ statementUpload: anchorUpload,
318
+ statementUploads,
319
+ };
320
+ }
194
321
  return {
195
322
  statementUpload: transformStatementUploadPayloadToState(payload.statement_upload),
196
323
  };
@@ -230,3 +357,19 @@ function transformStatementUpdateStateToPayload(localData) {
230
357
  function toStatementUpdateRequestBody(localData) {
231
358
  return transformStatementUpdateStateToPayload(localData);
232
359
  }
360
+ function transformBulkStatementUpdateStateToPayload(updates) {
361
+ return {
362
+ statement_uploads: updates.map(({ localData, statementUploadId }) => {
363
+ const body = transformStatementUpdateStateToPayload(localData);
364
+ return {
365
+ statement_upload_id: statementUploadId,
366
+ statement_meta: body.statement_meta,
367
+ statement_transactions: body.statement_transactions,
368
+ };
369
+ }),
370
+ };
371
+ }
372
+ /** Bulk PUT body for combined multi-account Confirm & Save. */
373
+ function toBulkStatementUpdateRequestBody(updates) {
374
+ return transformBulkStatementUpdateStateToPayload(updates);
375
+ }
@@ -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, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, ReconciliationTabsState, ReconciliationViewState, ReconciliationViewTabType, SaveReconcileDetailActionPayload, SaveReconciliationDetailFailurePayload, StatementDateConflict, StatementUpdateLocalData, TransactionSummary } from '../types/reconciliationViewState';
8
+ import { AccountReconciliationLocalData, ActionFetchStates, ConfirmStatementMappingConflict, ConfirmedCombinedStatementUpload, ExcludeAccountFromReconciliationPayload, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, ReconciliationTabsState, ReconciliationViewState, ReconciliationViewTabType, SaveReconcileDetailActionPayload, SaveReconciliationDetailFailurePayload, StatementAccountScope, 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;
@@ -116,6 +116,7 @@ export declare const fetchReconciliation: import("@reduxjs/toolkit").ActionCreat
116
116
  accountId: ID;
117
117
  payload: UploadStatementDocumentAIPayload;
118
118
  selectedPeriod: MonthYearPeriod;
119
+ statementAccountScope?: StatementAccountScope;
119
120
  }, "expenseAutomationReconciliationView/uploadAccountStatement">, uploadAccountStatementSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
120
121
  accountId: ID;
121
122
  selectedPeriod: MonthYearPeriod;
@@ -127,7 +128,12 @@ export declare const fetchReconciliation: import("@reduxjs/toolkit").ActionCreat
127
128
  accountId: ID;
128
129
  selectedPeriod: MonthYearPeriod;
129
130
  statementUploadId: ID;
130
- }, "expenseAutomationReconciliationView/parseStatement">, parseStatementSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
131
+ }, "expenseAutomationReconciliationView/parseStatement">, parseCombinedStatement: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
132
+ accountId: ID;
133
+ combinedStatementGroupId: string;
134
+ selectedPeriod: MonthYearPeriod;
135
+ statementUploadId: ID;
136
+ }, "expenseAutomationReconciliationView/parseCombinedStatement">, parseStatementSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
131
137
  accountId: ID;
132
138
  selectedPeriod: MonthYearPeriod;
133
139
  }, "expenseAutomationReconciliationView/parseStatementSuccess">, parseStatementFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
@@ -156,11 +162,16 @@ export declare const fetchReconciliation: import("@reduxjs/toolkit").ActionCreat
156
162
  accountId: ID;
157
163
  selectedPeriod: MonthYearPeriod;
158
164
  statementUpdateLocalData: StatementUpdateLocalData;
165
+ statementUploadId: ID | string;
159
166
  }, "expenseAutomationReconciliationView/updateStatementUpdateLocalData">, submitStatementUpdate: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
160
167
  accountId: ID;
161
168
  selectedPeriod: MonthYearPeriod;
162
169
  statementUploadId: ID;
163
- }, "expenseAutomationReconciliationView/submitStatementUpdate">, submitStatementUpdateSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
170
+ }, "expenseAutomationReconciliationView/submitStatementUpdate">, submitCombinedStatementUpdate: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
171
+ accountId: ID;
172
+ selectedPeriod: MonthYearPeriod;
173
+ statementUploadId: ID;
174
+ }, "expenseAutomationReconciliationView/submitCombinedStatementUpdate">, submitStatementUpdateSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
164
175
  accountId: ID;
165
176
  selectedPeriod: MonthYearPeriod;
166
177
  }, "expenseAutomationReconciliationView/submitStatementUpdateSuccess">, submitStatementUpdateFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
@@ -171,7 +182,24 @@ export declare const fetchReconciliation: import("@reduxjs/toolkit").ActionCreat
171
182
  }, "expenseAutomationReconciliationView/submitStatementUpdateFailure">, clearStatementDateConflict: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
172
183
  accountId: ID;
173
184
  selectedPeriod: MonthYearPeriod;
174
- }, "expenseAutomationReconciliationView/clearStatementDateConflict">, updateStatementUploadChosen: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
185
+ }, "expenseAutomationReconciliationView/clearStatementDateConflict">, confirmStatementMapping: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
186
+ accountId: ID;
187
+ accountMappings: Array<{
188
+ accountId: ID;
189
+ ledgerIdentifier: string;
190
+ }>;
191
+ selectedPeriod: MonthYearPeriod;
192
+ statementUploadId: ID;
193
+ }, "expenseAutomationReconciliationView/confirmStatementMapping">, confirmStatementMappingSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
194
+ accountId: ID;
195
+ selectedPeriod: MonthYearPeriod;
196
+ statementUploads: ConfirmedCombinedStatementUpload[];
197
+ }, "expenseAutomationReconciliationView/confirmStatementMappingSuccess">, confirmStatementMappingFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
198
+ accountId: ID;
199
+ error: ZeniAPIStatus;
200
+ selectedPeriod: MonthYearPeriod;
201
+ mappingConflict?: ConfirmStatementMappingConflict | null;
202
+ }, "expenseAutomationReconciliationView/confirmStatementMappingFailure">, updateStatementUploadChosen: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
175
203
  statementUploadChosen: boolean;
176
204
  }, "expenseAutomationReconciliationView/updateStatementUploadChosen">, updateNodeCollapseState: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
177
205
  collapsed: boolean;