export interface ApiResponseMeta { cachedAt: string | null; fromCache: boolean; } export interface ApiEnvelope { data: T; meta: ApiResponseMeta; } export interface StockMarketData { price: number | null; change: number | null; changePercent: number | null; open: number | null; high: number | null; low: number | null; volume: number; value: number; issueCapitalization: number | null; updatedAt: string; } export interface ShareResponse { secid: string; isin: string; name: string; shortName: string; latName: string | null; listLevel: number; issueSize: number; faceValue: number; faceUnit: string; type: string; marketData: StockMarketData; } export interface DividendItem { registryCloseDate: string; value: number; currency: string; } export interface ShareHistoryItem { date: string; open: number; high: number; low: number; close: number; volume: number; value: number; } export interface BondMarketData { price: number | null; yieldToMaturity: number | null; duration: number | null; accruedInt: number | null; couponValue: number | null; couponPercent: number | null; nextCouponDate: string | null; open: number; high: number | null; low: number | null; volume: number; updatedAt: string; } export interface BondResponse { secid: string; isin: string; name: string; shortName: string; latName: string | null; listLevel: number; issueSize: number; faceValue: number; faceUnit: string; matDate: string; couponValue: number; couponPercent: number | null; couponPeriod: number; nextCoupon: string | null; accruedInt: number; bondType: string; bondSubType: string; offerDate: string | null; buybackDate: string | null; marketData: BondMarketData; } export interface BondHistoryItem { date: string; closePrice: number; yieldClose: number | null; duration: number | null; } export interface CandleItem { open: number; high: number; low: number; close: number; volume: number; value: number; begin: string; end: string; } export interface SearchResultItem { secid: string; isin: string; shortName: string; type: 'share' | 'bond'; listLevel: number; currency: string | null; price: number | null; } export interface HealthResponse { status: string; timestamp: string; uptime: number; } export interface UserResponse { id: number; email: string; name: string | null; role: string; } export interface AuthResponse { user: UserResponse; accessToken: string; } export interface Portfolio { id: number; name: string; description: string | null; currency: string; createdAt: string; updatedAt: string; totalValue: number; positionCount: number; shareCount: number; bondCount: number; } export interface PositionWithPrice { id: number; secid: string; shortName: string | null; type: 'share' | 'bond'; quantity: number; notes: string | null; tags: string[] | null; currentPrice: number | null; currentValue: number | null; weightPercent: number; change?: number | null; changePercent?: number | null; yieldToMaturity?: number | null; duration?: number | null; couponValue?: number | null; couponPercent?: number | null; nextCouponDate?: string | null; matDate?: string | null; accruedInt?: number | null; bid?: number | null; offer?: number | null; couponPeriod?: number | null; bondType?: string | null; offerDate?: string | null; } export interface PortfolioDetail extends Portfolio { positions: PositionWithPrice[]; totalValue: number; } export interface Position { id: number; secid: string; quantity: number; notes: string | null; tags: string[] | null; portfolioId: number; createdAt: string; updatedAt: string; }