Implement fin-hub T24-T26: ingest, runway, coupling, RaaS packaging
Add CSV importers, runway calculator, budget alerts, cross-hub coupling emitters, finhub CLI, and raas-mvp-packaging docs with full test coverage.
This commit is contained in:
parent
b6993d4a05
commit
1abbbe85e4
27 changed files with 835 additions and 3 deletions
|
|
@ -1,11 +1,13 @@
|
|||
"""Fin-specific SQLAlchemy models (T23 implementation target)."""
|
||||
|
||||
from fin_hub.models.budget import Budget, BurnRate, Commitment, RunwayProjection, TokenSpend
|
||||
from fin_hub.models.service_cost import ServiceCost
|
||||
|
||||
__all__ = [
|
||||
"Budget",
|
||||
"Commitment",
|
||||
"BurnRate",
|
||||
"Commitment",
|
||||
"RunwayProjection",
|
||||
"ServiceCost",
|
||||
"TokenSpend",
|
||||
]
|
||||
26
src/fin_hub/models/service_cost.py
Normal file
26
src/fin_hub/models/service_cost.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
"""Per-service infrastructure cost attribution (fin→ops coupling)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import uuid
|
||||
from datetime import date
|
||||
|
||||
from sqlalchemy import Date, Float, String
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from hub_core.models.base import Base, TimestampMixin
|
||||
|
||||
|
||||
class ServiceCost(Base, TimestampMixin):
|
||||
__tablename__ = "fin_service_costs"
|
||||
|
||||
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
service_id: Mapped[str] = mapped_column(String(128), nullable=False, index=True)
|
||||
environment: Mapped[str] = mapped_column(String(64), nullable=False, default="production")
|
||||
period_month: Mapped[str] = mapped_column(String(7), nullable=False, index=True)
|
||||
amount: Mapped[float] = mapped_column(Float, nullable=False, default=0.0)
|
||||
currency: Mapped[str] = mapped_column(String(3), nullable=False, default="EUR")
|
||||
source: Mapped[str] = mapped_column(String(32), nullable=False)
|
||||
incurred_on: Mapped[date | None] = mapped_column(Date, nullable=True)
|
||||
notes: Mapped[str | None] = mapped_column(String(512), nullable=True)
|
||||
Loading…
Add table
Add a link
Reference in a new issue