-- ============================================================================= -- 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}}', '
Olá, {{patient_name}}!
Este é um lembrete da sua sessão agendada para {{session_date}} às {{session_time}}.
Modalidade: {{session_modality}}
{{#if session_link}}Clique aqui para entrar na sessão online
{{/if}}Em caso de necessidade de cancelamento, entre em contato com antecedência.
Até logo,
{{therapist_name}}
Olá, {{patient_name}}!
Sua sessão foi confirmada com sucesso.
Até lá,
{{therapist_name}}
Olá, {{patient_name}}!
Informamos que sua sessão do dia {{session_date}} às {{session_time}} foi cancelada.
{{#if cancellation_reason}}Motivo: {{cancellation_reason}}
{{/if}}Entre em contato para reagendar.
{{therapist_name}}
', 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}}', 'Olá, {{patient_name}}!
Sua sessão foi reagendada para {{session_date}} às {{session_time}}.
Modalidade: {{session_modality}}
Até lá,
{{therapist_name}}
Olá, {{patient_name}}!
Recebemos seu cadastro com sucesso. Nossa equipe entrará em contato em breve para dar continuidade ao processo.
Obrigado pela confiança,
{{clinic_name}}
Olá, {{patient_name}}!
Seu cadastro foi aprovado. Você já pode acessar o portal e agendar sua primeira sessão.
Qualquer dúvida, estamos à disposição.
{{therapist_name}}
Olá, {{patient_name}}!
Agradecemos seu interesse. Infelizmente não será possível dar continuidade ao seu cadastro no momento.
{{#if rejection_reason}}{{rejection_reason}}
{{/if}}{{clinic_name}}
', 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}}', 'Olá, {{patient_name}}!
Sua solicitação de agendamento foi aceita.
Até logo,
{{therapist_name}}
Olá, {{patient_name}}!
Infelizmente não foi possível confirmar sua solicitação de agendamento para {{session_date}}.
{{#if rejection_reason}}Motivo: {{rejection_reason}}
{{/if}}Entre em contato para verificar outros horários disponíveis.
{{therapist_name}}
', 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}}!', 'Olá, {{patient_name}}!
Seja bem-vindo(a)! Sua conta foi criada com sucesso.
', 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', 'Olá, {{patient_name}}!
Recebemos uma solicitação para redefinir sua senha.
Clique aqui para redefinir sua senha →
Se você não solicitou a redefinição, ignore este e-mail.
', 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 ( 'Gestão clínica simplificada', 'Agendamentos, prontuários e sessões em um único painel. Foco no que importa: seus pacientes.', 'pi-calendar-clock', 0, true ), ( 'Múltiplos profissionais, uma só plataforma', 'Adicione terapeutas, gerencie vínculos por clínica e mantenha equipes organizadas com controle de acesso por papel.', 'pi-users', 1, true ), ( 'Seguro, privado e sempre disponível', '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;