CREATE TABLE IF NOT EXISTS pessoas (id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,grupo_matriz_id BIGINT NOT NULL REFERENCES empresas(id),codigo VARCHAR(20) NOT NULL,tipo_pessoa VARCHAR(10) NOT NULL,cpf_cnpj VARCHAR(14),nome_razao VARCHAR(160) NOT NULL,nome_fantasia VARCHAR(160),rg VARCHAR(20),inscricao_estadual VARCHAR(20),inscricao_municipal VARCHAR(20),nascimento_abertura DATE,estrangeiro BOOLEAN NOT NULL DEFAULT FALSE,observacoes TEXT,ativo BOOLEAN NOT NULL DEFAULT TRUE,criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,atualizado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,excluido_em TIMESTAMP,UNIQUE(grupo_matriz_id,codigo),UNIQUE(grupo_matriz_id,cpf_cnpj));
CREATE INDEX IF NOT EXISTS idx_pessoas_grupo_nome ON pessoas(grupo_matriz_id,nome_razao);
CREATE TABLE IF NOT EXISTS pessoa_empresas (pessoa_id BIGINT NOT NULL REFERENCES pessoas(id),empresa_id BIGINT NOT NULL REFERENCES empresas(id),ativo BOOLEAN NOT NULL DEFAULT TRUE,criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(pessoa_id,empresa_id));
CREATE TABLE IF NOT EXISTS pessoa_enderecos (id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,pessoa_id BIGINT NOT NULL REFERENCES pessoas(id),tipo VARCHAR(20) NOT NULL DEFAULT 'principal',identificacao VARCHAR(80),cep VARCHAR(8),logradouro VARCHAR(160),numero VARCHAR(20),complemento VARCHAR(80),bairro VARCHAR(80),municipio VARCHAR(100),codigo_ibge VARCHAR(7),uf CHAR(2),pais VARCHAR(80) NOT NULL DEFAULT 'Brasil',principal BOOLEAN NOT NULL DEFAULT FALSE);
CREATE TABLE IF NOT EXISTS pessoa_contatos (id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,pessoa_id BIGINT NOT NULL REFERENCES pessoas(id),tipo VARCHAR(20) NOT NULL,nome VARCHAR(120),departamento VARCHAR(80),valor VARCHAR(160) NOT NULL,principal BOOLEAN NOT NULL DEFAULT FALSE);
CREATE TABLE IF NOT EXISTS pessoa_clientes (id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,pessoa_id BIGINT NOT NULL REFERENCES pessoas(id),empresa_id BIGINT NOT NULL REFERENCES empresas(id),grupo_pessoa_id BIGINT REFERENCES grupos_pessoa(id),tabela_preco_id BIGINT REFERENCES tabelas_preco(id),limite_credito NUMERIC(15,2) NOT NULL DEFAULT 0,desconto_maximo NUMERIC(7,2) NOT NULL DEFAULT 0,consumidor_final BOOLEAN NOT NULL DEFAULT TRUE,indicador_ie VARCHAR(20) NOT NULL DEFAULT 'nao_contribuinte',permite_venda_prazo BOOLEAN NOT NULL DEFAULT FALSE,permite_vencidos BOOLEAN NOT NULL DEFAULT FALSE,bloqueado BOOLEAN NOT NULL DEFAULT FALSE,motivo_bloqueio VARCHAR(500),ativo BOOLEAN NOT NULL DEFAULT TRUE,criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,atualizado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,excluido_em TIMESTAMP,UNIQUE(pessoa_id,empresa_id));
CREATE INDEX IF NOT EXISTS idx_pessoa_clientes_empresa ON pessoa_clientes(empresa_id,ativo);
