CREATE TABLE IF NOT EXISTS perfis_acesso (id BIGSERIAL PRIMARY KEY,empresa_id BIGINT NOT NULL REFERENCES empresas(id),codigo VARCHAR(20) NOT NULL,descricao VARCHAR(100) NOT NULL,administrador BOOLEAN NOT NULL DEFAULT FALSE,permissoes JSONB NOT NULL DEFAULT '{}'::jsonb,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(empresa_id,codigo));
CREATE TABLE IF NOT EXISTS usuarios (id BIGSERIAL PRIMARY KEY,grupo_matriz_id BIGINT NOT NULL REFERENCES empresas(id),pessoa_id BIGINT NOT NULL REFERENCES pessoas(id),empresa_padrao_id BIGINT NOT NULL REFERENCES empresas(id),perfil_acesso_id BIGINT NOT NULL REFERENCES perfis_acesso(id),login VARCHAR(80) NOT NULL,senha_hash VARCHAR(255) NOT NULL,trocar_senha BOOLEAN NOT NULL DEFAULT TRUE,ultimo_acesso_em TIMESTAMP,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,login),UNIQUE(grupo_matriz_id,pessoa_id));
CREATE TABLE IF NOT EXISTS pessoa_colaboradores (id BIGSERIAL 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),matricula VARCHAR(30),cargo VARCHAR(100),departamento VARCHAR(100),tipo_vinculo VARCHAR(20) NOT NULL DEFAULT 'clt',data_admissao DATE,data_desligamento DATE,carga_horaria_semanal NUMERIC(6,2) NOT NULL DEFAULT 44,usuario_id BIGINT REFERENCES usuarios(id),salario_base NUMERIC(15,2) NOT NULL DEFAULT 0,bloqueado BOOLEAN NOT NULL DEFAULT FALSE,motivo_bloqueio 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(pessoa_id,empresa_id),UNIQUE(empresa_id,matricula));
CREATE INDEX IF NOT EXISTS idx_colaboradores_empresa ON pessoa_colaboradores(empresa_id,ativo);
CREATE INDEX IF NOT EXISTS idx_usuarios_login ON usuarios(grupo_matriz_id,login,ativo);
INSERT INTO perfis_acesso(empresa_id,codigo,descricao,administrador,permissoes,ativo) SELECT id,'1','ADMINISTRADOR',TRUE,'{"todos":true}'::jsonb,TRUE FROM empresas WHERE excluido_em IS NULL ON CONFLICT(empresa_id,codigo) DO NOTHING;
