From 1cb0b5ddfeece51d33227009b25dedaa391aba71 Mon Sep 17 00:00:00 2001 From: Leopoldadmin Date: Sat, 4 Jul 2026 00:23:13 +0000 Subject: [PATCH] feat(core): add TaxRate model --- app/models/tax.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 app/models/tax.py diff --git a/app/models/tax.py b/app/models/tax.py new file mode 100644 index 0000000..d2acc6f --- /dev/null +++ b/app/models/tax.py @@ -0,0 +1,31 @@ +"""Tax rate model — ERP tax configuration.""" + +from __future__ import annotations + +import uuid +from datetime import datetime + +from sqlalchemy import Boolean, DateTime, Index, Numeric, String +from sqlalchemy.dialects.postgresql import UUID as PGUUID +from sqlalchemy.orm import Mapped, mapped_column + +from app.core.db import Base, TenantMixin + + +class TaxRate(Base, TenantMixin): + """Tax rate entity — e.g. 'Mehrwertsteuer 19%'.""" + + __tablename__ = "tax_rates" + __table_args__ = ( + Index("ix_tax_rates_tenant_name", "tenant_id", "name"), + Index("ix_tax_rates_tenant_default", "tenant_id", "is_default"), + ) + + id: Mapped[uuid.UUID] = mapped_column( + PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4 + ) + name: Mapped[str] = mapped_column(String(100), nullable=False) + rate: Mapped[float] = mapped_column(Numeric(5, 2), nullable=False) + is_default: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) + country: Mapped[str | None] = mapped_column(String(2), nullable=True) + deleted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)