@zeniai/client-epic-state 5.2.10-betaAK4 → 5.2.10-betaRD1

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 (174) hide show
  1. package/lib/commonStateTypes/selectorTypes/pickAndMergeForecastSection.d.ts +0 -0
  2. package/lib/commonStateTypes/selectorTypes/pickAndMergeForecastSection.js +1 -0
  3. package/lib/entity/invoicing/coupon/couponConstants.d.ts +11 -0
  4. package/lib/entity/invoicing/coupon/couponConstants.js +29 -0
  5. package/lib/entity/invoicing/invoicingCommonPayload.d.ts +18 -31
  6. package/lib/entity/invoicing/invoicingCommonPayload.js +63 -66
  7. package/lib/entity/invoicing/product/productPayload.d.ts +0 -10
  8. package/lib/entity/invoicing/product/productPayload.js +2 -14
  9. package/lib/entity/jeSchedules/jeScheduleHelper.d.ts +1 -0
  10. package/lib/entity/jeSchedules/jeScheduleHelper.js +7 -0
  11. package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +66 -1
  12. package/lib/entity/jeSchedules/jeSchedulesPayload.js +135 -0
  13. package/lib/entity/jeSchedules/jeSchedulesReducer.d.ts +4 -2
  14. package/lib/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  15. package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +11 -2
  16. package/lib/entity/jeSchedules/jeSchedulesSelector.js +38 -3
  17. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +79 -1
  18. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +24 -1
  19. package/lib/entity/jeSchedules/jeSchedulesTypes.js +88 -1
  20. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  21. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  22. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +2 -0
  23. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  24. package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +2 -0
  25. package/lib/epic.d.ts +10 -2
  26. package/lib/epic.js +21 -10
  27. package/lib/esm/commonStateTypes/selectorTypes/pickAndMergeForecastSection.js +1 -0
  28. package/lib/esm/entity/invoicing/coupon/couponConstants.js +26 -0
  29. package/lib/esm/entity/invoicing/invoicingCommonPayload.js +62 -63
  30. package/lib/esm/entity/invoicing/product/productPayload.js +2 -14
  31. package/lib/esm/entity/jeSchedules/jeScheduleHelper.js +6 -0
  32. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +135 -1
  33. package/lib/esm/entity/jeSchedules/jeSchedulesReducer.js +30 -2
  34. package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +36 -2
  35. package/lib/esm/entity/jeSchedules/jeSchedulesTypes.js +78 -0
  36. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  37. package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +2 -0
  38. package/lib/esm/epic.js +17 -6
  39. package/lib/esm/index.js +17 -12
  40. package/lib/esm/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  41. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +41 -5
  42. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +45 -0
  43. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  44. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +99 -0
  45. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +25 -0
  46. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +110 -0
  47. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +79 -0
  48. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +139 -0
  49. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +106 -0
  50. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +22 -0
  51. package/lib/esm/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +140 -0
  52. package/lib/esm/view/expenseAutomationView/payload/jeSchedulesPayload.js +55 -0
  53. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +306 -29
  54. package/lib/esm/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +106 -0
  55. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +294 -22
  56. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +5 -6
  57. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +9 -24
  58. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +1 -6
  59. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.js +25 -0
  60. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.js +15 -0
  61. package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +0 -40
  62. package/lib/esm/view/invoicing/settingsView/settingsViewEpics.js +92 -0
  63. package/lib/esm/view/invoicing/settingsView/settingsViewReducer.js +1 -21
  64. package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +0 -41
  65. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  66. package/lib/esm/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  67. package/lib/esm/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  68. package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.js +18 -0
  69. package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.js +18 -0
  70. package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryVideoViewedEpic.js +18 -0
  71. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardEpic.js +16 -0
  72. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardPayload.js +1 -0
  73. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardReducer.js +60 -0
  74. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardSelector.js +12 -0
  75. package/lib/esm/view/zeniAccountsPromoCard/zeniAccountsPromoCardState.js +1 -0
  76. package/lib/index.d.ts +21 -18
  77. package/lib/index.js +95 -59
  78. package/lib/view/expenseAutomationView/epics/common/fetchAllExpenseAutomationTabsEpic.js +6 -3
  79. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.d.ts +3 -2
  80. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +39 -3
  81. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.d.ts +20 -0
  82. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchOneTimeAccrualEpic.js +49 -0
  83. package/lib/view/expenseAutomationView/epics/jeSchedule/ignoreRecommendedJeScheduleEpic.js +14 -2
  84. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.d.ts +8 -0
  85. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/createOneTimeAccrualEpic.js +103 -0
  86. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.d.ts +8 -0
  87. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +29 -0
  88. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.d.ts +45 -0
  89. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +114 -0
  90. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.d.ts +8 -0
  91. package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +83 -0
  92. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.d.ts +12 -0
  93. package/lib/view/expenseAutomationView/epics/jeSchedule/oneTimeAccrualActionsEpic.js +146 -0
  94. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.d.ts +64 -0
  95. package/lib/view/expenseAutomationView/epics/jeSchedule/revertJeScheduleEpic.js +110 -0
  96. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.d.ts +6 -0
  97. package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +26 -0
  98. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.d.ts +36 -0
  99. package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +145 -0
  100. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  101. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +72 -3
  102. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.js +58 -1
  103. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +91 -12
  104. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +308 -29
  105. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +1 -1
  106. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +2 -2
  107. package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.d.ts +42 -0
  108. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +36 -7
  109. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.d.ts +21 -0
  110. package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +112 -0
  111. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.d.ts +34 -0
  112. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +302 -21
  113. package/lib/view/expenseAutomationView/types/completedSubTab.d.ts +1 -1
  114. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +82 -8
  115. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +8 -8
  116. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
  117. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.d.ts +1 -12
  118. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +9 -24
  119. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +1 -6
  120. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.d.ts +6 -0
  121. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.js +29 -0
  122. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.d.ts +6 -0
  123. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.js +19 -0
  124. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.d.ts +1 -10
  125. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +1 -43
  126. package/lib/view/invoicing/settingsView/settingsViewEpics.d.ts +12 -0
  127. package/lib/view/invoicing/settingsView/settingsViewEpics.js +99 -0
  128. package/lib/view/invoicing/settingsView/settingsViewReducer.d.ts +1 -4
  129. package/lib/view/invoicing/settingsView/settingsViewReducer.js +2 -22
  130. package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +0 -35
  131. package/lib/view/invoicing/settingsView/settingsViewSelector.js +1 -43
  132. package/lib/view/invoicing/settingsView/settingsViewState.d.ts +0 -8
  133. package/lib/view/scheduleView/scheduleListView/epics/fetchAccruedScheduleListEpic.js +1 -1
  134. package/lib/view/scheduleView/scheduleListView/epics/fetchDownloadSchedulesEpic.js +7 -2
  135. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.d.ts +4 -2
  136. package/lib/view/scheduleView/scheduleListView/scheduleListReducer.js +5 -3
  137. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.d.ts +8 -0
  138. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.js +22 -0
  139. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.d.ts +8 -0
  140. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.js +22 -0
  141. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryVideoViewedEpic.d.ts +8 -0
  142. package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryVideoViewedEpic.js +22 -0
  143. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardEpic.d.ts +13 -0
  144. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardEpic.js +20 -0
  145. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardPayload.d.ts +11 -0
  146. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardPayload.js +2 -0
  147. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardReducer.d.ts +7 -0
  148. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardReducer.js +64 -0
  149. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardSelector.d.ts +12 -0
  150. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardSelector.js +15 -0
  151. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardState.d.ts +9 -0
  152. package/lib/view/zeniAccountsPromoCard/zeniAccountsPromoCardState.js +2 -0
  153. package/package.json +1 -1
  154. package/lib/esm/view/invoicing/settingsView/epics/connectInvoicingStripeEpic.js +0 -27
  155. package/lib/esm/view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic.js +0 -24
  156. package/lib/esm/view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic.js +0 -19
  157. package/lib/esm/view/invoicing/settingsView/epics/saveInvoicingSettingsEpic.js +0 -54
  158. package/lib/esm/view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic.js +0 -22
  159. package/lib/esm/view/invoicing/settingsView/invoicingQboSettingsFormConfig.js +0 -55
  160. package/lib/view/invoicing/settingsView/epics/connectInvoicingStripeEpic.d.ts +0 -6
  161. package/lib/view/invoicing/settingsView/epics/connectInvoicingStripeEpic.js +0 -31
  162. package/lib/view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic.d.ts +0 -11
  163. package/lib/view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic.js +0 -28
  164. package/lib/view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic.d.ts +0 -6
  165. package/lib/view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic.js +0 -23
  166. package/lib/view/invoicing/settingsView/epics/saveInvoicingSettingsEpic.d.ts +0 -6
  167. package/lib/view/invoicing/settingsView/epics/saveInvoicingSettingsEpic.js +0 -58
  168. package/lib/view/invoicing/settingsView/epics/settingsViewActionType.d.ts +0 -5
  169. package/lib/view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic.d.ts +0 -11
  170. package/lib/view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic.js +0 -26
  171. package/lib/view/invoicing/settingsView/invoicingQboSettingsFormConfig.d.ts +0 -33
  172. package/lib/view/invoicing/settingsView/invoicingQboSettingsFormConfig.js +0 -60
  173. /package/lib/esm/view/{invoicing/settingsView/epics/settingsViewActionType.js → expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js} +0 -0
  174. /package/lib/view/{invoicing/settingsView/epics/settingsViewActionType.js → expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js} +0 -0
