from sqlalchemy import BigInteger, Integer, Numeric, String, Text from sqlalchemy.orm import Mapped, mapped_column from backend.app.models.base import BaseModel, TimestampMixin class CrmCustomer(TimestampMixin, BaseModel): __tablename__ = "crm_customer" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) customer_name: Mapped[str] = mapped_column(String(64), nullable=False) mobile: Mapped[str] = mapped_column(String(20), nullable=False) address: Mapped[str | None] = mapped_column(String(255)) settlement_type: Mapped[str | None] = mapped_column(String(32)) settlement_days: Mapped[int | None] = mapped_column(Integer) settlement_start_type: Mapped[str | None] = mapped_column(String(32)) customer_type: Mapped[str | None] = mapped_column(String(32)) salesman_id: Mapped[int | None] = mapped_column(BigInteger) credit_limit: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) arrears_amount: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) status: Mapped[int] = mapped_column(Integer, nullable=False, default=1) remark: Mapped[str | None] = mapped_column(String(500)) deleted: Mapped[int] = mapped_column(Integer, nullable=False, default=0) class Product(TimestampMixin, BaseModel): __tablename__ = "product" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) product_name: Mapped[str] = mapped_column(String(128), nullable=False) specification: Mapped[str] = mapped_column(String(128), nullable=False) unit: Mapped[str] = mapped_column(String(32), nullable=False) category: Mapped[str] = mapped_column(String(64), nullable=False) cost_price: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) sale_price: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) status: Mapped[int] = mapped_column(Integer, nullable=False, default=1) remark: Mapped[str | None] = mapped_column(String(500)) deleted: Mapped[int] = mapped_column(Integer, nullable=False, default=0) class BaseSupplier(TimestampMixin, BaseModel): __tablename__ = "base_supplier" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) supplier_name: Mapped[str] = mapped_column(String(128), nullable=False) supplier_type: Mapped[str] = mapped_column(String(32), nullable=False) contact_name: Mapped[str | None] = mapped_column(String(64)) contact_mobile: Mapped[str | None] = mapped_column(String(20)) address: Mapped[str | None] = mapped_column(String(255)) template_type: Mapped[str | None] = mapped_column(String(64)) status: Mapped[int] = mapped_column(Integer, nullable=False, default=1) remark: Mapped[str | None] = mapped_column(String(500)) deleted: Mapped[int] = mapped_column(Integer, nullable=False, default=0) class SalesOrder(TimestampMixin, BaseModel): __tablename__ = "sales_order" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) order_no: Mapped[str] = mapped_column(String(64), nullable=False, unique=True) customer_id: Mapped[int | None] = mapped_column(BigInteger) customer_name_snapshot: Mapped[str] = mapped_column(String(64), nullable=False) customer_mobile_snapshot: Mapped[str] = mapped_column(String(20), nullable=False) salesman_id: Mapped[int] = mapped_column(BigInteger, nullable=False) order_source: Mapped[str | None] = mapped_column(String(64)) order_status: Mapped[str] = mapped_column(String(32), nullable=False) delivery_type: Mapped[str | None] = mapped_column(String(32)) factory_id: Mapped[int | None] = mapped_column(BigInteger) sale_price_total: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) cost_price_total: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) rebate_total: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) freight_total: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) tax_total: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) other_fee_total: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) profit_total: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) profit_rate: Mapped[float] = mapped_column(Numeric(10, 4), nullable=False, default=0) created_by: Mapped[int] = mapped_column(BigInteger, nullable=False) submitted_at: Mapped[str | None] = mapped_column(String(32)) approved_by: Mapped[int | None] = mapped_column(BigInteger) approved_at: Mapped[str | None] = mapped_column(String(32)) canceled_at: Mapped[str | None] = mapped_column(String(32)) completed_at: Mapped[str | None] = mapped_column(String(32)) remark: Mapped[str | None] = mapped_column(String(1000)) deleted: Mapped[int] = mapped_column(Integer, nullable=False, default=0) class SalesOrderItem(TimestampMixin, BaseModel): __tablename__ = "sales_order_item" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) order_id: Mapped[int] = mapped_column(BigInteger, nullable=False) product_id: Mapped[int | None] = mapped_column(BigInteger) product_name_snapshot: Mapped[str] = mapped_column(String(128), nullable=False) specification_snapshot: Mapped[str] = mapped_column(String(128), nullable=False) unit_snapshot: Mapped[str] = mapped_column(String(32), nullable=False) quantity: Mapped[float] = mapped_column(Numeric(18, 4), nullable=False, default=0) sale_price: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) cost_price: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) rebate_amount: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) freight_amount: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) tax_amount: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) other_fee_amount: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) line_profit: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False, default=0) remark: Mapped[str | None] = mapped_column(String(500)) deleted: Mapped[int] = mapped_column(Integer, nullable=False, default=0)