-- ========================================================================== -- Agencia PSI — Migracao: Trigger agenda_eventos → notificacao WhatsApp (8.3) -- ========================================================================== -- Quando um agenda_evento muda de status (ex: agendado → cancelado), dispara -- a edge send-session-status-notification que resolve template e envia -- mensagem WhatsApp ao paciente. -- -- Transicoes que disparam (controlado na propria edge via STATUS_TEMPLATE_MAP): -- - cancelado → cancelamento_sessao -- - remarcado → remarcacao_sessao -- - confirmado → confirmacao_sessao -- -- O trigger nao bloqueia o UPDATE (pg_net e assincrono). Se a edge falhar, -- o evento ja foi salvo — so a notificacao sera perdida. -- -- Pre-requisito: settings app.settings.supabase_url e app.settings.service_role_key -- configuradas (mesmas usadas pelo cron do heartbeat e SLA). -- ========================================================================== CREATE OR REPLACE FUNCTION public.fn_notify_agenda_status_change() RETURNS TRIGGER LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$ DECLARE v_url TEXT; v_key TEXT; BEGIN -- So dispara se status realmente mudou IF NEW.status IS NOT DISTINCT FROM OLD.status THEN RETURN NEW; END IF; -- So dispara pra status "interessantes". Outros sao silenciosamente ignorados -- (a edge tambem tem essa logica, mas economizamos chamada HTTP aqui) IF NEW.status NOT IN ('cancelado', 'remarcado', 'confirmado') THEN RETURN NEW; END IF; -- Precisa de paciente vinculado (senao nao tem telefone) IF NEW.patient_id IS NULL THEN RETURN NEW; END IF; -- Busca settings BEGIN v_url := current_setting('app.settings.supabase_url', true); v_key := current_setting('app.settings.service_role_key', true); EXCEPTION WHEN OTHERS THEN -- Settings nao configuradas — silencioso RETURN NEW; END; IF v_url IS NULL OR v_key IS NULL THEN RETURN NEW; END IF; -- Fire and forget (pg_net) PERFORM net.http_post( url := v_url || '/functions/v1/send-session-status-notification', headers := jsonb_build_object( 'Authorization', 'Bearer ' || v_key, 'Content-Type', 'application/json' ), body := jsonb_build_object( 'event_id', NEW.id, 'old_status', OLD.status, 'new_status', NEW.status ) ); RETURN NEW; END; $$; DROP TRIGGER IF EXISTS trg_agenda_status_notify ON public.agenda_eventos; CREATE TRIGGER trg_agenda_status_notify AFTER UPDATE OF status ON public.agenda_eventos FOR EACH ROW EXECUTE FUNCTION public.fn_notify_agenda_status_change(); COMMENT ON FUNCTION public.fn_notify_agenda_status_change() IS 'Dispara edge send-session-status-notification quando status de agenda_eventos muda. So pra status mapeados (cancelado/remarcado/confirmado). Nao bloqueia UPDATE.';