platform-marketing-content-.../seeds/001_initial_data.sql
Adrian Flores Cortes 1a2df4aaec feat: Add initial database schemas and seeds
- Add .gitignore
- Add schemas/001_initial_schema.sql
- Add seeds/001_initial_data.sql

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:08:49 -06:00

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 $$;