Refactor demo session architecture: consolidate metadata into fixture files
This commit refactors the demo session architecture to consolidate all demo configuration data into the fixture files, removing redundant metadata files. ## Changes Made: ### 1. Data Consolidation - **Removed**: `shared/demo/metadata/demo_users.json` - **Removed**: `shared/demo/metadata/tenant_configs.json` - **Updated**: Merged all user data into `02-auth.json` files - **Updated**: Merged all tenant config data into `01-tenant.json` files ### 2. Enterprise Parent Tenant Updates - Updated owner name to "Director" (matching auth fixtures) - Added description field matching tenant_configs.json - Added `base_tenant_id` to all child tenant entries - Now includes all 5 child locations (Madrid, Barcelona, Valencia, Seville, Bilbao) ### 3. Professional Tenant Updates - Added description field from tenant_configs.json - Ensured consistency with auth fixtures ### 4. Code Updates - **services/tenant/app/api/internal_demo.py**: - Fixed child tenant staff members to use enterprise parent users - Changed from professional staff IDs to enterprise staff IDs (Laura López, José Martínez, Francisco Moreno) - **services/demo_session/app/core/config.py**: - Updated DEMO_ACCOUNTS configuration with all 5 child outlets - Updated enterprise tenant name and email to match fixtures - Added descriptions for all child locations - **gateway/app/middleware/demo_middleware.py**: - Updated comments to reference fixture files as source of truth - Clarified that owner IDs come from 01-tenant.json files - **frontend/src/stores/useTenantInitializer.ts**: - Updated tenant names and descriptions to match fixture files - Added comments linking to source fixture files ## Benefits: 1. **Single Source of Truth**: All demo data now lives in fixture files 2. **Consistency**: No more sync issues between metadata and fixtures 3. **Maintainability**: Easier to update demo data (one place per tenant type) 4. **Clarity**: Clear separation between template data (fixtures) and runtime config ## Enterprise Demo Fix: The enterprise owner is now correctly added as a member of all child tenants, fixing the issue where the tenant switcher didn't show parent/child tenants and the establishments page didn't load tenants for the demo enterprise user. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,18 +21,21 @@ const getDemoTierForAccountType = (accountType: string | null): SubscriptionTier
|
|||||||
* Defines appropriate tenant characteristics based on account type
|
* Defines appropriate tenant characteristics based on account type
|
||||||
*/
|
*/
|
||||||
const getTenantDetailsForAccountType = (accountType: string | null) => {
|
const getTenantDetailsForAccountType = (accountType: string | null) => {
|
||||||
|
// These details match the fixture files:
|
||||||
|
// professional: shared/demo/fixtures/professional/01-tenant.json
|
||||||
|
// enterprise: shared/demo/fixtures/enterprise/parent/01-tenant.json
|
||||||
const details = {
|
const details = {
|
||||||
professional: {
|
professional: {
|
||||||
name: 'Panadería Profesional - Demo',
|
name: 'Panadería Artesana Madrid - Demo',
|
||||||
business_type: 'bakery',
|
business_type: 'bakery',
|
||||||
business_model: 'professional',
|
business_model: 'professional',
|
||||||
description: 'Demostración de panadería profesional'
|
description: 'Professional tier demo tenant for bakery operations'
|
||||||
},
|
},
|
||||||
enterprise: {
|
enterprise: {
|
||||||
name: 'Red de Panaderías - Demo',
|
name: 'Panadería Artesana España - Central',
|
||||||
business_type: 'bakery',
|
business_type: 'bakery',
|
||||||
business_model: 'enterprise',
|
business_model: 'enterprise',
|
||||||
description: 'Demostración de cadena de panaderías enterprise'
|
description: 'Central production facility and parent tenant for Panadería Artesana España multi-location bakery chain'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -127,6 +130,29 @@ export const useTenantInitializer = () => {
|
|||||||
apiClient.setTenantId(virtualTenantId);
|
apiClient.setTenantId(virtualTenantId);
|
||||||
console.log('✅ [TenantInitializer] Set API client tenant ID:', virtualTenantId);
|
console.log('✅ [TenantInitializer] Set API client tenant ID:', virtualTenantId);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// For enterprise demos, load the actual tenant list to show child tenants
|
||||||
|
if (demoAccountType === 'enterprise') {
|
||||||
|
console.log('🔄 [TenantInitializer] Loading available tenants for enterprise demo...');
|
||||||
|
// Use a mock user ID for demo mode
|
||||||
|
const mockUserId = 'demo-user';
|
||||||
|
|
||||||
|
// Import tenant service and load user tenants
|
||||||
|
import('../api/services/tenant').then(({ TenantService }) => {
|
||||||
|
const tenantService = new TenantService();
|
||||||
|
tenantService.getUserTenants(mockUserId)
|
||||||
|
.then(tenants => {
|
||||||
|
console.log('📋 [TenantInitializer] Loaded available tenants:', tenants.length);
|
||||||
|
// Update the tenant store with available tenants
|
||||||
|
import('../stores/tenant.store').then(({ useTenantStore }) => {
|
||||||
|
useTenantStore.getState().setAvailableTenants(tenants);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('❌ [TenantInitializer] Failed to load available tenants:', error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [isDemoMode, demoSessionId, demoAccountType, currentTenant, setCurrentTenant]);
|
}, [isDemoMode, demoSessionId, demoAccountType, currentTenant, setCurrentTenant]);
|
||||||
|
|||||||
@@ -189,10 +189,11 @@ class DemoMiddleware(BaseHTTPMiddleware):
|
|||||||
request.state.demo_session_status = current_status # Track status for monitoring
|
request.state.demo_session_status = current_status # Track status for monitoring
|
||||||
|
|
||||||
# Inject demo user context for auth middleware
|
# Inject demo user context for auth middleware
|
||||||
# Map demo account type to the actual demo user IDs from seed_demo_users.py
|
# Map demo account type to the actual demo user IDs from fixture files
|
||||||
|
# These IDs are the owner IDs from the respective 01-tenant.json files
|
||||||
DEMO_USER_IDS = {
|
DEMO_USER_IDS = {
|
||||||
"professional": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6", # María García López
|
"professional": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6", # María García López (professional/01-tenant.json -> owner.id)
|
||||||
"enterprise": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7" # Carlos Martínez Ruiz
|
"enterprise": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7" # Director (enterprise/parent/01-tenant.json -> owner.id)
|
||||||
}
|
}
|
||||||
demo_user_id = DEMO_USER_IDS.get(
|
demo_user_id = DEMO_USER_IDS.get(
|
||||||
session_info.get("demo_account_type", "professional"),
|
session_info.get("demo_account_type", "professional"),
|
||||||
|
|||||||
@@ -45,27 +45,42 @@ class Settings(BaseServiceSettings):
|
|||||||
"tenant_type": "standalone"
|
"tenant_type": "standalone"
|
||||||
},
|
},
|
||||||
"enterprise": {
|
"enterprise": {
|
||||||
"email": "demo.enterprise@panaderiacentral.com",
|
"email": "central@panaderiaartesana.es",
|
||||||
"name": "Panadería Central - Demo Enterprise",
|
"name": "Panadería Artesana España - Central",
|
||||||
"subdomain": "demo-central",
|
"subdomain": "artesana-central",
|
||||||
"base_tenant_id": "80000000-0000-4000-a000-000000000001",
|
"base_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||||
"subscription_tier": "enterprise",
|
"subscription_tier": "enterprise",
|
||||||
"tenant_type": "parent",
|
"tenant_type": "parent",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"name": "Madrid Centro",
|
"name": "Madrid - Salamanca",
|
||||||
"base_tenant_id": "A0000000-0000-4000-a000-000000000001",
|
"base_tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||||
"location": {"city": "Madrid", "zone": "Centro", "latitude": 40.4168, "longitude": -3.7038}
|
"location": {"city": "Madrid", "zone": "Salamanca", "latitude": 40.4284, "longitude": -3.6847},
|
||||||
|
"description": "Premium location in upscale Salamanca district"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Barcelona Gràcia",
|
"name": "Barcelona - Eixample",
|
||||||
"base_tenant_id": "B0000000-0000-4000-a000-000000000001",
|
"base_tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||||
"location": {"city": "Barcelona", "zone": "Gràcia", "latitude": 41.4036, "longitude": 2.1561}
|
"location": {"city": "Barcelona", "zone": "Eixample", "latitude": 41.3947, "longitude": 2.1616},
|
||||||
|
"description": "High-volume tourist and local area in central Barcelona"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Valencia Ruzafa",
|
"name": "Valencia - Ruzafa",
|
||||||
"base_tenant_id": "C0000000-0000-4000-a000-000000000001",
|
"base_tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||||
"location": {"city": "Valencia", "zone": "Ruzafa", "latitude": 39.4623, "longitude": -0.3645}
|
"location": {"city": "Valencia", "zone": "Ruzafa", "latitude": 39.4623, "longitude": -0.3645},
|
||||||
|
"description": "Trendy artisan neighborhood with focus on quality"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Seville - Triana",
|
||||||
|
"base_tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||||
|
"location": {"city": "Seville", "zone": "Triana", "latitude": 37.3828, "longitude": -6.0026},
|
||||||
|
"description": "Traditional Andalusian location with local specialties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bilbao - Casco Viejo",
|
||||||
|
"base_tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||||
|
"location": {"city": "Bilbao", "zone": "Casco Viejo", "latitude": 43.2567, "longitude": -2.9272},
|
||||||
|
"description": "Basque region location with focus on quality and local culture"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -719,19 +719,20 @@ async def create_child_outlet(
|
|||||||
)
|
)
|
||||||
db.add(child_owner_member)
|
db.add(child_owner_member)
|
||||||
|
|
||||||
# Create some staff members for the outlet (simplified)
|
# Create staff members for the outlet from parent enterprise users
|
||||||
|
# Use parent's enterprise staff (from enterprise/parent/02-auth.json)
|
||||||
staff_users = [
|
staff_users = [
|
||||||
{
|
{
|
||||||
"user_id": uuid.UUID("50000000-0000-0000-0000-000000000002"), # Sales user
|
"user_id": uuid.UUID("f6c54d0f-5899-4952-ad94-7a492c07167a"), # Laura López - Logistics
|
||||||
"role": "sales"
|
"role": "logistics_coord"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"user_id": uuid.UUID("50000000-0000-0000-0000-000000000003"), # Quality control user
|
"user_id": uuid.UUID("80765906-0074-4206-8f58-5867df1975fd"), # José Martínez - Quality
|
||||||
"role": "quality_control"
|
"role": "quality_control"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"user_id": uuid.UUID("50000000-0000-0000-0000-000000000005"), # Warehouse user
|
"user_id": uuid.UUID("701cb9d2-6049-4bb9-8d3a-1b3bd3aae45f"), # Francisco Moreno - Warehouse
|
||||||
"role": "warehouse"
|
"role": "warehouse_supervisor"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -743,7 +744,7 @@ async def create_child_outlet(
|
|||||||
role=staff_member["role"],
|
role=staff_member["role"],
|
||||||
permissions=json.dumps(["read", "write"]) if staff_member["role"] != "admin" else json.dumps(["read", "write", "admin"]),
|
permissions=json.dumps(["read", "write"]) if staff_member["role"] != "admin" else json.dumps(["read", "write", "admin"]),
|
||||||
is_active=True,
|
is_active=True,
|
||||||
invited_by=demo_owner_uuid,
|
invited_by=parent_owner_id,
|
||||||
invited_at=datetime.now(timezone.utc),
|
invited_at=datetime.now(timezone.utc),
|
||||||
joined_at=datetime.now(timezone.utc),
|
joined_at=datetime.now(timezone.utc),
|
||||||
created_at=datetime.now(timezone.utc)
|
created_at=datetime.now(timezone.utc)
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
{
|
{
|
||||||
"tenant": {
|
"tenant": {
|
||||||
"id": "80000000-0000-4000-a000-000000000001",
|
"id": "80000000-0000-4000-a000-000000000001",
|
||||||
"name": "Panader\u00eda Artesana Espa\u00f1a - Central",
|
"name": "Panadería Artesana España - Central",
|
||||||
"subscription_tier": "enterprise",
|
"subscription_tier": "enterprise",
|
||||||
"tenant_type": "parent",
|
"tenant_type": "parent",
|
||||||
"email": "central@panaderiaartesana.es",
|
"email": "central@panaderiaartesana.es",
|
||||||
"subdomain": "artesana-central",
|
"subdomain": "artesana-central",
|
||||||
|
"description": "Central production facility and parent tenant for Panadería Artesana España multi-location bakery chain",
|
||||||
"is_active": true,
|
"is_active": true,
|
||||||
"created_at": "2024-01-01T00:00:00Z",
|
"created_at": "2024-01-01T00:00:00Z",
|
||||||
"updated_at": "2024-01-01T00:00:00Z"
|
"updated_at": "2024-01-01T00:00:00Z"
|
||||||
},
|
},
|
||||||
"owner": {
|
"owner": {
|
||||||
"id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
"id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||||
"name": "Carlos Rodr\u00edguez",
|
"name": "Director",
|
||||||
"email": "director@panaderiaartesana.es",
|
"email": "director@panaderiaartesana.es",
|
||||||
"role": "owner"
|
"role": "owner"
|
||||||
},
|
},
|
||||||
@@ -58,6 +59,7 @@
|
|||||||
{
|
{
|
||||||
"id": "A0000000-0000-4000-a000-000000000001",
|
"id": "A0000000-0000-4000-a000-000000000001",
|
||||||
"name": "Madrid - Salamanca",
|
"name": "Madrid - Salamanca",
|
||||||
|
"base_tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||||
"location": {
|
"location": {
|
||||||
"city": "Madrid",
|
"city": "Madrid",
|
||||||
"zone": "Salamanca",
|
"zone": "Salamanca",
|
||||||
@@ -69,6 +71,7 @@
|
|||||||
{
|
{
|
||||||
"id": "B0000000-0000-4000-a000-000000000001",
|
"id": "B0000000-0000-4000-a000-000000000001",
|
||||||
"name": "Barcelona - Eixample",
|
"name": "Barcelona - Eixample",
|
||||||
|
"base_tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||||
"location": {
|
"location": {
|
||||||
"city": "Barcelona",
|
"city": "Barcelona",
|
||||||
"zone": "Eixample",
|
"zone": "Eixample",
|
||||||
@@ -80,6 +83,7 @@
|
|||||||
{
|
{
|
||||||
"id": "C0000000-0000-4000-a000-000000000001",
|
"id": "C0000000-0000-4000-a000-000000000001",
|
||||||
"name": "Valencia - Ruzafa",
|
"name": "Valencia - Ruzafa",
|
||||||
|
"base_tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||||
"location": {
|
"location": {
|
||||||
"city": "Valencia",
|
"city": "Valencia",
|
||||||
"zone": "Ruzafa",
|
"zone": "Ruzafa",
|
||||||
@@ -91,6 +95,7 @@
|
|||||||
{
|
{
|
||||||
"id": "D0000000-0000-4000-a000-000000000001",
|
"id": "D0000000-0000-4000-a000-000000000001",
|
||||||
"name": "Seville - Triana",
|
"name": "Seville - Triana",
|
||||||
|
"base_tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||||
"location": {
|
"location": {
|
||||||
"city": "Seville",
|
"city": "Seville",
|
||||||
"zone": "Triana",
|
"zone": "Triana",
|
||||||
@@ -102,6 +107,7 @@
|
|||||||
{
|
{
|
||||||
"id": "E0000000-0000-4000-a000-000000000001",
|
"id": "E0000000-0000-4000-a000-000000000001",
|
||||||
"name": "Bilbao - Casco Viejo",
|
"name": "Bilbao - Casco Viejo",
|
||||||
|
"base_tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||||
"location": {
|
"location": {
|
||||||
"city": "Bilbao",
|
"city": "Bilbao",
|
||||||
"zone": "Casco Viejo",
|
"zone": "Casco Viejo",
|
||||||
@@ -111,4 +117,4 @@
|
|||||||
"description": "Basque region location with focus on quality and local culture"
|
"description": "Basque region location with focus on quality and local culture"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
"id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
"id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||||
"name": "Director",
|
"name": "Director",
|
||||||
|
"full_name": "Director",
|
||||||
"email": "director@panaderiaartesana.es",
|
"email": "director@panaderiaartesana.es",
|
||||||
"role": "owner",
|
"role": "owner",
|
||||||
"is_active": true,
|
"is_active": true,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"email": "demo.professional@panaderiaartesana.com",
|
"email": "demo.professional@panaderiaartesana.com",
|
||||||
"subscription_tier": "professional",
|
"subscription_tier": "professional",
|
||||||
"tenant_type": "standalone",
|
"tenant_type": "standalone",
|
||||||
|
"description": "Professional tier demo tenant for bakery operations",
|
||||||
"is_active": true,
|
"is_active": true,
|
||||||
"created_at": "2025-01-15T06:00:00Z",
|
"created_at": "2025-01-15T06:00:00Z",
|
||||||
"updated_at": "2025-01-15T06:00:00Z"
|
"updated_at": "2025-01-15T06:00:00Z"
|
||||||
|
|||||||
@@ -1,108 +0,0 @@
|
|||||||
{
|
|
||||||
"owners": {
|
|
||||||
"professional": {
|
|
||||||
"id": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
|
||||||
"name": "María García López",
|
|
||||||
"email": "maria.garcia@panaderiaartesana.com",
|
|
||||||
"role": "owner",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
"enterprise": {
|
|
||||||
"id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
|
||||||
"name": "Carlos Martínez Ruiz",
|
|
||||||
"email": "carlos.martinez@panaderiacentral.com",
|
|
||||||
"role": "owner",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"staff": {
|
|
||||||
"professional": [
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000001",
|
|
||||||
"name": "Juan Panadero",
|
|
||||||
"role": "baker",
|
|
||||||
"email": "juan.panadero@panaderiaartesana.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000002",
|
|
||||||
"name": "Ana Ventas",
|
|
||||||
"role": "sales",
|
|
||||||
"email": "ana.ventas@panaderiaartesana.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000003",
|
|
||||||
"name": "Pedro Calidad",
|
|
||||||
"role": "quality_control",
|
|
||||||
"email": "pedro.calidad@panaderiaartesana.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000004",
|
|
||||||
"name": "Laura Admin",
|
|
||||||
"role": "admin",
|
|
||||||
"email": "laura.admin@panaderiaartesana.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000005",
|
|
||||||
"name": "Carlos Almacén",
|
|
||||||
"role": "warehouse",
|
|
||||||
"email": "carlos.almacen@panaderiaartesana.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000006",
|
|
||||||
"name": "Isabel Producción",
|
|
||||||
"role": "production_manager",
|
|
||||||
"email": "isabel.produccion@panaderiaartesana.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"enterprise": [
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000011",
|
|
||||||
"name": "Roberto Producción",
|
|
||||||
"role": "production_manager",
|
|
||||||
"email": "roberto.produccion@panaderiacentral.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000012",
|
|
||||||
"name": "Marta Calidad",
|
|
||||||
"role": "quality_control",
|
|
||||||
"email": "marta.calidad@panaderiacentral.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000013",
|
|
||||||
"name": "Javier Logística",
|
|
||||||
"role": "logistics",
|
|
||||||
"email": "javier.logistica@panaderiacentral.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000014",
|
|
||||||
"name": "Carmen Ventas",
|
|
||||||
"role": "sales",
|
|
||||||
"email": "carmen.ventas@panaderiacentral.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000015",
|
|
||||||
"name": "Luis Compras",
|
|
||||||
"role": "procurement",
|
|
||||||
"email": "luis.compras@panaderiacentral.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50000000-0000-0000-0000-000000000016",
|
|
||||||
"name": "Miguel Mantenimiento",
|
|
||||||
"role": "maintenance",
|
|
||||||
"email": "miguel.mantenimiento@panaderiacentral.com",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
{
|
|
||||||
"professional": {
|
|
||||||
"base_tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
|
||||||
"email": "demo.professional@panaderiaartesana.com",
|
|
||||||
"name": "Panadería Artesana Madrid - Demo",
|
|
||||||
"subdomain": "demo-artesana",
|
|
||||||
"subscription_tier": "professional",
|
|
||||||
"tenant_type": "standalone",
|
|
||||||
"description": "Professional tier demo tenant for bakery operations",
|
|
||||||
"created_at": "2025-01-15T06:00:00Z"
|
|
||||||
},
|
|
||||||
"enterprise": {
|
|
||||||
"base_tenant_id": "80000000-0000-4000-a000-000000000001",
|
|
||||||
"email": "central@panaderiaartesana.es",
|
|
||||||
"name": "Panadería Artesana España - Central",
|
|
||||||
"subdomain": "artesana-central",
|
|
||||||
"subscription_tier": "enterprise",
|
|
||||||
"tenant_type": "parent",
|
|
||||||
"description": "Central production facility and parent tenant for Panadería Artesana España multi-location bakery chain",
|
|
||||||
"created_at": "2024-01-01T00:00:00Z",
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"name": "Madrid - Salamanca",
|
|
||||||
"base_tenant_id": "A0000000-0000-4000-a000-000000000001",
|
|
||||||
"location": {
|
|
||||||
"city": "Madrid",
|
|
||||||
"zone": "Salamanca",
|
|
||||||
"latitude": 40.4284,
|
|
||||||
"longitude": -3.6847
|
|
||||||
},
|
|
||||||
"description": "Premium location in upscale Salamanca district"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Barcelona - Eixample",
|
|
||||||
"base_tenant_id": "B0000000-0000-4000-a000-000000000001",
|
|
||||||
"location": {
|
|
||||||
"city": "Barcelona",
|
|
||||||
"zone": "Eixample",
|
|
||||||
"latitude": 41.3947,
|
|
||||||
"longitude": 2.1616
|
|
||||||
},
|
|
||||||
"description": "High-volume tourist and local area in central Barcelona"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Valencia - Ruzafa",
|
|
||||||
"base_tenant_id": "C0000000-0000-4000-a000-000000000001",
|
|
||||||
"location": {
|
|
||||||
"city": "Valencia",
|
|
||||||
"zone": "Ruzafa",
|
|
||||||
"latitude": 39.4623,
|
|
||||||
"longitude": -0.3645
|
|
||||||
},
|
|
||||||
"description": "Trendy artisan neighborhood with focus on quality"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Seville - Triana",
|
|
||||||
"base_tenant_id": "D0000000-0000-4000-a000-000000000001",
|
|
||||||
"location": {
|
|
||||||
"city": "Seville",
|
|
||||||
"zone": "Triana",
|
|
||||||
"latitude": 37.3828,
|
|
||||||
"longitude": -6.0026
|
|
||||||
},
|
|
||||||
"description": "Traditional Andalusian location with local specialties"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Bilbao - Casco Viejo",
|
|
||||||
"base_tenant_id": "E0000000-0000-4000-a000-000000000001",
|
|
||||||
"location": {
|
|
||||||
"city": "Bilbao",
|
|
||||||
"zone": "Casco Viejo",
|
|
||||||
"latitude": 43.2567,
|
|
||||||
"longitude": -2.9272
|
|
||||||
},
|
|
||||||
"description": "Basque region location with focus on quality and local culture"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user