You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

3.8 KiB

Implementation Plan: Portfolio Performance Views

Branch: 003-portfolio-performance-views | Date: 2026-03-16 | Spec: spec.md Input: Feature specification from /specs/003-portfolio-performance-views/spec.md

Summary

Add three portfolio performance views — Portfolio Summary (entity rollups), Asset Class Summary, and Activity Detail — as a tabbed page accessible from main navigation. The backend extends the existing FamilyOfficeService with new aggregation endpoints; the frontend adds a new page with three tab views using Angular Material tables. Leverages the existing FamilyOfficePerformanceCalculator for XIRR/TVPI/DPI/RVPI computations and the existing GfPerformanceMetricsComponent display patterns.

Technical Context

Language/Version: TypeScript 5.9.2, Node.js >= 22.18.0 Primary Dependencies: Angular 21.1.1, NestJS 11.1.14, Angular Material 21.1.1, Prisma 6.19.0, big.js, date-fns 4.1.0 Storage: PostgreSQL via Prisma ORM Testing: Jest 30.2.0, ts-jest, jest-preset-angular Target Platform: Web (NestJS serves Angular build), NX 22.5.3 monorepo Project Type: Full-stack web application (Angular + NestJS) Performance Goals: Summary views < 3s load, Activity filtering < 2s (per SC-001/002/003) Constraints: Accounting-format numbers (parentheses for negatives, comma separators), ratios accurate to 0.01 tolerance Scale/Scope: Family office with 4 entities, ~50+ partnerships, multi-year activity data (~200+ rows)

Constitution Check

GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.

No constitution file exists at .specify/memory/constitution.md. Gate is open — no constraints to evaluate. Will re-check after Phase 1 design if constitution is created.

Project Structure

Documentation (this feature)

specs/003-portfolio-performance-views/
├── plan.md              # This file
├── research.md          # Phase 0 output
├── data-model.md        # Phase 1 output
├── quickstart.md        # Phase 1 output
├── contracts/           # Phase 1 output
└── tasks.md             # Phase 2 output (/speckit.tasks)

Source Code (repository root)

apps/api/src/app/
├── family-office/
│   ├── family-office.controller.ts    # MODIFY: add 3 new endpoints
│   ├── family-office.service.ts       # MODIFY: add aggregation methods
│   └── family-office.module.ts        # MODIFY: if new providers needed
├── portfolio/calculator/family-office/
│   └── performance-calculator.ts      # REUSE: existing XIRR/TVPI/DPI/RVPI

apps/client/src/app/
├── pages/
│   └── portfolio-performance/         # NEW: tabbed page
│       ├── portfolio-performance-page.component.ts
│       ├── portfolio-performance-page.html
│       ├── portfolio-performance-page.scss
│       └── portfolio-performance-page.routes.ts
├── services/
│   └── family-office-data.service.ts  # MODIFY: add 3 new fetch methods
└── app.routes.ts                      # MODIFY: add route

libs/common/src/lib/
├── interfaces/
│   └── family-office.interface.ts     # MODIFY: add 3 new response interfaces
└── enums/
    └── family-office.ts               # POTENTIALLY MODIFY: asset type mappings

libs/ui/src/lib/
├── performance-metrics/               # REUSE: existing component
└── (no new UI lib components expected — tables are page-specific)

Structure Decision: NX monorepo with apps/api (NestJS), apps/client (Angular), libs/common (shared interfaces/types), libs/ui (shared components). New page follows existing patterns from family-dashboard, reports, and partnership-performance pages. API extends existing family-office module.

Complexity Tracking

No constitution violations to track.