@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
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.updateParsedStatementData = exports.resetReparseStatementStatus = exports.reparseStatementFailure = exports.reparseStatementSuccess = exports.reparseStatement = exports.parseStatementFailure = exports.parseStatementSuccess = exports.parseStatement = exports.uploadAccountStatementFailure = exports.uploadAccountStatementSuccess = exports.uploadAccountStatement = exports.includeAccountInReconciliationFailure = exports.includeAccountInReconciliationSuccess = exports.includeAccountInReconciliation = exports.excludeAccountFromReconciliationFailure = exports.excludeAccountFromReconciliationSuccess = exports.excludeAccountFromReconciliation = exports.deleteAccountStatementFailure = exports.deleteAccountStatementSuccess = exports.deleteAccountStatement = exports.updateAccountReconciliationLocalData = exports.updateReconListScrollPosition = exports.updateSaveReconciliationReviewFetchStatus = exports.saveReconciliationReview = exports.updateReviewTabLocalData = exports.initializeReconciliationReviewTabLocalData = exports.updateReviewTabSortState = exports.updateStatementProcessingFailed = exports.updateSelectedDrawerAccountId = exports.clearExpenseAutomationReconciliationView = exports.initialiseLocalDataForSelectedAccountId = exports.updateBalancesLocalData = exports.updateSelectedTab = exports.saveReconciliationDetailSuccess = exports.updateReconcileTabListScrollState = exports.updateReconcileTabListSortState = exports.updateReconcileTabLocalData = exports.updateStatementProcessingBackgroundCompletedSteps = exports.setStatementProcessingDismissedToBackground = exports.setStatementParseInProgress = exports.setConnectionInProgressForAccount = exports.updateSelectedAccountId = exports.saveReconciliationDetailFailure = exports.saveReconciliationDetail = exports.fetchReconciliationSuccess = exports.fetchReconciliationFailure = exports.fetchReconciliation = exports.initialState = exports.initialActionFetchState = exports.initialReconciliationTabsState = void 0;
5
- exports.updateNodeCollapseState = exports.updateStatementUploadChosen = exports.clearStatementDateConflict = exports.submitStatementUpdateFailure = exports.submitStatementUpdateSuccess = exports.submitStatementUpdate = exports.updateStatementUpdateLocalData = void 0;
4
+ exports.resetReparseStatementStatus = exports.reparseStatementFailure = exports.reparseStatementSuccess = exports.reparseStatement = exports.parseStatementFailure = exports.parseStatementSuccess = exports.parseCombinedStatement = exports.parseStatement = exports.uploadAccountStatementFailure = exports.uploadAccountStatementSuccess = exports.uploadAccountStatement = exports.includeAccountInReconciliationFailure = exports.includeAccountInReconciliationSuccess = exports.includeAccountInReconciliation = exports.excludeAccountFromReconciliationFailure = exports.excludeAccountFromReconciliationSuccess = exports.excludeAccountFromReconciliation = exports.deleteAccountStatementFailure = exports.deleteAccountStatementSuccess = exports.deleteAccountStatement = exports.updateAccountReconciliationLocalData = exports.updateReconListScrollPosition = exports.updateSaveReconciliationReviewFetchStatus = exports.saveReconciliationReview = exports.updateReviewTabLocalData = exports.initializeReconciliationReviewTabLocalData = exports.updateReviewTabSortState = exports.updateStatementProcessingFailed = exports.updateSelectedDrawerAccountId = exports.clearExpenseAutomationReconciliationView = exports.initialiseLocalDataForSelectedAccountId = exports.updateBalancesLocalData = exports.updateSelectedTab = exports.saveReconciliationDetailSuccess = exports.updateReconcileTabListScrollState = exports.updateReconcileTabListSortState = exports.updateReconcileTabLocalData = exports.updateStatementProcessingBackgroundCompletedSteps = exports.setStatementProcessingDismissedToBackground = exports.setStatementParseInProgress = exports.setConnectionInProgressForAccount = exports.updateSelectedAccountId = exports.saveReconciliationDetailFailure = exports.saveReconciliationDetail = exports.fetchReconciliationSuccess = exports.fetchReconciliationFailure = exports.fetchReconciliation = exports.initialState = exports.initialActionFetchState = exports.initialReconciliationTabsState = void 0;
5
+ exports.updateNodeCollapseState = exports.updateStatementUploadChosen = exports.confirmStatementMappingFailure = exports.confirmStatementMappingSuccess = exports.confirmStatementMapping = exports.clearStatementDateConflict = exports.submitStatementUpdateFailure = exports.submitStatementUpdateSuccess = exports.submitCombinedStatementUpdate = exports.submitStatementUpdate = exports.updateStatementUpdateLocalData = exports.updateParsedStatementData = void 0;
6
6
  const toolkit_1 = require("@reduxjs/toolkit");
7
7
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
8
8
  const accountState_1 = require("../../../entity/account/accountState");
@@ -435,7 +435,7 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
435
435
  }
436
436
  },
437
437
  uploadAccountStatement: (draft, action) => {
438
- const { accountId, selectedPeriod } = action.payload;
438
+ const { accountId, selectedPeriod, statementAccountScope } = action.payload;
439
439
  const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
440
440
  if (accountRecon != null) {
441
441
  accountRecon.statementUploadStatus = {
@@ -460,6 +460,22 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
460
460
  fetchState: 'Not-Started',
461
461
  error: undefined,
462
462
  };
463
+ accountRecon.combinedStatementGroupId = undefined;
464
+ accountRecon.confirmedCombinedStatementUploads = undefined;
465
+ accountRecon.confirmStatementMappingStatus = {
466
+ fetchState: 'Not-Started',
467
+ error: undefined,
468
+ };
469
+ accountRecon.confirmStatementMappingConflict = null;
470
+ if (accountRecon.localData != null) {
471
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
472
+ }
473
+ if (statementAccountScope != null) {
474
+ accountRecon.localData = {
475
+ ...accountRecon.localData,
476
+ statementAccountScope,
477
+ };
478
+ }
463
479
  }
464
480
  },
465
481
  uploadAccountStatementSuccess: (draft, action) => {
@@ -522,8 +538,16 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
522
538
  fetchState: 'Not-Started',
523
539
  error: undefined,
524
540
  };
