feat: initial commit
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
"""KPI analytics and pricing tiers
|
||||
|
||||
Revision ID: 010
|
||||
Revises: 009
|
||||
Create Date: 2026-03-02
|
||||
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
revision: str = "010"
|
||||
down_revision: Union[str, None] = "009"
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# Add project_manager to userrole enum — must be outside a transaction
|
||||
op.execute("COMMIT")
|
||||
op.execute("ALTER TYPE userrole ADD VALUE IF NOT EXISTS 'project_manager'")
|
||||
op.execute("BEGIN")
|
||||
|
||||
# Lifecycle timestamps + estimated_price on orders
|
||||
op.execute(
|
||||
"ALTER TABLE orders "
|
||||
"ADD COLUMN IF NOT EXISTS submitted_at TIMESTAMP WITHOUT TIME ZONE"
|
||||
)
|
||||
op.execute(
|
||||
"ALTER TABLE orders "
|
||||
"ADD COLUMN IF NOT EXISTS processing_started_at TIMESTAMP WITHOUT TIME ZONE"
|
||||
)
|
||||
op.execute(
|
||||
"ALTER TABLE orders "
|
||||
"ADD COLUMN IF NOT EXISTS completed_at TIMESTAMP WITHOUT TIME ZONE"
|
||||
)
|
||||
op.execute(
|
||||
"ALTER TABLE orders "
|
||||
"ADD COLUMN IF NOT EXISTS rejected_at TIMESTAMP WITHOUT TIME ZONE"
|
||||
)
|
||||
op.execute(
|
||||
"ALTER TABLE orders "
|
||||
"ADD COLUMN IF NOT EXISTS estimated_price NUMERIC(12, 2)"
|
||||
)
|
||||
|
||||
# pricing_tiers table
|
||||
op.execute(
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS pricing_tiers (
|
||||
id SERIAL PRIMARY KEY,
|
||||
category_key VARCHAR(100) NOT NULL,
|
||||
quality_level VARCHAR(50) NOT NULL DEFAULT 'Normal',
|
||||
price_per_item NUMERIC(10, 2) NOT NULL,
|
||||
description TEXT,
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT uq_pricing_tier UNIQUE (category_key, quality_level)
|
||||
)
|
||||
"""
|
||||
)
|
||||
op.execute(
|
||||
"CREATE INDEX IF NOT EXISTS ix_pricing_tiers_category_key "
|
||||
"ON pricing_tiers (category_key)"
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.execute("DROP TABLE IF EXISTS pricing_tiers")
|
||||
op.execute("ALTER TABLE orders DROP COLUMN IF EXISTS estimated_price")
|
||||
op.execute("ALTER TABLE orders DROP COLUMN IF EXISTS rejected_at")
|
||||
op.execute("ALTER TABLE orders DROP COLUMN IF EXISTS completed_at")
|
||||
op.execute("ALTER TABLE orders DROP COLUMN IF EXISTS processing_started_at")
|
||||
op.execute("ALTER TABLE orders DROP COLUMN IF EXISTS submitted_at")
|
||||
# Note: removing enum values is not supported in PostgreSQL without full recreation
|
||||
Reference in New Issue
Block a user