@zeniai/client-epic-state 5.1.91 → 5.1.92-beta0NB

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 (93) 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/snackbarApiError.d.ts +8 -0
  5. package/lib/entity/snackbar/snackbarApiError.js +15 -0
  6. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  7. package/lib/entity/snackbar/snackbarTypes.js +1 -0
  8. package/lib/epic.d.ts +4 -1
  9. package/lib/epic.js +4 -1
  10. package/lib/esm/entity/accountRecon/accountReconReducer.js +4 -0
  11. package/lib/esm/entity/accountRecon/accountReconState.js +1 -0
  12. package/lib/esm/entity/snackbar/snackbarApiError.js +11 -0
  13. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
  14. package/lib/esm/epic.js +4 -1
  15. package/lib/esm/index.js +4 -4
  16. package/lib/esm/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +43 -0
  17. package/lib/esm/view/expenseAutomationView/epics/accountRecon/parseCombinedStatementEpic.js +31 -0
  18. package/lib/esm/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +15 -18
  19. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +68 -0
  20. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +10 -10
  21. package/lib/esm/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +12 -4
  22. package/lib/esm/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementEpic.js +8 -2
  23. package/lib/esm/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +20 -5
  24. package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +135 -0
  25. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +119 -16
  26. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +28 -7
  27. package/lib/esm/view/expenseAutomationView/selectors/statementParseViewSelector.js +43 -10
  28. package/lib/esm/view/expenseAutomationView/types/reconciliationViewState.js +15 -1
  29. package/lib/esm/view/invoicing/createCreditNote/createCreditNoteEpic.js +2 -0
  30. package/lib/esm/view/invoicing/createInvoice/createInvoiceEpic.js +2 -0
  31. package/lib/esm/view/invoicing/discountAction/discountActionEpic.js +6 -3
  32. package/lib/esm/view/invoicing/dunningAction/dunningActionEpic.js +6 -3
  33. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +5 -4
  34. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +3 -0
  35. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/saveInvoicingCouponEpic.js +2 -0
  36. package/lib/esm/view/invoicing/editInvoicingCustomerDetailView/saveInvoicingCustomerEpic.js +2 -0
  37. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.js +2 -0
  38. package/lib/esm/view/invoicing/invoiceAction/invoiceActionEpic.js +7 -3
  39. package/lib/esm/view/invoicing/invoicingQboView/epics/retryInvoicingQboSyncTaskEpic.js +2 -0
  40. package/lib/esm/view/invoicing/invoicingQboView/epics/startInvoicingQboBackfillEpic.js +2 -0
  41. package/lib/esm/view/invoicing/issueCreditNote/issueCreditNoteEpic.js +2 -0
  42. package/lib/esm/view/invoicing/recordPayment/recordPaymentEpic.js +3 -0
  43. package/lib/esm/view/invoicing/settingsView/settingsViewEpics.js +6 -3
  44. package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +52 -0
  45. package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionEpic.js +6 -3
  46. package/lib/esm/view/vendorTabView/vendorTabViewReducer.js +1 -1
  47. package/lib/index.d.ts +7 -7
  48. package/lib/index.js +51 -46
  49. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.d.ts +34 -0
  50. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +47 -0
  51. package/lib/view/expenseAutomationView/epics/accountRecon/parseCombinedStatementEpic.d.ts +26 -0
  52. package/lib/view/expenseAutomationView/epics/accountRecon/parseCombinedStatementEpic.js +35 -0
  53. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.d.ts +21 -1
  54. package/lib/view/expenseAutomationView/epics/accountRecon/parseStatementEpic.js +15 -18
  55. package/lib/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.d.ts +27 -0
  56. package/lib/view/expenseAutomationView/epics/accountRecon/updateCombinedStatementInfoEpic.js +72 -0
  57. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +10 -10
  58. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.d.ts +1 -1
  59. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +12 -4
  60. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementEpic.js +7 -1
  61. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.d.ts +1 -0
  62. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +20 -4
  63. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  64. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +109 -4
  65. package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +143 -0
  66. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +32 -4
  67. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +121 -18
  68. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +5 -1
  69. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.d.ts +3 -1
  70. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +29 -7
  71. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.d.ts +3 -2
  72. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.js +44 -10
  73. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +74 -1
  74. package/lib/view/expenseAutomationView/types/reconciliationViewState.js +19 -1
  75. package/lib/view/invoicing/createCreditNote/createCreditNoteEpic.js +2 -0
  76. package/lib/view/invoicing/createInvoice/createInvoiceEpic.js +2 -0
  77. package/lib/view/invoicing/discountAction/discountActionEpic.js +5 -2
  78. package/lib/view/invoicing/dunningAction/dunningActionEpic.js +5 -2
  79. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +5 -4
  80. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +3 -0
  81. package/lib/view/invoicing/editInvoicingCouponDetailView/saveInvoicingCouponEpic.js +2 -0
  82. package/lib/view/invoicing/editInvoicingCustomerDetailView/saveInvoicingCustomerEpic.js +2 -0
  83. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.js +2 -0
  84. package/lib/view/invoicing/invoiceAction/invoiceActionEpic.js +6 -2
  85. package/lib/view/invoicing/invoicingQboView/epics/retryInvoicingQboSyncTaskEpic.js +2 -0
  86. package/lib/view/invoicing/invoicingQboView/epics/startInvoicingQboBackfillEpic.js +2 -0
  87. package/lib/view/invoicing/issueCreditNote/issueCreditNoteEpic.js +2 -0
  88. package/lib/view/invoicing/recordPayment/recordPaymentEpic.js +3 -0
  89. package/lib/view/invoicing/settingsView/settingsViewEpics.js +5 -2
  90. package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +41 -1
  91. package/lib/view/invoicing/settingsView/settingsViewSelector.js +55 -1
  92. package/lib/view/invoicing/subscriptionAction/subscriptionActionEpic.js +5 -2
  93. 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,15 @@ 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;