541
+ accountRecon.combinedStatementGroupId = undefined;
542
+ accountRecon.confirmedCombinedStatementUploads = undefined;
543
+ accountRecon.confirmStatementMappingStatus = {
544
+ fetchState: 'Not-Started',
545
+ error: undefined,
546
+ };
547
+ accountRecon.confirmStatementMappingConflict = null;
525
548
  if (accountRecon.localData != null) {
526
- accountRecon.localData.statementUpdateLocalData = undefined;
549
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
550
+ accountRecon.localData.statementAccountScope = undefined;
527
551
  }
528
552
  }
529
553
  },
@@ -549,6 +573,17 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
549
573
  };
550
574
  }
551
575
  },
576
+ parseCombinedStatement: (draft, action) => {
577
+ const { accountId, selectedPeriod } = action.payload;
578
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
579
+ if (accountRecon != null) {
580
+ accountRecon.parsedStatementData = undefined;
581
+ accountRecon.statementParseStatus = {
582
+ fetchState: 'In-Progress',
583
+ error: undefined,
584
+ };
585
+ }
586
+ },
552
587
  parseStatementSuccess: (draft, action) => {
553
588
  const { accountId, selectedPeriod } = action.payload;
554
589
  const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
@@ -603,7 +638,7 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
603
638
  accountRecon.statementProcessingFailed = false;
604
639
  accountRecon.statementParseInProgress = true;
605
640
  if (accountRecon.localData != null) {
606
- accountRecon.localData.statementUpdateLocalData = undefined;
641
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
607
642
  }
608
643
  }
609
644
  },
@@ -649,19 +684,18 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
649
684
  parsedStatementData;
650
685
  },
651
686
  updateStatementUpdateLocalData: (draft, action) => {
652
- const { accountId, selectedPeriod, statementUpdateLocalData } = action.payload;
687
+ const { accountId, selectedPeriod, statementUpdateLocalData, statementUploadId, } = action.payload;
653
688
  const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
654
- if (accountRecon != null) {
655
- if (accountRecon.localData == null) {
656
- accountRecon.localData = {
657
- statementUpdateLocalData,
658
- };
659
- }
660
- else {
661
- accountRecon.localData.statementUpdateLocalData =
662
- statementUpdateLocalData;
663
- }
689
+ if (accountRecon == null || statementUploadId === '') {
690
+ return;
664
691
  }
692
+ if (accountRecon.localData == null) {
693
+ accountRecon.localData = {};
694
+ }
695
+ accountRecon.localData.statementUpdateLocalDataByUploadId = {
696
+ ...accountRecon.localData.statementUpdateLocalDataByUploadId,
697
+ [statementUploadId]: statementUpdateLocalData,
698
+ };
665
699
  },
666
700
  submitStatementUpdate: (draft, action) => {
667
701
  const { accountId, selectedPeriod } = action.payload;
@@ -675,6 +709,17 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
675
709
  accountRecon.statementDateConflict = null;
676
710
  }
677
711
  },
712
+ submitCombinedStatementUpdate: (draft, action) => {
713
+ const { accountId, selectedPeriod } = action.payload;
714
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
715
+ if (accountRecon != null) {
716
+ accountRecon.statementUpdateStatus = {
717
+ fetchState: 'In-Progress',
718
+ error: undefined,
719
+ };
720
+ accountRecon.statementDateConflict = null;
721
+ }
722
+ },
678
723
  submitStatementUpdateSuccess: (draft, action) => {
679
724
  const { accountId, selectedPeriod } = action.payload;
680
725
  const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
@@ -689,7 +734,7 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
689
734
  accountRecon.statementProcessingStartedAtMs = undefined;
690
735
  accountRecon.statementProcessingTotalDurationSeconds = undefined;
691
736
  if (accountRecon.localData != null) {
692
- accountRecon.localData.statementUpdateLocalData = undefined;
737
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
693
738
  }
694
739
  }
695
740
  },
@@ -711,6 +756,52 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
711
756
  accountRecon.statementDateConflict = null;
712
757
  }
713
758
  },
759
+ confirmStatementMapping: (draft, action) => {
760
+ const { accountId, selectedPeriod } = action.payload;
761
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
762
+ if (accountRecon != null) {
763
+ accountRecon.confirmStatementMappingStatus = {
764
+ fetchState: 'In-Progress',
765
+ error: undefined,
766
+ };
767
+ accountRecon.confirmStatementMappingConflict = null;
768
+ }
769
+ },
770
+ confirmStatementMappingSuccess: (draft, action) => {
771
+ const { accountId, selectedPeriod, statementUploads } = action.payload;
772
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
773
+ if (accountRecon != null) {
774
+ accountRecon.confirmStatementMappingStatus = {
775
+ fetchState: 'Completed',
776
+ error: undefined,
777
+ };
778
+ accountRecon.confirmStatementMappingConflict = null;
779
+ accountRecon.confirmedCombinedStatementUploads = statementUploads;
780
+ const combinedStatementDetails = accountRecon.parsedStatementData?.statementUpload
781
+ .combinedStatementDetails;
782
+ if (combinedStatementDetails != null) {
783
+ combinedStatementDetails.isMappingConfirmed = true;
784
+ }
785
+ const combinedStatementGroupId = combinedStatementDetails?.combinedStatementGroupId ??
786
+ accountRecon.parsedStatementData?.statementUpload.statementMeta
787
+ .combinedStatementGroupId;
788
+ if (combinedStatementGroupId != null &&
789
+ combinedStatementGroupId !== '') {
790
+ accountRecon.combinedStatementGroupId = combinedStatementGroupId;
791
+ }
792
+ }
793
+ },
794
+ confirmStatementMappingFailure: (draft, action) => {
795
+ const { accountId, selectedPeriod, mappingConflict } = action.payload;
796
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
797
+ if (accountRecon != null) {
798
+ accountRecon.confirmStatementMappingStatus = {
799
+ fetchState: 'Error',
800
+ error: action.payload.error,
801
+ };
802
+ accountRecon.confirmStatementMappingConflict = mappingConflict ?? null;
803
+ }
804
+ },
714
805
  updateAccountReconciliationLocalData: (draft, action) => {
715
806
  const { accountId, selectedPeriod, localData } = action.payload;
716
807
  const oldLocalData = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)].reconciliationByAccountID[accountId].localData;
