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,6 @@
|
||||
-- Tables: outros
|
||||
-- Gerado automaticamente em 2026-04-21T23:16:34.954Z
|
||||
-- Total: 17
|
||||
-- Gerado automaticamente em 2026-05-11T16:53:50.926Z
|
||||
-- Total: 1
|
||||
|
||||
CREATE TABLE public._db_migrations (
|
||||
id integer NOT NULL,
|
||||
@@ -9,259 +9,3 @@ CREATE TABLE public._db_migrations (
|
||||
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)))
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user