103 lines
3.7 KiB
Python
103 lines
3.7 KiB
Python
"""add missing settings columns to tenant settings
|
|
|
|
Revision ID: 20251030_add_missing_settings
|
|
Revises: 20251028_remove_sub_tier
|
|
Create Date: 2025-10-30
|
|
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.dialects import postgresql
|
|
from uuid import uuid4
|
|
import json
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = '20251030_add_missing_settings'
|
|
down_revision = '20251028_remove_sub_tier'
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def get_default_settings():
|
|
"""Get default settings for the new categories"""
|
|
return {
|
|
"replenishment_settings": {
|
|
"projection_horizon_days": 7,
|
|
"service_level": 0.95,
|
|
"buffer_days": 1,
|
|
"enable_auto_replenishment": True,
|
|
"min_order_quantity": 1.0,
|
|
"max_order_quantity": 1000.0,
|
|
"demand_forecast_days": 14
|
|
},
|
|
"safety_stock_settings": {
|
|
"service_level": 0.95,
|
|
"method": "statistical",
|
|
"min_safety_stock": 0.0,
|
|
"max_safety_stock": 100.0,
|
|
"reorder_point_calculation": "safety_stock_plus_lead_time_demand"
|
|
},
|
|
"moq_settings": {
|
|
"consolidation_window_days": 7,
|
|
"allow_early_ordering": True,
|
|
"enable_batch_optimization": True,
|
|
"min_batch_size": 1.0,
|
|
"max_batch_size": 1000.0
|
|
},
|
|
"supplier_selection_settings": {
|
|
"price_weight": 0.40,
|
|
"lead_time_weight": 0.20,
|
|
"quality_weight": 0.20,
|
|
"reliability_weight": 0.20,
|
|
"diversification_threshold": 1000,
|
|
"max_single_percentage": 0.70,
|
|
"enable_supplier_score_optimization": True
|
|
}
|
|
}
|
|
|
|
|
|
def upgrade():
|
|
"""Add missing settings columns to tenant_settings table"""
|
|
# Add the missing columns with default values
|
|
default_settings = get_default_settings()
|
|
|
|
# Add replenishment_settings column
|
|
op.add_column('tenant_settings',
|
|
sa.Column('replenishment_settings', postgresql.JSON(),
|
|
nullable=False,
|
|
server_default=str(default_settings["replenishment_settings"]).replace("'", '"').replace("True", "true").replace("False", "false"))
|
|
)
|
|
|
|
# Add safety_stock_settings column
|
|
op.add_column('tenant_settings',
|
|
sa.Column('safety_stock_settings', postgresql.JSON(),
|
|
nullable=False,
|
|
server_default=str(default_settings["safety_stock_settings"]).replace("'", '"').replace("True", "true").replace("False", "false"))
|
|
)
|
|
|
|
# Add moq_settings column
|
|
op.add_column('tenant_settings',
|
|
sa.Column('moq_settings', postgresql.JSON(),
|
|
nullable=False,
|
|
server_default=str(default_settings["moq_settings"]).replace("'", '"').replace("True", "true").replace("False", "false"))
|
|
)
|
|
|
|
# Add supplier_selection_settings column
|
|
op.add_column('tenant_settings',
|
|
sa.Column('supplier_selection_settings', postgresql.JSON(),
|
|
nullable=False,
|
|
server_default=str(default_settings["supplier_selection_settings"]).replace("'", '"').replace("True", "true").replace("False", "false"))
|
|
)
|
|
|
|
# Update the updated_at timestamp for all existing rows
|
|
connection = op.get_bind()
|
|
connection.execute(sa.text("UPDATE tenant_settings SET updated_at = now()"))
|
|
|
|
|
|
def downgrade():
|
|
"""Remove the added settings columns from tenant_settings table"""
|
|
op.drop_column('tenant_settings', 'supplier_selection_settings')
|
|
op.drop_column('tenant_settings', 'moq_settings')
|
|
op.drop_column('tenant_settings', 'safety_stock_settings')
|
|
op.drop_column('tenant_settings', 'replenishment_settings')
|