db: migration session_default_notes_field + schema regenerado
Migration 20260511000001 adiciona campo 'notes' (Observacao, textarea, sort_order=30) como campo extra default no commitment determinado 'Sessao'. Antes Sessao era a unica excecao entre os nativos — Leitura/Supervisao/ Aula/Analise ja tinham. Padroniza pra que a Observacao da sessao siga o mesmo mecanismo de extra_fields dos outros, e o frontend remova a textarea hardcoded do AgendaEventDialog (proximo commit). Backfill: insere 'notes' em TODOS os commitments Sessao ja existentes (idempotente). Forward-fix: substitui a funcao seed_determined_commitments incluindo o bloco de Sessao + 'notes' pra novos tenants. Schema regenerado via db.cjs schema-export pra refletir o estado pos- migration. agenciapsi-db-dashboard.html regenerado pelo generate-dashboard.cjs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,18 @@
|
||||
-- Tables: CRM Conversas (WhatsApp)
|
||||
-- Gerado automaticamente em 2026-04-21T23:16:34.956Z
|
||||
-- Total: 10
|
||||
-- Gerado automaticamente em 2026-05-11T16:53:50.930Z
|
||||
-- Total: 16
|
||||
|
||||
CREATE TABLE public.conversation_assignments (
|
||||
tenant_id uuid NOT NULL,
|
||||
thread_key text NOT NULL,
|
||||
patient_id uuid,
|
||||
contact_number text,
|
||||
assigned_to uuid,
|
||||
assigned_by uuid NOT NULL,
|
||||
assigned_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.conversation_autoreply_log (
|
||||
id bigint NOT NULL,
|
||||
@@ -25,6 +37,39 @@ CREATE TABLE public.conversation_autoreply_settings (
|
||||
CONSTRAINT conversation_autoreply_settings_schedule_mode_check CHECK ((schedule_mode = ANY (ARRAY['agenda'::text, 'business_hours'::text, 'custom'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.conversation_bot_sessions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
thread_key text NOT NULL,
|
||||
contact_number text,
|
||||
current_step integer DEFAULT 0 NOT NULL,
|
||||
collected_data jsonb DEFAULT '{}'::jsonb NOT NULL,
|
||||
status text DEFAULT 'active'::text NOT NULL,
|
||||
started_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
last_advance_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
completed_at timestamp with time zone,
|
||||
abandoned_at timestamp with time zone,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT conversation_bot_sessions_status_check CHECK ((status = ANY (ARRAY['active'::text, 'completed'::text, 'abandoned_idle'::text, 'abandoned_manual'::text, 'opted_out'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.conversation_bots (
|
||||
tenant_id uuid NOT NULL,
|
||||
enabled boolean DEFAULT false NOT NULL,
|
||||
greeting_message text DEFAULT 'Olá! 👋 Sou o assistente virtual. Vou te fazer algumas perguntas rápidas pra a equipe preparar seu atendimento.'::text NOT NULL,
|
||||
closing_message text DEFAULT 'Obrigado! Recebemos suas informações e a equipe entrará em contato em breve. 💙'::text NOT NULL,
|
||||
steps jsonb DEFAULT jsonb_build_array(jsonb_build_object('prompt', 'Qual seu nome completo?', 'variable', 'nome_completo', 'type', 'text'), jsonb_build_object('prompt', 'O que te levou a buscar atendimento? Pode me contar brevemente.', 'variable', 'motivo', 'type', 'text'), jsonb_build_object('prompt', 'Prefere atendimento online ou presencial?', 'variable', 'modalidade', 'type', 'text'), jsonb_build_object('prompt', 'Qual o melhor dia e horário pra você? (Ex: terça à tarde)', 'variable', 'horario_preferido', 'type', 'text')) NOT NULL,
|
||||
trigger_mode text DEFAULT 'new_contact'::text NOT NULL,
|
||||
trigger_keywords text[] DEFAULT ARRAY[]::text[] NOT NULL,
|
||||
idle_timeout_minutes integer DEFAULT 30 NOT NULL,
|
||||
respect_optout boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT conversation_bots_idle_timeout_minutes_check CHECK (((idle_timeout_minutes >= 5) AND (idle_timeout_minutes <= 1440))),
|
||||
CONSTRAINT conversation_bots_trigger_mode_check CHECK ((trigger_mode = ANY (ARRAY['new_contact'::text, 'all_unassigned'::text, 'keyword'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.conversation_messages (
|
||||
id bigint NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
@@ -99,6 +144,39 @@ CREATE TABLE public.conversation_optouts (
|
||||
CONSTRAINT conversation_optouts_source_check CHECK ((source = ANY (ARRAY['keyword'::text, 'manual'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.conversation_sla_breaches (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
thread_key text NOT NULL,
|
||||
assigned_to uuid,
|
||||
last_inbound_at timestamp with time zone NOT NULL,
|
||||
threshold_minutes_at_breach integer NOT NULL,
|
||||
breached_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
resolved_at timestamp with time zone,
|
||||
resolved_by_message_id bigint,
|
||||
notified_at timestamp with time zone,
|
||||
notification_count integer DEFAULT 0 NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.conversation_sla_rules (
|
||||
tenant_id uuid NOT NULL,
|
||||
enabled boolean DEFAULT false NOT NULL,
|
||||
threshold_minutes integer DEFAULT 60 NOT NULL,
|
||||
respect_business_hours boolean DEFAULT true NOT NULL,
|
||||
business_hours_start time without time zone DEFAULT '08:00:00'::time without time zone NOT NULL,
|
||||
business_hours_end time without time zone DEFAULT '18:00:00'::time without time zone NOT NULL,
|
||||
business_days smallint[] DEFAULT ARRAY[(1)::smallint, (2)::smallint, (3)::smallint, (4)::smallint, (5)::smallint] NOT NULL,
|
||||
alert_scope text DEFAULT 'assigned_only'::text NOT NULL,
|
||||
notify_admin_on_breach boolean DEFAULT false NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT conversation_sla_rules_alert_scope_check CHECK ((alert_scope = ANY (ARRAY['assigned_only'::text, 'all'::text]))),
|
||||
CONSTRAINT conversation_sla_rules_business_days_check CHECK (((array_length(business_days, 1) >= 1) AND (array_length(business_days, 1) <= 7))),
|
||||
CONSTRAINT conversation_sla_rules_threshold_minutes_check CHECK (((threshold_minutes >= 1) AND (threshold_minutes <= 1440)))
|
||||
);
|
||||
|
||||
CREATE TABLE public.conversation_tags (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid,
|
||||
@@ -134,7 +212,7 @@ CREATE TABLE public.session_reminder_logs (
|
||||
to_phone text,
|
||||
provider_message_id text,
|
||||
conversation_message_id bigint,
|
||||
CONSTRAINT session_reminder_logs_reminder_type_check CHECK ((reminder_type = ANY (ARRAY['24h'::text, '2h'::text])))
|
||||
CONSTRAINT session_reminder_logs_reminder_type_check CHECK ((reminder_type = ANY (ARRAY['24h'::text, '2h'::text, 'manual'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.session_reminder_settings (
|
||||
@@ -153,3 +231,22 @@ CREATE TABLE public.session_reminder_settings (
|
||||
CONSTRAINT session_reminder_settings_template_24h_check CHECK (((length(template_24h) > 0) AND (length(template_24h) <= 2000))),
|
||||
CONSTRAINT session_reminder_settings_template_2h_check CHECK (((length(template_2h) > 0) AND (length(template_2h) <= 2000)))
|
||||
);
|
||||
|
||||
CREATE TABLE public.whatsapp_connection_incidents (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
channel_id uuid NOT NULL,
|
||||
provider text NOT NULL,
|
||||
kind text NOT NULL,
|
||||
last_state text,
|
||||
details jsonb,
|
||||
started_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
resolved_at timestamp with time zone,
|
||||
duration_seconds integer,
|
||||
notified_at timestamp with time zone,
|
||||
notification_count integer DEFAULT 0 NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT whatsapp_connection_incidents_kind_check CHECK ((kind = ANY (ARRAY['disconnected'::text, 'error'::text, 'qr_pending'::text, 'connecting'::text, 'unknown'::text]))),
|
||||
CONSTRAINT whatsapp_connection_incidents_provider_check CHECK ((provider = ANY (ARRAY['evolution_api'::text, 'twilio'::text])))
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user