3 Commits

7 changed files with 567 additions and 208 deletions

View File

@@ -3,31 +3,151 @@
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario_status (
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
descricao VARCHAR(255) NOT NULL UNIQUE
descricao VARCHAR(255) NOT NULL,
observacao TEXT DEFAULT NULL
);
INSERT INTO public.funcionario_status (id, descricao) VALUES
(1, 'Ativo'),
(3, 'Inativo');
INSERT INTO public.funcionario_status (id, descricao, observacao) VALUES
(1, 'Ativo', 'Funcionário ativo'),
(2, 'Inativo', 'Funcionário inativo recebendo benefício do INSS'),
(3, 'Inativo', 'Funcionário aposentado'),
(4, 'Inativo', 'Funcionário desligado da empresa');
SELECT setval(pg_get_serial_sequence('public.funcionario_status','id'), (SELECT MAX(id) FROM public.funcionario_status));
-- ===============================================================================================================
-- Estado Civil Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario_estado_civil (
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
descricao VARCHAR(255) NOT NULL
);
INSERT INTO public.funcionario_estado_civil (id, descricao) VALUES
(1, 'Solteiro(a)'),
(2, 'Casado(a)'),
(3, 'Divorciado(a)'),
(4, 'Separado(a)'),
(5, 'Viúvo(a)');
SELECT setval(pg_get_serial_sequence('public.funcionario_estado_civil','id'), (SELECT MAX(id) FROM public.funcionario_estado_civil));
-- ===============================================================================================================
-- Nível de Instrução Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario_nivel_instrucao (
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
codigo_xml VARCHAR(50) NOT NULL,
descricao VARCHAR(255) NOT NULL
);
INSERT INTO public.funcionario_nivel_instrucao (id, codigo_xml, descricao) VALUES
(1, '01', 'Analfabeto, inclusive o que, embora tenha recebido instrução, não se alfabetizou'),
(2, '02', 'Até o 5º ano incompleto do ensino fundamental (antiga 4ª série) ou que se tenha alfabetizado sem ter frequentado escola regular'),
(3, '03', '5º ano completo do ensino fundamental'),
(4, '04', 'Do 6º ao 9º ano do ensino fundamental incompleto (antiga 5ª a 8ª série)'),
(5, '05', 'Ensino fundamental completo'),
(6, '06', 'Ensino médio incompleto'),
(7, '07', 'Ensino médio completo'),
(8, '08', 'Educação superior incompleta'),
(9, '09', 'Educação superior completa'),
(10, '10', 'Pós-graduação completa'),
(11, '11', 'Mestrado completo'),
(12, '12', 'Doutorado completo');
SELECT setval(pg_get_serial_sequence('public.funcionario_nivel_instrucao','id'), (SELECT MAX(id) FROM public.funcionario_nivel_instrucao));
-- ===============================================================================================================
-- Raça/Cor Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario_raca_cor (
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
codigo_xml VARCHAR(50) NOT NULL,
descricao VARCHAR(255) NOT NULL
);
INSERT INTO public.funcionario_raca_cor (id, codigo_xml, descricao) VALUES
(1, '1', 'Branca'),
(2, '2', 'Preta'),
(3, '3', 'Parda'),
(4, '4', 'Amarela'),
(5, '5', 'Indígena'),
(6, '6', 'Não informado');
SELECT setval(pg_get_serial_sequence('public.funcionario_raca_cor','id'), (SELECT MAX(id) FROM public.funcionario_raca_cor));
-- ===============================================================================================================
-- Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario (
-- Identificadores
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
uuid UUID NOT NULL UNIQUE,
status_id BIGINT NOT NULL REFERENCES public.funcionario_status(id) ON UPDATE CASCADE ON DELETE RESTRICT,
empresa_id BIGINT NOT NULL REFERENCES public.empresa(id) ON UPDATE CASCADE ON DELETE RESTRICT,
-- Dados Funcionário
status_id BIGINT NOT NULL REFERENCES public.funcionario_status(id) ON UPDATE CASCADE ON DELETE RESTRICT,
nome VARCHAR(255) NOT NULL,
have_nome_social SMALLINT NOT NULL DEFAULT 0,
nome_social VARCHAR(255) DEFAULT NULL,
documentCpf VARCHAR(11) NOT NULL,
documentPis VARCHAR(11) DEFAULT NULL,
-- Documentos
document_cpf VARCHAR(11) NOT NULL,
document_pis VARCHAR(11) DEFAULT NULL,
-- Nível de Instrução
nivel_instrucao_id BIGINT DEFAULT NULL REFERENCES public.funcionario_nivel_instrucao(id) ON UPDATE CASCADE ON DELETE RESTRICT,
-- Estado Civil
estado_civil_id BIGINT NOT NULL DEFAULT 1 REFERENCES public.funcionario_estado_civil(id) ON UPDATE CASCADE ON DELETE RESTRICT,
-- Raça/Cor
raca_cor_id BIGINT DEFAULT NULL REFERENCES public.funcionario_raca_cor(id) ON UPDATE CASCADE ON DELETE RESTRICT,
-- Data de Nascimento e Óbito
data_nascimento DATE NOT NULL,
tipo_filiacao_1 VARCHAR(255) DEFAULT NULL,
data_obito DATE DEFAULT NULL,
-- Sexo
sexo CHAR(1) DEFAULT NULL,
-- Filiação
filiacao_1 VARCHAR(255) DEFAULT NULL,
tipo_filiacao_2 VARCHAR(255) DEFAULT NULL,
filiacao_2 VARCHAR(255) DEFAULT NULL,
-- Naturalidade
naturalidade_pais BIGINT DEFAULT 115 REFERENCES esocial.tab_06(id) ON UPDATE CASCADE ON DELETE RESTRICT,
naturalidade_uf CHAR(2) DEFAULT NULL REFERENCES esocial.tab_07(id) ON UPDATE CASCADE ON DELETE RESTRICT,
naturalidade_municipio VARCHAR(255) DEFAULT NULL,
naturalidade_municipio_codigo_ibge VARCHAR(7) DEFAULT NULL,
-- Residência
endereco_tipo_logradouro BIGINT DEFAULT NULL REFERENCES esocial.tab_20(id) ON UPDATE CASCADE ON DELETE RESTRICT,
endereco_descricao_logradouro VARCHAR(100) DEFAULT NULL,
endereco_numero_logradouro VARCHAR(10) DEFAULT NULL,
endereco_complemento_logradouro VARCHAR(30) DEFAULT NULL,
endereco_bairro VARCHAR(90) DEFAULT NULL,
endereco_cep VARCHAR(8) DEFAULT NULL,
endereco_codigo_municipio_ibge VARCHAR(7) DEFAULT NULL,
endereco_uf CHAR(2) DEFAULT NULL,
-- Endereço no Exterior
endereco_exterior_pais_id BIGINT DEFAULT NULL REFERENCES esocial.tab_06(id) ON UPDATE CASCADE ON DELETE RESTRICT,
endereco_exterior_descricao_logradouro VARCHAR(100) DEFAULT NULL,
endereco_exterior_numero_logradouro VARCHAR(10) DEFAULT NULL,
endereco_exterior_complemento_logradouro VARCHAR(30) DEFAULT NULL,
endereco_exterior_bairro VARCHAR(90) DEFAULT NULL,
endereco_exterior_nome_cidade VARCHAR(50) DEFAULT NULL,
endereco_exterior_cep VARCHAR(12) DEFAULT NULL,
-- Contato
email VARCHAR(255) DEFAULT NULL,
telefone VARCHAR(20) DEFAULT NULL,
celular VARCHAR(20) DEFAULT NULL,
-- Controle de Registros
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT NULL,
deleted_at TIMESTAMP DEFAULT NULL
);

