Release 0.2.22: capital chart, Investor View, GP stakes, doc folders
Snapshot commit bringing the uncommitted phase-2 work into version control
together with four new features and the 0.2.22 version bump.
New features:
- Investor capital-over-time chart (value, paid-in, distributions per
quarter), rendered from existing capital-account history.
- Admin Investor View: read-only reconstruction of an investor's portal
(GET /api/users/{id}/investor-view), reusing the investor portal UI.
- Document upload scoped to the selected fund's own investors, with an
explicit upload-target confirmation to prevent mis-attaching.
- GP/mgmt entities gain an Assets tab listing their stakes in the funds
they manage (new entity_stakes table + /api/entities/{id}/stakes).
- Edit-entity form (change type/status/etc.), so GP entities can be
categorized correctly.
Verified: 11/11 backend tests pass; alembic upgrades to head b8c9d0e1f2a3;
frontend tsc + vite build clean; s9pk packs at 0.2.22:0 (x86_64).
Also: ignore .DS_Store and *.s9pk artifacts.
This commit is contained in:
@@ -207,3 +207,23 @@ class CapitalAccountStatement(SQLModel, table=True):
|
||||
ending_balance_cents: int = 0 # current capital value
|
||||
document_id: int | None = Field(default=None, foreign_key="documents.id", index=True)
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
|
||||
class EntityStake(SQLModel, table=True):
|
||||
"""A holder entity's ownership stake in a fund/SPV it manages.
|
||||
|
||||
Models the assets of a GP or management company: its interest in each fund it manages,
|
||||
which are entities in their own right rather than portfolio-company holdings.
|
||||
"""
|
||||
__tablename__ = "entity_stakes"
|
||||
__table_args__ = (
|
||||
UniqueConstraint("holder_entity_id", "fund_entity_id", name="uq_stake_holder_fund"),
|
||||
)
|
||||
|
||||
id: int | None = Field(default=None, primary_key=True)
|
||||
holder_entity_id: int = Field(foreign_key="entities.id", index=True) # the GP / mgmt co
|
||||
fund_entity_id: int = Field(foreign_key="entities.id", index=True) # the fund/SPV held
|
||||
ownership_pct: float | None = None # e.g. 20.0 for a 20% interest
|
||||
value_cents: int | None = None # optional current value of the stake
|
||||
note: str | None = None
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
Reference in New Issue
Block a user