Files
agenciapsilmno/database-novo/seeds/seed_014_global_data.sql

428 lines
16 KiB
PL/PgSQL

-- =============================================================================
-- SEED 014 — Dados Globais (Email Templates, Notification Templates, Carousel)
-- =============================================================================
-- Idempotente: ON CONFLICT DO UPDATE / DO NOTHING
--
-- Cria:
-- 11 email_templates_global (templates de email do sistema)
-- 7 notification_templates WhatsApp (default)
-- 6 notification_templates SMS (default)
-- 3 login_carousel_slides (slides da página de login)
-- =============================================================================
BEGIN;
-- ============================================================
-- 1. Email Templates Globais
-- ============================================================
INSERT INTO public.email_templates_global
(key, domain, channel, subject, body_html, body_text, version, is_active, variables)
VALUES
-- session.reminder.email
(
'session.reminder.email',
'session',
'email',
'Lembrete: sua sessão amanhã às {{session_time}}',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Este é um lembrete da sua sessão agendada para <strong>{{session_date}}</strong> às <strong>{{session_time}}</strong>.</p>
<p>Modalidade: <strong>{{session_modality}}</strong></p>
{{#if session_link}}
<p><a href="{{session_link}}">Clique aqui para entrar na sessão online</a></p>
{{/if}}
<p>Em caso de necessidade de cancelamento, entre em contato com antecedência.</p>
<p>Até logo,<br><strong>{{therapist_name}}</strong></p>
',
'Olá, {{patient_name}}! Lembrete da sua sessão: {{session_date}} às {{session_time}} ({{session_modality}}).',
2,
true,
'{"patient_name":"Nome completo do paciente","session_date":"Data da sessão (ex: 20/03/2026)","session_time":"Horário da sessão (ex: 14:00)","session_modality":"Presencial ou Online","session_link":"Link da videochamada (apenas online)","therapist_name":"Nome do terapeuta"}'
),
-- session.confirmation.email
(
'session.confirmation.email',
'session',
'email',
'Sessão confirmada — {{session_date}} às {{session_time}}',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Sua sessão foi confirmada com sucesso.</p>
<ul>
<li><strong>Data:</strong> {{session_date}}</li>
<li><strong>Horário:</strong> {{session_time}}</li>
<li><strong>Modalidade:</strong> {{session_modality}}</li>
{{#if session_address}}<li><strong>Local:</strong> {{session_address}}</li>{{/if}}
</ul>
<p>Até lá,<br><strong>{{therapist_name}}</strong></p>
',
'Sessão confirmada: {{session_date}} às {{session_time}} ({{session_modality}}).',
1,
true,
'{"patient_name":"Nome do paciente","session_date":"Data da sessão","session_time":"Horário da sessão","session_modality":"Presencial ou Online","session_address":"Endereço (apenas presencial)","therapist_name":"Nome do terapeuta"}'
),
-- session.cancellation.email
(
'session.cancellation.email',
'session',
'email',
'Sessão cancelada — {{session_date}}',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Informamos que sua sessão do dia <strong>{{session_date}}</strong> às <strong>{{session_time}}</strong> foi cancelada.</p>
{{#if cancellation_reason}}<p>Motivo: {{cancellation_reason}}</p>{{/if}}
<p>Entre em contato para reagendar.</p>
<p><strong>{{therapist_name}}</strong></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do paciente","session_date":"Data cancelada","session_time":"Horário cancelado","cancellation_reason":"Motivo do cancelamento (opcional)","therapist_name":"Nome do terapeuta"}'
),
-- session.rescheduled.email
(
'session.rescheduled.email',
'session',
'email',
'Sessão reagendada — {{session_date}} às {{session_time}}',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Sua sessão foi reagendada para <strong>{{session_date}}</strong> às <strong>{{session_time}}</strong>.</p>
<p>Modalidade: <strong>{{session_modality}}</strong></p>
<p>Até lá,<br><strong>{{therapist_name}}</strong></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do paciente","session_date":"Nova data","session_time":"Novo horário","session_modality":"Presencial ou Online","therapist_name":"Nome do terapeuta"}'
),
-- intake.received.email
(
'intake.received.email',
'intake',
'email',
'Recebemos seu cadastro — {{clinic_name}}',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Recebemos seu cadastro com sucesso. Nossa equipe entrará em contato em breve para dar continuidade ao processo.</p>
<p>Obrigado pela confiança,<br><strong>{{clinic_name}}</strong></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do solicitante","clinic_name":"Nome da clínica ou terapeuta"}'
),
-- intake.approved.email
(
'intake.approved.email',
'intake',
'email',
'Cadastro aprovado — bem-vindo(a)!',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Seu cadastro foi aprovado. Você já pode acessar o portal e agendar sua primeira sessão.</p>
<p><a href="{{portal_link}}">Acessar portal →</a></p>
<p>Qualquer dúvida, estamos à disposição.<br><strong>{{therapist_name}}</strong></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do paciente","therapist_name":"Nome do terapeuta","portal_link":"Link do portal do paciente"}'
),
-- intake.rejected.email
(
'intake.rejected.email',
'intake',
'email',
'Atualização sobre seu cadastro — {{clinic_name}}',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Agradecemos seu interesse. Infelizmente não será possível dar continuidade ao seu cadastro no momento.</p>
{{#if rejection_reason}}<p>{{rejection_reason}}</p>{{/if}}
<p><strong>{{clinic_name}}</strong></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do paciente","clinic_name":"Nome da clínica","rejection_reason":"Motivo (opcional)"}'
),
-- scheduler.request_accepted.email
(
'scheduler.request_accepted.email',
'session',
'email',
'Sua solicitação foi aceita — {{session_date}} às {{session_time}}',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Sua solicitação de agendamento foi aceita.</p>
<ul>
<li><strong>Data:</strong> {{session_date}}</li>
<li><strong>Horário:</strong> {{session_time}}</li>
<li><strong>Tipo:</strong> {{session_type}}</li>
<li><strong>Modalidade:</strong> {{session_modality}}</li>
</ul>
<p>Até logo,<br><strong>{{therapist_name}}</strong></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do paciente","session_date":"Data confirmada","session_time":"Horário confirmado","session_type":"Primeira consulta / Retorno","session_modality":"Presencial ou Online","therapist_name":"Nome do terapeuta"}'
),
-- scheduler.request_rejected.email
(
'scheduler.request_rejected.email',
'session',
'email',
'Atualização sobre sua solicitação de agendamento',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Infelizmente não foi possível confirmar sua solicitação de agendamento para <strong>{{session_date}}</strong>.</p>
{{#if rejection_reason}}<p>Motivo: {{rejection_reason}}</p>{{/if}}
<p>Entre em contato para verificar outros horários disponíveis.</p>
<p><strong>{{therapist_name}}</strong></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do paciente","session_date":"Data solicitada","rejection_reason":"Motivo (opcional)","therapist_name":"Nome do terapeuta"}'
),
-- system.welcome.email
(
'system.welcome.email',
'system',
'email',
'Bem-vindo(a) ao {{clinic_name}}!',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Seja bem-vindo(a)! Sua conta foi criada com sucesso.</p>
<p><a href="{{portal_link}}">Acessar minha área →</a></p>
',
NULL,
1,
true,
'{"patient_name":"Nome do paciente","clinic_name":"Nome da clínica","portal_link":"Link do portal"}'
),
-- system.password_reset.email
(
'system.password_reset.email',
'system',
'email',
'Redefinição de senha',
'
<p>Olá, <strong>{{patient_name}}</strong>!</p>
<p>Recebemos uma solicitação para redefinir sua senha.</p>
<p><a href="{{reset_link}}">Clique aqui para redefinir sua senha →</a></p>
<p>Se você não solicitou a redefinição, ignore este e-mail.</p>
',
NULL,
1,
true,
'{"patient_name":"Nome do usuário","reset_link":"Link de redefinição de senha"}'
)
ON CONFLICT (key) DO UPDATE SET
domain = EXCLUDED.domain,
channel = EXCLUDED.channel,
subject = EXCLUDED.subject,
body_html = EXCLUDED.body_html,
body_text = EXCLUDED.body_text,
version = EXCLUDED.version,
is_active = EXCLUDED.is_active,
variables = EXCLUDED.variables,
updated_at = now();
-- ============================================================
-- 2. Notification Templates — WhatsApp (default)
-- ============================================================
INSERT INTO public.notification_templates
(tenant_id, owner_id, key, domain, channel, event_type, body_text, variables, is_default, is_active)
VALUES
-- Lembrete 24h
(
NULL, NULL,
'session.lembrete.whatsapp',
'session', 'whatsapp', 'lembrete_sessao',
E'Olá, {{nome_paciente}}! \U0001F44B\n\nLembrete da sua sessão com {{nome_terapeuta}}.\n\n\U0001F4C5 Data: {{data_sessao}}\n\U0001F550 Hora: {{hora_sessao}}\n\U0001F4CD Modalidade: {{modalidade}}\n\nQualquer dúvida, entre em contato. Até lá! \U0001F49A',
'["nome_paciente","nome_terapeuta","data_sessao","hora_sessao","modalidade"]',
true, true
),
-- Lembrete 2h
(
NULL, NULL,
'session.lembrete_2h.whatsapp',
'session', 'whatsapp', 'lembrete_sessao',
E'Olá, {{nome_paciente}}! Sua sessão com {{nome_terapeuta}} começa em 2 horas.\n\n\U0001F550 Hora: {{hora_sessao}}\n\U0001F4CD Modalidade: {{modalidade}}\n\nAté já! \U0001F60A',
'["nome_paciente","nome_terapeuta","data_sessao","hora_sessao","modalidade"]',
true, true
),
-- Confirmação
(
NULL, NULL,
'session.confirmacao.whatsapp',
'session', 'whatsapp', 'confirmacao_sessao',
E'Olá, {{nome_paciente}}! \u2705\n\nSua sessão foi confirmada!\n\n\U0001F4C5 Data: {{data_sessao}}\n\U0001F550 Hora: {{hora_sessao}}\n\U0001F4CD Modalidade: {{modalidade}}\n\nAté lá! \U0001F49A',
'["nome_paciente","nome_terapeuta","data_sessao","hora_sessao","modalidade","link_confirmacao"]',
true, true
),
-- Cancelamento
(
NULL, NULL,
'session.cancelamento.whatsapp',
'session', 'whatsapp', 'cancelamento_sessao',
E'Olá, {{nome_paciente}}. Infelizmente a sessão do dia {{data_sessao}} às {{hora_sessao}} foi cancelada.\n\nEntre em contato para reagendar. \U0001F64F',
'["nome_paciente","nome_terapeuta","data_sessao","hora_sessao","modalidade"]',
true, true
),
-- Reagendamento
(
NULL, NULL,
'session.reagendamento.whatsapp',
'session', 'whatsapp', 'reagendamento',
E'Olá, {{nome_paciente}}! Sua sessão foi reagendada.\n\n\U0001F4C5 Nova data: {{data_sessao}}\n\U0001F550 Novo horário: {{hora_sessao}}\n\U0001F4CD Modalidade: {{modalidade}}\n\nAté lá! \U0001F60A',
'["nome_paciente","nome_terapeuta","data_sessao","hora_sessao","modalidade"]',
true, true
),
-- Cobrança pendente
(
NULL, NULL,
'cobranca.pendente.whatsapp',
'billing', 'whatsapp', 'cobranca_pendente',
E'Olá, {{nome_paciente}}. Identificamos uma cobrança pendente no valor de {{valor_sessao}} referente à sua sessão do dia {{data_sessao}}.\n\nPor favor, entre em contato para regularizar. \U0001F64F',
'["nome_paciente","nome_terapeuta","data_sessao","hora_sessao","modalidade","valor_sessao"]',
true, true
),
-- Boas-vindas
(
NULL, NULL,
'sistema.boas_vindas.whatsapp',
'system', 'whatsapp', 'boas_vindas_paciente',
E'Olá, {{nome_paciente}}! \U0001F389\n\nSeja muito bem-vindo(a)! Estamos felizes em ter você aqui.\n\nEm caso de dúvidas, estamos à disposição. Até a nossa primeira sessão! \U0001F49A',
'["nome_paciente","nome_terapeuta","data_sessao","hora_sessao","modalidade"]',
true, true
)
ON CONFLICT (tenant_id, owner_id, key, deleted_at) DO NOTHING;
-- ============================================================
-- 3. Notification Templates — SMS (default)
-- ============================================================
INSERT INTO public.notification_templates
(tenant_id, owner_id, key, domain, channel, event_type, body_text, variables, is_default, is_active)
VALUES
(
NULL, NULL,
'session.reminder.sms',
'session', 'sms', 'lembrete_sessao',
'Olá {{patient_name}}, lembrete da sua sessão em {{session_date}} às {{session_time}} com {{therapist_name}}. Modalidade: {{session_modality}}.',
'["patient_name","session_date","session_time","therapist_name","session_modality"]',
true, true
),
(
NULL, NULL,
'session.confirmation.sms',
'session', 'sms', 'confirmacao_sessao',
'Sessão confirmada! {{session_date}} às {{session_time}} ({{session_modality}}) com {{therapist_name}}.',
'["patient_name","session_date","session_time","session_modality","therapist_name"]',
true, true
),
(
NULL, NULL,
'session.cancellation.sms',
'session', 'sms', 'cancelamento_sessao',
'Sua sessão de {{session_date}} às {{session_time}} foi cancelada. Entre em contato para reagendar. — {{therapist_name}}',
'["patient_name","session_date","session_time","therapist_name"]',
true, true
),
(
NULL, NULL,
'session.rescheduled.sms',
'session', 'sms', 'reagendamento',
'Sua sessão foi reagendada para {{session_date}} às {{session_time}} ({{session_modality}}). — {{therapist_name}}',
'["patient_name","session_date","session_time","session_modality","therapist_name"]',
true, true
),
(
NULL, NULL,
'intake.received.sms',
'intake', 'sms', 'intake_recebido',
'Olá {{patient_name}}, recebemos seu cadastro. Em breve entraremos em contato. — {{clinic_name}}',
'["patient_name","clinic_name"]',
true, true
),
(
NULL, NULL,
'intake.approved.sms',
'intake', 'sms', 'intake_aprovado',
'Olá {{patient_name}}, seu cadastro foi aprovado! Acesse o portal para agendar sua sessão. — {{therapist_name}}',
'["patient_name","therapist_name"]',
true, true
)
ON CONFLICT (tenant_id, owner_id, key, deleted_at) DO NOTHING;
-- ============================================================
-- 4. Login Carousel Slides
-- ============================================================
-- Limpa slides existentes e reinsere
DELETE FROM public.login_carousel_slides;
INSERT INTO public.login_carousel_slides (title, body, icon, ordem, ativo)
VALUES
(
'<strong>Gestão clínica simplificada</strong>',
'Agendamentos, prontuários e sessões em um único painel. Foco no que importa: <em>seus pacientes</em>.',
'pi-calendar-clock',
0,
true
),
(
'<strong>Múltiplos profissionais, uma só plataforma</strong>',
'Adicione terapeutas, gerencie vínculos por clínica e mantenha equipes organizadas com controle de acesso por papel.',
'pi-users',
1,
true
),
(
'<strong>Seguro, privado e sempre disponível</strong>',
'Dados protegidos com autenticação robusta, controle de acesso por perfil e conformidade com as boas práticas de privacidade.',
'pi-shield',
2,
true
);
-- ============================================================
-- 5. Confirma
-- ============================================================
DO $$
DECLARE
v_emails integer;
v_notif integer;
v_slides integer;
BEGIN
SELECT count(*) INTO v_emails FROM public.email_templates_global;
SELECT count(*) INTO v_notif FROM public.notification_templates WHERE is_default = true;
SELECT count(*) INTO v_slides FROM public.login_carousel_slides WHERE ativo = true;
RAISE NOTICE 'seed_014_global_data: % email templates, % notification templates, % carousel slides.', v_emails, v_notif, v_slides;
END;
$$;
COMMIT;