View File

@@ -7,7 +7,7 @@
"firebase/php-jwt": "v6.11.1",
"vlucas/phpdotenv": "v5.6.2",
"symfony/var-dumper": "^v6.4.26",
"claudecio/axiumphp": "dev-dev-update-initializing",
"claudecio/axiumphp": "dev-feature-updated-router",
"ext-json": "*"
},
"repositories": [

14
composer.lock generated
View File

@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "3e440c7d7c70dfe80c1e1f3c59e6adc5",
"content-hash": "f3706a4f041aac68b4feb4e9d952a8a2",
"packages": [
{
"name": "claudecio/axiumphp",
"version": "dev-dev-update-initializing",
"version": "dev-feature-updated-router",
"source": {
"type": "git",
"url": "https://github.com/claudecio/AxiumPHP.git",
"reference": "ccc3c7de5462371150ea8d82549701519503f9f7"
"reference": "c7353947a667ea857b461f2b6251441784a4b8ef"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/claudecio/AxiumPHP/zipball/ccc3c7de5462371150ea8d82549701519503f9f7",
"reference": "ccc3c7de5462371150ea8d82549701519503f9f7",
"url": "https://api.github.com/repos/claudecio/AxiumPHP/zipball/c7353947a667ea857b461f2b6251441784a4b8ef",
"reference": "c7353947a667ea857b461f2b6251441784a4b8ef",
"shasum": ""
},
"require": {
@@ -35,10 +35,10 @@
],
"description": "Meu framework PHP para sistemas MVC modulares.",
"support": {
"source": "https://github.com/claudecio/AxiumPHP/tree/dev-update-initializing",
"source": "https://github.com/claudecio/AxiumPHP/tree/feature-updated-router",
"issues": "https://github.com/claudecio/AxiumPHP/issues"
},
"time": "2025-10-18T18:31:17+00:00"
"time": "2025-10-26T20:05:19+00:00"
},
{
"name": "firebase/php-jwt",

View File

@@ -687,4 +687,265 @@ INSERT INTO esocial.tab_06 (id, descricao, data_criacao, data_extincao) VALUES
(995, 'Bancos Centrais', NULL, NULL),
(997, 'Organizações Internacionais', NULL, NULL);
SELECT setval(pg_get_serial_sequence('esocial.tab_06','id'), (SELECT MAX(id) FROM esocial.tab_06));
SELECT setval(pg_get_serial_sequence('esocial.tab_06','id'), (SELECT MAX(id) FROM esocial.tab_06));
-- ===============================================================================================================
-- Tabela 09 - Tipos de arquivos do eSocial
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS esocial.tab_09 (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
codigo_xml VARCHAR(50) NOT NULL,
descricao VARCHAR(255) NOT NULL,
data_inicio DATE DEFAULT NULL,
data_fim DATE DEFAULT NULL
);
INSERT INTO esocial.tab_09 (id, codigo_xml, descricao, data_inicio, data_fim) VALUES
(1, 'S-1000', 'Informações do Empregador/Contribuinte/Órgão Público', '2014-01-01', NULL),
(2, 'S-1005', 'Tabela de Estabelecimentos, Obras ou Unidades de Órgãos Públicos', '2014-01-01', NULL),
(3, 'S-1010', 'Tabela de Rubricas', '2014-01-01', NULL),
(4, 'S-1020', 'Tabela de Lotações Tributárias', '2014-01-01', NULL),
(5, 'S-1070', 'Tabela de Processos Administrativos/Judiciais', '2014-01-01', NULL),
(6, 'S-1200', 'Remuneração de Trabalhador vinculado ao Regime Geral de Previd. Social', '2014-01-01', NULL),
(7, 'S-1202', 'Remuneração de Servidor vinculado ao Regime Próprio de Previd. Social', '2022-08-22', NULL),
(8, 'S-1207', 'Benefícios - Entes Públicos', '2022-08-22', NULL),
(9, 'S-1210', 'Pagamentos de Rendimentos do Trabalho', '2014-01-01', NULL),
(10, 'S-1260', 'Comercialização da Produção Rural Pessoa Física', '2014-01-01', NULL),
(11, 'S-1270', 'Contratação de Trabalhadores Avulsos Não Portuários', '2014-01-01', NULL),
(12, 'S-1280', 'Informações Complementares aos Eventos Periódicos', '2014-01-01', NULL),
(13, 'S-1298', 'Reabertura dos Eventos Periódicos', '2014-01-01', NULL),
(14, 'S-1299', 'Fechamento dos Eventos Periódicos', '2014-01-01', NULL),
(15, 'S-2190', 'Registro Preliminar de Trabalhador', '2014-01-01', NULL),
(16, 'S-2200', 'Cadastramento Inicial do Vínculo e Admissão/Ingresso de Trabalhador', '2014-01-01', NULL),
(17, 'S-2205', 'Alteração de Dados Cadastrais do Trabalhador', '2014-01-01', NULL),
(18, 'S-2206', 'Alteração de Contrato de Trabalho/Relação Estatutária', '2014-01-01', NULL),
(19, 'S-2210', 'Comunicação de Acidente de Trabalho', '2021-10-13', NULL),
(20, 'S-2220', 'Monitoramento da Saúde do Trabalhador', '2021-10-13', NULL),
(21, 'S-2221', 'Exame Toxicológico do Motorista Profissional Empregado', '2024-08-01', NULL),
(22, 'S-2230', 'Afastamento Temporário', '2014-01-01', NULL),
(23, 'S-2231', 'Cessão/Exercício em Outro Órgão', '2021-07-19', NULL),
(24, 'S-2240', 'Condições Ambientais do Trabalho - Agentes Nocivos', '2021-10-13', NULL),
(25, 'S-2298', 'Reintegração/Outros Provimentos', '2014-01-01', NULL),
(26, 'S-2299', 'Desligamento', '2014-01-01', NULL),
(27, 'S-2300', 'Trabalhador Sem Vínculo de Emprego/Estatutário - Início', '2014-01-01', NULL),
(28, 'S-2306', 'Trabalhador Sem Vínculo de Emprego/Estatutário - Alteração Contratual', '2014-01-01', NULL),
(29, 'S-2399', 'Trabalhador Sem Vínculo de Emprego/Estatutário - Término', '2014-01-01', NULL),
(30, 'S-2400', 'Cadastro de Beneficiário - Entes Públicos - Início', '2021-11-22', NULL),
(31, 'S-2405', 'Cadastro de Beneficiário - Entes Públicos - Alteração', '2021-11-22', NULL),
(32, 'S-2410', 'Cadastro de Benefício - Entes Públicos - Início', '2021-11-22', NULL),
(33, 'S-2416', 'Cadastro de Benefício - Entes Públicos - Alteração', '2021-11-22', NULL),
(34, 'S-2418', 'Reativação de Benefício - Entes Públicos', '2021-11-22', NULL),
(35, 'S-2420', 'Cadastro de Benefício - Entes Públicos - Término', '2021-11-22', NULL),
(36, 'S-2500', 'Processo Trabalhista', '2023-10-01', NULL),
(37, 'S-2501', 'Informações de Tributos Decorrentes de Processo Trabalhista', '2023-10-01', NULL),
(38, 'S-2555', 'Solicitação de Consolidação das Informações de Tributos Decorrentes de Processo Trabalhista', '2024-12-01', NULL),
(39, 'S-3000', 'Exclusão de Eventos', '2014-01-01', NULL),
(40, 'S-3500', 'Exclusão de Eventos - Processo Trabalhista', '2023-10-01', NULL),
(41, 'S-5001', 'Informações das Contribuições Sociais por Trabalhador', '2014-01-01', NULL),
(42, 'S-5002', 'Imposto de Renda Retido na Fonte por Trabalhador', '2014-01-01', NULL),
(43, 'S-5003', 'Informações do FGTS por Trabalhador', '2018-05-01', NULL),
(44, 'S-5011', 'Informações das Contribuições Sociais Consolidadas por Contribuinte', '2014-01-01', NULL),
(45, 'S-5012', 'Imposto de Renda Retido na Fonte Consolidado por Contribuinte', '2023-01-16', NULL),
(46, 'S-5013', 'Informações do FGTS Consolidadas por Contribuinte', '2018-05-01', NULL),
(47, 'S-5501', 'Informações Consolidadas de Tributos Decorrentes de Processo Trabalhista', '2023-10-01', NULL),
(48, 'S-5503', 'Informações do FGTS por Trabalhador em Processo Trabalhista', '2023-11-20', NULL),
(49, 'S-8200', 'Anotação Judicial do Vínculo', '2014-01-01', NULL),
(50, 'S-8299', 'Baixa Judicial do Vínculo', '2019-09-24', NULL);
SELECT setval(pg_get_serial_sequence('esocial.tab_09','id'), (SELECT MAX(id) FROM esocial.tab_09));
-- ===============================================================================================================
-- Tabela 20 - Tipos de Logradouros
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS esocial.tab_20 (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
codigo_xml VARCHAR(50) NOT NULL,
descricao VARCHAR(255) NOT NULL
);
INSERT INTO esocial.tab_20 (id, codigo_xml, descricao) VALUES
(1, 'A', 'Área'),
(2, 'AC', 'Acesso'),
(3, 'ACA', 'Acampamento'),
(4, 'ACL', 'Acesso Local'),
(5, 'AD', 'Adro'),
(6, 'AE', 'Área Especial'),
(7, 'AER', 'Aeroporto'),
(8, 'AL', 'Alameda'),
(9, 'ALD', 'Aldeia'),
(10, 'AMD', 'Avenida Marginal Direita'),
(11, 'AME', 'Avenida Marginal Esquerda'),
(12, 'AN', 'Anel Viário'),
(13, 'ANT', 'Antiga Estrada'),
(14, 'ART', 'Artéria'),
(15, 'AT', 'Alto'),
(16, 'ATL', 'Atalho'),
(17, 'A V', 'Área Verde'),
(18, 'AV', 'Avenida'),
(19, 'AVC', 'Avenida Contorno'),
(20, 'AVM', 'Avenida Marginal'),
(21, 'AVV', 'Avenida Velha'),
(22, 'BAL', 'Balneário'),
(23, 'BC', 'Beco'),
(24, 'BCO', 'Buraco'),
(25, 'BEL', 'Belvedere'),
(26, 'BL', 'Bloco'),
(27, 'BLO', 'Balão'),
(28, 'BLS', 'Blocos'),
(29, 'BLV', 'Bulevar'),
(30, 'BSQ', 'Bosque'),
(31, 'BVD', 'Boulevard'),
(32, 'BX', 'Baixa'),
(33, 'C', 'Cais'),
(34, 'CAL', 'Calçada'),
(35, 'CAM', 'Caminho'),
(36, 'CAN', 'Canal'),
(37, 'CH', 'Chácara'),
(38, 'CHA', 'Chapadão'),
(39, 'CIC', 'Ciclovia'),
(40, 'CIR', 'Circular'),
(41, 'CJ', 'Conjunto'),
(42, 'CJM', 'Conjunto Mutirão'),
(43, 'CMP', 'Complexo Viário'),
(44, 'COL', 'Colônia'),
(45, 'COM', 'Comunidade'),
(46, 'CON', 'Condomínio'),
(47, 'COND', 'Condomínio'),
(48, 'COR', 'Corredor'),
(49, 'CPO', 'Campo'),
(50, 'CRG', 'Córrego'),
(51, 'CTN', 'Contorno'),
(52, 'DSC', 'Descida'),
(53, 'DSV', 'Desvio'),
(54, 'DT', 'Distrito'),
(55, 'EB', 'Entre Bloco'),
(56, 'EIM', 'Estrada Intermunicipal'),
(57, 'ENS', 'Enseada'),
(58, 'ENT', 'Entrada Particular'),
(59, 'EQ', 'Entre Quadra'),
(60, 'ESC', 'Escada'),
(61, 'ESD', 'Escadaria'),
(62, 'ESE', 'Estrada Estadual'),
(63, 'ESI', 'Estrada Vicinal'),
(64, 'ESL', 'Estrada de Ligação'),
(65, 'ESM', 'Estrada Municipal'),
(66, 'ESP', 'Esplanada'),
(67, 'ESS', 'Estrada de Servidão'),
(68, 'EST', 'Estrada'),
(69, 'ESV', 'Estrada Velha'),
(70, 'ETA', 'Estrada Antiga'),
(71, 'ETC', 'Estação'),
(72, 'ETD', 'Estádio'),
(73, 'ETN', 'Estância'),
(74, 'ETP', 'Estrada Particular'),
(75, 'ETT', 'Estacionamento'),
(76, 'EVA', 'Evangélica'),
(77, 'EVD', 'Elevada'),
(78, 'EX', 'Eixo Industrial'),
(79, 'FAV', 'Favela'),
(80, 'FAZ', 'Fazenda'),
(81, 'FER', 'Ferrovia'),
(82, 'FNT', 'Fonte'),
(83, 'FRA', 'Feira'),
(84, 'FTE', 'Forte'),
(85, 'GAL', 'Galeria'),
(86, 'GJA', 'Granja'),
(87, 'HAB', 'Núcleo Habitacional'),
(88, 'IA', 'Ilha'),
(89, 'IGP', 'Igarapé'),
(90, 'IND', 'Indeterminado'),
(91, 'IOA', 'Ilhota'),
(92, 'JD', 'Jardim'),
(93, 'JDE', 'Jardinete'),
(94, 'LD', 'Ladeira'),
(95, 'LGA', 'Lagoa'),
(96, 'LGO', 'Lago'),
(97, 'LOT', 'Loteamento'),
(98, 'LRG', 'Largo'),
(99, 'LT', 'Lote'),
(100, 'MER', 'Mercado'),
(101, 'MNA', 'Marina'),
(102, 'MOD', 'Modulo'),
(103, 'MRG', 'Projeção'),
(104, 'MRO', 'Morro'),
(105, 'MTE', 'Monte'),
(106, 'NUC', 'Núcleo'),
(107, 'NUR', 'Núcleo Rural'),
(108, 'O', 'Outros'),
(109, 'OUT', 'Outeiro'),
(110, 'PAR', 'Paralela'),
(111, 'PAS', 'Passeio'),
(112, 'PAT', 'Pátio'),
(113, 'PC', 'Praça'),
(114, 'PCE', 'Praça de Esportes'),
(115, 'PDA', 'Parada'),
(116, 'PDO', 'Paradouro'),
(117, 'PNT', 'Ponta'),
(118, 'PR', 'Praia'),
(119, 'PRL', 'Prolongamento'),
(120, 'PRM', 'Parque Municipal'),
(121, 'PRQ', 'Parque'),
(122, 'PRR', 'Parque Residencial'),
(123, 'PSA', 'Passarela'),
(124, 'PSG', 'Passagem'),
(125, 'PSP', 'Passagem de Pedestre'),
(126, 'PSS', 'Passagem Subterrânea'),
(127, 'PTE', 'Ponte'),
(128, 'PTO', 'Porto'),
(129, 'Q', 'Quadra'),
(130, 'QTA', 'Quinta'),
(131, 'QTS', 'Quintas'),
(132, 'R', 'Rua'),
(133, 'R I', 'Rua Integração'),
(134, 'R L', 'Rua de Ligação'),
(135, 'R P', 'Rua Particular'),
(136, 'R V', 'Rua Velha'),
(137, 'RAM', 'Ramal'),
(138, 'RCR', 'Recreio'),
(139, 'REC', 'Recanto'),
(140, 'RER', 'Retiro'),
(141, 'RES', 'Residencial'),
(142, 'RET', 'Reta'),
(143, 'RLA', 'Ruela'),
(144, 'RMP', 'Rampa'),
(145, 'ROA', 'Rodo Anel'),
(146, 'ROD', 'Rodovia'),
(147, 'ROT', 'Rotula'),
(148, 'RPE', 'Rua de Pedestre'),
(149, 'RPR', 'Margem'),
(150, 'RTN', 'Retorno'),
(151, 'RTT', 'Rotatória'),
(152, 'SEG', 'Segunda Avenida'),
(153, 'SIT', 'Sitio'),
(154, 'SRV', 'Servidão'),
(155, 'ST', 'Setor'),
(156, 'SUB', 'Subida'),
(157, 'TCH', 'Trincheira'),
(158, 'TER', 'Terminal'),
(159, 'TR', 'Trecho'),
(160, 'TRV', 'Trevo'),
(161, 'TUN', 'Túnel'),
(162, 'TV', 'Travessa'),
(163, 'TVP', 'Travessa Particular'),
(164, 'TVV', 'Travessa Velha'),
(165, 'UNI', 'Unidade'),
(166, 'V', 'Via'),
(167, 'V C', 'Via Coletora'),
(168, 'V L', 'Via Local'),
(169, 'VAC', 'Via de Acesso'),
(170, 'VAL', 'Vala'),
(171, 'VCO', 'Via Costeira'),
(172, 'VD', 'Viaduto'),
(173, 'V-E', 'Via Expressa'),
(174, 'VER', 'Vereda'),
(175, 'VEV', 'Via Elevado'),
(176, 'VL', 'Vila'),
(177, 'VLA', 'Viela'),
(178, 'VLE', 'Vale'),
(179, 'VLT', 'Via Litorânea'),
(180, 'VPE', 'Via de Pedestre'),
(181, 'VRT', 'Variante'),
(182, 'ZIG', 'Zigue-Zague');
SELECT setval(pg_get_serial_sequence('esocial.tab_20','id'), (SELECT MAX(id) FROM esocial.tab_20));

View File

@@ -2,27 +2,19 @@
namespace AxiumPHP\Core;
use Exception;
use AxiumPHP\Helpers\RequestHelper;
class Router {
private static $routes = [];
private static $params = [];
private static $ROUTER_MODE = null;
private static $APP_SYS_MODE = null;
private static $ROUTER_ALLOWED_ORIGINS = ['*'];
private static string $basePath = '';
private static $currentGroupPrefix = '';
private static $currentGroupMiddlewares = [];
private static array $requiredConstants = [
'ROUTER_MODE',
'APP_SYS_MODE'
];
private static array $allowedHttpRequests = [
'GET',
'POST',
'PUT',
'PATCH',
'DELETE',
'OPTIONS'
];
private static $ROUTER_ALLOWED_ORIGINS = ['*'];
private static array $requiredConstants = ['ROUTER_MODE', 'APP_SYS_MODE'];
private static array $allowedHttpRequests = ['GET','POST','PUT','PATCH','DELETE','OPTIONS'];
/**
* Construtor que vai garantir que as constantes necessárias estejam definidas antes de
@@ -32,6 +24,11 @@
// Verificar as constantes no momento da criação da instância
self::checkRequiredConstant();
// Verifica se tem diretório base
if(defined(constant_name: 'ROUTER_BASE_PATH')) {
self::$basePath = ROUTER_BASE_PATH;
}
// Define constante
self::$ROUTER_MODE = strtoupper(string: ROUTER_MODE);
self::$APP_SYS_MODE = strtoupper(string: APP_SYS_MODE);
@@ -74,99 +71,26 @@
}
}
/**
* Adiciona uma rota com método GET à lista de rotas da aplicação.
*
* Este método é um atalho para adicionar rotas com o método HTTP GET. Ele
* chama o método `addRoute` internamente, passando os parâmetros
* fornecidos e o método 'GET'.
*
* @param string $uri O caminho da rota (ex: '/usuarios', '/produtos').
* @param array $handler Um array contendo o nome do controlador e o nome da ação
* que devem ser executados quando a rota for
* corresponder (ex: ['UsuarioController', 'index']).
* @param array $middlewares Um array opcional contendo os nomes dos middlewares que
* devem ser executados antes do handler da rota.
*
* @return void
*/
// =======================
// Métodos HTTP
// =======================
public static function GET(string $uri, array $handler, array $middlewares = []): void {
self::addRoute(method: "GET", uri: $uri, handler: $handler, middlewares: $middlewares);
}
/**
* Adiciona uma rota com método POST à lista de rotas da aplicação.
*
* Este método é um atalho para adicionar rotas com o método HTTP POST. Ele
* chama o método `addRoute` internamente, passando os parâmetros
* fornecidos e o método 'POST'.
*
* @param string $uri O caminho da rota (ex: '/usuarios', '/produtos').
* @param array $handler Um array contendo o nome do controlador e o nome da ação
* que devem ser executados quando a rota for
* corresponder (ex: ['UsuarioController', 'salvar']).
* @param array $middlewares Um array opcional contendo os nomes dos middlewares que
* devem ser executados antes do handler da rota.
*
* @return void
*/
public static function POST(string $uri, array $handler, array $middlewares = []): void {
self::addRoute(method: "POST", uri: $uri, handler: $handler, middlewares: $middlewares);
}
/**
* Adiciona uma rota com método PUT à lista de rotas da aplicação.
*
* Este método é um atalho para adicionar rotas com o método HTTP PUT. Ele
* chama o método `addRoute` internamente, passando os parâmetros
* fornecidos e o método 'PUT'.
*
* @param string $uri O caminho da rota (ex: '/usuarios', '/produtos').
* @param array $handler Um array contendo o nome do controlador e o nome da ação
* que devem ser executados quando a rota for
* corresponder (ex: ['UsuarioController', 'salvar']).
* @param array $middlewares Um array opcional contendo os nomes dos middlewares que
* devem ser executados antes do handler da rota.
*
* @return void
*/
public static function PUT(string $uri, array $handler, array $middlewares = []): void {
self::addRoute(method: "PUT", uri: $uri, handler: $handler, middlewares: $middlewares);
}
/**
* Adiciona uma nova rota que responde a requisições PATCH.
*
* Este é um método estático de conveniência que simplifica o registro de rotas
* para o método HTTP PATCH. Ele delega a tarefa principal para o método
* privado `addRoute`, passando o método HTTP, a URI, a função de manipulação
* (`handler`) e quaisquer middlewares associados.
*
* @param string $uri A URI da rota (ex: '/api/resource/{id}').
* @param array $handler Um array de dois elementos que define o manipulador da rota: o nome da classe do controlador e o nome do método a ser executado.
* @param array $middlewares Um array opcional de middlewares a serem executados antes do manipulador da rota.
* @return void
*/
public static function PATCH(string $uri, array $handler, array $middlewares = []): void {
self::addRoute(method: "PATCH", uri: $uri, handler: $handler, middlewares: $middlewares);
}
/**
* Adiciona uma rota com método DELETE à lista de rotas da aplicação.
*
* Este método é um atalho para adicionar rotas com o método HTTP DELETE. Ele
* chama o método `addRoute` internamente, passando os parâmetros
* fornecidos e o método 'DELETE'.
*
* @param string $uri O caminho da rota (ex: '/usuarios', '/produtos').
* @param array $handler Um array contendo o nome do controlador e o nome da ação
* que devem ser executados quando a rota for
* corresponder (ex: ['UsuarioController', 'salvar']).
* @param array $middlewares Um array opcional contendo os nomes dos middlewares que
* devem ser executados antes do handler da rota.
*
* @return void
*/
public static function DELETE(string $uri, array $handler, array $middlewares = []): void {
self::addRoute(method: "DELETE", uri: $uri, handler: $handler, middlewares: $middlewares);
}
@@ -189,7 +113,7 @@
* @return void
*/
private static function addRoute(string $method, string $uri, array $handler, array $middlewares = []): void {
self::$routes[] = [
self::$routes[$method][] = [
'method' => strtoupper(string: $method),
'path' => '/' . trim(string: self::$currentGroupPrefix . '/' . trim(string: $uri, characters: '/'), characters: '/'),
'controller' => $handler[0],
@@ -198,6 +122,46 @@
];
}
/**
* Redireciona para um caminho específico.
*
* Este método estático constrói uma URL de redirecionamento com base no
* caminho fornecido e no `basePath` configurado. Ele garante que o
* `basePath` e o `path` comecem com uma barra (`/`), monta a URL
* completa, limpa quaisquer duplicações de barras e executa o
* redirecionamento HTTP.
*
* @param string|null $path O caminho para o qual redirecionar. Se nulo ou vazio,
* redireciona para o `basePath`.
*
* @return void
*/
public static function redirect(?string $path): void {
// Garante que o basePath começa com "/"
$basePath = self::$basePath ? '/' . trim(string: self::$basePath, characters: '/') : '/';
// Se não tiver caminho, redireciona pro basePath direto
if (empty($path)) {
header(header: "Location: {$basePath}/");
exit;
}
// Garante que o path começa com "/"
if (!str_starts_with(haystack: $path, needle: '/')) {
$path = "/{$path}";
}
// Monta o destino completo
$redirectPath = "{$basePath}{$path}";
// Limpa duplicações tipo "//"
$redirectPath = preg_replace(pattern: '#/+#', replacement: '/', subject: $redirectPath);
// Executa o redirecionamento
header(header: "Location: {$redirectPath}");
exit;
}
/**
* Verifica se um caminho de rota corresponde a um caminho de requisição.
*
@@ -497,6 +461,50 @@
return $preparedParams;
}
/**
* Exibe a página de erro 404 (Página não encontrada).
*
* Este método estático define o código de resposta HTTP como 404 e renderiza
* a view "/Errors/404" para exibir a página de erro. Após a renderização,
* o script é encerrado.
*
* @return void
*/
private static function pageNotFound(): void {
switch (self::$ROUTER_MODE) {
case 'VIEW':
// Notifica erro em caso constante não definida
if(!defined(constant_name: 'ERROR_404_VIEW_PATH')) {
RequestHelper::sendJsonResponse(
response_code: 500,
status: 'error',
message: "Constante 'ERROR_404_VIEW_PATH' não foi definida."
);
}
// Caso o arquivo da constante não exista, notifica erro
if(!file_exists(filename: ERROR_404_VIEW_PATH)) {
RequestHelper::sendJsonResponse(
response_code: 500,
status: 'error',
message: "Arquivo da constante 'ERROR_404_VIEW_PATH' não foi encontrado."
);
}
http_response_code(response_code: 404);
require_once ERROR_404_VIEW_PATH;
break;
case 'JSON':
RequestHelper::sendJsonResponse(
response_code: 404,
status: 'error',
message: "Página não encontrada."
);
break;
}
}
/**
* Despacha a requisição para o controlador e ação correspondentes.
*
@@ -513,10 +521,21 @@
// Verificar as constantes necessárias antes de processar a requisição
self::checkRequiredConstant();
// Inicializa dados da requisição
$requestData = null;
$method = $_SERVER['REQUEST_METHOD'];
$uri = parse_url(url: $_SERVER['REQUEST_URI'], component: PHP_URL_PATH);
$uri = trim(string: rtrim(string: $uri, characters: '/'), characters: '/');
// Remove o basePath do início da URI (se tiver)
$basePath = rtrim(string: self::$basePath ?? '', characters: '/');
if (!empty($basePath) && str_starts_with(haystack: $uri, needle: $basePath)) {
$uri = substr(string: $uri, offset: strlen(string: $basePath));
}
// Limpa possíveis barras extras
$uri = trim(string: $uri, characters: '/');
// Suporte ao _method em POST para PUT/DELETE/PATCH
if ($method === 'POST' && isset($_POST['_method'])) {
$method = strtoupper(string: $_POST['_method']);
@@ -524,13 +543,11 @@
// Verifica se o método HTTP é permitido
if(!in_array(needle: $method, haystack: self::$allowedHttpRequests)) {
http_response_code(response_code: 405);
header(header: 'Content-Type: application/json; charset=utf-8');
echo json_encode(value: [
"status" => 'error',
"message" => "Método HTTP '{$method}' não permitido."
]);
exit;
RequestHelper::sendJsonResponse(
response_code: 405,
status: 'error',
message: "Método HTTP '{$method}' não permitido."
);
}
// =============================
@@ -572,43 +589,54 @@
// =============================
// EXTRAI DADOS DE PUT, DELETE, PATCH
// =============================
$requestData = match($method) {
'GET' => null,
'POST' => null,
default => self::extractRequestData(method: $method)
};
if(in_array(needle: $method, haystack: ['PUT', 'DELETE', 'PATCH'])) {
$requestData = self::extractRequestData(method: $method);
}
// Seleciona apenas as rotas do método atual
$routes = self::$routes[$method] ?? [];
// =============================
// LOOP PARA PROCESSAR ROTAS
// =============================
foreach (self::$routes as $route) {
if (self::matchRoute(method: $method, uri: $uri, route: $route)) {
// Executa middlewares
if (!empty($route['middlewares']) && !self::runMiddlewares(middlewares: $route['middlewares'])) {
return; // Middleware bloqueou
}
if(!empty($routes)) {
foreach ($routes as $route) {
if (self::matchRoute(method: $method, uri: $uri, route: $route)) {
// Executa middlewares
if (!empty($route['middlewares']) && !self::runMiddlewares(middlewares: $route['middlewares'])) {
return; // Middleware bloqueou
}
$controller = new $route['controller']();
$action = $route['action'];
$params = self::prepareMethodParameters(method: $method, params: [$requestData]);
$controller = new $route['controller']();
$action = $route['action'];
$params = self::prepareMethodParameters(method: $method, params: [$requestData]);
switch (self::$ROUTER_MODE) {
case 'VIEW':
if (method_exists(object_or_class: $controller, method: $action)) {
http_response_code(response_code: 200);
call_user_func_array(callback: [$controller, $action], args: $params);
exit;
}
break;
switch (self::$ROUTER_MODE) {
case 'VIEW':
if (method_exists(object_or_class: $controller, method: $action)) {
http_response_code(response_code: 200);
call_user_func_array(callback: [$controller, $action], args: $params);
exit;
}
break;
case 'JSON':
if (method_exists(object_or_class: $controller, method: $action)) {
http_response_code(response_code: 200);
header(header: 'Content-Type: application/json; charset=utf-8');
call_user_func_array(callback: [$controller, $action], args: $params);
exit;
}
break;
case 'JSON':
if (method_exists(object_or_class: $controller, method: $action)) {
http_response_code(response_code: 200);
header(header: 'Content-Type: application/json; charset=utf-8');
call_user_func_array(callback: [$controller, $action], args: $params);
exit;
}
break;
default:
RequestHelper::sendJsonResponse(
response_code: 500,
status: 'error',
message: "Modo de roteamento inválido."
);
break;
}
}
}
}
@@ -619,54 +647,4 @@
self::pageNotFound();
exit;
}
/**
* Exibe a página de erro 404 (Página não encontrada).
*
* Este método estático define o código de resposta HTTP como 404 e renderiza
* a view "/Errors/404" para exibir a página de erro. Após a renderização,
* o script é encerrado.
*
* @return void
*/
private static function pageNotFound(): void {
switch (self::$ROUTER_MODE) {
case 'VIEW':
// Notifica erro em caso constante não definida
if(!defined(constant_name: 'ERROR_404_VIEW_PATH')) {
http_response_code(response_code: 500);
header(header: 'Content-Type: application/json; charset=utf-8');
echo json_encode( value: [
"status" => 'error',
"message" => "Constante 'ERROR_404_VIEW_PATH' não foi definida.",
]);
exit;
}
// Caso o arquivo da constante não exista, notifica erro
if(!file_exists(filename: ERROR_404_VIEW_PATH)) {
http_response_code(response_code: 500);
header(header: 'Content-Type: application/json; charset=utf-8');
echo json_encode( value: [
"status" => 'error',
"message" => "Arquivo da constante 'ERROR_404_VIEW_PATH' não foi encontrado.",
]);
exit;
}
http_response_code(response_code: 404);
require_once ERROR_404_VIEW_PATH;
break;
case 'JSON':
http_response_code(response_code: 404);
header(header: 'Content-Type: application/json; charset=utf-8');
echo json_encode( value: [
"status" => 'error',
"message" => "Página não encontrada.",
]);
break;
}
}
}

View File

@@ -2,24 +2,24 @@
"packages": [
{
"name": "claudecio/axiumphp",
"version": "dev-dev-update-initializing",
"version_normalized": "dev-dev-update-initializing",
"version": "dev-feature-updated-router",
"version_normalized": "dev-feature-updated-router",
"source": {
"type": "git",
"url": "https://github.com/claudecio/AxiumPHP.git",
"reference": "ccc3c7de5462371150ea8d82549701519503f9f7"
"reference": "c7353947a667ea857b461f2b6251441784a4b8ef"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/claudecio/AxiumPHP/zipball/ccc3c7de5462371150ea8d82549701519503f9f7",
"reference": "ccc3c7de5462371150ea8d82549701519503f9f7",
"url": "https://api.github.com/repos/claudecio/AxiumPHP/zipball/c7353947a667ea857b461f2b6251441784a4b8ef",
"reference": "c7353947a667ea857b461f2b6251441784a4b8ef",
"shasum": ""
},
"require": {
"php": ">=8.1",
"vlucas/phpdotenv": "v5.6.2"
},
"time": "2025-10-18T18:31:17+00:00",
"time": "2025-10-26T20:05:19+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -32,7 +32,7 @@
],
"description": "Meu framework PHP para sistemas MVC modulares.",
"support": {
"source": "https://github.com/claudecio/AxiumPHP/tree/dev-update-initializing",
"source": "https://github.com/claudecio/AxiumPHP/tree/feature-updated-router",
"issues": "https://github.com/claudecio/AxiumPHP/issues"
},
"install-path": "../claudecio/axiumphp"

View File

@@ -3,7 +3,7 @@
'name' => 'cybercore/workbloom',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'reference' => '311cadc1d12a6f269a473c6861dfc268a201ef6f',
'reference' => '9cfa79db4b2f3aca5feab04bb1212cf87d9a8565',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -11,9 +11,9 @@
),
'versions' => array(
'claudecio/axiumphp' => array(
'pretty_version' => 'dev-dev-update-initializing',
'version' => 'dev-dev-update-initializing',
'reference' => 'ccc3c7de5462371150ea8d82549701519503f9f7',
'pretty_version' => 'dev-feature-updated-router',
'version' => 'dev-feature-updated-router',
'reference' => 'c7353947a667ea857b461f2b6251441784a4b8ef',
'type' => 'library',
'install_path' => __DIR__ . '/../claudecio/axiumphp',
'aliases' => array(),
@@ -22,7 +22,7 @@
'cybercore/workbloom' => array(
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'reference' => '311cadc1d12a6f269a473c6861dfc268a201ef6f',
'reference' => '9cfa79db4b2f3aca5feab04bb1212cf87d9a8565',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),