@firela/api-types 0.0.0-canary.c5520a90 → 0.0.0-canary.c7e4ab1

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,
@@ -29,6 +31,8 @@ import type {
29
31
  TransactionControllerListResponse,
30
32
  TransactionControllerCreateBatchData,
31
33
  TransactionControllerCreateBatchResponse,
34
+ TransactionControllerBatchVoidData,
35
+ TransactionControllerBatchVoidResponse,
32
36
  TransactionControllerCorrectData,
33
37
  TransactionControllerCorrectResponse,
34
38
  TransactionControllerSuggestTagsData,
@@ -55,6 +59,48 @@ import type {
55
59
  ReviewControllerUndoResponse,
56
60
  ReviewControllerBatchResolveData,
57
61
  ReviewControllerBatchResolveResponse,
62
+ TransactionRuleControllerCreateData,
63
+ TransactionRuleControllerCreateResponse,
64
+ TransactionRuleControllerListData,
65
+ TransactionRuleControllerListResponse,
66
+ TransactionRuleControllerValidateData,
67
+ TransactionRuleControllerValidateResponse,
68
+ TransactionRuleControllerBulkCreateData,
69
+ TransactionRuleControllerBulkCreateResponse,
70
+ TransactionRuleControllerExportData,
71
+ TransactionRuleControllerExportResponse,
72
+ TransactionRuleControllerGetStatisticsData,
73
+ TransactionRuleControllerGetStatisticsResponse,
74
+ TransactionRuleControllerGetDetailData,
75
+ TransactionRuleControllerGetDetailResponse,
76
+ TransactionRuleControllerUpdateData,
77
+ TransactionRuleControllerUpdateResponse,
78
+ TransactionRuleControllerDeleteData,
79
+ TransactionRuleControllerDeleteResponse,
80
+ TransactionRuleControllerTestData,
81
+ TransactionRuleControllerTestResponse,
82
+ UserControllerDeleteOwnUserData,
83
+ UserControllerDeleteOwnUserResponse,
84
+ UserControllerGetUserData,
85
+ UserControllerGetUserResponse,
86
+ UserControllerSignupUserData,
87
+ UserControllerSignupUserResponse,
88
+ UserControllerDeleteUserData,
89
+ UserControllerDeleteUserResponse,
90
+ UserControllerGetUserInfoData,
91
+ UserControllerGetUserInfoResponse,
92
+ UserControllerUpdateUserSettingData,
93
+ UserControllerUpdateUserSettingResponse,
94
+ UserControllerGetAllUserSettingsByPageData,
95
+ UserControllerGetAllUserSettingsByPageResponse,
96
+ UserControllerGetAssetLiabilitySummaryResponse,
97
+ PropertyControllerGetAllResponse,
98
+ PropertyControllerGetByKeyData,
99
+ PropertyControllerGetByKeyResponse,
100
+ PropertyControllerUpdateData,
101
+ PropertyControllerUpdateResponse,
102
+ PropertyControllerDeleteData,
103
+ PropertyControllerDeleteResponse,
58
104
  PayeeControllerCreateData,
59
105
  PayeeControllerCreateResponse,
60
106
  PayeeControllerFindAllData,
@@ -83,6 +129,7 @@ import type {
83
129
  PayeeProfileAdminControllerVerifyResponse,
84
130
  PayeeProfileAdminControllerUnverifyData,
85
131
  PayeeProfileAdminControllerUnverifyResponse,
132
+ PayeeProfileControllerListActiveResponse,
86
133
  CommodityControllerCreateData,
87
134
  CommodityControllerCreateResponse,
88
135
  CommodityControllerFindAllData,
@@ -97,6 +144,26 @@ import type {
97
144
  CommodityControllerGetOrCreateResponse,
98
145
  CommodityControllerBulkCreateData,
99
146
  CommodityControllerBulkCreateResponse,
147
+ ReportingControllerGetPortfolioTrendsData,
148
+ ReportingControllerGetPortfolioTrendsResponse,
149
+ ReportingControllerGetCashFlowTrendsData,
150
+ ReportingControllerGetCashFlowTrendsResponse,
151
+ ReportingControllerGenerateSnapshotData,
152
+ ReportingControllerGenerateSnapshotResponse,
153
+ ReportingControllerBackfillSnapshotsData,
154
+ ReportingControllerBackfillSnapshotsResponse,
155
+ PriceControllerCreateData,
156
+ PriceControllerCreateResponse,
157
+ PriceControllerFindAllData,
158
+ PriceControllerFindAllResponse,
159
+ PriceControllerFindOneData,
160
+ PriceControllerFindOneResponse,
161
+ PriceControllerUpdateData,
162
+ PriceControllerUpdateResponse,
163
+ PriceControllerDeleteData,
164
+ PriceControllerDeleteResponse,
165
+ PriceControllerBulkCreateData,
166
+ PriceControllerBulkCreateResponse,
100
167
  RecurringRuleControllerCreateData,
101
168
  RecurringRuleControllerCreateResponse,
102
169
  RecurringRuleControllerFindAllData,
@@ -129,48 +196,8 @@ import type {
129
196
  ExpectedTransactionControllerEnterNowResponse,
130
197
  ForecastControllerGetForecastData,
131
198
  ForecastControllerGetForecastResponse,
132
- TransactionRuleControllerCreateData,
133
- TransactionRuleControllerCreateResponse,
134
- TransactionRuleControllerListData,
135
- TransactionRuleControllerListResponse,
136
- TransactionRuleControllerValidateData,
137
- TransactionRuleControllerValidateResponse,
138
- TransactionRuleControllerBulkCreateData,
139
- TransactionRuleControllerBulkCreateResponse,
140
- TransactionRuleControllerExportData,
141
- TransactionRuleControllerExportResponse,
142
- TransactionRuleControllerGetStatisticsData,
143
- TransactionRuleControllerGetStatisticsResponse,
144
- TransactionRuleControllerGetDetailData,
145
- TransactionRuleControllerGetDetailResponse,
146
- TransactionRuleControllerUpdateData,
147
- TransactionRuleControllerUpdateResponse,
148
- TransactionRuleControllerDeleteData,
149
- TransactionRuleControllerDeleteResponse,
150
- TransactionRuleControllerTestData,
151
- TransactionRuleControllerTestResponse,
152
- UserControllerDeleteOwnUserData,
153
- UserControllerDeleteOwnUserResponse,
154
- UserControllerGetUserData,
155
- UserControllerGetUserResponse,
156
- UserControllerSignupUserData,
157
- UserControllerSignupUserResponse,
158
- UserControllerDeleteUserData,
159
- UserControllerDeleteUserResponse,
160
- UserControllerGetUserInfoData,
161
- UserControllerGetUserInfoResponse,
162
- UserControllerUpdateUserSettingData,
163
- UserControllerUpdateUserSettingResponse,
164
- UserControllerGetAllUserSettingsByPageData,
165
- UserControllerGetAllUserSettingsByPageResponse,
166
- UserControllerGetAssetLiabilitySummaryResponse,
167
- PropertyControllerGetAllResponse,
168
- PropertyControllerGetByKeyData,
169
- PropertyControllerGetByKeyResponse,
170
- PropertyControllerUpdateData,
171
- PropertyControllerUpdateResponse,
172
- PropertyControllerDeleteData,
173
- PropertyControllerDeleteResponse,
199
+ CategoryCatalogControllerListData,
200
+ CategoryCatalogControllerListResponse,
174
201
  EventControllerCreateData,
175
202
  EventControllerCreateResponse,
176
203
  EventControllerFindAllData,
@@ -183,6 +210,17 @@ import type {
183
210
  EventControllerDeleteResponse,
184
211
  EventControllerGetSliceData,
185
212
  EventControllerGetSliceResponse,
213
+ OnboardingControllerBootstrapData,
214
+ OnboardingControllerBootstrapResponse,
215
+ ReconciliationControllerComputeData,
216
+ ReconciliationControllerComputeResponse,
217
+ ReconciliationControllerAssertData,
218
+ ReconciliationControllerAssertResponse,
219
+ ReconciliationControllerPadData,
220
+ ReconciliationControllerPadResponse,
221
+ ReconciliationControllerHistoryData,
222
+ ReconciliationControllerHistoryResponse,
223
+ ExportControllerExportBeancountData,
186
224
  ExportControllerExportBeancountResponse,
187
225
  FileImportControllerImportFileData,
188
226
  FileImportControllerImportFileResponse,
@@ -196,22 +234,20 @@ import type {
196
234
  ImporterConfigControllerUpdateConfigResponse,
197
235
  ImporterConfigControllerResetConfigData,
198
236
  ImporterConfigControllerResetConfigResponse,
199
- PlatformControllerFindAllResponse,
200
- PlatformControllerCreateData,
201
- PlatformControllerCreateResponse,
202
- PlatformControllerGetPlatformListResponse,
203
- PlatformControllerMatchPlatformsData,
204
- PlatformControllerMatchPlatformsResponse,
205
- PlatformControllerUpdateData,
206
- PlatformControllerUpdateResponse,
207
- PlatformControllerDeleteData,
208
- PlatformControllerDeleteResponse,
209
237
  ProviderSyncControllerSyncData,
210
238
  ProviderSyncControllerSyncResponse,
211
239
  ProviderSyncControllerGetSupportedProvidersData,
212
240
  ProviderSyncControllerGetSupportedProvidersResponse,
213
241
  ProviderSyncControllerIsProviderSupportedData,
214
242
  ProviderSyncControllerIsProviderSupportedResponse,
243
+ ExternalAccountLinkControllerCreateData,
244
+ ExternalAccountLinkControllerCreateResponse,
245
+ ExternalAccountLinkControllerFindAllData,
246
+ ExternalAccountLinkControllerFindAllResponse,
247
+ ExternalAccountLinkControllerFindOneData,
248
+ ExternalAccountLinkControllerFindOneResponse,
249
+ ExternalAccountLinkControllerRemoveData,
250
+ ExternalAccountLinkControllerRemoveResponse,
215
251
  TelemetryControllerReportTelemetryData,
216
252
  TelemetryControllerReportTelemetryResponse,
217
253
  TelemetryControllerReportCoverageMissData,
@@ -224,6 +260,19 @@ import type {
224
260
  NlpControllerClearSessionResponse,
225
261
  NlpControllerGetSessionData,
226
262
  NlpControllerGetSessionResponse,
263
+ PlatformControllerFindAllResponse,
264
+ PlatformControllerCreateData,
265
+ PlatformControllerCreateResponse,
266
+ PlatformControllerGetPlatformListData,
267
+ PlatformControllerGetPlatformListResponse,
268
+ PlatformControllerMatchPlatformsData,
269
+ PlatformControllerMatchPlatformsResponse,
270
+ PlatformControllerGetPlatformStandardsData,
271
+ PlatformControllerGetPlatformStandardsResponse,
272
+ PlatformControllerUpdateData,
273
+ PlatformControllerUpdateResponse,
274
+ PlatformControllerDeleteData,
275
+ PlatformControllerDeleteResponse,
227
276
  DashboardControllerGetNetWorthData,
228
277
  DashboardControllerGetNetWorthResponse,
229
278
  DashboardControllerGetAccountsData,
@@ -232,31 +281,17 @@ import type {
232
281
  DashboardControllerGetCashFlowResponse,
233
282
  DashboardControllerGetExpensesData,
234
283
  DashboardControllerGetExpensesResponse,
284
+ DashboardControllerGetAdvisorContextData,
285
+ DashboardControllerGetAdvisorContextResponse,
235
286
  HoldingPnlControllerGetHoldingPnlData,
236
287
  HoldingPnlControllerGetHoldingPnlResponse,
237
- PriceControllerCreateData,
238
- PriceControllerCreateResponse,
239
- PriceControllerFindAllData,
240
- PriceControllerFindAllResponse,
241
- PriceControllerFindOneData,
242
- PriceControllerFindOneResponse,
243
- PriceControllerUpdateData,
244
- PriceControllerUpdateResponse,
245
- PriceControllerDeleteData,
246
- PriceControllerDeleteResponse,
247
- PriceControllerBulkCreateData,
248
- PriceControllerBulkCreateResponse,
249
- ReportingControllerGetPortfolioTrendsData,
250
- ReportingControllerGetPortfolioTrendsResponse,
251
- ReportingControllerGetCashFlowTrendsData,
252
- ReportingControllerGetCashFlowTrendsResponse,
253
- ReportingControllerGenerateSnapshotData,
254
- ReportingControllerGenerateSnapshotResponse,
255
- ReportingControllerBackfillSnapshotsData,
256
- ReportingControllerBackfillSnapshotsResponse,
257
288
  ApiKeysControllerCreateApiKeyResponse,
258
289
  AuthControllerAccessTokenLoginData,
259
290
  AuthControllerAccessTokenLoginResponse,
291
+ AuthControllerAdvisorTokenLoginData,
292
+ AuthControllerAdvisorTokenLoginResponse,
293
+ ParserContributionControllerCreateData,
294
+ ParserContributionControllerCreateResponse,
260
295
  CacheControllerFlushCacheResponse,
261
296
  ExchangeRateControllerGetExchangeRateData,
262
297
  ExchangeRateControllerGetExchangeRateResponse,
@@ -268,7 +303,11 @@ import type {
268
303
  HealthControllerResetCircuitBreakerData,
269
304
  HealthControllerResetCircuitBreakerResponse,
270
305
  HealthControllerGetMetricsResponse,
271
- InfoControllerGetInfoResponse
306
+ InfoControllerGetInfoResponse,
307
+ SymbolControllerSearchData,
308
+ SymbolControllerSearchResponse,
309
+ SymbolControllerGetQuoteData,
310
+ SymbolControllerGetQuoteResponse
272
311
  } from './types.gen';
273
312
 
274
313
  export class BeanAccountsService {
@@ -306,7 +345,7 @@ export class BeanAccountsService {
306
345
  * @param data.type Filter by account type
307
346
  * @param data.status Filter by status
308
347
  * @param data.isCustom Filter by custom (user-created) accounts only
309
- * @param data.search Search term for path or i18nKey
348
+ * @param data.search Search term matched against account path and user-set display name (case-insensitive)
310
349
  * @param data.limit Maximum number of results
311
350
  * @param data.offset Number of results to skip
312
351
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -387,7 +426,7 @@ export class BeanAccountsService {
387
426
 
388
427
  /**
389
428
  * Delete account
390
- * Deletes an account (only if no transactions)
429
+ * Deletes an account (only if no active transactions; voided/superseded residual postings are cleaned up)
391
430
  * @param data The data for the request.
392
431
  * @param data.id Account UUID
393
432
  * @param data.region Region code for tenant context
@@ -406,7 +445,7 @@ export class BeanAccountsService {
406
445
  },
407
446
  errors: {
408
447
  404: 'Account not found',
409
- 409: 'Account has transactions and cannot be deleted'
448
+ 409: 'Account has active transactions and cannot be deleted'
410
449
  }
411
450
  });
412
451
  }
@@ -468,16 +507,45 @@ export class BeanAccountsService {
468
507
  }
469
508
  });
470
509
  }
510
+
511
+ /**
512
+ * Post an opening-balance transaction
513
+ * 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.
514
+ * @param data The data for the request.
515
+ * @param data.id Account UUID
516
+ * @param data.region Region code for tenant context
517
+ * @param data.requestBody
518
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
519
+ * @throws ApiError
520
+ */
521
+ public static accountControllerAddOpeningBalance(
522
+ data: AccountControllerAddOpeningBalanceData
523
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
524
+ return __request(OpenAPI, {
525
+ method: 'POST',
526
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
527
+ path: {
528
+ id: data.id,
529
+ region: data.region
530
+ },
531
+ body: data.requestBody,
532
+ mediaType: 'application/json',
533
+ errors: {
534
+ 404: 'Account not found',
535
+ 409: 'An opening balance already exists for this account'
536
+ }
537
+ });
538
+ }
471
539
  }
472
540
 
473
541
  export class BeanAccountStandardsService {
474
542
  /**
475
543
  * Get account templates
476
- * Returns predefined account templates for a region. Supports filtering by account type and search term.
544
+ * Returns predefined account templates for a region. Supports filtering by account type and search term. Not-yet-open region codes return the universal-only catalog (#759).
477
545
  * @param data The data for the request.
478
- * @param data.region Region code (cn, us, de)
546
+ * @param data.region Region code (any ISO alpha-2; not-yet-open codes return the universal-only catalog)
479
547
  * @param data.type Filter by account type
480
- * @param data.search Search term for path or description
548
+ * @param data.search Search term for path, description, aliases, or localized display name
481
549
  * @returns AccountStandardListResponseDto Account templates retrieved successfully
482
550
  * @throws ApiError
483
551
  */
@@ -499,9 +567,9 @@ export class BeanAccountStandardsService {
499
567
 
500
568
  /**
501
569
  * Get template metadata for an account path
502
- * Returns extendable status and root type for a template path.
570
+ * Returns root type for a template path.
503
571
  * @param data The data for the request.
504
- * @param data.region Region code for tenant context
572
+ * @param data.region Region code for tenant context. Not-yet-open codes degrade to the universal-only catalog (#759)
505
573
  * @param data.path Account path to check
506
574
  * @returns TemplateMetadataResponseDto Template metadata retrieved successfully
507
575
  * @throws ApiError
@@ -523,9 +591,9 @@ export class BeanAccountStandardsService {
523
591
 
524
592
  /**
525
593
  * Get available regions with hierarchy
526
- * Returns supported regions with inheritance metadata
594
+ * Returns the full region catalog (every ISO 3166-1 entry) with an 'open' flag and inheritance metadata (#759)
527
595
  * @param data The data for the request.
528
- * @param data.region Region code for tenant context
596
+ * @param data.region Region code for tenant context. Not-yet-open codes degrade to the universal-only catalog (#759)
529
597
  * @returns RegionsMetadataResponseDto Regions metadata retrieved successfully
530
598
  * @throws ApiError
531
599
  */
@@ -582,10 +650,11 @@ export class BeanTransactionsService {
582
650
  * @param data.offset Number of items to skip (default: 0)
583
651
  * @param data.dateFrom Filter by start date (inclusive), format: YYYY-MM-DD
584
652
  * @param data.dateTo Filter by end date (inclusive), format: YYYY-MM-DD
585
- * @param data.status Filter by transaction status
653
+ * @param data.status Filter by transaction status: single value, comma-separated multi-value (e.g. VOIDED,SUPERSEDED), or ALL to include audit rows. Defaults to ACTIVE-only (ADR-0128; previously unfiltered — breaking change).
586
654
  * @param data.search Search in narration and payee fields (max 200 chars)
587
655
  * @param data.accountId Filter by account ID (transactions with postings to this account)
588
- * @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
656
+ * @param data.category Filter by ADR-0075 functional category (Group segment); matches any posting to an account whose derived Group segment equals this value. Must be accompanied by flow (ADR-0126).
657
+ * @param data.flow Required when category is present (400 otherwise) and vice versa (ADR-0126). Restricts the category account set to the flow root (income → Income:, expense → Expenses:) and drives the per-leg sign normalization of row viewpointAmount and the summary. OpenAPI cannot express conditional requiredness — the pairing is enforced at runtime.
589
658
  * @returns TransactionListResponseDto Transaction list
590
659
  * @throws ApiError
591
660
  */
@@ -606,7 +675,8 @@ export class BeanTransactionsService {
606
675
  status: data.status,
607
676
  search: data.search,
608
677
  accountId: data.accountId,
609
- category: data.category
678
+ category: data.category,
679
+ flow: data.flow
610
680
  },
611
681
  errors: {
612
682
  400: 'Validation failed',
@@ -643,6 +713,34 @@ export class BeanTransactionsService {
643
713
  });
644
714
  }
645
715
 
716
+ /**
717
+ * Batch void transactions
718
+ * Soft-deletes (VOIDED) a batch of the caller's ACTIVE transactions in one DB transaction. Voiding releases each row's importId dedup slot, so re-importing the same file after an undo batch-void imports every row again instead of skipping them as duplicates.
719
+ * @param data The data for the request.
720
+ * @param data.region Region code for tenant context
721
+ * @param data.requestBody Batch void request (1-500 unique transaction IDs)
722
+ * @returns BatchVoidResultDto Batch void result: count of rows voided plus ids not found / no longer ACTIVE
723
+ * @throws ApiError
724
+ */
725
+ public static transactionControllerBatchVoid(
726
+ data: TransactionControllerBatchVoidData
727
+ ): CancelablePromise<TransactionControllerBatchVoidResponse> {
728
+ return __request(OpenAPI, {
729
+ method: 'POST',
730
+ url: '/api/v1/{region}/bean/transactions/batch-void',
731
+ path: {
732
+ region: data.region
733
+ },
734
+ body: data.requestBody,
735
+ mediaType: 'application/json',
736
+ errors: {
737
+ 400: 'Validation failed (empty, over 500, duplicate or non-string ids)',
738
+ 401: 'Authentication required',
739
+ 403: 'Batch contains ids owned by another user — whole request rejected, nothing committed'
740
+ }
741
+ });
742
+ }
743
+
646
744
  /**
647
745
  * Correct (supersede) a transaction
648
746
  * Atomically voids the original (SUPERSEDED) and creates a replacement through the full validation pipeline.
@@ -794,7 +892,7 @@ export class BeanBalancesService {
794
892
  * Query account balance
795
893
  * Calculate account balance at a specific date for a single currency
796
894
  * @param data The data for the request.
797
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
895
+ * @param data.account Account name (e.g., "Assets:Checking")
798
896
  * @param data.region Region code for tenant context
799
897
  * @param data.date Date to calculate balance at (ISO 8601 format)
800
898
  * @param data.currency Currency to query (e.g., "USD", "CNY")
@@ -987,1492 +1085,1862 @@ export class BeanReviewsService {
987
1085
  }
988
1086
  }
989
1087
 
990
- export class BeanPayeesService {
1088
+ export class BeanTransactionRulesService {
991
1089
  /**
992
- * Create a new payee
993
- * Creates a new payee mapping for the authenticated user. The payee name must be unique within the user's account.
1090
+ * Create a new transaction rule (or upsert if upsertByPayee=true)
1091
+ * Creates a new rule. If upsertByPayee=true, updates existing rule matching payeeKeywords[0] instead of creating duplicate.
994
1092
  * @param data The data for the request.
1093
+ * @param data.region Region code for tenant context
995
1094
  * @param data.requestBody
996
- * @returns PayeeResponseDto Payee created successfully
1095
+ * @returns TransactionRuleResponseDto Rule updated successfully (upsert mode)
997
1096
  * @throws ApiError
998
1097
  */
999
- public static payeeControllerCreate(
1000
- data: PayeeControllerCreateData
1001
- ): CancelablePromise<PayeeControllerCreateResponse> {
1098
+ public static transactionRuleControllerCreate(
1099
+ data: TransactionRuleControllerCreateData
1100
+ ): CancelablePromise<TransactionRuleControllerCreateResponse> {
1002
1101
  return __request(OpenAPI, {
1003
1102
  method: 'POST',
1004
- url: '/api/v1/bean/payees',
1103
+ url: '/api/v1/{region}/bean/transaction-rules',
1104
+ path: {
1105
+ region: data.region
1106
+ },
1005
1107
  body: data.requestBody,
1006
1108
  mediaType: 'application/json',
1007
1109
  errors: {
1008
- 400: 'Invalid input data',
1009
- 409: 'Payee already exists'
1110
+ 400: 'Validation failed',
1111
+ 401: 'Unauthorized',
1112
+ 409: 'Resource conflict - another process is updating this rule'
1010
1113
  }
1011
1114
  });
1012
1115
  }
1013
1116
 
1014
1117
  /**
1015
- * List user payees
1016
- * Returns all payee mappings for the authenticated user with optional filtering
1118
+ * Get all transaction rules for user
1017
1119
  * @param data The data for the request.
1018
- * @param data.search Search term for payee name (partial match, case-insensitive). Useful for autocomplete.
1019
- * @param data.payee Filter by exact payee name match
1020
- * @param data.category Filter by custom category
1021
- * @param data.tag Filter by custom tag (returns payees that have this tag)
1022
- * @param data.isActive Filter by active status. Defaults to true (show only active payees).
1023
- * @returns PayeeListResponseDto Payees retrieved successfully
1120
+ * @param data.region Region code for tenant context
1121
+ * @param data.limit Max results per page (default: 20, max: 100)
1122
+ * @param data.offset Pagination offset (default: 0)
1123
+ * @param data.enabled Filter by enabled status
1124
+ * @param data.learningSource Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
1125
+ * @param data.autoApplyEnabled Filter by auto-apply status
1126
+ * @returns TransactionRuleListResponseDto List of rules
1024
1127
  * @throws ApiError
1025
1128
  */
1026
- public static payeeControllerFindAll(
1027
- data: PayeeControllerFindAllData = {}
1028
- ): CancelablePromise<PayeeControllerFindAllResponse> {
1129
+ public static transactionRuleControllerList(
1130
+ data: TransactionRuleControllerListData
1131
+ ): CancelablePromise<TransactionRuleControllerListResponse> {
1029
1132
  return __request(OpenAPI, {
1030
1133
  method: 'GET',
1031
- url: '/api/v1/bean/payees',
1134
+ url: '/api/v1/{region}/bean/transaction-rules',
1135
+ path: {
1136
+ region: data.region
1137
+ },
1032
1138
  query: {
1033
- search: data.search,
1034
- payee: data.payee,
1035
- category: data.category,
1036
- tag: data.tag,
1037
- isActive: data.isActive
1139
+ limit: data.limit,
1140
+ offset: data.offset,
1141
+ enabled: data.enabled,
1142
+ learningSource: data.learningSource,
1143
+ autoApplyEnabled: data.autoApplyEnabled
1144
+ },
1145
+ errors: {
1146
+ 401: 'Unauthorized'
1038
1147
  }
1039
1148
  });
1040
1149
  }
1041
1150
 
1042
1151
  /**
1043
- * Get payee autocomplete suggestions
1044
- * Returns active payee names matching the query, sorted by recent usage. Used for transaction input autocomplete.
1152
+ * Validate transaction rule configuration
1045
1153
  * @param data The data for the request.
1046
- * @param data.q Search query for payee name (partial match, case-insensitive)
1047
- * @param data.limit Maximum number of suggestions
1048
- * @returns PayeeAutocompleteResponseDto Autocomplete suggestions retrieved successfully
1154
+ * @param data.region Region code for tenant context
1155
+ * @param data.requestBody
1156
+ * @returns ValidateRuleResponseDto Validation result
1049
1157
  * @throws ApiError
1050
1158
  */
1051
- public static payeeControllerAutocomplete(
1052
- data: PayeeControllerAutocompleteData
1053
- ): CancelablePromise<PayeeControllerAutocompleteResponse> {
1159
+ public static transactionRuleControllerValidate(
1160
+ data: TransactionRuleControllerValidateData
1161
+ ): CancelablePromise<TransactionRuleControllerValidateResponse> {
1054
1162
  return __request(OpenAPI, {
1055
- method: 'GET',
1056
- url: '/api/v1/bean/payees/autocomplete',
1057
- query: {
1058
- q: data.q,
1059
- limit: data.limit
1163
+ method: 'POST',
1164
+ url: '/api/v1/{region}/bean/transaction-rules/validate',
1165
+ path: {
1166
+ region: data.region
1167
+ },
1168
+ body: data.requestBody,
1169
+ mediaType: 'application/json',
1170
+ errors: {
1171
+ 400: 'Validation failed',
1172
+ 401: 'Unauthorized'
1060
1173
  }
1061
1174
  });
1062
1175
  }
1063
1176
 
1064
1177
  /**
1065
- * Get top payees by usage
1066
- * Returns the most frequently used payees, sorted by use count. Used for statistics and analytics.
1178
+ * Bulk create transaction rules
1067
1179
  * @param data The data for the request.
1068
- * @param data.limit Maximum number of results
1069
- * @returns PayeeStatsResponseDto Top payees retrieved successfully
1180
+ * @param data.region Region code for tenant context
1181
+ * @param data.requestBody
1182
+ * @returns BulkCreateRulesResponseDto Bulk create completed
1070
1183
  * @throws ApiError
1071
1184
  */
1072
- public static payeeControllerGetTopPayees(
1073
- data: PayeeControllerGetTopPayeesData = {}
1074
- ): CancelablePromise<PayeeControllerGetTopPayeesResponse> {
1185
+ public static transactionRuleControllerBulkCreate(
1186
+ data: TransactionRuleControllerBulkCreateData
1187
+ ): CancelablePromise<TransactionRuleControllerBulkCreateResponse> {
1075
1188
  return __request(OpenAPI, {
1076
- method: 'GET',
1077
- url: '/api/v1/bean/payees/top',
1078
- query: {
1079
- limit: data.limit
1189
+ method: 'POST',
1190
+ url: '/api/v1/{region}/bean/transaction-rules/bulk',
1191
+ path: {
1192
+ region: data.region
1193
+ },
1194
+ body: data.requestBody,
1195
+ mediaType: 'application/json',
1196
+ errors: {
1197
+ 400: 'Invalid bulk create data',
1198
+ 401: 'Unauthorized'
1080
1199
  }
1081
1200
  });
1082
1201
  }
1083
1202
 
1084
1203
  /**
1085
- * Get payee by ID
1086
- * Returns a specific payee mapping by its UUID
1204
+ * Export transaction rules
1087
1205
  * @param data The data for the request.
1088
- * @param data.id Payee UUID
1089
- * @returns PayeeResponseDto Payee retrieved successfully
1206
+ * @param data.format Export format (currently only JSON supported)
1207
+ * @param data.region Region code for tenant context
1208
+ * @returns ExportRulesResponseDto Exported rules
1090
1209
  * @throws ApiError
1091
1210
  */
1092
- public static payeeControllerFindOne(
1093
- data: PayeeControllerFindOneData
1094
- ): CancelablePromise<PayeeControllerFindOneResponse> {
1211
+ public static transactionRuleControllerExport(
1212
+ data: TransactionRuleControllerExportData
1213
+ ): CancelablePromise<TransactionRuleControllerExportResponse> {
1095
1214
  return __request(OpenAPI, {
1096
1215
  method: 'GET',
1097
- url: '/api/v1/bean/payees/{id}',
1216
+ url: '/api/v1/{region}/bean/transaction-rules/export/{format}',
1098
1217
  path: {
1099
- id: data.id
1218
+ format: data.format,
1219
+ region: data.region
1100
1220
  },
1101
1221
  errors: {
1102
- 403: 'Payee belongs to another user',
1103
- 404: 'Payee not found'
1222
+ 400: 'Unsupported format',
1223
+ 401: 'Unauthorized'
1104
1224
  }
1105
1225
  });
1106
1226
  }
1107
1227
 
1108
1228
  /**
1109
- * Update payee
1110
- * Updates a payee mapping. The payee name cannot be changed after creation.
1229
+ * Get transaction rule statistics
1111
1230
  * @param data The data for the request.
1112
- * @param data.id Payee UUID
1113
- * @param data.requestBody
1114
- * @returns PayeeResponseDto Payee updated successfully
1231
+ * @param data.period Statistics time period
1232
+ * @param data.region Region code for tenant context
1233
+ * @returns RuleStatisticsResponseDto Rule statistics
1115
1234
  * @throws ApiError
1116
1235
  */
1117
- public static payeeControllerUpdate(
1118
- data: PayeeControllerUpdateData
1119
- ): CancelablePromise<PayeeControllerUpdateResponse> {
1236
+ public static transactionRuleControllerGetStatistics(
1237
+ data: TransactionRuleControllerGetStatisticsData
1238
+ ): CancelablePromise<TransactionRuleControllerGetStatisticsResponse> {
1120
1239
  return __request(OpenAPI, {
1121
- method: 'PUT',
1122
- url: '/api/v1/bean/payees/{id}',
1240
+ method: 'GET',
1241
+ url: '/api/v1/{region}/bean/transaction-rules/statistics/{period}',
1123
1242
  path: {
1124
- id: data.id
1243
+ period: data.period,
1244
+ region: data.region
1125
1245
  },
1126
- body: data.requestBody,
1127
- mediaType: 'application/json',
1128
1246
  errors: {
1129
- 400: 'Invalid input data',
1130
- 404: 'Payee not found'
1247
+ 401: 'Unauthorized'
1131
1248
  }
1132
1249
  });
1133
1250
  }
1134
1251
 
1135
1252
  /**
1136
- * Delete payee
1137
- * Soft deletes a payee by marking it as inactive. Inactive payees will not appear in autocomplete suggestions.
1253
+ * Get transaction rule detail
1138
1254
  * @param data The data for the request.
1139
- * @param data.id Payee UUID
1140
- * @returns void Payee deleted successfully
1255
+ * @param data.ruleId Rule ID
1256
+ * @param data.region Region code for tenant context
1257
+ * @returns TransactionRuleResponseDto Rule details
1141
1258
  * @throws ApiError
1142
1259
  */
1143
- public static payeeControllerDelete(
1144
- data: PayeeControllerDeleteData
1145
- ): CancelablePromise<PayeeControllerDeleteResponse> {
1260
+ public static transactionRuleControllerGetDetail(
1261
+ data: TransactionRuleControllerGetDetailData
1262
+ ): CancelablePromise<TransactionRuleControllerGetDetailResponse> {
1146
1263
  return __request(OpenAPI, {
1147
- method: 'DELETE',
1148
- url: '/api/v1/bean/payees/{id}',
1264
+ method: 'GET',
1265
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
1149
1266
  path: {
1150
- id: data.id
1267
+ ruleId: data.ruleId,
1268
+ region: data.region
1151
1269
  },
1152
1270
  errors: {
1153
- 404: 'Payee not found'
1271
+ 401: 'Unauthorized',
1272
+ 403: 'Forbidden - not owner of rule',
1273
+ 404: 'Rule not found'
1154
1274
  }
1155
1275
  });
1156
1276
  }
1157
- }
1158
1277
 
1159
- export class AdminPayeeProfilesService {
1160
1278
  /**
1161
- * Create payee profile (Admin only)
1162
- * Creates a new global payee profile. The canonical name must be unique (case-insensitive).
1279
+ * Update a transaction rule
1163
1280
  * @param data The data for the request.
1281
+ * @param data.ruleId Rule ID to update
1282
+ * @param data.region Region code for tenant context
1164
1283
  * @param data.requestBody
1165
- * @returns PayeeProfileResponseDto Payee profile created successfully
1284
+ * @returns TransactionRuleResponseDto Rule updated successfully
1166
1285
  * @throws ApiError
1167
1286
  */
1168
- public static payeeProfileAdminControllerCreate(
1169
- data: PayeeProfileAdminControllerCreateData
1170
- ): CancelablePromise<PayeeProfileAdminControllerCreateResponse> {
1287
+ public static transactionRuleControllerUpdate(
1288
+ data: TransactionRuleControllerUpdateData
1289
+ ): CancelablePromise<TransactionRuleControllerUpdateResponse> {
1171
1290
  return __request(OpenAPI, {
1172
- method: 'POST',
1173
- url: '/api/v1/admin/payee-profiles',
1291
+ method: 'PUT',
1292
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
1293
+ path: {
1294
+ ruleId: data.ruleId,
1295
+ region: data.region
1296
+ },
1174
1297
  body: data.requestBody,
1175
1298
  mediaType: 'application/json',
1176
1299
  errors: {
1177
1300
  400: 'Validation failed',
1178
- 403: 'Admin access required',
1179
- 409: 'Payee profile already exists'
1301
+ 401: 'Unauthorized',
1302
+ 403: 'Forbidden - not owner of rule',
1303
+ 404: 'Rule not found',
1304
+ 409: 'Resource conflict - rule is being modified by another process'
1180
1305
  }
1181
1306
  });
1182
1307
  }
1183
1308
 
1184
1309
  /**
1185
- * List payee profiles (Admin only)
1186
- * Returns all payee profiles with optional filtering by category, country, verification status, etc.
1310
+ * Delete a transaction rule
1187
1311
  * @param data The data for the request.
1188
- * @param data.search Search term for canonical name and aliases (case-insensitive)
1189
- * @param data.category Filter by category
1190
- * @param data.country Filter by country (ISO 3166-1 alpha-2)
1191
- * @param data.isActive Filter by active status (default: true - show only active)
1192
- * @param data.verified Filter by verification status. true = verified only, false = unverified only
1193
- * @param data.dataSource Filter by data source
1194
- * @returns PayeeProfileListResponseDto Payee profiles retrieved successfully
1312
+ * @param data.ruleId Rule ID to delete
1313
+ * @param data.region Region code for tenant context
1314
+ * @returns void Rule deleted successfully
1195
1315
  * @throws ApiError
1196
1316
  */
1197
- public static payeeProfileAdminControllerFindAll(
1198
- data: PayeeProfileAdminControllerFindAllData = {}
1199
- ): CancelablePromise<PayeeProfileAdminControllerFindAllResponse> {
1317
+ public static transactionRuleControllerDelete(
1318
+ data: TransactionRuleControllerDeleteData
1319
+ ): CancelablePromise<TransactionRuleControllerDeleteResponse> {
1200
1320
  return __request(OpenAPI, {
1201
- method: 'GET',
1202
- url: '/api/v1/admin/payee-profiles',
1203
- query: {
1204
- search: data.search,
1205
- category: data.category,
1206
- country: data.country,
1207
- isActive: data.isActive,
1208
- verified: data.verified,
1209
- dataSource: data.dataSource
1321
+ method: 'DELETE',
1322
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
1323
+ path: {
1324
+ ruleId: data.ruleId,
1325
+ region: data.region
1210
1326
  },
1211
1327
  errors: {
1212
- 403: 'Admin access required'
1328
+ 401: 'Unauthorized',
1329
+ 403: 'Forbidden - not owner of rule',
1330
+ 404: 'Rule not found',
1331
+ 409: 'Resource conflict - rule is being modified by another process'
1213
1332
  }
1214
1333
  });
1215
1334
  }
1216
1335
 
1217
1336
  /**
1218
- * Get payee profile by ID (Admin only)
1219
- * Returns a single payee profile by its ID.
1337
+ * Test rule matching
1220
1338
  * @param data The data for the request.
1221
- * @param data.id Payee profile ID (UUID)
1222
- * @returns PayeeProfileResponseDto Payee profile retrieved successfully
1339
+ * @param data.ruleId Rule ID to test
1340
+ * @param data.region Region code for tenant context
1341
+ * @param data.requestBody
1342
+ * @returns TestRuleResponseDto Test result
1223
1343
  * @throws ApiError
1224
1344
  */
1225
- public static payeeProfileAdminControllerFindOne(
1226
- data: PayeeProfileAdminControllerFindOneData
1227
- ): CancelablePromise<PayeeProfileAdminControllerFindOneResponse> {
1345
+ public static transactionRuleControllerTest(
1346
+ data: TransactionRuleControllerTestData
1347
+ ): CancelablePromise<TransactionRuleControllerTestResponse> {
1228
1348
  return __request(OpenAPI, {
1229
- method: 'GET',
1230
- url: '/api/v1/admin/payee-profiles/{id}',
1349
+ method: 'POST',
1350
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}/test',
1231
1351
  path: {
1232
- id: data.id
1352
+ ruleId: data.ruleId,
1353
+ region: data.region
1233
1354
  },
1355
+ body: data.requestBody,
1356
+ mediaType: 'application/json',
1234
1357
  errors: {
1235
- 403: 'Admin access required',
1236
- 404: 'Payee profile not found'
1358
+ 401: 'Unauthorized',
1359
+ 403: 'Forbidden - not owner of rule',
1360
+ 404: 'Rule not found'
1237
1361
  }
1238
1362
  });
1239
1363
  }
1364
+ }
1240
1365
 
1366
+ export class UsersService {
1241
1367
  /**
1242
- * Update payee profile (Admin only)
1243
- * Updates an existing payee profile. The canonical name cannot be changed.
1368
+ * Delete own user account
1244
1369
  * @param data The data for the request.
1245
- * @param data.id Payee profile ID (UUID)
1246
1370
  * @param data.requestBody
1247
- * @returns PayeeProfileResponseDto Payee profile updated successfully
1371
+ * @returns void User deleted successfully
1248
1372
  * @throws ApiError
1249
1373
  */
1250
- public static payeeProfileAdminControllerUpdate(
1251
- data: PayeeProfileAdminControllerUpdateData
1252
- ): CancelablePromise<PayeeProfileAdminControllerUpdateResponse> {
1374
+ public static userControllerDeleteOwnUser(
1375
+ data: UserControllerDeleteOwnUserData
1376
+ ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
1253
1377
  return __request(OpenAPI, {
1254
- method: 'PUT',
1255
- url: '/api/v1/admin/payee-profiles/{id}',
1256
- path: {
1257
- id: data.id
1258
- },
1378
+ method: 'DELETE',
1379
+ url: '/api/v1/users',
1259
1380
  body: data.requestBody,
1260
1381
  mediaType: 'application/json',
1261
1382
  errors: {
1262
- 403: 'Admin access required',
1263
- 404: 'Payee profile not found'
1383
+ 403: 'Invalid access token'
1264
1384
  }
1265
1385
  });
1266
1386
  }
1267
1387
 
1268
1388
  /**
1269
- * Soft delete payee profile (Admin only)
1270
- * Marks a payee profile as inactive (soft delete). The profile cannot be deleted if it is referenced by user payees.
1389
+ * Get current authenticated user
1271
1390
  * @param data The data for the request.
1272
- * @param data.id Payee profile ID (UUID)
1273
- * @returns void Payee profile deleted successfully
1391
+ * @param data.acceptLanguage
1392
+ * @returns UserResponseDto User retrieved successfully
1274
1393
  * @throws ApiError
1275
1394
  */
1276
- public static payeeProfileAdminControllerDelete(
1277
- data: PayeeProfileAdminControllerDeleteData
1278
- ): CancelablePromise<PayeeProfileAdminControllerDeleteResponse> {
1395
+ public static userControllerGetUser(
1396
+ data: UserControllerGetUserData
1397
+ ): CancelablePromise<UserControllerGetUserResponse> {
1398
+ return __request(OpenAPI, {
1399
+ method: 'GET',
1400
+ url: '/api/v1/users',
1401
+ headers: {
1402
+ 'accept-language': data.acceptLanguage
1403
+ }
1404
+ });
1405
+ }
1406
+
1407
+ /**
1408
+ * Sign up new user
1409
+ * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
1410
+ * @param data The data for the request.
1411
+ * @param data.requestBody
1412
+ * @returns SignupResponseDto User created successfully
1413
+ * @throws ApiError
1414
+ */
1415
+ public static userControllerSignupUser(
1416
+ data: UserControllerSignupUserData
1417
+ ): CancelablePromise<UserControllerSignupUserResponse> {
1418
+ return __request(OpenAPI, {
1419
+ method: 'POST',
1420
+ url: '/api/v1/users',
1421
+ body: data.requestBody,
1422
+ mediaType: 'application/json',
1423
+ errors: {
1424
+ 400: 'Invalid Turnstile token (when Turnstile is enabled)',
1425
+ 403: 'User signup is disabled'
1426
+ }
1427
+ });
1428
+ }
1429
+
1430
+ /**
1431
+ * Delete user by ID (admin only)
1432
+ * @param data The data for the request.
1433
+ * @param data.id User ID to delete
1434
+ * @returns void User deleted successfully
1435
+ * @throws ApiError
1436
+ */
1437
+ public static userControllerDeleteUser(
1438
+ data: UserControllerDeleteUserData
1439
+ ): CancelablePromise<UserControllerDeleteUserResponse> {
1279
1440
  return __request(OpenAPI, {
1280
1441
  method: 'DELETE',
1281
- url: '/api/v1/admin/payee-profiles/{id}',
1442
+ url: '/api/v1/users/{id}',
1282
1443
  path: {
1283
1444
  id: data.id
1284
1445
  },
1285
1446
  errors: {
1286
- 403: 'Admin access required',
1287
- 404: 'Payee profile not found',
1288
- 409: 'Payee profile is in use and cannot be deleted'
1447
+ 403: 'Cannot delete own account or insufficient permissions'
1289
1448
  }
1290
1449
  });
1291
1450
  }
1292
1451
 
1293
1452
  /**
1294
- * Verify payee profile (Admin only)
1295
- * Marks a payee profile as verified by setting verifiedAt to current timestamp.
1453
+ * Get user info by user ID
1296
1454
  * @param data The data for the request.
1297
- * @param data.id Payee profile ID (UUID)
1298
- * @returns PayeeProfileResponseDto Payee profile verified successfully
1455
+ * @param data.id User ID
1456
+ * @returns unknown User info retrieved successfully
1299
1457
  * @throws ApiError
1300
1458
  */
1301
- public static payeeProfileAdminControllerVerify(
1302
- data: PayeeProfileAdminControllerVerifyData
1303
- ): CancelablePromise<PayeeProfileAdminControllerVerifyResponse> {
1459
+ public static userControllerGetUserInfo(
1460
+ data: UserControllerGetUserInfoData
1461
+ ): CancelablePromise<UserControllerGetUserInfoResponse> {
1304
1462
  return __request(OpenAPI, {
1305
- method: 'POST',
1306
- url: '/api/v1/admin/payee-profiles/{id}/verify',
1463
+ method: 'GET',
1464
+ url: '/api/v1/users/{id}/info',
1307
1465
  path: {
1308
1466
  id: data.id
1309
1467
  },
1310
1468
  errors: {
1311
- 403: 'Admin access required',
1312
- 404: 'Payee profile not found'
1469
+ 403: 'Cannot access other user info without admin permission'
1313
1470
  }
1314
1471
  });
1315
1472
  }
1316
1473
 
1317
1474
  /**
1318
- * Unverify payee profile (Admin only)
1319
- * Removes verification status by setting verifiedAt to null.
1475
+ * Update user settings
1320
1476
  * @param data The data for the request.
1321
- * @param data.id Payee profile ID (UUID)
1322
- * @returns PayeeProfileResponseDto Payee profile unverified successfully
1477
+ * @param data.requestBody
1478
+ * @returns unknown Settings updated successfully
1323
1479
  * @throws ApiError
1324
1480
  */
1325
- public static payeeProfileAdminControllerUnverify(
1326
- data: PayeeProfileAdminControllerUnverifyData
1327
- ): CancelablePromise<PayeeProfileAdminControllerUnverifyResponse> {
1481
+ public static userControllerUpdateUserSetting(
1482
+ data: UserControllerUpdateUserSettingData
1483
+ ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
1484
+ return __request(OpenAPI, {
1485
+ method: 'PUT',
1486
+ url: '/api/v1/users/setting',
1487
+ body: data.requestBody,
1488
+ mediaType: 'application/json',
1489
+ errors: {
1490
+ 403: 'Insufficient permissions'
1491
+ }
1492
+ });
1493
+ }
1494
+
1495
+ /**
1496
+ * Get all user settings paginated (admin only)
1497
+ * @param data The data for the request.
1498
+ * @param data.pageNo Page number
1499
+ * @param data.pageSize Page size
1500
+ * @returns unknown Settings list retrieved successfully
1501
+ * @throws ApiError
1502
+ */
1503
+ public static userControllerGetAllUserSettingsByPage(
1504
+ data: UserControllerGetAllUserSettingsByPageData
1505
+ ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
1506
+ return __request(OpenAPI, {
1507
+ method: 'GET',
1508
+ url: '/api/v1/users/settings-by-page',
1509
+ query: {
1510
+ pageNo: data.pageNo,
1511
+ pageSize: data.pageSize
1512
+ }
1513
+ });
1514
+ }
1515
+
1516
+ /**
1517
+ * Get asset and liability summary for current user
1518
+ * @returns unknown Summary retrieved successfully
1519
+ * @throws ApiError
1520
+ */
1521
+ public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
1522
+ return __request(OpenAPI, {
1523
+ method: 'GET',
1524
+ url: '/api/v1/users/asset-liability-summary'
1525
+ });
1526
+ }
1527
+ }
1528
+
1529
+ export class PropertiesService {
1530
+ /**
1531
+ * Get all system properties
1532
+ * @returns unknown Properties retrieved successfully
1533
+ * @throws ApiError
1534
+ */
1535
+ public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
1536
+ return __request(OpenAPI, {
1537
+ method: 'GET',
1538
+ url: '/api/v1/admin/properties',
1539
+ errors: {
1540
+ 401: 'Unauthorized',
1541
+ 403: 'Forbidden - insufficient permissions'
1542
+ }
1543
+ });
1544
+ }
1545
+
1546
+ /**
1547
+ * Get property by key
1548
+ * @param data The data for the request.
1549
+ * @param data.key Property key
1550
+ * @returns unknown Property retrieved successfully
1551
+ * @throws ApiError
1552
+ */
1553
+ public static propertyControllerGetByKey(
1554
+ data: PropertyControllerGetByKeyData
1555
+ ): CancelablePromise<PropertyControllerGetByKeyResponse> {
1556
+ return __request(OpenAPI, {
1557
+ method: 'GET',
1558
+ url: '/api/v1/admin/properties/{key}',
1559
+ path: {
1560
+ key: data.key
1561
+ },
1562
+ errors: {
1563
+ 401: 'Unauthorized',
1564
+ 403: 'Forbidden - insufficient permissions',
1565
+ 404: 'Property not found'
1566
+ }
1567
+ });
1568
+ }
1569
+
1570
+ /**
1571
+ * Update a system property
1572
+ * @param data The data for the request.
1573
+ * @param data.key Property key
1574
+ * @param data.requestBody
1575
+ * @returns unknown Property updated successfully
1576
+ * @throws ApiError
1577
+ */
1578
+ public static propertyControllerUpdate(
1579
+ data: PropertyControllerUpdateData
1580
+ ): CancelablePromise<PropertyControllerUpdateResponse> {
1581
+ return __request(OpenAPI, {
1582
+ method: 'PUT',
1583
+ url: '/api/v1/admin/properties/{key}',
1584
+ path: {
1585
+ key: data.key
1586
+ },
1587
+ body: data.requestBody,
1588
+ mediaType: 'application/json',
1589
+ errors: {
1590
+ 401: 'Unauthorized',
1591
+ 403: 'Forbidden - insufficient permissions'
1592
+ }
1593
+ });
1594
+ }
1595
+
1596
+ /**
1597
+ * Delete a system property
1598
+ * @param data The data for the request.
1599
+ * @param data.key Property key
1600
+ * @returns void Property deleted successfully
1601
+ * @throws ApiError
1602
+ */
1603
+ public static propertyControllerDelete(
1604
+ data: PropertyControllerDeleteData
1605
+ ): CancelablePromise<PropertyControllerDeleteResponse> {
1328
1606
  return __request(OpenAPI, {
1329
1607
  method: 'DELETE',
1330
- url: '/api/v1/admin/payee-profiles/{id}/verify',
1608
+ url: '/api/v1/admin/properties/{key}',
1331
1609
  path: {
1332
- id: data.id
1610
+ key: data.key
1333
1611
  },
1334
1612
  errors: {
1335
- 403: 'Admin access required',
1336
- 404: 'Payee profile not found'
1613
+ 401: 'Unauthorized',
1614
+ 403: 'Forbidden - insufficient permissions',
1615
+ 404: 'Property not found'
1337
1616
  }
1338
1617
  });
1339
1618
  }
1340
1619
  }
1341
1620
 
1342
- export class BeanCommoditiesService {
1621
+ export class BeanPayeesService {
1343
1622
  /**
1344
- * Create a new commodity
1345
- * Creates a new commodity definition for the authenticated user
1623
+ * Create a new payee
1624
+ * Creates a new payee mapping for the authenticated user. The payee name must be unique within the user's account.
1346
1625
  * @param data The data for the request.
1347
- * @param data.region Region code for tenant context
1348
1626
  * @param data.requestBody
1349
- * @returns CommodityResponseDto Commodity created successfully
1627
+ * @returns PayeeResponseDto Payee created successfully
1350
1628
  * @throws ApiError
1351
1629
  */
1352
- public static commodityControllerCreate(
1353
- data: CommodityControllerCreateData
1354
- ): CancelablePromise<CommodityControllerCreateResponse> {
1630
+ public static payeeControllerCreate(
1631
+ data: PayeeControllerCreateData
1632
+ ): CancelablePromise<PayeeControllerCreateResponse> {
1355
1633
  return __request(OpenAPI, {
1356
1634
  method: 'POST',
1357
- url: '/api/v1/{region}/bean/commodities',
1358
- path: {
1359
- region: data.region
1360
- },
1635
+ url: '/api/v1/bean/payees',
1361
1636
  body: data.requestBody,
1362
1637
  mediaType: 'application/json',
1363
1638
  errors: {
1364
1639
  400: 'Invalid input data',
1365
- 409: 'Commodity already exists'
1640
+ 409: 'Payee already exists'
1366
1641
  }
1367
1642
  });
1368
1643
  }
1369
1644
 
1370
1645
  /**
1371
- * List user commodities
1372
- * Returns all commodity definitions for the authenticated user with optional filtering
1646
+ * List user payees
1647
+ * Returns all payee mappings for the authenticated user with optional filtering
1373
1648
  * @param data The data for the request.
1374
- * @param data.region Region code for tenant context
1375
- * @param data.search Search term for symbol or metadata fields (partial match). Searches symbol and metadata.name.
1376
- * @param data.symbol Filter by exact symbol match
1377
- * @returns CommodityListResponseDto Commodities retrieved successfully
1649
+ * @param data.search Search term for payee name (partial match, case-insensitive). Useful for autocomplete.
1650
+ * @param data.payee Filter by exact payee name match
1651
+ * @param data.category Filter by custom category
1652
+ * @param data.tag Filter by custom tag (returns payees that have this tag)
1653
+ * @param data.isActive Filter by active status. Defaults to true (show only active payees).
1654
+ * @returns PayeeListResponseDto Payees retrieved successfully
1378
1655
  * @throws ApiError
1379
1656
  */
1380
- public static commodityControllerFindAll(
1381
- data: CommodityControllerFindAllData
1382
- ): CancelablePromise<CommodityControllerFindAllResponse> {
1657
+ public static payeeControllerFindAll(
1658
+ data: PayeeControllerFindAllData = {}
1659
+ ): CancelablePromise<PayeeControllerFindAllResponse> {
1383
1660
  return __request(OpenAPI, {
1384
1661
  method: 'GET',
1385
- url: '/api/v1/{region}/bean/commodities',
1386
- path: {
1387
- region: data.region
1388
- },
1662
+ url: '/api/v1/bean/payees',
1389
1663
  query: {
1390
1664
  search: data.search,
1391
- symbol: data.symbol
1665
+ payee: data.payee,
1666
+ category: data.category,
1667
+ tag: data.tag,
1668
+ isActive: data.isActive
1392
1669
  }
1393
1670
  });
1394
1671
  }
1395
1672
 
1396
1673
  /**
1397
- * Get commodity by symbol
1398
- * Returns a specific commodity definition by its symbol
1674
+ * Get payee autocomplete suggestions
1675
+ * Returns active payee names matching the query, sorted by recent usage. Used for transaction input autocomplete.
1399
1676
  * @param data The data for the request.
1400
- * @param data.symbol Commodity symbol
1401
- * @param data.region Region code for tenant context
1402
- * @returns CommodityResponseDto Commodity retrieved successfully
1677
+ * @param data.q Search query for payee name (partial match, case-insensitive)
1678
+ * @param data.limit Maximum number of suggestions
1679
+ * @returns PayeeAutocompleteResponseDto Autocomplete suggestions retrieved successfully
1403
1680
  * @throws ApiError
1404
1681
  */
1405
- public static commodityControllerFindOne(
1406
- data: CommodityControllerFindOneData
1407
- ): CancelablePromise<CommodityControllerFindOneResponse> {
1682
+ public static payeeControllerAutocomplete(
1683
+ data: PayeeControllerAutocompleteData
1684
+ ): CancelablePromise<PayeeControllerAutocompleteResponse> {
1408
1685
  return __request(OpenAPI, {
1409
1686
  method: 'GET',
1410
- url: '/api/v1/{region}/bean/commodities/{symbol}',
1687
+ url: '/api/v1/bean/payees/autocomplete',
1688
+ query: {
1689
+ q: data.q,
1690
+ limit: data.limit
1691
+ }
1692
+ });
1693
+ }
1694
+
1695
+ /**
1696
+ * Get top payees by usage
1697
+ * Returns the most frequently used payees, sorted by use count. Used for statistics and analytics.
1698
+ * @param data The data for the request.
1699
+ * @param data.limit Maximum number of results
1700
+ * @returns PayeeStatsResponseDto Top payees retrieved successfully
1701
+ * @throws ApiError
1702
+ */
1703
+ public static payeeControllerGetTopPayees(
1704
+ data: PayeeControllerGetTopPayeesData = {}
1705
+ ): CancelablePromise<PayeeControllerGetTopPayeesResponse> {
1706
+ return __request(OpenAPI, {
1707
+ method: 'GET',
1708
+ url: '/api/v1/bean/payees/top',
1709
+ query: {
1710
+ limit: data.limit
1711
+ }
1712
+ });
1713
+ }
1714
+
1715
+ /**
1716
+ * Get payee by ID
1717
+ * Returns a specific payee mapping by its UUID
1718
+ * @param data The data for the request.
1719
+ * @param data.id Payee UUID
1720
+ * @returns PayeeResponseDto Payee retrieved successfully
1721
+ * @throws ApiError
1722
+ */
1723
+ public static payeeControllerFindOne(
1724
+ data: PayeeControllerFindOneData
1725
+ ): CancelablePromise<PayeeControllerFindOneResponse> {
1726
+ return __request(OpenAPI, {
1727
+ method: 'GET',
1728
+ url: '/api/v1/bean/payees/{id}',
1729
+ path: {
1730
+ id: data.id
1731
+ },
1732
+ errors: {
1733
+ 403: 'Payee belongs to another user',
1734
+ 404: 'Payee not found'
1735
+ }
1736
+ });
1737
+ }
1738
+
1739
+ /**
1740
+ * Update payee
1741
+ * Updates a payee mapping. The payee name cannot be changed after creation.
1742
+ * @param data The data for the request.
1743
+ * @param data.id Payee UUID
1744
+ * @param data.requestBody
1745
+ * @returns PayeeResponseDto Payee updated successfully
1746
+ * @throws ApiError
1747
+ */
1748
+ public static payeeControllerUpdate(
1749
+ data: PayeeControllerUpdateData
1750
+ ): CancelablePromise<PayeeControllerUpdateResponse> {
1751
+ return __request(OpenAPI, {
1752
+ method: 'PUT',
1753
+ url: '/api/v1/bean/payees/{id}',
1754
+ path: {
1755
+ id: data.id
1756
+ },
1757
+ body: data.requestBody,
1758
+ mediaType: 'application/json',
1759
+ errors: {
1760
+ 400: 'Invalid input data',
1761
+ 404: 'Payee not found'
1762
+ }
1763
+ });
1764
+ }
1765
+
1766
+ /**
1767
+ * Delete payee
1768
+ * Soft deletes a payee by marking it as inactive. Inactive payees will not appear in autocomplete suggestions.
1769
+ * @param data The data for the request.
1770
+ * @param data.id Payee UUID
1771
+ * @returns void Payee deleted successfully
1772
+ * @throws ApiError
1773
+ */
1774
+ public static payeeControllerDelete(
1775
+ data: PayeeControllerDeleteData
1776
+ ): CancelablePromise<PayeeControllerDeleteResponse> {
1777
+ return __request(OpenAPI, {
1778
+ method: 'DELETE',
1779
+ url: '/api/v1/bean/payees/{id}',
1411
1780
  path: {
1412
- symbol: data.symbol,
1413
- region: data.region
1781
+ id: data.id
1414
1782
  },
1415
1783
  errors: {
1416
- 404: 'Commodity not found'
1784
+ 404: 'Payee not found'
1417
1785
  }
1418
1786
  });
1419
1787
  }
1788
+ }
1420
1789
 
1790
+ export class AdminPayeeProfilesService {
1421
1791
  /**
1422
- * Update commodity
1423
- * Updates an existing commodity definition. Symbol cannot be changed.
1792
+ * Create payee profile (Admin only)
1793
+ * Creates a new global payee profile. The canonical name must be unique (case-insensitive).
1424
1794
  * @param data The data for the request.
1425
- * @param data.symbol Commodity symbol
1426
- * @param data.region Region code for tenant context
1427
1795
  * @param data.requestBody
1428
- * @returns CommodityResponseDto Commodity updated successfully
1796
+ * @returns PayeeProfileResponseDto Payee profile created successfully
1429
1797
  * @throws ApiError
1430
1798
  */
1431
- public static commodityControllerUpdate(
1432
- data: CommodityControllerUpdateData
1433
- ): CancelablePromise<CommodityControllerUpdateResponse> {
1799
+ public static payeeProfileAdminControllerCreate(
1800
+ data: PayeeProfileAdminControllerCreateData
1801
+ ): CancelablePromise<PayeeProfileAdminControllerCreateResponse> {
1434
1802
  return __request(OpenAPI, {
1435
- method: 'PUT',
1436
- url: '/api/v1/{region}/bean/commodities/{symbol}',
1437
- path: {
1438
- symbol: data.symbol,
1439
- region: data.region
1440
- },
1803
+ method: 'POST',
1804
+ url: '/api/v1/admin/payee-profiles',
1441
1805
  body: data.requestBody,
1442
1806
  mediaType: 'application/json',
1443
1807
  errors: {
1444
- 400: 'Invalid input data',
1445
- 404: 'Commodity not found'
1808
+ 400: 'Validation failed',
1809
+ 403: 'Admin access required',
1810
+ 409: 'Payee profile already exists'
1446
1811
  }
1447
1812
  });
1448
1813
  }
1449
1814
 
1450
1815
  /**
1451
- * Delete commodity
1452
- * Deletes a commodity definition
1816
+ * List payee profiles (Admin only)
1817
+ * Returns all payee profiles with optional filtering by category, country, verification status, etc.
1453
1818
  * @param data The data for the request.
1454
- * @param data.symbol Commodity symbol
1455
- * @param data.region Region code for tenant context
1456
- * @returns void Commodity deleted successfully
1819
+ * @param data.search Search term for canonical name and aliases (case-insensitive)
1820
+ * @param data.category Filter by category
1821
+ * @param data.country Filter by country (ISO 3166-1 alpha-2)
1822
+ * @param data.isActive Filter by active status (default: true - show only active)
1823
+ * @param data.verified Filter by verification status. true = verified only, false = unverified only
1824
+ * @param data.dataSource Filter by data source
1825
+ * @returns PayeeProfileListResponseDto Payee profiles retrieved successfully
1457
1826
  * @throws ApiError
1458
1827
  */
1459
- public static commodityControllerDelete(
1460
- data: CommodityControllerDeleteData
1461
- ): CancelablePromise<CommodityControllerDeleteResponse> {
1828
+ public static payeeProfileAdminControllerFindAll(
1829
+ data: PayeeProfileAdminControllerFindAllData = {}
1830
+ ): CancelablePromise<PayeeProfileAdminControllerFindAllResponse> {
1462
1831
  return __request(OpenAPI, {
1463
- method: 'DELETE',
1464
- url: '/api/v1/{region}/bean/commodities/{symbol}',
1465
- path: {
1466
- symbol: data.symbol,
1467
- region: data.region
1832
+ method: 'GET',
1833
+ url: '/api/v1/admin/payee-profiles',
1834
+ query: {
1835
+ search: data.search,
1836
+ category: data.category,
1837
+ country: data.country,
1838
+ isActive: data.isActive,
1839
+ verified: data.verified,
1840
+ dataSource: data.dataSource
1468
1841
  },
1469
1842
  errors: {
1470
- 404: 'Commodity not found'
1843
+ 403: 'Admin access required'
1471
1844
  }
1472
1845
  });
1473
1846
  }
1474
1847
 
1475
1848
  /**
1476
- * Ensure commodity exists
1477
- * Gets existing commodity or creates it with automatic initialization from OpenBB
1849
+ * Get payee profile by ID (Admin only)
1850
+ * Returns a single payee profile by its ID.
1478
1851
  * @param data The data for the request.
1479
- * @param data.symbol Commodity symbol
1480
- * @param data.region Region code for tenant context
1481
- * @returns CommodityResponseDto Commodity retrieved or created
1852
+ * @param data.id Payee profile ID (UUID)
1853
+ * @returns PayeeProfileResponseDto Payee profile retrieved successfully
1482
1854
  * @throws ApiError
1483
1855
  */
1484
- public static commodityControllerGetOrCreate(
1485
- data: CommodityControllerGetOrCreateData
1486
- ): CancelablePromise<CommodityControllerGetOrCreateResponse> {
1856
+ public static payeeProfileAdminControllerFindOne(
1857
+ data: PayeeProfileAdminControllerFindOneData
1858
+ ): CancelablePromise<PayeeProfileAdminControllerFindOneResponse> {
1487
1859
  return __request(OpenAPI, {
1488
- method: 'POST',
1489
- url: '/api/v1/{region}/bean/commodities/{symbol}/ensure',
1860
+ method: 'GET',
1861
+ url: '/api/v1/admin/payee-profiles/{id}',
1490
1862
  path: {
1491
- symbol: data.symbol,
1492
- region: data.region
1863
+ id: data.id
1864
+ },
1865
+ errors: {
1866
+ 403: 'Admin access required',
1867
+ 404: 'Payee profile not found'
1493
1868
  }
1494
1869
  });
1495
1870
  }
1496
1871
 
1497
1872
  /**
1498
- * Bulk create commodities
1499
- * Creates multiple commodities from a list of symbols, useful for initialization
1873
+ * Update payee profile (Admin only)
1874
+ * Updates an existing payee profile. The canonical name cannot be changed.
1500
1875
  * @param data The data for the request.
1501
- * @param data.region Region code for tenant context
1502
- * @returns CommodityResponseDto Commodities created successfully
1876
+ * @param data.id Payee profile ID (UUID)
1877
+ * @param data.requestBody
1878
+ * @returns PayeeProfileResponseDto Payee profile updated successfully
1503
1879
  * @throws ApiError
1504
1880
  */
1505
- public static commodityControllerBulkCreate(
1506
- data: CommodityControllerBulkCreateData
1507
- ): CancelablePromise<CommodityControllerBulkCreateResponse> {
1881
+ public static payeeProfileAdminControllerUpdate(
1882
+ data: PayeeProfileAdminControllerUpdateData
1883
+ ): CancelablePromise<PayeeProfileAdminControllerUpdateResponse> {
1508
1884
  return __request(OpenAPI, {
1509
- method: 'POST',
1510
- url: '/api/v1/{region}/bean/commodities/bulk',
1885
+ method: 'PUT',
1886
+ url: '/api/v1/admin/payee-profiles/{id}',
1511
1887
  path: {
1512
- region: data.region
1888
+ id: data.id
1889
+ },
1890
+ body: data.requestBody,
1891
+ mediaType: 'application/json',
1892
+ errors: {
1893
+ 403: 'Admin access required',
1894
+ 404: 'Payee profile not found'
1513
1895
  }
1514
1896
  });
1515
1897
  }
1516
- }
1517
1898
 
1518
- export class RecurringRulesService {
1519
1899
  /**
1520
- * Create a new recurring rule
1521
- * Creates a new recurring transaction rule for the authenticated user
1900
+ * Soft delete payee profile (Admin only)
1901
+ * Marks a payee profile as inactive (soft delete). The profile cannot be deleted if it is referenced by user payees.
1522
1902
  * @param data The data for the request.
1523
- * @param data.region Region code for tenant context
1524
- * @param data.requestBody
1525
- * @returns RecurringRuleResponseDto Rule created successfully
1903
+ * @param data.id Payee profile ID (UUID)
1904
+ * @returns void Payee profile deleted successfully
1526
1905
  * @throws ApiError
1527
1906
  */
1528
- public static recurringRuleControllerCreate(
1529
- data: RecurringRuleControllerCreateData
1530
- ): CancelablePromise<RecurringRuleControllerCreateResponse> {
1907
+ public static payeeProfileAdminControllerDelete(
1908
+ data: PayeeProfileAdminControllerDeleteData
1909
+ ): CancelablePromise<PayeeProfileAdminControllerDeleteResponse> {
1531
1910
  return __request(OpenAPI, {
1532
- method: 'POST',
1533
- url: '/api/v1/{region}/bean/recurring-rules',
1911
+ method: 'DELETE',
1912
+ url: '/api/v1/admin/payee-profiles/{id}',
1534
1913
  path: {
1535
- region: data.region
1914
+ id: data.id
1536
1915
  },
1537
- body: data.requestBody,
1538
- mediaType: 'application/json',
1539
1916
  errors: {
1540
- 400: 'Invalid input data (e.g., autoCreate without accounts)',
1541
- 409: 'Rule with same name already exists'
1917
+ 403: 'Admin access required',
1918
+ 404: 'Payee profile not found',
1919
+ 409: 'Payee profile is in use and cannot be deleted'
1542
1920
  }
1543
1921
  });
1544
1922
  }
1545
1923
 
1546
1924
  /**
1547
- * List recurring rules
1548
- * Returns all recurring rules for the authenticated user with optional filtering
1925
+ * Verify payee profile (Admin only)
1926
+ * Marks a payee profile as verified by setting verifiedAt to current timestamp.
1549
1927
  * @param data The data for the request.
1550
- * @param data.region Region code for tenant context
1551
- * @param data.isActive Filter by active status
1552
- * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
1553
- * @param data.hasAutoCreate Filter by autoCreate enabled
1554
- * @returns RecurringRuleResponseDto Rules retrieved successfully
1928
+ * @param data.id Payee profile ID (UUID)
1929
+ * @returns PayeeProfileResponseDto Payee profile verified successfully
1555
1930
  * @throws ApiError
1556
1931
  */
1557
- public static recurringRuleControllerFindAll(
1558
- data: RecurringRuleControllerFindAllData
1559
- ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
1932
+ public static payeeProfileAdminControllerVerify(
1933
+ data: PayeeProfileAdminControllerVerifyData
1934
+ ): CancelablePromise<PayeeProfileAdminControllerVerifyResponse> {
1560
1935
  return __request(OpenAPI, {
1561
- method: 'GET',
1562
- url: '/api/v1/{region}/bean/recurring-rules',
1936
+ method: 'POST',
1937
+ url: '/api/v1/admin/payee-profiles/{id}/verify',
1563
1938
  path: {
1564
- region: data.region
1939
+ id: data.id
1565
1940
  },
1566
- query: {
1567
- isActive: data.isActive,
1568
- frequency: data.frequency,
1569
- hasAutoCreate: data.hasAutoCreate
1941
+ errors: {
1942
+ 403: 'Admin access required',
1943
+ 404: 'Payee profile not found'
1570
1944
  }
1571
1945
  });
1572
1946
  }
1573
1947
 
1574
1948
  /**
1575
- * Create recurring rule from transaction
1576
- * Auto-creates a recurring rule using transaction data. User only confirms frequency.
1949
+ * Unverify payee profile (Admin only)
1950
+ * Removes verification status by setting verifiedAt to null.
1577
1951
  * @param data The data for the request.
1578
- * @param data.transactionId Source transaction ID
1579
- * @param data.region Region code for tenant context
1580
- * @param data.requestBody
1581
- * @returns RecurringRuleResponseDto Rule created successfully
1952
+ * @param data.id Payee profile ID (UUID)
1953
+ * @returns void Payee profile unverified successfully
1582
1954
  * @throws ApiError
1583
1955
  */
1584
- public static recurringRuleControllerCreateFromTransaction(
1585
- data: RecurringRuleControllerCreateFromTransactionData
1586
- ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
1956
+ public static payeeProfileAdminControllerUnverify(
1957
+ data: PayeeProfileAdminControllerUnverifyData
1958
+ ): CancelablePromise<PayeeProfileAdminControllerUnverifyResponse> {
1587
1959
  return __request(OpenAPI, {
1588
- method: 'POST',
1589
- url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
1960
+ method: 'DELETE',
1961
+ url: '/api/v1/admin/payee-profiles/{id}/verify',
1590
1962
  path: {
1591
- transactionId: data.transactionId,
1592
- region: data.region
1963
+ id: data.id
1593
1964
  },
1594
- body: data.requestBody,
1595
- mediaType: 'application/json',
1596
1965
  errors: {
1597
- 404: 'Transaction not found',
1598
- 409: 'Rule with same name already exists or transaction already linked'
1966
+ 403: 'Admin access required',
1967
+ 404: 'Payee profile not found'
1599
1968
  }
1600
1969
  });
1601
1970
  }
1971
+ }
1602
1972
 
1973
+ export class PayeeProfilesService {
1603
1974
  /**
1604
- * Get recurring rule by ID
1605
- * Returns a specific recurring rule with its details
1606
- * @param data The data for the request.
1607
- * @param data.id Rule ID
1608
- * @param data.region Region code for tenant context
1609
- * @returns RecurringRuleResponseDto Rule retrieved successfully
1975
+ * List active payee profiles (directory dump)
1976
+ * Returns the full active PayeeProfile set as a trimmed projection for client-side dictionary caching. Aliases are verbatim as stored; clients normalize on their side.
1977
+ * @returns PayeeProfileDirectoryResponseDto Active payee profiles
1610
1978
  * @throws ApiError
1611
1979
  */
1612
- public static recurringRuleControllerFindOne(
1613
- data: RecurringRuleControllerFindOneData
1614
- ): CancelablePromise<RecurringRuleControllerFindOneResponse> {
1980
+ public static payeeProfileControllerListActive(): CancelablePromise<PayeeProfileControllerListActiveResponse> {
1615
1981
  return __request(OpenAPI, {
1616
1982
  method: 'GET',
1617
- url: '/api/v1/{region}/bean/recurring-rules/{id}',
1618
- path: {
1619
- id: data.id,
1620
- region: data.region
1621
- },
1983
+ url: '/api/v1/bean/payee-profiles',
1622
1984
  errors: {
1623
- 404: 'Rule not found'
1985
+ 401: 'Missing or invalid token'
1624
1986
  }
1625
1987
  });
1626
1988
  }
1989
+ }
1627
1990
 
1991
+ export class BeanCommoditiesService {
1628
1992
  /**
1629
- * Update recurring rule
1630
- * Updates an existing recurring rule
1993
+ * Create a new commodity
1994
+ * Creates a new commodity definition for the authenticated user
1631
1995
  * @param data The data for the request.
1632
- * @param data.id Rule ID
1633
1996
  * @param data.region Region code for tenant context
1634
1997
  * @param data.requestBody
1635
- * @returns RecurringRuleResponseDto Rule updated successfully
1998
+ * @returns CommodityResponseDto Commodity created successfully
1636
1999
  * @throws ApiError
1637
2000
  */
1638
- public static recurringRuleControllerUpdate(
1639
- data: RecurringRuleControllerUpdateData
1640
- ): CancelablePromise<RecurringRuleControllerUpdateResponse> {
2001
+ public static commodityControllerCreate(
2002
+ data: CommodityControllerCreateData
2003
+ ): CancelablePromise<CommodityControllerCreateResponse> {
1641
2004
  return __request(OpenAPI, {
1642
- method: 'PATCH',
1643
- url: '/api/v1/{region}/bean/recurring-rules/{id}',
2005
+ method: 'POST',
2006
+ url: '/api/v1/{region}/bean/commodities',
1644
2007
  path: {
1645
- id: data.id,
1646
2008
  region: data.region
1647
2009
  },
1648
2010
  body: data.requestBody,
1649
2011
  mediaType: 'application/json',
1650
2012
  errors: {
1651
2013
  400: 'Invalid input data',
1652
- 404: 'Rule not found'
2014
+ 409: 'Commodity already exists'
1653
2015
  }
1654
2016
  });
1655
2017
  }
1656
2018
 
1657
2019
  /**
1658
- * Delete recurring rule
1659
- * Soft deletes a recurring rule (sets isActive to false)
2020
+ * List user commodities
2021
+ * Returns all commodity definitions for the authenticated user with optional filtering
1660
2022
  * @param data The data for the request.
1661
- * @param data.id Rule ID
1662
2023
  * @param data.region Region code for tenant context
1663
- * @returns void Rule deleted successfully
2024
+ * @param data.search Search term for symbol or metadata fields (partial match). Searches symbol and metadata.name.
2025
+ * @param data.symbol Filter by exact symbol match
2026
+ * @returns CommodityListResponseDto Commodities retrieved successfully
1664
2027
  * @throws ApiError
1665
2028
  */
1666
- public static recurringRuleControllerDelete(
1667
- data: RecurringRuleControllerDeleteData
1668
- ): CancelablePromise<RecurringRuleControllerDeleteResponse> {
2029
+ public static commodityControllerFindAll(
2030
+ data: CommodityControllerFindAllData
2031
+ ): CancelablePromise<CommodityControllerFindAllResponse> {
1669
2032
  return __request(OpenAPI, {
1670
- method: 'DELETE',
1671
- url: '/api/v1/{region}/bean/recurring-rules/{id}',
2033
+ method: 'GET',
2034
+ url: '/api/v1/{region}/bean/commodities',
1672
2035
  path: {
1673
- id: data.id,
1674
2036
  region: data.region
1675
2037
  },
1676
- errors: {
1677
- 404: 'Rule not found'
2038
+ query: {
2039
+ search: data.search,
2040
+ symbol: data.symbol
1678
2041
  }
1679
2042
  });
1680
2043
  }
1681
2044
 
1682
2045
  /**
1683
- * Get rule with statistics
1684
- * Returns a rule with pending/overdue counts and next expected date
2046
+ * Get commodity by symbol
2047
+ * Returns a specific commodity definition by its symbol
1685
2048
  * @param data The data for the request.
1686
- * @param data.id Rule ID
2049
+ * @param data.symbol Commodity symbol
1687
2050
  * @param data.region Region code for tenant context
1688
- * @returns RecurringRuleWithStatsResponseDto Rule with stats retrieved successfully
2051
+ * @returns CommodityResponseDto Commodity retrieved successfully
1689
2052
  * @throws ApiError
1690
2053
  */
1691
- public static recurringRuleControllerGetWithStats(
1692
- data: RecurringRuleControllerGetWithStatsData
1693
- ): CancelablePromise<RecurringRuleControllerGetWithStatsResponse> {
2054
+ public static commodityControllerFindOne(
2055
+ data: CommodityControllerFindOneData
2056
+ ): CancelablePromise<CommodityControllerFindOneResponse> {
1694
2057
  return __request(OpenAPI, {
1695
2058
  method: 'GET',
1696
- url: '/api/v1/{region}/bean/recurring-rules/{id}/stats',
2059
+ url: '/api/v1/{region}/bean/commodities/{symbol}',
1697
2060
  path: {
1698
- id: data.id,
2061
+ symbol: data.symbol,
1699
2062
  region: data.region
1700
2063
  },
1701
2064
  errors: {
1702
- 404: 'Rule not found'
2065
+ 404: 'Commodity not found'
1703
2066
  }
1704
2067
  });
1705
2068
  }
1706
- }
1707
2069
 
1708
- export class ExpectedTransactionsService {
1709
2070
  /**
1710
- * List expected transactions
1711
- * Returns expected transactions for the authenticated user with optional filtering
2071
+ * Update commodity
2072
+ * Updates an existing commodity definition. Symbol cannot be changed.
1712
2073
  * @param data The data for the request.
2074
+ * @param data.symbol Commodity symbol
1713
2075
  * @param data.region Region code for tenant context
1714
- * @param data.ruleId Filter by recurring rule ID
1715
- * @param data.status Filter by status (PENDING, COMPLETED, SKIPPED)
1716
- * @param data.fromDate Filter by date range start (YYYY-MM-DD)
1717
- * @param data.toDate Filter by date range end (YYYY-MM-DD)
1718
- * @returns ExpectedTransactionListResponseDto Expected transactions retrieved successfully
2076
+ * @param data.requestBody
2077
+ * @returns CommodityResponseDto Commodity updated successfully
1719
2078
  * @throws ApiError
1720
2079
  */
1721
- public static expectedTransactionControllerFindAll(
1722
- data: ExpectedTransactionControllerFindAllData
1723
- ): CancelablePromise<ExpectedTransactionControllerFindAllResponse> {
2080
+ public static commodityControllerUpdate(
2081
+ data: CommodityControllerUpdateData
2082
+ ): CancelablePromise<CommodityControllerUpdateResponse> {
1724
2083
  return __request(OpenAPI, {
1725
- method: 'GET',
1726
- url: '/api/v1/{region}/bean/expected-transactions',
2084
+ method: 'PUT',
2085
+ url: '/api/v1/{region}/bean/commodities/{symbol}',
1727
2086
  path: {
2087
+ symbol: data.symbol,
1728
2088
  region: data.region
1729
2089
  },
1730
- query: {
1731
- ruleId: data.ruleId,
1732
- status: data.status,
1733
- fromDate: data.fromDate,
1734
- toDate: data.toDate
2090
+ body: data.requestBody,
2091
+ mediaType: 'application/json',
2092
+ errors: {
2093
+ 400: 'Invalid input data',
2094
+ 404: 'Commodity not found'
1735
2095
  }
1736
2096
  });
1737
2097
  }
1738
2098
 
1739
2099
  /**
1740
- * List overdue expected transactions
1741
- * Returns all overdue expected transactions (PENDING past tolerance)
2100
+ * Delete commodity
2101
+ * Deletes a commodity definition
1742
2102
  * @param data The data for the request.
2103
+ * @param data.symbol Commodity symbol
1743
2104
  * @param data.region Region code for tenant context
1744
- * @returns ExpectedTransactionListResponseDto Overdue transactions retrieved successfully
2105
+ * @returns void Commodity deleted successfully
1745
2106
  * @throws ApiError
1746
2107
  */
1747
- public static expectedTransactionControllerFindOverdue(
1748
- data: ExpectedTransactionControllerFindOverdueData
1749
- ): CancelablePromise<ExpectedTransactionControllerFindOverdueResponse> {
2108
+ public static commodityControllerDelete(
2109
+ data: CommodityControllerDeleteData
2110
+ ): CancelablePromise<CommodityControllerDeleteResponse> {
1750
2111
  return __request(OpenAPI, {
1751
- method: 'GET',
1752
- url: '/api/v1/{region}/bean/expected-transactions/overdue',
2112
+ method: 'DELETE',
2113
+ url: '/api/v1/{region}/bean/commodities/{symbol}',
1753
2114
  path: {
2115
+ symbol: data.symbol,
1754
2116
  region: data.region
2117
+ },
2118
+ errors: {
2119
+ 404: 'Commodity not found'
1755
2120
  }
1756
2121
  });
1757
2122
  }
1758
2123
 
1759
2124
  /**
1760
- * Get expected transaction by ID
1761
- * Returns a specific expected transaction with rule details
2125
+ * Ensure commodity exists
2126
+ * Gets existing commodity or creates it with automatic initialization from OpenBB
1762
2127
  * @param data The data for the request.
1763
- * @param data.id Expected transaction ID
2128
+ * @param data.symbol Commodity symbol
1764
2129
  * @param data.region Region code for tenant context
1765
- * @returns ExpectedTransactionResponseDto Expected transaction retrieved successfully
2130
+ * @returns CommodityResponseDto Commodity retrieved or created
1766
2131
  * @throws ApiError
1767
2132
  */
1768
- public static expectedTransactionControllerFindOne(
1769
- data: ExpectedTransactionControllerFindOneData
1770
- ): CancelablePromise<ExpectedTransactionControllerFindOneResponse> {
2133
+ public static commodityControllerGetOrCreate(
2134
+ data: CommodityControllerGetOrCreateData
2135
+ ): CancelablePromise<CommodityControllerGetOrCreateResponse> {
1771
2136
  return __request(OpenAPI, {
1772
- method: 'GET',
1773
- url: '/api/v1/{region}/bean/expected-transactions/{id}',
2137
+ method: 'POST',
2138
+ url: '/api/v1/{region}/bean/commodities/{symbol}/ensure',
1774
2139
  path: {
1775
- id: data.id,
2140
+ symbol: data.symbol,
1776
2141
  region: data.region
1777
- },
1778
- errors: {
1779
- 404: 'Expected transaction not found'
1780
2142
  }
1781
2143
  });
1782
2144
  }
1783
2145
 
1784
2146
  /**
1785
- * Skip expected transaction
1786
- * Marks an expected transaction as skipped (PENDING -> SKIPPED)
2147
+ * Bulk create commodities
2148
+ * Creates multiple commodities from a list of symbols, useful for initialization
1787
2149
  * @param data The data for the request.
1788
- * @param data.id Expected transaction ID
1789
2150
  * @param data.region Region code for tenant context
1790
- * @returns ExpectedTransactionResponseDto Expected transaction skipped successfully
2151
+ * @returns CommodityResponseDto Commodities created successfully
1791
2152
  * @throws ApiError
1792
2153
  */
1793
- public static expectedTransactionControllerSkip(
1794
- data: ExpectedTransactionControllerSkipData
1795
- ): CancelablePromise<ExpectedTransactionControllerSkipResponse> {
2154
+ public static commodityControllerBulkCreate(
2155
+ data: CommodityControllerBulkCreateData
2156
+ ): CancelablePromise<CommodityControllerBulkCreateResponse> {
1796
2157
  return __request(OpenAPI, {
1797
2158
  method: 'POST',
1798
- url: '/api/v1/{region}/bean/expected-transactions/{id}/skip',
2159
+ url: '/api/v1/{region}/bean/commodities/bulk',
1799
2160
  path: {
1800
- id: data.id,
1801
2161
  region: data.region
1802
- },
1803
- errors: {
1804
- 400: 'Cannot skip - not in PENDING status',
1805
- 404: 'Expected transaction not found'
1806
2162
  }
1807
2163
  });
1808
2164
  }
2165
+ }
1809
2166
 
2167
+ export class ReportingService {
1810
2168
  /**
1811
- * Undo skip
1812
- * Reverses a skip operation (SKIPPED -> PENDING)
2169
+ * Get portfolio value trends
2170
+ *
2171
+ * Returns time series data of portfolio net worth.
2172
+ *
2173
+ * **Multi-currency Support:**
2174
+ * - `series[].byCurrency` - Currency breakdown for each data point
2175
+ * - `byCurrency` - Separate time series grouped by currency
2176
+ * - `warnings` - Exchange rate warnings if conversion failed
2177
+ *
2178
+ * **Parameters:**
2179
+ * - `period`: Time period (1m, 3m, 6m, 1y)
2180
+ * - `granularity`: Data granularity (day, week, month)
2181
+ *
1813
2182
  * @param data The data for the request.
1814
- * @param data.id Expected transaction ID
1815
2183
  * @param data.region Region code for tenant context
1816
- * @returns ExpectedTransactionResponseDto Skip undone successfully
2184
+ * @param data.period Time period
2185
+ * @param data.granularity Data granularity
2186
+ * @returns PortfolioTrendsResponseDto Trends retrieved successfully
1817
2187
  * @throws ApiError
1818
2188
  */
1819
- public static expectedTransactionControllerUndoSkip(
1820
- data: ExpectedTransactionControllerUndoSkipData
1821
- ): CancelablePromise<ExpectedTransactionControllerUndoSkipResponse> {
2189
+ public static reportingControllerGetPortfolioTrends(
2190
+ data: ReportingControllerGetPortfolioTrendsData
2191
+ ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
1822
2192
  return __request(OpenAPI, {
1823
- method: 'DELETE',
1824
- url: '/api/v1/{region}/bean/expected-transactions/{id}/skip',
2193
+ method: 'GET',
2194
+ url: '/api/v1/{region}/reporting/portfolio/trends',
1825
2195
  path: {
1826
- id: data.id,
1827
2196
  region: data.region
1828
2197
  },
2198
+ query: {
2199
+ period: data.period,
2200
+ granularity: data.granularity
2201
+ },
1829
2202
  errors: {
1830
- 400: 'Cannot undo - not in SKIPPED status',
1831
- 404: 'Expected transaction not found'
2203
+ 401: 'User not authenticated'
1832
2204
  }
1833
2205
  });
1834
2206
  }
1835
2207
 
1836
2208
  /**
1837
- * Confirm transaction match
1838
- * Manually matches an expected transaction with an actual transaction
2209
+ * Get cash-flow trends
2210
+ *
2211
+ * Monthly income / expense / netSavings over a fixed N-month window
2212
+ * (current month + N−1 prior). Missing months are zero-filled (flow metric).
2213
+ *
2214
+ * **Parameters:**
2215
+ * - `period`: 1m | 3m | 6m | 1y (default 6m)
2216
+ * - `granularity`: accepted for API symmetry; v1 returns month buckets
2217
+ *
1839
2218
  * @param data The data for the request.
1840
- * @param data.id Expected transaction ID
1841
2219
  * @param data.region Region code for tenant context
1842
- * @param data.requestBody
1843
- * @returns unknown Match confirmed successfully
2220
+ * @param data.period Time period
2221
+ * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
2222
+ * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
1844
2223
  * @throws ApiError
1845
2224
  */
1846
- public static expectedTransactionControllerConfirmMatch(
1847
- data: ExpectedTransactionControllerConfirmMatchData
1848
- ): CancelablePromise<ExpectedTransactionControllerConfirmMatchResponse> {
2225
+ public static reportingControllerGetCashFlowTrends(
2226
+ data: ReportingControllerGetCashFlowTrendsData
2227
+ ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
1849
2228
  return __request(OpenAPI, {
1850
- method: 'POST',
1851
- url: '/api/v1/{region}/bean/expected-transactions/{id}/match',
2229
+ method: 'GET',
2230
+ url: '/api/v1/{region}/reporting/cash-flow/trends',
1852
2231
  path: {
1853
- id: data.id,
1854
2232
  region: data.region
1855
2233
  },
1856
- body: data.requestBody,
1857
- mediaType: 'application/json',
2234
+ query: {
2235
+ period: data.period,
2236
+ granularity: data.granularity
2237
+ },
1858
2238
  errors: {
1859
- 400: 'Cannot match - not in PENDING status',
1860
- 404: 'Expected or actual transaction not found',
1861
- 409: 'Actual transaction already matched to another rule'
2239
+ 401: 'User not authenticated'
1862
2240
  }
1863
2241
  });
1864
2242
  }
1865
2243
 
1866
2244
  /**
1867
- * Unmatch transaction
1868
- * Removes the match between expected and actual transaction (COMPLETED -> PENDING)
2245
+ * Generate portfolio snapshot
2246
+ *
2247
+ * Manually generate a portfolio snapshot for a specific date.
2248
+ *
2249
+ * **Multi-currency Support:**
2250
+ * - Fetches balances grouped by currency
2251
+ * - Uses user's baseCurrency setting for conversion
2252
+ * - Stores exchange rates and warnings
2253
+ *
2254
+ * **Use Cases:**
2255
+ * - Testing snapshot generation
2256
+ * - Force regeneration after data correction
2257
+ * - Initial setup for new users
2258
+ *
1869
2259
  * @param data The data for the request.
1870
- * @param data.id Expected transaction ID
1871
2260
  * @param data.region Region code for tenant context
1872
- * @returns unknown Match removed successfully
2261
+ * @param data.requestBody Optional date (defaults to today)
2262
+ * @returns GenerateSnapshotResponse Snapshot generated successfully
1873
2263
  * @throws ApiError
1874
2264
  */
1875
- public static expectedTransactionControllerUnmatch(
1876
- data: ExpectedTransactionControllerUnmatchData
1877
- ): CancelablePromise<ExpectedTransactionControllerUnmatchResponse> {
2265
+ public static reportingControllerGenerateSnapshot(
2266
+ data: ReportingControllerGenerateSnapshotData
2267
+ ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
1878
2268
  return __request(OpenAPI, {
1879
- method: 'DELETE',
1880
- url: '/api/v1/{region}/bean/expected-transactions/{id}/match',
2269
+ method: 'POST',
2270
+ url: '/api/v1/{region}/reporting/snapshots/generate',
1881
2271
  path: {
1882
- id: data.id,
1883
2272
  region: data.region
1884
2273
  },
2274
+ body: data.requestBody,
2275
+ mediaType: 'application/json',
1885
2276
  errors: {
1886
- 400: 'Cannot unmatch - not in COMPLETED status',
1887
- 404: 'Expected transaction not found'
2277
+ 400: 'Invalid date format',
2278
+ 401: 'User not authenticated'
1888
2279
  }
1889
2280
  });
1890
2281
  }
1891
2282
 
1892
2283
  /**
1893
- * Enter Now
1894
- * Creates an actual transaction for an expected transaction (YNAB-style Enter Now)
2284
+ * Backfill portfolio snapshots
2285
+ *
2286
+ * Generate snapshots for a date range (historical data backfill).
2287
+ *
2288
+ * **Multi-currency Support:**
2289
+ * - Each snapshot includes multi-currency data
2290
+ * - Uses exchange rates available at generation time
2291
+ * - Warnings stored for missing exchange rates
2292
+ *
2293
+ * **Best Practices:**
2294
+ * - Use for initial setup after account configuration
2295
+ * - Run during low-traffic periods for large date ranges
2296
+ * - Existing snapshots are skipped (not regenerated)
2297
+ *
1895
2298
  * @param data The data for the request.
1896
- * @param data.id Expected transaction ID
1897
2299
  * @param data.region Region code for tenant context
1898
2300
  * @param data.requestBody
1899
- * @returns unknown Transaction created successfully
2301
+ * @returns BackfillSnapshotsResponse Backfill completed successfully
1900
2302
  * @throws ApiError
1901
2303
  */
1902
- public static expectedTransactionControllerEnterNow(
1903
- data: ExpectedTransactionControllerEnterNowData
1904
- ): CancelablePromise<ExpectedTransactionControllerEnterNowResponse> {
2304
+ public static reportingControllerBackfillSnapshots(
2305
+ data: ReportingControllerBackfillSnapshotsData
2306
+ ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
1905
2307
  return __request(OpenAPI, {
1906
2308
  method: 'POST',
1907
- url: '/api/v1/{region}/bean/expected-transactions/{id}/enter',
2309
+ url: '/api/v1/{region}/reporting/snapshots/backfill',
1908
2310
  path: {
1909
- id: data.id,
1910
2311
  region: data.region
1911
2312
  },
1912
2313
  body: data.requestBody,
1913
2314
  mediaType: 'application/json',
1914
2315
  errors: {
1915
- 400: 'Cannot enter - not in PENDING status or missing accounts',
1916
- 404: 'Expected transaction or accounts not found'
2316
+ 400: 'Invalid date format or range',
2317
+ 401: 'User not authenticated',
2318
+ 409: 'Backfill already in progress for this user'
1917
2319
  }
1918
2320
  });
1919
2321
  }
1920
2322
  }
1921
2323
 
1922
- export class RecurringForecastService {
2324
+ export class BeanPricesService {
1923
2325
  /**
1924
- * Get cash flow forecast
1925
- * Returns predicted outflows for the next N months based on active recurring rules
2326
+ * Create a new price
2327
+ * Creates a new price entry for the authenticated user
1926
2328
  * @param data The data for the request.
1927
2329
  * @param data.region Region code for tenant context
1928
- * @param data.months Number of months to forecast (1-12, default 3)
1929
- * @returns ForecastResponseDto Forecast retrieved successfully
2330
+ * @param data.requestBody
2331
+ * @returns PriceResponseDto Price created successfully
1930
2332
  * @throws ApiError
1931
2333
  */
1932
- public static forecastControllerGetForecast(
1933
- data: ForecastControllerGetForecastData
1934
- ): CancelablePromise<ForecastControllerGetForecastResponse> {
2334
+ public static priceControllerCreate(
2335
+ data: PriceControllerCreateData
2336
+ ): CancelablePromise<PriceControllerCreateResponse> {
1935
2337
  return __request(OpenAPI, {
1936
- method: 'GET',
1937
- url: '/api/v1/{region}/bean/recurring/forecast',
2338
+ method: 'POST',
2339
+ url: '/api/v1/{region}/bean/prices',
1938
2340
  path: {
1939
2341
  region: data.region
1940
2342
  },
1941
- query: {
1942
- months: data.months
2343
+ body: data.requestBody,
2344
+ mediaType: 'application/json',
2345
+ errors: {
2346
+ 404: 'Currency or quoteCurrency commodity not found',
2347
+ 409: 'Price already exists for this currency pair and date'
1943
2348
  }
1944
2349
  });
1945
2350
  }
1946
- }
1947
2351
 
1948
- export class BeanTransactionRulesService {
1949
2352
  /**
1950
- * Create a new transaction rule (or upsert if upsertByPayee=true)
1951
- * Creates a new rule. If upsertByPayee=true, updates existing rule matching payeeKeywords[0] instead of creating duplicate.
2353
+ * List user prices
2354
+ * Returns all price entries for the authenticated user with optional filtering
1952
2355
  * @param data The data for the request.
1953
2356
  * @param data.region Region code for tenant context
1954
- * @param data.requestBody
1955
- * @returns TransactionRuleResponseDto Rule updated successfully (upsert mode)
2357
+ * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
2358
+ * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
2359
+ * @param data.dateFrom Filter prices from this date (ISO 8601 format)
2360
+ * @param data.dateTo Filter prices to this date (ISO 8601 format)
2361
+ * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
2362
+ * @param data.page Page number for pagination (default: 1)
2363
+ * @param data.limit Number of items per page (default: 20, max: 100)
2364
+ * @returns PriceListResponseDto Prices retrieved successfully
1956
2365
  * @throws ApiError
1957
2366
  */
1958
- public static transactionRuleControllerCreate(
1959
- data: TransactionRuleControllerCreateData
1960
- ): CancelablePromise<TransactionRuleControllerCreateResponse> {
2367
+ public static priceControllerFindAll(
2368
+ data: PriceControllerFindAllData
2369
+ ): CancelablePromise<PriceControllerFindAllResponse> {
1961
2370
  return __request(OpenAPI, {
1962
- method: 'POST',
1963
- url: '/api/v1/{region}/bean/transaction-rules',
2371
+ method: 'GET',
2372
+ url: '/api/v1/{region}/bean/prices',
1964
2373
  path: {
1965
2374
  region: data.region
1966
2375
  },
1967
- body: data.requestBody,
1968
- mediaType: 'application/json',
1969
- errors: {
1970
- 400: 'Validation failed',
1971
- 401: 'Unauthorized',
1972
- 409: 'Resource conflict - another process is updating this rule'
2376
+ query: {
2377
+ currency: data.currency,
2378
+ quoteCurrency: data.quoteCurrency,
2379
+ dateFrom: data.dateFrom,
2380
+ dateTo: data.dateTo,
2381
+ search: data.search,
2382
+ page: data.page,
2383
+ limit: data.limit
1973
2384
  }
1974
2385
  });
1975
2386
  }
1976
2387
 
1977
2388
  /**
1978
- * Get all transaction rules for user
2389
+ * Get price by ID
2390
+ * Returns a single price entry by its ID
1979
2391
  * @param data The data for the request.
2392
+ * @param data.id Price ID
1980
2393
  * @param data.region Region code for tenant context
1981
- * @param data.limit Max results per page (default: 20, max: 100)
1982
- * @param data.offset Pagination offset (default: 0)
1983
- * @param data.enabled Filter by enabled status
1984
- * @param data.learningSource Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
1985
- * @param data.autoApplyEnabled Filter by auto-apply status
1986
- * @returns TransactionRuleListResponseDto List of rules
2394
+ * @returns PriceResponseDto Price retrieved successfully
1987
2395
  * @throws ApiError
1988
2396
  */
1989
- public static transactionRuleControllerList(
1990
- data: TransactionRuleControllerListData
1991
- ): CancelablePromise<TransactionRuleControllerListResponse> {
2397
+ public static priceControllerFindOne(
2398
+ data: PriceControllerFindOneData
2399
+ ): CancelablePromise<PriceControllerFindOneResponse> {
1992
2400
  return __request(OpenAPI, {
1993
2401
  method: 'GET',
1994
- url: '/api/v1/{region}/bean/transaction-rules',
2402
+ url: '/api/v1/{region}/bean/prices/{id}',
1995
2403
  path: {
2404
+ id: data.id,
1996
2405
  region: data.region
1997
2406
  },
1998
- query: {
1999
- limit: data.limit,
2000
- offset: data.offset,
2001
- enabled: data.enabled,
2002
- learningSource: data.learningSource,
2003
- autoApplyEnabled: data.autoApplyEnabled
2004
- },
2005
2407
  errors: {
2006
- 401: 'Unauthorized'
2408
+ 404: 'Price not found'
2007
2409
  }
2008
2410
  });
2009
2411
  }
2010
2412
 
2011
2413
  /**
2012
- * Validate transaction rule configuration
2414
+ * Update a price
2415
+ * Updates an existing price entry
2013
2416
  * @param data The data for the request.
2417
+ * @param data.id Price ID
2014
2418
  * @param data.region Region code for tenant context
2015
2419
  * @param data.requestBody
2016
- * @returns ValidateRuleResponseDto Validation result
2420
+ * @returns PriceResponseDto Price updated successfully
2017
2421
  * @throws ApiError
2018
2422
  */
2019
- public static transactionRuleControllerValidate(
2020
- data: TransactionRuleControllerValidateData
2021
- ): CancelablePromise<TransactionRuleControllerValidateResponse> {
2423
+ public static priceControllerUpdate(
2424
+ data: PriceControllerUpdateData
2425
+ ): CancelablePromise<PriceControllerUpdateResponse> {
2022
2426
  return __request(OpenAPI, {
2023
- method: 'POST',
2024
- url: '/api/v1/{region}/bean/transaction-rules/validate',
2427
+ method: 'PUT',
2428
+ url: '/api/v1/{region}/bean/prices/{id}',
2025
2429
  path: {
2430
+ id: data.id,
2026
2431
  region: data.region
2027
2432
  },
2028
2433
  body: data.requestBody,
2029
2434
  mediaType: 'application/json',
2030
2435
  errors: {
2031
- 400: 'Validation failed',
2032
- 401: 'Unauthorized'
2436
+ 404: 'Price not found',
2437
+ 409: 'Updated price conflicts with existing price'
2033
2438
  }
2034
2439
  });
2035
2440
  }
2036
2441
 
2037
2442
  /**
2038
- * Bulk create transaction rules
2443
+ * Delete a price
2444
+ * Deletes a price entry (hard delete)
2039
2445
  * @param data The data for the request.
2446
+ * @param data.id Price ID
2040
2447
  * @param data.region Region code for tenant context
2041
- * @param data.requestBody
2042
- * @returns BulkCreateRulesResponseDto Bulk create completed
2448
+ * @returns void Price deleted successfully
2043
2449
  * @throws ApiError
2044
2450
  */
2045
- public static transactionRuleControllerBulkCreate(
2046
- data: TransactionRuleControllerBulkCreateData
2047
- ): CancelablePromise<TransactionRuleControllerBulkCreateResponse> {
2451
+ public static priceControllerDelete(
2452
+ data: PriceControllerDeleteData
2453
+ ): CancelablePromise<PriceControllerDeleteResponse> {
2048
2454
  return __request(OpenAPI, {
2049
- method: 'POST',
2050
- url: '/api/v1/{region}/bean/transaction-rules/bulk',
2455
+ method: 'DELETE',
2456
+ url: '/api/v1/{region}/bean/prices/{id}',
2051
2457
  path: {
2458
+ id: data.id,
2052
2459
  region: data.region
2053
2460
  },
2054
- body: data.requestBody,
2055
- mediaType: 'application/json',
2056
2461
  errors: {
2057
- 400: 'Invalid bulk create data',
2058
- 401: 'Unauthorized'
2462
+ 404: 'Price not found'
2059
2463
  }
2060
2464
  });
2061
2465
  }
2062
2466
 
2063
2467
  /**
2064
- * Export transaction rules
2468
+ * Bulk create prices
2469
+ * Creates multiple price entries at once (skips duplicates)
2065
2470
  * @param data The data for the request.
2066
- * @param data.format Export format (currently only JSON supported)
2067
2471
  * @param data.region Region code for tenant context
2068
- * @returns ExportRulesResponseDto Exported rules
2472
+ * @param data.requestBody
2473
+ * @returns PriceResponseDto Prices created successfully
2069
2474
  * @throws ApiError
2070
2475
  */
2071
- public static transactionRuleControllerExport(
2072
- data: TransactionRuleControllerExportData
2073
- ): CancelablePromise<TransactionRuleControllerExportResponse> {
2476
+ public static priceControllerBulkCreate(
2477
+ data: PriceControllerBulkCreateData
2478
+ ): CancelablePromise<PriceControllerBulkCreateResponse> {
2074
2479
  return __request(OpenAPI, {
2075
- method: 'GET',
2076
- url: '/api/v1/{region}/bean/transaction-rules/export/{format}',
2480
+ method: 'POST',
2481
+ url: '/api/v1/{region}/bean/prices/bulk',
2077
2482
  path: {
2078
- format: data.format,
2079
2483
  region: data.region
2080
2484
  },
2081
- errors: {
2082
- 400: 'Unsupported format',
2083
- 401: 'Unauthorized'
2084
- }
2485
+ body: data.requestBody,
2486
+ mediaType: 'application/json'
2085
2487
  });
2086
2488
  }
2489
+ }
2087
2490
 
2491
+ export class RecurringRulesService {
2088
2492
  /**
2089
- * Get transaction rule statistics
2493
+ * Create a new recurring rule
2494
+ * Creates a new recurring transaction rule for the authenticated user
2090
2495
  * @param data The data for the request.
2091
- * @param data.period Statistics time period
2092
2496
  * @param data.region Region code for tenant context
2093
- * @returns RuleStatisticsResponseDto Rule statistics
2497
+ * @param data.requestBody
2498
+ * @returns RecurringRuleResponseDto Rule created successfully
2094
2499
  * @throws ApiError
2095
2500
  */
2096
- public static transactionRuleControllerGetStatistics(
2097
- data: TransactionRuleControllerGetStatisticsData
2098
- ): CancelablePromise<TransactionRuleControllerGetStatisticsResponse> {
2501
+ public static recurringRuleControllerCreate(
2502
+ data: RecurringRuleControllerCreateData
2503
+ ): CancelablePromise<RecurringRuleControllerCreateResponse> {
2099
2504
  return __request(OpenAPI, {
2100
- method: 'GET',
2101
- url: '/api/v1/{region}/bean/transaction-rules/statistics/{period}',
2505
+ method: 'POST',
2506
+ url: '/api/v1/{region}/bean/recurring-rules',
2102
2507
  path: {
2103
- period: data.period,
2104
2508
  region: data.region
2105
2509
  },
2510
+ body: data.requestBody,
2511
+ mediaType: 'application/json',
2106
2512
  errors: {
2107
- 401: 'Unauthorized'
2513
+ 400: 'Invalid input data (e.g., autoCreate without accounts)',
2514
+ 409: 'Rule with same name already exists'
2108
2515
  }
2109
2516
  });
2110
2517
  }
2111
2518
 
2112
2519
  /**
2113
- * Get transaction rule detail
2520
+ * List recurring rules
2521
+ * Returns all recurring rules for the authenticated user with optional filtering
2114
2522
  * @param data The data for the request.
2115
- * @param data.ruleId Rule ID
2116
2523
  * @param data.region Region code for tenant context
2117
- * @returns TransactionRuleResponseDto Rule details
2524
+ * @param data.isActive Filter by active status
2525
+ * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
2526
+ * @param data.hasAutoCreate Filter by autoCreate enabled
2527
+ * @returns RecurringRuleResponseDto Rules retrieved successfully
2118
2528
  * @throws ApiError
2119
2529
  */
2120
- public static transactionRuleControllerGetDetail(
2121
- data: TransactionRuleControllerGetDetailData
2122
- ): CancelablePromise<TransactionRuleControllerGetDetailResponse> {
2530
+ public static recurringRuleControllerFindAll(
2531
+ data: RecurringRuleControllerFindAllData
2532
+ ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
2123
2533
  return __request(OpenAPI, {
2124
2534
  method: 'GET',
2125
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2535
+ url: '/api/v1/{region}/bean/recurring-rules',
2126
2536
  path: {
2127
- ruleId: data.ruleId,
2128
2537
  region: data.region
2129
2538
  },
2130
- errors: {
2131
- 401: 'Unauthorized',
2132
- 403: 'Forbidden - not owner of rule',
2133
- 404: 'Rule not found'
2539
+ query: {
2540
+ isActive: data.isActive,
2541
+ frequency: data.frequency,
2542
+ hasAutoCreate: data.hasAutoCreate
2134
2543
  }
2135
2544
  });
2136
2545
  }
2137
2546
 
2138
2547
  /**
2139
- * Update a transaction rule
2548
+ * Create recurring rule from transaction
2549
+ * Auto-creates a recurring rule using transaction data. User only confirms frequency.
2140
2550
  * @param data The data for the request.
2141
- * @param data.ruleId Rule ID to update
2551
+ * @param data.transactionId Source transaction ID
2142
2552
  * @param data.region Region code for tenant context
2143
2553
  * @param data.requestBody
2144
- * @returns TransactionRuleResponseDto Rule updated successfully
2554
+ * @returns RecurringRuleResponseDto Rule created successfully
2145
2555
  * @throws ApiError
2146
2556
  */
2147
- public static transactionRuleControllerUpdate(
2148
- data: TransactionRuleControllerUpdateData
2149
- ): CancelablePromise<TransactionRuleControllerUpdateResponse> {
2557
+ public static recurringRuleControllerCreateFromTransaction(
2558
+ data: RecurringRuleControllerCreateFromTransactionData
2559
+ ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
2150
2560
  return __request(OpenAPI, {
2151
- method: 'PUT',
2152
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2561
+ method: 'POST',
2562
+ url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
2153
2563
  path: {
2154
- ruleId: data.ruleId,
2564
+ transactionId: data.transactionId,
2155
2565
  region: data.region
2156
2566
  },
2157
2567
  body: data.requestBody,
2158
2568
  mediaType: 'application/json',
2159
2569
  errors: {
2160
- 400: 'Validation failed',
2161
- 401: 'Unauthorized',
2162
- 403: 'Forbidden - not owner of rule',
2163
- 404: 'Rule not found',
2164
- 409: 'Resource conflict - rule is being modified by another process'
2570
+ 404: 'Transaction not found',
2571
+ 409: 'Rule with same name already exists or transaction already linked'
2165
2572
  }
2166
2573
  });
2167
2574
  }
2168
2575
 
2169
2576
  /**
2170
- * Delete a transaction rule
2577
+ * Get recurring rule by ID
2578
+ * Returns a specific recurring rule with its details
2171
2579
  * @param data The data for the request.
2172
- * @param data.ruleId Rule ID to delete
2580
+ * @param data.id Rule ID
2173
2581
  * @param data.region Region code for tenant context
2174
- * @returns void Rule deleted successfully
2582
+ * @returns RecurringRuleResponseDto Rule retrieved successfully
2175
2583
  * @throws ApiError
2176
2584
  */
2177
- public static transactionRuleControllerDelete(
2178
- data: TransactionRuleControllerDeleteData
2179
- ): CancelablePromise<TransactionRuleControllerDeleteResponse> {
2585
+ public static recurringRuleControllerFindOne(
2586
+ data: RecurringRuleControllerFindOneData
2587
+ ): CancelablePromise<RecurringRuleControllerFindOneResponse> {
2180
2588
  return __request(OpenAPI, {
2181
- method: 'DELETE',
2182
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2589
+ method: 'GET',
2590
+ url: '/api/v1/{region}/bean/recurring-rules/{id}',
2183
2591
  path: {
2184
- ruleId: data.ruleId,
2592
+ id: data.id,
2185
2593
  region: data.region
2186
2594
  },
2187
2595
  errors: {
2188
- 401: 'Unauthorized',
2189
- 403: 'Forbidden - not owner of rule',
2190
- 404: 'Rule not found',
2191
- 409: 'Resource conflict - rule is being modified by another process'
2596
+ 404: 'Rule not found'
2192
2597
  }
2193
2598
  });
2194
2599
  }
2195
2600
 
2196
2601
  /**
2197
- * Test rule matching
2602
+ * Update recurring rule
2603
+ * Updates an existing recurring rule
2198
2604
  * @param data The data for the request.
2199
- * @param data.ruleId Rule ID to test
2605
+ * @param data.id Rule ID
2200
2606
  * @param data.region Region code for tenant context
2201
2607
  * @param data.requestBody
2202
- * @returns TestRuleResponseDto Test result
2608
+ * @returns RecurringRuleResponseDto Rule updated successfully
2203
2609
  * @throws ApiError
2204
2610
  */
2205
- public static transactionRuleControllerTest(
2206
- data: TransactionRuleControllerTestData
2207
- ): CancelablePromise<TransactionRuleControllerTestResponse> {
2611
+ public static recurringRuleControllerUpdate(
2612
+ data: RecurringRuleControllerUpdateData
2613
+ ): CancelablePromise<RecurringRuleControllerUpdateResponse> {
2208
2614
  return __request(OpenAPI, {
2209
- method: 'POST',
2210
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}/test',
2615
+ method: 'PATCH',
2616
+ url: '/api/v1/{region}/bean/recurring-rules/{id}',
2211
2617
  path: {
2212
- ruleId: data.ruleId,
2618
+ id: data.id,
2213
2619
  region: data.region
2214
2620
  },
2215
2621
  body: data.requestBody,
2216
2622
  mediaType: 'application/json',
2217
2623
  errors: {
2218
- 401: 'Unauthorized',
2219
- 403: 'Forbidden - not owner of rule',
2624
+ 400: 'Invalid input data',
2220
2625
  404: 'Rule not found'
2221
2626
  }
2222
2627
  });
2223
2628
  }
2224
- }
2225
2629
 
2226
- export class UsersService {
2227
2630
  /**
2228
- * Delete own user account
2631
+ * Delete recurring rule
2632
+ * Soft deletes a recurring rule (sets isActive to false)
2229
2633
  * @param data The data for the request.
2230
- * @param data.requestBody
2231
- * @returns void User deleted successfully
2634
+ * @param data.id Rule ID
2635
+ * @param data.region Region code for tenant context
2636
+ * @returns void Rule deleted successfully
2232
2637
  * @throws ApiError
2233
2638
  */
2234
- public static userControllerDeleteOwnUser(
2235
- data: UserControllerDeleteOwnUserData
2236
- ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
2639
+ public static recurringRuleControllerDelete(
2640
+ data: RecurringRuleControllerDeleteData
2641
+ ): CancelablePromise<RecurringRuleControllerDeleteResponse> {
2237
2642
  return __request(OpenAPI, {
2238
2643
  method: 'DELETE',
2239
- url: '/api/v1/users',
2240
- body: data.requestBody,
2241
- mediaType: 'application/json',
2644
+ url: '/api/v1/{region}/bean/recurring-rules/{id}',
2645
+ path: {
2646
+ id: data.id,
2647
+ region: data.region
2648
+ },
2242
2649
  errors: {
2243
- 403: 'Invalid access token'
2650
+ 404: 'Rule not found'
2244
2651
  }
2245
2652
  });
2246
2653
  }
2247
2654
 
2248
2655
  /**
2249
- * Get current authenticated user
2656
+ * Get rule with statistics
2657
+ * Returns a rule with pending/overdue counts and next expected date
2250
2658
  * @param data The data for the request.
2251
- * @param data.acceptLanguage
2252
- * @returns unknown User retrieved successfully
2659
+ * @param data.id Rule ID
2660
+ * @param data.region Region code for tenant context
2661
+ * @returns RecurringRuleWithStatsResponseDto Rule with stats retrieved successfully
2253
2662
  * @throws ApiError
2254
2663
  */
2255
- public static userControllerGetUser(
2256
- data: UserControllerGetUserData
2257
- ): CancelablePromise<UserControllerGetUserResponse> {
2664
+ public static recurringRuleControllerGetWithStats(
2665
+ data: RecurringRuleControllerGetWithStatsData
2666
+ ): CancelablePromise<RecurringRuleControllerGetWithStatsResponse> {
2258
2667
  return __request(OpenAPI, {
2259
2668
  method: 'GET',
2260
- url: '/api/v1/users',
2261
- headers: {
2262
- 'accept-language': data.acceptLanguage
2669
+ url: '/api/v1/{region}/bean/recurring-rules/{id}/stats',
2670
+ path: {
2671
+ id: data.id,
2672
+ region: data.region
2673
+ },
2674
+ errors: {
2675
+ 404: 'Rule not found'
2263
2676
  }
2264
2677
  });
2265
2678
  }
2679
+ }
2266
2680
 
2681
+ export class ExpectedTransactionsService {
2267
2682
  /**
2268
- * Sign up new user
2269
- * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2683
+ * List expected transactions
2684
+ * Returns expected transactions for the authenticated user with optional filtering
2270
2685
  * @param data The data for the request.
2271
- * @param data.requestBody
2272
- * @returns unknown User created successfully
2686
+ * @param data.region Region code for tenant context
2687
+ * @param data.ruleId Filter by recurring rule ID
2688
+ * @param data.status Filter by status (PENDING, COMPLETED, SKIPPED)
2689
+ * @param data.fromDate Filter by date range start (YYYY-MM-DD)
2690
+ * @param data.toDate Filter by date range end (YYYY-MM-DD)
2691
+ * @returns ExpectedTransactionListResponseDto Expected transactions retrieved successfully
2273
2692
  * @throws ApiError
2274
2693
  */
2275
- public static userControllerSignupUser(
2276
- data: UserControllerSignupUserData
2277
- ): CancelablePromise<UserControllerSignupUserResponse> {
2694
+ public static expectedTransactionControllerFindAll(
2695
+ data: ExpectedTransactionControllerFindAllData
2696
+ ): CancelablePromise<ExpectedTransactionControllerFindAllResponse> {
2278
2697
  return __request(OpenAPI, {
2279
- method: 'POST',
2280
- url: '/api/v1/users',
2281
- body: data.requestBody,
2282
- mediaType: 'application/json',
2283
- errors: {
2284
- 400: 'Invalid Turnstile token (when Turnstile is enabled)',
2285
- 403: 'User signup is disabled'
2698
+ method: 'GET',
2699
+ url: '/api/v1/{region}/bean/expected-transactions',
2700
+ path: {
2701
+ region: data.region
2702
+ },
2703
+ query: {
2704
+ ruleId: data.ruleId,
2705
+ status: data.status,
2706
+ fromDate: data.fromDate,
2707
+ toDate: data.toDate
2286
2708
  }
2287
2709
  });
2288
2710
  }
2289
2711
 
2290
2712
  /**
2291
- * Delete user by ID (admin only)
2713
+ * List overdue expected transactions
2714
+ * Returns all overdue expected transactions (PENDING past tolerance)
2292
2715
  * @param data The data for the request.
2293
- * @param data.id User ID to delete
2294
- * @returns void User deleted successfully
2716
+ * @param data.region Region code for tenant context
2717
+ * @returns ExpectedTransactionListResponseDto Overdue transactions retrieved successfully
2295
2718
  * @throws ApiError
2296
2719
  */
2297
- public static userControllerDeleteUser(
2298
- data: UserControllerDeleteUserData
2299
- ): CancelablePromise<UserControllerDeleteUserResponse> {
2720
+ public static expectedTransactionControllerFindOverdue(
2721
+ data: ExpectedTransactionControllerFindOverdueData
2722
+ ): CancelablePromise<ExpectedTransactionControllerFindOverdueResponse> {
2300
2723
  return __request(OpenAPI, {
2301
- method: 'DELETE',
2302
- url: '/api/v1/users/{id}',
2724
+ method: 'GET',
2725
+ url: '/api/v1/{region}/bean/expected-transactions/overdue',
2303
2726
  path: {
2304
- id: data.id
2305
- },
2306
- errors: {
2307
- 403: 'Cannot delete own account or insufficient permissions'
2727
+ region: data.region
2308
2728
  }
2309
2729
  });
2310
2730
  }
2311
2731
 
2312
2732
  /**
2313
- * Get user info by user ID
2733
+ * Get expected transaction by ID
2734
+ * Returns a specific expected transaction with rule details
2314
2735
  * @param data The data for the request.
2315
- * @param data.id User ID
2316
- * @returns unknown User info retrieved successfully
2736
+ * @param data.id Expected transaction ID
2737
+ * @param data.region Region code for tenant context
2738
+ * @returns ExpectedTransactionResponseDto Expected transaction retrieved successfully
2317
2739
  * @throws ApiError
2318
2740
  */
2319
- public static userControllerGetUserInfo(
2320
- data: UserControllerGetUserInfoData
2321
- ): CancelablePromise<UserControllerGetUserInfoResponse> {
2741
+ public static expectedTransactionControllerFindOne(
2742
+ data: ExpectedTransactionControllerFindOneData
2743
+ ): CancelablePromise<ExpectedTransactionControllerFindOneResponse> {
2322
2744
  return __request(OpenAPI, {
2323
2745
  method: 'GET',
2324
- url: '/api/v1/users/{id}/info',
2746
+ url: '/api/v1/{region}/bean/expected-transactions/{id}',
2325
2747
  path: {
2326
- id: data.id
2748
+ id: data.id,
2749
+ region: data.region
2327
2750
  },
2328
2751
  errors: {
2329
- 403: 'Cannot access other user info without admin permission'
2752
+ 404: 'Expected transaction not found'
2330
2753
  }
2331
2754
  });
2332
2755
  }
2333
2756
 
2334
2757
  /**
2335
- * Update user settings
2758
+ * Skip expected transaction
2759
+ * Marks an expected transaction as skipped (PENDING -> SKIPPED)
2336
2760
  * @param data The data for the request.
2337
- * @param data.requestBody
2338
- * @returns unknown Settings updated successfully
2761
+ * @param data.id Expected transaction ID
2762
+ * @param data.region Region code for tenant context
2763
+ * @returns ExpectedTransactionResponseDto Expected transaction skipped successfully
2339
2764
  * @throws ApiError
2340
2765
  */
2341
- public static userControllerUpdateUserSetting(
2342
- data: UserControllerUpdateUserSettingData
2343
- ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
2766
+ public static expectedTransactionControllerSkip(
2767
+ data: ExpectedTransactionControllerSkipData
2768
+ ): CancelablePromise<ExpectedTransactionControllerSkipResponse> {
2344
2769
  return __request(OpenAPI, {
2345
- method: 'PUT',
2346
- url: '/api/v1/users/setting',
2347
- body: data.requestBody,
2348
- mediaType: 'application/json',
2770
+ method: 'POST',
2771
+ url: '/api/v1/{region}/bean/expected-transactions/{id}/skip',
2772
+ path: {
2773
+ id: data.id,
2774
+ region: data.region
2775
+ },
2349
2776
  errors: {
2350
- 403: 'Insufficient permissions'
2777
+ 400: 'Cannot skip - not in PENDING status',
2778
+ 404: 'Expected transaction not found'
2351
2779
  }
2352
2780
  });
2353
2781
  }
2354
2782
 
2355
2783
  /**
2356
- * Get all user settings paginated (admin only)
2784
+ * Undo skip
2785
+ * Reverses a skip operation (SKIPPED -> PENDING)
2357
2786
  * @param data The data for the request.
2358
- * @param data.pageNo Page number
2359
- * @param data.pageSize Page size
2360
- * @returns unknown Settings list retrieved successfully
2361
- * @throws ApiError
2362
- */
2363
- public static userControllerGetAllUserSettingsByPage(
2364
- data: UserControllerGetAllUserSettingsByPageData
2365
- ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
2366
- return __request(OpenAPI, {
2367
- method: 'GET',
2368
- url: '/api/v1/users/settings-by-page',
2369
- query: {
2370
- pageNo: data.pageNo,
2371
- pageSize: data.pageSize
2372
- }
2373
- });
2374
- }
2375
-
2376
- /**
2377
- * Get asset and liability summary for current user
2378
- * @returns unknown Summary retrieved successfully
2787
+ * @param data.id Expected transaction ID
2788
+ * @param data.region Region code for tenant context
2789
+ * @returns void Skip undone successfully
2379
2790
  * @throws ApiError
2380
2791
  */
2381
- public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
2792
+ public static expectedTransactionControllerUndoSkip(
2793
+ data: ExpectedTransactionControllerUndoSkipData
2794
+ ): CancelablePromise<ExpectedTransactionControllerUndoSkipResponse> {
2382
2795
  return __request(OpenAPI, {
2383
- method: 'GET',
2384
- url: '/api/v1/users/asset-liability-summary'
2796
+ method: 'DELETE',
2797
+ url: '/api/v1/{region}/bean/expected-transactions/{id}/skip',
2798
+ path: {
2799
+ id: data.id,
2800
+ region: data.region
2801
+ },
2802
+ errors: {
2803
+ 400: 'Cannot undo - not in SKIPPED status',
2804
+ 404: 'Expected transaction not found'
2805
+ }
2385
2806
  });
2386
2807
  }
2387
- }
2388
2808
 
2389
- export class PropertiesService {
2390
2809
  /**
2391
- * Get all system properties
2392
- * @returns unknown Properties retrieved successfully
2810
+ * Confirm transaction match
2811
+ * Manually matches an expected transaction with an actual transaction
2812
+ * @param data The data for the request.
2813
+ * @param data.id Expected transaction ID
2814
+ * @param data.region Region code for tenant context
2815
+ * @param data.requestBody
2816
+ * @returns unknown Match confirmed successfully
2393
2817
  * @throws ApiError
2394
2818
  */
2395
- public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
2819
+ public static expectedTransactionControllerConfirmMatch(
2820
+ data: ExpectedTransactionControllerConfirmMatchData
2821
+ ): CancelablePromise<ExpectedTransactionControllerConfirmMatchResponse> {
2396
2822
  return __request(OpenAPI, {
2397
- method: 'GET',
2398
- url: '/api/v1/admin/properties',
2823
+ method: 'POST',
2824
+ url: '/api/v1/{region}/bean/expected-transactions/{id}/match',
2825
+ path: {
2826
+ id: data.id,
2827
+ region: data.region
2828
+ },
2829
+ body: data.requestBody,
2830
+ mediaType: 'application/json',
2399
2831
  errors: {
2400
- 401: 'Unauthorized',
2401
- 403: 'Forbidden - insufficient permissions'
2832
+ 400: 'Cannot match - not in PENDING status',
2833
+ 404: 'Expected or actual transaction not found',
2834
+ 409: 'Actual transaction already matched to another rule'
2402
2835
  }
2403
2836
  });
2404
2837
  }
2405
2838
 
2406
2839
  /**
2407
- * Get property by key
2840
+ * Unmatch transaction
2841
+ * Removes the match between expected and actual transaction (COMPLETED -> PENDING)
2408
2842
  * @param data The data for the request.
2409
- * @param data.key Property key
2410
- * @returns unknown Property retrieved successfully
2843
+ * @param data.id Expected transaction ID
2844
+ * @param data.region Region code for tenant context
2845
+ * @returns void Match removed successfully
2411
2846
  * @throws ApiError
2412
2847
  */
2413
- public static propertyControllerGetByKey(
2414
- data: PropertyControllerGetByKeyData
2415
- ): CancelablePromise<PropertyControllerGetByKeyResponse> {
2848
+ public static expectedTransactionControllerUnmatch(
2849
+ data: ExpectedTransactionControllerUnmatchData
2850
+ ): CancelablePromise<ExpectedTransactionControllerUnmatchResponse> {
2416
2851
  return __request(OpenAPI, {
2417
- method: 'GET',
2418
- url: '/api/v1/admin/properties/{key}',
2852
+ method: 'DELETE',
2853
+ url: '/api/v1/{region}/bean/expected-transactions/{id}/match',
2419
2854
  path: {
2420
- key: data.key
2855
+ id: data.id,
2856
+ region: data.region
2421
2857
  },
2422
2858
  errors: {
2423
- 401: 'Unauthorized',
2424
- 403: 'Forbidden - insufficient permissions',
2425
- 404: 'Property not found'
2859
+ 400: 'Cannot unmatch - not in COMPLETED status',
2860
+ 404: 'Expected transaction not found'
2426
2861
  }
2427
2862
  });
2428
2863
  }
2429
2864
 
2430
2865
  /**
2431
- * Update a system property
2866
+ * Enter Now
2867
+ * Creates an actual transaction for an expected transaction (YNAB-style Enter Now)
2432
2868
  * @param data The data for the request.
2433
- * @param data.key Property key
2869
+ * @param data.id Expected transaction ID
2870
+ * @param data.region Region code for tenant context
2434
2871
  * @param data.requestBody
2435
- * @returns unknown Property updated successfully
2872
+ * @returns unknown Transaction created successfully
2436
2873
  * @throws ApiError
2437
2874
  */
2438
- public static propertyControllerUpdate(
2439
- data: PropertyControllerUpdateData
2440
- ): CancelablePromise<PropertyControllerUpdateResponse> {
2875
+ public static expectedTransactionControllerEnterNow(
2876
+ data: ExpectedTransactionControllerEnterNowData
2877
+ ): CancelablePromise<ExpectedTransactionControllerEnterNowResponse> {
2441
2878
  return __request(OpenAPI, {
2442
- method: 'PUT',
2443
- url: '/api/v1/admin/properties/{key}',
2879
+ method: 'POST',
2880
+ url: '/api/v1/{region}/bean/expected-transactions/{id}/enter',
2444
2881
  path: {
2445
- key: data.key
2882
+ id: data.id,
2883
+ region: data.region
2446
2884
  },
2447
2885
  body: data.requestBody,
2448
2886
  mediaType: 'application/json',
2449
2887
  errors: {
2450
- 401: 'Unauthorized',
2451
- 403: 'Forbidden - insufficient permissions'
2888
+ 400: 'Cannot enter - not in PENDING status or missing accounts',
2889
+ 404: 'Expected transaction or accounts not found'
2452
2890
  }
2453
2891
  });
2454
2892
  }
2893
+ }
2455
2894
 
2895
+ export class RecurringForecastService {
2456
2896
  /**
2457
- * Delete a system property
2897
+ * Get cash flow forecast
2898
+ * Returns predicted outflows for the next N months based on active recurring rules
2458
2899
  * @param data The data for the request.
2459
- * @param data.key Property key
2460
- * @returns void Property deleted successfully
2900
+ * @param data.region Region code for tenant context
2901
+ * @param data.months Number of months to forecast (1-12, default 3)
2902
+ * @returns ForecastResponseDto Forecast retrieved successfully
2461
2903
  * @throws ApiError
2462
2904
  */
2463
- public static propertyControllerDelete(
2464
- data: PropertyControllerDeleteData
2465
- ): CancelablePromise<PropertyControllerDeleteResponse> {
2905
+ public static forecastControllerGetForecast(
2906
+ data: ForecastControllerGetForecastData
2907
+ ): CancelablePromise<ForecastControllerGetForecastResponse> {
2466
2908
  return __request(OpenAPI, {
2467
- method: 'DELETE',
2468
- url: '/api/v1/admin/properties/{key}',
2909
+ method: 'GET',
2910
+ url: '/api/v1/{region}/bean/recurring/forecast',
2469
2911
  path: {
2470
- key: data.key
2912
+ region: data.region
2471
2913
  },
2472
- errors: {
2473
- 401: 'Unauthorized',
2474
- 403: 'Forbidden - insufficient permissions',
2475
- 404: 'Property not found'
2914
+ query: {
2915
+ months: data.months
2916
+ }
2917
+ });
2918
+ }
2919
+ }
2920
+
2921
+ export class BeanCategoryCatalogService {
2922
+ /**
2923
+ * List category catalog for a region
2924
+ * Returns the region-scoped category slugs (expense/income/investment/banking/transfer/payment) for the NLP result picker, each with the categoryAccount paths the region-enabled system rules map it to (#816). CN-exclusive payment instruments (huabei/baitiao) appear only under /cn.
2925
+ * @param data The data for the request.
2926
+ * @param data.region Region code for tenant context
2927
+ * @param data.scenario Filter by scenario
2928
+ * @param data.routeBearing Filter by routeBearing (entity-router route() consumes it)
2929
+ * @returns CategoryCatalogListResponseDto Category catalog retrieved successfully
2930
+ * @throws ApiError
2931
+ */
2932
+ public static categoryCatalogControllerList(
2933
+ data: CategoryCatalogControllerListData
2934
+ ): CancelablePromise<CategoryCatalogControllerListResponse> {
2935
+ return __request(OpenAPI, {
2936
+ method: 'GET',
2937
+ url: '/api/v1/{region}/bean/categories',
2938
+ path: {
2939
+ region: data.region
2940
+ },
2941
+ query: {
2942
+ scenario: data.scenario,
2943
+ routeBearing: data.routeBearing
2476
2944
  }
2477
2945
  });
2478
2946
  }
@@ -2543,111 +3011,244 @@ export class LifeEventsService {
2543
3011
  * Get life event by ID
2544
3012
  * Returns a single life event by its ID. Returns ETag header.
2545
3013
  * @param data The data for the request.
2546
- * @param data.id Life event ID
2547
- * @param data.region Region code for tenant context (decorative for life events)
2548
- * @returns EventResponseDto Life event retrieved successfully
3014
+ * @param data.id Life event ID
3015
+ * @param data.region Region code for tenant context (decorative for life events)
3016
+ * @returns EventResponseDto Life event retrieved successfully
3017
+ * @throws ApiError
3018
+ */
3019
+ public static eventControllerFindOne(
3020
+ data: EventControllerFindOneData
3021
+ ): CancelablePromise<EventControllerFindOneResponse> {
3022
+ return __request(OpenAPI, {
3023
+ method: 'GET',
3024
+ url: '/api/v1/{region}/bean/events/{id}',
3025
+ path: {
3026
+ id: data.id,
3027
+ region: data.region
3028
+ },
3029
+ errors: {
3030
+ 404: 'Life event not found'
3031
+ }
3032
+ });
3033
+ }
3034
+
3035
+ /**
3036
+ * Update a life event
3037
+ * Updates an existing life event. If If-Match header is provided, performs optimistic concurrency check; mismatched updatedAt returns 412.
3038
+ * @param data The data for the request.
3039
+ * @param data.id Life event ID
3040
+ * @param data.region Region code for tenant context (decorative for life events)
3041
+ * @param data.requestBody
3042
+ * @returns EventResponseDto Life event updated successfully
3043
+ * @throws ApiError
3044
+ */
3045
+ public static eventControllerUpdate(
3046
+ data: EventControllerUpdateData
3047
+ ): CancelablePromise<EventControllerUpdateResponse> {
3048
+ return __request(OpenAPI, {
3049
+ method: 'PUT',
3050
+ url: '/api/v1/{region}/bean/events/{id}',
3051
+ path: {
3052
+ id: data.id,
3053
+ region: data.region
3054
+ },
3055
+ body: data.requestBody,
3056
+ mediaType: 'application/json',
3057
+ errors: {
3058
+ 400: 'If-Match header is not a valid ISO 8601 date',
3059
+ 404: 'Life event not found',
3060
+ 409: 'Updated event conflicts with an existing (userId, type, date) combination',
3061
+ 412: 'If-Match precondition failed (updatedAt mismatch)'
3062
+ }
3063
+ });
3064
+ }
3065
+
3066
+ /**
3067
+ * Delete a life event
3068
+ * Deletes a life event entry (hard delete). Returns 204.
3069
+ * @param data The data for the request.
3070
+ * @param data.id Life event ID
3071
+ * @param data.region Region code for tenant context (decorative for life events)
3072
+ * @returns void Life event deleted successfully
3073
+ * @throws ApiError
3074
+ */
3075
+ public static eventControllerDelete(
3076
+ data: EventControllerDeleteData
3077
+ ): CancelablePromise<EventControllerDeleteResponse> {
3078
+ return __request(OpenAPI, {
3079
+ method: 'DELETE',
3080
+ url: '/api/v1/{region}/bean/events/{id}',
3081
+ path: {
3082
+ id: data.id,
3083
+ region: data.region
3084
+ },
3085
+ errors: {
3086
+ 404: 'Life event not found'
3087
+ }
3088
+ });
3089
+ }
3090
+
3091
+ /**
3092
+ * Slice time-series by a life event (Phase 79)
3093
+ * Returns aggregated time-series for postings matching accountPattern within the half-open date range of the given life event.
3094
+ * @param data The data for the request.
3095
+ * @param data.id Life event ID
3096
+ * @param data.accountPattern
3097
+ * @param data.granularity
3098
+ * @param data.region Region code for tenant context (decorative for life events)
3099
+ * @returns unknown Time-series sliced by the life event range
3100
+ * @throws ApiError
3101
+ */
3102
+ public static eventControllerGetSlice(
3103
+ data: EventControllerGetSliceData
3104
+ ): CancelablePromise<EventControllerGetSliceResponse> {
3105
+ return __request(OpenAPI, {
3106
+ method: 'GET',
3107
+ url: '/api/v1/{region}/bean/events/{id}/slice',
3108
+ path: {
3109
+ id: data.id,
3110
+ region: data.region
3111
+ },
3112
+ query: {
3113
+ accountPattern: data.accountPattern,
3114
+ granularity: data.granularity
3115
+ },
3116
+ errors: {
3117
+ 400: 'accountPattern query param is empty',
3118
+ 404: 'Life event not found'
3119
+ }
3120
+ });
3121
+ }
3122
+ }
3123
+
3124
+ export class OnboardingService {
3125
+ /**
3126
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
3127
+ * @param data The data for the request.
3128
+ * @param data.region Region code for tenant context. Not-yet-open codes are accepted: the universal catalog backs onboarding regardless of region (#759)
3129
+ * @param data.requestBody
3130
+ * @returns unknown Onboarding bootstrap result.
3131
+ * @throws ApiError
3132
+ */
3133
+ public static onboardingControllerBootstrap(
3134
+ data: OnboardingControllerBootstrapData
3135
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
3136
+ return __request(OpenAPI, {
3137
+ method: 'POST',
3138
+ url: '/api/v1/{region}/bean/onboarding',
3139
+ path: {
3140
+ region: data.region
3141
+ },
3142
+ body: data.requestBody,
3143
+ mediaType: 'application/json',
3144
+ errors: {
3145
+ 422: 'Invalid region/account path/duplicate paths.'
3146
+ }
3147
+ });
3148
+ }
3149
+ }
3150
+
3151
+ export class BalanceReconciliationService {
3152
+ /**
3153
+ * Preview reconciliation (book vs actual)
3154
+ * Computes book balance, diff, Beancount-inferred tolerance, and suggested action without persisting.
3155
+ * @param data The data for the request.
3156
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3157
+ * @param data.requestBody
3158
+ * @returns ReconciliationComputeResultDto Reconciliation preview
2549
3159
  * @throws ApiError
2550
3160
  */
2551
- public static eventControllerFindOne(
2552
- data: EventControllerFindOneData
2553
- ): CancelablePromise<EventControllerFindOneResponse> {
3161
+ public static reconciliationControllerCompute(
3162
+ data: ReconciliationControllerComputeData
3163
+ ): CancelablePromise<ReconciliationControllerComputeResponse> {
2554
3164
  return __request(OpenAPI, {
2555
- method: 'GET',
2556
- url: '/api/v1/{region}/bean/events/{id}',
3165
+ method: 'POST',
3166
+ url: '/api/v1/{region}/bean/reconciliations',
2557
3167
  path: {
2558
- id: data.id,
2559
3168
  region: data.region
2560
3169
  },
3170
+ body: data.requestBody,
3171
+ mediaType: 'application/json',
2561
3172
  errors: {
2562
- 404: 'Life event not found'
3173
+ 404: 'Account not found'
2563
3174
  }
2564
3175
  });
2565
3176
  }
2566
3177
 
2567
3178
  /**
2568
- * Update a life event
2569
- * Updates an existing life event. If If-Match header is provided, performs optimistic concurrency check; mismatched updatedAt returns 412.
3179
+ * Record a balance assertion
3180
+ * Persists the reconciliation as a BeanBalance assertion (amount = actual, diffAmount = book − actual). Re-reconciling the same day/currency upserts.
2570
3181
  * @param data The data for the request.
2571
- * @param data.id Life event ID
2572
- * @param data.region Region code for tenant context (decorative for life events)
3182
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2573
3183
  * @param data.requestBody
2574
- * @returns EventResponseDto Life event updated successfully
3184
+ * @returns ReconciliationRecordDto Balance assertion recorded
2575
3185
  * @throws ApiError
2576
3186
  */
2577
- public static eventControllerUpdate(
2578
- data: EventControllerUpdateData
2579
- ): CancelablePromise<EventControllerUpdateResponse> {
3187
+ public static reconciliationControllerAssert(
3188
+ data: ReconciliationControllerAssertData
3189
+ ): CancelablePromise<ReconciliationControllerAssertResponse> {
2580
3190
  return __request(OpenAPI, {
2581
- method: 'PUT',
2582
- url: '/api/v1/{region}/bean/events/{id}',
3191
+ method: 'POST',
3192
+ url: '/api/v1/{region}/bean/reconciliations/assert',
2583
3193
  path: {
2584
- id: data.id,
2585
3194
  region: data.region
2586
3195
  },
2587
3196
  body: data.requestBody,
2588
3197
  mediaType: 'application/json',
2589
3198
  errors: {
2590
- 400: 'If-Match header is not a valid ISO 8601 date',
2591
- 404: 'Life event not found',
2592
- 409: 'Updated event conflicts with an existing (userId, type, date) combination',
2593
- 412: 'If-Match precondition failed (updatedAt mismatch)'
3199
+ 404: 'Account not found'
2594
3200
  }
2595
3201
  });
2596
3202
  }
2597
3203
 
2598
3204
  /**
2599
- * Delete a life event
2600
- * Deletes a life event entry (hard delete). Returns 204.
3205
+ * Generate a pad adjusting entry
3206
+ * 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.
2601
3207
  * @param data The data for the request.
2602
- * @param data.id Life event ID
2603
- * @param data.region Region code for tenant context (decorative for life events)
2604
- * @returns void Life event deleted successfully
3208
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3209
+ * @param data.requestBody
3210
+ * @returns PadResultDto Pad adjusting entry generated
2605
3211
  * @throws ApiError
2606
3212
  */
2607
- public static eventControllerDelete(
2608
- data: EventControllerDeleteData
2609
- ): CancelablePromise<EventControllerDeleteResponse> {
3213
+ public static reconciliationControllerPad(
3214
+ data: ReconciliationControllerPadData
3215
+ ): CancelablePromise<ReconciliationControllerPadResponse> {
2610
3216
  return __request(OpenAPI, {
2611
- method: 'DELETE',
2612
- url: '/api/v1/{region}/bean/events/{id}',
3217
+ method: 'POST',
3218
+ url: '/api/v1/{region}/bean/reconciliations/pad',
2613
3219
  path: {
2614
- id: data.id,
2615
3220
  region: data.region
2616
3221
  },
3222
+ body: data.requestBody,
3223
+ mediaType: 'application/json',
2617
3224
  errors: {
2618
- 404: 'Life event not found'
3225
+ 400: 'Book already within tolerance — no pad needed',
3226
+ 404: 'Account not found'
2619
3227
  }
2620
3228
  });
2621
3229
  }
2622
3230
 
2623
3231
  /**
2624
- * Slice time-series by a life event (Phase 79)
2625
- * Returns aggregated time-series for postings matching accountPattern within the half-open date range of the given life event.
3232
+ * List reconciliation history for an account
3233
+ * Returns recorded balance assertions (most recent first). The latest drives the account-detail "Last <date>" badge.
2626
3234
  * @param data The data for the request.
2627
- * @param data.id Life event ID
2628
- * @param data.accountPattern
2629
- * @param data.granularity
2630
- * @param data.region Region code for tenant context (decorative for life events)
2631
- * @returns unknown Time-series sliced by the life event range
3235
+ * @param data.accountId BeanAccount id
3236
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3237
+ * @returns ReconciliationRecordDto Reconciliation history
2632
3238
  * @throws ApiError
2633
3239
  */
2634
- public static eventControllerGetSlice(
2635
- data: EventControllerGetSliceData
2636
- ): CancelablePromise<EventControllerGetSliceResponse> {
3240
+ public static reconciliationControllerHistory(
3241
+ data: ReconciliationControllerHistoryData
3242
+ ): CancelablePromise<ReconciliationControllerHistoryResponse> {
2637
3243
  return __request(OpenAPI, {
2638
3244
  method: 'GET',
2639
- url: '/api/v1/{region}/bean/events/{id}/slice',
3245
+ url: '/api/v1/{region}/bean/accounts/{accountId}/reconciliations',
2640
3246
  path: {
2641
- id: data.id,
3247
+ accountId: data.accountId,
2642
3248
  region: data.region
2643
3249
  },
2644
- query: {
2645
- accountPattern: data.accountPattern,
2646
- granularity: data.granularity
2647
- },
2648
3250
  errors: {
2649
- 400: 'accountPattern query param is empty',
2650
- 404: 'Life event not found'
3251
+ 404: 'Account not found'
2651
3252
  }
2652
3253
  });
2653
3254
  }
@@ -2657,13 +3258,20 @@ export class BeanExportService {
2657
3258
  /**
2658
3259
  * Export Beancount ledger as ZIP
2659
3260
  * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
2660
- * @returns unknown
3261
+ * @param data The data for the request.
3262
+ * @param data.region Region code for tenant context
3263
+ * @returns binary ZIP archive (application/zip) streamed as an attachment
2661
3264
  * @throws ApiError
2662
3265
  */
2663
- public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
3266
+ public static exportControllerExportBeancount(
3267
+ data: ExportControllerExportBeancountData
3268
+ ): CancelablePromise<ExportControllerExportBeancountResponse> {
2664
3269
  return __request(OpenAPI, {
2665
3270
  method: 'GET',
2666
- url: '/api/v1/{region}/bean/export/beancount'
3271
+ url: '/api/v1/{region}/bean/export/beancount',
3272
+ path: {
3273
+ region: data.region
3274
+ }
2667
3275
  });
2668
3276
  }
2669
3277
  }
@@ -2700,7 +3308,7 @@ export class BeanImportService {
2700
3308
 
2701
3309
  /**
2702
3310
  * Identify file type
2703
- * Upload a file to check if it can be processed by any registered importer. Does not perform actual import - useful for pre-validation. Uses user-specific importer configuration.
3311
+ * Server-side importer identification has been removed (ADR-0101); file matching is handled client-side via the community parser pipeline. Always returns identified=false with an explanatory message; kept for backward compatibility. Does not perform actual import.
2704
3312
  * @param data The data for the request.
2705
3313
  * @param data.region Region code for tenant context
2706
3314
  * @param data.formData File to identify
@@ -2831,121 +3439,6 @@ export class BeanImportService {
2831
3439
  }
2832
3440
  }
2833
3441
 
2834
- export class BeanPlatformsService {
2835
- /**
2836
- * Get all platforms with statistics
2837
- * @returns unknown List of platforms with binding and account counts
2838
- * @throws ApiError
2839
- */
2840
- public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
2841
- return __request(OpenAPI, {
2842
- method: 'GET',
2843
- url: '/api/v1/bean/platforms'
2844
- });
2845
- }
2846
-
2847
- /**
2848
- * Create a new platform
2849
- * @param data The data for the request.
2850
- * @param data.requestBody
2851
- * @returns unknown Platform created successfully
2852
- * @throws ApiError
2853
- */
2854
- public static platformControllerCreate(
2855
- data: PlatformControllerCreateData
2856
- ): CancelablePromise<PlatformControllerCreateResponse> {
2857
- return __request(OpenAPI, {
2858
- method: 'POST',
2859
- url: '/api/v1/bean/platforms',
2860
- body: data.requestBody,
2861
- mediaType: 'application/json',
2862
- errors: {
2863
- 409: 'Platform already exists'
2864
- }
2865
- });
2866
- }
2867
-
2868
- /**
2869
- * Get platform list for current user
2870
- * @returns unknown List of platforms with user binding status
2871
- * @throws ApiError
2872
- */
2873
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2874
- return __request(OpenAPI, {
2875
- method: 'GET',
2876
- url: '/api/v1/bean/platforms/list'
2877
- });
2878
- }
2879
-
2880
- /**
2881
- * Match platforms by name or alias
2882
- * @param data The data for the request.
2883
- * @param data.q Search query — Chinese name, English name, or abbreviation
2884
- * @param data.region Region code for category override lookup
2885
- * @returns unknown List of matching platforms with suggested segment names
2886
- * @throws ApiError
2887
- */
2888
- public static platformControllerMatchPlatforms(
2889
- data: PlatformControllerMatchPlatformsData
2890
- ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
2891
- return __request(OpenAPI, {
2892
- method: 'GET',
2893
- url: '/api/v1/bean/platforms/match',
2894
- query: {
2895
- q: data.q,
2896
- region: data.region
2897
- }
2898
- });
2899
- }
2900
-
2901
- /**
2902
- * Update a platform
2903
- * @param data The data for the request.
2904
- * @param data.id Platform ID
2905
- * @param data.requestBody
2906
- * @returns unknown Platform updated successfully
2907
- * @throws ApiError
2908
- */
2909
- public static platformControllerUpdate(
2910
- data: PlatformControllerUpdateData
2911
- ): CancelablePromise<PlatformControllerUpdateResponse> {
2912
- return __request(OpenAPI, {
2913
- method: 'PUT',
2914
- url: '/api/v1/bean/platforms/{id}',
2915
- path: {
2916
- id: data.id
2917
- },
2918
- body: data.requestBody,
2919
- mediaType: 'application/json',
2920
- errors: {
2921
- 404: 'Platform not found'
2922
- }
2923
- });
2924
- }
2925
-
2926
- /**
2927
- * Delete a platform
2928
- * @param data The data for the request.
2929
- * @param data.id Platform ID
2930
- * @returns void Platform deleted successfully
2931
- * @throws ApiError
2932
- */
2933
- public static platformControllerDelete(
2934
- data: PlatformControllerDeleteData
2935
- ): CancelablePromise<PlatformControllerDeleteResponse> {
2936
- return __request(OpenAPI, {
2937
- method: 'DELETE',
2938
- url: '/api/v1/bean/platforms/{id}',
2939
- path: {
2940
- id: data.id
2941
- },
2942
- errors: {
2943
- 404: 'Platform not found'
2944
- }
2945
- });
2946
- }
2947
- }
2948
-
2949
3442
  export class ProviderSyncService {
2950
3443
  /**
2951
3444
  * Sync transactions from financial data provider
@@ -3026,21 +3519,116 @@ export class ProviderSyncService {
3026
3519
  * @param data The data for the request.
3027
3520
  * @param data.providerName Provider name to check
3028
3521
  * @param data.region Region code for tenant context
3029
- * @returns unknown Provider support status
3522
+ * @returns unknown Provider support status
3523
+ * @throws ApiError
3524
+ */
3525
+ public static providerSyncControllerIsProviderSupported(
3526
+ data: ProviderSyncControllerIsProviderSupportedData
3527
+ ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
3528
+ return __request(OpenAPI, {
3529
+ method: 'GET',
3530
+ url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
3531
+ path: {
3532
+ providerName: data.providerName,
3533
+ region: data.region
3534
+ },
3535
+ errors: {
3536
+ 401: 'Missing or invalid authentication'
3537
+ }
3538
+ });
3539
+ }
3540
+ }
3541
+
3542
+ export class ExternalAccountLinksService {
3543
+ /**
3544
+ * Create an external account → BeanAccount mapping (ADR-0113)
3545
+ * @param data The data for the request.
3546
+ * @param data.region Region code for tenant context
3547
+ * @param data.requestBody
3548
+ * @returns ExternalAccountLinkResponseDto Link created.
3549
+ * @throws ApiError
3550
+ */
3551
+ public static externalAccountLinkControllerCreate(
3552
+ data: ExternalAccountLinkControllerCreateData
3553
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
3554
+ return __request(OpenAPI, {
3555
+ method: 'POST',
3556
+ url: '/api/v1/{region}/bean/external-account-links',
3557
+ path: {
3558
+ region: data.region
3559
+ },
3560
+ body: data.requestBody,
3561
+ mediaType: 'application/json',
3562
+ errors: {
3563
+ 422: 'beanAccountId not owned, or an active link already exists.'
3564
+ }
3565
+ });
3566
+ }
3567
+
3568
+ /**
3569
+ * List the user's active external account links
3570
+ * @param data The data for the request.
3571
+ * @param data.provider
3572
+ * @param data.region Region code for tenant context
3573
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
3574
+ * @throws ApiError
3575
+ */
3576
+ public static externalAccountLinkControllerFindAll(
3577
+ data: ExternalAccountLinkControllerFindAllData
3578
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
3579
+ return __request(OpenAPI, {
3580
+ method: 'GET',
3581
+ url: '/api/v1/{region}/bean/external-account-links',
3582
+ path: {
3583
+ region: data.region
3584
+ },
3585
+ query: {
3586
+ provider: data.provider
3587
+ }
3588
+ });
3589
+ }
3590
+
3591
+ /**
3592
+ * Get a single external account link
3593
+ * @param data The data for the request.
3594
+ * @param data.id
3595
+ * @param data.region Region code for tenant context
3596
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
3597
+ * @throws ApiError
3598
+ */
3599
+ public static externalAccountLinkControllerFindOne(
3600
+ data: ExternalAccountLinkControllerFindOneData
3601
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
3602
+ return __request(OpenAPI, {
3603
+ method: 'GET',
3604
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3605
+ path: {
3606
+ id: data.id,
3607
+ region: data.region
3608
+ },
3609
+ errors: {
3610
+ 422: 'Link not found or not owned by the user.'
3611
+ }
3612
+ });
3613
+ }
3614
+
3615
+ /**
3616
+ * Soft-delete (disconnect) an external account link
3617
+ * @param data The data for the request.
3618
+ * @param data.id
3619
+ * @param data.region Region code for tenant context
3620
+ * @returns void Link soft-deleted; historical transactions are unaffected.
3030
3621
  * @throws ApiError
3031
3622
  */
3032
- public static providerSyncControllerIsProviderSupported(
3033
- data: ProviderSyncControllerIsProviderSupportedData
3034
- ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
3623
+ public static externalAccountLinkControllerRemove(
3624
+ data: ExternalAccountLinkControllerRemoveData
3625
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
3035
3626
  return __request(OpenAPI, {
3036
- method: 'GET',
3037
- url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
3627
+ method: 'DELETE',
3628
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3038
3629
  path: {
3039
- providerName: data.providerName,
3630
+ id: data.id,
3040
3631
  region: data.region
3041
- },
3042
- errors: {
3043
- 401: 'Missing or invalid authentication'
3044
3632
  }
3045
3633
  });
3046
3634
  }
@@ -3204,479 +3792,330 @@ export class BeanNlpService {
3204
3792
  }
3205
3793
  }
3206
3794
 
3207
- export class DashboardService {
3795
+ export class BeanPlatformsService {
3208
3796
  /**
3209
- * Get net worth overview
3210
- * Returns total net worth with breakdown of assets and liabilities
3211
- * @param data The data for the request.
3212
- * @param data.region Region code for tenant context
3213
- * @param data.date Date for balance calculation (ISO 8601 format)
3214
- * @returns NetWorthResponseDto Net worth retrieved successfully
3797
+ * Get all platforms with statistics
3798
+ * @returns unknown List of platforms with binding and account counts
3215
3799
  * @throws ApiError
3216
3800
  */
3217
- public static dashboardControllerGetNetWorth(
3218
- data: DashboardControllerGetNetWorthData
3219
- ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3801
+ public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3220
3802
  return __request(OpenAPI, {
3221
3803
  method: 'GET',
3222
- url: '/api/v1/{region}/dashboard/net-worth',
3223
- path: {
3224
- region: data.region
3225
- },
3226
- query: {
3227
- date: data.date
3228
- },
3229
- errors: {
3230
- 401: 'User not authenticated'
3231
- }
3804
+ url: '/api/v1/bean/platforms'
3232
3805
  });
3233
3806
  }
3234
3807
 
3235
3808
  /**
3236
- * Get accounts grouped by platform
3237
- * Returns accounts with balances grouped by financial platform
3809
+ * Create a new platform
3238
3810
  * @param data The data for the request.
3239
- * @param data.region Region code for tenant context
3240
- * @param data.groupBy Grouping strategy
3241
- * @param data.date Date for balance calculation (ISO 8601 format)
3242
- * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3243
- * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3811
+ * @param data.requestBody
3812
+ * @returns unknown Platform created successfully
3244
3813
  * @throws ApiError
3245
3814
  */
3246
- public static dashboardControllerGetAccounts(
3247
- data: DashboardControllerGetAccountsData
3248
- ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3815
+ public static platformControllerCreate(
3816
+ data: PlatformControllerCreateData
3817
+ ): CancelablePromise<PlatformControllerCreateResponse> {
3249
3818
  return __request(OpenAPI, {
3250
- method: 'GET',
3251
- url: '/api/v1/{region}/dashboard/accounts',
3252
- path: {
3253
- region: data.region
3254
- },
3255
- query: {
3256
- groupBy: data.groupBy,
3257
- date: data.date,
3258
- accountId: data.accountId
3259
- },
3819
+ method: 'POST',
3820
+ url: '/api/v1/bean/platforms',
3821
+ body: data.requestBody,
3822
+ mediaType: 'application/json',
3260
3823
  errors: {
3261
- 401: 'User not authenticated'
3824
+ 409: 'Platform already exists'
3262
3825
  }
3263
3826
  });
3264
3827
  }
3265
3828
 
3266
3829
  /**
3267
- * Get cash flow summary
3268
- * Returns income, expenses, and savings for a monthly period
3830
+ * Get platform list for current user
3269
3831
  * @param data The data for the request.
3270
- * @param data.period Period in YYYY-MM format
3271
- * @param data.region Region code for tenant context
3272
- * @returns CashFlowResponseDto Cash flow retrieved successfully
3832
+ * @param data.region Region code (ISO 3166-1 alpha-2) that biases within-type-bucket ordering (local-region platforms first). Case-insensitive — stored/compared UPPERCASE ("cn" == "CN").
3833
+ * @returns PlatformListItemDto List of platforms with user binding status
3273
3834
  * @throws ApiError
3274
3835
  */
3275
- public static dashboardControllerGetCashFlow(
3276
- data: DashboardControllerGetCashFlowData
3277
- ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3836
+ public static platformControllerGetPlatformList(
3837
+ data: PlatformControllerGetPlatformListData = {}
3838
+ ): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3278
3839
  return __request(OpenAPI, {
3279
3840
  method: 'GET',
3280
- url: '/api/v1/{region}/dashboard/cash-flow',
3281
- path: {
3282
- region: data.region
3283
- },
3841
+ url: '/api/v1/bean/platforms/list',
3284
3842
  query: {
3285
- period: data.period
3286
- },
3287
- errors: {
3288
- 400: 'Invalid period format',
3289
- 401: 'User not authenticated'
3843
+ region: data.region
3290
3844
  }
3291
3845
  });
3292
3846
  }
3293
3847
 
3294
3848
  /**
3295
- * Get expenses/income grouped by functional category
3296
- * 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)
3849
+ * Match platforms by name or alias
3297
3850
  * @param data The data for the request.
3298
- * @param data.region Region code for tenant context
3299
- * @param data.groupBy Grouping strategy
3300
- * @param data.period Time window (1m = current calendar month)
3301
- * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
3302
- * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3851
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3852
+ * @param data.region Region code (ISO 3166-1 alpha-2) that biases within-tier ordering (local-region platforms first); also the intended categoryOverrides key. Case-insensitive — stored/compared UPPERCASE ("cn" == "CN").
3853
+ * @returns PlatformMatchResponseDto Matching platforms with overall match type and truncation flag
3303
3854
  * @throws ApiError
3304
3855
  */
3305
- public static dashboardControllerGetExpenses(
3306
- data: DashboardControllerGetExpensesData
3307
- ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3856
+ public static platformControllerMatchPlatforms(
3857
+ data: PlatformControllerMatchPlatformsData
3858
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3308
3859
  return __request(OpenAPI, {
3309
3860
  method: 'GET',
3310
- url: '/api/v1/{region}/dashboard/expenses',
3311
- path: {
3312
- region: data.region
3313
- },
3861
+ url: '/api/v1/bean/platforms/match',
3314
3862
  query: {
3315
- groupBy: data.groupBy,
3316
- period: data.period,
3317
- flow: data.flow
3318
- },
3319
- errors: {
3320
- 400: 'Invalid groupBy or period',
3321
- 401: 'User not authenticated'
3863
+ q: data.q,
3864
+ region: data.region
3322
3865
  }
3323
3866
  });
3324
3867
  }
3325
- }
3326
3868
 
3327
- export class InvestmentService {
3328
3869
  /**
3329
- * Get per-holding unrealized + realized P&L
3330
- * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3870
+ * Get the region and candidate account standards for a platform
3331
3871
  * @param data The data for the request.
3332
- * @param data.region Region code for tenant context
3333
- * @param data.asOf As-of date (ISO 8601), defaults to today
3334
- * @param data.accountId Scope to a single account
3335
- * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
3336
- * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3872
+ * @param data.id Platform ID (from a match result)
3873
+ * @param data.region Region code (ISO 3166-1 alpha-2, case-insensitive). Required for global platforms (countryCode null) — resolved as their template region; ignored when the platform has its own countryCode.
3874
+ * @param data.type Filter templates by account type (path first segment)
3875
+ * @returns PlatformStandardsResponseDto Resolved region plus the merged account-standard catalog of that region (groupable by productCategory client-side)
3337
3876
  * @throws ApiError
3338
3877
  */
3339
- public static holdingPnlControllerGetHoldingPnl(
3340
- data: HoldingPnlControllerGetHoldingPnlData
3341
- ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3878
+ public static platformControllerGetPlatformStandards(
3879
+ data: PlatformControllerGetPlatformStandardsData
3880
+ ): CancelablePromise<PlatformControllerGetPlatformStandardsResponse> {
3342
3881
  return __request(OpenAPI, {
3343
3882
  method: 'GET',
3344
- url: '/api/v1/{region}/investment/holdings/pnl',
3883
+ url: '/api/v1/bean/platforms/{id}/standards',
3345
3884
  path: {
3346
- region: data.region
3885
+ id: data.id
3347
3886
  },
3348
3887
  query: {
3349
- asOf: data.asOf,
3350
- accountId: data.accountId,
3351
- method: data.method
3352
- },
3353
- errors: {
3354
- 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
3355
- 401: 'User not authenticated'
3888
+ region: data.region,
3889
+ type: data.type
3356
3890
  }
3357
3891
  });
3358
3892
  }
3359
- }
3360
3893
 
3361
- export class BeanPricesService {
3362
3894
  /**
3363
- * Create a new price
3364
- * Creates a new price entry for the authenticated user
3895
+ * Update a platform
3365
3896
  * @param data The data for the request.
3366
- * @param data.region Region code for tenant context
3897
+ * @param data.id Platform ID
3367
3898
  * @param data.requestBody
3368
- * @returns PriceResponseDto Price created successfully
3899
+ * @returns unknown Platform updated successfully
3369
3900
  * @throws ApiError
3370
3901
  */
3371
- public static priceControllerCreate(
3372
- data: PriceControllerCreateData
3373
- ): CancelablePromise<PriceControllerCreateResponse> {
3902
+ public static platformControllerUpdate(
3903
+ data: PlatformControllerUpdateData
3904
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
3374
3905
  return __request(OpenAPI, {
3375
- method: 'POST',
3376
- url: '/api/v1/{region}/bean/prices',
3906
+ method: 'PUT',
3907
+ url: '/api/v1/bean/platforms/{id}',
3377
3908
  path: {
3378
- region: data.region
3909
+ id: data.id
3379
3910
  },
3380
3911
  body: data.requestBody,
3381
3912
  mediaType: 'application/json',
3382
3913
  errors: {
3383
- 404: 'Currency or quoteCurrency commodity not found',
3384
- 409: 'Price already exists for this currency pair and date'
3385
- }
3386
- });
3387
- }
3388
-
3389
- /**
3390
- * List user prices
3391
- * Returns all price entries for the authenticated user with optional filtering
3392
- * @param data The data for the request.
3393
- * @param data.region Region code for tenant context
3394
- * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
3395
- * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
3396
- * @param data.dateFrom Filter prices from this date (ISO 8601 format)
3397
- * @param data.dateTo Filter prices to this date (ISO 8601 format)
3398
- * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
3399
- * @param data.page Page number for pagination (default: 1)
3400
- * @param data.limit Number of items per page (default: 20, max: 100)
3401
- * @returns PriceListResponseDto Prices retrieved successfully
3402
- * @throws ApiError
3403
- */
3404
- public static priceControllerFindAll(
3405
- data: PriceControllerFindAllData
3406
- ): CancelablePromise<PriceControllerFindAllResponse> {
3407
- return __request(OpenAPI, {
3408
- method: 'GET',
3409
- url: '/api/v1/{region}/bean/prices',
3410
- path: {
3411
- region: data.region
3412
- },
3413
- query: {
3414
- currency: data.currency,
3415
- quoteCurrency: data.quoteCurrency,
3416
- dateFrom: data.dateFrom,
3417
- dateTo: data.dateTo,
3418
- search: data.search,
3419
- page: data.page,
3420
- limit: data.limit
3421
- }
3422
- });
3423
- }
3424
-
3425
- /**
3426
- * Get price by ID
3427
- * Returns a single price entry by its ID
3428
- * @param data The data for the request.
3429
- * @param data.id Price ID
3430
- * @param data.region Region code for tenant context
3431
- * @returns PriceResponseDto Price retrieved successfully
3432
- * @throws ApiError
3433
- */
3434
- public static priceControllerFindOne(
3435
- data: PriceControllerFindOneData
3436
- ): CancelablePromise<PriceControllerFindOneResponse> {
3437
- return __request(OpenAPI, {
3438
- method: 'GET',
3439
- url: '/api/v1/{region}/bean/prices/{id}',
3440
- path: {
3441
- id: data.id,
3442
- region: data.region
3443
- },
3444
- errors: {
3445
- 404: 'Price not found'
3914
+ 404: 'Platform not found'
3446
3915
  }
3447
3916
  });
3448
3917
  }
3449
3918
 
3450
3919
  /**
3451
- * Update a price
3452
- * Updates an existing price entry
3920
+ * Delete a platform
3453
3921
  * @param data The data for the request.
3454
- * @param data.id Price ID
3455
- * @param data.region Region code for tenant context
3456
- * @param data.requestBody
3457
- * @returns PriceResponseDto Price updated successfully
3922
+ * @param data.id Platform ID
3923
+ * @returns void Platform deleted successfully
3458
3924
  * @throws ApiError
3459
3925
  */
3460
- public static priceControllerUpdate(
3461
- data: PriceControllerUpdateData
3462
- ): CancelablePromise<PriceControllerUpdateResponse> {
3926
+ public static platformControllerDelete(
3927
+ data: PlatformControllerDeleteData
3928
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
3463
3929
  return __request(OpenAPI, {
3464
- method: 'PUT',
3465
- url: '/api/v1/{region}/bean/prices/{id}',
3930
+ method: 'DELETE',
3931
+ url: '/api/v1/bean/platforms/{id}',
3466
3932
  path: {
3467
- id: data.id,
3468
- region: data.region
3933
+ id: data.id
3469
3934
  },
3470
- body: data.requestBody,
3471
- mediaType: 'application/json',
3472
3935
  errors: {
3473
- 404: 'Price not found',
3474
- 409: 'Updated price conflicts with existing price'
3936
+ 404: 'Platform not found'
3475
3937
  }
3476
3938
  });
3477
3939
  }
3940
+ }
3478
3941
 
3479
- /**
3480
- * Delete a price
3481
- * Deletes a price entry (hard delete)
3942
+ export class DashboardService {
3943
+ /**
3944
+ * Get net worth overview
3945
+ * Returns total net worth with breakdown of assets and liabilities
3482
3946
  * @param data The data for the request.
3483
- * @param data.id Price ID
3484
3947
  * @param data.region Region code for tenant context
3485
- * @returns void Price deleted successfully
3948
+ * @param data.date Date for balance calculation (ISO 8601 format)
3949
+ * @returns NetWorthResponseDto Net worth retrieved successfully
3486
3950
  * @throws ApiError
3487
3951
  */
3488
- public static priceControllerDelete(
3489
- data: PriceControllerDeleteData
3490
- ): CancelablePromise<PriceControllerDeleteResponse> {
3952
+ public static dashboardControllerGetNetWorth(
3953
+ data: DashboardControllerGetNetWorthData
3954
+ ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3491
3955
  return __request(OpenAPI, {
3492
- method: 'DELETE',
3493
- url: '/api/v1/{region}/bean/prices/{id}',
3956
+ method: 'GET',
3957
+ url: '/api/v1/{region}/dashboard/net-worth',
3494
3958
  path: {
3495
- id: data.id,
3496
3959
  region: data.region
3497
3960
  },
3961
+ query: {
3962
+ date: data.date
3963
+ },
3498
3964
  errors: {
3499
- 404: 'Price not found'
3965
+ 401: 'User not authenticated'
3500
3966
  }
3501
3967
  });
3502
3968
  }
3503
3969
 
3504
3970
  /**
3505
- * Bulk create prices
3506
- * Creates multiple price entries at once (skips duplicates)
3971
+ * Get accounts grouped by platform
3972
+ * Returns accounts with balances grouped by financial platform
3507
3973
  * @param data The data for the request.
3508
3974
  * @param data.region Region code for tenant context
3509
- * @param data.requestBody
3510
- * @returns PriceResponseDto Prices created successfully
3975
+ * @param data.groupBy Grouping strategy
3976
+ * @param data.date Date for balance calculation (ISO 8601 format)
3977
+ * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3978
+ * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3511
3979
  * @throws ApiError
3512
3980
  */
3513
- public static priceControllerBulkCreate(
3514
- data: PriceControllerBulkCreateData
3515
- ): CancelablePromise<PriceControllerBulkCreateResponse> {
3981
+ public static dashboardControllerGetAccounts(
3982
+ data: DashboardControllerGetAccountsData
3983
+ ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3516
3984
  return __request(OpenAPI, {
3517
- method: 'POST',
3518
- url: '/api/v1/{region}/bean/prices/bulk',
3985
+ method: 'GET',
3986
+ url: '/api/v1/{region}/dashboard/accounts',
3519
3987
  path: {
3520
3988
  region: data.region
3521
3989
  },
3522
- body: data.requestBody,
3523
- mediaType: 'application/json'
3990
+ query: {
3991
+ groupBy: data.groupBy,
3992
+ date: data.date,
3993
+ accountId: data.accountId
3994
+ },
3995
+ errors: {
3996
+ 401: 'User not authenticated'
3997
+ }
3524
3998
  });
3525
3999
  }
3526
- }
3527
4000
 
3528
- export class ReportingService {
3529
4001
  /**
3530
- * Get portfolio value trends
3531
- *
3532
- * Returns time series data of portfolio net worth.
3533
- *
3534
- * **Multi-currency Support:**
3535
- * - `series[].byCurrency` - Currency breakdown for each data point
3536
- * - `byCurrency` - Separate time series grouped by currency
3537
- * - `warnings` - Exchange rate warnings if conversion failed
3538
- *
3539
- * **Parameters:**
3540
- * - `period`: Time period (1m, 3m, 6m, 1y)
3541
- * - `granularity`: Data granularity (day, week, month)
3542
- *
4002
+ * Get cash flow summary
4003
+ * Returns income, expenses, and savings for a monthly period
3543
4004
  * @param data The data for the request.
4005
+ * @param data.period Period in YYYY-MM format
3544
4006
  * @param data.region Region code for tenant context
3545
- * @param data.period Time period
3546
- * @param data.granularity Data granularity
3547
- * @returns PortfolioTrendsResponseDto Trends retrieved successfully
4007
+ * @returns CashFlowResponseDto Cash flow retrieved successfully
3548
4008
  * @throws ApiError
3549
4009
  */
3550
- public static reportingControllerGetPortfolioTrends(
3551
- data: ReportingControllerGetPortfolioTrendsData
3552
- ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
4010
+ public static dashboardControllerGetCashFlow(
4011
+ data: DashboardControllerGetCashFlowData
4012
+ ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3553
4013
  return __request(OpenAPI, {
3554
4014
  method: 'GET',
3555
- url: '/api/v1/{region}/reporting/portfolio/trends',
4015
+ url: '/api/v1/{region}/dashboard/cash-flow',
3556
4016
  path: {
3557
4017
  region: data.region
3558
4018
  },
3559
4019
  query: {
3560
- period: data.period,
3561
- granularity: data.granularity
4020
+ period: data.period
3562
4021
  },
3563
4022
  errors: {
4023
+ 400: 'Invalid period format',
3564
4024
  401: 'User not authenticated'
3565
4025
  }
3566
4026
  });
3567
4027
  }
3568
4028
 
3569
4029
  /**
3570
- * Get cash-flow trends
3571
- *
3572
- * Monthly income / expense / netSavings over a fixed N-month window
3573
- * (current month + N−1 prior). Missing months are zero-filled (flow metric).
3574
- *
3575
- * **Parameters:**
3576
- * - `period`: 1m | 3m | 6m | 1y (default 6m)
3577
- * - `granularity`: accepted for API symmetry; v1 returns month buckets
3578
- *
4030
+ * Get expenses/income grouped by functional category
4031
+ * 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)
3579
4032
  * @param data The data for the request.
3580
4033
  * @param data.region Region code for tenant context
3581
- * @param data.period Time period
3582
- * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
3583
- * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
4034
+ * @param data.groupBy Grouping strategy
4035
+ * @param data.period Time window (1m = current calendar month)
4036
+ * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
4037
+ * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3584
4038
  * @throws ApiError
3585
4039
  */
3586
- public static reportingControllerGetCashFlowTrends(
3587
- data: ReportingControllerGetCashFlowTrendsData
3588
- ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
4040
+ public static dashboardControllerGetExpenses(
4041
+ data: DashboardControllerGetExpensesData
4042
+ ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3589
4043
  return __request(OpenAPI, {
3590
4044
  method: 'GET',
3591
- url: '/api/v1/{region}/reporting/cash-flow/trends',
4045
+ url: '/api/v1/{region}/dashboard/expenses',
3592
4046
  path: {
3593
4047
  region: data.region
3594
4048
  },
3595
4049
  query: {
4050
+ groupBy: data.groupBy,
3596
4051
  period: data.period,
3597
- granularity: data.granularity
4052
+ flow: data.flow
3598
4053
  },
3599
4054
  errors: {
4055
+ 400: 'Invalid groupBy or period',
3600
4056
  401: 'User not authenticated'
3601
4057
  }
3602
4058
  });
3603
4059
  }
3604
4060
 
3605
4061
  /**
3606
- * Generate portfolio snapshot
3607
- *
3608
- * Manually generate a portfolio snapshot for a specific date.
3609
- *
3610
- * **Multi-currency Support:**
3611
- * - Fetches balances grouped by currency
3612
- * - Uses user's baseCurrency setting for conversion
3613
- * - Stores exchange rates and warnings
3614
- *
3615
- * **Use Cases:**
3616
- * - Testing snapshot generation
3617
- * - Force regeneration after data correction
3618
- * - Initial setup for new users
3619
- *
4062
+ * Get the composite P8 advisor context
4063
+ * Assembles the P8 data context in one call: net worth (verbatim GET /dashboard/net-worth shape, user base currency semantics per ADR-0070), trailing-12m flow totals over the 12 calendar months including the as-of month, and top-3 expense categories by account-path leaf key — both flow blocks priced in CNY per the P8 contract. The P8 snake_case field spellings (as_of, net_worth, trailing_12m) are mapped by the consumer; the wire keeps the family camelCase
3620
4064
  * @param data The data for the request.
3621
4065
  * @param data.region Region code for tenant context
3622
- * @param data.requestBody Optional date (defaults to today)
3623
- * @returns GenerateSnapshotResponse Snapshot generated successfully
4066
+ * @param data.date As-of date for the snapshot and the trailing-12m window anchor (ISO 8601 format)
4067
+ * @returns AdvisorContextResponseDto Advisor context retrieved successfully
3624
4068
  * @throws ApiError
3625
4069
  */
3626
- public static reportingControllerGenerateSnapshot(
3627
- data: ReportingControllerGenerateSnapshotData
3628
- ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
4070
+ public static dashboardControllerGetAdvisorContext(
4071
+ data: DashboardControllerGetAdvisorContextData
4072
+ ): CancelablePromise<DashboardControllerGetAdvisorContextResponse> {
3629
4073
  return __request(OpenAPI, {
3630
- method: 'POST',
3631
- url: '/api/v1/{region}/reporting/snapshots/generate',
4074
+ method: 'GET',
4075
+ url: '/api/v1/{region}/dashboard/advisor-context',
3632
4076
  path: {
3633
4077
  region: data.region
3634
4078
  },
3635
- body: data.requestBody,
3636
- mediaType: 'application/json',
4079
+ query: {
4080
+ date: data.date
4081
+ },
3637
4082
  errors: {
3638
4083
  400: 'Invalid date format',
3639
- 401: 'User not authenticated'
4084
+ 401: 'User not authenticated, or the token is not advisor-scoped (exchange via POST /auth/sessions/advisor, #1512)'
3640
4085
  }
3641
4086
  });
3642
4087
  }
4088
+ }
3643
4089
 
4090
+ export class InvestmentService {
3644
4091
  /**
3645
- * Backfill portfolio snapshots
3646
- *
3647
- * Generate snapshots for a date range (historical data backfill).
3648
- *
3649
- * **Multi-currency Support:**
3650
- * - Each snapshot includes multi-currency data
3651
- * - Uses exchange rates available at generation time
3652
- * - Warnings stored for missing exchange rates
3653
- *
3654
- * **Best Practices:**
3655
- * - Use for initial setup after account configuration
3656
- * - Run during low-traffic periods for large date ranges
3657
- * - Existing snapshots are skipped (not regenerated)
3658
- *
4092
+ * Get per-holding unrealized + realized P&L
4093
+ * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3659
4094
  * @param data The data for the request.
3660
4095
  * @param data.region Region code for tenant context
3661
- * @param data.requestBody
3662
- * @returns BackfillSnapshotsResponse Backfill completed successfully
4096
+ * @param data.asOf As-of date (ISO 8601), defaults to today
4097
+ * @param data.accountId Scope to a single account
4098
+ * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
4099
+ * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3663
4100
  * @throws ApiError
3664
4101
  */
3665
- public static reportingControllerBackfillSnapshots(
3666
- data: ReportingControllerBackfillSnapshotsData
3667
- ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
4102
+ public static holdingPnlControllerGetHoldingPnl(
4103
+ data: HoldingPnlControllerGetHoldingPnlData
4104
+ ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3668
4105
  return __request(OpenAPI, {
3669
- method: 'POST',
3670
- url: '/api/v1/{region}/reporting/snapshots/backfill',
4106
+ method: 'GET',
4107
+ url: '/api/v1/{region}/investment/holdings/pnl',
3671
4108
  path: {
3672
4109
  region: data.region
3673
4110
  },
3674
- body: data.requestBody,
3675
- mediaType: 'application/json',
4111
+ query: {
4112
+ asOf: data.asOf,
4113
+ accountId: data.accountId,
4114
+ method: data.method
4115
+ },
3676
4116
  errors: {
3677
- 400: 'Invalid date format or range',
3678
- 401: 'User not authenticated',
3679
- 409: 'Backfill already in progress for this user'
4117
+ 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
4118
+ 401: 'User not authenticated'
3680
4119
  }
3681
4120
  });
3682
4121
  }
@@ -3705,7 +4144,7 @@ export class AuthService {
3705
4144
  * Anonymous login with access token
3706
4145
  * @param data The data for the request.
3707
4146
  * @param data.requestBody
3708
- * @returns unknown Login successful
4147
+ * @returns AnonymousLoginResponseDto Login successful
3709
4148
  * @throws ApiError
3710
4149
  */
3711
4150
  public static authControllerAccessTokenLogin(
@@ -3721,17 +4160,75 @@ export class AuthService {
3721
4160
  }
3722
4161
  });
3723
4162
  }
4163
+
4164
+ /**
4165
+ * Exchange an access token for an advisor-scoped, short-TTL JWT (#1512)
4166
+ * @param data The data for the request.
4167
+ * @param data.requestBody
4168
+ * @returns AdvisorLoginResponseDto Advisor-scope login successful — the token is valid only on advisor tool-face endpoints (e.g. GET /:region/dashboard/advisor-context)
4169
+ * @throws ApiError
4170
+ */
4171
+ public static authControllerAdvisorTokenLogin(
4172
+ data: AuthControllerAdvisorTokenLoginData
4173
+ ): CancelablePromise<AuthControllerAdvisorTokenLoginResponse> {
4174
+ return __request(OpenAPI, {
4175
+ method: 'POST',
4176
+ url: '/api/v1/auth/sessions/advisor',
4177
+ body: data.requestBody,
4178
+ mediaType: 'application/json',
4179
+ errors: {
4180
+ 401: 'Invalid access token'
4181
+ }
4182
+ });
4183
+ }
4184
+ }
4185
+
4186
+ export class CommunityService {
4187
+ /**
4188
+ * Relay a sanitized parser-contribution payload
4189
+ * A server-side bot re-sanitizes the payload and opens an issue on the target repository; the issue URL is returned. The payload is never persisted or logged (forward-and-drop).
4190
+ * @param data The data for the request.
4191
+ * @param data.region Region code for tenant context (routing only; the institution region rides in the payload meta)
4192
+ * @param data.requestBody
4193
+ * @returns ParserContributionRelayResponseDto Issue created by the bot
4194
+ * @throws ApiError
4195
+ */
4196
+ public static parserContributionControllerCreate(
4197
+ data: ParserContributionControllerCreateData
4198
+ ): CancelablePromise<ParserContributionControllerCreateResponse> {
4199
+ return __request(OpenAPI, {
4200
+ method: 'POST',
4201
+ url: '/api/v1/{region}/community/parser-contributions',
4202
+ path: {
4203
+ region: data.region
4204
+ },
4205
+ body: data.requestBody,
4206
+ mediaType: 'application/json',
4207
+ errors: {
4208
+ 401: 'Unauthorized',
4209
+ 422: 'Validation failed (institution slug, empty samples, row/cell size limits)',
4210
+ 429: 'Rate limited (5 submissions per user per hour)',
4211
+ 501: 'Relay not configured on this deployment — clients fall back to the clipboard flow',
4212
+ 502: 'GitHub bot failure (upstream), safe to retry'
4213
+ }
4214
+ });
4215
+ }
3724
4216
  }
3725
4217
 
3726
- export class DefaultService {
4218
+ export class AdminCacheService {
3727
4219
  /**
3728
- * @returns unknown
4220
+ * Flush entire cache (L1 + L2)
4221
+ * Clears ALL cache entries across ALL namespaces and users. Use only for emergency cache corruption recovery, maintenance-window refresh, or development resets.
4222
+ * @returns unknown Cache flushed successfully
3729
4223
  * @throws ApiError
3730
4224
  */
3731
4225
  public static cacheControllerFlushCache(): CancelablePromise<CacheControllerFlushCacheResponse> {
3732
4226
  return __request(OpenAPI, {
3733
4227
  method: 'POST',
3734
- url: '/api/v1/cache/flush'
4228
+ url: '/api/v1/cache/flush',
4229
+ errors: {
4230
+ 403: 'Admin access required'
4231
+ }
3735
4232
  });
3736
4233
  }
3737
4234
  }
@@ -3892,3 +4389,53 @@ export class InfoService {
3892
4389
  });
3893
4390
  }
3894
4391
  }
4392
+
4393
+ export class MarketDataService {
4394
+ /**
4395
+ * Search market symbols by name or code
4396
+ * Ranked search over the openbb catalog. Empty `q` returns [].
4397
+ * @param data The data for the request.
4398
+ * @param data.q Search term — matched against symbol and instrument name. Empty string returns [].
4399
+ * @param data.limit Maximum number of results (clamped 1..50)
4400
+ * @param data.exchange Filter by exchange code (e.g. US, HK, SS, SZ). A-share codes also match symbol notations and venue-code aliases (exchange=SS matches SH/SHH column values and bare 6-digit Shanghai symbols; SZ likewise)
4401
+ * @param data.assetType Filter by OpenBB asset_type (e.g. stock, etf)
4402
+ * @returns SymbolSearchResultDto Ranked search results
4403
+ * @throws ApiError
4404
+ */
4405
+ public static symbolControllerSearch(
4406
+ data: SymbolControllerSearchData
4407
+ ): CancelablePromise<SymbolControllerSearchResponse> {
4408
+ return __request(OpenAPI, {
4409
+ method: 'GET',
4410
+ url: '/api/v1/market/symbols/search',
4411
+ query: {
4412
+ q: data.q,
4413
+ limit: data.limit,
4414
+ exchange: data.exchange,
4415
+ assetType: data.assetType
4416
+ }
4417
+ });
4418
+ }
4419
+
4420
+ /**
4421
+ * Get a market symbol quote
4422
+ * @param data The data for the request.
4423
+ * @param data.symbol
4424
+ * @returns SymbolQuoteDto Symbol quote
4425
+ * @throws ApiError
4426
+ */
4427
+ public static symbolControllerGetQuote(
4428
+ data: SymbolControllerGetQuoteData
4429
+ ): CancelablePromise<SymbolControllerGetQuoteResponse> {
4430
+ return __request(OpenAPI, {
4431
+ method: 'GET',
4432
+ url: '/api/v1/market/symbols/{symbol}/quote',
4433
+ path: {
4434
+ symbol: data.symbol
4435
+ },
4436
+ errors: {
4437
+ 404: 'Symbol not found in the openbb catalog'
4438
+ }
4439
+ });
4440
+ }
4441
+ }