Kundengruppe je Organisation beim Anlegen und nachträglich setzen

Neue Organisationen bekamen keine Kundengruppe (nur die Rückfüllung in
Migration 0050 hatte sie gesetzt) und sahen dadurch keine Vorlagen mit
Sichtbarkeit kundengruppe. Liste/Detail liefern die Kundengruppe mit,
POST /organizations nimmt sie an, PUT .../kundengruppe ändert sie.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-14 08:50:43 +02:00
1 parent 0c268e9088
commit 48ebac7576
1 file changed
+62 -10
+62 -10
View File
@@ -206,6 +206,7 @@ class AuftragSelectRequest(BaseModel):
class CreateOrganizationRequest(BaseModel):
name: str
kundengruppe_id: str | None = None
class UpdateOrganizationRequest(BaseModel):
@@ -3182,9 +3183,11 @@ def fetch_organizations():
with conn.cursor() as cur:
cur.execute(
"""
SELECT id, name, created_at, kontakt_name, adresse, telefon, kontakt_email, notizen,
ausrollstufe
FROM organizations ORDER BY name
SELECT o.id, o.name, o.created_at, o.kontakt_name, o.adresse, o.telefon,
o.kontakt_email, o.notizen, o.ausrollstufe, o.kundengruppe_id, k.name
FROM organizations o
LEFT JOIN kundengruppen k ON k.id = o.kundengruppe_id
ORDER BY o.name
"""
)
return [
@@ -3198,10 +3201,13 @@ def fetch_organizations():
"kontakt_email": kontakt_email,
"notizen": notizen,
"ausrollstufe": ausrollstufe,
"kundengruppe_id": str(kundengruppe_id) if kundengruppe_id else None,
"kundengruppe_name": kundengruppe_name,
}
for (
org_id, name, created_at,
kontakt_name, adresse, telefon, kontakt_email, notizen, ausrollstufe,
kundengruppe_id, kundengruppe_name,
) in cur.fetchall()
]
@@ -3234,14 +3240,33 @@ def set_ausrollstufe(organization_id: str, ausrollstufe: str) -> bool:
return cur.fetchone() is not None
def set_kundengruppe(organization_id: str, kundengruppe_id: str | None) -> bool:
"""Kundengruppe steuert, welche Vorlagen-Workspaces die Organisation
sieht (Sichtbarkeit "kundengruppe"). NULL = nur globale Vorlagen."""
with get_database_connection() as conn:
with conn.cursor() as cur:
cur.execute(
"UPDATE organizations SET kundengruppe_id = %s, updated_at = now() WHERE id = %s RETURNING id",
(kundengruppe_id, organization_id),
)
return cur.fetchone() is not None
def kundengruppe_gueltig(kundengruppe_id: str | None) -> bool:
return kundengruppe_id is None or any(k["id"] == kundengruppe_id for k in fetch_kundengruppen())
def fetch_organization(organization_id: str):
with get_database_connection() as conn:
with conn.cursor() as cur:
cur.execute(
"""
SELECT id, name, created_at, kontakt_name, adresse, telefon, kontakt_email, notizen,
ausrollstufe
FROM organizations WHERE id = %s
SELECT o.id, o.name, o.created_at, o.kontakt_name, o.adresse, o.telefon,
o.kontakt_email, o.notizen, o.ausrollstufe, o.kundengruppe_id, k.name
FROM organizations o
LEFT JOIN kundengruppen k ON k.id = o.kundengruppe_id
WHERE o.id = %s
""",
(organization_id,),
)
@@ -3260,16 +3285,18 @@ def fetch_organization(organization_id: str):
"kontakt_email": row[6],
"notizen": row[7],
"ausrollstufe": row[8],
"kundengruppe_id": str(row[9]) if row[9] else None,
"kundengruppe_name": row[10],
}
def create_organization(name: str):
def create_organization(name: str, kundengruppe_id: str | None = None):
organization_id = uuid4()
with get_database_connection() as conn:
with conn.cursor() as cur:
cur.execute(
"INSERT INTO organizations (id, name) VALUES (%s, %s)",
(organization_id, name),
"INSERT INTO organizations (id, name, kundengruppe_id) VALUES (%s, %s, %s)",
(organization_id, name, kundengruppe_id),
)
# Jede Organisation bekommt von Geburt an eine Standard-OE (siehe
@@ -5965,7 +5992,10 @@ def create_organization_endpoint(
"message": "Fehlendes oder ungültiges Service-Token.",
}
return {"success": True, "organization": create_organization(payload.name)}
if not kundengruppe_gueltig(payload.kundengruppe_id):
return {"success": False, "error": "invalid_request", "message": "Unbekannte Kundengruppe."}
return {"success": True, "organization": create_organization(payload.name, payload.kundengruppe_id)}
@app.get("/api/v1/organizations/{organization_id}")
@@ -6003,6 +6033,28 @@ def put_ausrollstufe(
return {"success": True}
class SetKundengruppeRequest(BaseModel):
kundengruppe_id: str | None = None
@app.put("/api/v1/organizations/{organization_id}/kundengruppe")
def put_kundengruppe(
organization_id: str,
payload: SetKundengruppeRequest,
authorization: str | None = Header(default=None),
):
if not require_service_token(authorization):
return {"success": False, "error": "unauthorized", "message": "Fehlendes oder ungültiges Service-Token."}
if not kundengruppe_gueltig(payload.kundengruppe_id):
return {"success": False, "error": "invalid_request", "message": "Unbekannte Kundengruppe."}
if not set_kundengruppe(organization_id, payload.kundengruppe_id):
return {"success": False, "error": "organization_not_found", "message": "Die Organisation wurde nicht gefunden."}
return {"success": True}
@app.get("/api/v1/organizations/{organization_id}/dashboard")
def get_customer_dashboard_endpoint(organization_id: str, authorization: str | None = Header(default=None)):
if not require_service_token(authorization):