feat: Mandant/Reseller ohne E-Mail anlegbar (Temp-Passwort statt Einladung)
Security Audit / Python Dependency Audit (push) Has been cancelled
Security Audit / Node.js Dependency Audit (push) Has been cancelled

- admin_email bzw. reseller email optional; ohne E-Mail wird interne Login-
  Kennung (<name>@<slug>.local) + einmaliges Temp-Passwort erzeugt, Account
  sofort aktiv, kein Mailversand
- TenantOut/ResellerOut: initial_password (einmalig) ergänzt
- LoginRequest.email: str statt EmailStr (Kennung muss kein zustellbares
  Postfach sein; .local-Domains sind sonst nicht einloggbar)
- Frontend: E-Mail-Felder optional, CredDialog zeigt Login + Temp-Passwort einmalig
- Test: Anlage ohne E-Mail + Login mit generierten Zugangsdaten; 173/173 grün

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 01:34:23 +02:00
co-authored by Claude Opus 4.8
parent 898a81f499
commit 98cb2f867a
9 changed files with 215 additions and 56 deletions
+5 -3
View File
@@ -38,15 +38,17 @@ async def create_company(
current_user: User = require_role(*_reseller_roles),
db: AsyncSession = Depends(get_db),
):
company = await tenant_service.create_tenant(
company, admin, initial_password = await tenant_service.create_tenant(
data, actor=current_user, db=db, reseller_id=current_user.id,
)
# Antwort aus der frisch erstellten Firma (Kennzahlen 1 Admin, 0 aktiv)
# Antwort aus der frisch erstellten Firma; bei Einladung Account inaktiv,
# bei Temp-Passwort sofort aktiv.
return TenantOut(
id=company.id, name=company.name, slug=company.slug, plan=company.plan,
is_active=company.is_active, country=company.country, reseller_id=company.reseller_id,
reseller_name=f"{current_user.first_name} {current_user.last_name}".strip(),
user_count=1, active_user_count=0, admin_email=data.admin_email,
user_count=1, active_user_count=1 if initial_password else 0,
admin_email=admin.email, initial_password=initial_password,
)