@@ -0,0 +1,11 @@
1
+ import { InvoicingFormOption } from '../invoicingCommonPayload';
2
+ import { InvoicingCouponApplyOn, InvoicingCouponDurationType, InvoicingCouponPeriodUnit, InvoicingDiscountType } from './couponPayload';
3
+ /**
4
+ * Coupon form select options. Single source of truth (CES-owned) for the value
5
+ * sets that back the coupon's string-union domain fields; surfaced to the form
6
+ * via `getInvoicingCouponFormView` so web-components need not hardcode them.
7
+ */
8
+ export declare const INVOICING_DISCOUNT_TYPE_OPTIONS: readonly InvoicingFormOption<InvoicingDiscountType>[];
9
+ export declare const INVOICING_COUPON_DURATION_TYPE_OPTIONS: readonly InvoicingFormOption<InvoicingCouponDurationType>[];
10
+ export declare const INVOICING_COUPON_PERIOD_UNIT_OPTIONS: readonly InvoicingFormOption<InvoicingCouponPeriodUnit>[];
11
+ export declare const INVOICING_COUPON_APPLY_ON_OPTIONS: readonly InvoicingFormOption<InvoicingCouponApplyOn>[];
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INVOICING_COUPON_APPLY_ON_OPTIONS = exports.INVOICING_COUPON_PERIOD_UNIT_OPTIONS = exports.INVOICING_COUPON_DURATION_TYPE_OPTIONS = exports.INVOICING_DISCOUNT_TYPE_OPTIONS = void 0;
4
+ /**
5
+ * Coupon form select options. Single source of truth (CES-owned) for the value
6
+ * sets that back the coupon's string-union domain fields; surfaced to the form
7
+ * via `getInvoicingCouponFormView` so web-components need not hardcode them.
8
+ */
9
+ exports.INVOICING_DISCOUNT_TYPE_OPTIONS = [
10
+ { label: 'Percentage', value: 'percentage' },
11
+ { label: 'Fixed amount', value: 'fixed_amount' },
12
+ { label: 'Offer quantity', value: 'offer_quantity' },
13
+ ];
14
+ exports.INVOICING_COUPON_DURATION_TYPE_OPTIONS = [
15
+ { label: 'One time', value: 'one_time' },
16
+ { label: 'Forever', value: 'forever' },
17
+ { label: 'Limited period', value: 'limited_period' },
18
+ ];
19
+ exports.INVOICING_COUPON_PERIOD_UNIT_OPTIONS = [
20
+ { label: 'Day', value: 'day' },
21
+ { label: 'Week', value: 'week' },
22
+ { label: 'Month', value: 'month' },
23
+ { label: 'Year', value: 'year' },
24
+ ];
25
+ exports.INVOICING_COUPON_APPLY_ON_OPTIONS = [
26
+ { label: 'Invoice amount', value: 'invoice_amount' },
27
+ { label: 'Each specified item', value: 'each_specified_item' },
28
+ { label: 'Specified items total', value: 'specified_items_total' },
29
+ ];
@@ -1,5 +1,3 @@
1
- import { AccountBasePayload } from '../account/accountPayload';
2
- import { AccountBase } from '../account/accountState';
3
1
  import { AddressPayload } from '../address/addressPayload';