527
550
  }
528
551
  }
529
552
  },
@@ -549,6 +572,17 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
549
572
  };
550
573
  }
551
574
  },
575
+ parseCombinedStatement: (draft, action) => {
576
+ const { accountId, selectedPeriod } = action.payload;
577
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
578
+ if (accountRecon != null) {
579
+ accountRecon.parsedStatementData = undefined;
580
+ accountRecon.statementParseStatus = {
581
+ fetchState: 'In-Progress',
582
+ error: undefined,
583
+ };
584
+ }
585
+ },
552
586
  parseStatementSuccess: (draft, action) => {
553
587
  const { accountId, selectedPeriod } = action.payload;
554
588
  const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
@@ -603,7 +637,7 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
603
637
  accountRecon.statementProcessingFailed = false;
604
638
  accountRecon.statementParseInProgress = true;
605
639
  if (accountRecon.localData != null) {
606
- accountRecon.localData.statementUpdateLocalData = undefined;
640
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
607
641
  }
608
642
  }
609
643
  },
@@ -649,19 +683,18 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
649
683
  parsedStatementData;
650
684
  },
651
685
  updateStatementUpdateLocalData: (draft, action) => {
652
- const { accountId, selectedPeriod, statementUpdateLocalData } = action.payload;
686
+ const { accountId, selectedPeriod, statementUpdateLocalData, statementUploadId, } = action.payload;
653
687
  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
- }
688
+ if (accountRecon == null || statementUploadId === '') {
689
+ return;
664
690
  }
691
+ if (accountRecon.localData == null) {
692
+ accountRecon.localData = {};
693
+ }
694
+ accountRecon.localData.statementUpdateLocalDataByUploadId = {
695
+ ...accountRecon.localData.statementUpdateLocalDataByUploadId,
696
+ [statementUploadId]: statementUpdateLocalData,
697
+ };
665
698
  },
666
699
  submitStatementUpdate: (draft, action) => {
667
700
  const { accountId, selectedPeriod } = action.payload;
@@ -675,6 +708,17 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
675
708
  accountRecon.statementDateConflict = null;
676
709
  }
677
710
  },
711
+ submitCombinedStatementUpdate: (draft, action) => {
712
+ const { accountId, selectedPeriod } = action.payload;
713
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
714
+ if (accountRecon != null) {
715
+ accountRecon.statementUpdateStatus = {
716
+ fetchState: 'In-Progress',
717
+ error: undefined,
718
+ };
719
+ accountRecon.statementDateConflict = null;
720
+ }
721
+ },
678
722
  submitStatementUpdateSuccess: (draft, action) => {
679
723
  const { accountId, selectedPeriod } = action.payload;
680
724
  const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
@@ -689,7 +733,7 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
689
733
  accountRecon.statementProcessingStartedAtMs = undefined;
690
734
  accountRecon.statementProcessingTotalDurationSeconds = undefined;
691
735
  if (accountRecon.localData != null) {
692
- accountRecon.localData.statementUpdateLocalData = undefined;
736
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
693
737
  }
694
738
  }
695
739
  },
@@ -711,6 +755,52 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
711
755
  accountRecon.statementDateConflict = null;
712
756
  }
713
757
  },
