From 21383852d9095393406c5a95afb76857e3c73961 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sun, 8 Nov 2026 14:20:56 +0300 Subject: [PATCH] feat(performance): consume investment performance API contract (WealthLedger/main#54) --- .../performance/api/usePerformance.ts | 20 + src/entities/performance/index.ts | 1 + src/shared/api/generated/schema.d.ts | 445 ++++---- src/shared/api/spec/openapi.json | 966 ++++++++---------- 4 files changed, 716 insertions(+), 716 deletions(-) create mode 100644 src/entities/performance/api/usePerformance.ts create mode 100644 src/entities/performance/index.ts diff --git a/src/entities/performance/api/usePerformance.ts b/src/entities/performance/api/usePerformance.ts new file mode 100644 index 0000000..223cd0e --- /dev/null +++ b/src/entities/performance/api/usePerformance.ts @@ -0,0 +1,20 @@ +import { apiQueryClient, type paths, useAuthenticatedQuery } from "@/shared/api"; + +type Performance = NonNullable< + paths["/api/v1/brokerage-accounts/{accountId}/performance"]["get"]["responses"][200]["content"]["application/json"]["data"] +>; + +function usePerformance(accountId: string) { + return useAuthenticatedQuery({ + meta: { accessGroup: "brokerage" }, + ...apiQueryClient.queryOptions( + "get", + "/api/v1/brokerage-accounts/{accountId}/performance", + { params: { path: { accountId } } }, + ), + enabled: Boolean(accountId), + staleTime: 30_000, + }); +} + +export { type Performance, usePerformance }; diff --git a/src/entities/performance/index.ts b/src/entities/performance/index.ts new file mode 100644 index 0000000..4857b05 --- /dev/null +++ b/src/entities/performance/index.ts @@ -0,0 +1 @@ +export { type Performance, usePerformance } from "./api/usePerformance"; diff --git a/src/shared/api/generated/schema.d.ts b/src/shared/api/generated/schema.d.ts index 05ca2e8..0232dd1 100644 --- a/src/shared/api/generated/schema.d.ts +++ b/src/shared/api/generated/schema.d.ts @@ -276,6 +276,38 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/brokerage-accounts/all/performance": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["PerformanceController_all"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/brokerage-accounts/{accountId}/performance": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["PerformanceController_account"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/brokerage-accounts/all/operations": { parameters: { query?: never; @@ -708,22 +740,6 @@ export interface paths { patch?: never; trace?: never; }; - "/api/v1/tbank-sync/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["TbankSyncController_status"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; } export type webhooks = Record; export interface components { @@ -1138,6 +1154,73 @@ export interface components { data: components["schemas"]["PortfolioDto"] | null; meta: components["schemas"]["InvestmentResourceMetaDto"]; }; + PerformancePeriodDto: { + /** Format: date */ + from: string; + /** Format: date */ + to: string; + days: number; + }; + /** @enum {string} */ + PerformanceUnavailableReason: "ACCOUNT_VALUATION_DATES_DIFFER" | "AMBIGUOUS_RETURN" | "HISTORY_START_UNKNOWN" | "INDEX_HISTORY_UNAVAILABLE" | "NON_RUB_ACTIVITY" | "NO_SOLUTION" | "OPERATIONS_HISTORY_INCOMPLETE" | "PORTFOLIO_VALUATION_INCOMPLETE" | "UNCONFIRMED_TRANSFER" | "UNVALUED_SECURITIES_TRANSFER"; + PerformanceReturnDto: { + /** @description Decimal fraction: 0.151 = 15.1% */ + value: string | null; + /** @enum {string} */ + basis: "annual" | "period"; + unavailableReason: components["schemas"]["PerformanceUnavailableReason"] | null; + }; + PerformanceIndexDto: { + /** @enum {string} */ + code: "MCFTRR" | "IMOEX"; + value: components["schemas"]["MoneyDto"] | null; + return: components["schemas"]["PerformanceReturnDto"]; + /** Format: date */ + asOf: string | null; + unavailableReason: components["schemas"]["PerformanceUnavailableReason"] | null; + }; + PerformanceOutperformanceDto: { + /** @description Difference between rates as decimal fractions */ + percentagePoints: string; + money: components["schemas"]["MoneyDto"]; + }; + PerformanceSeriesPointDto: { + /** Format: date */ + date: string; + netInvested: string; + benchmarkValue: string; + referenceValue: string | null; + }; + PerformanceExcludedAccountDto: { + accountId: string; + name: string; + reason: components["schemas"]["PerformanceUnavailableReason"]; + }; + PerformanceDto: { + accountId: string; + period: components["schemas"]["PerformancePeriodDto"]; + netInvested: components["schemas"]["MoneyDto"]; + currentValue: components["schemas"]["MoneyDto"]; + profit: components["schemas"]["MoneyDto"]; + return: components["schemas"]["PerformanceReturnDto"]; + benchmark: components["schemas"]["PerformanceIndexDto"]; + reference: components["schemas"]["PerformanceIndexDto"]; + outperformance: components["schemas"]["PerformanceOutperformanceDto"] | null; + series: components["schemas"]["PerformanceSeriesPointDto"][]; + /** @enum {string} */ + completeness: "complete" | "incomplete"; + excludedAccounts: components["schemas"]["PerformanceExcludedAccountDto"][]; + /** Format: date-time */ + calculatedAt: string; + }; + PerformanceMetaDto: { + dependencies: components["schemas"]["InvestmentDependencyDto"][]; + unavailable: components["schemas"]["PerformanceExcludedAccountDto"][]; + }; + PerformanceResourceDto: { + data: components["schemas"]["PerformanceDto"] | null; + meta: components["schemas"]["PerformanceMetaDto"]; + }; BrokerageOperationDto: { account?: components["schemas"]["AccountReferenceDto"]; id: string; @@ -1708,84 +1791,6 @@ export interface components { PutTbankConnectionDto: { token: string; }; - EventsInvestmentScreenDto: { - accountId: string; - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - screen: "events"; - /** - * Format: date - * @description Inclusive UTC calendar start date (YYYY-MM-DD). May be supplied independently; defaults to today in UTC. - */ - from?: string; - /** - * Format: date - * @description Inclusive UTC calendar end date (YYYY-MM-DD). May be supplied independently; defaults to 30 days after from. Timestamp queries use the start of the following UTC day as the exclusive end. - */ - to?: string; - }; - IncomeInvestmentScreenDto: { - accountId: string; - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - screen: "income"; - /** - * Format: date - * @description Inclusive start calendar date in Europe/Moscow (YYYY-MM-DD). Supply both from and to, or neither for the current Moscow month. - */ - from?: string; - /** - * Format: date - * @description Inclusive end calendar date in Europe/Moscow (YYYY-MM-DD). Supply both from and to, or neither. Timestamp queries use the start of the following Moscow day as the exclusive end, capped at now. - */ - to?: string; - }; - SyncCandleRangeDto: { - /** Format: date-time */ - from: string; - /** Format: date-time */ - to: string; - }; - TimestampInvestmentScreenDto: { - accountId?: string; - /** Format: uuid */ - instrumentUid?: string; - query?: string; - /** @enum {string} */ - candlePeriod?: "month" | "halfYear" | "year" | "all"; - candleRange?: components["schemas"]["SyncCandleRangeDto"]; - categories?: ("trade" | "income" | "tax" | "fee" | "transfer" | "other")[]; - limit?: number; - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - screen: "accounts" | "account" | "operations" | "stocks" | "bonds" | "stock" | "bond"; - /** - * Format: date-time - * @description Start instant for operations. - */ - from?: string; - /** - * Format: date-time - * @description End instant for operations. - */ - to?: string; - }; - TbankSyncStatusDto: { - /** Format: uuid */ - id: string; - scope: (components["schemas"]["IncomeInvestmentScreenDto"] | components["schemas"]["EventsInvestmentScreenDto"] | components["schemas"]["TimestampInvestmentScreenDto"]) | null; - /** Format: date-time */ - now: string; - /** @enum {string} */ - state: "running" | "succeeded" | "failed" | "cancelled"; - errorCode: string | null; - }; }; responses: never; parameters: never; @@ -3525,6 +3530,136 @@ export interface operations { }; }; }; + PerformanceController_all: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PerformanceResourceDto"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Authentication required */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Upstream service unavailable */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + }; + }; + PerformanceController_account: { + parameters: { + query?: never; + header?: never; + path: { + accountId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PerformanceResourceDto"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Authentication required */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + /** @description Upstream service unavailable */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ProblemDetailsDto"]; + }; + }; + }; + }; BrokerageOperationsController_all: { parameters: { query?: { @@ -3673,9 +3808,7 @@ export interface operations { }; IncomeAnalyticsController_allSummary: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -3740,7 +3873,6 @@ export interface operations { IncomeAnalyticsController_allAnalytics: { parameters: { query?: { - sync?: "observe"; /** @description Inclusive calendar date in Europe/Moscow. Supply both from/to or neither. */ from?: string; /** @description Inclusive calendar date in Europe/Moscow, no later than today. Supply both from/to or neither. */ @@ -3809,9 +3941,7 @@ export interface operations { }; IncomeAnalyticsController_summary: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { accountId: string; @@ -3878,7 +4008,6 @@ export interface operations { IncomeAnalyticsController_analytics: { parameters: { query?: { - sync?: "observe"; /** @description Inclusive calendar date in Europe/Moscow. Supply both from/to or neither. */ from?: string; /** @description Inclusive calendar date in Europe/Moscow, no later than today. Supply both from/to or neither. */ @@ -3950,7 +4079,6 @@ export interface operations { UpcomingEventsController_all: { parameters: { query?: { - sync?: "observe"; /** @description Inclusive UTC calendar start date (YYYY-MM-DD). May be supplied independently; defaults to today in UTC. */ from?: string; /** @description Inclusive UTC calendar end date (YYYY-MM-DD). May be supplied independently; defaults to 30 days after from. Timestamp queries use the start of the following UTC day as the exclusive end. */ @@ -4020,7 +4148,6 @@ export interface operations { UpcomingEventsController_get: { parameters: { query?: { - sync?: "observe"; /** @description Inclusive UTC calendar start date (YYYY-MM-DD). May be supplied independently; defaults to today in UTC. */ from?: string; /** @description Inclusive UTC calendar end date (YYYY-MM-DD). May be supplied independently; defaults to 30 days after from. Timestamp queries use the start of the following UTC day as the exclusive end. */ @@ -4092,7 +4219,6 @@ export interface operations { StockController_search: { parameters: { query: { - sync?: "observe"; query: string; }; header?: never; @@ -4158,9 +4284,7 @@ export interface operations { }; StockController_getByTicker: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { ticker: string; @@ -4362,9 +4486,7 @@ export interface operations { }; StockController_get: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -4430,9 +4552,7 @@ export interface operations { }; StockController_quote: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -4499,7 +4619,6 @@ export interface operations { StockController_candles: { parameters: { query?: { - sync?: "observe"; period?: "month" | "halfYear" | "year" | "all"; }; header?: never; @@ -4633,9 +4752,7 @@ export interface operations { }; StockController_company: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -4701,9 +4818,7 @@ export interface operations { }; StockController_dividends: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -4769,9 +4884,7 @@ export interface operations { }; BondController_metrics: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -4838,7 +4951,6 @@ export interface operations { BondController_search: { parameters: { query: { - sync?: "observe"; query: string; }; header?: never; @@ -4904,9 +5016,7 @@ export interface operations { }; BondController_getByTicker: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { ticker: string; @@ -4972,9 +5082,7 @@ export interface operations { }; BondController_get: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -5040,9 +5148,7 @@ export interface operations { }; BondController_quote: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -5109,7 +5215,6 @@ export interface operations { BondController_candles: { parameters: { query?: { - sync?: "observe"; period?: "month" | "halfYear" | "year" | "all"; }; header?: never; @@ -5243,9 +5348,7 @@ export interface operations { }; BondController_coupons: { parameters: { - query?: { - sync?: "observe"; - }; + query?: never; header?: never; path: { uid: string; @@ -5503,70 +5606,4 @@ export interface operations { }; }; }; - TbankSyncController_status: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TbankSyncStatusDto"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ProblemDetailsDto"]; - }; - }; - /** @description Authentication required */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ProblemDetailsDto"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ProblemDetailsDto"]; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ProblemDetailsDto"]; - }; - }; - /** @description Upstream service unavailable */ - 503: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ProblemDetailsDto"]; - }; - }; - }; - }; } diff --git a/src/shared/api/spec/openapi.json b/src/shared/api/spec/openapi.json index 128b737..9c24e25 100644 --- a/src/shared/api/spec/openapi.json +++ b/src/shared/api/spec/openapi.json @@ -2232,6 +2232,167 @@ ] } }, + "/api/v1/brokerage-accounts/all/performance": { + "get": { + "operationId": "PerformanceController_all", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PerformanceResourceDto" + } + } + } + }, + "400": { + "description": "Invalid request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "401": { + "description": "Authentication required", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "404": { + "description": "Resource not found", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "503": { + "description": "Upstream service unavailable", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + } + }, + "security": [ + { + "bearer": [] + } + ], + "tags": [ + "brokerage-accounts" + ] + } + }, + "/api/v1/brokerage-accounts/{accountId}/performance": { + "get": { + "operationId": "PerformanceController_account", + "parameters": [ + { + "name": "accountId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PerformanceResourceDto" + } + } + } + }, + "400": { + "description": "Invalid request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "401": { + "description": "Authentication required", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "404": { + "description": "Resource not found", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + }, + "503": { + "description": "Upstream service unavailable", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetailsDto" + } + } + } + } + }, + "security": [ + { + "bearer": [] + } + ], + "tags": [ + "brokerage-accounts" + ] + } + }, "/api/v1/brokerage-accounts/all/operations": { "get": { "operationId": "BrokerageOperationsController_all", @@ -2529,19 +2690,7 @@ "/api/v1/brokerage-accounts/all/income-summary": { "get": { "operationId": "IncomeAnalyticsController_allSummary", - "parameters": [ - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - } - ], + "parameters": [], "responses": { "200": { "description": "", @@ -2618,17 +2767,6 @@ "get": { "operationId": "IncomeAnalyticsController_allAnalytics", "parameters": [ - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "from", "required": false, @@ -2733,17 +2871,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -2830,17 +2957,6 @@ "type": "string" } }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "from", "required": false, @@ -2938,17 +3054,6 @@ "get": { "operationId": "UpcomingEventsController_all", "parameters": [ - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "from", "required": false, @@ -3054,17 +3159,6 @@ "type": "string" } }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "from", "required": false, @@ -3162,17 +3256,6 @@ "get": { "operationId": "StockController_search", "parameters": [ - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "query", "required": true, @@ -3270,17 +3353,6 @@ "pattern": "^[A-Za-z0-9][A-Za-z0-9._@+-]*$", "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -3548,17 +3620,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -3644,17 +3705,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -3741,17 +3791,6 @@ "type": "string" } }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "period", "required": false, @@ -3936,17 +3975,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -4032,17 +4060,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -4128,17 +4145,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -4217,17 +4223,6 @@ "get": { "operationId": "BondController_search", "parameters": [ - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "query", "required": true, @@ -4325,17 +4320,6 @@ "pattern": "^[A-Za-z0-9][A-Za-z0-9._@+-]*$", "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -4421,17 +4405,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -4517,17 +4490,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -4614,17 +4576,6 @@ "type": "string" } }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } - }, { "name": "period", "required": false, @@ -4809,17 +4760,6 @@ "schema": { "type": "string" } - }, - { - "name": "sync", - "required": false, - "in": "query", - "schema": { - "type": "string", - "enum": [ - "observe" - ] - } } ], "responses": { @@ -5120,91 +5060,6 @@ "tbank-connection" ] } - }, - "/api/v1/tbank-sync/{id}": { - "get": { - "operationId": "TbankSyncController_status", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TbankSyncStatusDto" - } - } - } - }, - "400": { - "description": "Invalid request", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetailsDto" - } - } - } - }, - "401": { - "description": "Authentication required", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetailsDto" - } - } - } - }, - "404": { - "description": "Resource not found", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetailsDto" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetailsDto" - } - } - } - }, - "503": { - "description": "Upstream service unavailable", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetailsDto" - } - } - } - } - }, - "security": [ - { - "bearer": [] - } - ], - "tags": [ - "tbank-sync" - ] - } } }, "info": { @@ -6734,6 +6589,298 @@ "meta" ] }, + "PerformancePeriodDto": { + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date" + }, + "to": { + "type": "string", + "format": "date" + }, + "days": { + "type": "number" + } + }, + "required": [ + "from", + "to", + "days" + ] + }, + "PerformanceUnavailableReason": { + "type": "string", + "enum": [ + "ACCOUNT_VALUATION_DATES_DIFFER", + "AMBIGUOUS_RETURN", + "HISTORY_START_UNKNOWN", + "INDEX_HISTORY_UNAVAILABLE", + "NON_RUB_ACTIVITY", + "NO_SOLUTION", + "OPERATIONS_HISTORY_INCOMPLETE", + "PORTFOLIO_VALUATION_INCOMPLETE", + "UNCONFIRMED_TRANSFER", + "UNVALUED_SECURITIES_TRANSFER" + ] + }, + "PerformanceReturnDto": { + "type": "object", + "properties": { + "value": { + "type": "string", + "nullable": true, + "description": "Decimal fraction: 0.151 = 15.1%" + }, + "basis": { + "type": "string", + "enum": [ + "annual", + "period" + ] + }, + "unavailableReason": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/PerformanceUnavailableReason" + } + ] + } + }, + "required": [ + "value", + "basis", + "unavailableReason" + ] + }, + "PerformanceIndexDto": { + "type": "object", + "properties": { + "code": { + "type": "string", + "enum": [ + "MCFTRR", + "IMOEX" + ] + }, + "value": { + "nullable": true, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MoneyDto" + } + ] + }, + "return": { + "$ref": "#/components/schemas/PerformanceReturnDto" + }, + "asOf": { + "type": "string", + "format": "date", + "nullable": true + }, + "unavailableReason": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/PerformanceUnavailableReason" + } + ] + } + }, + "required": [ + "code", + "value", + "return", + "asOf", + "unavailableReason" + ] + }, + "PerformanceOutperformanceDto": { + "type": "object", + "properties": { + "percentagePoints": { + "type": "string", + "description": "Difference between rates as decimal fractions" + }, + "money": { + "$ref": "#/components/schemas/MoneyDto" + } + }, + "required": [ + "percentagePoints", + "money" + ] + }, + "PerformanceSeriesPointDto": { + "type": "object", + "properties": { + "date": { + "type": "string", + "format": "date" + }, + "netInvested": { + "type": "string" + }, + "benchmarkValue": { + "type": "string" + }, + "referenceValue": { + "type": "string", + "nullable": true + } + }, + "required": [ + "date", + "netInvested", + "benchmarkValue", + "referenceValue" + ] + }, + "PerformanceExcludedAccountDto": { + "type": "object", + "properties": { + "accountId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "reason": { + "allOf": [ + { + "$ref": "#/components/schemas/PerformanceUnavailableReason" + } + ] + } + }, + "required": [ + "accountId", + "name", + "reason" + ] + }, + "PerformanceDto": { + "type": "object", + "properties": { + "accountId": { + "type": "string" + }, + "period": { + "$ref": "#/components/schemas/PerformancePeriodDto" + }, + "netInvested": { + "$ref": "#/components/schemas/MoneyDto" + }, + "currentValue": { + "$ref": "#/components/schemas/MoneyDto" + }, + "profit": { + "$ref": "#/components/schemas/MoneyDto" + }, + "return": { + "$ref": "#/components/schemas/PerformanceReturnDto" + }, + "benchmark": { + "$ref": "#/components/schemas/PerformanceIndexDto" + }, + "reference": { + "$ref": "#/components/schemas/PerformanceIndexDto" + }, + "outperformance": { + "nullable": true, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/PerformanceOutperformanceDto" + } + ] + }, + "series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PerformanceSeriesPointDto" + } + }, + "completeness": { + "type": "string", + "enum": [ + "complete", + "incomplete" + ] + }, + "excludedAccounts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PerformanceExcludedAccountDto" + } + }, + "calculatedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "accountId", + "period", + "netInvested", + "currentValue", + "profit", + "return", + "benchmark", + "reference", + "outperformance", + "series", + "completeness", + "excludedAccounts", + "calculatedAt" + ] + }, + "PerformanceMetaDto": { + "type": "object", + "properties": { + "dependencies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvestmentDependencyDto" + } + }, + "unavailable": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PerformanceExcludedAccountDto" + } + } + }, + "required": [ + "dependencies", + "unavailable" + ] + }, + "PerformanceResourceDto": { + "type": "object", + "properties": { + "data": { + "nullable": true, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/PerformanceDto" + } + ] + }, + "meta": { + "$ref": "#/components/schemas/PerformanceMetaDto" + } + }, + "required": [ + "data", + "meta" + ] + }, "BrokerageOperationDto": { "type": "object", "properties": { @@ -9322,211 +9469,6 @@ "required": [ "token" ] - }, - "EventsInvestmentScreenDto": { - "type": "object", - "properties": { - "accountId": { - "type": "string" - }, - "screen": { - "type": "string", - "enum": [ - "events" - ] - }, - "from": { - "type": "string", - "format": "date", - "description": "Inclusive UTC calendar start date (YYYY-MM-DD). May be supplied independently; defaults to today in UTC." - }, - "to": { - "type": "string", - "format": "date", - "description": "Inclusive UTC calendar end date (YYYY-MM-DD). May be supplied independently; defaults to 30 days after from. Timestamp queries use the start of the following UTC day as the exclusive end." - } - }, - "required": [ - "accountId", - "screen" - ] - }, - "IncomeInvestmentScreenDto": { - "type": "object", - "properties": { - "accountId": { - "type": "string" - }, - "screen": { - "type": "string", - "enum": [ - "income" - ] - }, - "from": { - "type": "string", - "format": "date", - "description": "Inclusive start calendar date in Europe/Moscow (YYYY-MM-DD). Supply both from and to, or neither for the current Moscow month." - }, - "to": { - "type": "string", - "format": "date", - "description": "Inclusive end calendar date in Europe/Moscow (YYYY-MM-DD). Supply both from and to, or neither. Timestamp queries use the start of the following Moscow day as the exclusive end, capped at now." - } - }, - "required": [ - "accountId", - "screen" - ] - }, - "SyncCandleRangeDto": { - "type": "object", - "properties": { - "from": { - "type": "string", - "format": "date-time" - }, - "to": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "from", - "to" - ] - }, - "TimestampInvestmentScreenDto": { - "type": "object", - "properties": { - "accountId": { - "type": "string" - }, - "instrumentUid": { - "type": "string", - "format": "uuid" - }, - "query": { - "type": "string" - }, - "candlePeriod": { - "type": "string", - "enum": [ - "month", - "halfYear", - "year", - "all" - ] - }, - "candleRange": { - "$ref": "#/components/schemas/SyncCandleRangeDto" - }, - "categories": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "trade", - "income", - "tax", - "fee", - "transfer", - "other" - ] - } - }, - "limit": { - "type": "number", - "minimum": 1, - "maximum": 1000 - }, - "screen": { - "type": "string", - "enum": [ - "accounts", - "account", - "operations", - "stocks", - "bonds", - "stock", - "bond" - ] - }, - "from": { - "type": "string", - "format": "date-time", - "description": "Start instant for operations." - }, - "to": { - "type": "string", - "format": "date-time", - "description": "End instant for operations." - } - }, - "required": [ - "screen" - ] - }, - "TbankSyncStatusDto": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "scope": { - "oneOf": [ - { - "$ref": "#/components/schemas/IncomeInvestmentScreenDto" - }, - { - "$ref": "#/components/schemas/EventsInvestmentScreenDto" - }, - { - "$ref": "#/components/schemas/TimestampInvestmentScreenDto" - } - ], - "discriminator": { - "propertyName": "screen", - "mapping": { - "income": "#/components/schemas/IncomeInvestmentScreenDto", - "events": "#/components/schemas/EventsInvestmentScreenDto", - "accounts": "#/components/schemas/TimestampInvestmentScreenDto", - "account": "#/components/schemas/TimestampInvestmentScreenDto", - "operations": "#/components/schemas/TimestampInvestmentScreenDto", - "stocks": "#/components/schemas/TimestampInvestmentScreenDto", - "bonds": "#/components/schemas/TimestampInvestmentScreenDto", - "stock": "#/components/schemas/TimestampInvestmentScreenDto", - "bond": "#/components/schemas/TimestampInvestmentScreenDto" - } - }, - "nullable": true - }, - "now": { - "type": "string", - "format": "date-time" - }, - "state": { - "type": "string", - "enum": [ - "running", - "succeeded", - "failed", - "cancelled" - ] - }, - "errorCode": { - "type": "string", - "nullable": true - } - }, - "required": [ - "id", - "scope", - "now", - "state", - "errorCode" - ] } } }