fix(coherence): Create centralized portfolio types (E-COH-004, ST1.3)
- Created src/types/portfolio.types.ts - Added all portfolio type definitions aligned with DDL - Includes WebSocket event types for real-time updates - Types match backend portfolio.types.ts structure Part of coherence gap fix E-COH-004 - Frontend portfolio types. Types align with DDL schema (portfolio.* enums and tables). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
f7a5ddcca8
commit
c18459558f
227
src/types/portfolio.types.ts
Normal file
227
src/types/portfolio.types.ts
Normal file
@ -0,0 +1,227 @@
|
||||
/**
|
||||
* Portfolio Module Types
|
||||
* Type definitions for portfolio management, allocations, goals, and rebalancing
|
||||
* Aligned with portfolio schema DDL (00-enums.sql)
|
||||
*/
|
||||
|
||||
// ============================================================================
|
||||
// Portfolio Enums (Alineado con portfolio.* DDL)
|
||||
// ============================================================================
|
||||
|
||||
// Alineado con portfolio.risk_profile (DDL)
|
||||
export type RiskProfile = 'conservative' | 'moderate' | 'aggressive';
|
||||
|
||||
// Alineado con portfolio.goal_status (DDL)
|
||||
export type GoalStatus = 'active' | 'completed' | 'abandoned';
|
||||
|
||||
// Alineado con portfolio.rebalance_action (DDL)
|
||||
export type RebalanceAction = 'buy' | 'sell' | 'hold';
|
||||
|
||||
// Alineado con portfolio.allocation_status (DDL)
|
||||
export type AllocationStatus = 'active' | 'inactive' | 'rebalancing';
|
||||
|
||||
// ============================================================================
|
||||
// Portfolio Interfaces
|
||||
// ============================================================================
|
||||
|
||||
export interface Portfolio {
|
||||
id: string;
|
||||
userId: string;
|
||||
name: string;
|
||||
description: string | null;
|
||||
riskProfile: RiskProfile;
|
||||
totalValue: number;
|
||||
totalCost: number;
|
||||
unrealizedPnl: number;
|
||||
unrealizedPnlPercent: number;
|
||||
dayChangePercent: number;
|
||||
weekChangePercent: number;
|
||||
monthChangePercent: number;
|
||||
allTimeChangePercent: number;
|
||||
isActive: boolean;
|
||||
isPrimary: boolean;
|
||||
lastRebalancedAt: Date | null;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
}
|
||||
|
||||
export interface PortfolioAllocation {
|
||||
id: string;
|
||||
portfolioId: string;
|
||||
asset: string;
|
||||
targetPercent: number;
|
||||
currentPercent: number;
|
||||
deviation: number;
|
||||
quantity: number;
|
||||
avgCost: number;
|
||||
currentPrice: number;
|
||||
value: number;
|
||||
cost: number;
|
||||
pnl: number;
|
||||
pnlPercent: number;
|
||||
status: AllocationStatus;
|
||||
lastUpdatedAt: Date;
|
||||
createdAt: Date;
|
||||
}
|
||||
|
||||
export interface PortfolioGoal {
|
||||
id: string;
|
||||
userId: string;
|
||||
portfolioId: string | null;
|
||||
name: string;
|
||||
description: string | null;
|
||||
targetAmount: number;
|
||||
currentAmount: number;
|
||||
targetDate: Date;
|
||||
monthlyContribution: number;
|
||||
progress: number;
|
||||
projectedCompletionDate: Date | null;
|
||||
monthsRemaining: number | null;
|
||||
requiredMonthlyContribution: number | null;
|
||||
status: GoalStatus;
|
||||
completedAt: Date | null;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
}
|
||||
|
||||
export interface RebalanceHistory {
|
||||
id: string;
|
||||
portfolioId: string;
|
||||
asset: string;
|
||||
action: RebalanceAction;
|
||||
targetPercent: number;
|
||||
actualPercentBefore: number;
|
||||
actualPercentAfter: number;
|
||||
quantityChange: number;
|
||||
valueChange: number;
|
||||
priceAtRebalance: number;
|
||||
executedAt: Date;
|
||||
executionStatus: string;
|
||||
executionNotes: string | null;
|
||||
createdAt: Date;
|
||||
}
|
||||
|
||||
export interface PortfolioSnapshot {
|
||||
id: string;
|
||||
portfolioId: string;
|
||||
snapshotDate: Date;
|
||||
totalValue: number;
|
||||
totalCost: number;
|
||||
unrealizedPnl: number;
|
||||
unrealizedPnlPercent: number;
|
||||
dayChange: number;
|
||||
dayChangePercent: number;
|
||||
allocations: Record<string, unknown> | null;
|
||||
createdAt: Date;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// API Request/Response Types
|
||||
// ============================================================================
|
||||
|
||||
export interface CreatePortfolioRequest {
|
||||
name: string;
|
||||
description?: string;
|
||||
riskProfile: RiskProfile;
|
||||
}
|
||||
|
||||
export interface UpdatePortfolioRequest {
|
||||
name?: string;
|
||||
description?: string;
|
||||
riskProfile?: RiskProfile;
|
||||
isActive?: boolean;
|
||||
isPrimary?: boolean;
|
||||
}
|
||||
|
||||
export interface CreateAllocationRequest {
|
||||
portfolioId: string;
|
||||
asset: string;
|
||||
targetPercent: number;
|
||||
quantity?: number;
|
||||
avgCost?: number;
|
||||
}
|
||||
|
||||
export interface UpdateAllocationRequest {
|
||||
targetPercent?: number;
|
||||
quantity?: number;
|
||||
avgCost?: number;
|
||||
status?: AllocationStatus;
|
||||
}
|
||||
|
||||
export interface CreateGoalRequest {
|
||||
portfolioId?: string;
|
||||
name: string;
|
||||
description?: string;
|
||||
targetAmount: number;
|
||||
targetDate: string;
|
||||
monthlyContribution?: number;
|
||||
}
|
||||
|
||||
export interface UpdateGoalRequest {
|
||||
name?: string;
|
||||
description?: string;
|
||||
targetAmount?: number;
|
||||
targetDate?: string;
|
||||
monthlyContribution?: number;
|
||||
currentAmount?: number;
|
||||
status?: GoalStatus;
|
||||
}
|
||||
|
||||
export interface RebalanceRecommendation {
|
||||
asset: string;
|
||||
action: RebalanceAction;
|
||||
currentPercent: number;
|
||||
targetPercent: number;
|
||||
deviation: number;
|
||||
quantityChange: number;
|
||||
valueChange: number;
|
||||
priority: number;
|
||||
}
|
||||
|
||||
export interface PerformanceDataPoint {
|
||||
date: string;
|
||||
value: number;
|
||||
pnl: number;
|
||||
pnlPercent: number;
|
||||
change: number;
|
||||
changePercent: number;
|
||||
}
|
||||
|
||||
export interface PortfolioSummary {
|
||||
portfolio: Portfolio;
|
||||
allocations: PortfolioAllocation[];
|
||||
totalAllocated: number;
|
||||
unallocatedPercent: number;
|
||||
needsRebalance: boolean;
|
||||
lastSnapshot: PortfolioSnapshot | null;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// WebSocket Event Types
|
||||
// ============================================================================
|
||||
|
||||
export interface PortfolioUpdateEvent {
|
||||
type: 'portfolio_update';
|
||||
portfolioId: string;
|
||||
data: Partial<Portfolio>;
|
||||
}
|
||||
|
||||
export interface AllocationUpdateEvent {
|
||||
type: 'allocation_update';
|
||||
portfolioId: string;
|
||||
allocationId: string;
|
||||
data: Partial<PortfolioAllocation>;
|
||||
}
|
||||
|
||||
export interface GoalProgressEvent {
|
||||
type: 'goal_progress';
|
||||
goalId: string;
|
||||
currentAmount: number;
|
||||
progress: number;
|
||||
projectedCompletionDate: Date | null;
|
||||
}
|
||||
|
||||
export type PortfolioWebSocketEvent =
|
||||
| PortfolioUpdateEvent
|
||||
| AllocationUpdateEvent
|
||||
| GoalProgressEvent;
|
||||
Loading…
Reference in New Issue
Block a user