- Add .gitignore - Add schemas/001_initial_schema.sql - Add seeds/001_initial_data.sql Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
275 lines
8.5 KiB
SQL
275 lines
8.5 KiB
SQL
-- ================================================================
|
|
-- PMC Database Seeds - Initial Data
|
|
-- Version: 1.0.0
|
|
-- Date: 2025-12-08
|
|
-- ================================================================
|
|
|
|
-- ================================================================
|
|
-- TENANT PLANS
|
|
-- ================================================================
|
|
|
|
INSERT INTO auth.tenant_plans (id, name, code, description, price_monthly, price_yearly, max_users, max_clients, max_brands, max_generations_month, max_storage_bytes, max_custom_models, max_training_month, features, sort_order) VALUES
|
|
-- Starter (Free/Trial)
|
|
(
|
|
'a0000000-0000-0000-0000-000000000001',
|
|
'Starter',
|
|
'starter',
|
|
'Plan gratuito para empezar',
|
|
0,
|
|
0,
|
|
3, -- max_users
|
|
5, -- max_clients
|
|
10, -- max_brands
|
|
100, -- max_generations_month
|
|
1073741824, -- max_storage_bytes (1GB)
|
|
0, -- max_custom_models
|
|
0, -- max_training_month
|
|
'{"analytics": false, "automation": false, "api_access": false, "priority_support": false}'::JSONB,
|
|
1
|
|
),
|
|
-- Pro
|
|
(
|
|
'a0000000-0000-0000-0000-000000000002',
|
|
'Pro',
|
|
'pro',
|
|
'Para equipos en crecimiento',
|
|
49.00,
|
|
470.00,
|
|
10, -- max_users
|
|
25, -- max_clients
|
|
50, -- max_brands
|
|
1000, -- max_generations_month
|
|
10737418240, -- max_storage_bytes (10GB)
|
|
10, -- max_custom_models
|
|
5, -- max_training_month
|
|
'{"analytics": true, "automation": true, "api_access": false, "priority_support": false}'::JSONB,
|
|
2
|
|
),
|
|
-- Business
|
|
(
|
|
'a0000000-0000-0000-0000-000000000003',
|
|
'Business',
|
|
'business',
|
|
'Para agencias y empresas',
|
|
149.00,
|
|
1430.00,
|
|
50, -- max_users
|
|
100, -- max_clients
|
|
200, -- max_brands
|
|
10000, -- max_generations_month
|
|
107374182400, -- max_storage_bytes (100GB)
|
|
50, -- max_custom_models
|
|
20, -- max_training_month
|
|
'{"analytics": true, "automation": true, "api_access": true, "priority_support": true}'::JSONB,
|
|
3
|
|
),
|
|
-- Enterprise
|
|
(
|
|
'a0000000-0000-0000-0000-000000000004',
|
|
'Enterprise',
|
|
'enterprise',
|
|
'Plan personalizado para grandes organizaciones',
|
|
0, -- Custom pricing
|
|
0,
|
|
-1, -- unlimited (represented as -1)
|
|
-1,
|
|
-1,
|
|
-1,
|
|
-1,
|
|
-1,
|
|
-1,
|
|
'{"analytics": true, "automation": true, "api_access": true, "priority_support": true, "sla": true, "custom_integrations": true}'::JSONB,
|
|
4
|
|
);
|
|
|
|
-- ================================================================
|
|
-- SYSTEM WORKFLOWS
|
|
-- ================================================================
|
|
|
|
INSERT INTO generation.workflows (id, name, code, description, type, input_schema, output_schema, estimated_time_seconds, is_active, is_system, tenant_id) VALUES
|
|
-- Product Photo Synthetic
|
|
(
|
|
'w0000000-0000-0000-0000-000000000001',
|
|
'Product Photo Synthetic',
|
|
'product_photo_synthetic',
|
|
'Genera fotos de producto en contexto comercial',
|
|
'image',
|
|
'{
|
|
"type": "object",
|
|
"required": ["product_description"],
|
|
"properties": {
|
|
"product_description": {"type": "string", "description": "Descripcion del producto"},
|
|
"reference_image": {"type": "string", "format": "uri", "description": "URL imagen referencia"},
|
|
"background": {"type": "string", "enum": ["white", "lifestyle", "custom"], "default": "white"},
|
|
"style": {"type": "string", "enum": ["minimalist", "premium", "casual"], "default": "minimalist"},
|
|
"lora_id": {"type": "string", "format": "uuid", "description": "ID del LoRA de marca"},
|
|
"seed": {"type": "integer", "description": "Seed para reproducibilidad"}
|
|
}
|
|
}'::JSONB,
|
|
'{
|
|
"type": "object",
|
|
"properties": {
|
|
"images": {"type": "array", "items": {"type": "string", "format": "uri"}},
|
|
"count": {"type": "integer"}
|
|
}
|
|
}'::JSONB,
|
|
60,
|
|
true,
|
|
true,
|
|
NULL
|
|
),
|
|
-- Social Media Post
|
|
(
|
|
'w0000000-0000-0000-0000-000000000002',
|
|
'Social Media Post',
|
|
'social_media_post',
|
|
'Genera imagen + copy para redes sociales',
|
|
'composite',
|
|
'{
|
|
"type": "object",
|
|
"required": ["brief", "brand_id"],
|
|
"properties": {
|
|
"brief": {
|
|
"type": "object",
|
|
"properties": {
|
|
"objetivo": {"type": "string"},
|
|
"audiencia": {"type": "string"},
|
|
"tono": {"type": "string"}
|
|
}
|
|
},
|
|
"product_id": {"type": "string", "format": "uuid"},
|
|
"channel": {"type": "string", "enum": ["instagram", "facebook", "linkedin", "tiktok"]},
|
|
"format": {"type": "string", "enum": ["post", "story", "carousel"]},
|
|
"brand_id": {"type": "string", "format": "uuid"}
|
|
}
|
|
}'::JSONB,
|
|
'{
|
|
"type": "object",
|
|
"properties": {
|
|
"images": {"type": "array"},
|
|
"copy": {"type": "string"},
|
|
"hashtags": {"type": "array", "items": {"type": "string"}}
|
|
}
|
|
}'::JSONB,
|
|
90,
|
|
true,
|
|
true,
|
|
NULL
|
|
),
|
|
-- Ad Variations
|
|
(
|
|
'w0000000-0000-0000-0000-000000000003',
|
|
'Ad Variations',
|
|
'ad_variations',
|
|
'Genera variaciones para A/B testing',
|
|
'image',
|
|
'{
|
|
"type": "object",
|
|
"required": ["base_image"],
|
|
"properties": {
|
|
"base_image": {"type": "string", "description": "Asset ID o URL de imagen base"},
|
|
"variations_count": {"type": "integer", "minimum": 2, "maximum": 10, "default": 5},
|
|
"variation_type": {"type": "string", "enum": ["color", "background", "composition"]}
|
|
}
|
|
}'::JSONB,
|
|
'{
|
|
"type": "object",
|
|
"properties": {
|
|
"variations": {"type": "array"},
|
|
"metadata": {"type": "object"}
|
|
}
|
|
}'::JSONB,
|
|
120,
|
|
true,
|
|
true,
|
|
NULL
|
|
),
|
|
-- Virtual Avatar
|
|
(
|
|
'w0000000-0000-0000-0000-000000000004',
|
|
'Virtual Avatar',
|
|
'virtual_avatar',
|
|
'Genera avatar/influencer virtual consistente',
|
|
'image',
|
|
'{
|
|
"type": "object",
|
|
"required": ["character_lora_id"],
|
|
"properties": {
|
|
"character_lora_id": {"type": "string", "format": "uuid"},
|
|
"pose": {"type": "string", "enum": ["standing", "sitting", "walking", "custom"]},
|
|
"outfit": {"type": "string"},
|
|
"background": {"type": "string"},
|
|
"expression": {"type": "string", "enum": ["happy", "serious", "surprised", "neutral"]}
|
|
}
|
|
}'::JSONB,
|
|
'{
|
|
"type": "object",
|
|
"properties": {
|
|
"images": {"type": "array"},
|
|
"character_consistency_score": {"type": "number"}
|
|
}
|
|
}'::JSONB,
|
|
90,
|
|
true,
|
|
true,
|
|
NULL
|
|
);
|
|
|
|
-- ================================================================
|
|
-- DEMO TENANT (for development)
|
|
-- ================================================================
|
|
|
|
-- Only insert demo data in development
|
|
DO $$
|
|
BEGIN
|
|
-- Demo Tenant
|
|
INSERT INTO auth.tenants (id, name, slug, plan_id, status, trial_ends_at) VALUES
|
|
(
|
|
'd0000000-0000-0000-0000-000000000001',
|
|
'Demo Agency',
|
|
'demo-agency',
|
|
'a0000000-0000-0000-0000-000000000002', -- Pro plan
|
|
'active',
|
|
(CURRENT_DATE + INTERVAL '30 days')::DATE
|
|
);
|
|
|
|
-- Demo User (password: demo123456)
|
|
INSERT INTO auth.users (id, tenant_id, email, password_hash, first_name, last_name, role, status) VALUES
|
|
(
|
|
'u0000000-0000-0000-0000-000000000001',
|
|
'd0000000-0000-0000-0000-000000000001',
|
|
'demo@pmc.dev',
|
|
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/X4.E5F5u5V5V5V5V5V', -- bcrypt hash of 'demo123456'
|
|
'Demo',
|
|
'User',
|
|
'owner',
|
|
'active'
|
|
);
|
|
|
|
-- Demo Client
|
|
INSERT INTO crm.clients (id, tenant_id, name, slug, type, industry) VALUES
|
|
(
|
|
'c0000000-0000-0000-0000-000000000001',
|
|
'd0000000-0000-0000-0000-000000000001',
|
|
'Acme Corporation',
|
|
'acme-corp',
|
|
'company',
|
|
'Technology'
|
|
);
|
|
|
|
-- Demo Brand
|
|
INSERT INTO crm.brands (id, tenant_id, client_id, name, slug, primary_color, secondary_color) VALUES
|
|
(
|
|
'b0000000-0000-0000-0000-000000000001',
|
|
'd0000000-0000-0000-0000-000000000001',
|
|
'c0000000-0000-0000-0000-000000000001',
|
|
'Acme Brand',
|
|
'acme-brand',
|
|
'#3B82F6',
|
|
'#10B981'
|
|
);
|
|
|
|
EXCEPTION WHEN OTHERS THEN
|
|
RAISE NOTICE 'Demo data already exists or error: %', SQLERRM;
|
|
END $$;
|