-- ===============================================================================================================
-- Tabela 01 - Categoria de Trabalhadores
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS esocial.tab_01 (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    descricao TEXT NOT NULL,
    data_inicio DATE NOT NULL,
    data_fim DATE DEFAULT NULL
);

INSERT INTO esocial.tab_01 (id, descricao, data_inicio, data_fim) VALUES
(101, 'Empregado - Geral, inclusive o empregado público da administração direta ou indireta contratado pela CLT', '2014-01-01', NULL),
(102, 'Empregado - Trabalhador rural por pequeno prazo da Lei 11.718/2008', '2014-01-01', NULL),
(103, 'Empregado - Aprendiz', '2014-01-01', NULL),
(104, 'Empregado - Doméstico', '2014-01-01', NULL),
(105, 'Empregado - Contrato a termo firmado nos termos da Lei 9.601/1998', '2014-01-01', NULL),
(106, 'Trabalhador temporário - Contrato nos termos da Lei 6.019/1974', '2014-01-01', NULL),
(107, 'Empregado - Contrato de trabalho Verde e Amarelo - sem acordo para antecipação mensal da multa rescisória do FGTS', '2020-01-01', '2022-12-31'),
(108, 'Empregado - Contrato de trabalho Verde e Amarelo - com acordo para antecipação mensal da multa rescisória do FGTS', '2020-01-01', '2022-12-31'),
(111, 'Empregado - Contrato de trabalho intermitente', '2014-01-01', NULL),
(201, 'Trabalhador avulso portuário', '2014-01-01', NULL),
(202, 'Trabalhador avulso não portuário', '2014-01-01', NULL),
(301, 'Servidor público titular de cargo efetivo, magistrado, ministro de Tribunal de Contas, conselheiro de Tribunal de Contas e membro do Ministério Público', '2014-01-01', NULL),
(302, 'Servidor público ocupante de cargo exclusivo em comissão', '2014-01-01', NULL),
(303, 'Exercente de mandato eletivo', '2014-01-01', NULL),
(304, 'Servidor público exercente de mandato eletivo, inclusive com exercício de cargo em comissão', '2014-01-01', NULL),
(305, 'Servidor público indicado para conselho ou órgão deliberativo, na condição de representante do governo, órgão ou entidade da administração pública', '2014-01-01', NULL),
(306, 'Servidor público contratado por tempo determinado, sujeito a regime administrativo especial definido em lei própria', '2014-01-01', NULL),
(307, 'Militar dos Estados e Distrito Federal', '2014-01-01', NULL),
(308, 'Conscrito', '2014-01-01', '2023-04-25'),
(309, 'Agente público - Outros', '2014-01-01', NULL),
(310, 'Servidor público eventual', '2014-01-01', NULL),
(311, 'Ministros, juízes, procuradores, promotores ou oficiais de justiça à disposição da Justiça Eleitoral', '2014-01-01', NULL),
(312, 'Auxiliar local', '2014-01-01', NULL),
(313, 'Servidor público exercente de atividade de instrutoria, curso ou concurso, convocado para pareceres técnicos, depoimentos ou aditância no exterior.', '2014-01-01', NULL),
(314, 'Militar das Forças Armadas', '2014-01-01', NULL),
(401, 'Dirigente sindical - Informação prestada pelo sindicato', '2014-01-01', NULL),
(410, 'Trabalhador cedido/exercício em outro órgão/juiz auxiliar - Informação prestada pelo cessionário/destino', '2014-01-01', NULL),
(501, 'Dirigente sindical - Segurado especial', '2014-01-01', NULL),
(701, 'Contribuinte individual - Autônomo em geral, exceto se enquadrado em uma das demais categorias de contribuinte individual', '2014-01-01', NULL),
(711, 'Contribuinte individual - Transportador autônomo de passageiros', '2014-01-01', NULL),
(712, 'Contribuinte individual - Transportador autônomo de carga', '2014-01-01', NULL),
(721, 'Contribuinte individual - Diretor não empregado, com FGTS', '2014-01-01', NULL),
(722, 'Contribuinte individual - Diretor não empregado, sem FGTS', '2014-01-01', NULL),
(723, 'Contribuinte individual - Empresário, sócio e membro de conselho de administração ou fiscal', '2014-01-01', NULL),
(731, 'Contribuinte individual - Cooperado que presta serviços por intermédio de cooperativa de trabalho', '2014-01-01', NULL),
(734, 'Contribuinte individual - Transportador cooperado que presta serviços por intermédio de cooperativa de trabalho', '2014-01-01', NULL),
(738, 'Contribuinte individual - Cooperado filiado a cooperativa de produção', '2014-01-01', NULL),
(741, 'Contribuinte individual - Microempreendedor individual', '2014-01-01', NULL),
(751, 'Contribuinte individual - Magistrado classista temporário da Justiça do Trabalho ou da Justiça Eleitoral que seja aposentado de qualquer regime previdenciário', '2014-01-01', NULL),
(761, 'Contribuinte individual - Associado eleito para direção de cooperativa, associação ou entidade de classe de qualquer natureza ou finalidade, bem como o síndico ou administrador eleito para exercer atividade de direção condominial, desde que recebam remuneração', '2014-01-01', NULL),
(771, 'Contribuinte individual - Membro de conselho tutelar, nos termos da Lei 8.069/1990', '2014-01-01', NULL),
(781, 'Ministro de confissão religiosa ou membro de vida consagrada, de congregação ou de ordem religiosa', '2014-01-01', NULL),
(901, 'Estagiário', '2014-01-01', NULL),
(902, 'Médico residente, residente em área profissional de saúde ou médico em curso de formação', '2014-01-01', NULL),
(903, 'Bolsista', '2014-01-01', NULL),
(904, 'Participante de curso de formação, como etapa de concurso público, sem vínculo de emprego/estatutário', '2014-01-01', NULL),
(906, 'Beneficiário do Programa Nacional de Prestação de Serviço Civil Voluntário', '2022-01-28', NULL);

