feat(tenancy): add merchant team CRUD with multi-store hub view

The merchant team page was read-only. Now merchant owners can invite,
edit roles, and remove team members across all their stores from a
single hub view.

Architecture: No new models — delegates to existing store_team_service.
Members are deduplicated across stores with per-store role badges.

New:
- 5 API endpoints: GET team (member-centric), GET store roles, POST
  invite (multi-store), PUT update role, DELETE remove member
- merchant-team.js Alpine component with invite/edit/remove modals
- Full CRUD template with stats cards, store filter, member table
- 7 Pydantic schemas for merchant team request/response
- 2 service methods: validate_store_ownership, get_merchant_team_members
- 25 new i18n keys across 4 tenancy locales + 1 core common key

Tests: 434 tenancy tests passing, arch-check green.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 18:57:45 +01:00
parent aaed1b2d01
commit 0455e63a2e
14 changed files with 1131 additions and 158 deletions

View File

@@ -22,6 +22,7 @@
"saving": "Speichern...",
"processing": "Verarbeiten...",
"searching": "Suchen...",
"sending": "Wird gesendet",
"refresh": "Aktualisieren",
"retry": "Erneut versuchen",
"view": "Ansehen",

View File

@@ -22,6 +22,7 @@
"saving": "Saving...",
"processing": "Processing...",
"searching": "Searching...",
"sending": "Sending",
"refresh": "Refresh",
"retry": "Retry",
"view": "View",

View File

@@ -22,6 +22,7 @@
"saving": "Enregistrement...",
"processing": "Traitement...",
"searching": "Recherche...",
"sending": "Envoi en cours",
"refresh": "Actualiser",
"retry": "Réessayer",
"view": "Voir",

View File

@@ -22,6 +22,7 @@
"saving": "Späicheren...",
"processing": "Veraarbechten...",
"searching": "Sichen...",
"sending": "Gëtt geschéckt",
"refresh": "Aktualiséieren",
"retry": "Nach eng Kéier probéieren",
"view": "Kucken",