C1: Add seeds.py — EUR currency, 19% and 7% tax rates, idempotent

This commit is contained in:
2026-07-04 01:30:06 +00:00
parent 42db39cd31
commit fe2882689b
+86
View File
@@ -0,0 +1,86 @@
"""Default data seeding — EUR currency, 19% and 7% tax rates."""
from __future__ import annotations
import logging
import uuid
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.currency import Currency
from app.models.tax import TaxRate
logger = logging.getLogger(__name__)
async def seed_default_data(db: AsyncSession, tenant_id: uuid.UUID | None = None) -> None:
"""Seed default currency and tax rates for a tenant.
Idempotent: checks if data already exists before inserting.
If tenant_id is None, seeds for all existing tenants.
"""
from app.models.tenant import Tenant
if tenant_id is not None:
tenant_ids = [tenant_id]
else:
result = await db.execute(select(Tenant.id))
tenant_ids = [row[0] for row in result.all()]
for tid in tenant_ids:
await _seed_currencies(db, tid)
await _seed_tax_rates(db, tid)
await db.flush()
logger.info(f"Seeded default data for {len(tenant_ids)} tenant(s)")
async def _seed_currencies(db: AsyncSession, tenant_id: uuid.UUID) -> None:
"""Seed EUR as default currency if no currencies exist for this tenant."""
existing = await db.execute(
select(Currency).where(
Currency.tenant_id == tenant_id,
Currency.deleted_at.is_(None),
)
)
if existing.scalars().first() is not None:
return
eur = Currency(
tenant_id=tenant_id,
code="EUR",
name="Euro",
symbol="",
is_default=True,
)
db.add(eur)
logger.info(f"Seeded EUR currency for tenant {tenant_id}")
async def _seed_tax_rates(db: AsyncSession, tenant_id: uuid.UUID) -> None:
"""Seed 19% and 7% tax rates if no tax rates exist for this tenant."""
existing = await db.execute(
select(TaxRate).where(
TaxRate.tenant_id == tenant_id,
TaxRate.deleted_at.is_(None),
)
)
if existing.scalars().first() is not None:
return
vat_19 = TaxRate(
tenant_id=tenant_id,
name="Mehrwertsteuer 19%",
rate=19.00,
is_default=True,
)
vat_7 = TaxRate(
tenant_id=tenant_id,
name="Mehrwertsteuer 7%",
rate=7.00,
is_default=False,
)
db.add(vat_19)
db.add(vat_7)
logger.info(f"Seeded 19% and 7% tax rates for tenant {tenant_id}")