SELECT setval(pg_get_serial_sequence('esocial.tab_01','id'), (SELECT MAX(id) FROM esocial.tab_01));

-- ===============================================================================================================
-- Tabela 02 - Financiamento da Aposentadoria Especial e Redução do Tempo de Contribuição
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS esocial.tab_02 (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    descricao TEXT NOT NULL
);

INSERT INTO esocial.tab_02 (id, descricao) VALUES
(1, 'Não ensejador de aposentadoria especial'),
(2, 'Ensejador de aposentadoria especial - FAE15_12% (15 anos de contribuição e alíquota de 12%)'),
(3, 'Ensejador de aposentadoria especial - FAE20_09% (20 anos de contribuição e alíquota de 9%)'),
(4, 'Ensejador de aposentadoria especial - FAE25_06% (25 anos de contribuição e alíquota de 6%)');

SELECT setval(pg_get_serial_sequence('esocial.tab_02','id'), (SELECT MAX(id) FROM esocial.tab_02));

-- ===============================================================================================================
-- Tabela 03 - Natureza das Rubricas da Folha de Pagamento
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS esocial.tab_03 (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    nome VARCHAR(255) NOT NULL,
    descricao TEXT DEFAULT NULL,
    data_inicio DATE NOT NULL,
    data_fim DATE DEFAULT NULL,
    incide_cp SMALLINT DEFAULT 0
);

