Sessoes 1-6 acumuladas: hardening B2, defesa em camadas, +192 testes
Repositorio estava ha ~5 sessoes sem commit. Consolida tudo desde d088a89.
Ver commit.md na raiz para descricao completa por sessao.
# Numeros
- A# auditoria abertos: 0/30
- V# verificacoes abertos: 5/52 (todos adiados com plano)
- T# testes escritos: 10/10
- Vitest: 192/192
- SQL integration: 33/33
- E2E (Playwright, novo): 5/5
- Migrations: 17 (10 novas Sessao 6)
- Areas auditadas: 7 (+documentos com 10 V#)
# Highlights Sessao 6 (hoje)
- V#34/V#41 Opcao B2: tenant_features com plano + override (RPC SECURITY DEFINER, tela /saas/tenant-features)
- A#20 rev2 self-hosted: defesa em 5 camadas (honeypot + rate limit + math captcha condicional + paranoid mode + dashboard /saas/security)
- Documentos hardening (V#43-V#49): tenant scoping em storage policies (vazamento entre clinicas eliminado), RPC validate_share_token, signatures policy granular
- SaaS Twilio Config (/saas/twilio-config): UI editavel para SID/webhook/cotacao; AUTH_TOKEN permanece em env var
- T#9 + T#10: useAgendaEvents.spec.js + Playwright E2E (descobriu bug no front que foi corrigido)
# Sessoes anteriores (1-5) consolidadas
- Sessao 1: auth/router/session, normalizeRole extraido
- Sessao 2: agenda - composables/services consolidados
- Sessao 3: pacientes - tenant_id em todas queries
- Sessao 4: security review pagina publica - 14/15 vulnerabilidades corrigidas
- Sessao 5: SaaS - P0 (A#30: 7 tabelas com RLS off corrigidas)
# .gitignore ajustado
- supabase/* + !supabase/functions/ (mantem 10 edge functions, ignora .temp/migrations gerados pelo CLI)
- database-novo/backups/ (regeneravel via db.cjs backup)
- test-results/ + playwright-report/
- .claude/settings.local.json (config local com senha de dev removida do tracking)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
-- Tables: Addons / Créditos
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.228Z
|
||||
-- Total: 3
|
||||
|
||||
CREATE TABLE public.addon_credits (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid,
|
||||
addon_type text NOT NULL,
|
||||
balance integer DEFAULT 0 NOT NULL,
|
||||
total_purchased integer DEFAULT 0 NOT NULL,
|
||||
total_consumed integer DEFAULT 0 NOT NULL,
|
||||
low_balance_threshold integer DEFAULT 10,
|
||||
low_balance_notified boolean DEFAULT false,
|
||||
daily_limit integer,
|
||||
hourly_limit integer,
|
||||
daily_used integer DEFAULT 0,
|
||||
hourly_used integer DEFAULT 0,
|
||||
daily_reset_at timestamp with time zone,
|
||||
hourly_reset_at timestamp with time zone,
|
||||
from_number_override text,
|
||||
expires_at timestamp with time zone,
|
||||
is_active boolean DEFAULT true,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE public.addon_products (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
slug text NOT NULL,
|
||||
name text NOT NULL,
|
||||
description text,
|
||||
addon_type text NOT NULL,
|
||||
icon text DEFAULT 'pi pi-box'::text,
|
||||
credits_amount integer DEFAULT 0,
|
||||
price_cents integer DEFAULT 0 NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text,
|
||||
is_active boolean DEFAULT true,
|
||||
is_visible boolean DEFAULT true,
|
||||
sort_order integer DEFAULT 0,
|
||||
metadata jsonb DEFAULT '{}'::jsonb,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now(),
|
||||
deleted_at timestamp with time zone
|
||||
);
|
||||
|
||||
CREATE TABLE public.addon_transactions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid,
|
||||
addon_type text NOT NULL,
|
||||
type text NOT NULL,
|
||||
amount integer NOT NULL,
|
||||
balance_before integer DEFAULT 0 NOT NULL,
|
||||
balance_after integer DEFAULT 0 NOT NULL,
|
||||
product_id uuid,
|
||||
queue_id uuid,
|
||||
description text,
|
||||
admin_user_id uuid,
|
||||
payment_method text,
|
||||
payment_reference text,
|
||||
price_cents integer,
|
||||
currency text DEFAULT 'BRL'::text,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
metadata jsonb DEFAULT '{}'::jsonb
|
||||
);
|
||||
+5
-208
@@ -1,11 +1,6 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Agenda + Recorrências + Agendador Online
|
||||
-- =============================================================================
|
||||
-- agenda_bloqueios, agenda_configuracoes, agenda_eventos, agenda_excecoes,
|
||||
-- agenda_online_slots, agenda_regras_semanais, agenda_slots_bloqueados_semanais,
|
||||
-- agenda_slots_regras, recurrence_rules, recurrence_exceptions,
|
||||
-- recurrence_rule_services, agendador_configuracoes, agendador_solicitacoes
|
||||
-- =============================================================================
|
||||
-- Tables: Agenda / Agendamento
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.229Z
|
||||
-- Total: 10
|
||||
|
||||
CREATE TABLE public.agenda_bloqueios (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -25,13 +20,6 @@ CREATE TABLE public.agenda_bloqueios (
|
||||
CONSTRAINT agenda_bloqueios_tipo_check CHECK ((tipo = ANY (ARRAY['feriado_nacional'::text, 'feriado_municipal'::text, 'bloqueio'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_bloqueios OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agenda_configuracoes; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agenda_configuracoes (
|
||||
owner_id uuid NOT NULL,
|
||||
duracao_padrao_minutos integer DEFAULT 50 NOT NULL,
|
||||
@@ -68,7 +56,9 @@ CREATE TABLE public.agenda_configuracoes (
|
||||
tenant_id uuid,
|
||||
jornada_igual_todos boolean DEFAULT true,
|
||||
slot_mode text DEFAULT 'fixed'::text NOT NULL,
|
||||
atendimento_mode text DEFAULT 'particular'::text,
|
||||
CONSTRAINT agenda_configuracoes_admin_slot_visual_minutos_check CHECK ((admin_slot_visual_minutos = ANY (ARRAY[5, 10, 15, 20, 30, 60]))),
|
||||
CONSTRAINT agenda_configuracoes_atendimento_mode_check CHECK (((atendimento_mode IS NULL) OR (atendimento_mode = ANY (ARRAY['particular'::text, 'convenio'::text, 'ambos'::text])))),
|
||||
CONSTRAINT agenda_configuracoes_check CHECK (((usar_horario_admin_custom = false) OR ((admin_inicio_visualizacao IS NOT NULL) AND (admin_fim_visualizacao IS NOT NULL) AND (admin_fim_visualizacao > admin_inicio_visualizacao)))),
|
||||
CONSTRAINT agenda_configuracoes_duracao_padrao_minutos_check CHECK (((duracao_padrao_minutos >= 10) AND (duracao_padrao_minutos <= 240))),
|
||||
CONSTRAINT agenda_configuracoes_granularidade_min_check CHECK (((granularidade_min IS NULL) OR (granularidade_min = ANY (ARRAY[5, 10, 15, 20, 30, 45, 50, 60])))),
|
||||
@@ -87,13 +77,6 @@ CREATE TABLE public.agenda_configuracoes (
|
||||
CONSTRAINT session_duration_min_chk CHECK (((session_duration_min >= 10) AND (session_duration_min <= 240)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_configuracoes OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agenda_eventos; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agenda_eventos (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -129,20 +112,6 @@ CREATE TABLE public.agenda_eventos (
|
||||
CONSTRAINT agenda_eventos_check CHECK ((fim_em > inicio_em))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_eventos OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: COLUMN agenda_eventos.price; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN public.agenda_eventos.price IS 'Valor da sessão em BRL. Preenchido automaticamente pela tabela professional_pricing do profissional.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: agenda_excecoes; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agenda_excecoes (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -161,13 +130,6 @@ CREATE TABLE public.agenda_excecoes (
|
||||
CONSTRAINT agenda_excecoes_fonte_check CHECK ((fonte = ANY (ARRAY['manual'::text, 'feriado_google'::text, 'sistema'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_excecoes OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agenda_online_slots; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agenda_online_slots (
|
||||
id bigint NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -180,34 +142,6 @@ CREATE TABLE public.agenda_online_slots (
|
||||
CONSTRAINT agenda_online_slots_weekday_check CHECK ((weekday = ANY (ARRAY[0, 1, 2, 3, 4, 5, 6])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_online_slots OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agenda_online_slots_id_seq; Type: SEQUENCE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.agenda_online_slots_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE public.agenda_online_slots_id_seq OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agenda_online_slots_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
ALTER SEQUENCE public.agenda_online_slots_id_seq OWNED BY public.agenda_online_slots.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: agenda_regras_semanais; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agenda_regras_semanais (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -224,13 +158,6 @@ CREATE TABLE public.agenda_regras_semanais (
|
||||
CONSTRAINT agenda_regras_semanais_modalidade_check CHECK (((modalidade = ANY (ARRAY['online'::text, 'presencial'::text, 'ambos'::text])) OR (modalidade IS NULL)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_regras_semanais OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agenda_slots_bloqueados_semanais; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agenda_slots_bloqueados_semanais (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -244,13 +171,6 @@ CREATE TABLE public.agenda_slots_bloqueados_semanais (
|
||||
CONSTRAINT agenda_slots_bloqueados_semanais_dia_semana_check CHECK (((dia_semana >= 0) AND (dia_semana <= 6)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_slots_bloqueados_semanais OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agenda_slots_regras; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agenda_slots_regras (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -272,14 +192,6 @@ CREATE TABLE public.agenda_slots_regras (
|
||||
CONSTRAINT agenda_slots_regras_passo_minutos_check CHECK (((passo_minutos >= 5) AND (passo_minutos <= 240)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agenda_slots_regras OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: agendador_configuracoes; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE public.agendador_configuracoes (
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid,
|
||||
@@ -323,27 +235,6 @@ CREATE TABLE public.agendador_configuracoes (
|
||||
CONSTRAINT agendador_configuracoes_reserva_check CHECK (((reserva_horas >= 1) AND (reserva_horas <= 48)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agendador_configuracoes OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: COLUMN agendador_configuracoes.pagamento_modo; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN public.agendador_configuracoes.pagamento_modo IS 'sem_pagamento | pagar_na_hora | pix_antecipado';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN agendador_configuracoes.pagamento_metodos_visiveis; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN public.agendador_configuracoes.pagamento_metodos_visiveis IS 'Métodos exibidos ao paciente quando pagamento_modo = pagar_na_hora. Ex: {pix, deposito, dinheiro, cartao, convenio}';
|
||||
|
||||
|
||||
--
|
||||
-- Name: agendador_solicitacoes; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.agendador_solicitacoes (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -376,97 +267,3 @@ CREATE TABLE public.agendador_solicitacoes (
|
||||
CONSTRAINT agendador_sol_status_check CHECK ((status = ANY (ARRAY['pendente'::text, 'autorizado'::text, 'recusado'::text, 'expirado'::text, 'convertido'::text]))),
|
||||
CONSTRAINT agendador_sol_tipo_check CHECK ((tipo = ANY (ARRAY['primeira'::text, 'retorno'::text, 'reagendar'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.agendador_solicitacoes OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: billing_contracts; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE public.recurrence_exceptions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
recurrence_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
original_date date NOT NULL,
|
||||
type public.recurrence_exception_type NOT NULL,
|
||||
new_date date,
|
||||
new_start_time time without time zone,
|
||||
new_end_time time without time zone,
|
||||
modalidade text,
|
||||
observacoes text,
|
||||
titulo_custom text,
|
||||
extra_fields jsonb,
|
||||
reason text,
|
||||
agenda_evento_id uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.recurrence_exceptions OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: recurrence_rule_services; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.recurrence_rule_services (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
rule_id uuid NOT NULL,
|
||||
service_id uuid NOT NULL,
|
||||
quantity integer DEFAULT 1 NOT NULL,
|
||||
unit_price numeric(10,2) NOT NULL,
|
||||
discount_pct numeric(5,2) DEFAULT 0,
|
||||
discount_flat numeric(10,2) DEFAULT 0,
|
||||
final_price numeric(10,2) NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
CONSTRAINT recurrence_rule_services_disc_flat_chk CHECK ((discount_flat >= (0)::numeric)),
|
||||
CONSTRAINT recurrence_rule_services_disc_pct_chk CHECK (((discount_pct >= (0)::numeric) AND (discount_pct <= (100)::numeric))),
|
||||
CONSTRAINT recurrence_rule_services_final_price_chk CHECK ((final_price >= (0)::numeric)),
|
||||
CONSTRAINT recurrence_rule_services_quantity_chk CHECK ((quantity > 0))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.recurrence_rule_services OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: recurrence_rules; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.recurrence_rules (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
therapist_id uuid,
|
||||
patient_id uuid,
|
||||
determined_commitment_id uuid,
|
||||
type public.recurrence_type DEFAULT 'weekly'::public.recurrence_type NOT NULL,
|
||||
"interval" smallint DEFAULT 1 NOT NULL,
|
||||
weekdays smallint[] DEFAULT '{}'::smallint[] NOT NULL,
|
||||
start_time time without time zone NOT NULL,
|
||||
end_time time without time zone NOT NULL,
|
||||
timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL,
|
||||
duration_min smallint DEFAULT 50 NOT NULL,
|
||||
start_date date NOT NULL,
|
||||
end_date date,
|
||||
max_occurrences integer,
|
||||
open_ended boolean DEFAULT true NOT NULL,
|
||||
modalidade text DEFAULT 'presencial'::text,
|
||||
titulo_custom text,
|
||||
observacoes text,
|
||||
extra_fields jsonb,
|
||||
status text DEFAULT 'ativo'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
price numeric(10,2),
|
||||
insurance_plan_id uuid,
|
||||
insurance_guide_number text,
|
||||
insurance_value numeric(10,2),
|
||||
insurance_plan_service_id uuid,
|
||||
CONSTRAINT recurrence_rules_dates_chk CHECK (((end_date IS NULL) OR (end_date >= start_date))),
|
||||
CONSTRAINT recurrence_rules_interval_chk CHECK (("interval" >= 1)),
|
||||
CONSTRAINT recurrence_rules_status_check CHECK ((status = ANY (ARRAY['ativo'::text, 'pausado'::text, 'cancelado'::text]))),
|
||||
CONSTRAINT recurrence_rules_times_chk CHECK ((end_time > start_time))
|
||||
);
|
||||
|
||||
|
||||
@@ -1,608 +0,0 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — auth schema (Supabase GoTrue)
|
||||
-- =============================================================================
|
||||
-- auth.users, auth.identities, auth.sessions, auth.refresh_tokens,
|
||||
-- auth.mfa_*, auth.saml_*, auth.sso_*, auth.flow_state, etc.
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE auth.audit_log_entries (
|
||||
instance_id uuid,
|
||||
id uuid NOT NULL,
|
||||
payload json,
|
||||
created_at timestamp with time zone,
|
||||
ip_address character varying(64) DEFAULT ''::character varying NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.audit_log_entries OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE audit_log_entries; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.audit_log_entries IS 'Auth: Audit trail for user actions.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: flow_state; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.flow_state (
|
||||
id uuid NOT NULL,
|
||||
user_id uuid,
|
||||
auth_code text,
|
||||
code_challenge_method auth.code_challenge_method,
|
||||
code_challenge text,
|
||||
provider_type text NOT NULL,
|
||||
provider_access_token text,
|
||||
provider_refresh_token text,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
authentication_method text NOT NULL,
|
||||
auth_code_issued_at timestamp with time zone,
|
||||
invite_token text,
|
||||
referrer text,
|
||||
oauth_client_state_id uuid,
|
||||
linking_target_id uuid,
|
||||
email_optional boolean DEFAULT false NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.flow_state OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE flow_state; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.flow_state IS 'Stores metadata for all OAuth/SSO login flows';
|
||||
|
||||
|
||||
--
|
||||
-- Name: identities; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.identities (
|
||||
provider_id text NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
identity_data jsonb NOT NULL,
|
||||
provider text NOT NULL,
|
||||
last_sign_in_at timestamp with time zone,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
email text GENERATED ALWAYS AS (lower((identity_data ->> 'email'::text))) STORED,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.identities OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE identities; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.identities IS 'Auth: Stores identities associated to a user.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN identities.email; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN auth.identities.email IS 'Auth: Email is a generated column that references the optional email property in the identity_data';
|
||||
|
||||
|
||||
--
|
||||
-- Name: instances; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.instances (
|
||||
id uuid NOT NULL,
|
||||
uuid uuid,
|
||||
raw_base_config text,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.instances OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE instances; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.instances IS 'Auth: Manages users across multiple sites.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: mfa_amr_claims; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.mfa_amr_claims (
|
||||
session_id uuid NOT NULL,
|
||||
created_at timestamp with time zone NOT NULL,
|
||||
updated_at timestamp with time zone NOT NULL,
|
||||
authentication_method text NOT NULL,
|
||||
id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.mfa_amr_claims OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE mfa_amr_claims; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.mfa_amr_claims IS 'auth: stores authenticator method reference claims for multi factor authentication';
|
||||
|
||||
|
||||
--
|
||||
-- Name: mfa_challenges; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.mfa_challenges (
|
||||
id uuid NOT NULL,
|
||||
factor_id uuid NOT NULL,
|
||||
created_at timestamp with time zone NOT NULL,
|
||||
verified_at timestamp with time zone,
|
||||
ip_address inet NOT NULL,
|
||||
otp_code text,
|
||||
web_authn_session_data jsonb
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.mfa_challenges OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE mfa_challenges; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.mfa_challenges IS 'auth: stores metadata about challenge requests made';
|
||||
|
||||
|
||||
--
|
||||
-- Name: mfa_factors; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.mfa_factors (
|
||||
id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
friendly_name text,
|
||||
factor_type auth.factor_type NOT NULL,
|
||||
status auth.factor_status NOT NULL,
|
||||
created_at timestamp with time zone NOT NULL,
|
||||
updated_at timestamp with time zone NOT NULL,
|
||||
secret text,
|
||||
phone text,
|
||||
last_challenged_at timestamp with time zone,
|
||||
web_authn_credential jsonb,
|
||||
web_authn_aaguid uuid,
|
||||
last_webauthn_challenge_data jsonb
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.mfa_factors OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE mfa_factors; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.mfa_factors IS 'auth: stores metadata about factors';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN mfa_factors.last_webauthn_challenge_data; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN auth.mfa_factors.last_webauthn_challenge_data IS 'Stores the latest WebAuthn challenge data including attestation/assertion for customer verification';
|
||||
|
||||
|
||||
--
|
||||
-- Name: oauth_authorizations; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.oauth_authorizations (
|
||||
id uuid NOT NULL,
|
||||
authorization_id text NOT NULL,
|
||||
client_id uuid NOT NULL,
|
||||
user_id uuid,
|
||||
redirect_uri text NOT NULL,
|
||||
scope text NOT NULL,
|
||||
state text,
|
||||
resource text,
|
||||
code_challenge text,
|
||||
code_challenge_method auth.code_challenge_method,
|
||||
response_type auth.oauth_response_type DEFAULT 'code'::auth.oauth_response_type NOT NULL,
|
||||
status auth.oauth_authorization_status DEFAULT 'pending'::auth.oauth_authorization_status NOT NULL,
|
||||
authorization_code text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
expires_at timestamp with time zone DEFAULT (now() + '00:03:00'::interval) NOT NULL,
|
||||
approved_at timestamp with time zone,
|
||||
nonce text,
|
||||
CONSTRAINT oauth_authorizations_authorization_code_length CHECK ((char_length(authorization_code) <= 255)),
|
||||
CONSTRAINT oauth_authorizations_code_challenge_length CHECK ((char_length(code_challenge) <= 128)),
|
||||
CONSTRAINT oauth_authorizations_expires_at_future CHECK ((expires_at > created_at)),
|
||||
CONSTRAINT oauth_authorizations_nonce_length CHECK ((char_length(nonce) <= 255)),
|
||||
CONSTRAINT oauth_authorizations_redirect_uri_length CHECK ((char_length(redirect_uri) <= 2048)),
|
||||
CONSTRAINT oauth_authorizations_resource_length CHECK ((char_length(resource) <= 2048)),
|
||||
CONSTRAINT oauth_authorizations_scope_length CHECK ((char_length(scope) <= 4096)),
|
||||
CONSTRAINT oauth_authorizations_state_length CHECK ((char_length(state) <= 4096))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.oauth_authorizations OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: oauth_client_states; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.oauth_client_states (
|
||||
id uuid NOT NULL,
|
||||
provider_type text NOT NULL,
|
||||
code_verifier text,
|
||||
created_at timestamp with time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.oauth_client_states OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE oauth_client_states; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.oauth_client_states IS 'Stores OAuth states for third-party provider authentication flows where Supabase acts as the OAuth client.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: oauth_clients; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.oauth_clients (
|
||||
id uuid NOT NULL,
|
||||
client_secret_hash text,
|
||||
registration_type auth.oauth_registration_type NOT NULL,
|
||||
redirect_uris text NOT NULL,
|
||||
grant_types text NOT NULL,
|
||||
client_name text,
|
||||
client_uri text,
|
||||
logo_uri text,
|
||||
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,
|
||||
client_type auth.oauth_client_type DEFAULT 'confidential'::auth.oauth_client_type NOT NULL,
|
||||
token_endpoint_auth_method text NOT NULL,
|
||||
CONSTRAINT oauth_clients_client_name_length CHECK ((char_length(client_name) <= 1024)),
|
||||
CONSTRAINT oauth_clients_client_uri_length CHECK ((char_length(client_uri) <= 2048)),
|
||||
CONSTRAINT oauth_clients_logo_uri_length CHECK ((char_length(logo_uri) <= 2048)),
|
||||
CONSTRAINT oauth_clients_token_endpoint_auth_method_check CHECK ((token_endpoint_auth_method = ANY (ARRAY['client_secret_basic'::text, 'client_secret_post'::text, 'none'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.oauth_clients OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: oauth_consents; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.oauth_consents (
|
||||
id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
client_id uuid NOT NULL,
|
||||
scopes text NOT NULL,
|
||||
granted_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
revoked_at timestamp with time zone,
|
||||
CONSTRAINT oauth_consents_revoked_after_granted CHECK (((revoked_at IS NULL) OR (revoked_at >= granted_at))),
|
||||
CONSTRAINT oauth_consents_scopes_length CHECK ((char_length(scopes) <= 2048)),
|
||||
CONSTRAINT oauth_consents_scopes_not_empty CHECK ((char_length(TRIM(BOTH FROM scopes)) > 0))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.oauth_consents OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: one_time_tokens; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.one_time_tokens (
|
||||
id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
token_type auth.one_time_token_type NOT NULL,
|
||||
token_hash text NOT NULL,
|
||||
relates_to text NOT NULL,
|
||||
created_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT one_time_tokens_token_hash_check CHECK ((char_length(token_hash) > 0))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.one_time_tokens OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: refresh_tokens; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.refresh_tokens (
|
||||
instance_id uuid,
|
||||
id bigint NOT NULL,
|
||||
token character varying(255),
|
||||
user_id character varying(255),
|
||||
revoked boolean,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
parent character varying(255),
|
||||
session_id uuid
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.refresh_tokens OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE refresh_tokens; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.refresh_tokens IS 'Auth: Store of tokens used to refresh JWT tokens once they expire.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: refresh_tokens_id_seq; Type: SEQUENCE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE SEQUENCE auth.refresh_tokens_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE auth.refresh_tokens_id_seq OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: refresh_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
ALTER SEQUENCE auth.refresh_tokens_id_seq OWNED BY auth.refresh_tokens.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: saml_providers; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.saml_providers (
|
||||
id uuid NOT NULL,
|
||||
sso_provider_id uuid NOT NULL,
|
||||
entity_id text NOT NULL,
|
||||
metadata_xml text NOT NULL,
|
||||
metadata_url text,
|
||||
attribute_mapping jsonb,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
name_id_format text,
|
||||
CONSTRAINT "entity_id not empty" CHECK ((char_length(entity_id) > 0)),
|
||||
CONSTRAINT "metadata_url not empty" CHECK (((metadata_url = NULL::text) OR (char_length(metadata_url) > 0))),
|
||||
CONSTRAINT "metadata_xml not empty" CHECK ((char_length(metadata_xml) > 0))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.saml_providers OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE saml_providers; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.saml_providers IS 'Auth: Manages SAML Identity Provider connections.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: saml_relay_states; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.saml_relay_states (
|
||||
id uuid NOT NULL,
|
||||
sso_provider_id uuid NOT NULL,
|
||||
request_id text NOT NULL,
|
||||
for_email text,
|
||||
redirect_to text,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
flow_state_id uuid,
|
||||
CONSTRAINT "request_id not empty" CHECK ((char_length(request_id) > 0))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.saml_relay_states OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE saml_relay_states; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.saml_relay_states IS 'Auth: Contains SAML Relay State information for each Service Provider initiated login.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: schema_migrations; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.schema_migrations (
|
||||
version character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.schema_migrations OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE schema_migrations; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.schema_migrations IS 'Auth: Manages updates to the auth system.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: sessions; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.sessions (
|
||||
id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
factor_id uuid,
|
||||
aal auth.aal_level,
|
||||
not_after timestamp with time zone,
|
||||
refreshed_at timestamp without time zone,
|
||||
user_agent text,
|
||||
ip inet,
|
||||
tag text,
|
||||
oauth_client_id uuid,
|
||||
refresh_token_hmac_key text,
|
||||
refresh_token_counter bigint,
|
||||
scopes text,
|
||||
CONSTRAINT sessions_scopes_length CHECK ((char_length(scopes) <= 4096))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.sessions OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE sessions; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.sessions IS 'Auth: Stores session data associated to a user.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN sessions.not_after; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN auth.sessions.not_after IS 'Auth: Not after is a nullable column that contains a timestamp after which the session should be regarded as expired.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN sessions.refresh_token_hmac_key; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN auth.sessions.refresh_token_hmac_key IS 'Holds a HMAC-SHA256 key used to sign refresh tokens for this session.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN sessions.refresh_token_counter; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN auth.sessions.refresh_token_counter IS 'Holds the ID (counter) of the last issued refresh token.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: sso_domains; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.sso_domains (
|
||||
id uuid NOT NULL,
|
||||
sso_provider_id uuid NOT NULL,
|
||||
domain text NOT NULL,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
CONSTRAINT "domain not empty" CHECK ((char_length(domain) > 0))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.sso_domains OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE sso_domains; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.sso_domains IS 'Auth: Manages SSO email address domain mapping to an SSO Identity Provider.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: sso_providers; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.sso_providers (
|
||||
id uuid NOT NULL,
|
||||
resource_id text,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
disabled boolean,
|
||||
CONSTRAINT "resource_id not empty" CHECK (((resource_id = NULL::text) OR (char_length(resource_id) > 0)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.sso_providers OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE sso_providers; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.sso_providers IS 'Auth: Manages SSO identity provider information; see saml_providers for SAML.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN sso_providers.resource_id; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN auth.sso_providers.resource_id IS 'Auth: Uniquely identifies a SSO provider according to a user-chosen resource ID (case insensitive), useful in infrastructure as code.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: users; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
CREATE TABLE auth.users (
|
||||
instance_id uuid,
|
||||
id uuid NOT NULL,
|
||||
aud character varying(255),
|
||||
role character varying(255),
|
||||
email character varying(255),
|
||||
encrypted_password character varying(255),
|
||||
email_confirmed_at timestamp with time zone,
|
||||
invited_at timestamp with time zone,
|
||||
confirmation_token character varying(255),
|
||||
confirmation_sent_at timestamp with time zone,
|
||||
recovery_token character varying(255),
|
||||
recovery_sent_at timestamp with time zone,
|
||||
email_change_token_new character varying(255),
|
||||
email_change character varying(255),
|
||||
email_change_sent_at timestamp with time zone,
|
||||
last_sign_in_at timestamp with time zone,
|
||||
raw_app_meta_data jsonb,
|
||||
raw_user_meta_data jsonb,
|
||||
is_super_admin boolean,
|
||||
created_at timestamp with time zone,
|
||||
updated_at timestamp with time zone,
|
||||
phone text DEFAULT NULL::character varying,
|
||||
phone_confirmed_at timestamp with time zone,
|
||||
phone_change text DEFAULT ''::character varying,
|
||||
phone_change_token character varying(255) DEFAULT ''::character varying,
|
||||
phone_change_sent_at timestamp with time zone,
|
||||
confirmed_at timestamp with time zone GENERATED ALWAYS AS (LEAST(email_confirmed_at, phone_confirmed_at)) STORED,
|
||||
email_change_token_current character varying(255) DEFAULT ''::character varying,
|
||||
email_change_confirm_status smallint DEFAULT 0,
|
||||
banned_until timestamp with time zone,
|
||||
reauthentication_token character varying(255) DEFAULT ''::character varying,
|
||||
reauthentication_sent_at timestamp with time zone,
|
||||
is_sso_user boolean DEFAULT false NOT NULL,
|
||||
deleted_at timestamp with time zone,
|
||||
is_anonymous boolean DEFAULT false NOT NULL,
|
||||
CONSTRAINT users_email_change_confirm_status_check CHECK (((email_change_confirm_status >= 0) AND (email_change_confirm_status <= 2)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE auth.users OWNER TO supabase_auth_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE users; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE auth.users IS 'Auth: Stores user login data within a secure schema.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN users.is_sso_user; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN auth.users.is_sso_user IS 'Auth: Set this column to true when the account comes from SSO. These accounts can have duplicate emails.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: addon_credits; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
-- Tables: Central SaaS (docs/FAQ)
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.230Z
|
||||
-- Total: 4
|
||||
|
||||
CREATE TABLE public.saas_doc_votos (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
doc_id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
util boolean 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.saas_docs (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
titulo text NOT NULL,
|
||||
conteudo text DEFAULT ''::text NOT NULL,
|
||||
medias jsonb DEFAULT '[]'::jsonb NOT NULL,
|
||||
tipo_acesso text DEFAULT 'usuario'::text NOT NULL,
|
||||
pagina_path text NOT NULL,
|
||||
docs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL,
|
||||
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,
|
||||
categoria text,
|
||||
exibir_no_faq boolean DEFAULT false NOT NULL,
|
||||
votos_util integer DEFAULT 0 NOT NULL,
|
||||
votos_nao_util integer DEFAULT 0 NOT NULL,
|
||||
CONSTRAINT saas_docs_tipo_acesso_check CHECK ((tipo_acesso = ANY (ARRAY['admin'::text, 'usuario'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.saas_faq (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
pergunta text NOT NULL,
|
||||
categoria text,
|
||||
publico boolean DEFAULT false NOT NULL,
|
||||
votos integer DEFAULT 0 NOT NULL,
|
||||
titulo text,
|
||||
conteudo text,
|
||||
tipo_acesso text DEFAULT 'usuario'::text NOT NULL,
|
||||
pagina_path text NOT NULL,
|
||||
pagina_label text,
|
||||
medias jsonb DEFAULT '[]'::jsonb NOT NULL,
|
||||
faqs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL,
|
||||
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.saas_faq_itens (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
doc_id uuid NOT NULL,
|
||||
pergunta text NOT NULL,
|
||||
resposta text,
|
||||
ordem integer DEFAULT 0 NOT NULL,
|
||||
ativo 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
|
||||
);
|
||||
+118
-101
@@ -1,11 +1,99 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Notificações + Email Templates
|
||||
-- =============================================================================
|
||||
-- notification_channels, notification_logs, notification_preferences,
|
||||
-- notification_queue, notification_schedules, notification_templates,
|
||||
-- notifications, email_templates_global, email_templates_tenant,
|
||||
-- email_layout_config
|
||||
-- =============================================================================
|
||||
-- Tables: Comunicação / Notificações
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.230Z
|
||||
-- Total: 14
|
||||
|
||||
CREATE TABLE public.email_layout_config (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
header_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb NOT NULL,
|
||||
footer_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb 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.email_templates_global (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
key text NOT NULL,
|
||||
domain text NOT NULL,
|
||||
channel text DEFAULT 'email'::text NOT NULL,
|
||||
subject text NOT NULL,
|
||||
body_html text NOT NULL,
|
||||
body_text text,
|
||||
version integer DEFAULT 1 NOT NULL,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
variables jsonb,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.email_templates_tenant (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid,
|
||||
template_key text NOT NULL,
|
||||
subject text,
|
||||
body_html text,
|
||||
body_text text,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
synced_version integer,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.global_notices (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
title text,
|
||||
message text DEFAULT ''::text NOT NULL,
|
||||
variant text DEFAULT 'info'::text NOT NULL,
|
||||
roles text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
contexts text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
starts_at timestamp with time zone,
|
||||
ends_at timestamp with time zone,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
priority integer DEFAULT 0 NOT NULL,
|
||||
dismissible boolean DEFAULT true NOT NULL,
|
||||
persist_dismiss boolean DEFAULT true NOT NULL,
|
||||
dismiss_scope text DEFAULT 'device'::text NOT NULL,
|
||||
show_once boolean DEFAULT false NOT NULL,
|
||||
max_views integer,
|
||||
cooldown_minutes integer,
|
||||
version integer DEFAULT 1 NOT NULL,
|
||||
action_type text DEFAULT 'none'::text NOT NULL,
|
||||
action_label text,
|
||||
action_url text,
|
||||
action_route text,
|
||||
views_count integer DEFAULT 0 NOT NULL,
|
||||
clicks_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,
|
||||
created_by uuid,
|
||||
content_align text DEFAULT 'left'::text NOT NULL,
|
||||
link_target text DEFAULT '_blank'::text NOT NULL,
|
||||
CONSTRAINT global_notices_action_type_check CHECK ((action_type = ANY (ARRAY['none'::text, 'internal'::text, 'external'::text]))),
|
||||
CONSTRAINT global_notices_content_align_check CHECK ((content_align = ANY (ARRAY['left'::text, 'center'::text, 'right'::text, 'justify'::text]))),
|
||||
CONSTRAINT global_notices_dismiss_scope_check CHECK ((dismiss_scope = ANY (ARRAY['session'::text, 'device'::text, 'user'::text]))),
|
||||
CONSTRAINT global_notices_link_target_check CHECK ((link_target = ANY (ARRAY['_blank'::text, '_self'::text, '_parent'::text, '_top'::text]))),
|
||||
CONSTRAINT global_notices_variant_check CHECK ((variant = ANY (ARRAY['info'::text, 'success'::text, 'warning'::text, 'error'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.login_carousel_slides (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
title text NOT NULL,
|
||||
body text NOT NULL,
|
||||
icon text DEFAULT 'pi-star'::text NOT NULL,
|
||||
ordem integer DEFAULT 0 NOT NULL,
|
||||
ativo boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE public.notice_dismissals (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
notice_id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
version integer DEFAULT 1 NOT NULL,
|
||||
dismissed_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.notification_channels (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -23,18 +111,18 @@ CREATE TABLE public.notification_channels (
|
||||
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,
|
||||
twilio_subaccount_sid text,
|
||||
twilio_phone_number text,
|
||||
twilio_phone_sid text,
|
||||
webhook_url text,
|
||||
cost_per_message_usd numeric(8,6) DEFAULT 0,
|
||||
price_per_message_brl numeric(8,4) DEFAULT 0,
|
||||
provisioned_at timestamp with time zone,
|
||||
CONSTRAINT notification_channels_channel_check CHECK ((channel = ANY (ARRAY['whatsapp'::text, 'email'::text, 'sms'::text]))),
|
||||
CONSTRAINT notification_channels_connection_status_check CHECK ((connection_status = ANY (ARRAY['connected'::text, 'disconnected'::text, 'connecting'::text, 'qr_pending'::text, 'error'::text]))),
|
||||
CONSTRAINT notification_channels_provider_check CHECK ((provider = ANY (ARRAY['evolution_api'::text, 'meta_official'::text, 'twilio'::text, 'zenvia'::text, 'sendgrid'::text, 'resend'::text, 'smtp'::text, 'zapi'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.notification_channels OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: notification_logs; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.notification_logs (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
@@ -64,13 +152,6 @@ CREATE TABLE public.notification_logs (
|
||||
CONSTRAINT notification_logs_status_check CHECK ((status = ANY (ARRAY['sent'::text, 'delivered'::text, 'read'::text, 'failed'::text, 'bounced'::text, 'opted_out'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.notification_logs OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: notification_preferences; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.notification_preferences (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
@@ -92,13 +173,6 @@ CREATE TABLE public.notification_preferences (
|
||||
deleted_at timestamp with time zone
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.notification_preferences OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: notification_queue; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.notification_queue (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
@@ -125,13 +199,6 @@ CREATE TABLE public.notification_queue (
|
||||
CONSTRAINT notification_queue_status_check CHECK ((status = ANY (ARRAY['pendente'::text, 'processando'::text, 'enviado'::text, 'falhou'::text, 'cancelado'::text, 'ignorado'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.notification_queue OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: notification_schedules; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.notification_schedules (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
@@ -156,13 +223,6 @@ CREATE TABLE public.notification_schedules (
|
||||
CONSTRAINT notification_schedules_trigger_type_check CHECK ((trigger_type = ANY (ARRAY['before_event'::text, 'after_event'::text, 'immediate'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.notification_schedules OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: notification_templates; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.notification_templates (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid,
|
||||
@@ -189,13 +249,6 @@ CREATE TABLE public.notification_templates (
|
||||
CONSTRAINT notification_templates_meta_status_check CHECK ((meta_status = ANY (ARRAY['draft'::text, 'pending_approval'::text, 'approved'::text, 'rejected'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.notification_templates OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: notifications; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.notifications (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -210,58 +263,22 @@ CREATE TABLE public.notifications (
|
||||
CONSTRAINT notifications_type_check CHECK ((type = ANY (ARRAY['new_scheduling'::text, 'new_patient'::text, 'recurrence_alert'::text, 'session_status'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.email_layout_config (
|
||||
CREATE TABLE public.twilio_subaccount_usage (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
header_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb NOT NULL,
|
||||
footer_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb NOT NULL,
|
||||
channel_id uuid NOT NULL,
|
||||
twilio_subaccount_sid text NOT NULL,
|
||||
period_start date NOT NULL,
|
||||
period_end date NOT NULL,
|
||||
messages_sent integer DEFAULT 0 NOT NULL,
|
||||
messages_delivered integer DEFAULT 0 NOT NULL,
|
||||
messages_failed integer DEFAULT 0 NOT NULL,
|
||||
cost_usd numeric(12,6) DEFAULT 0 NOT NULL,
|
||||
cost_brl numeric(12,4) DEFAULT 0 NOT NULL,
|
||||
revenue_brl numeric(12,4) DEFAULT 0 NOT NULL,
|
||||
margin_brl numeric(12,4) GENERATED ALWAYS AS ((revenue_brl - cost_brl)) STORED,
|
||||
usd_brl_rate numeric(8,4) DEFAULT 0,
|
||||
synced_at timestamp with time zone DEFAULT now(),
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
CONSTRAINT twilio_subaccount_usage_period_check CHECK ((period_end >= period_start))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.email_layout_config OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: email_templates_global; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.email_templates_global (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
key text NOT NULL,
|
||||
domain text NOT NULL,
|
||||
channel text DEFAULT 'email'::text NOT NULL,
|
||||
subject text NOT NULL,
|
||||
body_html text NOT NULL,
|
||||
body_text text,
|
||||
version integer DEFAULT 1 NOT NULL,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
variables jsonb,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.email_templates_global OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: email_templates_tenant; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.email_templates_tenant (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid,
|
||||
template_key text NOT NULL,
|
||||
subject text,
|
||||
body_html text,
|
||||
body_text text,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
synced_version integer,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
-- Tables: Documentos
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.229Z
|
||||
-- Total: 6
|
||||
|
||||
CREATE TABLE public.document_access_logs (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
documento_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
acao text NOT NULL,
|
||||
user_id uuid,
|
||||
ip inet,
|
||||
user_agent text,
|
||||
acessado_em timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT dal_acao_check CHECK ((acao = ANY (ARRAY['visualizou'::text, 'baixou'::text, 'imprimiu'::text, 'compartilhou'::text, 'assinou'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.document_generated (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
template_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
dados_preenchidos jsonb DEFAULT '{}'::jsonb NOT NULL,
|
||||
pdf_path text NOT NULL,
|
||||
storage_bucket text DEFAULT 'generated-docs'::text NOT NULL,
|
||||
documento_id uuid,
|
||||
gerado_por uuid NOT NULL,
|
||||
gerado_em timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.document_share_links (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
documento_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
token text DEFAULT encode(extensions.gen_random_bytes(32), 'hex'::text) NOT NULL,
|
||||
expira_em timestamp with time zone NOT NULL,
|
||||
usos_max smallint DEFAULT 5 NOT NULL,
|
||||
usos smallint DEFAULT 0 NOT NULL,
|
||||
criado_por uuid NOT NULL,
|
||||
criado_em timestamp with time zone DEFAULT now(),
|
||||
ativo boolean DEFAULT true NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.document_signatures (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
documento_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
signatario_tipo text NOT NULL,
|
||||
signatario_id uuid,
|
||||
signatario_nome text,
|
||||
signatario_email text,
|
||||
ordem smallint DEFAULT 1 NOT NULL,
|
||||
status text DEFAULT 'pendente'::text NOT NULL,
|
||||
ip inet,
|
||||
user_agent text,
|
||||
assinado_em timestamp with time zone,
|
||||
hash_documento text,
|
||||
criado_em timestamp with time zone DEFAULT now(),
|
||||
atualizado_em timestamp with time zone DEFAULT now(),
|
||||
CONSTRAINT ds_signatario_tipo_check CHECK ((signatario_tipo = ANY (ARRAY['paciente'::text, 'responsavel_legal'::text, 'terapeuta'::text]))),
|
||||
CONSTRAINT ds_status_check CHECK ((status = ANY (ARRAY['pendente'::text, 'enviado'::text, 'assinado'::text, 'recusado'::text, 'expirado'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.document_templates (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid,
|
||||
owner_id uuid,
|
||||
nome_template text NOT NULL,
|
||||
tipo text DEFAULT 'outro'::text NOT NULL,
|
||||
descricao text,
|
||||
corpo_html text DEFAULT ''::text NOT NULL,
|
||||
cabecalho_html text,
|
||||
rodape_html text,
|
||||
variaveis text[] DEFAULT '{}'::text[],
|
||||
logo_url text,
|
||||
is_global boolean DEFAULT false NOT NULL,
|
||||
ativo boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now(),
|
||||
CONSTRAINT dt_tipo_check CHECK ((tipo = ANY (ARRAY['declaracao_comparecimento'::text, 'atestado_psicologico'::text, 'relatorio_acompanhamento'::text, 'recibo_pagamento'::text, 'termo_consentimento'::text, 'encaminhamento'::text, 'contrato_servicos'::text, 'tcle'::text, 'autorizacao_menor'::text, 'laudo_psicologico'::text, 'parecer_psicologico'::text, 'termo_sigilo'::text, 'declaracao_inicio_tratamento'::text, 'termo_alta'::text, 'tcle_online'::text, 'outro'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.documents (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
bucket_path text NOT NULL,
|
||||
storage_bucket text DEFAULT 'documents'::text NOT NULL,
|
||||
nome_original text NOT NULL,
|
||||
mime_type text,
|
||||
tamanho_bytes bigint,
|
||||
tipo_documento text DEFAULT 'outro'::text NOT NULL,
|
||||
categoria text,
|
||||
descricao text,
|
||||
tags text[] DEFAULT '{}'::text[],
|
||||
agenda_evento_id uuid,
|
||||
session_note_id uuid,
|
||||
visibilidade text DEFAULT 'privado'::text NOT NULL,
|
||||
compartilhado_portal boolean DEFAULT false NOT NULL,
|
||||
compartilhado_supervisor boolean DEFAULT false NOT NULL,
|
||||
compartilhado_em timestamp with time zone,
|
||||
expira_compartilhamento timestamp with time zone,
|
||||
enviado_pelo_paciente boolean DEFAULT false NOT NULL,
|
||||
status_revisao text DEFAULT 'aprovado'::text,
|
||||
revisado_por uuid,
|
||||
revisado_em timestamp with time zone,
|
||||
uploaded_by uuid NOT NULL,
|
||||
uploaded_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
deleted_at timestamp with time zone,
|
||||
deleted_by uuid,
|
||||
retencao_ate timestamp with time zone,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now(),
|
||||
CONSTRAINT documents_status_revisao_check CHECK ((status_revisao = ANY (ARRAY['pendente'::text, 'aprovado'::text, 'rejeitado'::text]))),
|
||||
CONSTRAINT documents_tipo_check CHECK ((tipo_documento = ANY (ARRAY['laudo'::text, 'receita'::text, 'exame'::text, 'termo_assinado'::text, 'relatorio_externo'::text, 'identidade'::text, 'convenio'::text, 'declaracao'::text, 'atestado'::text, 'recibo'::text, 'outro'::text]))),
|
||||
CONSTRAINT documents_visibilidade_check CHECK ((visibilidade = ANY (ARRAY['privado'::text, 'compartilhado_supervisor'::text, 'compartilhado_portal'::text])))
|
||||
);
|
||||
@@ -0,0 +1,18 @@
|
||||
-- Tables: Estrutura / Calendário
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.230Z
|
||||
-- Total: 1
|
||||
|
||||
CREATE TABLE public.feriados (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid,
|
||||
owner_id uuid,
|
||||
tipo text DEFAULT 'municipal'::text NOT NULL,
|
||||
nome text NOT NULL,
|
||||
data date NOT NULL,
|
||||
cidade text,
|
||||
estado text,
|
||||
observacao text,
|
||||
bloqueia_sessoes boolean DEFAULT false NOT NULL,
|
||||
criado_em timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT feriados_tipo_check CHECK ((tipo = ANY (ARRAY['municipal'::text, 'personalizado'::text])))
|
||||
);
|
||||
+88
-87
@@ -1,10 +1,6 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Financeiro
|
||||
-- =============================================================================
|
||||
-- financial_records, financial_categories, financial_exceptions,
|
||||
-- payment_settings, professional_pricing, therapist_payouts,
|
||||
-- therapist_payout_records, services, insurance_plans, insurance_plan_services
|
||||
-- =============================================================================
|
||||
-- Tables: Financeiro
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.228Z
|
||||
-- Total: 10
|
||||
|
||||
CREATE TABLE public.financial_records (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -44,7 +40,27 @@ CREATE TABLE public.financial_records (
|
||||
CONSTRAINT financial_records_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'partial'::text, 'overdue'::text, 'cancelled'::text, 'refunded'::text])))
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE public.therapist_payouts (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
period_start date NOT NULL,
|
||||
period_end date NOT NULL,
|
||||
total_sessions integer DEFAULT 0 NOT NULL,
|
||||
gross_amount numeric(10,2) DEFAULT 0 NOT NULL,
|
||||
clinic_fee_total numeric(10,2) DEFAULT 0 NOT NULL,
|
||||
net_amount numeric(10,2) DEFAULT 0 NOT NULL,
|
||||
status text DEFAULT 'pending'::text NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT therapist_payouts_clinic_fee_total_check CHECK ((clinic_fee_total >= (0)::numeric)),
|
||||
CONSTRAINT therapist_payouts_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
|
||||
CONSTRAINT therapist_payouts_net_amount_check CHECK ((net_amount >= (0)::numeric)),
|
||||
CONSTRAINT therapist_payouts_period_chk CHECK ((period_end >= period_start)),
|
||||
CONSTRAINT therapist_payouts_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'cancelled'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.financial_categories (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -57,13 +73,6 @@ CREATE TABLE public.financial_categories (
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.financial_categories OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: financial_exceptions; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.financial_exceptions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid,
|
||||
@@ -79,8 +88,6 @@ CREATE TABLE public.financial_exceptions (
|
||||
CONSTRAINT financial_exceptions_type_chk CHECK ((exception_type = ANY (ARRAY['patient_no_show'::text, 'patient_cancellation'::text, 'professional_cancellation'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.payment_settings (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -106,8 +113,6 @@ CREATE TABLE public.payment_settings (
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.professional_pricing (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -119,81 +124,77 @@ CREATE TABLE public.professional_pricing (
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.therapist_payouts (
|
||||
CREATE TABLE public.recurrence_exceptions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
recurrence_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
period_start date NOT NULL,
|
||||
period_end date NOT NULL,
|
||||
total_sessions integer DEFAULT 0 NOT NULL,
|
||||
gross_amount numeric(10,2) DEFAULT 0 NOT NULL,
|
||||
clinic_fee_total numeric(10,2) DEFAULT 0 NOT NULL,
|
||||
net_amount numeric(10,2) DEFAULT 0 NOT NULL,
|
||||
status text DEFAULT 'pending'::text NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT therapist_payouts_clinic_fee_total_check CHECK ((clinic_fee_total >= (0)::numeric)),
|
||||
CONSTRAINT therapist_payouts_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
|
||||
CONSTRAINT therapist_payouts_net_amount_check CHECK ((net_amount >= (0)::numeric)),
|
||||
CONSTRAINT therapist_payouts_period_chk CHECK ((period_end >= period_start)),
|
||||
CONSTRAINT therapist_payouts_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'cancelled'::text])))
|
||||
original_date date NOT NULL,
|
||||
type public.recurrence_exception_type NOT NULL,
|
||||
new_date date,
|
||||
new_start_time time without time zone,
|
||||
new_end_time time without time zone,
|
||||
modalidade text,
|
||||
observacoes text,
|
||||
titulo_custom text,
|
||||
extra_fields jsonb,
|
||||
reason text,
|
||||
agenda_evento_id uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.recurrence_rule_services (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
rule_id uuid NOT NULL,
|
||||
service_id uuid NOT NULL,
|
||||
quantity integer DEFAULT 1 NOT NULL,
|
||||
unit_price numeric(10,2) NOT NULL,
|
||||
discount_pct numeric(5,2) DEFAULT 0,
|
||||
discount_flat numeric(10,2) DEFAULT 0,
|
||||
final_price numeric(10,2) NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
CONSTRAINT recurrence_rule_services_disc_flat_chk CHECK ((discount_flat >= (0)::numeric)),
|
||||
CONSTRAINT recurrence_rule_services_disc_pct_chk CHECK (((discount_pct >= (0)::numeric) AND (discount_pct <= (100)::numeric))),
|
||||
CONSTRAINT recurrence_rule_services_final_price_chk CHECK ((final_price >= (0)::numeric)),
|
||||
CONSTRAINT recurrence_rule_services_quantity_chk CHECK ((quantity > 0))
|
||||
);
|
||||
|
||||
CREATE TABLE public.recurrence_rules (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
therapist_id uuid,
|
||||
patient_id uuid,
|
||||
determined_commitment_id uuid,
|
||||
type public.recurrence_type DEFAULT 'weekly'::public.recurrence_type NOT NULL,
|
||||
"interval" smallint DEFAULT 1 NOT NULL,
|
||||
weekdays smallint[] DEFAULT '{}'::smallint[] NOT NULL,
|
||||
start_time time without time zone NOT NULL,
|
||||
end_time time without time zone NOT NULL,
|
||||
timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL,
|
||||
duration_min smallint DEFAULT 50 NOT NULL,
|
||||
start_date date NOT NULL,
|
||||
end_date date,
|
||||
max_occurrences integer,
|
||||
open_ended boolean DEFAULT true NOT NULL,
|
||||
modalidade text DEFAULT 'presencial'::text,
|
||||
titulo_custom text,
|
||||
observacoes text,
|
||||
extra_fields jsonb,
|
||||
status text DEFAULT 'ativo'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
price numeric(10,2),
|
||||
insurance_plan_id uuid,
|
||||
insurance_guide_number text,
|
||||
insurance_value numeric(10,2),
|
||||
insurance_plan_service_id uuid,
|
||||
CONSTRAINT recurrence_rules_dates_chk CHECK (((end_date IS NULL) OR (end_date >= start_date))),
|
||||
CONSTRAINT recurrence_rules_interval_chk CHECK (("interval" >= 1)),
|
||||
CONSTRAINT recurrence_rules_status_check CHECK ((status = ANY (ARRAY['ativo'::text, 'pausado'::text, 'cancelado'::text]))),
|
||||
CONSTRAINT recurrence_rules_times_chk CHECK ((end_time > start_time))
|
||||
);
|
||||
|
||||
CREATE TABLE public.therapist_payout_records (
|
||||
payout_id uuid NOT NULL,
|
||||
financial_record_id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.services (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
name text NOT NULL,
|
||||
description text,
|
||||
price numeric(10,2) NOT NULL,
|
||||
duration_min integer,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.insurance_plan_services (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
insurance_plan_id uuid NOT NULL,
|
||||
name text NOT NULL,
|
||||
value numeric(10,2) NOT NULL,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.insurance_plan_services OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: insurance_plans; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.insurance_plans (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
name text NOT NULL,
|
||||
notes text,
|
||||
default_value numeric(10,2),
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
@@ -1,500 +0,0 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Infraestrutura (realtime, storage, supabase_functions)
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE _realtime.extensions (
|
||||
id uuid NOT NULL,
|
||||
type text,
|
||||
settings jsonb,
|
||||
tenant_external_id text,
|
||||
inserted_at timestamp(0) without time zone NOT NULL,
|
||||
updated_at timestamp(0) without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE _realtime.extensions OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: schema_migrations; Type: TABLE; Schema: _realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE _realtime.schema_migrations (
|
||||
version bigint NOT NULL,
|
||||
inserted_at timestamp(0) without time zone
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE _realtime.schema_migrations OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: tenants; Type: TABLE; Schema: _realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE _realtime.tenants (
|
||||
id uuid NOT NULL,
|
||||
name text,
|
||||
external_id text,
|
||||
jwt_secret text,
|
||||
max_concurrent_users integer DEFAULT 200 NOT NULL,
|
||||
inserted_at timestamp(0) without time zone NOT NULL,
|
||||
updated_at timestamp(0) without time zone NOT NULL,
|
||||
max_events_per_second integer DEFAULT 100 NOT NULL,
|
||||
postgres_cdc_default text DEFAULT 'postgres_cdc_rls'::text,
|
||||
max_bytes_per_second integer DEFAULT 100000 NOT NULL,
|
||||
max_channels_per_client integer DEFAULT 100 NOT NULL,
|
||||
max_joins_per_second integer DEFAULT 500 NOT NULL,
|
||||
suspend boolean DEFAULT false,
|
||||
jwt_jwks jsonb,
|
||||
notify_private_alpha boolean DEFAULT false,
|
||||
private_only boolean DEFAULT false NOT NULL,
|
||||
migrations_ran integer DEFAULT 0,
|
||||
broadcast_adapter character varying(255) DEFAULT 'gen_rpc'::character varying,
|
||||
max_presence_events_per_second integer DEFAULT 1000,
|
||||
max_payload_size_in_kb integer DEFAULT 3000,
|
||||
CONSTRAINT jwt_secret_or_jwt_jwks_required CHECK (((jwt_secret IS NOT NULL) OR (jwt_jwks IS NOT NULL)))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE _realtime.tenants OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: audit_log_entries; Type: TABLE; Schema: auth; Owner: supabase_auth_admin
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE realtime.messages (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
)
|
||||
PARTITION BY RANGE (inserted_at);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages OWNER TO supabase_realtime_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_20; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.messages_2026_03_20 (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages_2026_03_20 OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_21; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.messages_2026_03_21 (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages_2026_03_21 OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_22; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.messages_2026_03_22 (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages_2026_03_22 OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_23; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.messages_2026_03_23 (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages_2026_03_23 OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_24; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.messages_2026_03_24 (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages_2026_03_24 OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_25; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.messages_2026_03_25 (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages_2026_03_25 OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_26; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.messages_2026_03_26 (
|
||||
topic text NOT NULL,
|
||||
extension text NOT NULL,
|
||||
payload jsonb,
|
||||
event text,
|
||||
private boolean DEFAULT false,
|
||||
updated_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
inserted_at timestamp without time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.messages_2026_03_26 OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: schema_migrations; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.schema_migrations (
|
||||
version bigint NOT NULL,
|
||||
inserted_at timestamp(0) without time zone
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.schema_migrations OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: subscription; Type: TABLE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE realtime.subscription (
|
||||
id bigint NOT NULL,
|
||||
subscription_id uuid NOT NULL,
|
||||
entity regclass NOT NULL,
|
||||
filters realtime.user_defined_filter[] DEFAULT '{}'::realtime.user_defined_filter[] NOT NULL,
|
||||
claims jsonb NOT NULL,
|
||||
claims_role regrole GENERATED ALWAYS AS (realtime.to_regrole((claims ->> 'role'::text))) STORED NOT NULL,
|
||||
created_at timestamp without time zone DEFAULT timezone('utc'::text, now()) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE realtime.subscription OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: subscription_id_seq; Type: SEQUENCE; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
|
||||
ALTER TABLE realtime.subscription ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
||||
SEQUENCE NAME realtime.subscription_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: buckets; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE storage.buckets (
|
||||
id text NOT NULL,
|
||||
name text NOT NULL,
|
||||
owner uuid,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now(),
|
||||
public boolean DEFAULT false,
|
||||
avif_autodetection boolean DEFAULT false,
|
||||
file_size_limit bigint,
|
||||
allowed_mime_types text[],
|
||||
owner_id text,
|
||||
type storage.buckettype DEFAULT 'STANDARD'::storage.buckettype NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.buckets OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: COLUMN buckets.owner; Type: COMMENT; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN storage.buckets.owner IS 'Field is deprecated, use owner_id instead';
|
||||
|
||||
|
||||
--
|
||||
-- Name: buckets_analytics; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.buckets_analytics (
|
||||
name text NOT NULL,
|
||||
type storage.buckettype DEFAULT 'ANALYTICS'::storage.buckettype NOT NULL,
|
||||
format text DEFAULT 'ICEBERG'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
deleted_at timestamp with time zone
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.buckets_analytics OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: buckets_vectors; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.buckets_vectors (
|
||||
id text NOT NULL,
|
||||
type storage.buckettype DEFAULT 'VECTOR'::storage.buckettype NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.buckets_vectors OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: iceberg_namespaces; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.iceberg_namespaces (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
bucket_name text NOT NULL,
|
||||
name text NOT NULL COLLATE pg_catalog."C",
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
|
||||
catalog_id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.iceberg_namespaces OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: iceberg_tables; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.iceberg_tables (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
namespace_id uuid NOT NULL,
|
||||
bucket_name text NOT NULL,
|
||||
name text NOT NULL COLLATE pg_catalog."C",
|
||||
location text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
remote_table_id text,
|
||||
shard_key text,
|
||||
shard_id text,
|
||||
catalog_id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.iceberg_tables OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: migrations; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.migrations (
|
||||
id integer NOT NULL,
|
||||
name character varying(100) NOT NULL,
|
||||
hash character varying(40) NOT NULL,
|
||||
executed_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.migrations OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: objects; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.objects (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
bucket_id text,
|
||||
name text,
|
||||
owner uuid,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now(),
|
||||
last_accessed_at timestamp with time zone DEFAULT now(),
|
||||
metadata jsonb,
|
||||
path_tokens text[] GENERATED ALWAYS AS (string_to_array(name, '/'::text)) STORED,
|
||||
version text,
|
||||
owner_id text,
|
||||
user_metadata jsonb
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.objects OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: COLUMN objects.owner; Type: COMMENT; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN storage.objects.owner IS 'Field is deprecated, use owner_id instead';
|
||||
|
||||
|
||||
--
|
||||
-- Name: s3_multipart_uploads; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.s3_multipart_uploads (
|
||||
id text NOT NULL,
|
||||
in_progress_size bigint DEFAULT 0 NOT NULL,
|
||||
upload_signature text NOT NULL,
|
||||
bucket_id text NOT NULL,
|
||||
key text NOT NULL COLLATE pg_catalog."C",
|
||||
version text NOT NULL,
|
||||
owner_id text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
user_metadata jsonb
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.s3_multipart_uploads OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: s3_multipart_uploads_parts; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.s3_multipart_uploads_parts (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
upload_id text NOT NULL,
|
||||
size bigint DEFAULT 0 NOT NULL,
|
||||
part_number integer NOT NULL,
|
||||
bucket_id text NOT NULL,
|
||||
key text NOT NULL COLLATE pg_catalog."C",
|
||||
etag text NOT NULL,
|
||||
owner_id text,
|
||||
version text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE storage.s3_multipart_uploads_parts OWNER TO supabase_storage_admin;
|
||||
|
||||
--
|
||||
-- Name: vector_indexes; Type: TABLE; Schema: storage; Owner: supabase_storage_admin
|
||||
--
|
||||
|
||||
CREATE TABLE storage.vector_indexes (
|
||||
id text DEFAULT gen_random_uuid() NOT NULL,
|
||||
name text NOT NULL COLLATE pg_catalog."C",
|
||||
bucket_id text NOT NULL,
|
||||
data_type text NOT NULL,
|
||||
dimension integer NOT NULL,
|
||||
distance_metric text NOT NULL,
|
||||
metadata_configuration jsonb,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE supabase_functions.hooks (
|
||||
id bigint NOT NULL,
|
||||
hook_table_id integer NOT NULL,
|
||||
hook_name text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
request_id bigint
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE supabase_functions.hooks OWNER TO supabase_functions_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE hooks; Type: COMMENT; Schema: supabase_functions; Owner: supabase_functions_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE supabase_functions.hooks IS 'Supabase Functions Hooks: Audit trail for triggered hooks.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: hooks_id_seq; Type: SEQUENCE; Schema: supabase_functions; Owner: supabase_functions_admin
|
||||
--
|
||||
|
||||
CREATE SEQUENCE supabase_functions.hooks_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE supabase_functions.hooks_id_seq OWNER TO supabase_functions_admin;
|
||||
|
||||
--
|
||||
-- Name: hooks_id_seq; Type: SEQUENCE OWNED BY; Schema: supabase_functions; Owner: supabase_functions_admin
|
||||
--
|
||||
|
||||
ALTER SEQUENCE supabase_functions.hooks_id_seq OWNED BY supabase_functions.hooks.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: migrations; Type: TABLE; Schema: supabase_functions; Owner: supabase_functions_admin
|
||||
--
|
||||
|
||||
CREATE TABLE supabase_functions.migrations (
|
||||
version text NOT NULL,
|
||||
inserted_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE supabase_functions.migrations OWNER TO supabase_functions_admin;
|
||||
|
||||
--
|
||||
-- Name: messages_2026_03_20; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin
|
||||
--
|
||||
@@ -0,0 +1,11 @@
|
||||
-- Tables: outros
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.228Z
|
||||
-- Total: 1
|
||||
|
||||
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
|
||||
);
|
||||
+199
-133
@@ -1,10 +1,177 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Pacientes
|
||||
-- =============================================================================
|
||||
-- patients, patient_groups, patient_group_patient, patient_tags,
|
||||
-- patient_patient_tag, patient_intake_requests, patient_invites,
|
||||
-- patient_discounts
|
||||
-- =============================================================================
|
||||
-- Tables: Pacientes
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.230Z
|
||||
-- Total: 12
|
||||
|
||||
CREATE TABLE public.patient_contacts (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
nome text NOT NULL,
|
||||
tipo text NOT NULL,
|
||||
relacao text,
|
||||
telefone text,
|
||||
email text,
|
||||
cpf text,
|
||||
especialidade text,
|
||||
registro_profissional text,
|
||||
is_primario boolean DEFAULT false NOT NULL,
|
||||
ativo 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 patient_contacts_tipo_check CHECK ((tipo = ANY (ARRAY['emergencia'::text, 'responsavel_legal'::text, 'profissional_saude'::text, 'outro'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_discounts (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
discount_pct numeric(5,2) DEFAULT 0,
|
||||
discount_flat numeric(10,2) DEFAULT 0,
|
||||
reason text,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
active_from timestamp with time zone DEFAULT now(),
|
||||
active_to timestamp with time zone,
|
||||
created_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_group_patient (
|
||||
patient_group_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_groups (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
nome text NOT NULL,
|
||||
descricao text,
|
||||
cor text,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
is_system boolean DEFAULT false NOT NULL,
|
||||
owner_id uuid DEFAULT auth.uid() NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
therapist_id uuid,
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_intake_requests (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
token text NOT NULL,
|
||||
consent boolean DEFAULT false NOT NULL,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
converted_patient_id uuid,
|
||||
rejected_reason text,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
cpf text,
|
||||
rg text,
|
||||
cep text,
|
||||
nome_completo text,
|
||||
email_principal text,
|
||||
telefone text,
|
||||
pais text,
|
||||
cidade text,
|
||||
estado text,
|
||||
endereco text,
|
||||
numero text,
|
||||
bairro text,
|
||||
complemento text,
|
||||
data_nascimento date,
|
||||
naturalidade text,
|
||||
genero text,
|
||||
estado_civil text,
|
||||
onde_nos_conheceu text,
|
||||
encaminhado_por text,
|
||||
observacoes text,
|
||||
notas_internas text,
|
||||
email_alternativo text,
|
||||
telefone_alternativo text,
|
||||
profissao text,
|
||||
escolaridade text,
|
||||
nacionalidade text,
|
||||
avatar_url text,
|
||||
tenant_id uuid,
|
||||
CONSTRAINT chk_intakes_status CHECK ((status = ANY (ARRAY['new'::text, 'converted'::text, 'rejected'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_invites (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
token text NOT NULL,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
expires_at timestamp with time zone,
|
||||
max_uses integer,
|
||||
uses integer DEFAULT 0 NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
tenant_id uuid
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_patient_tag (
|
||||
owner_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
tag_id uuid NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_status_history (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
status_anterior text,
|
||||
status_novo text NOT NULL,
|
||||
motivo text,
|
||||
encaminhado_para text,
|
||||
data_saida date,
|
||||
alterado_por uuid,
|
||||
alterado_em timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT psh_status_novo_check CHECK ((status_novo = ANY (ARRAY['Ativo'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_support_contacts (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
nome text,
|
||||
relacao text,
|
||||
tipo text,
|
||||
telefone text,
|
||||
email text,
|
||||
is_primario boolean DEFAULT false NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_tags (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
nome text NOT NULL,
|
||||
cor text,
|
||||
is_padrao boolean DEFAULT false NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone,
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.patient_timeline (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
evento_tipo text NOT NULL,
|
||||
titulo text NOT NULL,
|
||||
descricao text,
|
||||
icone_cor text DEFAULT 'gray'::text,
|
||||
link_ref_tipo text,
|
||||
link_ref_id uuid,
|
||||
gerado_por uuid,
|
||||
ocorrido_em timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT pt_evento_tipo_check CHECK ((evento_tipo = ANY (ARRAY['primeira_sessao'::text, 'sessao_realizada'::text, 'sessao_cancelada'::text, 'falta'::text, 'status_alterado'::text, 'risco_sinalizado'::text, 'risco_removido'::text, 'documento_assinado'::text, 'documento_adicionado'::text, 'escala_respondida'::text, 'escala_enviada'::text, 'pagamento_vencido'::text, 'pagamento_recebido'::text, 'tarefa_combinada'::text, 'contato_adicionado'::text, 'prontuario_editado'::text, 'nota_adicionada'::text, 'manual'::text]))),
|
||||
CONSTRAINT pt_icone_cor_check CHECK ((icone_cor = ANY (ARRAY['green'::text, 'blue'::text, 'amber'::text, 'red'::text, 'gray'::text, 'purple'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.patients (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -54,132 +221,31 @@ CREATE TABLE public.patients (
|
||||
user_id uuid,
|
||||
patient_scope text DEFAULT 'clinic'::text NOT NULL,
|
||||
therapist_member_id uuid,
|
||||
nome_social text,
|
||||
pronomes text,
|
||||
etnia text,
|
||||
religiao text,
|
||||
faixa_renda text,
|
||||
canal_preferido text DEFAULT 'whatsapp'::text,
|
||||
horario_contato_inicio time without time zone DEFAULT '08:00:00'::time without time zone,
|
||||
horario_contato_fim time without time zone DEFAULT '20:00:00'::time without time zone,
|
||||
idioma text DEFAULT 'pt-BR'::text,
|
||||
origem text,
|
||||
metodo_pagamento_preferido text,
|
||||
motivo_saida text,
|
||||
data_saida date,
|
||||
encaminhado_para text,
|
||||
risco_elevado boolean DEFAULT false NOT NULL,
|
||||
risco_nota text,
|
||||
risco_sinalizado_em timestamp with time zone,
|
||||
risco_sinalizado_por uuid,
|
||||
horario_contato text,
|
||||
convenio text,
|
||||
convenio_id uuid,
|
||||
CONSTRAINT cpf_responsavel_format_check CHECK (((cpf_responsavel IS NULL) OR (cpf_responsavel ~ '^\d{11}$'::text))),
|
||||
CONSTRAINT patients_cpf_format_check CHECK (((cpf IS NULL) OR (cpf ~ '^\d{11}$'::text))),
|
||||
CONSTRAINT patients_patient_scope_check CHECK ((patient_scope = ANY (ARRAY['clinic'::text, 'therapist'::text]))),
|
||||
CONSTRAINT patients_status_check CHECK ((status = ANY (ARRAY['Ativo'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text]))),
|
||||
CONSTRAINT patients_therapist_scope_consistency CHECK ((((patient_scope = 'clinic'::text) AND (therapist_member_id IS NULL)) OR ((patient_scope = 'therapist'::text) AND (therapist_member_id IS NOT NULL))))
|
||||
CONSTRAINT patients_faixa_renda_check CHECK (((faixa_renda IS NULL) OR (faixa_renda = ANY (ARRAY['ate_1sm'::text, '1_3sm'::text, '3_6sm'::text, '6_10sm'::text, 'acima_10sm'::text, 'nao_informado'::text])))),
|
||||
CONSTRAINT patients_metodo_pagamento_check CHECK (((metodo_pagamento_preferido IS NULL) OR (metodo_pagamento_preferido = ANY (ARRAY['pix'::text, 'cartao'::text, 'dinheiro'::text, 'deposito'::text, 'convenio'::text])))),
|
||||
CONSTRAINT patients_risco_consistency_check CHECK (((risco_elevado = false) OR ((risco_elevado = true) AND (risco_nota IS NOT NULL) AND (risco_sinalizado_por IS NOT NULL)))),
|
||||
CONSTRAINT patients_status_check CHECK ((status = ANY (ARRAY['Ativo'::text, 'Em espera'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.patient_groups (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
nome text NOT NULL,
|
||||
descricao text,
|
||||
cor text,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
is_system boolean DEFAULT false NOT NULL,
|
||||
owner_id uuid DEFAULT auth.uid() NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
therapist_id uuid,
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.patient_group_patient (
|
||||
patient_group_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.patient_tags (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
nome text NOT NULL,
|
||||
cor text,
|
||||
is_padrao boolean DEFAULT false NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone,
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.patient_patient_tag (
|
||||
owner_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
tag_id uuid NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
tenant_id uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.patient_intake_requests (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
token text NOT NULL,
|
||||
consent boolean DEFAULT false NOT NULL,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
converted_patient_id uuid,
|
||||
rejected_reason text,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
cpf text,
|
||||
rg text,
|
||||
cep text,
|
||||
nome_completo text,
|
||||
email_principal text,
|
||||
telefone text,
|
||||
pais text,
|
||||
cidade text,
|
||||
estado text,
|
||||
endereco text,
|
||||
numero text,
|
||||
bairro text,
|
||||
complemento text,
|
||||
data_nascimento date,
|
||||
naturalidade text,
|
||||
genero text,
|
||||
estado_civil text,
|
||||
onde_nos_conheceu text,
|
||||
encaminhado_por text,
|
||||
observacoes text,
|
||||
notas_internas text,
|
||||
email_alternativo text,
|
||||
telefone_alternativo text,
|
||||
profissao text,
|
||||
escolaridade text,
|
||||
nacionalidade text,
|
||||
avatar_url text,
|
||||
tenant_id uuid,
|
||||
CONSTRAINT chk_intakes_status CHECK ((status = ANY (ARRAY['new'::text, 'converted'::text, 'rejected'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.patient_invites (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
token text NOT NULL,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
expires_at timestamp with time zone,
|
||||
max_uses integer,
|
||||
uses integer DEFAULT 0 NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
tenant_id uuid
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.patient_discounts (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
patient_id uuid NOT NULL,
|
||||
discount_pct numeric(5,2) DEFAULT 0,
|
||||
discount_flat numeric(10,2) DEFAULT 0,
|
||||
reason text,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
active_from timestamp with time zone DEFAULT now(),
|
||||
active_to timestamp with time zone,
|
||||
created_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
@@ -1,204 +0,0 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — SaaS Admin, FAQ, Docs, UI
|
||||
-- =============================================================================
|
||||
-- saas_docs, saas_doc_votos, saas_faq, saas_faq_itens,
|
||||
-- feriados, global_notices, login_carousel_slides, notice_dismissals,
|
||||
-- support_sessions
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE public.saas_doc_votos (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
doc_id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
util boolean NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.saas_doc_votos OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: saas_docs; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.saas_docs (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
titulo text NOT NULL,
|
||||
conteudo text DEFAULT ''::text NOT NULL,
|
||||
medias jsonb DEFAULT '[]'::jsonb NOT NULL,
|
||||
tipo_acesso text DEFAULT 'usuario'::text NOT NULL,
|
||||
pagina_path text NOT NULL,
|
||||
docs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL,
|
||||
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,
|
||||
categoria text,
|
||||
exibir_no_faq boolean DEFAULT false NOT NULL,
|
||||
votos_util integer DEFAULT 0 NOT NULL,
|
||||
votos_nao_util integer DEFAULT 0 NOT NULL,
|
||||
CONSTRAINT saas_docs_tipo_acesso_check CHECK ((tipo_acesso = ANY (ARRAY['admin'::text, 'usuario'::text])))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.saas_docs OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: COLUMN saas_docs.categoria; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN public.saas_docs.categoria IS 'Agrupa docs no portal FAQ (ex: Conta, Agenda, Pagamentos)';
|
||||
|
||||
|
||||
--
|
||||
-- Name: COLUMN saas_docs.exibir_no_faq; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN public.saas_docs.exibir_no_faq IS 'Se true, a doc e seus itens FAQ aparecem no portal de FAQ';
|
||||
|
||||
|
||||
--
|
||||
-- Name: saas_faq; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.saas_faq (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
pergunta text NOT NULL,
|
||||
categoria text,
|
||||
publico boolean DEFAULT false NOT NULL,
|
||||
votos integer DEFAULT 0 NOT NULL,
|
||||
titulo text,
|
||||
conteudo text,
|
||||
tipo_acesso text DEFAULT 'usuario'::text NOT NULL,
|
||||
pagina_path text NOT NULL,
|
||||
pagina_label text,
|
||||
medias jsonb DEFAULT '[]'::jsonb NOT NULL,
|
||||
faqs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL,
|
||||
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
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.saas_faq OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: saas_faq_itens; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.saas_faq_itens (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
doc_id uuid NOT NULL,
|
||||
pergunta text NOT NULL,
|
||||
resposta text,
|
||||
ordem integer DEFAULT 0 NOT NULL,
|
||||
ativo 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
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.saas_faq_itens OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE saas_faq_itens; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE public.saas_faq_itens IS 'Pares pergunta/resposta vinculados a um documento de ajuda';
|
||||
|
||||
|
||||
--
|
||||
-- Name: services; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE public.feriados (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid,
|
||||
owner_id uuid,
|
||||
tipo text DEFAULT 'municipal'::text NOT NULL,
|
||||
nome text NOT NULL,
|
||||
data date NOT NULL,
|
||||
cidade text,
|
||||
estado text,
|
||||
observacao text,
|
||||
bloqueia_sessoes boolean DEFAULT false NOT NULL,
|
||||
criado_em timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT feriados_tipo_check CHECK ((tipo = ANY (ARRAY['municipal'::text, 'personalizado'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.global_notices (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
title text,
|
||||
message text DEFAULT ''::text NOT NULL,
|
||||
variant text DEFAULT 'info'::text NOT NULL,
|
||||
roles text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
contexts text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
starts_at timestamp with time zone,
|
||||
ends_at timestamp with time zone,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
priority integer DEFAULT 0 NOT NULL,
|
||||
dismissible boolean DEFAULT true NOT NULL,
|
||||
persist_dismiss boolean DEFAULT true NOT NULL,
|
||||
dismiss_scope text DEFAULT 'device'::text NOT NULL,
|
||||
show_once boolean DEFAULT false NOT NULL,
|
||||
max_views integer,
|
||||
cooldown_minutes integer,
|
||||
version integer DEFAULT 1 NOT NULL,
|
||||
action_type text DEFAULT 'none'::text NOT NULL,
|
||||
action_label text,
|
||||
action_url text,
|
||||
action_route text,
|
||||
views_count integer DEFAULT 0 NOT NULL,
|
||||
clicks_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,
|
||||
created_by uuid,
|
||||
content_align text DEFAULT 'left'::text NOT NULL,
|
||||
link_target text DEFAULT '_blank'::text NOT NULL,
|
||||
CONSTRAINT global_notices_action_type_check CHECK ((action_type = ANY (ARRAY['none'::text, 'internal'::text, 'external'::text]))),
|
||||
CONSTRAINT global_notices_content_align_check CHECK ((content_align = ANY (ARRAY['left'::text, 'center'::text, 'right'::text, 'justify'::text]))),
|
||||
CONSTRAINT global_notices_dismiss_scope_check CHECK ((dismiss_scope = ANY (ARRAY['session'::text, 'device'::text, 'user'::text]))),
|
||||
CONSTRAINT global_notices_link_target_check CHECK ((link_target = ANY (ARRAY['_blank'::text, '_self'::text, '_parent'::text, '_top'::text]))),
|
||||
CONSTRAINT global_notices_variant_check CHECK ((variant = ANY (ARRAY['info'::text, 'success'::text, 'warning'::text, 'error'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.login_carousel_slides (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
title text NOT NULL,
|
||||
body text NOT NULL,
|
||||
icon text DEFAULT 'pi-star'::text NOT NULL,
|
||||
ordem integer DEFAULT 0 NOT NULL,
|
||||
ativo boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.notice_dismissals (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
notice_id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
version integer DEFAULT 1 NOT NULL,
|
||||
dismissed_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.support_sessions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
admin_id uuid NOT NULL,
|
||||
token text DEFAULT encode(extensions.gen_random_bytes(32), 'hex'::text) NOT NULL,
|
||||
expires_at timestamp with time zone DEFAULT (now() + '01:00:00'::interval) NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
+166
-281
@@ -1,115 +1,6 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Plans, Billing, Subscriptions
|
||||
-- =============================================================================
|
||||
-- plans, plan_prices, plan_features, plan_public, plan_public_bullets,
|
||||
-- features, entitlements_invalidation, subscriptions, subscription_events,
|
||||
-- subscription_intents_personal, subscription_intents_tenant,
|
||||
-- subscription_intents_legacy, billing_contracts,
|
||||
-- addon_credits, addon_products, addon_transactions,
|
||||
-- modules, module_features, tenant_modules
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE public.plans (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
key text NOT NULL,
|
||||
name text NOT NULL,
|
||||
description text,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
price_cents integer DEFAULT 0 NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text NOT NULL,
|
||||
billing_interval text DEFAULT 'month'::text NOT NULL,
|
||||
target text,
|
||||
max_supervisees integer,
|
||||
CONSTRAINT plans_target_check CHECK ((target = ANY (ARRAY['patient'::text, 'therapist'::text, 'clinic'::text, 'supervisor'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.plan_prices (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text NOT NULL,
|
||||
"interval" text NOT NULL,
|
||||
amount_cents integer NOT NULL,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
active_from timestamp with time zone DEFAULT now() NOT NULL,
|
||||
active_to timestamp with time zone,
|
||||
source text DEFAULT 'manual'::text NOT NULL,
|
||||
provider text,
|
||||
provider_price_id text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT plan_prices_amount_cents_check CHECK ((amount_cents >= 0)),
|
||||
CONSTRAINT plan_prices_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.plan_features (
|
||||
plan_id uuid NOT NULL,
|
||||
feature_id uuid NOT NULL,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
limits jsonb,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.plan_public (
|
||||
plan_id uuid NOT NULL,
|
||||
public_name text DEFAULT ''::text NOT NULL,
|
||||
public_description text DEFAULT ''::text NOT NULL,
|
||||
badge text,
|
||||
is_featured boolean DEFAULT false NOT NULL,
|
||||
is_visible boolean DEFAULT true NOT NULL,
|
||||
sort_order 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.plan_public_bullets (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
text text NOT NULL,
|
||||
sort_order integer DEFAULT 0 NOT NULL,
|
||||
highlight boolean DEFAULT false NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.features (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
key text NOT NULL,
|
||||
description text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
descricao text DEFAULT ''::text NOT NULL,
|
||||
name text DEFAULT ''::text NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.features OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: COLUMN features.descricao; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON COLUMN public.features.descricao IS 'Descrição humana da feature (exibição no admin e documentação).';
|
||||
|
||||
|
||||
--
|
||||
-- Name: feriados; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE public.entitlements_invalidation (
|
||||
owner_id uuid NOT NULL,
|
||||
changed_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
-- Tables: SaaS / Planos
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.227Z
|
||||
-- Total: 18
|
||||
|
||||
CREATE TABLE public.subscriptions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -142,92 +33,6 @@ CREATE TABLE public.subscriptions (
|
||||
CONSTRAINT subscriptions_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'active'::text, 'past_due'::text, 'suspended'::text, 'cancelled'::text, 'expired'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.subscription_events (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
subscription_id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
event_type text NOT NULL,
|
||||
old_plan_id uuid,
|
||||
new_plan_id uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
created_by uuid,
|
||||
source text DEFAULT 'admin_ui'::text,
|
||||
reason text,
|
||||
metadata jsonb,
|
||||
owner_type text NOT NULL,
|
||||
owner_ref uuid NOT NULL,
|
||||
CONSTRAINT subscription_events_owner_ref_consistency_chk CHECK ((owner_id = owner_ref)),
|
||||
CONSTRAINT subscription_events_owner_type_chk CHECK (((owner_type IS NULL) OR (owner_type = ANY (ARRAY['clinic'::text, 'therapist'::text]))))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.subscription_intents_personal (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
created_by_user_id uuid,
|
||||
email text NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
plan_key text,
|
||||
"interval" text,
|
||||
amount_cents integer,
|
||||
currency text,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
source text DEFAULT 'manual'::text NOT NULL,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
subscription_id uuid,
|
||||
CONSTRAINT sint_personal_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))),
|
||||
CONSTRAINT sint_personal_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.subscription_intents_tenant (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
created_by_user_id uuid,
|
||||
email text NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
plan_key text,
|
||||
"interval" text,
|
||||
amount_cents integer,
|
||||
currency text,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
source text DEFAULT 'manual'::text NOT NULL,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
tenant_id uuid NOT NULL,
|
||||
subscription_id uuid,
|
||||
CONSTRAINT sint_tenant_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))),
|
||||
CONSTRAINT sint_tenant_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.subscription_intents_legacy (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
user_id uuid,
|
||||
email text,
|
||||
plan_key text NOT NULL,
|
||||
"interval" text NOT NULL,
|
||||
amount_cents integer NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text NOT NULL,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
source text DEFAULT 'landing'::text NOT NULL,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
tenant_id uuid NOT NULL,
|
||||
created_by_user_id uuid,
|
||||
CONSTRAINT subscription_intents_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text]))),
|
||||
CONSTRAINT subscription_intents_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.billing_contracts (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -250,90 +55,28 @@ CREATE TABLE public.billing_contracts (
|
||||
CONSTRAINT billing_contracts_type_chk CHECK ((type = ANY (ARRAY['per_session'::text, 'package'::text, 'subscription'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.addon_credits (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid,
|
||||
addon_type text NOT NULL,
|
||||
balance integer DEFAULT 0 NOT NULL,
|
||||
total_purchased integer DEFAULT 0 NOT NULL,
|
||||
total_consumed integer DEFAULT 0 NOT NULL,
|
||||
low_balance_threshold integer DEFAULT 10,
|
||||
low_balance_notified boolean DEFAULT false,
|
||||
daily_limit integer,
|
||||
hourly_limit integer,
|
||||
daily_used integer DEFAULT 0,
|
||||
hourly_used integer DEFAULT 0,
|
||||
daily_reset_at timestamp with time zone,
|
||||
hourly_reset_at timestamp with time zone,
|
||||
from_number_override text,
|
||||
expires_at timestamp with time zone,
|
||||
is_active boolean DEFAULT true,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
CREATE TABLE public.entitlements_invalidation (
|
||||
owner_id uuid NOT NULL,
|
||||
changed_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.addon_products (
|
||||
CREATE TABLE public.features (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
slug text NOT NULL,
|
||||
name text NOT NULL,
|
||||
key text NOT NULL,
|
||||
description text,
|
||||
addon_type text NOT NULL,
|
||||
icon text DEFAULT 'pi pi-box'::text,
|
||||
credits_amount integer DEFAULT 0,
|
||||
price_cents integer DEFAULT 0 NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text,
|
||||
is_active boolean DEFAULT true,
|
||||
is_visible boolean DEFAULT true,
|
||||
sort_order integer DEFAULT 0,
|
||||
metadata jsonb DEFAULT '{}'::jsonb,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now(),
|
||||
deleted_at timestamp with time zone
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
descricao text DEFAULT ''::text NOT NULL,
|
||||
name text DEFAULT ''::text NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.addon_transactions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
owner_id uuid,
|
||||
addon_type text NOT NULL,
|
||||
type text NOT NULL,
|
||||
amount integer NOT NULL,
|
||||
balance_before integer DEFAULT 0 NOT NULL,
|
||||
balance_after integer DEFAULT 0 NOT NULL,
|
||||
product_id uuid,
|
||||
queue_id uuid,
|
||||
description text,
|
||||
admin_user_id uuid,
|
||||
payment_method text,
|
||||
payment_reference text,
|
||||
price_cents integer,
|
||||
currency text DEFAULT 'BRL'::text,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
metadata jsonb DEFAULT '{}'::jsonb
|
||||
CREATE TABLE public.module_features (
|
||||
module_id uuid NOT NULL,
|
||||
feature_id uuid NOT NULL,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
limits jsonb,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.addon_transactions OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: TABLE addon_transactions; Type: COMMENT; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
COMMENT ON TABLE public.addon_transactions IS 'Histórico de todas as transações de créditos: compras, consumo, ajustes, reembolsos.';
|
||||
|
||||
|
||||
--
|
||||
-- Name: agenda_bloqueios; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE public.modules (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
key text NOT NULL,
|
||||
@@ -343,18 +86,14 @@ CREATE TABLE public.modules (
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.module_features (
|
||||
module_id uuid NOT NULL,
|
||||
CREATE TABLE public.plan_features (
|
||||
plan_id uuid NOT NULL,
|
||||
feature_id uuid NOT NULL,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
limits jsonb,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.tenant_modules (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
@@ -367,5 +106,151 @@ CREATE TABLE public.tenant_modules (
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.plan_prices (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text NOT NULL,
|
||||
"interval" text NOT NULL,
|
||||
amount_cents integer NOT NULL,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
active_from timestamp with time zone DEFAULT now() NOT NULL,
|
||||
active_to timestamp with time zone,
|
||||
source text DEFAULT 'manual'::text NOT NULL,
|
||||
provider text,
|
||||
provider_price_id text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT plan_prices_amount_cents_check CHECK ((amount_cents >= 0)),
|
||||
CONSTRAINT plan_prices_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text])))
|
||||
);
|
||||
|
||||
ALTER TABLE public.tenant_modules OWNER TO supabase_admin;
|
||||
CREATE TABLE public.plan_public (
|
||||
plan_id uuid NOT NULL,
|
||||
public_name text DEFAULT ''::text NOT NULL,
|
||||
public_description text DEFAULT ''::text NOT NULL,
|
||||
badge text,
|
||||
is_featured boolean DEFAULT false NOT NULL,
|
||||
is_visible boolean DEFAULT true NOT NULL,
|
||||
sort_order 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.plan_public_bullets (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
text text NOT NULL,
|
||||
sort_order integer DEFAULT 0 NOT NULL,
|
||||
highlight boolean DEFAULT false NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.plans (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
key text NOT NULL,
|
||||
name text NOT NULL,
|
||||
description text,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
price_cents integer DEFAULT 0 NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text NOT NULL,
|
||||
billing_interval text DEFAULT 'month'::text NOT NULL,
|
||||
target text,
|
||||
max_supervisees integer,
|
||||
CONSTRAINT plans_target_check CHECK ((target = ANY (ARRAY['patient'::text, 'therapist'::text, 'clinic'::text, 'supervisor'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.subscription_events (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
subscription_id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
event_type text NOT NULL,
|
||||
old_plan_id uuid,
|
||||
new_plan_id uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
created_by uuid,
|
||||
source text DEFAULT 'admin_ui'::text,
|
||||
reason text,
|
||||
metadata jsonb,
|
||||
owner_type text NOT NULL,
|
||||
owner_ref uuid NOT NULL,
|
||||
CONSTRAINT subscription_events_owner_ref_consistency_chk CHECK ((owner_id = owner_ref)),
|
||||
CONSTRAINT subscription_events_owner_type_chk CHECK (((owner_type IS NULL) OR (owner_type = ANY (ARRAY['clinic'::text, 'therapist'::text]))))
|
||||
);
|
||||
|
||||
CREATE TABLE public.subscription_intents_personal (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
created_by_user_id uuid,
|
||||
email text NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
plan_key text,
|
||||
"interval" text,
|
||||
amount_cents integer,
|
||||
currency text,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
source text DEFAULT 'manual'::text NOT NULL,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
subscription_id uuid,
|
||||
CONSTRAINT sint_personal_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))),
|
||||
CONSTRAINT sint_personal_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.subscription_intents_tenant (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
created_by_user_id uuid,
|
||||
email text NOT NULL,
|
||||
plan_id uuid NOT NULL,
|
||||
plan_key text,
|
||||
"interval" text,
|
||||
amount_cents integer,
|
||||
currency text,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
source text DEFAULT 'manual'::text NOT NULL,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
tenant_id uuid NOT NULL,
|
||||
subscription_id uuid,
|
||||
CONSTRAINT sint_tenant_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))),
|
||||
CONSTRAINT sint_tenant_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.subscription_intents_legacy (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
user_id uuid,
|
||||
email text,
|
||||
plan_key text NOT NULL,
|
||||
"interval" text NOT NULL,
|
||||
amount_cents integer NOT NULL,
|
||||
currency text DEFAULT 'BRL'::text NOT NULL,
|
||||
status text DEFAULT 'new'::text NOT NULL,
|
||||
source text DEFAULT 'landing'::text NOT NULL,
|
||||
notes text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
paid_at timestamp with time zone,
|
||||
tenant_id uuid NOT NULL,
|
||||
created_by_user_id uuid,
|
||||
CONSTRAINT subscription_intents_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text]))),
|
||||
CONSTRAINT subscription_intents_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.tenant_feature_exceptions_log (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
feature_key text NOT NULL,
|
||||
enabled boolean NOT NULL,
|
||||
reason text,
|
||||
created_by uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.tenant_features (
|
||||
tenant_id uuid NOT NULL,
|
||||
feature_key text NOT NULL,
|
||||
enabled 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
|
||||
);
|
||||
+84
-46
@@ -1,42 +1,6 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Compromissos Determinados
|
||||
-- =============================================================================
|
||||
-- determined_commitments, determined_commitment_fields,
|
||||
-- commitment_services, commitment_time_logs
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE public.determined_commitments (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
created_by uuid,
|
||||
is_native boolean DEFAULT false NOT NULL,
|
||||
native_key text,
|
||||
is_locked boolean DEFAULT false NOT NULL,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
name text NOT NULL,
|
||||
description text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
bg_color text,
|
||||
text_color text
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.determined_commitment_fields (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
commitment_id uuid NOT NULL,
|
||||
key text NOT NULL,
|
||||
label text NOT NULL,
|
||||
field_type public.determined_field_type DEFAULT 'text'::public.determined_field_type NOT NULL,
|
||||
required boolean DEFAULT false NOT NULL,
|
||||
sort_order 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
|
||||
);
|
||||
|
||||
|
||||
-- Tables: Serviços / Prontuários
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.229Z
|
||||
-- Total: 8
|
||||
|
||||
CREATE TABLE public.commitment_services (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -54,13 +18,6 @@ CREATE TABLE public.commitment_services (
|
||||
CONSTRAINT commitment_services_quantity_chk CHECK ((quantity > 0))
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.commitment_services OWNER TO supabase_admin;
|
||||
|
||||
--
|
||||
-- Name: commitment_time_logs; Type: TABLE; Schema: public; Owner: supabase_admin
|
||||
--
|
||||
|
||||
CREATE TABLE public.commitment_time_logs (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
@@ -74,4 +31,85 @@ CREATE TABLE public.commitment_time_logs (
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.determined_commitment_fields (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
commitment_id uuid NOT NULL,
|
||||
key text NOT NULL,
|
||||
label text NOT NULL,
|
||||
field_type public.determined_field_type DEFAULT 'text'::public.determined_field_type NOT NULL,
|
||||
required boolean DEFAULT false NOT NULL,
|
||||
sort_order 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.determined_commitments (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
created_by uuid,
|
||||
is_native boolean DEFAULT false NOT NULL,
|
||||
native_key text,
|
||||
is_locked boolean DEFAULT false NOT NULL,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
name text NOT NULL,
|
||||
description text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
bg_color text,
|
||||
text_color text
|
||||
);
|
||||
|
||||
CREATE TABLE public.insurance_plan_services (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
insurance_plan_id uuid NOT NULL,
|
||||
name text NOT NULL,
|
||||
value numeric(10,2) NOT NULL,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE public.insurance_plans (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
name text NOT NULL,
|
||||
notes text,
|
||||
default_value numeric(10,2),
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE public.medicos (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
nome text NOT NULL,
|
||||
crm text,
|
||||
especialidade text,
|
||||
telefone_profissional text,
|
||||
telefone_pessoal text,
|
||||
email text,
|
||||
clinica text,
|
||||
cidade text,
|
||||
estado text DEFAULT 'SP'::text,
|
||||
observacoes text,
|
||||
ativo boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE public.services (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
name text NOT NULL,
|
||||
description text,
|
||||
price numeric(10,2) NOT NULL,
|
||||
duration_min integer,
|
||||
active boolean DEFAULT true NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now(),
|
||||
updated_at timestamp with time zone DEFAULT now()
|
||||
);
|
||||
+92
-125
@@ -1,51 +1,6 @@
|
||||
-- =============================================================================
|
||||
-- AgenciaPsi — Tables — Core
|
||||
-- =============================================================================
|
||||
-- profiles, tenants, tenant_members, tenant_invites, tenant_features,
|
||||
-- tenant_feature_exceptions_log, saas_admins, owner_users, user_settings,
|
||||
-- company_profiles, dev_user_credentials
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE public.profiles (
|
||||
id uuid NOT NULL,
|
||||
role text DEFAULT 'tenant_member'::text NOT NULL,
|
||||
full_name text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
avatar_url text,
|
||||
phone text,
|
||||
bio text,
|
||||
language text DEFAULT 'pt-BR'::text NOT NULL,
|
||||
timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL,
|
||||
notify_system_email boolean DEFAULT true NOT NULL,
|
||||
notify_reminders boolean DEFAULT true NOT NULL,
|
||||
notify_news boolean DEFAULT false NOT NULL,
|
||||
account_type text DEFAULT 'free'::text NOT NULL,
|
||||
platform_roles text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
nickname text,
|
||||
work_description text,
|
||||
work_description_other text,
|
||||
site_url text,
|
||||
social_instagram text,
|
||||
social_youtube text,
|
||||
social_facebook text,
|
||||
social_x text,
|
||||
social_custom jsonb DEFAULT '[]'::jsonb NOT NULL,
|
||||
CONSTRAINT profiles_account_type_check CHECK ((account_type = ANY (ARRAY['free'::text, 'patient'::text, 'therapist'::text, 'clinic'::text]))),
|
||||
CONSTRAINT profiles_role_check CHECK ((role = ANY (ARRAY['saas_admin'::text, 'tenant_member'::text, 'portal_user'::text, 'patient'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.tenants (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
name text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
kind text DEFAULT 'saas'::text NOT NULL,
|
||||
CONSTRAINT tenants_kind_check CHECK ((kind = ANY (ARRAY['therapist'::text, 'clinic_coworking'::text, 'clinic_reception'::text, 'clinic_full'::text, 'clinic'::text, 'saas'::text, 'supervisor'::text])))
|
||||
);
|
||||
|
||||
|
||||
-- Tables: Tenants / Multi-tenant
|
||||
-- Gerado automaticamente em 2026-04-17T12:23:05.228Z
|
||||
-- Total: 10
|
||||
|
||||
CREATE TABLE public.tenant_members (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
@@ -56,81 +11,6 @@ CREATE TABLE public.tenant_members (
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.tenant_invites (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
email text NOT NULL,
|
||||
role text NOT NULL,
|
||||
token uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
invited_by uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
expires_at timestamp with time zone DEFAULT (now() + '7 days'::interval) NOT NULL,
|
||||
accepted_at timestamp with time zone,
|
||||
accepted_by uuid,
|
||||
revoked_at timestamp with time zone,
|
||||
revoked_by uuid,
|
||||
CONSTRAINT tenant_invites_role_check CHECK ((role = ANY (ARRAY['therapist'::text, 'secretary'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.tenant_features (
|
||||
tenant_id uuid NOT NULL,
|
||||
feature_key text NOT NULL,
|
||||
enabled 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
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.tenant_feature_exceptions_log (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
feature_key text NOT NULL,
|
||||
enabled boolean NOT NULL,
|
||||
reason text,
|
||||
created_by uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.saas_admins (
|
||||
user_id uuid NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.owner_users (
|
||||
owner_id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
role text DEFAULT 'admin'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.user_settings (
|
||||
user_id uuid NOT NULL,
|
||||
theme_mode text DEFAULT 'dark'::text NOT NULL,
|
||||
preset text DEFAULT 'Aura'::text NOT NULL,
|
||||
primary_color text DEFAULT 'noir'::text NOT NULL,
|
||||
surface_color text DEFAULT 'slate'::text NOT NULL,
|
||||
menu_mode text DEFAULT 'static'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
layout_variant text DEFAULT 'classic'::text NOT NULL,
|
||||
CONSTRAINT user_settings_layout_variant_check CHECK ((layout_variant = ANY (ARRAY['classic'::text, 'rail'::text]))),
|
||||
CONSTRAINT user_settings_menu_mode_check CHECK ((menu_mode = ANY (ARRAY['static'::text, 'overlay'::text]))),
|
||||
CONSTRAINT user_settings_theme_mode_check CHECK ((theme_mode = ANY (ARRAY['light'::text, 'dark'::text])))
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.company_profiles (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
@@ -156,8 +36,6 @@ CREATE TABLE public.company_profiles (
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE public.dev_user_credentials (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
user_id uuid,
|
||||
@@ -168,4 +46,93 @@ CREATE TABLE public.dev_user_credentials (
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.owner_users (
|
||||
owner_id uuid NOT NULL,
|
||||
user_id uuid NOT NULL,
|
||||
role text DEFAULT 'admin'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.profiles (
|
||||
id uuid NOT NULL,
|
||||
role text DEFAULT 'tenant_member'::text NOT NULL,
|
||||
full_name text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
avatar_url text,
|
||||
phone text,
|
||||
bio text,
|
||||
language text DEFAULT 'pt-BR'::text NOT NULL,
|
||||
timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL,
|
||||
notify_system_email boolean DEFAULT true NOT NULL,
|
||||
notify_reminders boolean DEFAULT true NOT NULL,
|
||||
notify_news boolean DEFAULT false NOT NULL,
|
||||
account_type text DEFAULT 'free'::text NOT NULL,
|
||||
platform_roles text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
nickname text,
|
||||
work_description text,
|
||||
work_description_other text,
|
||||
site_url text,
|
||||
social_instagram text,
|
||||
social_youtube text,
|
||||
social_facebook text,
|
||||
social_x text,
|
||||
social_custom jsonb DEFAULT '[]'::jsonb NOT NULL,
|
||||
tenant_id uuid,
|
||||
CONSTRAINT profiles_account_type_check CHECK ((account_type = ANY (ARRAY['free'::text, 'patient'::text, 'therapist'::text, 'clinic'::text]))),
|
||||
CONSTRAINT profiles_role_check CHECK ((role = ANY (ARRAY['saas_admin'::text, 'tenant_member'::text, 'portal_user'::text, 'patient'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.saas_admins (
|
||||
user_id uuid NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.support_sessions (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
admin_id uuid NOT NULL,
|
||||
token text DEFAULT encode(extensions.gen_random_bytes(32), 'hex'::text) NOT NULL,
|
||||
expires_at timestamp with time zone DEFAULT (now() + '01:00:00'::interval) NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE public.tenant_invites (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
email text NOT NULL,
|
||||
role text NOT NULL,
|
||||
token uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
invited_by uuid,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
expires_at timestamp with time zone DEFAULT (now() + '7 days'::interval) NOT NULL,
|
||||
accepted_at timestamp with time zone,
|
||||
accepted_by uuid,
|
||||
revoked_at timestamp with time zone,
|
||||
revoked_by uuid,
|
||||
CONSTRAINT tenant_invites_role_check CHECK ((role = ANY (ARRAY['therapist'::text, 'secretary'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.tenants (
|
||||
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
name text,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
kind text DEFAULT 'saas'::text NOT NULL,
|
||||
papel_timbrado jsonb DEFAULT '{"footer": {"slots": {"left": null, "right": null, "center": {"type": "custom-text", "content": ""}}, "height": 40, "preset": "text-center", "divider": {"show": true, "color": "#cccccc", "style": "solid"}, "enabled": true, "showPageNumber": false}, "header": {"slots": {"left": {"size": "medium", "type": "logo"}, "right": {"type": "institution-data", "fields": ["nome", "cnpj", "endereco_linha"]}, "center": null}, "height": 80, "preset": "logo-left-text-right", "divider": {"show": true, "color": "#cccccc", "style": "solid"}, "enabled": true}, "margins": {"top": 20, "left": 25, "right": 25, "bottom": 20}}'::jsonb,
|
||||
CONSTRAINT tenants_kind_check CHECK ((kind = ANY (ARRAY['therapist'::text, 'clinic_coworking'::text, 'clinic_reception'::text, 'clinic_full'::text, 'clinic'::text, 'saas'::text, 'supervisor'::text])))
|
||||
);
|
||||
|
||||
CREATE TABLE public.user_settings (
|
||||
user_id uuid NOT NULL,
|
||||
theme_mode text DEFAULT 'dark'::text NOT NULL,
|
||||
preset text DEFAULT 'Aura'::text NOT NULL,
|
||||
primary_color text DEFAULT 'noir'::text NOT NULL,
|
||||
surface_color text DEFAULT 'slate'::text NOT NULL,
|
||||
menu_mode text DEFAULT 'static'::text NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
layout_variant text DEFAULT 'classic'::text NOT NULL,
|
||||
CONSTRAINT user_settings_layout_variant_check CHECK ((layout_variant = ANY (ARRAY['classic'::text, 'rail'::text]))),
|
||||
CONSTRAINT user_settings_menu_mode_check CHECK ((menu_mode = ANY (ARRAY['static'::text, 'overlay'::text]))),
|
||||
CONSTRAINT user_settings_theme_mode_check CHECK ((theme_mode = ANY (ARRAY['light'::text, 'dark'::text])))
|
||||
);
|
||||
Reference in New Issue
Block a user