-- Tables: outros
-- Gerado automaticamente em 2026-04-21T23:16:34.954Z
-- Total: 17

CREATE TABLE public._db_migrations (
    id integer NOT NULL,
    filename text NOT NULL,
    hash text NOT NULL,
    category text DEFAULT 'migration'::text NOT NULL,
    applied_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE public.audit_logs (
    id bigint NOT NULL,
    tenant_id uuid NOT NULL,
    user_id uuid,
    entity_type text NOT NULL,
    entity_id text,
    action text NOT NULL,
    old_values jsonb,
    new_values jsonb,
    changed_fields text[],
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT audit_logs_action_check CHECK ((action = ANY (ARRAY['insert'::text, 'update'::text, 'delete'::text])))
);

CREATE TABLE public.dev_auditoria_items (
    id bigint NOT NULL,
    categoria character varying(120),
    titulo text NOT NULL,
    descricao_problema text,
    solucao text,
    severidade character varying(20),
    status character varying(20) DEFAULT 'aberto'::character varying NOT NULL,
    resolvido_em date,
    sessao_resolucao character varying(160),
    arquivo_afetado text,
    tags text[] DEFAULT '{}'::text[],
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    ordem integer DEFAULT 0 NOT NULL,
    CONSTRAINT dev_auditoria_items_severidade_check CHECK (((severidade IS NULL) OR ((severidade)::text = ANY ((ARRAY['critico'::character varying, 'alto'::character varying, 'medio'::character varying, 'baixo'::character varying])::text[])))),
    CONSTRAINT dev_auditoria_items_status_check CHECK (((status)::text = ANY ((ARRAY['aberto'::character varying, 'em_analise'::character varying, 'resolvido'::character varying, 'wontfix'::character varying, 'duplicado'::character varying])::text[])))
);

CREATE TABLE public.dev_comparison_competitor_status (
    id bigint NOT NULL,
    comparison_id bigint NOT NULL,
    competitor_id bigint NOT NULL,
    status character varying(20) DEFAULT 'a_definir'::character varying NOT NULL,
    nota text,
    fonte character varying(20),
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT dev_comparison_competitor_status_fonte_check CHECK (((fonte IS NULL) OR ((fonte)::text = ANY ((ARRAY['fetched'::character varying, 'observacao'::character varying, 'publico'::character varying, 'hipotese'::character varying])::text[])))),
    CONSTRAINT dev_comparison_competitor_status_status_check CHECK (((status)::text = ANY ((ARRAY['tem'::character varying, 'parcial'::character varying, 'gap'::character varying, 'na'::character varying, 'a_definir'::character varying])::text[])))
);

CREATE TABLE public.dev_comparison_matrix (
    id bigint NOT NULL,
    dominio character varying(120),
    feature text NOT NULL,
    nosso_status character varying(20) DEFAULT 'a_definir'::character varying NOT NULL,
    nossa_nota text,
    importancia character varying(20),
    ordem 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 dev_comparison_matrix_importancia_check CHECK (((importancia IS NULL) OR ((importancia)::text = ANY ((ARRAY['alta'::character varying, 'media'::character varying, 'baixa'::character varying])::text[])))),
    CONSTRAINT dev_comparison_matrix_nosso_status_check CHECK (((nosso_status)::text = ANY ((ARRAY['tem'::character varying, 'parcial'::character varying, 'gap'::character varying, 'na'::character varying, 'a_definir'::character varying])::text[])))
);

CREATE TABLE public.dev_competitor_features (
    id bigint NOT NULL,
    competitor_id bigint NOT NULL,
    categoria character varying(120),
    nome text NOT NULL,
    descricao text,
    fonte character varying(20) DEFAULT 'publico'::character varying NOT NULL,
    fonte_url text,
    data_fonte date,
    destaque 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,
    ordem integer DEFAULT 0 NOT NULL,
    CONSTRAINT dev_competitor_features_fonte_check CHECK (((fonte)::text = ANY ((ARRAY['fetched'::character varying, 'observacao'::character varying, 'publico'::character varying, 'hipotese'::character varying])::text[])))
);

CREATE TABLE public.dev_competitors (
    id bigint NOT NULL,
    slug character varying(80) NOT NULL,
    nome character varying(160) NOT NULL,
    pais character varying(40),
    foco character varying(160),
    pricing text,
    posicionamento text,
    url text,
    ultima_pesquisa date,
    notas text,
    ativo boolean DEFAULT true NOT NULL,
    ordem 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.dev_generation_log (
    id bigint NOT NULL,
    tipo character varying(40) NOT NULL,
    comando text,
    sucesso boolean DEFAULT false NOT NULL,
    stdout text,
    stderr text,
    duration_ms integer,
    metadata jsonb DEFAULT '{}'::jsonb,
    trigger_user_id uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE public.dev_roadmap_items (
    id bigint NOT NULL,
    phase_id bigint NOT NULL,
    numero integer,
    bloco character varying(160),
    feature text NOT NULL,
    descricao text,
    esforco character varying(4),
    prioridade character varying(20),
    status character varying(20) DEFAULT 'pendente'::character varying NOT NULL,
    notas text,
    assignee character varying(120),
    data_inicio date,
    data_conclusao date,
    ordem integer DEFAULT 0 NOT NULL,
    tags text[] DEFAULT '{}'::text[],
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT dev_roadmap_items_esforco_check CHECK (((esforco IS NULL) OR ((esforco)::text = ANY ((ARRAY['S'::character varying, 'M'::character varying, 'L'::character varying, 'XL'::character varying])::text[])))),
    CONSTRAINT dev_roadmap_items_prioridade_check CHECK (((prioridade IS NULL) OR ((prioridade)::text = ANY ((ARRAY['bloqueador'::character varying, 'alta'::character varying, 'media'::character varying, 'diferencial'::character varying])::text[])))),
    CONSTRAINT dev_roadmap_items_status_check CHECK (((status)::text = ANY ((ARRAY['pendente'::character varying, 'em_andamento'::character varying, 'concluido'::character varying, 'cancelado'::character varying, 'bloqueado'::character varying])::text[])))
);

CREATE TABLE public.dev_roadmap_phases (
    id bigint NOT NULL,
    numero integer NOT NULL,
    nome character varying(160) NOT NULL,
    objetivo text,
    timeline_sugerida character varying(160),
    criterio_saida text,
    status character varying(20) DEFAULT 'planejada'::character varying NOT NULL,
    data_inicio date,
    data_fim date,
    ordem 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 dev_roadmap_phases_status_check CHECK (((status)::text = ANY ((ARRAY['planejada'::character varying, 'em_andamento'::character varying, 'concluida'::character varying, 'arquivada'::character varying])::text[])))
);

CREATE TABLE public.dev_test_items (
    id bigint NOT NULL,
    area character varying(80) NOT NULL,
    categoria character varying(120),
    titulo text NOT NULL,
    arquivo text,
    descricao text,
    total_tests integer DEFAULT 0,
    passing integer DEFAULT 0,
    failing integer DEFAULT 0,
    skipped integer DEFAULT 0,
    cobertura_pct numeric(5,2),
    status character varying(20) DEFAULT 'ok'::character varying NOT NULL,
    last_run_at timestamp with time zone,
    sessao_criacao character varying(160),
    notas text,
    tags text[] DEFAULT '{}'::text[],
    ordem 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 dev_test_items_status_check CHECK (((status)::text = ANY ((ARRAY['ok'::character varying, 'falhando'::character varying, 'pendente'::character varying, 'obsoleto'::character varying, 'a_escrever'::character varying])::text[])))
);

CREATE TABLE public.dev_verificacoes_items (
    id bigint NOT NULL,
    area character varying(80) NOT NULL,
    categoria character varying(120),
    titulo text NOT NULL,
    descricao text,
    resultado text,
    acao_sugerida text,
    severidade character varying(20),
    status character varying(20) DEFAULT 'pendente'::character varying NOT NULL,
    verificado_em date,
    sessao_verificacao character varying(160),
    arquivo_afetado text,
    auditoria_item_id bigint,
    tags text[] DEFAULT '{}'::text[],
    ordem 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 dev_verificacoes_items_severidade_check CHECK (((severidade IS NULL) OR ((severidade)::text = ANY ((ARRAY['critico'::character varying, 'alto'::character varying, 'medio'::character varying, 'baixo'::character varying])::text[])))),
    CONSTRAINT dev_verificacoes_items_status_check CHECK (((status)::text = ANY ((ARRAY['pendente'::character varying, 'verificando'::character varying, 'ok'::character varying, 'problema'::character varying, 'corrigido'::character varying, 'wontfix'::character varying])::text[])))
);

CREATE TABLE public.math_challenges (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    question text NOT NULL,
    answer integer NOT NULL,
    used boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    expires_at timestamp with time zone DEFAULT (now() + '00:05:00'::interval) NOT NULL
);

CREATE TABLE public.patient_invite_attempts (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    token text NOT NULL,
    ok boolean NOT NULL,
    error_code text,
    error_msg text,
    client_info text,
    owner_id uuid,
    tenant_id uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE public.public_submission_attempts (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    endpoint text NOT NULL,
    ip_hash text,
    success boolean NOT NULL,
    error_code text,
    error_msg text,
    blocked_by text,
    user_agent text,
    metadata jsonb,
    created_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE public.saas_security_config (
    id boolean DEFAULT true NOT NULL,
    honeypot_enabled boolean DEFAULT true NOT NULL,
    rate_limit_enabled boolean DEFAULT true NOT NULL,
    rate_limit_window_min integer DEFAULT 10 NOT NULL,
    rate_limit_max_attempts integer DEFAULT 5 NOT NULL,
    captcha_after_failures integer DEFAULT 3 NOT NULL,
    captcha_required_globally boolean DEFAULT false NOT NULL,
    block_duration_min integer DEFAULT 30 NOT NULL,
    captcha_required_window_min integer DEFAULT 60 NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_by uuid,
    CONSTRAINT saas_security_config_singleton CHECK ((id = true))
);

CREATE TABLE public.saas_twilio_config (
    id boolean DEFAULT true NOT NULL,
    account_sid text,
    whatsapp_webhook_url text,
    usd_brl_rate numeric(10,4) DEFAULT 5.5 NOT NULL,
    margin_multiplier numeric(10,4) DEFAULT 1.4 NOT NULL,
    notes text,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_by uuid,
    CONSTRAINT saas_twilio_config_mult_chk CHECK (((margin_multiplier >= (1)::numeric) AND (margin_multiplier <= (10)::numeric))),
    CONSTRAINT saas_twilio_config_rate_chk CHECK (((usd_brl_rate > (0)::numeric) AND (usd_brl_rate < (100)::numeric))),
    CONSTRAINT saas_twilio_config_sid_chk CHECK (((account_sid IS NULL) OR (account_sid ~ '^AC[a-zA-Z0-9]{32}$'::text))),
    CONSTRAINT saas_twilio_config_singleton CHECK ((id = true)),
    CONSTRAINT saas_twilio_config_url_chk CHECK (((whatsapp_webhook_url IS NULL) OR (whatsapp_webhook_url ~ '^https?://'::text)))
);