-- ===============================================================================================================
-- Tabela 04 - Códigos e Alíquotas de FPAS / Terceiros
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS esocial.tab_04_fpas (
    id BIGSERIAL PRIMARY KEY,
    codigo VARCHAR(10) UNIQUE NOT NULL,
    descricao TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE IF NOT EXISTS esocial.tab_04_grupo (
    id BIGSERIAL PRIMARY KEY,
    fpas_id BIGINT NOT NULL REFERENCES esocial.tab_04_fpas(id) ON DELETE CASCADE,
    nome VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE IF NOT EXISTS esocial.tab_04_item (
    id BIGSERIAL PRIMARY KEY,
    grupo_id BIGINT NOT NULL REFERENCES esocial.tab_04_grupo(id) ON DELETE CASCADE,
    base_calculo VARCHAR(255) DEFAULT NULL,
    descricao VARCHAR(255) NOT NULL,
    codigo_terceiro VARCHAR(10) NOT NULL,
    aliquota DECIMAL(6,2) NOT NULL,
    is_total BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

-- FPAS principal
INSERT INTO esocial.tab_04_fpas (id, codigo, descricao) VALUES
(1, '507', 'Terceiros - Incidência sobre folha de salários'),
(2, '508', 'Terceiros - Outros FPAS Exemplo'); -- adicione outros FPAS se necessário

-- Grupos dentro do FPAS 507
INSERT INTO esocial.tab_04_grupo (id, fpas_id, nome) VALUES
(1, 1, 'Contribuição Patronal Previdenciária'),
(2, 1, 'Segurados em Condições Especiais'),
(3, 1, 'Contribuição Terceiros');

-- Itens do grupo 1 - Contribuição Patronal Previdenciária
INSERT INTO esocial.tab_04_item (id, grupo_id, base_calculo, descricao, codigo_terceiro, aliquota, is_total) VALUES
(1, 1, 'Salário de Contribuição', 'INSS Patronal', '100', 20.00, FALSE),
(2, 1, 'Salário de Contribuição', 'INSS Patronal – RAT', '101', 1.00, FALSE),
(3, 1, 'Salário de Contribuição', 'INSS Patronal – Terceiros', '102', 5.80, FALSE),
(4, 1, 'Salário de Contribuição', 'INSS Patronal – Total', '999', 26.80, TRUE);

-- Itens do grupo 2 - Segurados em Condições Especiais
INSERT INTO esocial.tab_04_item (id, grupo_id, base_calculo, descricao, codigo_terceiro, aliquota, is_total) VALUES
(5, 2, 'Salário de Contribuição', 'INSS Especial - Aposentadoria Especial 15 anos', '200', 12.00, FALSE),
(6, 2, 'Salário de Contribuição', 'INSS Especial - Aposentadoria Especial 20 anos', '201', 9.00, FALSE),
(7, 2, 'Salário de Contribuição', 'INSS Especial - Aposentadoria Especial 25 anos', '202', 6.00, FALSE);

-- Itens do grupo 3 - Contribuição Terceiros
INSERT INTO esocial.tab_04_item (id, grupo_id, base_calculo, descricao, codigo_terceiro, aliquota, is_total) VALUES
(8, 3, 'Salário de Contribuição', 'SESI', '300', 1.50, FALSE),
(9, 3, 'Salário de Contribuição', 'SENAI', '301', 1.00, FALSE),
(10, 3, 'Salário de Contribuição', 'SESC', '302', 0.50, FALSE),
(11, 3, 'Salário de Contribuição', 'TOTAL TERCEIROS', '999', 3.00, TRUE);

-- Tabelas do FPAS / Terceiros
SELECT setval(pg_get_serial_sequence('esocial.tab_04_fpas','id'), (SELECT MAX(id) FROM esocial.tab_04_fpas));
SELECT setval(pg_get_serial_sequence('esocial.tab_04_grupo','id'), (SELECT MAX(id) FROM esocial.tab_04_grupo));
SELECT setval(pg_get_serial_sequence('esocial.tab_04_item','id'), (SELECT MAX(id) FROM esocial.tab_04_item));

-- Índices para otimização de consultas
CREATE INDEX IF NOT EXISTS idx_tab_04_fpas_codigo ON esocial.tab_04_fpas (codigo);
CREATE INDEX IF NOT EXISTS idx_tab_04_grupo_fpas_id ON esocial.tab_04_grupo (fpas_id);
CREATE INDEX IF NOT EXISTS idx_tab_04_item_grupo_id ON esocial.tab_04_item (grupo_id);

-- ===============================================================================================================
-- Tabela 05 - Tipos de Inscrição
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS esocial.tab_05 (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    descricao VARCHAR(255) NOT NULL
);

-- Inserindo os dados
INSERT INTO esocial.tab_05 (id, descricao) VALUES
(1, 'CNPJ (Cadastro Nacional da Pessoa Jurídica)'),
(2, 'CPF (Cadastro de Pessoas Físicas)'),
(3, 'CAEPF (Cadastro de Atividade Econômica de Pessoa Física)'),
(4, 'CNO (Cadastro Nacional de Obra)'),
(5, 'CGC (Cadastro Geral de Contribuintes)'),
(6, 'CEI (Cadastro Específico do INSS)');

-- Atualizando a sequência depois do insert
SELECT setval(pg_get_serial_sequence('esocial.tab_05','id'), (SELECT MAX(id) FROM esocial.tab_05));