MukeshKapoor25's picture
fix: Remove SQLAlchemy relationships from order models
c3acfb2
"""
SQLAlchemy models for sales orders.
Maps to trans.sales_orders, trans.sales_order_items, and trans.sales_order_addresses tables.
Uses UUID for all ID fields.
No foreign key constraints or relationships - managed at application level.
"""
from sqlalchemy import Column, String, Integer, Numeric, DateTime, Text, ARRAY, Date
from sqlalchemy.dialects.postgresql import UUID
from datetime import datetime
import uuid
from app.core.database import Base
class SalesOrder(Base):
"""Sales order model - trans.sales_orders table"""
__tablename__ = "sales_orders"
__table_args__ = {"schema": "trans"}
sales_order_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
order_number = Column(String(50), unique=True, nullable=False, index=True)
merchant_id = Column(UUID(as_uuid=True), nullable=False, index=True)
order_date = Column(DateTime(timezone=True), nullable=False, default=datetime.utcnow)
status = Column(String(50), nullable=False, default="pending")
# Customer information
customer_id = Column(UUID(as_uuid=True), nullable=False, index=True)
customer_name = Column(String(255), nullable=True)
customer_type = Column(String(50), nullable=True, default="retail")
customer_phone = Column(String(20), nullable=True)
customer_email = Column(String(255), nullable=True)
customer_gstin = Column(String(15), nullable=True)
# Financial information
subtotal = Column(Numeric(15, 2), nullable=False, default=0.0)
total_discount = Column(Numeric(15, 2), nullable=False, default=0.0)
total_tax = Column(Numeric(15, 2), nullable=False, default=0.0)
shipping_charges = Column(Numeric(15, 2), nullable=False, default=0.0)
grand_total = Column(Numeric(15, 2), nullable=False, default=0.0)
cgst = Column(Numeric(15, 2), nullable=True, default=0.0)
sgst = Column(Numeric(15, 2), nullable=True, default=0.0)
igst = Column(Numeric(15, 2), nullable=True, default=0.0)
# Payment information
payment_type = Column(String(50), nullable=True)
payment_status = Column(String(50), nullable=False, default="pending")
payment_method = Column(String(50), nullable=True)
payment_date = Column(DateTime(timezone=True), nullable=True)
payment_reference = Column(String(255), nullable=True)
amount_paid = Column(Numeric(15, 2), nullable=False, default=0.0)
amount_due = Column(Numeric(15, 2), nullable=False, default=0.0)
credit_terms = Column(String(100), nullable=True)
credit_limit = Column(Numeric(15, 2), nullable=True)
# Fulfillment information
fulfillment_status = Column(String(50), nullable=False, default="pending")
expected_delivery_date = Column(DateTime(timezone=True), nullable=True)
actual_delivery_date = Column(DateTime(timezone=True), nullable=True)
# Invoice information
invoice_id = Column(UUID(as_uuid=True), nullable=True)
invoice_number = Column(String(50), nullable=True)
invoice_date = Column(DateTime(timezone=True), nullable=True)
invoice_pdf_url = Column(Text, nullable=True)
# Additional information
notes = Column(Text, nullable=True)
internal_notes = Column(Text, nullable=True)
# Audit fields
created_by = Column(String(100), nullable=True)
created_at = Column(DateTime(timezone=True), nullable=False, default=datetime.utcnow)
updated_at = Column(DateTime(timezone=True), nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
approved_by = Column(String(100), nullable=True)
approved_at = Column(DateTime(timezone=True), nullable=True)
# Metadata
source = Column(String(50), nullable=True, default="ecommerce")
channel = Column(String(50), nullable=True, default="web")
tags = Column(ARRAY(Text), nullable=True)
version = Column(Integer, nullable=False, default=1)
class SalesOrderItem(Base):
"""Sales order item model - trans.sales_order_items table"""
__tablename__ = "sales_order_items"
__table_args__ = {"schema": "trans"}
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
sales_order_id = Column(UUID(as_uuid=True), nullable=False, index=True)
# Product information
sku = Column(String(100), nullable=True)
product_id = Column(String(100), nullable=False)
product_name = Column(String(255), nullable=False)
item_type = Column(String(50), nullable=True, default="product")
# Quantity and pricing
quantity = Column(Numeric(15, 3), nullable=False)
unit_price = Column(Numeric(15, 2), nullable=False)
tax_percent = Column(Numeric(5, 2), nullable=False, default=0.0)
discount_percent = Column(Numeric(5, 2), nullable=False, default=0.0)
line_total = Column(Numeric(15, 2), nullable=False)
# Additional information
hsn_code = Column(String(20), nullable=True)
uom = Column(String(20), nullable=True, default="PCS")
batch_no = Column(String(100), nullable=True)
serials = Column(ARRAY(Text), nullable=True)
# Service-related fields
staff_id = Column(String(100), nullable=True)
staff_name = Column(String(255), nullable=True)
# Metadata
remarks = Column(Text, nullable=True)
created_at = Column(DateTime(timezone=True), nullable=False, default=datetime.utcnow)
class SalesOrderAddress(Base):
"""Sales order address model - trans.sales_order_addresses table"""
__tablename__ = "sales_order_addresses"
__table_args__ = {"schema": "trans"}
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
sales_order_id = Column(UUID(as_uuid=True), nullable=False, index=True)
# Address type (shipping, billing)
address_type = Column(String(50), nullable=False)
# Address fields
line1 = Column(String(255), nullable=False)
line2 = Column(String(255), nullable=True)
city = Column(String(100), nullable=False)
state = Column(String(100), nullable=False)
postal_code = Column(String(20), nullable=False)
country = Column(String(100), nullable=False, default="India")
landmark = Column(String(255), nullable=True)
# Metadata
created_at = Column(DateTime(timezone=True), nullable=False, default=datetime.utcnow)