221 lines
7.8 KiB
PL/PgSQL
221 lines
7.8 KiB
PL/PgSQL
-- =============================================================================
|
|
-- FIX: Atribuir plano free a usuários/tenants sem assinatura ativa
|
|
-- =============================================================================
|
|
-- Execute no SQL Editor do Supabase (service_role)
|
|
-- Idempotente: só insere onde não existe assinatura ativa.
|
|
--
|
|
-- Regras:
|
|
-- • tenant kind = 'therapist' → therapist_free (por user_id do admin)
|
|
-- • tenant kind IN (clinic_*) → clinic_free (por tenant_id)
|
|
-- • profiles.account_type = 'patient' / portal_user → patient_free (por user_id)
|
|
-- =============================================================================
|
|
|
|
BEGIN;
|
|
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
-- DIAGNÓSTICO — mostra o estado atual antes de corrigir
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
DO $$
|
|
DECLARE
|
|
r RECORD;
|
|
BEGIN
|
|
RAISE NOTICE '=== DIAGNÓSTICO DE ASSINATURAS ===';
|
|
RAISE NOTICE '';
|
|
|
|
-- Terapeutas sem plano
|
|
RAISE NOTICE '--- Terapeutas SEM assinatura ativa ---';
|
|
FOR r IN
|
|
SELECT
|
|
tm.user_id,
|
|
p.full_name,
|
|
t.id AS tenant_id,
|
|
t.name AS tenant_name
|
|
FROM public.tenant_members tm
|
|
JOIN public.tenants t ON t.id = tm.tenant_id
|
|
JOIN public.profiles p ON p.id = tm.user_id
|
|
WHERE t.kind = 'therapist'
|
|
AND tm.role = 'tenant_admin'
|
|
AND tm.status = 'active'
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM public.subscriptions s
|
|
WHERE s.user_id = tm.user_id
|
|
AND s.status = 'active'
|
|
)
|
|
LOOP
|
|
RAISE NOTICE ' FALTANDO: % (%) — tenant %', r.full_name, r.user_id, r.tenant_id;
|
|
END LOOP;
|
|
|
|
-- Clínicas sem plano
|
|
RAISE NOTICE '';
|
|
RAISE NOTICE '--- Clínicas SEM assinatura ativa ---';
|
|
FOR r IN
|
|
SELECT t.id, t.name, t.kind
|
|
FROM public.tenants t
|
|
WHERE t.kind IN ('clinic_coworking', 'clinic_reception', 'clinic_full', 'clinic')
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM public.subscriptions s
|
|
WHERE s.tenant_id = t.id
|
|
AND s.status = 'active'
|
|
)
|
|
LOOP
|
|
RAISE NOTICE ' FALTANDO: % (%) — kind %', r.name, r.id, r.kind;
|
|
END LOOP;
|
|
|
|
-- Pacientes sem plano
|
|
RAISE NOTICE '';
|
|
RAISE NOTICE '--- Pacientes SEM assinatura ativa ---';
|
|
FOR r IN
|
|
SELECT p.id, p.full_name
|
|
FROM public.profiles p
|
|
WHERE p.account_type = 'patient'
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM public.subscriptions s
|
|
WHERE s.user_id = p.id
|
|
AND s.status = 'active'
|
|
)
|
|
LOOP
|
|
RAISE NOTICE ' FALTANDO: % (%)', r.full_name, r.id;
|
|
END LOOP;
|
|
|
|
RAISE NOTICE '';
|
|
RAISE NOTICE '=== FIM DO DIAGNÓSTICO — aplicando correções... ===';
|
|
END;
|
|
$$;
|
|
|
|
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
-- CORREÇÃO 1: Terapeutas sem assinatura → therapist_free
|
|
-- Escopo: user_id do tenant_admin do tenant kind='therapist'
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
INSERT INTO public.subscriptions (
|
|
user_id, plan_id, plan_key, status, interval,
|
|
current_period_start, current_period_end,
|
|
source, started_at, activated_at
|
|
)
|
|
SELECT
|
|
tm.user_id,
|
|
p.id,
|
|
p.key,
|
|
'active',
|
|
'month',
|
|
now(),
|
|
now() + interval '30 days',
|
|
'fix_seed',
|
|
now(),
|
|
now()
|
|
FROM public.tenant_members tm
|
|
JOIN public.tenants t ON t.id = tm.tenant_id
|
|
JOIN public.plans p ON p.key = 'therapist_free'
|
|
WHERE t.kind = 'therapist'
|
|
AND tm.role = 'tenant_admin'
|
|
AND tm.status = 'active'
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM public.subscriptions s
|
|
WHERE s.user_id = tm.user_id
|
|
AND s.status = 'active'
|
|
);
|
|
|
|
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
-- CORREÇÃO 2: Clínicas sem assinatura → clinic_free
|
|
-- Escopo: tenant_id
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
INSERT INTO public.subscriptions (
|
|
tenant_id, plan_id, plan_key, status, interval,
|
|
current_period_start, current_period_end,
|
|
source, started_at, activated_at
|
|
)
|
|
SELECT
|
|
t.id,
|
|
p.id,
|
|
p.key,
|
|
'active',
|
|
'month',
|
|
now(),
|
|
now() + interval '30 days',
|
|
'fix_seed',
|
|
now(),
|
|
now()
|
|
FROM public.tenants t
|
|
JOIN public.plans p ON p.key = 'clinic_free'
|
|
WHERE t.kind IN ('clinic_coworking', 'clinic_reception', 'clinic_full', 'clinic')
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM public.subscriptions s
|
|
WHERE s.tenant_id = t.id
|
|
AND s.status = 'active'
|
|
);
|
|
|
|
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
-- CORREÇÃO 3: Pacientes sem assinatura → patient_free
|
|
-- Escopo: user_id
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
INSERT INTO public.subscriptions (
|
|
user_id, plan_id, plan_key, status, interval,
|
|
current_period_start, current_period_end,
|
|
source, started_at, activated_at
|
|
)
|
|
SELECT
|
|
pr.id,
|
|
p.id,
|
|
p.key,
|
|
'active',
|
|
'month',
|
|
now(),
|
|
now() + interval '30 days',
|
|
'fix_seed',
|
|
now(),
|
|
now()
|
|
FROM public.profiles pr
|
|
JOIN public.plans p ON p.key = 'patient_free'
|
|
WHERE pr.account_type = 'patient'
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM public.subscriptions s
|
|
WHERE s.user_id = pr.id
|
|
AND s.status = 'active'
|
|
);
|
|
|
|
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
-- CONFIRMAÇÃO — mostra o que foi inserido (source = 'fix_seed')
|
|
-- ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
DO $$
|
|
DECLARE
|
|
r RECORD;
|
|
total INT := 0;
|
|
BEGIN
|
|
RAISE NOTICE '';
|
|
RAISE NOTICE '=== ASSINATURAS CRIADAS NESTA EXECUÇÃO ===';
|
|
|
|
FOR r IN
|
|
SELECT
|
|
s.plan_key,
|
|
COALESCE(pr.full_name, t.name) AS nome,
|
|
COALESCE(s.user_id::text, s.tenant_id::text) AS owner_id
|
|
FROM public.subscriptions s
|
|
LEFT JOIN public.profiles pr ON pr.id = s.user_id
|
|
LEFT JOIN public.tenants t ON t.id = s.tenant_id
|
|
WHERE s.source = 'fix_seed'
|
|
AND s.started_at >= now() - interval '5 seconds'
|
|
ORDER BY s.plan_key, nome
|
|
LOOP
|
|
RAISE NOTICE ' ✅ % → % (%)', r.plan_key, r.nome, r.owner_id;
|
|
total := total + 1;
|
|
END LOOP;
|
|
|
|
IF total = 0 THEN
|
|
RAISE NOTICE ' (nenhuma nova assinatura criada — todos já tinham plano ativo)';
|
|
ELSE
|
|
RAISE NOTICE '';
|
|
RAISE NOTICE ' Total: % assinatura(s) criada(s).', total;
|
|
END IF;
|
|
END;
|
|
$$;
|
|
|
|
COMMIT;
|