4
2
  export type InvoicingPriceType = 'tax_exclusive' | 'tax_inclusive';
5
3
  export declare const INVOICING_DUNNING_ACTIONS: readonly ["email_only", "email_and_retry", "do_nothing", "retry_only"];
@@ -94,52 +92,41 @@ export declare function toInvoicingQboCustomerMatchingMode(value: string): Invoi
94
92
  * A mapped account as the newer settings payload returns it: the platform id,
95
93
  * plus hydrated fields the client only displays.
96
94
  */
95
+ export interface InvoicingQboMappedAccountPayload {
96
+ account_id?: string | null;
97
+ account_name?: string | null;
98
+ fully_qualified_name?: string | null;
99
+ qbo_id?: string | null;
100
+ }
97
101
  /**
98
102
  * Account mappings arrive in two shapes. The original sends a bare id per slot
99
- * (`deposit_account_id`); the newer one sends the account itself
100
- * (`deposit_account`). Both are declared because a tenant can be served either
101
- * depending on when its backend rolled, and a page that understands only one
102
- * renders an empty picker over data that exists. `Partial` because a read may
103
- * carry only the ids, while a write sends a whole `AccountBasePayload`.
103
+ * (`deposit_account_id`); the newer one sends an object holding the platform id
104
+ * (`deposit_account: {account_id}`). Both are declared because a tenant can be
105
+ * served either depending on when its backend rolled, and a page that understands
106
+ * only one renders an empty picker over data that exists.
104
107
  */
105
108
  export interface InvoicingQboAccountMappingsPayload {
106
- default_income_account?: Partial<AccountBasePayload> | null;
109
+ default_income_account?: InvoicingQboMappedAccountPayload | null;
107
110
  default_income_account_id?: string | null;
108
- deposit_account?: Partial<AccountBasePayload> | null;
111
+ deposit_account?: InvoicingQboMappedAccountPayload | null;
109
112
  deposit_account_id?: string | null;
110
- discounts_account?: Partial<AccountBasePayload> | null;
113
+ deposit_account_overrides?: Record<string, string> | null;
114
+ discounts_account?: InvoicingQboMappedAccountPayload | null;
111
115
  discounts_account_id?: string | null;
112
- rounding_account?: Partial<AccountBasePayload> | null;
116
+ rounding_account?: InvoicingQboMappedAccountPayload | null;
113
117
  rounding_account_id?: string | null;
114
- write_off_account?: Partial<AccountBasePayload> | null;
118
+ write_off_account?: InvoicingQboMappedAccountPayload | null;
115
119
  write_off_account_id?: string | null;
116
120
  }
117
- /**
118
- * The id for one mapping slot, from whichever shape the backend sent. The object
119
- * form wins when present; a blank id in either is treated as unset so the picker
120
- * shows its placeholder rather than selecting nothing.
121
- */
122
- /**
123
- * The first id a picker can actually select. Callers list the QuickBooks id
124
- * first: the options are keyed on it, so an internal id selects nothing even
125
- * when it names the same record. Blank counts as absent, so a cleared field
126
- * falls through to the next candidate rather than selecting an empty option.
127
- */
128
- export declare const firstSelectableInvoicingId: (candidates: readonly (string | null | undefined)[]) => string | undefined;
129
121
  /**
130
122
  * Read one account-mapping dropdown value by its config `code` (the codes in
131
123
  * `qbo_account_mapping_kind_options` match the `account_mappings` field names).
132
124
  */
133
125
  export declare function getInvoicingQboAccountMappingId(accountMappings: InvoicingQboAccountMappingsPayload | undefined, code: string): string | undefined;
134
126
  /**
135
- * Expand each mapping from the id the picker submitted to the whole account, the
136
- * shape the service stores: `deposit_account_id: '35'` becomes
137
- * `deposit_account: {qbo_id: '35', account_id, account_name, …}`. Written at the
138
- * request boundary rather than in the page's draft, so the UI keeps working in
139
- * ids. An id that resolves to no account keeps its bare form rather than being
140
- * dropped.
127
+ * Return a copy of the account mappings with the dropdown slot named by
128
+ * `code` set to `accountId`. Unknown codes leave the mappings unchanged.
141
129
  */
142
- export declare const withInvoicingQboMappedAccounts: (accountMappings: InvoicingQboAccountMappingsPayload | undefined, accountByQboId: (qboId: string) => AccountBase | undefined) => InvoicingQboAccountMappingsPayload | undefined;
143
130
  export declare function withInvoicingQboAccountMappingId(accountMappings: InvoicingQboAccountMappingsPayload | undefined, code: string, accountId: string): InvoicingQboAccountMappingsPayload;
