"""add task_mapping (Phase 4 task-to-goal integration) Revision ID: 006 Revises: 005 Create Date: 2026-06-16 Phase 4: the ImpactFlow core time-tracker posts each logged unit of work here, mapped to the profile foundation it builds toward. The work-pattern aggregation rolls these up to feed the coaching reminder engine and the goal dashboard. """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op revision: str = "006" down_revision: Union[str, None] = "005" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( "task_mapping", sa.Column("id", sa.String(), primary_key=True), sa.Column( "user_id", sa.String(), sa.ForeignKey("users.id"), nullable=False, ), sa.Column("external_task_id", sa.String(), nullable=False), sa.Column("task_label", sa.String(), nullable=True), sa.Column("foundation", sa.String(), nullable=False), sa.Column("minutes", sa.Integer(), nullable=False, server_default="0"), sa.Column("occurred_at", sa.DateTime(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), ) op.create_index("ix_task_mapping_user_id", "task_mapping", ["user_id"]) op.create_index( "ix_task_mapping_foundation", "task_mapping", ["foundation"] ) op.create_index( "ix_task_mapping_occurred_at", "task_mapping", ["occurred_at"] ) def downgrade() -> None: op.drop_index("ix_task_mapping_occurred_at", table_name="task_mapping") op.drop_index("ix_task_mapping_foundation", table_name="task_mapping") op.drop_index("ix_task_mapping_user_id", table_name="task_mapping") op.drop_table("task_mapping")