758
+ confirmStatementMapping: (draft, action) => {
759
+ const { accountId, selectedPeriod } = action.payload;
760
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
761
+ if (accountRecon != null) {
762
+ accountRecon.confirmStatementMappingStatus = {
763
+ fetchState: 'In-Progress',
764
+ error: undefined,
765
+ };
766
+ accountRecon.confirmStatementMappingConflict = null;
767
+ }
768
+ },
769
+ confirmStatementMappingSuccess: (draft, action) => {
770
+ const { accountId, selectedPeriod, statementUploads } = action.payload;
771
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
772
+ if (accountRecon != null) {
773
+ accountRecon.confirmStatementMappingStatus = {
774
+ fetchState: 'Completed',
775
+ error: undefined,
776
+ };
777
+ accountRecon.confirmStatementMappingConflict = null;
778
+ accountRecon.confirmedCombinedStatementUploads = statementUploads;
779
+ const combinedStatementDetails = accountRecon.parsedStatementData?.statementUpload
780
+ .combinedStatementDetails;
781
+ if (combinedStatementDetails != null) {
782
+ combinedStatementDetails.isMappingConfirmed = true;
783
+ }
784
+ const combinedStatementGroupId = combinedStatementDetails?.combinedStatementGroupId ??
785
+ accountRecon.parsedStatementData?.statementUpload.statementMeta
786
+ .combinedStatementGroupId;
787
+ if (combinedStatementGroupId != null &&
788
+ combinedStatementGroupId !== '') {
789
+ accountRecon.combinedStatementGroupId = combinedStatementGroupId;
790
+ }
791
+ }
792
+ },
793
+ confirmStatementMappingFailure: (draft, action) => {
794
+ const { accountId, selectedPeriod, mappingConflict } = action.payload;
795
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)]?.reconciliationByAccountID[accountId];
796
+ if (accountRecon != null) {
797
+ accountRecon.confirmStatementMappingStatus = {
798
+ fetchState: 'Error',
799
+ error: action.payload.error,
800
+ };
801
+ accountRecon.confirmStatementMappingConflict = mappingConflict ?? null;
802
+ }
803
+ },
714
804
  updateAccountReconciliationLocalData: (draft, action) => {
715
805
  const { accountId, selectedPeriod, localData } = action.payload;
716
806
  const oldLocalData = draft.accountReconciliationRecordsBySelectedPeriod[(0, timePeriod_1.toMonthYearPeriodId)(selectedPeriod)].reconciliationByAccountID[accountId].localData;
@@ -821,7 +911,7 @@ const expenseAutomationReconciliationView = (0, toolkit_1.createSlice)({
821
911
  },
822
912
  });
823
913
  // 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;
914
+ _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
915
  // Export reducer
826
916
  exports.default = expenseAutomationReconciliationView.reducer;
827
917
  function isEntityStatementParsing(reconciliation) {
@@ -835,6 +925,7 @@ function isEntityStatementParseTerminal(reconciliation) {
835
925
  statusCode === 'parsing_failed' ||
836
926
  statusCode === 'validation_failed' ||
837
927
  statusCode === 'processing_failed' ||
928
+ statusCode === 'parsed_awaiting_mapping' ||
838
929
  statusCode === 'deleting' ||
839
930
  statusCode === 'deleted');
840
931
  }
@@ -970,6 +1061,13 @@ function updateAllReconciliation(draft, accounts, selectedPeriod, reconciliation
970
1061
  error: undefined,
971
1062
  },
972
1063
  statementDateConflict: oldRecord?.statementDateConflict ?? null,
1064
+ confirmStatementMappingStatus: oldRecord?.confirmStatementMappingStatus ?? {
1065
+ fetchState: 'Not-Started',
1066
+ error: undefined,
1067
+ },
1068
+ confirmStatementMappingConflict: oldRecord?.confirmStatementMappingConflict ?? null,
1069
+ confirmedCombinedStatementUploads: oldRecord?.confirmedCombinedStatementUploads,
1070
+ combinedStatementGroupId: oldRecord?.combinedStatementGroupId,
973
1071
  localData: {
974
1072
  ...oldRecord?.localData,
975
1073
  accountSource: account?.reconciliation_source != null
@@ -1068,6 +1166,11 @@ const updateReconciliationByAccountIDOnIncludeAccount = (draft, accountId, recon
1068
1166
  statementParseStatus: { fetchState: 'Not-Started', error: undefined },
1069
1167
  reparseStatementStatus: { fetchState: 'Not-Started', error: undefined },
1070
1168
  statementDateConflict: null,
1169
+ confirmStatementMappingStatus: {
1170
+ fetchState: 'Not-Started',
1171
+ error: undefined,
1172
+ },
1173
+ confirmStatementMappingConflict: null,
1071
1174
  localData: {},
1072
1175
  accountDetectionReason: undefined,
1073
1176
  };
@@ -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,9 @@
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[];
7
9
  export declare const isAccountReconReport: (reportId: ReportIDPlusForecastID) => boolean;
@@ -4,6 +4,7 @@ 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;
7
8
  const toolkit_1 = require("@reduxjs/toolkit");
8
9
  const big_js_1 = __importDefault(require("big.js"));
9
10
  const keys_1 = __importDefault(require("lodash/keys"));
@@ -251,8 +252,23 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
251
252
  }