@@ -821,7 +912,7 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
821
912
  },
822
913
  });
823
914
  // Export actions
824
- _a = expenseAutomationReconciliationView.actions, exports.fetchReconciliation = _a.fetchReconciliation, exports.fetchReconciliationFailure = _a.fetchReconciliationFailure, exports.fetchReconciliationSuccess = _a.fetchReconciliationSuccess, exports.saveReconciliationDetail = _a.saveReconciliationDetail, exports.saveReconciliationDetailFailure = _a.saveReconciliationDetailFailure, exports.updateSelectedAccountId = _a.updateSelectedAccountId, exports.setConnectionInProgressForAccount = _a.setConnectionInProgressForAccount, exports.setStatementParseInProgress = _a.setStatementParseInProgress, exports.setStatementProcessingDismissedToBackground = _a.setStatementProcessingDismissedToBackground, exports.updateStatementProcessingBackgroundCompletedSteps = _a.updateStatementProcessingBackgroundCompletedSteps, exports.updateReconcileTabLocalData = _a.updateReconcileTabLocalData, exports.updateReconcileTabListSortState = _a.updateReconcileTabListSortState, exports.updateReconcileTabListScrollState = _a.updateReconcileTabListScrollState, exports.saveReconciliationDetailSuccess = _a.saveReconciliationDetailSuccess, exports.updateSelectedTab = _a.updateSelectedTab, exports.updateBalancesLocalData = _a.updateBalancesLocalData, exports.initialiseLocalDataForSelectedAccountId = _a.initialiseLocalDataForSelectedAccountId, exports.clearExpenseAutomationReconciliationView = _a.clearExpenseAutomationReconciliationView, exports.updateSelectedDrawerAccountId = _a.updateSelectedDrawerAccountId, exports.updateStatementProcessingFailed = _a.updateStatementProcessingFailed, exports.updateReviewTabSortState = _a.updateReviewTabSortState, exports.initializeReconciliationReviewTabLocalData = _a.initializeReconciliationReviewTabLocalData, exports.updateReviewTabLocalData = _a.updateReviewTabLocalData, exports.saveReconciliationReview = _a.saveReconciliationReview, exports.updateSaveReconciliationReviewFetchStatus = _a.updateSaveReconciliationReviewFetchStatus, exports.updateReconListScrollPosition = _a.updateReconListScrollPosition, exports.updateAccountReconciliationLocalData = _a.updateAccountReconciliationLocalData, exports.deleteAccountStatement = _a.deleteAccountStatement, exports.deleteAccountStatementSuccess = _a.deleteAccountStatementSuccess, exports.deleteAccountStatementFailure = _a.deleteAccountStatementFailure, exports.excludeAccountFromReconciliation = _a.excludeAccountFromReconciliation, exports.excludeAccountFromReconciliationSuccess = _a.excludeAccountFromReconciliationSuccess, exports.excludeAccountFromReconciliationFailure = _a.excludeAccountFromReconciliationFailure, exports.includeAccountInReconciliation = _a.includeAccountInReconciliation, exports.includeAccountInReconciliationSuccess = _a.includeAccountInReconciliationSuccess, exports.includeAccountInReconciliationFailure = _a.includeAccountInReconciliationFailure, exports.uploadAccountStatement = _a.uploadAccountStatement, exports.uploadAccountStatementSuccess = _a.uploadAccountStatementSuccess, exports.uploadAccountStatementFailure = _a.uploadAccountStatementFailure, exports.parseStatement = _a.parseStatement, exports.parseStatementSuccess = _a.parseStatementSuccess, exports.parseStatementFailure = _a.parseStatementFailure, exports.reparseStatement = _a.reparseStatement, exports.reparseStatementSuccess = _a.reparseStatementSuccess, exports.reparseStatementFailure = _a.reparseStatementFailure, exports.resetReparseStatementStatus = _a.resetReparseStatementStatus, exports.updateParsedStatementData = _a.updateParsedStatementData, exports.updateStatementUpdateLocalData = _a.updateStatementUpdateLocalData, exports.submitStatementUpdate = _a.submitStatementUpdate, exports.submitStatementUpdateSuccess = _a.submitStatementUpdateSuccess, exports.submitStatementUpdateFailure = _a.submitStatementUpdateFailure, exports.clearStatementDateConflict = _a.clearStatementDateConflict, exports.updateStatementUploadChosen = _a.updateStatementUploadChosen, exports.updateNodeCollapseState = _a.updateNodeCollapseState;
915
+ _a = expenseAutomationReconciliationView.actions, exports.fetchReconciliation = _a.fetchReconciliation, exports.fetchReconciliationFailure = _a.fetchReconciliationFailure, exports.fetchReconciliationSuccess = _a.fetchReconciliationSuccess, exports.saveReconciliationDetail = _a.saveReconciliationDetail, exports.saveReconciliationDetailFailure = _a.saveReconciliationDetailFailure, exports.updateSelectedAccountId = _a.updateSelectedAccountId, exports.setConnectionInProgressForAccount = _a.setConnectionInProgressForAccount, exports.setStatementParseInProgress = _a.setStatementParseInProgress, exports.setStatementProcessingDismissedToBackground = _a.setStatementProcessingDismissedToBackground, exports.updateStatementProcessingBackgroundCompletedSteps = _a.updateStatementProcessingBackgroundCompletedSteps, exports.updateReconcileTabLocalData = _a.updateReconcileTabLocalData, exports.updateReconcileTabListSortState = _a.updateReconcileTabListSortState, exports.updateReconcileTabListScrollState = _a.updateReconcileTabListScrollState, exports.saveReconciliationDetailSuccess = _a.saveReconciliationDetailSuccess, exports.updateSelectedTab = _a.updateSelectedTab, exports.updateBalancesLocalData = _a.updateBalancesLocalData, exports.initialiseLocalDataForSelectedAccountId = _a.initialiseLocalDataForSelectedAccountId, exports.clearExpenseAutomationReconciliationView = _a.clearExpenseAutomationReconciliationView, exports.updateSelectedDrawerAccountId = _a.updateSelectedDrawerAccountId, exports.updateStatementProcessingFailed = _a.updateStatementProcessingFailed, exports.updateReviewTabSortState = _a.updateReviewTabSortState, exports.initializeReconciliationReviewTabLocalData = _a.initializeReconciliationReviewTabLocalData, exports.updateReviewTabLocalData = _a.updateReviewTabLocalData, exports.saveReconciliationReview = _a.saveReconciliationReview, exports.updateSaveReconciliationReviewFetchStatus = _a.updateSaveReconciliationReviewFetchStatus, exports.updateReconListScrollPosition = _a.updateReconListScrollPosition, exports.updateAccountReconciliationLocalData = _a.updateAccountReconciliationLocalData, exports.deleteAccountStatement = _a.deleteAccountStatement, exports.deleteAccountStatementSuccess = _a.deleteAccountStatementSuccess, exports.deleteAccountStatementFailure = _a.deleteAccountStatementFailure, exports.excludeAccountFromReconciliation = _a.excludeAccountFromReconciliation, exports.excludeAccountFromReconciliationSuccess = _a.excludeAccountFromReconciliationSuccess, exports.excludeAccountFromReconciliationFailure = _a.excludeAccountFromReconciliationFailure, exports.includeAccountInReconciliation = _a.includeAccountInReconciliation, exports.includeAccountInReconciliationSuccess = _a.includeAccountInReconciliationSuccess, exports.includeAccountInReconciliationFailure = _a.includeAccountInReconciliationFailure, exports.uploadAccountStatement = _a.uploadAccountStatement, exports.uploadAccountStatementSuccess = _a.uploadAccountStatementSuccess, exports.uploadAccountStatementFailure = _a.uploadAccountStatementFailure, exports.parseStatement = _a.parseStatement, exports.parseCombinedStatement = _a.parseCombinedStatement, exports.parseStatementSuccess = _a.parseStatementSuccess, exports.parseStatementFailure = _a.parseStatementFailure, exports.reparseStatement = _a.reparseStatement, exports.reparseStatementSuccess = _a.reparseStatementSuccess, exports.reparseStatementFailure = _a.reparseStatementFailure, exports.resetReparseStatementStatus = _a.resetReparseStatementStatus, exports.updateParsedStatementData = _a.updateParsedStatementData, exports.updateStatementUpdateLocalData = _a.updateStatementUpdateLocalData, exports.submitStatementUpdate = _a.submitStatementUpdate, exports.submitCombinedStatementUpdate = _a.submitCombinedStatementUpdate, exports.submitStatementUpdateSuccess = _a.submitStatementUpdateSuccess, exports.submitStatementUpdateFailure = _a.submitStatementUpdateFailure, exports.clearStatementDateConflict = _a.clearStatementDateConflict, exports.confirmStatementMapping = _a.confirmStatementMapping, exports.confirmStatementMappingSuccess = _a.confirmStatementMappingSuccess, exports.confirmStatementMappingFailure = _a.confirmStatementMappingFailure, exports.updateStatementUploadChosen = _a.updateStatementUploadChosen, exports.updateNodeCollapseState = _a.updateNodeCollapseState;
825
916
  // Export reducer
