Marketplace móvil para negocios locales mexicanos. Estructura inicial: - apps/backend (NestJS API) - apps/frontend (React Web) - apps/mobile (Expo/React Native) - apps/mcp-server (Claude MCP Server) - apps/whatsapp-service (WhatsApp Business API) - database/ (PostgreSQL DDL) - docs/ (Documentación) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
131 lines
3.7 KiB
SQL
131 lines
3.7 KiB
SQL
-- =============================================================================
|
|
-- MICHANGARRITO - 10 SUBSCRIPTIONS
|
|
-- =============================================================================
|
|
-- Planes, suscripciones y tokens IA
|
|
-- =============================================================================
|
|
|
|
-- Planes
|
|
CREATE TABLE IF NOT EXISTS subscriptions.plans (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
name VARCHAR(50) NOT NULL,
|
|
code VARCHAR(20) UNIQUE NOT NULL,
|
|
description TEXT,
|
|
|
|
price_monthly DECIMAL(10,2) NOT NULL,
|
|
price_yearly DECIMAL(10,2),
|
|
currency VARCHAR(3) DEFAULT 'MXN',
|
|
|
|
included_tokens INTEGER NOT NULL,
|
|
features JSONB,
|
|
|
|
max_products INTEGER,
|
|
max_users INTEGER DEFAULT 1,
|
|
whatsapp_own_number BOOLEAN DEFAULT false,
|
|
|
|
status VARCHAR(20) DEFAULT 'active',
|
|
|
|
stripe_price_id_monthly VARCHAR(100),
|
|
stripe_price_id_yearly VARCHAR(100),
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TRIGGER update_plans_updated_at
|
|
BEFORE UPDATE ON subscriptions.plans
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- Suscripciones
|
|
CREATE TABLE IF NOT EXISTS subscriptions.subscriptions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
|
|
plan_id UUID NOT NULL REFERENCES subscriptions.plans(id),
|
|
|
|
billing_cycle VARCHAR(10) DEFAULT 'monthly',
|
|
current_period_start TIMESTAMPTZ NOT NULL,
|
|
current_period_end TIMESTAMPTZ NOT NULL,
|
|
|
|
status VARCHAR(20) DEFAULT 'active',
|
|
cancel_at_period_end BOOLEAN DEFAULT false,
|
|
cancelled_at TIMESTAMPTZ,
|
|
|
|
payment_method VARCHAR(20),
|
|
|
|
stripe_subscription_id VARCHAR(100),
|
|
stripe_customer_id VARCHAR(100),
|
|
|
|
trial_ends_at TIMESTAMPTZ,
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_subscriptions_tenant ON subscriptions.subscriptions(tenant_id);
|
|
CREATE INDEX idx_subscriptions_stripe ON subscriptions.subscriptions(stripe_subscription_id);
|
|
|
|
CREATE TRIGGER update_subscriptions_updated_at
|
|
BEFORE UPDATE ON subscriptions.subscriptions
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- Actualizar FK en tenants
|
|
ALTER TABLE public.tenants
|
|
ADD CONSTRAINT fk_tenants_plan
|
|
FOREIGN KEY (current_plan_id) REFERENCES subscriptions.plans(id);
|
|
|
|
-- Paquetes de tokens
|
|
CREATE TABLE IF NOT EXISTS subscriptions.token_packages (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
name VARCHAR(50) NOT NULL,
|
|
tokens INTEGER NOT NULL,
|
|
price DECIMAL(10,2) NOT NULL,
|
|
currency VARCHAR(3) DEFAULT 'MXN',
|
|
|
|
bonus_tokens INTEGER DEFAULT 0,
|
|
|
|
stripe_price_id VARCHAR(100),
|
|
|
|
status VARCHAR(20) DEFAULT 'active',
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Uso de tokens
|
|
CREATE TABLE IF NOT EXISTS subscriptions.token_usage (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
|
|
|
|
tokens_used INTEGER NOT NULL,
|
|
|
|
action VARCHAR(50) NOT NULL,
|
|
description TEXT,
|
|
|
|
model VARCHAR(50),
|
|
input_tokens INTEGER,
|
|
output_tokens INTEGER,
|
|
|
|
reference_type VARCHAR(20),
|
|
reference_id UUID,
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_token_usage_tenant ON subscriptions.token_usage(tenant_id);
|
|
CREATE INDEX idx_token_usage_date ON subscriptions.token_usage(created_at);
|
|
|
|
-- Balance de tokens por tenant
|
|
CREATE TABLE IF NOT EXISTS subscriptions.tenant_token_balance (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
|
|
|
|
available_tokens INTEGER DEFAULT 0,
|
|
used_tokens INTEGER DEFAULT 0,
|
|
|
|
last_reset_at TIMESTAMPTZ,
|
|
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
|
UNIQUE(tenant_id)
|
|
);
|