-- Tables: CRM Conversas (WhatsApp) -- Gerado automaticamente em 2026-04-21T23:16:34.956Z -- Total: 10 CREATE TABLE public.conversation_autoreply_log ( id bigint NOT NULL, tenant_id uuid NOT NULL, thread_key text NOT NULL, sent_at timestamp with time zone DEFAULT now() NOT NULL, message_id uuid ); CREATE TABLE public.conversation_autoreply_settings ( tenant_id uuid NOT NULL, enabled boolean DEFAULT false NOT NULL, message text DEFAULT 'Olá! Nosso horário de atendimento acabou. Retornaremos sua mensagem assim que possível. Obrigado!'::text NOT NULL, cooldown_minutes integer DEFAULT 180 NOT NULL, schedule_mode text DEFAULT 'agenda'::text NOT NULL, business_hours jsonb DEFAULT '[]'::jsonb NOT NULL, custom_window jsonb DEFAULT '[]'::jsonb NOT NULL, created_at timestamp with time zone DEFAULT now() NOT NULL, updated_at timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT conversation_autoreply_settings_cooldown_minutes_check CHECK (((cooldown_minutes >= 0) AND (cooldown_minutes <= 43200))), CONSTRAINT conversation_autoreply_settings_message_check CHECK (((length(message) > 0) AND (length(message) <= 2000))), CONSTRAINT conversation_autoreply_settings_schedule_mode_check CHECK ((schedule_mode = ANY (ARRAY['agenda'::text, 'business_hours'::text, 'custom'::text]))) ); CREATE TABLE public.conversation_messages ( id bigint NOT NULL, tenant_id uuid NOT NULL, patient_id uuid, channel text NOT NULL, direction text NOT NULL, from_number text, to_number text, body text, media_url text, media_mime text, provider text NOT NULL, provider_message_id text, provider_raw jsonb, kanban_status text DEFAULT 'awaiting_us'::text NOT NULL, priority integer DEFAULT 0 NOT NULL, read_at timestamp with time zone, responded_at timestamp with time zone, resolved_at timestamp with time zone, received_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, delivered_at timestamp with time zone, read_by_recipient_at timestamp with time zone, delivery_status text, CONSTRAINT conversation_messages_channel_check CHECK ((channel = ANY (ARRAY['whatsapp'::text, 'sms'::text, 'email'::text]))), CONSTRAINT conversation_messages_delivery_status_check CHECK (((delivery_status IS NULL) OR (delivery_status = ANY (ARRAY['pending'::text, 'sent'::text, 'delivered'::text, 'read'::text, 'failed'::text])))), CONSTRAINT conversation_messages_direction_check CHECK ((direction = ANY (ARRAY['inbound'::text, 'outbound'::text]))), CONSTRAINT conversation_messages_kanban_status_check CHECK ((kanban_status = ANY (ARRAY['urgent'::text, 'awaiting_us'::text, 'awaiting_patient'::text, 'resolved'::text]))), CONSTRAINT conversation_messages_provider_check CHECK ((provider = ANY (ARRAY['twilio'::text, 'evolution'::text, 'manual'::text]))) ); CREATE TABLE public.conversation_notes ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, thread_key text NOT NULL, patient_id uuid, contact_number text, body text NOT NULL, created_by uuid NOT NULL, created_at timestamp with time zone DEFAULT now() NOT NULL, updated_at timestamp with time zone DEFAULT now() NOT NULL, deleted_at timestamp with time zone, CONSTRAINT conversation_notes_body_check CHECK (((length(body) > 0) AND (length(body) <= 4000))) ); CREATE TABLE public.conversation_optout_keywords ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid, keyword text NOT NULL, enabled boolean DEFAULT true NOT NULL, is_system boolean DEFAULT false NOT NULL, created_at timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT conversation_optout_keywords_keyword_check CHECK (((length(keyword) > 0) AND (length(keyword) <= 100))) ); CREATE TABLE public.conversation_optouts ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, phone text NOT NULL, patient_id uuid, source text DEFAULT 'keyword'::text NOT NULL, keyword_matched text, original_message text, notes text, blocked_by uuid, opted_out_at timestamp with time zone DEFAULT now() NOT NULL, opted_back_in_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_optouts_phone_check CHECK ((phone ~ '^\d{6,15}$'::text)), CONSTRAINT conversation_optouts_source_check CHECK ((source = ANY (ARRAY['keyword'::text, 'manual'::text]))) ); CREATE TABLE public.conversation_tags ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid, name text NOT NULL, slug text NOT NULL, color text DEFAULT '#6366f1'::text NOT NULL, icon text, "position" integer DEFAULT 100 NOT NULL, is_system 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_tags_color_check CHECK ((color ~ '^#[0-9a-fA-F]{6}$'::text)), CONSTRAINT conversation_tags_name_check CHECK (((length(name) > 0) AND (length(name) <= 40))), CONSTRAINT conversation_tags_slug_check CHECK ((slug ~ '^[a-z0-9_-]{1,40}$'::text)) ); CREATE TABLE public.conversation_thread_tags ( tenant_id uuid NOT NULL, thread_key text NOT NULL, tag_id uuid NOT NULL, tagged_by uuid, tagged_at timestamp with time zone DEFAULT now() NOT NULL ); CREATE TABLE public.session_reminder_logs ( id bigint NOT NULL, event_id uuid NOT NULL, tenant_id uuid NOT NULL, reminder_type text NOT NULL, sent_at timestamp with time zone DEFAULT now() NOT NULL, provider text, skip_reason text, 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]))) ); CREATE TABLE public.session_reminder_settings ( tenant_id uuid NOT NULL, enabled boolean DEFAULT false NOT NULL, send_24h boolean DEFAULT true NOT NULL, send_2h boolean DEFAULT true NOT NULL, template_24h text DEFAULT 'Oi {{nome_paciente}}! 👋 Lembrando da sua sessão amanhã, {{data_sessao}} às {{hora_sessao}}. Até lá!'::text NOT NULL, template_2h text DEFAULT 'Oi {{nome_paciente}}! Sua sessão começa em 2 horas, às {{hora_sessao}}. Te espero! 😊'::text NOT NULL, quiet_hours_enabled boolean DEFAULT true NOT NULL, quiet_hours_start time without time zone DEFAULT '22:00:00'::time without time zone NOT NULL, quiet_hours_end time without time zone DEFAULT '08:00:00'::time without time zone NOT NULL, respect_opt_out 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 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))) );