252
253
  const accountReconState = accountReconForMonthYearPeriod.reconciliationByAccountID[accountID];
253
254
  const rawParsedStatementData = accountReconState.parsedStatementData;
254
- const statementUpdateLocalData = accountReconState.localData?.statementUpdateLocalData;
255
- const parsedStatementDataForView = (0, statementParseViewSelector_1.getParsedStatementDataForView)(rawParsedStatementData, statementUpdateLocalData);
255
+ const statementUpdateLocalDataByUploadId = accountReconState.localData?.statementUpdateLocalDataByUploadId;
256
+ const statementAccountScope = accountReconState.localData?.statementAccountScope;
257
+ const parsedStatementDataForView = (0, statementParseViewSelector_1.getParsedStatementDataForView)(rawParsedStatementData, statementUpdateLocalDataByUploadId, statementAccountScope);
258
+ const rawStatementUploads = rawParsedStatementData?.statementUploads != null &&
259
+ rawParsedStatementData.statementUploads.length > 0
260
+ ? rawParsedStatementData.statementUploads
261
+ : rawParsedStatementData?.statementUpload != null
262
+ ? [rawParsedStatementData.statementUpload]
263
+ : [];
264
+ const allCitationTransactions = rawStatementUploads.flatMap((statementUpload) => statementUpload.statementTransactions);
265
+ const statementTransactionPeriodById = rawStatementUploads.length > 0
266
+ ? Object.assign({}, ...rawStatementUploads.map((statementUpload) => {
267
+ const uploadId = statementUpload.statementMeta.statementUploadId;
268
+ const localMeta = statementUpdateLocalDataByUploadId?.[uploadId]?.statementMeta;
269
+ return (0, statementParseViewSelector_1.getStatementTransactionPeriodById)(statementUpload.statementTransactions, statementUpload.statementMeta, localMeta);
270
+ }))
271
+ : undefined;
256
272
  reconList[accountID] = {
257
273
  accountConnectionStatus: accountConnectionStatus.status,
258
274
  paymentAccountId: accountConnectionStatus.paymentAccountId,
@@ -263,6 +279,10 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
263
279
  statementParseStatus: accountReconState.statementParseStatus,
264
280
  reparseStatementStatus: accountReconState.reparseStatementStatus,
265
281
  statementDateConflict: accountReconState.statementDateConflict,
282
+ confirmStatementMappingStatus: accountReconState.confirmStatementMappingStatus,
283
+ confirmStatementMappingConflict: accountReconState.confirmStatementMappingConflict,
284
+ confirmedCombinedStatementUploads: accountReconState.confirmedCombinedStatementUploads,
285
+ combinedStatementGroupId: accountReconState.combinedStatementGroupId,
266
286
  statementUpdateStatus: accountReconState.statementUpdateStatus,
267
287
  statementUploadStatus: accountReconState.statementUploadStatus,
268
288
  localData: accountReconState.localData,
@@ -273,11 +293,8 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
273
293
  statementProcessingTotalDurationSeconds: accountReconState.statementProcessingTotalDurationSeconds,
274
294
  statementProcessingFailed: accountReconState.statementProcessingFailed,
275
295
  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,
296
+ allCitationTransactions,
297
+ statementTransactionPeriodById,
281
298
  transactionFetchState: (0, reduceFetchState_1.reduceAnyFetchState)([
282
299
  accountReconState.transactionFetchState,
283
300
  accountListState.byReportId.accountList,
@@ -347,6 +364,8 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
347
364
  statementParseStatus: { fetchState: 'Not-Started' },
348
365
  reparseStatementStatus: { fetchState: 'Not-Started' },
349
366
  statementDateConflict: null,
367
+ confirmStatementMappingStatus: { fetchState: 'Not-Started' },
368
+ confirmStatementMappingConflict: null,
350
369
  localData: {},
351
370
  connectionInProgress: false,
352
371
  statementParseInProgress: false,
@@ -464,6 +483,9 @@ exports.getExpenseAutomationReconciliationView = (0, toolkit_1.createSelector)((
464
483
  const getReparseStatementStatusByAccountId = (state, accountId) => (0, exports.getExpenseAutomationReconciliationView)(state)
465
484
  .accountReconciliationsByAccountID[accountId]?.reparseStatementStatus;
466
485
  exports.getReparseStatementStatusByAccountId = getReparseStatementStatusByAccountId;
486
+ function getLedgerAccountsForCombinedStatementMapping(accountReconciliationsByAccountID) {
487
+ return Object.values(accountReconciliationsByAccountID).map((accountReconciliation) => accountReconciliation.accountReconEntity.account);
488
+ }
467
489
  const isAccountReconReport = (reportId) => {
468
490
  return reportId.endsWith('reconciliation');
469
491
  };
@@ -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;