- All business models: Vehicle, Order, OrderLine, Invoice, Appointment, CatalogMarca/Model/Ansamblu/Norma/Pret/TipDeviz/TipMotor, Mecanic - Sync endpoints: GET /sync/full, GET /sync/changes?since=, POST /sync/push with tenant isolation and last-write-wins conflict resolution - Order CRUD with state machine: DRAFT -> VALIDAT -> FACTURAT Auto-recalculates totals (manopera + materiale) - Vehicle CRUD: list, create, get, update - Seed data: 24 marci, 11 ansamble, 6 tipuri deviz, 5 tipuri motoare, 3 preturi - Alembic migration for all business models - 13 passing tests (auth + sync + orders) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
from sqlalchemy import Float, String, Text
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from app.db.base import Base, UUIDMixin, TenantMixin, TimestampMixin
|
|
|
|
|
|
class CatalogMarca(Base, UUIDMixin, TenantMixin, TimestampMixin):
|
|
__tablename__ = "catalog_marci"
|
|
nume: Mapped[str] = mapped_column(String(100))
|
|
|
|
|
|
class CatalogModel(Base, UUIDMixin, TimestampMixin):
|
|
__tablename__ = "catalog_modele"
|
|
marca_id: Mapped[str] = mapped_column(String(36), index=True)
|
|
nume: Mapped[str] = mapped_column(String(100))
|
|
|
|
|
|
class CatalogAnsamblu(Base, UUIDMixin, TenantMixin, TimestampMixin):
|
|
__tablename__ = "catalog_ansamble"
|
|
nume: Mapped[str] = mapped_column(String(100))
|
|
|
|
|
|
class CatalogNorma(Base, UUIDMixin, TenantMixin, TimestampMixin):
|
|
__tablename__ = "catalog_norme"
|
|
ansamblu_id: Mapped[str] = mapped_column(String(36), index=True)
|
|
descriere: Mapped[str] = mapped_column(Text)
|
|
ore: Mapped[float] = mapped_column(Float, default=0)
|
|
|
|
|
|
class CatalogPret(Base, UUIDMixin, TenantMixin, TimestampMixin):
|
|
__tablename__ = "catalog_preturi"
|
|
denumire: Mapped[str] = mapped_column(String(200))
|
|
pret: Mapped[float] = mapped_column(Float, default=0)
|
|
um: Mapped[str] = mapped_column(String(10))
|
|
|
|
|
|
class CatalogTipDeviz(Base, UUIDMixin, TenantMixin, TimestampMixin):
|
|
__tablename__ = "catalog_tipuri_deviz"
|
|
nume: Mapped[str] = mapped_column(String(100))
|
|
|
|
|
|
class CatalogTipMotor(Base, UUIDMixin, TenantMixin, TimestampMixin):
|
|
__tablename__ = "catalog_tipuri_motoare"
|
|
nume: Mapped[str] = mapped_column(String(50))
|