144
131
  export interface InvoicingQboSettingsPayload {
145
132
  account_mappings?: InvoicingQboAccountMappingsPayload | null;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ALL_INVOICING_FIELD_HELP_GROUPS = exports.withInvoicingQboMappedAccounts = exports.firstSelectableInvoicingId = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.INVOICING_DISCOUNT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_PRODUCT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_ITEM_LIFECYCLE_ACTIONS = exports.INVOICING_SUBSCRIPTION_LIFECYCLE_ACTIONS = exports.INVOICING_DUNNING_ACTIONS = void 0;
3
+ exports.ALL_INVOICING_FIELD_HELP_GROUPS = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.INVOICING_DISCOUNT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_PRODUCT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_ITEM_LIFECYCLE_ACTIONS = exports.INVOICING_SUBSCRIPTION_LIFECYCLE_ACTIONS = exports.INVOICING_DUNNING_ACTIONS = void 0;
4
4
  exports.toInvoicingDunningAction = toInvoicingDunningAction;
5
5
  exports.toInvoicingSubscriptionLifecycleAction = toInvoicingSubscriptionLifecycleAction;
6
6
  exports.toInvoicingSubscriptionLifecycleActionOption = toInvoicingSubscriptionLifecycleActionOption;
@@ -23,7 +23,6 @@ exports.toInvoicingSubscriptionEditFieldOption = toInvoicingSubscriptionEditFiel
23
23
  exports.toAuditLogEntityRouteOption = toAuditLogEntityRouteOption;
24
24
  exports.buildInvoicingEntityPath = buildInvoicingEntityPath;
25
25
  exports.isInvoicingEntityLinkable = isInvoicingEntityLinkable;
26
- const accountPayload_1 = require("../account/accountPayload");
27
26
  exports.INVOICING_DUNNING_ACTIONS = [
28
27
  'email_only',
29
28
  'email_and_retry',
@@ -159,84 +158,82 @@ function toInvoicingQboCustomerMatchingMode(value) {
159
158
  * form wins when present; a blank id in either is treated as unset so the picker
160
159
  * shows its placeholder rather than selecting nothing.
161
160
  */
162
- /**
163
- * The first id a picker can actually select. Callers list the QuickBooks id
164
- * first: the options are keyed on it, so an internal id selects nothing even
165
- * when it names the same record. Blank counts as absent, so a cleared field
166
- * falls through to the next candidate rather than selecting an empty option.
167
- */
168
- const firstSelectableInvoicingId = (candidates) => candidates.find((candidate) => candidate != null && candidate !== '');
169
- exports.firstSelectableInvoicingId = firstSelectableInvoicingId;
170
161
  function readInvoicingQboMappedAccountId(mappedAccount, legacyAccountId) {
171
- // Both shapes are read: the mapping arrives either way depending on how it
172
- // was saved.
173
- return (0, exports.firstSelectableInvoicingId)([
162
+ // `qbo_id` first: the pickers key their options on the QuickBooks id, so an
163
+ // internal `account_id` would not select anything even when it is the same
164
+ // account. Both are read because the mapping arrives either way depending on
165
+ // how it was saved.
166
+ const candidates = [
174
167
  mappedAccount?.qbo_id,
175
168
  mappedAccount?.account_id,
176
169
  legacyAccountId,
177
- ]);
170
+ ];
171
+ return candidates.find((candidate) => candidate != null && candidate !== '');
178
172
  }
179
- /**
180
- * The object key holding a mapped account, derived from its `*_account_id` code:
181
- * `deposit_account_id` arrives either as `deposit_account_id` or as a
182
- * `deposit_account` record. Derived rather than listed — the set of slots is the
183
- * config API's to grow, and a hardcoded list silently ignores any code it has
184
- * not heard of, which shows up as a mapping that will not save.
185
- */
186
- const mappedAccountKeyForCode = (code) => code.replace(/_id$/, '');
187
- /** Every mapping code a payload carries, in either shape. */
188
- const mappingCodesIn = (accountMappings) => [
189
- ...new Set(Object.keys(accountMappings).map((key) => key.endsWith('_id') ? key : `${key}_id`)),
190
- ];
191
173
  /**
192
174
  * Read one account-mapping dropdown value by its config `code` (the codes in
193
175
  * `qbo_account_mapping_kind_options` match the `account_mappings` field names).
194
176
  */
195
177
  function getInvoicingQboAccountMappingId(accountMappings, code) {
196
- const slots = accountMappings;
197
- const legacyId = slots?.[code];
198
- return readInvoicingQboMappedAccountId(slots?.[mappedAccountKeyForCode(code)], typeof legacyId === 'string' ? legacyId : undefined);
178
+ switch (code) {
179
+ case 'deposit_account_id':
180
+ return readInvoicingQboMappedAccountId(accountMappings?.deposit_account, accountMappings?.deposit_account_id);
181
+ case 'default_income_account_id':
182
+ return readInvoicingQboMappedAccountId(accountMappings?.default_income_account, accountMappings?.default_income_account_id);
183
+ case 'discounts_account_id':
184
+ return readInvoicingQboMappedAccountId(accountMappings?.discounts_account, accountMappings?.discounts_account_id);
185
+ case 'rounding_account_id':
186
+ return readInvoicingQboMappedAccountId(accountMappings?.rounding_account, accountMappings?.rounding_account_id);
187
+ case 'write_off_account_id':
188
+ return readInvoicingQboMappedAccountId(accountMappings?.write_off_account, accountMappings?.write_off_account_id);
189
+ default:
190
+ return undefined;
191
+ }
199
192
  }
200
193
  /**
201
- * Expand each mapping from the id the picker submitted to the whole account, the
202
- * shape the service stores: `deposit_account_id: '35'` becomes
203
- * `deposit_account: {qbo_id: '35', account_id, account_name, …}`. Written at the
204
- * request boundary rather than in the page's draft, so the UI keeps working in
205
- * ids. An id that resolves to no account keeps its bare form rather than being
206
- * dropped.
194
+ * Return a copy of the account mappings with the dropdown slot named by
195
+ * `code` set to `accountId`. Unknown codes leave the mappings unchanged.
207
196
  */
208
- const withInvoicingQboMappedAccounts = (accountMappings, accountByQboId) => {
209
- if (accountMappings == null) {
210
- return undefined;
211
- }
212
- const expanded = { ...accountMappings };
213
- mappingCodesIn(accountMappings).forEach((code) => {
214
- const objectKey = mappedAccountKeyForCode(code);
215
- const accountId = getInvoicingQboAccountMappingId(accountMappings, code);
216
- if (accountId == null) {
217
- return;
218
- }
219
- const account = accountByQboId(accountId);
220
- if (account == null) {
221
- // Unresolved: leave the id as it stands rather than dropping the mapping.
222
- // Sending less than we were given would unset a live configuration.
223
- return;
224
- }
225
- expanded[objectKey] = (0, accountPayload_1.toAccountPayload)(account);
226
- expanded[code] = undefined;
227
- });
228
- return expanded;
229
- };
230
- exports.withInvoicingQboMappedAccounts = withInvoicingQboMappedAccounts;
231
197
  function withInvoicingQboAccountMappingId(accountMappings, code, accountId) {
232
- // Both slots are written together: setting only the bare id would leave the
233
- // record shape behind, and the reader prefers it — so the selection just made
234
- // would read back as whatever was mapped before.
235
- return {
236
- ...(accountMappings ?? {}),
237
- [mappedAccountKeyForCode(code)]: undefined,
238
- [code]: accountId,
239
- };
198
+ // Both slots are written together. Setting only the bare id would leave the
199
+ // object shape behind, and the reader prefers it — so the selection just made
200
+ // would read back as whatever was mapped before. The object is dropped rather
201
+ // than rebuilt: only the id is known here, not the name that came with it.
202
+ const base = accountMappings ?? {};
203
+ switch (code) {
204
+ case 'deposit_account_id':
205
+ return {
206
+ ...base,
207
+ deposit_account: undefined,
208
+ deposit_account_id: accountId,
209
+ };
210
+ case 'default_income_account_id':
211
+ return {
212
+ ...base,
213
+ default_income_account: undefined,
214
+ default_income_account_id: accountId,
215
+ };
216
+ case 'discounts_account_id':
217
+ return {
218
+ ...base,
219
+ discounts_account: undefined,
220
+ discounts_account_id: accountId,
221
+ };
222
+ case 'rounding_account_id':
223
+ return {
224
+ ...base,
225
+ rounding_account: undefined,
226
+ rounding_account_id: accountId,
227
+ };
228
+ case 'write_off_account_id':
229
+ return {
230
+ ...base,
231
+ write_off_account: undefined,
232
+ write_off_account_id: accountId,
233
+ };
234
+ default:
235
+ return base;
236
+ }
240
237
  }
241
238
  function toInvoicingQboAccountMappingKindOption(option) {
242
239
  return {
@@ -1,5 +1,3 @@
1
- import { AccountBasePayload } from '../../account/accountPayload';
2
- import { ClassBasePayload } from '../../class/classPayload';
3
1
  import { InvoicingPlanTier, InvoicingProduct } from './productState';
4
2
  export interface InvoicingPlanTierPayload {
5
3
  price: number;
@@ -9,18 +7,10 @@ export interface InvoicingPlanTierPayload {
9
7
  pricing_type?: string;
10
8
  }
11
9
  export interface InvoicingAccountingDetailPayload {
12
- /**
13
- * `account` and `accounting_class` hold whole records — what the service stores
14
- * and what the catalog payload builder sends. The bare `accounting_code` /
15
- * `accounting_category_1` are the older shape, still read so a plan saved
16
- * before the rollover prefills.
17
- */
18
- account?: Partial<AccountBasePayload> | null;
19
10
  accounting_category_1?: string;
20
11
  accounting_category_2?: string;
21
12
  accounting_category_3?: string;
22
13
  accounting_category_4?: string;
23
- accounting_class?: Partial<ClassBasePayload> | null;
24
14
  accounting_code?: string;
25
15
  sku?: string;
26
16
  }
@@ -4,7 +4,6 @@ exports.mapInvoicingProductPayloadToState = exports.mapInvoicingPlanTierPayloadT
4
4
  const amount_1 = require("../../../commonStateTypes/amount");
5
5
  const currencyHelper_1 = require("../../../commonStateTypes/currencyHelper");
6
6
  const zeniDayJS_1 = require("../../../zeniDayJS");
7
- const invoicingCommonPayload_1 = require("../invoicingCommonPayload");
8
7
  // ── Payload → State mappers (snake_case wire shape → camelCase domain shape) ──
9
8
  const mapInvoicingPlanTierPayloadToState = (payload, currencyCode, currencySymbol) => ({
10
9
  price: (0, amount_1.toAmount)(payload.price, currencyCode, currencySymbol),
@@ -15,22 +14,11 @@ const mapInvoicingPlanTierPayloadToState = (payload, currencyCode, currencySymbo
15
14
  });
16
15
  exports.mapInvoicingPlanTierPayloadToState = mapInvoicingPlanTierPayloadToState;
17
16
  const mapInvoicingAccountingDetailPayloadToState = (payload) => ({
18
- // The QuickBooks id first in both, for the reason `firstSelectableInvoicingId`
19
- // documents: the form's pickers are keyed on it, so reading the internal id
20
- // would leave the field blank over a mapping that exists.
21
- accountingCategory1: (0, invoicingCommonPayload_1.firstSelectableInvoicingId)([
22
- payload.accounting_class?.qbo_id,
23
- payload.accounting_class?.accounting_class_id,
24
- payload.accounting_category_1,
25
- ]),
17
+ accountingCategory1: payload.accounting_category_1,
26
18
  accountingCategory2: payload.accounting_category_2,
27
19
  accountingCategory3: payload.accounting_category_3,
28
20
  accountingCategory4: payload.accounting_category_4,
29
- accountingCode: (0, invoicingCommonPayload_1.firstSelectableInvoicingId)([
30
- payload.account?.qbo_id,
31
- payload.account?.account_id,
32
- payload.accounting_code,
33
- ]),
21
+ accountingCode: payload.accounting_code,
34
22
  sku: payload.sku,
35
23
  });
36
24
  const mapInvoicingProductPayloadToState = (payload) => {
@@ -1,2 +1,3 @@
1
1
  import { ID } from '../../commonStateTypes/common';
2
2
  export declare function generateJEScheduleKey(jeScheduleId: ID, jeScheduleType: string): `${string}_${string}`;
3
+ export declare function generateJEOneTimeAccrualKey(accrualId: ID): `${string}_one_time_accrual`;
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateJEScheduleKey = generateJEScheduleKey;
4
+ exports.generateJEOneTimeAccrualKey = generateJEOneTimeAccrualKey;
4
5
  function generateJEScheduleKey(jeScheduleId, jeScheduleType) {
5
6
  return `${jeScheduleId}_${jeScheduleType}`;
6
7
  }
8
+ // Suffixed rather than using the bare Mongo _id so the key is a distinct type from
9
+ // JEScheduleKey / JEScheduleTransactionKey and the three cannot be passed interchangeably.
10
+ // The unsuffixed id stays on the entity as `accrualId` for callers that need it.
11
+ function generateJEOneTimeAccrualKey(accrualId) {
12
+ return `${accrualId}_one_time_accrual`;
13
+ }
@@ -7,7 +7,7 @@ import { TransactionIDPayload } from '../transaction/payloadTypes/transactionIDP
7
7
  import { TransactionCategory } from '../transaction/stateTypes/transactionType';
8
8
  import { UserPayload } from '../user/userPayload';
9
9
  import { VendorPayload } from '../vendor/vendorPayload';
10
- import { JEAccruedScheduledTransactionState, JEScheduledTransactionState, ScheduledJournalEntryState } from './jeSchedulesState';
10
+ import { JEAccruedScheduledTransactionState, JEOneTimeAccrualState, JEScheduledTransactionState, ScheduledJournalEntryState } from './jeSchedulesState';
11
11
  import { JEScheduleKey, JEScheduleTransactionKey } from './jeSchedulesTypes';
12
12
  export interface JEScheduleOtherAttributesPayload {
13
13
  asset_id?: string | null;
@@ -72,9 +72,13 @@ export interface JEScheduledTransactionPayload {
72
72
  updated_by: UserPayload;
73
73
  vendor: VendorPayload;
74
74
  ai_summaries?: JEScheduleAISummariesPayload;
75
+ confidence_score?: number | null;
76
+ create_time?: string | null;
75
77
  created_by?: UserPayload;
76
78
  end_date?: string | null;
79
+ posted_count?: number | null;
77
80
  recommendations?: JEScheduleRecommendationsPayload;
81
+ recurring_amount?: number | null;
78
82
  updated_at?: string | null;
79
83
  }
80
84
  export interface JEAccruedScheduledTransactionPayload extends Omit<JEScheduledTransactionPayload, 'base_transaction' | 'je_schedule_id' | 'je_schedule_type'> {
@@ -84,6 +88,66 @@ export interface JEAccruedScheduledTransactionPayload extends Omit<JEScheduledTr
84
88
  memo: string;
85
89
  recurring_amount: number;
86
90
  }
91
+ /**
92
+ * The frozen vendor profile the Cron used to decide an accrual, so the detail page can show its
93
+ * reasoning even after the live profile is rebuilt. Present on agent/Cron rows ONLY — a human-created
94
+ * accrual carries none, which is why every consumer has to treat it as absent rather than empty.
95
+ */
96
+ export interface JEOneTimeAccrualProfileSnapshotPayload {
97
+ billing_pattern?: {
98
+ avg_amount?: number | null;
99
+ billing_lag_days?: number | null;
100
+ consistency_score?: number | null;
101
+ frequency?: string | null;
102
+ last_bill_amount?: number | null;
103
+ last_bill_date?: string | null;
104
+ months_of_history?: number | null;
105
+ typical_bill_day?: number | null;
106
+ } | null;
107
+ monthly_totals?: Record<string, number> | null;
108
+ sorted_months?: string[] | null;
109
+ }
110
+ /** The JE the AI originally suggested, frozen at draft time for suggested-vs-posted comparison. */
111
+ export interface JEOneTimeAccrualAiSuggestionPayload {
112
+ estimated_amount?: number | null;
113
+ je_credit_account_id?: ID | null;
114
+ je_credit_account_name?: string | null;
115
+ je_debit_account_id?: ID | null;
116
+ je_debit_account_name?: string | null;
117
+ memo?: string | null;
118
+ }
119
+ export interface JEOneTimeAccrualPayload {
120
+ _id: ID;
121
+ estimated_amount: number;
122
+ origin: string;
123
+ service_month: string;
124
+ status: string;
125
+ vendor_id: ID;
126
+ vendor_name: string;
127
+ actual_post_date?: string | null;
128
+ actual_reversal_post_date?: string | null;
129
+ ai_suggestion?: JEOneTimeAccrualAiSuggestionPayload | null;
130
+ automation_tier?: string | null;
131
+ created_by_user?: UserPayload | null;
132
+ currency?: string | null;
133
+ expected_reversal_date?: string | null;
134
+ je_credit_account_id?: ID | null;
135
+ je_credit_account_name?: string | null;
136
+ je_credit_accounting_class_id?: ID | null;
137
+ je_credit_accounting_class_name?: string | null;
138
+ je_debit_account_id?: ID | null;
139
+ je_debit_account_name?: string | null;
140
+ je_debit_accounting_class_id?: ID | null;
141
+ je_debit_accounting_class_name?: string | null;
142
+ memo?: string | null;
143
+ posting_date?: string | null;
144
+ profile_snapshot?: JEOneTimeAccrualProfileSnapshotPayload | null;
145
+ reversal_policy?: string | null;
146
+ reversal_transaction_id?: ID | null;
147
+ reversal_trigger?: string | null;
148
+ transaction_id?: ID | null;
149
+ transaction_integration_id?: ID | null;
150
+ }
87
151
  export interface ScheduledJournalEntryPayload {
88
152
  actual_post_date: string | null;
89
153
  create_time: string | null;
@@ -114,3 +178,4 @@ export declare function getJEScheduleTransactionDetailKeyPayload(payload: Schedu
114
178
  export declare function getJEScheduleKey(payload: JEAccruedScheduledTransactionPayload): JEScheduleKey;
115
179
  export declare function toJEScheduledTransaction(payload: JEScheduledTransactionPayload): JEScheduledTransactionState;
116
180
  export declare function toJEAccruedScheduledTransaction(payload: JEAccruedScheduledTransactionPayload): JEAccruedScheduledTransactionState;
181
+ export declare function toJEOneTimeAccrual(payload: JEOneTimeAccrualPayload): JEOneTimeAccrualState;
@@ -8,12 +8,15 @@ exports.getJEScheduleTransactionDetailKeyPayload = getJEScheduleTransactionDetai
8
8
  exports.getJEScheduleKey = getJEScheduleKey;
9
9
  exports.toJEScheduledTransaction = toJEScheduledTransaction;
10
10
  exports.toJEAccruedScheduledTransaction = toJEAccruedScheduledTransaction;
11
+ exports.toJEOneTimeAccrual = toJEOneTimeAccrual;
11
12
  const amount_1 = require("../../commonStateTypes/amount");
12
13
  const timePeriod_1 = require("../../commonStateTypes/timePeriod");
13
14
  const zeniDayJS_1 = require("../../zeniDayJS");
15
+ const zeniUrl_1 = require("../../zeniUrl");
14
16
  const transactionIDPayload_1 = require("../transaction/payloadTypes/transactionIDPayload");
15
17
  const jeScheduleHelper_1 = require("./jeScheduleHelper");
16
18
  const jeSchedulesTypes_1 = require("./jeSchedulesTypes");
19
+ const USD_CURRENCY_CODE = 'USD';
17
20
  function toScheduledJournalEntryState(payload, currency_code, currency_symbol) {
18
21
  return {
19
22
  status: {
@@ -258,9 +261,18 @@ function toJEScheduledTransaction(payload) {
258
261
  startDate: payload.start_date != null ? (0, zeniDayJS_1.date)(payload.start_date) : undefined,
259
262
  endDate: payload.end_date != null ? (0, zeniDayJS_1.date)(payload.end_date) : undefined,
260
263
  period: payload.period != null ? Number(payload.period) : undefined,
264
+ recurringAmount: payload.recurring_amount != null
265
+ ? {
266
+ amount: payload.recurring_amount,
267
+ currencyCode: payload.currency_code,
268
+ currencySymbol: payload.currency_symbol,
269
+ }
270
+ : undefined,
271
+ postedCount: payload.posted_count ?? undefined,
261
272
  updatedByUserID: payload.updated_by.user_id,
262
273
  balanceAsOfToday: payload.balance ?? undefined,
263
274
  updatedAt: payload.updated_at != null ? (0, zeniDayJS_1.date)(payload.updated_at) : undefined,
275
+ createTime: payload.create_time != null ? (0, zeniDayJS_1.date)(payload.create_time) : undefined,
264
276
  jeCredit: {
265
277
  accountId: payload.je_credit_account_id ?? undefined,
266
278
  accountingClassId: payload.je_credit_accounting_class_id ?? undefined,
@@ -285,6 +297,7 @@ function toJEScheduledTransaction(payload) {
285
297
  : {},
286
298
  scheduledJournalEntry: [],
287
299
  aiSummaries: toJEScheduleAISummaries(payload.ai_summaries),
300
+ confidenceScore: payload.confidence_score ?? undefined,
288
301
  createdByUserID: payload.created_by?.user_id ?? undefined,
289
302
  recommendations: toJEScheduleRecommendations(payload.recommendations),
290
303
  };
@@ -342,3 +355,125 @@ function toJEAccruedScheduledTransaction(payload) {
342
355
  jeScheduleType: (0, jeSchedulesTypes_1.toScheduleTypesTypeStrict)(payload.je_schedule_type),
343
356
  };
344
357
  }
358
+ /**
359
+ * Reads the months in the order the snapshot gives them rather than deriving a range: a vendor that
360
+ * skipped a month has no entry for it, so filling gaps would invent history that was never billed.
361
+ */
362
+ function toJEOneTimeAccrualMonthlyTotals(snapshot, currencyCode) {
363
+ const monthlyTotals = snapshot.monthly_totals;
364
+ if (monthlyTotals == null) {
365
+ return [];
366
+ }
367
+ const months = snapshot.sorted_months ?? Object.keys(monthlyTotals).sort();
368
+ return months
369
+ .filter((month) => monthlyTotals[month] != null)
370
+ .map((month) => ({
371
+ month,
372
+ amount: toOneTimeAccrualAmount(monthlyTotals[month], currencyCode),
373
+ }));
374
+ }
375
+ function toJEOneTimeAccrualProfileSnapshot(payload, currencyCode) {
376
+ if (payload == null) {
377
+ return undefined;
378
+ }
379
+ const billingPattern = payload.billing_pattern;
380
+ return {
381
+ monthlyTotals: toJEOneTimeAccrualMonthlyTotals(payload, currencyCode),
382
+ billingPattern: billingPattern != null
383
+ ? {
384
+ frequency: billingPattern.frequency ?? undefined,
385
+ monthsOfHistory: billingPattern.months_of_history ?? undefined,
386
+ consistencyScore: billingPattern.consistency_score ?? undefined,
387
+ billingLagDays: billingPattern.billing_lag_days ?? undefined,
388
+ typicalBillDay: billingPattern.typical_bill_day ?? undefined,
389
+ avgAmount: billingPattern.avg_amount != null
390
+ ? toOneTimeAccrualAmount(billingPattern.avg_amount, currencyCode)
391
+ : undefined,
392
+ lastBillAmount: billingPattern.last_bill_amount != null
393
+ ? toOneTimeAccrualAmount(billingPattern.last_bill_amount, currencyCode)
394
+ : undefined,
395
+ lastBillDate: billingPattern.last_bill_date != null
396
+ ? (0, zeniDayJS_1.date)(billingPattern.last_bill_date)
397
+ : undefined,
398
+ }
399
+ : undefined,
400
+ };
401
+ }
402
+ function toJEOneTimeAccrualAiSuggestion(payload, currencyCode) {
403
+ if (payload == null) {
404
+ return undefined;
405
+ }
406
+ return {
407
+ memo: payload.memo ?? undefined,
408
+ jeDebitAccountName: payload.je_debit_account_name ?? undefined,
409
+ jeCreditAccountName: payload.je_credit_account_name ?? undefined,
410
+ estimatedAmount: payload.estimated_amount != null
411
+ ? toOneTimeAccrualAmount(payload.estimated_amount, currencyCode)
412
+ : undefined,
413
+ };
414
+ }
415
+ function toJEOneTimeAccrual(payload) {
416
+ return {
417
+ accrualId: payload._id,
418
+ vendorId: payload.vendor_id,
419
+ vendorName: payload.vendor_name,
420
+ serviceMonth: payload.service_month,
421
+ accrualStatus: (0, jeSchedulesTypes_1.toOneTimeAccrualStatusCodeType)(payload.status),
422
+ origin: (0, jeSchedulesTypes_1.toOneTimeAccrualOriginType)(payload.origin),
423
+ automationTier: payload.automation_tier != null
424
+ ? (0, jeSchedulesTypes_1.toOneTimeAccrualAutomationTierType)(payload.automation_tier)
425
+ : undefined,
426
+ estimatedAmount: toOneTimeAccrualAmount(payload.estimated_amount, payload.currency),
427
+ memo: payload.memo ?? '',
428
+ profileSnapshot: toJEOneTimeAccrualProfileSnapshot(payload.profile_snapshot, payload.currency),
429
+ aiSuggestion: toJEOneTimeAccrualAiSuggestion(payload.ai_suggestion, payload.currency),
430
+ // Exclusive by contract: a scheduled row reverses on expectedReversalDate and bills never
431
+ // drive it, so the two never need reconciling. Defaulting to on_bill_match matches the
432
+ // create path's default when the field is absent on an older document.
433
+ reversalPolicy: (0, jeSchedulesTypes_1.toOneTimeAccrualReversalPolicyType)(payload.reversal_policy ?? 'on_bill_match'),
434
+ reversalTrigger: (0, jeSchedulesTypes_1.toOneTimeAccrualReversalTriggerType)(payload.reversal_trigger ?? undefined),
435
+ expectedReversalDate: payload.expected_reversal_date != null
436
+ ? (0, zeniDayJS_1.date)(payload.expected_reversal_date)
437
+ : undefined,
438
+ postingDate: payload.posting_date != null ? (0, zeniDayJS_1.date)(payload.posting_date) : undefined,
439
+ actualPostDate: payload.actual_post_date != null
440
+ ? (0, zeniDayJS_1.date)(payload.actual_post_date)
441
+ : undefined,
442
+ actualReversalPostDate: payload.actual_reversal_post_date != null
443
+ ? (0, zeniDayJS_1.date)(payload.actual_reversal_post_date)
444
+ : undefined,
445
+ jeDebitAccountId: payload.je_debit_account_id ?? undefined,
446
+ jeDebitAccountName: payload.je_debit_account_name ?? undefined,
447
+ jeDebitAccountingClassId: payload.je_debit_accounting_class_id ?? undefined,
448
+ jeDebitAccountingClassName: payload.je_debit_accounting_class_name ?? undefined,
449
+ jeCreditAccountId: payload.je_credit_account_id ?? undefined,
450
+ jeCreditAccountName: payload.je_credit_account_name ?? undefined,
451
+ jeCreditAccountingClassId: payload.je_credit_accounting_class_id ?? undefined,
452
+ jeCreditAccountingClassName: payload.je_credit_accounting_class_name ?? undefined,
453
+ transactionId: payload.transaction_id ?? undefined,
454
+ transactionIntegrationId: payload.transaction_integration_id ?? undefined,
455
+ reversalTransactionId: payload.reversal_transaction_id ?? undefined,
456
+ createdBy: toJEOneTimeAccrualCreator(payload.created_by_user),
457
+ };
458
+ }
459
+ // The accrual wire format carries a currency CODE but no symbol, so the symbol has to be derived.
460
+ // Only USD has a known glyph today (the create path is USD-only); anything else falls back to the
461
+ // code, which reads correctly as "EUR 1,200" rather than silently rendering a wrong "$".
462
+ function toOneTimeAccrualAmount(amount, currencyCode) {
463
+ const code = currencyCode ?? USD_CURRENCY_CODE;
464
+ return (0, amount_1.toAmount)(amount, code, code === USD_CURRENCY_CODE ? '$' : code);
465
+ }
466
+ function toJEOneTimeAccrualCreator(payload) {
467
+ if (payload == null) {
468
+ return undefined;
469
+ }
470
+ return {
471
+ userId: payload.user_id,
472
+ email: payload.email ?? undefined,
473
+ firstName: payload.first_name ?? undefined,
474
+ lastName: payload.last_name ?? undefined,
475
+ photo: payload.photo?.original != null
476
+ ? (0, zeniUrl_1.toZeniUrl)(payload.photo.original)
477
+ : undefined,
478
+ };
479
+ }
@@ -1,5 +1,5 @@
1
1
  import { UpdateType } from '../../commonStateTypes/common';
2
- import { JEAccruedScheduledTransactionPayload, JEScheduledTransactionPayload, ScheduledJournalEntryPayload } from './jeSchedulesPayload';
2
+ import { JEAccruedScheduledTransactionPayload, JEOneTimeAccrualPayload, JEScheduledTransactionPayload, ScheduledJournalEntryPayload } from './jeSchedulesPayload';
3
3
  import { JESchedulesState } from './jeSchedulesState';
4
4
  export declare const initialState: JESchedulesState;
5
5
  export declare const updateJESchedules: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[jeSchedulesTransactionsPayload: JEScheduledTransactionPayload[]], {
@@ -22,6 +22,8 @@ export declare const updateJESchedules: import("@reduxjs/toolkit").ActionCreator
22
22
  jeScheduleTransactionKey: `${string}_expense_${string}` | `${string}_check_${string}` | `${string}_invoice_${string}` | `${string}_payment_${string}` | `${string}_credit_memo_${string}` | `${string}_sales_receipt_${string}` | `${string}_delayed_credit_${string}` | `${string}_delayed_charge_${string}` | `${string}_refund_${string}` | `${string}_bill_${string}` | `${string}_bill_payment_${string}` | `${string}_bill_payment_check_${string}` | `${string}_bill_payment_credit_card_${string}` | `${string}_vendor_credit_${string}` | `${string}_credit_card_credit_${string}` | `${string}_transfer_${string}` | `${string}_credit_card_payment_${string}` | `${string}_deposit_${string}` | `${string}_journal_entry_${string}`;
23
23
  }, "jeSchedules/deleteJESchedulesDetails", never, never>, deleteAccruedJESchedulesDetails: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[JEScheduleKey: `${string}_${string}`], {
24
24
  JEScheduleKey: `${string}_${string}`;
25
- }, "jeSchedules/deleteAccruedJESchedulesDetails", never, never>;
25
+ }, "jeSchedules/deleteAccruedJESchedulesDetails", never, never>, clearAllAccruedJESchedules: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"jeSchedules/clearAllAccruedJESchedules">, clearAllJEScheduleTransactions: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"jeSchedules/clearAllJEScheduleTransactions">, updateJEOneTimeAccruals: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[jeOneTimeAccrualsPayload: JEOneTimeAccrualPayload[]], {
26
+ jeOneTimeAccrualsPayload: JEOneTimeAccrualPayload[];
27
+ }, "jeSchedules/updateJEOneTimeAccruals", never, never>;
26
28
  declare const _default: import("redux").Reducer<JESchedulesState>;
27
29
  export default _default;