826
917
  exports.default = expenseAutomationReconciliationView.reducer;
827
918
  function isEntityStatementParsing(reconciliation) {
@@ -835,6 +926,7 @@ function isEntityStatementParseTerminal(reconciliation) {
835
926
  statusCode === 'parsing_failed' ||
836
927
  statusCode === 'validation_failed' ||
837
928
  statusCode === 'processing_failed' ||
929
+ statusCode === 'parsed_awaiting_mapping' ||
838
930
  statusCode === 'deleting' ||
839
931
  statusCode === 'deleted');
840
932
  }
@@ -970,6 +1062,13 @@ function updateAllReconciliation(draft, accounts, selectedPeriod, reconciliation
970
1062
  error: undefined,
971
1063
  },
972
1064
  statementDateConflict: oldRecord?.statementDateConflict ?? null,
1065
+ confirmStatementMappingStatus: oldRecord?.confirmStatementMappingStatus ?? {
1066
+ fetchState: 'Not-Started',
1067
+ error: undefined,
1068
+ },
1069
+ confirmStatementMappingConflict: oldRecord?.confirmStatementMappingConflict ?? null,
1070
+ confirmedCombinedStatementUploads: oldRecord?.confirmedCombinedStatementUploads,
1071
+ combinedStatementGroupId: oldRecord?.combinedStatementGroupId,
973
1072
  localData: {
974
1073
  ...oldRecord?.localData,
975
1074
  accountSource: account?.reconciliation_source != null
@@ -1068,6 +1167,11 @@ const updateReconciliationByAccountIDOnIncludeAccount = (draft, accountId, recon
1068
1167
  statementParseStatus: { fetchState: 'Not-Started', error: undefined },
1069
1168
  reparseStatementStatus: { fetchState: 'Not-Started', error: undefined },
1070
1169
  statementDateConflict: null,
1170
+ confirmStatementMappingStatus: {
1171
+ fetchState: 'Not-Started',
1172
+ error: undefined,
1173
+ },
1174
+ confirmStatementMappingConflict: null,
1071
1175
  localData: {},
1072
1176
  accountDetectionReason: undefined,
1073
1177
  };
@@ -9,7 +9,7 @@ import { BankStatusCodeType } from '../../../entity/accountRecon/accountReconSta
9
9
  import { ClassBase } from '../../../entity/class/classState';
10
10
  import { Vendor } from '../../../entity/vendor/vendorState';
11
11
  import { PlaidConnectionDetails } from '../../spendManagement/plaidAccount/plaidAccountViewState';
12
- import { AccountReconciliationLocalData, ActionFetchStates, ParsedStatementData, ReconListUIState, ReconciliationTabsState, ReconciliationViewSummary, ReconciliationViewTabType, StatementDateConflict, StatementTransaction } from '../types/reconciliationViewState';
12
+ import { AccountReconciliationLocalData, ActionFetchStates, ConfirmStatementMappingConflict, ConfirmedCombinedStatementUpload, ParsedStatementData, ReconListUIState, ReconciliationTabsState, ReconciliationViewSummary, ReconciliationViewTabType, StatementDateConflict, StatementTransaction } from '../types/reconciliationViewState';
13
13
  export declare const ALL_ACCOUNT_RECON_SECTION_IDS: readonly ["assets", "liabilities"];
14
14
  export declare const toAccountReconSectionID: (v: string) => "assets" | "liabilities";
15
15
  export type AccountReconSectionID = ReturnType<typeof toAccountReconSectionID>;
@@ -55,6 +55,8 @@ export interface AccountReconciliationBySection {
55
55
  export interface AccountReconciliationByAccount {
56
56
  accountConnectionStatus: BankStatusCodeType;
57
57
  accountReconEntity: AccountReconciliationEntity;
58
+ confirmStatementMappingConflict: ConfirmStatementMappingConflict | null;
59
+ confirmStatementMappingStatus: FetchStateAndError;
58
60
  connectionInProgress: boolean;
59
61
  localData: AccountReconciliationLocalData;
60
62
  refreshStatus: FetchStateAndError;
@@ -72,6 +74,8 @@ export interface AccountReconciliationByAccount {
72
74
  accountDetectionReason?: string;
73
75
  /** Unfiltered parsed transactions for PDF citation highlights. */
74
76
  allCitationTransactions?: StatementTransaction[];
77
+ combinedStatementGroupId?: string;
78
+ confirmedCombinedStatementUploads?: ConfirmedCombinedStatementUpload[];
75
79
  parsedStatementData?: ParsedStatementData;
76
80
  paymentAccountId?: ID;
77
81
  statementProcessingStartedAtMs?: number;
@@ -1,7 +1,10 @@
1
1
  import { ID } from '../../../commonStateTypes/common';
2
2
  import { ReportIDPlusForecastID } from '../../../commonStateTypes/viewAndReport/viewAndReport';
3
+ import { AccountBase } from '../../../entity/account/accountState';
3
4
  import { RootState } from '../../../reducer';
4
- import { ExpenseAutomationReconciliationViewSelector } from '../selectorTypes/reconciliationViewSelectorTypes';
5
+ import { AccountReconciliationByAccount, ExpenseAutomationReconciliationViewSelector } from '../selectorTypes/reconciliationViewSelectorTypes';
5
6
  export declare const getExpenseAutomationReconciliationView: (state: RootState) => ExpenseAutomationReconciliationViewSelector;
6
7
  export declare const getReparseStatementStatusByAccountId: (state: RootState, accountId: ID) => import("../../../commonStateTypes/common").FetchStateAndError;
8
+ export declare function getLedgerAccountsForCombinedStatementMapping(accountReconciliationsByAccountID: Record<ID, AccountReconciliationByAccount>): AccountBase[];
9
+ export declare function getUnavailableLedgerAccountIds(accountReconciliationsByAccountID: Record<ID, AccountReconciliationByAccount>): ID[];
7
10
  export declare const isAccountReconReport: (reportId: ReportIDPlusForecastID) => boolean;
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.isAccountReconReport = exports.getReparseStatementStatusByAccountId = exports.getExpenseAutomationReconciliationView = void 0;
7
+ exports.getLedgerAccountsForCombinedStatementMapping = getLedgerAccountsForCombinedStatementMapping;
8
+ exports.getUnavailableLedgerAccountIds = getUnavailableLedgerAccountIds;
7
9
  const toolkit_1 = require("@reduxjs/toolkit");
8
10
  const big_js_1 = __importDefault(require("big.js"));
9
11
  const keys_1 = __importDefault(require("lodash/keys"));
@@ -251,8 +253,23 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
251
253
  }
252
254
  const accountReconState = accountReconForMonthYearPeriod.reconciliationByAccountID[accountID];
253
255
  const rawParsedStatementData = accountReconState.parsedStatementData;
254
- const statementUpdateLocalData = accountReconState.localData?.statementUpdateLocalData;
255
- const parsedStatementDataForView = (0, statementParseViewSelector_1.getParsedStatementDataForView)(rawParsedStatementData, statementUpdateLocalData);
256
+ const statementUpdateLocalDataByUploadId = accountReconState.localData?.statementUpdateLocalDataByUploadId;
257
+ const statementAccountScope = accountReconState.localData?.statementAccountScope;
258
+ const parsedStatementDataForView = (0, statementParseViewSelector_1.getParsedStatementDataForView)(rawParsedStatementData, statementUpdateLocalDataByUploadId, statementAccountScope);
259
+ const rawStatementUploads = rawParsedStatementData?.statementUploads != null &&
260
+ rawParsedStatementData.statementUploads.length > 0
261
+ ? rawParsedStatementData.statementUploads
262
+ : rawParsedStatementData?.statementUpload != null
263
+ ? [rawParsedStatementData.statementUpload]
264
+ : [];
265
+ const allCitationTransactions = rawStatementUploads.flatMap((statementUpload) => statementUpload.statementTransactions);
266
+ const statementTransactionPeriodById = rawStatementUploads.length > 0
267
+ ? Object.assign({}, ...rawStatementUploads.map((statementUpload) => {
268
+ const uploadId = statementUpload.statementMeta.statementUploadId;
269
+ const localMeta = statementUpdateLocalDataByUploadId?.[uploadId]?.statementMeta;
270
+ return (0, statementParseViewSelector_1.getStatementTransactionPeriodById)(statementUpload.statementTransactions, statementUpload.statementMeta, localMeta);
271
+ }))
272
+ : undefined;
256
273
  reconList[accountID] = {
257
274
  accountConnectionStatus: accountConnectionStatus.status,
258
275
  paymentAccountId: accountConnectionStatus.paymentAccountId,
@@ -263,6 +280,10 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
263
280
  statementParseStatus: accountReconState.statementParseStatus,
264
281
  reparseStatementStatus: accountReconState.reparseStatementStatus,
265
282
  statementDateConflict: accountReconState.statementDateConflict,
283
+ confirmStatementMappingStatus: accountReconState.confirmStatementMappingStatus,
284
+ confirmStatementMappingConflict: accountReconState.confirmStatementMappingConflict,
285
+ confirmedCombinedStatementUploads: accountReconState.confirmedCombinedStatementUploads,
286
+ combinedStatementGroupId: accountReconState.combinedStatementGroupId,
266
287
  statementUpdateStatus: accountReconState.statementUpdateStatus,
267
288
  statementUploadStatus: accountReconState.statementUploadStatus,
268
289
  localData: accountReconState.localData,
@@ -273,11 +294,8 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
273
294
  statementProcessingTotalDurationSeconds: accountReconState.statementProcessingTotalDurationSeconds,
274
295
  statementProcessingFailed: accountReconState.statementProcessingFailed,
275
296
  parsedStatementData: parsedStatementDataForView,
276
- allCitationTransactions: rawParsedStatementData?.statementUpload?.statementTransactions,
277
- statementTransactionPeriodById: rawParsedStatementData?.statementUpload != null
278
- ? (0, statementParseViewSelector_1.getStatementTransactionPeriodById)(rawParsedStatementData.statementUpload.statementTransactions, rawParsedStatementData.statementUpload.statementMeta, accountReconState.localData?.statementUpdateLocalData
279
- ?.statementMeta)
280
- : undefined,
297
+ allCitationTransactions,
298
+ statementTransactionPeriodById,
281
299
  transactionFetchState: (0, reduceFetchState_1.reduceAnyFetchState)([
282
300
  accountReconState.transactionFetchState,
283
301
  accountListState.byReportId.accountList,
@@ -347,6 +365,8 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
347
365
  statementParseStatus: { fetchState: 'Not-Started' },
348
366
  reparseStatementStatus: { fetchState: 'Not-Started' },
349
367
  statementDateConflict: null,
368
+ confirmStatementMappingStatus: { fetchState: 'Not-Started' },
369
+ confirmStatementMappingConflict: null,
350
370
  localData: {},
351
371
  connectionInProgress: false,
352
372
  statementParseInProgress: false,
@@ -464,6 +484,19 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
464
484
  const getReparseStatementStatusByAccountId = (state, accountId) => (0, exports.getExpenseAutomationReconciliationView)(state)
465
485
  .accountReconciliationsByAccountID[accountId]?.reparseStatementStatus;
466
486
  exports.getReparseStatementStatusByAccountId = getReparseStatementStatusByAccountId;
487
+ function getLedgerAccountsForCombinedStatementMapping(accountReconciliationsByAccountID) {
488
+ return Object.values(accountReconciliationsByAccountID).map((accountReconciliation) => accountReconciliation.accountReconEntity.account);
489
+ }
490
+ const UNAVAILABLE_LEDGER_ACCOUNT_RECON_STATUSES = new Set(['in_progress', 'reconciled', 'reconciled_on_qbo']);
491
+ function getUnavailableLedgerAccountIds(accountReconciliationsByAccountID) {
492
+ return Object.values(accountReconciliationsByAccountID)
493
+ .filter((accountReconciliation) => {
494
+ const statusCode = accountReconciliation.accountReconEntity.reconciliationStatus?.code;
495
+ return (statusCode != null &&
496
+ UNAVAILABLE_LEDGER_ACCOUNT_RECON_STATUSES.has(statusCode));
497
+ })
498
+ .map((accountReconciliation) => accountReconciliation.accountReconEntity.account.accountId);
499
+ }
467
500
  const isAccountReconReport = (reportId) => {
468
501
  return reportId.endsWith('reconciliation');
469
502
  };
@@ -1,4 +1,5 @@
1
- import { ParsedStatementData, StatementMeta, StatementTransaction, StatementUpdateLocalData } from '../types/reconciliationViewState';
1
+ import { ParsedStatementData, StatementAccountScope, StatementMeta, StatementTransaction, StatementUpdateLocalData, StatementUpload } from '../types/reconciliationViewState';
2
+ export declare function getStatementUploadsFromParsedData(parsedStatementData: ParsedStatementData | undefined): StatementUpload[];
2
3
  export interface StatementPeriod {
3
4
  statementEndDate: string;
4
5
  statementStartDate: string;
@@ -6,7 +7,7 @@ export interface StatementPeriod {
6
7
  export declare const getEffectiveStatementPeriod: (parsedMeta: StatementMeta, localMeta: StatementMeta | undefined) => StatementPeriod;
7
8
  export declare const isStatementTransactionInPeriod: (transactionDate: string, statementStartDate: string, statementEndDate: string) => boolean;
8
9
  export declare const filterStatementTransactionsByPeriod: (transactions: StatementTransaction[], statementPeriod: StatementPeriod) => StatementTransaction[];
9
- export declare const getParsedStatementDataForView: (parsedStatementData: ParsedStatementData | undefined, statementUpdateLocalData: StatementUpdateLocalData | undefined) => ParsedStatementData | undefined;
10
+ export declare const getParsedStatementDataForView: (parsedStatementData: ParsedStatementData | undefined, statementUpdateLocalDataByUploadId?: Record<string, StatementUpdateLocalData>, statementAccountScope?: StatementAccountScope) => ParsedStatementData | undefined;
10
11
  export declare const getStatementTransactionPeriodById: (allParsedTransactions: StatementTransaction[], parsedMeta: StatementMeta, localMeta: StatementMeta | undefined) => Record<string, boolean>;
11
12
  export declare const getDateFilteredDeletedTransactionIds: (allParsedTransactions: StatementTransaction[], statementPeriod: StatementPeriod) => string[];
12
13
  export declare const mergeStatementParseDeletedTransactionIds: (originalTransactions: StatementTransaction[], statementPeriod: StatementPeriod, currentTransactionIds: Set<string>) => string[];
@@ -1,7 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mergeStatementParseDeletedTransactionIds = exports.getDateFilteredDeletedTransactionIds = exports.getStatementTransactionPeriodById = exports.getParsedStatementDataForView = exports.filterStatementTransactionsByPeriod = exports.isStatementTransactionInPeriod = exports.getEffectiveStatementPeriod = void 0;
4
+ exports.getStatementUploadsFromParsedData = getStatementUploadsFromParsedData;
4
5
  const zeniDayJS_1 = require("../../../zeniDayJS");
6
+ function getStatementUploadsFromParsedData(parsedStatementData) {
7
+ if (parsedStatementData == null) {
8
+ return [];
9
+ }
10
+ if (parsedStatementData.statementUploads != null &&
11
+ parsedStatementData.statementUploads.length > 0) {
12
+ return parsedStatementData.statementUploads;
13
+ }
14
+ if (parsedStatementData.statementUpload != null) {
15
+ return [parsedStatementData.statementUpload];
16
+ }
17
+ return [];
18
+ }
5
19
  const getEffectiveStatementPeriod = (parsedMeta, localMeta) => ({
6
20
  statementStartDate: localMeta?.statementStartDate != null && localMeta.statementStartDate !== ''
7
21
  ? localMeta.statementStartDate
@@ -31,24 +45,44 @@ const filterStatementTransactionsByPeriod = (transactions, statementPeriod) => {
31
45
  return transactions.filter((transaction) => (0, exports.isStatementTransactionInPeriod)(transaction.transactionDate, statementStartDate, statementEndDate));
32
46
  };
33
47
  exports.filterStatementTransactionsByPeriod = filterStatementTransactionsByPeriod;
34
- const getParsedStatementDataForView = (parsedStatementData, statementUpdateLocalData) => {
48
+ const getStatementUploadForView = (statementUpload, statementUpdateLocalData) => {
49
+ const parsedMeta = statementUpload.statementMeta;
50
+ const localMeta = statementUpdateLocalData?.statementMeta;
51
+ const effectiveMeta = localMeta ?? parsedMeta;
52
+ const statementPeriod = (0, exports.getEffectiveStatementPeriod)(parsedMeta, localMeta);
53
+ return {
54
+ ...statementUpload,
55
+ statementMeta: effectiveMeta,
56
+ statementTransactions: (0, exports.filterStatementTransactionsByPeriod)(statementUpload.statementTransactions, statementPeriod),
57
+ };
58
+ };
59
+ const getParsedStatementDataForView = (parsedStatementData, statementUpdateLocalDataByUploadId, statementAccountScope) => {
35
60
  if (parsedStatementData == null) {
36
61
  return undefined;
37
62
  }
63
+ const statementUploads = getStatementUploadsFromParsedData(parsedStatementData);
64
+ if (statementUploads.length === 0) {
65
+ return undefined;
66
+ }
67
+ if (statementAccountScope === 'multi_account') {
68
+ const viewedUploads = statementUploads.map((statementUpload) => {
69
+ const uploadId = statementUpload.statementMeta.statementUploadId;
70
+ return getStatementUploadForView(statementUpload, statementUpdateLocalDataByUploadId?.[uploadId]);
71
+ });
72
+ const anchorUploadId = parsedStatementData.statementUpload.statementMeta.statementUploadId;
73
+ const viewedAnchor = viewedUploads.find((upload) => upload.statementMeta.statementUploadId === anchorUploadId) ?? viewedUploads[0];
74
+ return {
75
+ statementUpload: viewedAnchor,
76
+ statementUploads: viewedUploads,
77
+ };
78
+ }
38
79
  const statementUpload = parsedStatementData.statementUpload;
39
80
  if (statementUpload == null) {
40
81
  return undefined;
41
82
  }
42
- const parsedMeta = statementUpload.statementMeta;
43
- const localMeta = statementUpdateLocalData?.statementMeta;
44
- const effectiveMeta = localMeta ?? parsedMeta;
45
- const statementPeriod = (0, exports.getEffectiveStatementPeriod)(parsedMeta, localMeta);
83
+ const uploadId = statementUpload.statementMeta.statementUploadId;
46
84
  return {
47
- statementUpload: {
48
- ...statementUpload,
49
- statementMeta: effectiveMeta,
50
- statementTransactions: (0, exports.filterStatementTransactionsByPeriod)(statementUpload.statementTransactions, statementPeriod),
51
- },
85
+ statementUpload: getStatementUploadForView(statementUpload, statementUpdateLocalDataByUploadId?.[uploadId]),
52
86
  };
53
87
  };
54
88
  exports.getParsedStatementDataForView = getParsedStatementDataForView;
@@ -29,6 +29,9 @@ export interface StatementTransaction {
29
29
  transactionDirection: 'debit' | 'credit';
30
30
  transactionMemo: string;
31
31
  }
32
+ export declare const toStatementBalanceSource: (v: string) => "ocr" | "prior_recon" | "default_zero";
33
+ export type StatementBalanceSource = ReturnType<typeof toStatementBalanceSource>;
34
+ export declare const toStatementBalanceSourceStrict: (v: string | null | undefined) => StatementBalanceSource | undefined;
32
35
  export interface StatementMeta {
33
36
  closingBalance: number;
34
37
  openingBalance: number;
@@ -45,6 +48,10 @@ export interface StatementMeta {
45
48
  statementUploadId: string;
46
49
  totalDeposits: number;
47
50
  totalPayments: number;
51
+ balanceSource?: StatementBalanceSource;
52
+ combinedStatementGroupId?: string;
53
+ isCombinedStatement?: boolean;
54
+ isCombinedStatementAnchor?: boolean;
48
55
  }
49
56
  export interface AccountInfo {
50
57
  accountId: string;
@@ -92,15 +99,63 @@ export interface AiSummary {
92
99
  fieldsCaptured: AiSummaryField[];
93
100
  transactionsExtracted: number;
94
101
  }
102
+ export interface CombinedStatementAccountSuggestion {
103
+ accountId: ID;
104
+ accountName: string;
105
+ matchConfidence: number;
106
+ matchedBy: string;
107
+ }
108
+ export interface CombinedStatementAccount {
109
+ accountName: string;
110
+ accountType: string;
111
+ closingBalance: number;
112
+ isUploadContext: boolean;
113
+ ledgerIdentifier: string;
114
+ maskedAccountNumber: string;
115
+ openingBalance: number;
116
+ transactionCount: number;
117
+ existingStatementStatus?: {
118
+ code: string;
119
+ label: string;
120
+ } | null;
121
+ suggestion?: CombinedStatementAccountSuggestion | null;
122
+ }
123
+ export interface CombinedStatementDetails {
124
+ accounts: CombinedStatementAccount[];
125
+ combinedStatementGroupId: string;
126
+ isMappingConfirmed: boolean;
127
+ statementUploads: ConfirmedCombinedStatementUpload[];
128
+ }
129
+ export interface ConfirmedCombinedStatementUpload {
130
+ accountId: ID;
131
+ isCombinedStatementAnchor: boolean;
132
+ ledgerIdentifiers: string[];
133
+ statementUploadId: ID;
134
+ }
135
+ export interface ConfirmStatementMappingConflict {
136
+ collidingLedgerIdentifiers: string[];
137
+ collidingAccountId?: ID;
138
+ previousReconciliationInfo?: PreviousReconciliationInfo | null;
139
+ }
95
140
  export interface StatementUpload {
96
141
  account: AccountInfo;
97
142
  file: FileInfo | null;
98
143
  statementMeta: StatementMeta;
99
144
  statementTransactions: StatementTransaction[];
100
145
  aiSummary?: AiSummary | null;
146
+ combinedStatementDetails?: CombinedStatementDetails;
101
147
  }
102
148
  export interface ParsedStatementData {
149
+ /**
150
+ * Single-account parse: the only upload.
151
+ * Combined-account parse: the anchor / PDF-owning upload (also in statementUploads).
152
+ */
103
153
  statementUpload: StatementUpload;
154
+ /**
155
+ * Present only for combined multi-account parse responses after mapping.
156
+ * When set, ParseInfo renders one section per upload.
157
+ */
158
+ statementUploads?: StatementUpload[];
104
159
  }
105
160
  export interface ReconciliationSummaryAccounts {
106
161
  done: number;
@@ -264,9 +319,16 @@ export interface StatementTransactionsUpdate {
264
319
  deletedIds: string[];
265
320
  updated: StatementTransactionForUpdate[];
266
321
  }
322
+ /** Client-only totals derived from in-period transactions; not sent on PUT. */
323
+ export interface StatementBalancesFromTransactions {
324
+ closingBalance: number;
325
+ totalDeposits: number;
326
+ totalPayments: number;
327
+ }
267
328
  export interface StatementUpdateLocalData {
268
329
  statementMeta: StatementMeta;
269
330
  statementTransactions: StatementTransactionsUpdate;
331
+ balancesFromTransactions?: StatementBalancesFromTransactions;
270
332
  }
271
333
  export interface StatementUpdateLocalDataPayload {
272
334
  statement_meta: {
@@ -294,12 +356,20 @@ export interface StatementUpdateLocalDataPayload {
294
356
  }>;
295
357
  };
296
358
  }
359
+ export declare const toStatementAccountScope: (v: string) => "single_account" | "multi_account";
360
+ export type StatementAccountScope = ReturnType<typeof toStatementAccountScope>;
361
+ export declare const toStatementAccountScopeStrict: (v: string | null | undefined) => StatementAccountScope | undefined;
362
+ export declare const STATEMENT_ACCOUNT_SCOPES: readonly StatementAccountScope[];
297
363
  export interface AccountReconciliationLocalData {
298
364
  accountSource?: ReconciliationAccountSourceType;
299
- statementUpdateLocalData?: StatementUpdateLocalData;
365
+ statementAccountScope?: StatementAccountScope;
366
+ /** Confirm & Save drafts keyed by statementUploadId (single and combined). */
367
+ statementUpdateLocalDataByUploadId?: Record<string, StatementUpdateLocalData>;
300
368
  }
301
369
  export interface AccountReconciliationDataWithTransactionFetchState {
302
370
  accountId: ID;
371
+ confirmStatementMappingConflict: ConfirmStatementMappingConflict | null;
372
+ confirmStatementMappingStatus: FetchStateAndError;
303
373
  localData: AccountReconciliationLocalData;
304
374
  refreshStatus: FetchStateAndError;
305
375
  reparseStatementStatus: FetchStateAndError;
@@ -319,6 +389,9 @@ export interface AccountReconciliationDataWithTransactionFetchState {
319
389
  statementUploadStatus: FetchStateAndError;
320
390
  transactionFetchState: FetchStateAndError;
321
391
  accountDetectionReason?: string;
392
+ /** Persisted after mapping confirm for batch GET / group pusher resolution. */
393
+ combinedStatementGroupId?: string;
394
+ confirmedCombinedStatementUploads?: ConfirmedCombinedStatementUpload[];
322
395
  parsedStatementData?: ParsedStatementData;
323
396
  reconciliationId?: ID;
324
397
  /** Wall-clock start used to recompute UI step progress after backgrounding. */
@@ -1,8 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toReconciliationTabsType = exports.toReconcileActions = exports.RECONCILE_ACTIONS = void 0;
3
+ exports.STATEMENT_ACCOUNT_SCOPES = exports.toStatementAccountScopeStrict = exports.toStatementAccountScope = exports.toReconciliationTabsType = exports.toReconcileActions = exports.RECONCILE_ACTIONS = exports.toStatementBalanceSourceStrict = exports.toStatementBalanceSource = void 0;
4
4
  exports.toReconciliationViewSummary = toReconciliationViewSummary;
5
5
  const stringToUnion_1 = require("../../../commonStateTypes/stringToUnion");
6
+ const ALL_STATEMENT_BALANCE_SOURCES = [
7
+ 'ocr',
8
+ 'prior_recon',
9
+ 'default_zero',
10
+ ];
11
+ const toStatementBalanceSource = (v) => (0, stringToUnion_1.stringToUnion)(v, ALL_STATEMENT_BALANCE_SOURCES);
12
+ exports.toStatementBalanceSource = toStatementBalanceSource;
13
+ const toStatementBalanceSourceStrict = (v) => (0, stringToUnion_1.stringToUnionStrict)(v ?? '', ALL_STATEMENT_BALANCE_SOURCES);
14
+ exports.toStatementBalanceSourceStrict = toStatementBalanceSourceStrict;
6
15
  function toReconciliationViewSummary(payload) {
7
16
  return {
8
17
  accounts: {
@@ -65,3 +74,12 @@ const RECON_REVIEW_SORT_KEYS = [
65
74
  ];
66
75
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
67
76
  const toReconReviewSortKey = (v) => (0, stringToUnion_1.stringToUnion)(v, RECON_REVIEW_SORT_KEYS);
77
+ const ALL_STATEMENT_ACCOUNT_SCOPES = [
78
+ 'single_account',
79
+ 'multi_account',
80
+ ];
81
+ const toStatementAccountScope = (v) => (0, stringToUnion_1.stringToUnion)(v, ALL_STATEMENT_ACCOUNT_SCOPES);
82
+ exports.toStatementAccountScope = toStatementAccountScope;
83
+ const toStatementAccountScopeStrict = (v) => (0, stringToUnion_1.stringToUnionStrict)(v ?? '', ALL_STATEMENT_ACCOUNT_SCOPES);
84
+ exports.toStatementAccountScopeStrict = toStatementAccountScopeStrict;
85
+ exports.STATEMENT_ACCOUNT_SCOPES = ALL_STATEMENT_ACCOUNT_SCOPES;