@firela/api-types 0.0.0-canary.8c68ebbe → 0.0.0-canary.9256c41b

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.
@@ -17,6 +17,8 @@ import type {
17
17
  AccountControllerCloseResponse,
18
18
  AccountControllerReopenData,
19
19
  AccountControllerReopenResponse,
20
+ AccountControllerAddOpeningBalanceData,
21
+ AccountControllerAddOpeningBalanceResponse,
20
22
  AccountStandardsControllerGetTemplatesData,
21
23
  AccountStandardsControllerGetTemplatesResponse,
22
24
  AccountStandardsControllerGetTemplateMetadataData,
@@ -97,6 +99,18 @@ import type {
97
99
  CommodityControllerGetOrCreateResponse,
98
100
  CommodityControllerBulkCreateData,
99
101
  CommodityControllerBulkCreateResponse,
102
+ PriceControllerCreateData,
103
+ PriceControllerCreateResponse,
104
+ PriceControllerFindAllData,
105
+ PriceControllerFindAllResponse,
106
+ PriceControllerFindOneData,
107
+ PriceControllerFindOneResponse,
108
+ PriceControllerUpdateData,
109
+ PriceControllerUpdateResponse,
110
+ PriceControllerDeleteData,
111
+ PriceControllerDeleteResponse,
112
+ PriceControllerBulkCreateData,
113
+ PriceControllerBulkCreateResponse,
100
114
  RecurringRuleControllerCreateData,
101
115
  RecurringRuleControllerCreateResponse,
102
116
  RecurringRuleControllerFindAllData,
@@ -181,6 +195,18 @@ import type {
181
195
  EventControllerUpdateResponse,
182
196
  EventControllerDeleteData,
183
197
  EventControllerDeleteResponse,
198
+ EventControllerGetSliceData,
199
+ EventControllerGetSliceResponse,
200
+ OnboardingControllerBootstrapData,
201
+ OnboardingControllerBootstrapResponse,
202
+ ReconciliationControllerComputeData,
203
+ ReconciliationControllerComputeResponse,
204
+ ReconciliationControllerAssertData,
205
+ ReconciliationControllerAssertResponse,
206
+ ReconciliationControllerPadData,
207
+ ReconciliationControllerPadResponse,
208
+ ReconciliationControllerHistoryData,
209
+ ReconciliationControllerHistoryResponse,
184
210
  ExportControllerExportBeancountResponse,
185
211
  FileImportControllerImportFileData,
186
212
  FileImportControllerImportFileResponse,
@@ -194,22 +220,20 @@ import type {
194
220
  ImporterConfigControllerUpdateConfigResponse,
195
221
  ImporterConfigControllerResetConfigData,
196
222
  ImporterConfigControllerResetConfigResponse,
197
- PlatformControllerFindAllResponse,
198
- PlatformControllerCreateData,
199
- PlatformControllerCreateResponse,
200
- PlatformControllerGetPlatformListResponse,
201
- PlatformControllerMatchPlatformsData,
202
- PlatformControllerMatchPlatformsResponse,
203
- PlatformControllerUpdateData,
204
- PlatformControllerUpdateResponse,
205
- PlatformControllerDeleteData,
206
- PlatformControllerDeleteResponse,
207
223
  ProviderSyncControllerSyncData,
208
224
  ProviderSyncControllerSyncResponse,
209
225
  ProviderSyncControllerGetSupportedProvidersData,
210
226
  ProviderSyncControllerGetSupportedProvidersResponse,
211
227
  ProviderSyncControllerIsProviderSupportedData,
212
228
  ProviderSyncControllerIsProviderSupportedResponse,
229
+ ExternalAccountLinkControllerCreateData,
230
+ ExternalAccountLinkControllerCreateResponse,
231
+ ExternalAccountLinkControllerFindAllData,
232
+ ExternalAccountLinkControllerFindAllResponse,
233
+ ExternalAccountLinkControllerFindOneData,
234
+ ExternalAccountLinkControllerFindOneResponse,
235
+ ExternalAccountLinkControllerRemoveData,
236
+ ExternalAccountLinkControllerRemoveResponse,
213
237
  TelemetryControllerReportTelemetryData,
214
238
  TelemetryControllerReportTelemetryResponse,
215
239
  TelemetryControllerReportCoverageMissData,
@@ -222,28 +246,30 @@ import type {
222
246
  NlpControllerClearSessionResponse,
223
247
  NlpControllerGetSessionData,
224
248
  NlpControllerGetSessionResponse,
249
+ PlatformControllerFindAllResponse,
250
+ PlatformControllerCreateData,
251
+ PlatformControllerCreateResponse,
252
+ PlatformControllerGetPlatformListResponse,
253
+ PlatformControllerMatchPlatformsData,
254
+ PlatformControllerMatchPlatformsResponse,
255
+ PlatformControllerUpdateData,
256
+ PlatformControllerUpdateResponse,
257
+ PlatformControllerDeleteData,
258
+ PlatformControllerDeleteResponse,
225
259
  DashboardControllerGetNetWorthData,
226
260
  DashboardControllerGetNetWorthResponse,
227
261
  DashboardControllerGetAccountsData,
228
262
  DashboardControllerGetAccountsResponse,
229
263
  DashboardControllerGetCashFlowData,
230
264
  DashboardControllerGetCashFlowResponse,
265
+ DashboardControllerGetExpensesData,
266
+ DashboardControllerGetExpensesResponse,
231
267
  HoldingPnlControllerGetHoldingPnlData,
232
268
  HoldingPnlControllerGetHoldingPnlResponse,
233
- PriceControllerCreateData,
234
- PriceControllerCreateResponse,
235
- PriceControllerFindAllData,
236
- PriceControllerFindAllResponse,
237
- PriceControllerFindOneData,
238
- PriceControllerFindOneResponse,
239
- PriceControllerUpdateData,
240
- PriceControllerUpdateResponse,
241
- PriceControllerDeleteData,
242
- PriceControllerDeleteResponse,
243
- PriceControllerBulkCreateData,
244
- PriceControllerBulkCreateResponse,
245
269
  ReportingControllerGetPortfolioTrendsData,
246
270
  ReportingControllerGetPortfolioTrendsResponse,
271
+ ReportingControllerGetCashFlowTrendsData,
272
+ ReportingControllerGetCashFlowTrendsResponse,
247
273
  ReportingControllerGenerateSnapshotData,
248
274
  ReportingControllerGenerateSnapshotResponse,
249
275
  ReportingControllerBackfillSnapshotsData,
@@ -300,7 +326,7 @@ export class BeanAccountsService {
300
326
  * @param data.type Filter by account type
301
327
  * @param data.status Filter by status
302
328
  * @param data.isCustom Filter by custom (user-created) accounts only
303
- * @param data.search Search term for path or i18nKey
329
+ * @param data.search Search term for account path
304
330
  * @param data.limit Maximum number of results
305
331
  * @param data.offset Number of results to skip
306
332
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -462,6 +488,35 @@ export class BeanAccountsService {
462
488
  }
463
489
  });
464
490
  }
491
+
492
+ /**
493
+ * Post an opening-balance transaction
494
+ * Posts a double-entry opening-balance transaction against Equity:Opening-Balances for an existing Assets/Liabilities account. At most one active opening balance per account.
495
+ * @param data The data for the request.
496
+ * @param data.id Account UUID
497
+ * @param data.region Region code for tenant context
498
+ * @param data.requestBody
499
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
500
+ * @throws ApiError
501
+ */
502
+ public static accountControllerAddOpeningBalance(
503
+ data: AccountControllerAddOpeningBalanceData
504
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
505
+ return __request(OpenAPI, {
506
+ method: 'POST',
507
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
508
+ path: {
509
+ id: data.id,
510
+ region: data.region
511
+ },
512
+ body: data.requestBody,
513
+ mediaType: 'application/json',
514
+ errors: {
515
+ 404: 'Account not found',
516
+ 409: 'An opening balance already exists for this account'
517
+ }
518
+ });
519
+ }
465
520
  }
466
521
 
467
522
  export class BeanAccountStandardsService {
@@ -493,7 +548,7 @@ export class BeanAccountStandardsService {
493
548
 
494
549
  /**
495
550
  * Get template metadata for an account path
496
- * Returns extendable status and root type for a template path.
551
+ * Returns root type for a template path.
497
552
  * @param data The data for the request.
498
553
  * @param data.region Region code for tenant context
499
554
  * @param data.path Account path to check
@@ -579,6 +634,7 @@ export class BeanTransactionsService {
579
634
  * @param data.status Filter by transaction status
580
635
  * @param data.search Search in narration and payee fields (max 200 chars)
581
636
  * @param data.accountId Filter by account ID (transactions with postings to this account)
637
+ * @param data.category Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
582
638
  * @returns TransactionListResponseDto Transaction list
583
639
  * @throws ApiError
584
640
  */
@@ -598,7 +654,8 @@ export class BeanTransactionsService {
598
654
  dateTo: data.dateTo,
599
655
  status: data.status,
600
656
  search: data.search,
601
- accountId: data.accountId
657
+ accountId: data.accountId,
658
+ category: data.category
602
659
  },
603
660
  errors: {
604
661
  400: 'Validation failed',
@@ -786,7 +843,7 @@ export class BeanBalancesService {
786
843
  * Query account balance
787
844
  * Calculate account balance at a specific date for a single currency
788
845
  * @param data The data for the request.
789
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
846
+ * @param data.account Account name (e.g., "Assets:Checking")
790
847
  * @param data.region Region code for tenant context
791
848
  * @param data.date Date to calculate balance at (ISO 8601 format)
792
849
  * @param data.currency Currency to query (e.g., "USD", "CNY")
@@ -1507,6 +1564,173 @@ export class BeanCommoditiesService {
1507
1564
  }
1508
1565
  }
1509
1566
 
1567
+ export class BeanPricesService {
1568
+ /**
1569
+ * Create a new price
1570
+ * Creates a new price entry for the authenticated user
1571
+ * @param data The data for the request.
1572
+ * @param data.region Region code for tenant context
1573
+ * @param data.requestBody
1574
+ * @returns PriceResponseDto Price created successfully
1575
+ * @throws ApiError
1576
+ */
1577
+ public static priceControllerCreate(
1578
+ data: PriceControllerCreateData
1579
+ ): CancelablePromise<PriceControllerCreateResponse> {
1580
+ return __request(OpenAPI, {
1581
+ method: 'POST',
1582
+ url: '/api/v1/{region}/bean/prices',
1583
+ path: {
1584
+ region: data.region
1585
+ },
1586
+ body: data.requestBody,
1587
+ mediaType: 'application/json',
1588
+ errors: {
1589
+ 404: 'Currency or quoteCurrency commodity not found',
1590
+ 409: 'Price already exists for this currency pair and date'
1591
+ }
1592
+ });
1593
+ }
1594
+
1595
+ /**
1596
+ * List user prices
1597
+ * Returns all price entries for the authenticated user with optional filtering
1598
+ * @param data The data for the request.
1599
+ * @param data.region Region code for tenant context
1600
+ * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
1601
+ * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
1602
+ * @param data.dateFrom Filter prices from this date (ISO 8601 format)
1603
+ * @param data.dateTo Filter prices to this date (ISO 8601 format)
1604
+ * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
1605
+ * @param data.page Page number for pagination (default: 1)
1606
+ * @param data.limit Number of items per page (default: 20, max: 100)
1607
+ * @returns PriceListResponseDto Prices retrieved successfully
1608
+ * @throws ApiError
1609
+ */
1610
+ public static priceControllerFindAll(
1611
+ data: PriceControllerFindAllData
1612
+ ): CancelablePromise<PriceControllerFindAllResponse> {
1613
+ return __request(OpenAPI, {
1614
+ method: 'GET',
1615
+ url: '/api/v1/{region}/bean/prices',
1616
+ path: {
1617
+ region: data.region
1618
+ },
1619
+ query: {
1620
+ currency: data.currency,
1621
+ quoteCurrency: data.quoteCurrency,
1622
+ dateFrom: data.dateFrom,
1623
+ dateTo: data.dateTo,
1624
+ search: data.search,
1625
+ page: data.page,
1626
+ limit: data.limit
1627
+ }
1628
+ });
1629
+ }
1630
+
1631
+ /**
1632
+ * Get price by ID
1633
+ * Returns a single price entry by its ID
1634
+ * @param data The data for the request.
1635
+ * @param data.id Price ID
1636
+ * @param data.region Region code for tenant context
1637
+ * @returns PriceResponseDto Price retrieved successfully
1638
+ * @throws ApiError
1639
+ */
1640
+ public static priceControllerFindOne(
1641
+ data: PriceControllerFindOneData
1642
+ ): CancelablePromise<PriceControllerFindOneResponse> {
1643
+ return __request(OpenAPI, {
1644
+ method: 'GET',
1645
+ url: '/api/v1/{region}/bean/prices/{id}',
1646
+ path: {
1647
+ id: data.id,
1648
+ region: data.region
1649
+ },
1650
+ errors: {
1651
+ 404: 'Price not found'
1652
+ }
1653
+ });
1654
+ }
1655
+
1656
+ /**
1657
+ * Update a price
1658
+ * Updates an existing price entry
1659
+ * @param data The data for the request.
1660
+ * @param data.id Price ID
1661
+ * @param data.region Region code for tenant context
1662
+ * @param data.requestBody
1663
+ * @returns PriceResponseDto Price updated successfully
1664
+ * @throws ApiError
1665
+ */
1666
+ public static priceControllerUpdate(
1667
+ data: PriceControllerUpdateData
1668
+ ): CancelablePromise<PriceControllerUpdateResponse> {
1669
+ return __request(OpenAPI, {
1670
+ method: 'PUT',
1671
+ url: '/api/v1/{region}/bean/prices/{id}',
1672
+ path: {
1673
+ id: data.id,
1674
+ region: data.region
1675
+ },
1676
+ body: data.requestBody,
1677
+ mediaType: 'application/json',
1678
+ errors: {
1679
+ 404: 'Price not found',
1680
+ 409: 'Updated price conflicts with existing price'
1681
+ }
1682
+ });
1683
+ }
1684
+
1685
+ /**
1686
+ * Delete a price
1687
+ * Deletes a price entry (hard delete)
1688
+ * @param data The data for the request.
1689
+ * @param data.id Price ID
1690
+ * @param data.region Region code for tenant context
1691
+ * @returns void Price deleted successfully
1692
+ * @throws ApiError
1693
+ */
1694
+ public static priceControllerDelete(
1695
+ data: PriceControllerDeleteData
1696
+ ): CancelablePromise<PriceControllerDeleteResponse> {
1697
+ return __request(OpenAPI, {
1698
+ method: 'DELETE',
1699
+ url: '/api/v1/{region}/bean/prices/{id}',
1700
+ path: {
1701
+ id: data.id,
1702
+ region: data.region
1703
+ },
1704
+ errors: {
1705
+ 404: 'Price not found'
1706
+ }
1707
+ });
1708
+ }
1709
+
1710
+ /**
1711
+ * Bulk create prices
1712
+ * Creates multiple price entries at once (skips duplicates)
1713
+ * @param data The data for the request.
1714
+ * @param data.region Region code for tenant context
1715
+ * @param data.requestBody
1716
+ * @returns PriceResponseDto Prices created successfully
1717
+ * @throws ApiError
1718
+ */
1719
+ public static priceControllerBulkCreate(
1720
+ data: PriceControllerBulkCreateData
1721
+ ): CancelablePromise<PriceControllerBulkCreateResponse> {
1722
+ return __request(OpenAPI, {
1723
+ method: 'POST',
1724
+ url: '/api/v1/{region}/bean/prices/bulk',
1725
+ path: {
1726
+ region: data.region
1727
+ },
1728
+ body: data.requestBody,
1729
+ mediaType: 'application/json'
1730
+ });
1731
+ }
1732
+ }
1733
+
1510
1734
  export class RecurringRulesService {
1511
1735
  /**
1512
1736
  * Create a new recurring rule
@@ -2261,7 +2485,7 @@ export class UsersService {
2261
2485
  * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2262
2486
  * @param data The data for the request.
2263
2487
  * @param data.requestBody
2264
- * @returns unknown User created successfully
2488
+ * @returns SignupResponseDto User created successfully
2265
2489
  * @throws ApiError
2266
2490
  */
2267
2491
  public static userControllerSignupUser(
@@ -2611,26 +2835,191 @@ export class LifeEventsService {
2611
2835
  }
2612
2836
  });
2613
2837
  }
2614
- }
2615
2838
 
2616
- export class BeanExportService {
2617
2839
  /**
2618
- * Export Beancount ledger as ZIP
2619
- * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
2620
- * @returns unknown
2840
+ * Slice time-series by a life event (Phase 79)
2841
+ * Returns aggregated time-series for postings matching accountPattern within the half-open date range of the given life event.
2842
+ * @param data The data for the request.
2843
+ * @param data.id Life event ID
2844
+ * @param data.accountPattern
2845
+ * @param data.granularity
2846
+ * @param data.region Region code for tenant context (decorative for life events)
2847
+ * @returns unknown Time-series sliced by the life event range
2621
2848
  * @throws ApiError
2622
2849
  */
2623
- public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
2850
+ public static eventControllerGetSlice(
2851
+ data: EventControllerGetSliceData
2852
+ ): CancelablePromise<EventControllerGetSliceResponse> {
2624
2853
  return __request(OpenAPI, {
2625
2854
  method: 'GET',
2626
- url: '/api/v1/{region}/bean/export/beancount'
2855
+ url: '/api/v1/{region}/bean/events/{id}/slice',
2856
+ path: {
2857
+ id: data.id,
2858
+ region: data.region
2859
+ },
2860
+ query: {
2861
+ accountPattern: data.accountPattern,
2862
+ granularity: data.granularity
2863
+ },
2864
+ errors: {
2865
+ 400: 'accountPattern query param is empty',
2866
+ 404: 'Life event not found'
2867
+ }
2627
2868
  });
2628
2869
  }
2629
2870
  }
2630
2871
 
2631
- export class BeanImportService {
2872
+ export class OnboardingService {
2632
2873
  /**
2633
- * Import a bill file
2874
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
2875
+ * @param data The data for the request.
2876
+ * @param data.region Region code for tenant context
2877
+ * @param data.requestBody
2878
+ * @returns unknown Onboarding bootstrap result.
2879
+ * @throws ApiError
2880
+ */
2881
+ public static onboardingControllerBootstrap(
2882
+ data: OnboardingControllerBootstrapData
2883
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
2884
+ return __request(OpenAPI, {
2885
+ method: 'POST',
2886
+ url: '/api/v1/{region}/bean/onboarding',
2887
+ path: {
2888
+ region: data.region
2889
+ },
2890
+ body: data.requestBody,
2891
+ mediaType: 'application/json',
2892
+ errors: {
2893
+ 422: 'Invalid region/account path/duplicate paths.'
2894
+ }
2895
+ });
2896
+ }
2897
+ }
2898
+
2899
+ export class BalanceReconciliationService {
2900
+ /**
2901
+ * Preview reconciliation (book vs actual)
2902
+ * Computes book balance, diff, Beancount-inferred tolerance, and suggested action without persisting.
2903
+ * @param data The data for the request.
2904
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2905
+ * @param data.requestBody
2906
+ * @returns ReconciliationComputeResultDto Reconciliation preview
2907
+ * @throws ApiError
2908
+ */
2909
+ public static reconciliationControllerCompute(
2910
+ data: ReconciliationControllerComputeData
2911
+ ): CancelablePromise<ReconciliationControllerComputeResponse> {
2912
+ return __request(OpenAPI, {
2913
+ method: 'POST',
2914
+ url: '/api/v1/{region}/bean/reconciliations',
2915
+ path: {
2916
+ region: data.region
2917
+ },
2918
+ body: data.requestBody,
2919
+ mediaType: 'application/json',
2920
+ errors: {
2921
+ 404: 'Account not found'
2922
+ }
2923
+ });
2924
+ }
2925
+
2926
+ /**
2927
+ * Record a balance assertion
2928
+ * Persists the reconciliation as a BeanBalance assertion (amount = actual, diffAmount = book − actual). Re-reconciling the same day/currency upserts.
2929
+ * @param data The data for the request.
2930
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2931
+ * @param data.requestBody
2932
+ * @returns ReconciliationRecordDto Balance assertion recorded
2933
+ * @throws ApiError
2934
+ */
2935
+ public static reconciliationControllerAssert(
2936
+ data: ReconciliationControllerAssertData
2937
+ ): CancelablePromise<ReconciliationControllerAssertResponse> {
2938
+ return __request(OpenAPI, {
2939
+ method: 'POST',
2940
+ url: '/api/v1/{region}/bean/reconciliations/assert',
2941
+ path: {
2942
+ region: data.region
2943
+ },
2944
+ body: data.requestBody,
2945
+ mediaType: 'application/json',
2946
+ errors: {
2947
+ 404: 'Account not found'
2948
+ }
2949
+ });
2950
+ }
2951
+
2952
+ /**
2953
+ * Generate a pad adjusting entry
2954
+ * When book is outside tolerance, synthesizes a Beancount pad transaction (flag P) booking the diff from source_account and persists it. Source defaults to Equity:Opening-Balances.
2955
+ * @param data The data for the request.
2956
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2957
+ * @param data.requestBody
2958
+ * @returns PadResultDto Pad adjusting entry generated
2959
+ * @throws ApiError
2960
+ */
2961
+ public static reconciliationControllerPad(
2962
+ data: ReconciliationControllerPadData
2963
+ ): CancelablePromise<ReconciliationControllerPadResponse> {
2964
+ return __request(OpenAPI, {
2965
+ method: 'POST',
2966
+ url: '/api/v1/{region}/bean/reconciliations/pad',
2967
+ path: {
2968
+ region: data.region
2969
+ },
2970
+ body: data.requestBody,
2971
+ mediaType: 'application/json',
2972
+ errors: {
2973
+ 400: 'Book already within tolerance — no pad needed',
2974
+ 404: 'Account not found'
2975
+ }
2976
+ });
2977
+ }
2978
+
2979
+ /**
2980
+ * List reconciliation history for an account
2981
+ * Returns recorded balance assertions (most recent first). The latest drives the account-detail "Last <date>" badge.
2982
+ * @param data The data for the request.
2983
+ * @param data.accountId BeanAccount id
2984
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2985
+ * @returns ReconciliationRecordDto Reconciliation history
2986
+ * @throws ApiError
2987
+ */
2988
+ public static reconciliationControllerHistory(
2989
+ data: ReconciliationControllerHistoryData
2990
+ ): CancelablePromise<ReconciliationControllerHistoryResponse> {
2991
+ return __request(OpenAPI, {
2992
+ method: 'GET',
2993
+ url: '/api/v1/{region}/bean/accounts/{accountId}/reconciliations',
2994
+ path: {
2995
+ accountId: data.accountId,
2996
+ region: data.region
2997
+ },
2998
+ errors: {
2999
+ 404: 'Account not found'
3000
+ }
3001
+ });
3002
+ }
3003
+ }
3004
+
3005
+ export class BeanExportService {
3006
+ /**
3007
+ * Export Beancount ledger as ZIP
3008
+ * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
3009
+ * @returns unknown
3010
+ * @throws ApiError
3011
+ */
3012
+ public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
3013
+ return __request(OpenAPI, {
3014
+ method: 'GET',
3015
+ url: '/api/v1/{region}/bean/export/beancount'
3016
+ });
3017
+ }
3018
+ }
3019
+
3020
+ export class BeanImportService {
3021
+ /**
3022
+ * Import a bill file
2634
3023
  * Upload and process a bill file (CSV, PDF, OFX, etc.). The system automatically identifies the file type, extracts transactions, validates them, and stores only validated transactions to the database. Maximum file size: 50MB. Only 1 import per user at a time (concurrent imports rejected with 429).
2635
3024
  * @param data The data for the request.
2636
3025
  * @param data.region Region code for tenant context
@@ -2791,121 +3180,6 @@ export class BeanImportService {
2791
3180
  }
2792
3181
  }
2793
3182
 
2794
- export class BeanPlatformsService {
2795
- /**
2796
- * Get all platforms with statistics
2797
- * @returns unknown List of platforms with binding and account counts
2798
- * @throws ApiError
2799
- */
2800
- public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
2801
- return __request(OpenAPI, {
2802
- method: 'GET',
2803
- url: '/api/v1/bean/platforms'
2804
- });
2805
- }
2806
-
2807
- /**
2808
- * Create a new platform
2809
- * @param data The data for the request.
2810
- * @param data.requestBody
2811
- * @returns unknown Platform created successfully
2812
- * @throws ApiError
2813
- */
2814
- public static platformControllerCreate(
2815
- data: PlatformControllerCreateData
2816
- ): CancelablePromise<PlatformControllerCreateResponse> {
2817
- return __request(OpenAPI, {
2818
- method: 'POST',
2819
- url: '/api/v1/bean/platforms',
2820
- body: data.requestBody,
2821
- mediaType: 'application/json',
2822
- errors: {
2823
- 409: 'Platform already exists'
2824
- }
2825
- });
2826
- }
2827
-
2828
- /**
2829
- * Get platform list for current user
2830
- * @returns unknown List of platforms with user binding status
2831
- * @throws ApiError
2832
- */
2833
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2834
- return __request(OpenAPI, {
2835
- method: 'GET',
2836
- url: '/api/v1/bean/platforms/list'
2837
- });
2838
- }
2839
-
2840
- /**
2841
- * Match platforms by name or alias
2842
- * @param data The data for the request.
2843
- * @param data.q Search query — Chinese name, English name, or abbreviation
2844
- * @param data.region Region code for category override lookup
2845
- * @returns unknown List of matching platforms with suggested segment names
2846
- * @throws ApiError
2847
- */
2848
- public static platformControllerMatchPlatforms(
2849
- data: PlatformControllerMatchPlatformsData
2850
- ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
2851
- return __request(OpenAPI, {
2852
- method: 'GET',
2853
- url: '/api/v1/bean/platforms/match',
2854
- query: {
2855
- q: data.q,
2856
- region: data.region
2857
- }
2858
- });
2859
- }
2860
-
2861
- /**
2862
- * Update a platform
2863
- * @param data The data for the request.
2864
- * @param data.id Platform ID
2865
- * @param data.requestBody
2866
- * @returns unknown Platform updated successfully
2867
- * @throws ApiError
2868
- */
2869
- public static platformControllerUpdate(
2870
- data: PlatformControllerUpdateData
2871
- ): CancelablePromise<PlatformControllerUpdateResponse> {
2872
- return __request(OpenAPI, {
2873
- method: 'PUT',
2874
- url: '/api/v1/bean/platforms/{id}',
2875
- path: {
2876
- id: data.id
2877
- },
2878
- body: data.requestBody,
2879
- mediaType: 'application/json',
2880
- errors: {
2881
- 404: 'Platform not found'
2882
- }
2883
- });
2884
- }
2885
-
2886
- /**
2887
- * Delete a platform
2888
- * @param data The data for the request.
2889
- * @param data.id Platform ID
2890
- * @returns void Platform deleted successfully
2891
- * @throws ApiError
2892
- */
2893
- public static platformControllerDelete(
2894
- data: PlatformControllerDeleteData
2895
- ): CancelablePromise<PlatformControllerDeleteResponse> {
2896
- return __request(OpenAPI, {
2897
- method: 'DELETE',
2898
- url: '/api/v1/bean/platforms/{id}',
2899
- path: {
2900
- id: data.id
2901
- },
2902
- errors: {
2903
- 404: 'Platform not found'
2904
- }
2905
- });
2906
- }
2907
- }
2908
-
2909
3183
  export class ProviderSyncService {
2910
3184
  /**
2911
3185
  * Sync transactions from financial data provider
@@ -3006,84 +3280,179 @@ export class ProviderSyncService {
3006
3280
  }
3007
3281
  }
3008
3282
 
3009
- export class ImportTelemetryService {
3283
+ export class ExternalAccountLinksService {
3010
3284
  /**
3011
- * Receive anonymous parser failure telemetry
3285
+ * Create an external account → BeanAccount mapping (ADR-0113)
3012
3286
  * @param data The data for the request.
3013
3287
  * @param data.region Region code for tenant context
3014
3288
  * @param data.requestBody
3015
- * @returns unknown Telemetry report received
3289
+ * @returns ExternalAccountLinkResponseDto Link created.
3016
3290
  * @throws ApiError
3017
3291
  */
3018
- public static telemetryControllerReportTelemetry(
3019
- data: TelemetryControllerReportTelemetryData
3020
- ): CancelablePromise<TelemetryControllerReportTelemetryResponse> {
3292
+ public static externalAccountLinkControllerCreate(
3293
+ data: ExternalAccountLinkControllerCreateData
3294
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
3021
3295
  return __request(OpenAPI, {
3022
3296
  method: 'POST',
3023
- url: '/api/v1/{region}/bean/import/parser-telemetry',
3297
+ url: '/api/v1/{region}/bean/external-account-links',
3024
3298
  path: {
3025
3299
  region: data.region
3026
3300
  },
3027
3301
  body: data.requestBody,
3028
3302
  mediaType: 'application/json',
3029
3303
  errors: {
3030
- 401: 'Unauthorized'
3304
+ 422: 'beanAccountId not owned, or an active link already exists.'
3031
3305
  }
3032
3306
  });
3033
3307
  }
3034
3308
 
3035
3309
  /**
3036
- * Receive anonymous zero-hit coverage miss report
3310
+ * List the user's active external account links
3037
3311
  * @param data The data for the request.
3312
+ * @param data.provider
3038
3313
  * @param data.region Region code for tenant context
3039
- * @param data.requestBody
3040
- * @returns unknown Coverage miss report received
3314
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
3041
3315
  * @throws ApiError
3042
3316
  */
3043
- public static telemetryControllerReportCoverageMiss(
3044
- data: TelemetryControllerReportCoverageMissData
3045
- ): CancelablePromise<TelemetryControllerReportCoverageMissResponse> {
3317
+ public static externalAccountLinkControllerFindAll(
3318
+ data: ExternalAccountLinkControllerFindAllData
3319
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
3046
3320
  return __request(OpenAPI, {
3047
- method: 'POST',
3048
- url: '/api/v1/{region}/bean/import/parser-coverage-miss',
3321
+ method: 'GET',
3322
+ url: '/api/v1/{region}/bean/external-account-links',
3049
3323
  path: {
3050
3324
  region: data.region
3051
3325
  },
3052
- body: data.requestBody,
3053
- mediaType: 'application/json',
3054
- errors: {
3055
- 401: 'Unauthorized'
3326
+ query: {
3327
+ provider: data.provider
3056
3328
  }
3057
3329
  });
3058
3330
  }
3059
3331
 
3060
3332
  /**
3061
- * Coverage metrics (uncovered format aggregation)
3333
+ * Get a single external account link
3062
3334
  * @param data The data for the request.
3335
+ * @param data.id
3063
3336
  * @param data.region Region code for tenant context
3064
- * @param data.topN Top-N uncovered formats (default 10)
3065
- * @returns unknown Coverage metrics
3337
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
3066
3338
  * @throws ApiError
3067
3339
  */
3068
- public static telemetryControllerGetCoverageMetrics(
3069
- data: TelemetryControllerGetCoverageMetricsData
3070
- ): CancelablePromise<TelemetryControllerGetCoverageMetricsResponse> {
3340
+ public static externalAccountLinkControllerFindOne(
3341
+ data: ExternalAccountLinkControllerFindOneData
3342
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
3071
3343
  return __request(OpenAPI, {
3072
3344
  method: 'GET',
3073
- url: '/api/v1/{region}/bean/import/parser-coverage-metrics',
3345
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3074
3346
  path: {
3347
+ id: data.id,
3075
3348
  region: data.region
3076
3349
  },
3077
- query: {
3078
- topN: data.topN
3350
+ errors: {
3351
+ 422: 'Link not found or not owned by the user.'
3079
3352
  }
3080
3353
  });
3081
3354
  }
3082
- }
3083
3355
 
3084
- export class BeanNlpService {
3085
3356
  /**
3086
- * Process natural language input
3357
+ * Soft-delete (disconnect) an external account link
3358
+ * @param data The data for the request.
3359
+ * @param data.id
3360
+ * @param data.region Region code for tenant context
3361
+ * @returns void Link soft-deleted; historical transactions are unaffected.
3362
+ * @throws ApiError
3363
+ */
3364
+ public static externalAccountLinkControllerRemove(
3365
+ data: ExternalAccountLinkControllerRemoveData
3366
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
3367
+ return __request(OpenAPI, {
3368
+ method: 'DELETE',
3369
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3370
+ path: {
3371
+ id: data.id,
3372
+ region: data.region
3373
+ }
3374
+ });
3375
+ }
3376
+ }
3377
+
3378
+ export class ImportTelemetryService {
3379
+ /**
3380
+ * Receive anonymous parser failure telemetry
3381
+ * @param data The data for the request.
3382
+ * @param data.region Region code for tenant context
3383
+ * @param data.requestBody
3384
+ * @returns unknown Telemetry report received
3385
+ * @throws ApiError
3386
+ */
3387
+ public static telemetryControllerReportTelemetry(
3388
+ data: TelemetryControllerReportTelemetryData
3389
+ ): CancelablePromise<TelemetryControllerReportTelemetryResponse> {
3390
+ return __request(OpenAPI, {
3391
+ method: 'POST',
3392
+ url: '/api/v1/{region}/bean/import/parser-telemetry',
3393
+ path: {
3394
+ region: data.region
3395
+ },
3396
+ body: data.requestBody,
3397
+ mediaType: 'application/json',
3398
+ errors: {
3399
+ 401: 'Unauthorized'
3400
+ }
3401
+ });
3402
+ }
3403
+
3404
+ /**
3405
+ * Receive anonymous zero-hit coverage miss report
3406
+ * @param data The data for the request.
3407
+ * @param data.region Region code for tenant context
3408
+ * @param data.requestBody
3409
+ * @returns unknown Coverage miss report received
3410
+ * @throws ApiError
3411
+ */
3412
+ public static telemetryControllerReportCoverageMiss(
3413
+ data: TelemetryControllerReportCoverageMissData
3414
+ ): CancelablePromise<TelemetryControllerReportCoverageMissResponse> {
3415
+ return __request(OpenAPI, {
3416
+ method: 'POST',
3417
+ url: '/api/v1/{region}/bean/import/parser-coverage-miss',
3418
+ path: {
3419
+ region: data.region
3420
+ },
3421
+ body: data.requestBody,
3422
+ mediaType: 'application/json',
3423
+ errors: {
3424
+ 401: 'Unauthorized'
3425
+ }
3426
+ });
3427
+ }
3428
+
3429
+ /**
3430
+ * Coverage metrics (uncovered format aggregation)
3431
+ * @param data The data for the request.
3432
+ * @param data.region Region code for tenant context
3433
+ * @param data.topN Top-N uncovered formats (default 10)
3434
+ * @returns unknown Coverage metrics
3435
+ * @throws ApiError
3436
+ */
3437
+ public static telemetryControllerGetCoverageMetrics(
3438
+ data: TelemetryControllerGetCoverageMetricsData
3439
+ ): CancelablePromise<TelemetryControllerGetCoverageMetricsResponse> {
3440
+ return __request(OpenAPI, {
3441
+ method: 'GET',
3442
+ url: '/api/v1/{region}/bean/import/parser-coverage-metrics',
3443
+ path: {
3444
+ region: data.region
3445
+ },
3446
+ query: {
3447
+ topN: data.topN
3448
+ }
3449
+ });
3450
+ }
3451
+ }
3452
+
3453
+ export class BeanNlpService {
3454
+ /**
3455
+ * Process natural language input
3087
3456
  * Parse natural language text (Chinese/English) describing a transaction. Supports multi-turn dialogue for collecting missing information. When confidence < 0.75, returns "confirm" action requiring user verification. User can reply with confirmation words (确认/yes/ok) or provide corrections. Examples: "yesterday Starbucks spent 35 yuan", "today lunch 28 yuan", "spent $50 at Walmart"
3088
3457
  * @param data The data for the request.
3089
3458
  * @param data.region Region code for tenant context
@@ -3164,291 +3533,271 @@ export class BeanNlpService {
3164
3533
  }
3165
3534
  }
3166
3535
 
3167
- export class DashboardService {
3536
+ export class BeanPlatformsService {
3168
3537
  /**
3169
- * Get net worth overview
3170
- * Returns total net worth with breakdown of assets and liabilities
3171
- * @param data The data for the request.
3172
- * @param data.region Region code for tenant context
3173
- * @param data.date Date for balance calculation (ISO 8601 format)
3174
- * @returns NetWorthResponseDto Net worth retrieved successfully
3538
+ * Get all platforms with statistics
3539
+ * @returns unknown List of platforms with binding and account counts
3175
3540
  * @throws ApiError
3176
3541
  */
3177
- public static dashboardControllerGetNetWorth(
3178
- data: DashboardControllerGetNetWorthData
3179
- ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3542
+ public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3180
3543
  return __request(OpenAPI, {
3181
3544
  method: 'GET',
3182
- url: '/api/v1/{region}/dashboard/net-worth',
3183
- path: {
3184
- region: data.region
3185
- },
3186
- query: {
3187
- date: data.date
3188
- },
3189
- errors: {
3190
- 401: 'User not authenticated'
3191
- }
3545
+ url: '/api/v1/bean/platforms'
3192
3546
  });
3193
3547
  }
3194
3548
 
3195
3549
  /**
3196
- * Get accounts grouped by platform
3197
- * Returns accounts with balances grouped by financial platform
3550
+ * Create a new platform
3198
3551
  * @param data The data for the request.
3199
- * @param data.region Region code for tenant context
3200
- * @param data.groupBy Grouping strategy
3201
- * @param data.date Date for balance calculation (ISO 8601 format)
3202
- * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3203
- * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3552
+ * @param data.requestBody
3553
+ * @returns unknown Platform created successfully
3204
3554
  * @throws ApiError
3205
3555
  */
3206
- public static dashboardControllerGetAccounts(
3207
- data: DashboardControllerGetAccountsData
3208
- ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3556
+ public static platformControllerCreate(
3557
+ data: PlatformControllerCreateData
3558
+ ): CancelablePromise<PlatformControllerCreateResponse> {
3209
3559
  return __request(OpenAPI, {
3210
- method: 'GET',
3211
- url: '/api/v1/{region}/dashboard/accounts',
3212
- path: {
3213
- region: data.region
3214
- },
3215
- query: {
3216
- groupBy: data.groupBy,
3217
- date: data.date,
3218
- accountId: data.accountId
3219
- },
3560
+ method: 'POST',
3561
+ url: '/api/v1/bean/platforms',
3562
+ body: data.requestBody,
3563
+ mediaType: 'application/json',
3220
3564
  errors: {
3221
- 401: 'User not authenticated'
3565
+ 409: 'Platform already exists'
3222
3566
  }
3223
3567
  });
3224
3568
  }
3225
3569
 
3226
3570
  /**
3227
- * Get cash flow summary
3228
- * Returns income, expenses, and savings for a monthly period
3571
+ * Get platform list for current user
3572
+ * @returns PlatformListItemDto List of platforms with user binding status
3573
+ * @throws ApiError
3574
+ */
3575
+ public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3576
+ return __request(OpenAPI, {
3577
+ method: 'GET',
3578
+ url: '/api/v1/bean/platforms/list'
3579
+ });
3580
+ }
3581
+
3582
+ /**
3583
+ * Match platforms by name or alias
3229
3584
  * @param data The data for the request.
3230
- * @param data.period Period in YYYY-MM format
3231
- * @param data.region Region code for tenant context
3232
- * @returns CashFlowResponseDto Cash flow retrieved successfully
3585
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3586
+ * @param data.region Region code for category override lookup
3587
+ * @returns PlatformMatchResponseDto Matching platforms with overall match type and truncation flag
3233
3588
  * @throws ApiError
3234
3589
  */
3235
- public static dashboardControllerGetCashFlow(
3236
- data: DashboardControllerGetCashFlowData
3237
- ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3590
+ public static platformControllerMatchPlatforms(
3591
+ data: PlatformControllerMatchPlatformsData
3592
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3238
3593
  return __request(OpenAPI, {
3239
3594
  method: 'GET',
3240
- url: '/api/v1/{region}/dashboard/cash-flow',
3241
- path: {
3242
- region: data.region
3243
- },
3595
+ url: '/api/v1/bean/platforms/match',
3244
3596
  query: {
3245
- period: data.period
3246
- },
3247
- errors: {
3248
- 400: 'Invalid period format',
3249
- 401: 'User not authenticated'
3597
+ q: data.q,
3598
+ region: data.region
3250
3599
  }
3251
3600
  });
3252
3601
  }
3253
- }
3254
3602
 
3255
- export class InvestmentService {
3256
3603
  /**
3257
- * Get per-holding unrealized + realized P&L
3258
- * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3604
+ * Update a platform
3259
3605
  * @param data The data for the request.
3260
- * @param data.region Region code for tenant context
3261
- * @param data.asOf As-of date (ISO 8601), defaults to today
3262
- * @param data.accountId Scope to a single account
3263
- * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
3264
- * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3606
+ * @param data.id Platform ID
3607
+ * @param data.requestBody
3608
+ * @returns unknown Platform updated successfully
3265
3609
  * @throws ApiError
3266
3610
  */
3267
- public static holdingPnlControllerGetHoldingPnl(
3268
- data: HoldingPnlControllerGetHoldingPnlData
3269
- ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3611
+ public static platformControllerUpdate(
3612
+ data: PlatformControllerUpdateData
3613
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
3270
3614
  return __request(OpenAPI, {
3271
- method: 'GET',
3272
- url: '/api/v1/{region}/investment/holdings/pnl',
3615
+ method: 'PUT',
3616
+ url: '/api/v1/bean/platforms/{id}',
3273
3617
  path: {
3274
- region: data.region
3275
- },
3276
- query: {
3277
- asOf: data.asOf,
3278
- accountId: data.accountId,
3279
- method: data.method
3618
+ id: data.id
3280
3619
  },
3620
+ body: data.requestBody,
3621
+ mediaType: 'application/json',
3281
3622
  errors: {
3282
- 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
3283
- 401: 'User not authenticated'
3623
+ 404: 'Platform not found'
3284
3624
  }
3285
3625
  });
3286
3626
  }
3287
- }
3288
3627
 
3289
- export class BeanPricesService {
3290
3628
  /**
3291
- * Create a new price
3292
- * Creates a new price entry for the authenticated user
3629
+ * Delete a platform
3293
3630
  * @param data The data for the request.
3294
- * @param data.region Region code for tenant context
3295
- * @param data.requestBody
3296
- * @returns PriceResponseDto Price created successfully
3631
+ * @param data.id Platform ID
3632
+ * @returns void Platform deleted successfully
3297
3633
  * @throws ApiError
3298
3634
  */
3299
- public static priceControllerCreate(
3300
- data: PriceControllerCreateData
3301
- ): CancelablePromise<PriceControllerCreateResponse> {
3635
+ public static platformControllerDelete(
3636
+ data: PlatformControllerDeleteData
3637
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
3302
3638
  return __request(OpenAPI, {
3303
- method: 'POST',
3304
- url: '/api/v1/{region}/bean/prices',
3639
+ method: 'DELETE',
3640
+ url: '/api/v1/bean/platforms/{id}',
3305
3641
  path: {
3306
- region: data.region
3642
+ id: data.id
3307
3643
  },
3308
- body: data.requestBody,
3309
- mediaType: 'application/json',
3310
3644
  errors: {
3311
- 404: 'Currency or quoteCurrency commodity not found',
3312
- 409: 'Price already exists for this currency pair and date'
3645
+ 404: 'Platform not found'
3313
3646
  }
3314
3647
  });
3315
3648
  }
3649
+ }
3316
3650
 
3651
+ export class DashboardService {
3317
3652
  /**
3318
- * List user prices
3319
- * Returns all price entries for the authenticated user with optional filtering
3653
+ * Get net worth overview
3654
+ * Returns total net worth with breakdown of assets and liabilities
3320
3655
  * @param data The data for the request.
3321
3656
  * @param data.region Region code for tenant context
3322
- * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
3323
- * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
3324
- * @param data.dateFrom Filter prices from this date (ISO 8601 format)
3325
- * @param data.dateTo Filter prices to this date (ISO 8601 format)
3326
- * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
3327
- * @param data.page Page number for pagination (default: 1)
3328
- * @param data.limit Number of items per page (default: 20, max: 100)
3329
- * @returns PriceListResponseDto Prices retrieved successfully
3657
+ * @param data.date Date for balance calculation (ISO 8601 format)
3658
+ * @returns NetWorthResponseDto Net worth retrieved successfully
3330
3659
  * @throws ApiError
3331
3660
  */
3332
- public static priceControllerFindAll(
3333
- data: PriceControllerFindAllData
3334
- ): CancelablePromise<PriceControllerFindAllResponse> {
3661
+ public static dashboardControllerGetNetWorth(
3662
+ data: DashboardControllerGetNetWorthData
3663
+ ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3335
3664
  return __request(OpenAPI, {
3336
3665
  method: 'GET',
3337
- url: '/api/v1/{region}/bean/prices',
3666
+ url: '/api/v1/{region}/dashboard/net-worth',
3338
3667
  path: {
3339
3668
  region: data.region
3340
3669
  },
3341
3670
  query: {
3342
- currency: data.currency,
3343
- quoteCurrency: data.quoteCurrency,
3344
- dateFrom: data.dateFrom,
3345
- dateTo: data.dateTo,
3346
- search: data.search,
3347
- page: data.page,
3348
- limit: data.limit
3671
+ date: data.date
3672
+ },
3673
+ errors: {
3674
+ 401: 'User not authenticated'
3349
3675
  }
3350
3676
  });
3351
3677
  }
3352
3678
 
3353
3679
  /**
3354
- * Get price by ID
3355
- * Returns a single price entry by its ID
3680
+ * Get accounts grouped by platform
3681
+ * Returns accounts with balances grouped by financial platform
3356
3682
  * @param data The data for the request.
3357
- * @param data.id Price ID
3358
3683
  * @param data.region Region code for tenant context
3359
- * @returns PriceResponseDto Price retrieved successfully
3684
+ * @param data.groupBy Grouping strategy
3685
+ * @param data.date Date for balance calculation (ISO 8601 format)
3686
+ * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3687
+ * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3360
3688
  * @throws ApiError
3361
3689
  */
3362
- public static priceControllerFindOne(
3363
- data: PriceControllerFindOneData
3364
- ): CancelablePromise<PriceControllerFindOneResponse> {
3690
+ public static dashboardControllerGetAccounts(
3691
+ data: DashboardControllerGetAccountsData
3692
+ ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3365
3693
  return __request(OpenAPI, {
3366
3694
  method: 'GET',
3367
- url: '/api/v1/{region}/bean/prices/{id}',
3695
+ url: '/api/v1/{region}/dashboard/accounts',
3368
3696
  path: {
3369
- id: data.id,
3370
3697
  region: data.region
3371
3698
  },
3699
+ query: {
3700
+ groupBy: data.groupBy,
3701
+ date: data.date,
3702
+ accountId: data.accountId
3703
+ },
3372
3704
  errors: {
3373
- 404: 'Price not found'
3705
+ 401: 'User not authenticated'
3374
3706
  }
3375
3707
  });
3376
3708
  }
3377
3709
 
3378
3710
  /**
3379
- * Update a price
3380
- * Updates an existing price entry
3711
+ * Get cash flow summary
3712
+ * Returns income, expenses, and savings for a monthly period
3381
3713
  * @param data The data for the request.
3382
- * @param data.id Price ID
3714
+ * @param data.period Period in YYYY-MM format
3383
3715
  * @param data.region Region code for tenant context
3384
- * @param data.requestBody
3385
- * @returns PriceResponseDto Price updated successfully
3716
+ * @returns CashFlowResponseDto Cash flow retrieved successfully
3386
3717
  * @throws ApiError
3387
3718
  */
3388
- public static priceControllerUpdate(
3389
- data: PriceControllerUpdateData
3390
- ): CancelablePromise<PriceControllerUpdateResponse> {
3719
+ public static dashboardControllerGetCashFlow(
3720
+ data: DashboardControllerGetCashFlowData
3721
+ ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3391
3722
  return __request(OpenAPI, {
3392
- method: 'PUT',
3393
- url: '/api/v1/{region}/bean/prices/{id}',
3723
+ method: 'GET',
3724
+ url: '/api/v1/{region}/dashboard/cash-flow',
3394
3725
  path: {
3395
- id: data.id,
3396
3726
  region: data.region
3397
3727
  },
3398
- body: data.requestBody,
3399
- mediaType: 'application/json',
3728
+ query: {
3729
+ period: data.period
3730
+ },
3400
3731
  errors: {
3401
- 404: 'Price not found',
3402
- 409: 'Updated price conflicts with existing price'
3732
+ 400: 'Invalid period format',
3733
+ 401: 'User not authenticated'
3403
3734
  }
3404
3735
  });
3405
3736
  }
3406
3737
 
3407
3738
  /**
3408
- * Delete a price
3409
- * Deletes a price entry (hard delete)
3739
+ * Get expenses/income grouped by functional category
3740
+ * Returns amounts pre-aggregated by functional category (account-path Group segment) with server-side multi-currency conversion. flow=expense (default) aggregates ^Expenses: accounts; flow=income aggregates ^Income: accounts (issue #518)
3410
3741
  * @param data The data for the request.
3411
- * @param data.id Price ID
3412
3742
  * @param data.region Region code for tenant context
3413
- * @returns void Price deleted successfully
3743
+ * @param data.groupBy Grouping strategy
3744
+ * @param data.period Time window (1m = current calendar month)
3745
+ * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
3746
+ * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3414
3747
  * @throws ApiError
3415
3748
  */
3416
- public static priceControllerDelete(
3417
- data: PriceControllerDeleteData
3418
- ): CancelablePromise<PriceControllerDeleteResponse> {
3749
+ public static dashboardControllerGetExpenses(
3750
+ data: DashboardControllerGetExpensesData
3751
+ ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3419
3752
  return __request(OpenAPI, {
3420
- method: 'DELETE',
3421
- url: '/api/v1/{region}/bean/prices/{id}',
3753
+ method: 'GET',
3754
+ url: '/api/v1/{region}/dashboard/expenses',
3422
3755
  path: {
3423
- id: data.id,
3424
3756
  region: data.region
3425
3757
  },
3758
+ query: {
3759
+ groupBy: data.groupBy,
3760
+ period: data.period,
3761
+ flow: data.flow
3762
+ },
3426
3763
  errors: {
3427
- 404: 'Price not found'
3764
+ 400: 'Invalid groupBy or period',
3765
+ 401: 'User not authenticated'
3428
3766
  }
3429
3767
  });
3430
3768
  }
3769
+ }
3431
3770
 
3771
+ export class InvestmentService {
3432
3772
  /**
3433
- * Bulk create prices
3434
- * Creates multiple price entries at once (skips duplicates)
3773
+ * Get per-holding unrealized + realized P&L
3774
+ * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3435
3775
  * @param data The data for the request.
3436
3776
  * @param data.region Region code for tenant context
3437
- * @param data.requestBody
3438
- * @returns PriceResponseDto Prices created successfully
3777
+ * @param data.asOf As-of date (ISO 8601), defaults to today
3778
+ * @param data.accountId Scope to a single account
3779
+ * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
3780
+ * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3439
3781
  * @throws ApiError
3440
3782
  */
3441
- public static priceControllerBulkCreate(
3442
- data: PriceControllerBulkCreateData
3443
- ): CancelablePromise<PriceControllerBulkCreateResponse> {
3783
+ public static holdingPnlControllerGetHoldingPnl(
3784
+ data: HoldingPnlControllerGetHoldingPnlData
3785
+ ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3444
3786
  return __request(OpenAPI, {
3445
- method: 'POST',
3446
- url: '/api/v1/{region}/bean/prices/bulk',
3787
+ method: 'GET',
3788
+ url: '/api/v1/{region}/investment/holdings/pnl',
3447
3789
  path: {
3448
3790
  region: data.region
3449
3791
  },
3450
- body: data.requestBody,
3451
- mediaType: 'application/json'
3792
+ query: {
3793
+ asOf: data.asOf,
3794
+ accountId: data.accountId,
3795
+ method: data.method
3796
+ },
3797
+ errors: {
3798
+ 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
3799
+ 401: 'User not authenticated'
3800
+ }
3452
3801
  });
3453
3802
  }
3454
3803
  }
@@ -3494,6 +3843,42 @@ export class ReportingService {
3494
3843
  });
3495
3844
  }
3496
3845
 
3846
+ /**
3847
+ * Get cash-flow trends
3848
+ *
3849
+ * Monthly income / expense / netSavings over a fixed N-month window
3850
+ * (current month + N−1 prior). Missing months are zero-filled (flow metric).
3851
+ *
3852
+ * **Parameters:**
3853
+ * - `period`: 1m | 3m | 6m | 1y (default 6m)
3854
+ * - `granularity`: accepted for API symmetry; v1 returns month buckets
3855
+ *
3856
+ * @param data The data for the request.
3857
+ * @param data.region Region code for tenant context
3858
+ * @param data.period Time period
3859
+ * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
3860
+ * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
3861
+ * @throws ApiError
3862
+ */
3863
+ public static reportingControllerGetCashFlowTrends(
3864
+ data: ReportingControllerGetCashFlowTrendsData
3865
+ ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
3866
+ return __request(OpenAPI, {
3867
+ method: 'GET',
3868
+ url: '/api/v1/{region}/reporting/cash-flow/trends',
3869
+ path: {
3870
+ region: data.region
3871
+ },
3872
+ query: {
3873
+ period: data.period,
3874
+ granularity: data.granularity
3875
+ },
3876
+ errors: {
3877
+ 401: 'User not authenticated'
3878
+ }
3879
+ });
3880
+ }
3881
+
3497
3882
  /**
3498
3883
  * Generate portfolio snapshot
3499
3884
  *
@@ -3597,7 +3982,7 @@ export class AuthService {
3597
3982
  * Anonymous login with access token
3598
3983
  * @param data The data for the request.
3599
3984
  * @param data.requestBody
3600
- * @returns unknown Login successful
3985
+ * @returns AnonymousLoginResponseDto Login successful
3601
3986
  * @throws ApiError
3602
3987
  */
3603
3988
  public static authControllerAccessTokenLogin(