186 lines
5.6 KiB
SQL
186 lines
5.6 KiB
SQL
-- =============================================================================
|
|
-- AgenciaPsi — Tables — Pacientes
|
|
-- =============================================================================
|
|
-- patients, patient_groups, patient_group_patient, patient_tags,
|
|
-- patient_patient_tag, patient_intake_requests, patient_invites,
|
|
-- patient_discounts
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE public.patients (
|
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
|
nome_completo text NOT NULL,
|
|
email_principal text,
|
|
telefone text,
|
|
created_at timestamp with time zone DEFAULT now(),
|
|
owner_id uuid,
|
|
avatar_url text,
|
|
status text DEFAULT 'Ativo'::text,
|
|
last_attended_at timestamp with time zone,
|
|
is_native boolean DEFAULT false,
|
|
naturalidade text,
|
|
data_nascimento date,
|
|
rg text,
|
|
cpf text,
|
|
identification_color text,
|
|
genero text,
|
|
estado_civil text,
|
|
email_alternativo text,
|
|
pais text DEFAULT 'Brasil'::text,
|
|
cep text,
|
|
cidade text,
|
|
estado text,
|
|
endereco text,
|
|
numero text,
|
|
bairro text,
|
|
complemento text,
|
|
escolaridade text,
|
|
profissao text,
|
|
nome_parente text,
|
|
grau_parentesco text,
|
|
telefone_alternativo text,
|
|
onde_nos_conheceu text,
|
|
encaminhado_por text,
|
|
nome_responsavel text,
|
|
telefone_responsavel text,
|
|
cpf_responsavel text,
|
|
observacao_responsavel text,
|
|
cobranca_no_responsavel boolean DEFAULT false,
|
|
observacoes text,
|
|
notas_internas text,
|
|
updated_at timestamp with time zone DEFAULT now(),
|
|
telefone_parente text,
|
|
tenant_id uuid NOT NULL,
|
|
responsible_member_id uuid NOT NULL,
|
|
user_id uuid,
|
|
patient_scope text DEFAULT 'clinic'::text NOT NULL,
|
|
therapist_member_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))))
|
|
);
|
|
|
|
|
|
|
|
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()
|
|
);
|
|
|
|
|