refactor: Unify database migrations into single initial schemas
Consolidated incremental migrations into single unified initial schema files for both procurement and production services. This simplifies database setup and eliminates migration chain complexity. Changes: - Procurement: Merged 3 migrations into 001_unified_initial_schema.py - Initial schema (20251015_1229) - Add supplier_price_list_id (20251030_0737) - Add JTBD reasoning fields (20251107) - Production: Merged 3 migrations into 001_unified_initial_schema.py - Initial schema (20251015_1231) - Add waste tracking fields (20251023_0900) - Add JTBD reasoning fields (20251107) All new fields (reasoning, consequence, reasoning_data, waste_defect_type, is_ai_assisted, supplier_price_list_id) are now included in the initial schemas from the start. Updated model files to use deferred() for reasoning fields to prevent breaking queries when running against existing databases.
This commit is contained in:
@@ -12,7 +12,7 @@ from datetime import datetime, timezone
|
||||
from decimal import Decimal
|
||||
from sqlalchemy import Column, String, DateTime, Float, Integer, Text, Index, Boolean, Numeric, ForeignKey, Enum as SQLEnum
|
||||
from sqlalchemy.dialects.postgresql import UUID, JSONB
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.orm import relationship, deferred
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
from shared.database.base import Base
|
||||
@@ -120,9 +120,10 @@ class PurchaseOrder(Base):
|
||||
terms_and_conditions = Column(Text, nullable=True)
|
||||
|
||||
# JTBD Dashboard: Reasoning and consequences for user transparency
|
||||
reasoning = Column(Text, nullable=True) # Why this PO was created (e.g., "Low flour stock (2 days left)")
|
||||
consequence = Column(Text, nullable=True) # What happens if not approved (e.g., "Stock out risk in 48 hours")
|
||||
reasoning_data = Column(JSONB, nullable=True) # Structured reasoning data
|
||||
# Deferred loading to prevent breaking queries when columns don't exist yet
|
||||
reasoning = deferred(Column(Text, nullable=True)) # Why this PO was created (e.g., "Low flour stock (2 days left)")
|
||||
consequence = deferred(Column(Text, nullable=True)) # What happens if not approved (e.g., "Stock out risk in 48 hours")
|
||||
reasoning_data = deferred(Column(JSONB, nullable=True)) # Structured reasoning data
|
||||
# reasoning_data structure: {
|
||||
# "trigger": "low_stock" | "forecast_demand" | "manual",
|
||||
# "ingredients_affected": [{"id": "uuid", "name": "Flour", "current_stock": 10, "days_remaining": 2}],
|
||||
|
||||
Reference in New Issue
Block a user