@firela/api-types 0.0.0-canary.3ed455fd → 0.0.0-canary.45a6cc23

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.
@@ -1324,17 +1324,17 @@ export type ResolveResultDto = {
1324
1324
  [key: string]: string;
1325
1325
  };
1326
1326
  /**
1327
- * Resolution ID for undo
1327
+ * Resolution ID for undo. Absent when the resolver rejected the decision (review stayed PENDING).
1328
1328
  */
1329
- resolutionId: string;
1329
+ resolutionId?: string;
1330
1330
  /**
1331
1331
  * Whether this decision can be undone
1332
1332
  */
1333
- canUndo: boolean;
1333
+ canUndo?: boolean;
1334
1334
  /**
1335
1335
  * Deadline for undo (24h from resolution)
1336
1336
  */
1337
- undoDeadline: string;
1337
+ undoDeadline?: string;
1338
1338
  /**
1339
1339
  * Rule ID if learning was triggered (ACCEPT_AND_LEARN actions). Use this to deep-link to the rule management page.
1340
1340
  */
@@ -3029,6 +3029,96 @@ export type UpdatePropertyDto = {
3029
3029
  value: string;
3030
3030
  };
3031
3031
 
3032
+ export type CreateBeanEventDto = {
3033
+ /**
3034
+ * Life event date (ISO 8601)
3035
+ */
3036
+ date: string;
3037
+ /**
3038
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3039
+ */
3040
+ type: string;
3041
+ /**
3042
+ * Life event description. Empty string is a VALID value (distinct from absence).
3043
+ */
3044
+ description: string;
3045
+ /**
3046
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3047
+ */
3048
+ meta?: {
3049
+ [key: string]: unknown;
3050
+ };
3051
+ };
3052
+
3053
+ export type EventResponseDto = {
3054
+ /**
3055
+ * Unique identifier
3056
+ */
3057
+ id: string;
3058
+ /**
3059
+ * User ID (owner of the life event)
3060
+ */
3061
+ userId: string;
3062
+ /**
3063
+ * Life event date (ISO 8601 format)
3064
+ */
3065
+ date: string;
3066
+ /**
3067
+ * Life event type (user-defined, e.g., "employer", "location")
3068
+ */
3069
+ type: string;
3070
+ /**
3071
+ * Life event description. May be an empty string (a valid value distinct from absence).
3072
+ */
3073
+ description: string;
3074
+ /**
3075
+ * Product-side metadata (free-form JSON)
3076
+ */
3077
+ meta: {
3078
+ [key: string]: unknown;
3079
+ };
3080
+ /**
3081
+ * Creation timestamp
3082
+ */
3083
+ createdAt: string;
3084
+ /**
3085
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3086
+ */
3087
+ updatedAt: string;
3088
+ };
3089
+
3090
+ export type EventListResponseDto = {
3091
+ /**
3092
+ * List of life events
3093
+ */
3094
+ items: Array<EventResponseDto>;
3095
+ /**
3096
+ * Total number of life events matching the query
3097
+ */
3098
+ total: number;
3099
+ };
3100
+
3101
+ export type UpdateBeanEventDto = {
3102
+ /**
3103
+ * Life event date (ISO 8601)
3104
+ */
3105
+ date?: string;
3106
+ /**
3107
+ * Life event type (user-defined)
3108
+ */
3109
+ type?: string;
3110
+ /**
3111
+ * Life event description. Empty string is a VALID value (distinct from absence).
3112
+ */
3113
+ description?: string;
3114
+ /**
3115
+ * Product-side metadata (free-form JSON)
3116
+ */
3117
+ meta?: {
3118
+ [key: string]: unknown;
3119
+ };
3120
+ };
3121
+
3032
3122
  export type FileImportDto = {
3033
3123
  /**
3034
3124
  * Bill file to import (CSV, PDF, OFX, etc.)
@@ -4529,6 +4619,63 @@ export type CashFlowResponseDto = {
4529
4619
  warnings?: Array<ExchangeRateWarningDto>;
4530
4620
  };
4531
4621
 
4622
+ export type CategoryGroupDto = {
4623
+ /**
4624
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
4625
+ */
4626
+ category: string;
4627
+ /**
4628
+ * Converted total expense in base currency
4629
+ */
4630
+ totalExpense: string;
4631
+ /**
4632
+ * Share of grand total (0-100); 0 when grand total is 0
4633
+ */
4634
+ sharePct: number;
4635
+ /**
4636
+ * Raw (unconverted) expense per currency
4637
+ */
4638
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4639
+ /**
4640
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
4641
+ */
4642
+ convertedBalance?: string;
4643
+ };
4644
+
4645
+ export type ExpensesByCategorySummaryDto = {
4646
+ /**
4647
+ * Total expense across all categories (converted; convertible categories only)
4648
+ */
4649
+ totalExpense: string;
4650
+ /**
4651
+ * Number of categories
4652
+ */
4653
+ categoryCount: number;
4654
+ };
4655
+
4656
+ export type ExpensesByCategoryResponseDto = {
4657
+ /**
4658
+ * Period requested
4659
+ */
4660
+ period: string;
4661
+ /**
4662
+ * Base currency for converted values
4663
+ */
4664
+ baseCurrency: string;
4665
+ /**
4666
+ * Expense groups by functional category, sorted by converted total desc
4667
+ */
4668
+ groups: Array<CategoryGroupDto>;
4669
+ /**
4670
+ * Summary statistics
4671
+ */
4672
+ summary: ExpensesByCategorySummaryDto;
4673
+ /**
4674
+ * Exchange rate warnings (e.g. missing rate for a currency)
4675
+ */
4676
+ warnings?: Array<ExchangeRateWarningDto>;
4677
+ };
4678
+
4532
4679
  export type MonetaryDto = {
4533
4680
  /**
4534
4681
  * Amount (Decimal string)
@@ -4852,6 +4999,14 @@ export type TimeSeriesPointDto = {
4852
4999
  change?: {
4853
5000
  [key: string]: unknown;
4854
5001
  };
5002
+ /**
5003
+ * Total assets at this date (in base currency)
5004
+ */
5005
+ assets?: string;
5006
+ /**
5007
+ * Total liabilities at this date (in base currency)
5008
+ */
5009
+ liabilities?: string;
4855
5010
  /**
4856
5011
  * Multi-currency breakdown for this point
4857
5012
  */
@@ -4919,6 +5074,71 @@ export type PortfolioTrendsResponseDto = {
4919
5074
  warnings?: Array<ExchangeRateWarningDto>;
4920
5075
  };
4921
5076
 
5077
+ export type CashFlowPointDto = {
5078
+ /**
5079
+ * Month key (YYYY-MM)
5080
+ */
5081
+ month: string;
5082
+ /**
5083
+ * Income in base currency (absolute, converted)
5084
+ */
5085
+ income: string;
5086
+ /**
5087
+ * Expense in base currency (absolute, converted)
5088
+ */
5089
+ expense: string;
5090
+ /**
5091
+ * netSavings = income − expense (savings positive)
5092
+ */
5093
+ netSavings: string;
5094
+ };
5095
+
5096
+ export type CashFlowTrendSummaryDto = {
5097
+ /**
5098
+ * Total income across the period
5099
+ */
5100
+ totalIncome: string;
5101
+ /**
5102
+ * Total expense across the period
5103
+ */
5104
+ totalExpense: string;
5105
+ /**
5106
+ * income − expense across the period
5107
+ */
5108
+ totalNetSavings: string;
5109
+ /**
5110
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
5111
+ */
5112
+ averageMonthlyNetSavings: string;
5113
+ };
5114
+
5115
+ export type CashFlowTrendsResponseDto = {
5116
+ /**
5117
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
5118
+ */
5119
+ series: Array<CashFlowPointDto>;
5120
+ /**
5121
+ * Period totals
5122
+ */
5123
+ summary: CashFlowTrendSummaryDto;
5124
+ /**
5125
+ * Period requested
5126
+ */
5127
+ period: string;
5128
+ /**
5129
+ * Data granularity (v1 returns month buckets)
5130
+ */
5131
+ granularity: string;
5132
+ /**
5133
+ * Base currency for converted values
5134
+ */
5135
+ currency: string;
5136
+ /**
5137
+ * Exchange rate warnings (e.g. missing rate for a currency)
5138
+ */
5139
+ warnings?: Array<ExchangeRateWarningDto>;
5140
+ };
5141
+
4922
5142
  export type GenerateSnapshotBody = unknown;
4923
5143
 
4924
5144
  export type GenerateSnapshotResponse = unknown;
@@ -5105,6 +5325,10 @@ export type TransactionControllerListData = {
5105
5325
  * Filter by account ID (transactions with postings to this account)
5106
5326
  */
5107
5327
  accountId?: string;
5328
+ /**
5329
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5330
+ */
5331
+ category?: string;
5108
5332
  /**
5109
5333
  * Filter by start date (inclusive), format: YYYY-MM-DD
5110
5334
  */
@@ -6096,6 +6320,104 @@ export type PropertyControllerDeleteData = {
6096
6320
 
6097
6321
  export type PropertyControllerDeleteResponse = void;
6098
6322
 
6323
+ export type EventControllerCreateData = {
6324
+ /**
6325
+ * Region code for tenant context (decorative for life events)
6326
+ */
6327
+ region: 'cn' | 'us' | 'de' | 'gb';
6328
+ requestBody: CreateBeanEventDto;
6329
+ };
6330
+
6331
+ export type EventControllerCreateResponse = EventResponseDto;
6332
+
6333
+ export type EventControllerFindAllData = {
6334
+ /**
6335
+ * Filter life events from this date (ISO 8601 format)
6336
+ */
6337
+ from?: string;
6338
+ /**
6339
+ * Number of items per page (default: 20, max: 100)
6340
+ */
6341
+ limit?: number;
6342
+ /**
6343
+ * Page number for pagination (default: 1)
6344
+ */
6345
+ page?: number;
6346
+ /**
6347
+ * Search term for description (case-insensitive partial match)
6348
+ */
6349
+ q?: string;
6350
+ /**
6351
+ * Region code for tenant context (decorative for life events)
6352
+ */
6353
+ region: 'cn' | 'us' | 'de' | 'gb';
6354
+ /**
6355
+ * Filter life events to this date (ISO 8601 format)
6356
+ */
6357
+ to?: string;
6358
+ /**
6359
+ * Filter by life event type (exact match)
6360
+ */
6361
+ type?: string;
6362
+ };
6363
+
6364
+ export type EventControllerFindAllResponse = EventListResponseDto;
6365
+
6366
+ export type EventControllerFindOneData = {
6367
+ /**
6368
+ * Life event ID
6369
+ */
6370
+ id: string;
6371
+ /**
6372
+ * Region code for tenant context (decorative for life events)
6373
+ */
6374
+ region: 'cn' | 'us' | 'de' | 'gb';
6375
+ };
6376
+
6377
+ export type EventControllerFindOneResponse = EventResponseDto;
6378
+
6379
+ export type EventControllerUpdateData = {
6380
+ /**
6381
+ * Life event ID
6382
+ */
6383
+ id: string;
6384
+ /**
6385
+ * Region code for tenant context (decorative for life events)
6386
+ */
6387
+ region: 'cn' | 'us' | 'de' | 'gb';
6388
+ requestBody: UpdateBeanEventDto;
6389
+ };
6390
+
6391
+ export type EventControllerUpdateResponse = EventResponseDto;
6392
+
6393
+ export type EventControllerDeleteData = {
6394
+ /**
6395
+ * Life event ID
6396
+ */
6397
+ id: string;
6398
+ /**
6399
+ * Region code for tenant context (decorative for life events)
6400
+ */
6401
+ region: 'cn' | 'us' | 'de' | 'gb';
6402
+ };
6403
+
6404
+ export type EventControllerDeleteResponse = void;
6405
+
6406
+ export type EventControllerGetSliceData = {
6407
+ accountPattern: string;
6408
+ granularity: string;
6409
+ /**
6410
+ * Life event ID
6411
+ */
6412
+ id: string;
6413
+ /**
6414
+ * Region code for tenant context (decorative for life events)
6415
+ */
6416
+ region: 'cn' | 'us' | 'de' | 'gb';
6417
+ };
6418
+
6419
+ export type EventControllerGetSliceResponse = unknown;
6420
+
6099
6421
  export type ExportControllerExportBeancountResponse = unknown;
6100
6422
 
6101
6423
  export type FileImportControllerImportFileData = {
@@ -6401,6 +6723,24 @@ export type DashboardControllerGetCashFlowData = {
6401
6723
 
6402
6724
  export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6403
6725
 
6726
+ export type DashboardControllerGetExpensesData = {
6727
+ /**
6728
+ * Grouping strategy
6729
+ */
6730
+ groupBy?: 'category';
6731
+ /**
6732
+ * Time window (1m = current calendar month)
6733
+ */
6734
+ period?: '1m' | '3m' | '6m' | '1y';
6735
+ /**
6736
+ * Region code for tenant context
6737
+ */
6738
+ region: 'cn' | 'us' | 'de' | 'gb';
6739
+ };
6740
+
6741
+ export type DashboardControllerGetExpensesResponse =
6742
+ ExpensesByCategoryResponseDto;
6743
+
6404
6744
  export type HoldingPnlControllerGetHoldingPnlData = {
6405
6745
  /**
6406
6746
  * Scope to a single account
@@ -6537,6 +6877,24 @@ export type ReportingControllerGetPortfolioTrendsData = {
6537
6877
  export type ReportingControllerGetPortfolioTrendsResponse =
6538
6878
  PortfolioTrendsResponseDto;
6539
6879
 
6880
+ export type ReportingControllerGetCashFlowTrendsData = {
6881
+ /**
6882
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6883
+ */
6884
+ granularity?: 'day' | 'week' | 'month';
6885
+ /**
6886
+ * Time period
6887
+ */
6888
+ period?: '1m' | '3m' | '6m' | '1y';
6889
+ /**
6890
+ * Region code for tenant context
6891
+ */
6892
+ region: 'cn' | 'us' | 'de' | 'gb';
6893
+ };
6894
+
6895
+ export type ReportingControllerGetCashFlowTrendsResponse =
6896
+ CashFlowTrendsResponseDto;
6897
+
6540
6898
  export type ReportingControllerGenerateSnapshotData = {
6541
6899
  /**
6542
6900
  * Region code for tenant context
@@ -7968,6 +8326,102 @@ export type $OpenApiTs = {
7968
8326
  };
7969
8327
  };
7970
8328
  };
8329
+ '/api/v1/{region}/bean/events': {
8330
+ post: {
8331
+ req: EventControllerCreateData;
8332
+ res: {
8333
+ /**
8334
+ * Life event created successfully
8335
+ */
8336
+ 201: EventResponseDto;
8337
+ /**
8338
+ * Life event already exists for this (userId, type, date) combination
8339
+ */
8340
+ 409: unknown;
8341
+ };
8342
+ };
8343
+ get: {
8344
+ req: EventControllerFindAllData;
8345
+ res: {
8346
+ /**
8347
+ * Life events retrieved successfully
8348
+ */
8349
+ 200: EventListResponseDto;
8350
+ };
8351
+ };
8352
+ };
8353
+ '/api/v1/{region}/bean/events/{id}': {
8354
+ get: {
8355
+ req: EventControllerFindOneData;
8356
+ res: {
8357
+ /**
8358
+ * Life event retrieved successfully
8359
+ */
8360
+ 200: EventResponseDto;
8361
+ /**
8362
+ * Life event not found
8363
+ */
8364
+ 404: unknown;
8365
+ };
8366
+ };
8367
+ put: {
8368
+ req: EventControllerUpdateData;
8369
+ res: {
8370
+ /**
8371
+ * Life event updated successfully
8372
+ */
8373
+ 200: EventResponseDto;
8374
+ /**
8375
+ * If-Match header is not a valid ISO 8601 date
8376
+ */
8377
+ 400: unknown;
8378
+ /**
8379
+ * Life event not found
8380
+ */
8381
+ 404: unknown;
8382
+ /**
8383
+ * Updated event conflicts with an existing (userId, type, date) combination
8384
+ */
8385
+ 409: unknown;
8386
+ /**
8387
+ * If-Match precondition failed (updatedAt mismatch)
8388
+ */
8389
+ 412: unknown;
8390
+ };
8391
+ };
8392
+ delete: {
8393
+ req: EventControllerDeleteData;
8394
+ res: {
8395
+ /**
8396
+ * Life event deleted successfully
8397
+ */
8398
+ 204: void;
8399
+ /**
8400
+ * Life event not found
8401
+ */
8402
+ 404: unknown;
8403
+ };
8404
+ };
8405
+ };
8406
+ '/api/v1/{region}/bean/events/{id}/slice': {
8407
+ get: {
8408
+ req: EventControllerGetSliceData;
8409
+ res: {
8410
+ /**
8411
+ * Time-series sliced by the life event range
8412
+ */
8413
+ 200: unknown;
8414
+ /**
8415
+ * accountPattern query param is empty
8416
+ */
8417
+ 400: unknown;
8418
+ /**
8419
+ * Life event not found
8420
+ */
8421
+ 404: unknown;
8422
+ };
8423
+ };
8424
+ };
7971
8425
  '/api/v1/{region}/bean/export/beancount': {
7972
8426
  get: {
7973
8427
  res: {
@@ -8383,6 +8837,25 @@ export type $OpenApiTs = {
8383
8837
  };
8384
8838
  };
8385
8839
  };
8840
+ '/api/v1/{region}/dashboard/expenses': {
8841
+ get: {
8842
+ req: DashboardControllerGetExpensesData;
8843
+ res: {
8844
+ /**
8845
+ * Expenses retrieved successfully
8846
+ */
8847
+ 200: ExpensesByCategoryResponseDto;
8848
+ /**
8849
+ * Invalid groupBy or period
8850
+ */
8851
+ 400: unknown;
8852
+ /**
8853
+ * User not authenticated
8854
+ */
8855
+ 401: unknown;
8856
+ };
8857
+ };
8858
+ };
8386
8859
  '/api/v1/{region}/investment/holdings/pnl': {
8387
8860
  get: {
8388
8861
  req: HoldingPnlControllerGetHoldingPnlData;
@@ -8501,6 +8974,21 @@ export type $OpenApiTs = {
8501
8974
  };
8502
8975
  };
8503
8976
  };
8977
+ '/api/v1/{region}/reporting/cash-flow/trends': {
8978
+ get: {
8979
+ req: ReportingControllerGetCashFlowTrendsData;
8980
+ res: {
8981
+ /**
8982
+ * Cash-flow trends retrieved successfully
8983
+ */
8984
+ 200: CashFlowTrendsResponseDto;
8985
+ /**
8986
+ * User not authenticated
8987
+ */
8988
+ 401: unknown;
8989
+ };
8990
+ };
8991
+ };
8504
8992
  '/api/v1/{region}/reporting/snapshots/generate': {
8505
8993
  post: {
8506
8994
  req: ReportingControllerGenerateSnapshotData;