Initial commit

This commit is contained in:
2025-08-08 22:13:35 -03:00
commit fabcc296ff
12 changed files with 964 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

68
README.md Normal file
View File

@@ -0,0 +1,68 @@
# Sistema de Ramais Telefônicos
Plugin WordPress para gerenciar e exibir ramais telefônicos com busca, filtros e paginação.
## Funcionalidades
- Exibição de lista de ramais com filtros por Secretaria, Setor e busca por texto
- Paginação dos resultados
- Adição de novos ramais via painel administrativo
- Armazenamento dos dados em arquivo CSV
- Shortcode para exibição em páginas ou posts
- Interface responsiva e amigável
## Instalação
1. Faça upload da pasta `ramais-telefonicos` para o diretório `wp-content/plugins/` do seu WordPress.
2. Certifique-se de que o arquivo de dados `bancodados.csv` está localizado em:
```
wp-content/uploads/ramais-telefonicos/bancodados.csv
```
> O plugin cria automaticamente o diretório e o arquivo na primeira ativação, se não existirem.
3. Ative o plugin no painel do WordPress.
## Uso
### Shortcode
Adicione o shortcode abaixo em qualquer página ou post para exibir a lista de ramais:
```
[lista_ramais]
```
Você pode definir o número de ramais por página:
```
[lista_ramais per_page="10"]
```
### Painel Administrativo
- Acesse o menu **Ramais** no painel do WordPress para adicionar novos ramais.
## Estrutura dos Dados
O arquivo `bancodados.csv` deve conter as seguintes colunas:
- ramal
- responsavel
- secretaria
- setor
- email
O plugin gerencia automaticamente a leitura e escrita neste arquivo.
## Localização do Arquivo CSV
O arquivo de dados deve estar em:
```
wp-content/uploads/ramais-telefonicos/bancodados.csv
```
## Dependências
- WordPress 5.0 ou superior
- PHP 7.2 ou superior
## Créditos
Desenvolvido por Marco Antonio Vivas.
---
Para dúvidas ou sugestões, abra uma issue ou entre em contato.

View File

@@ -0,0 +1,16 @@
.wrap h1 {
margin-bottom: 20px;
}
.form-table th {
width: 200px;
}
.form-table input.regular-text {
width: 100%;
max-width: 400px;
}
.notice {
margin: 5px 0 15px;
}

116
assets/css/ramais.css Normal file
View File

@@ -0,0 +1,116 @@
.ramais-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}
.ramais-filtros {
display: flex;
gap: 15px;
margin-bottom: 20px;
flex-wrap: wrap;
}
.ramais-filtros input,
.ramais-filtros select {
flex: 1;
min-width: 200px;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
}
.ramais-filtros input:focus,
.ramais-filtros select:focus {
outline: none;
border-color: #2271b1;
box-shadow: 0 0 0 1px #2271b1;
}
.ramais-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
.ramais-table th,
.ramais-table td {
padding: 12px 15px;
text-align: left;
border-bottom: 1px solid #ddd;
}
.ramais-table th {
background-color: #f5f5f5;
font-weight: 600;
}
.ramais-table tr:hover {
background-color: #f9f9f9;
}
.ramais-table a {
color: #2271b1;
text-decoration: none;
}
.ramais-table a:hover {
text-decoration: underline;
}
.ramais-no-results,
.ramais-loading,
.ramais-error {
padding: 20px;
text-align: center;
background-color: #f5f5f5;
border-radius: 4px;
margin: 20px 0;
color: #666;
}
.ramais-pagination {
display: flex;
justify-content: center;
gap: 5px;
margin-top: 20px;
}
.ramais-page-link {
padding: 8px 12px;
background-color: #f5f5f5;
border-radius: 4px;
text-decoration: none;
color: #333;
}
.ramais-page-link:hover {
background-color: #e5e5e5;
}
.ramais-page-link.active {
background-color: #2271b1;
color: white;
}
@media (max-width: 768px) {
.ramais-filtros {
flex-direction: column;
}
.ramais-filtros input,
.ramais-filtros select {
width: 100%;
}
.ramais-table {
font-size: 14px;
}
.ramais-table th,
.ramais-table td {
padding: 8px 10px;
}
}

58
assets/js/ramais.js Normal file
View File

@@ -0,0 +1,58 @@
jQuery(document).ready(function($) {
const debounceDelay = 300;
let debounceTimer;
function filterRamais(page = 1) {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
const search = $('#ramais-search').val();
const secretaria = $('#ramais-secretaria').val();
const setor = $('#ramais-setor').val();
$('.ramais-results').html('<p class="ramais-loading"><?php _e("Carregando...", "ramais-telefonicos"); ?></p>');
$.ajax({
url: ramaisVars.ajaxurl,
type: 'POST',
data: {
action: 'filtrar_ramais',
nonce: ramaisVars.nonce,
search: search,
secretaria: secretaria,
setor: setor,
page: page
},
success: function(response) {
if (response.success) {
$('.ramais-results').html(response.data);
} else {
$('.ramais-results').html('<p class="ramais-error"><?php _e("Erro ao carregar dados.", "ramais-telefonicos"); ?></p>');
}
},
error: function() {
$('.ramais-results').html('<p class="ramais-error"><?php _e("Erro na comunicação com o servidor.", "ramais-telefonicos"); ?></p>');
}
});
}, debounceDelay);
}
// Eventos de filtro
$('#ramais-search').on('input', function() {
filterRamais(1);
});
$('#ramais-secretaria, #ramais-setor').on('change', function() {
filterRamais(1);
});
// Paginação
$(document).on('click', '.ramais-page-link', function(e) {
e.preventDefault();
const page = $(this).data('page');
filterRamais(page);
});
// Carregamento inicial
filterRamais(1);
});

161
basedados/bancodados.csv Normal file
View File

@@ -0,0 +1,161 @@
ramal,responsavel,secretaria,setor,email
98812-3776,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL CAPITÃO MORBELLO VENDRAMINI",morbellovendramini@seduc.trescoracoes.mg.gov.br
98802-4602,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL MARIA JOSÉ COELHO NETO",coelhoneto@seduc.trescoracoes.mg.gov.br
98868-9155,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL RIO DO PEIXE II",riodopeixe@seduc.trescoracoes.mg.gov.br
99161-3141,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL RIO DO PEIXE II (SEGUNDO ENDEREÇO FAZENDA COBIÇA)",oneidajunqueira@seduc.trescoracoes.mg.gov.br
98802-4145,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL PROFESSORA MARIA EVANI GOMES TELES",mariaevani@seduc.trescoracoes.mg.gov.br
98861-4948,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL SAGRADO CORAÇÃO DE JESUS",sagradocoracao@seduc.trescoracoes.mg.gov.br
98821-2543,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL PROFESSORA CÂNDIDA JUNQUEIRA",caic@seduc.trescoracoes.mg.gov.br
98802-3451,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL PROFESSORA HENRIQUETA GOMES",henriquetagomes@seduc.trescoracoes.ng.gov.br
98812-3158,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL JOSÉ JOAQUIM ALVES PEREIRA",josejoaquim@seduc.trescoracoes.mg.gov.br
98821-8541,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL NELSON REZENDE FONSECA",nelsonrezende@seduc.trescoracoes.mg.gov.br
98812-4391,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL PREFEITO CELSO BANDA",celsobanda@seduc.trescoracoes.mg.gov.br
98812-4850,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL ROTARY",rotary@seduc.trescoracoes.mg.gov.br
98861-2693,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL DONA MARIA LAURA",marialaura@seduc.trescoracoes.mg.gov.br
98861-2496,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL ZILAH REZENDE PINTO",zilahrezende@seduc.trescoracoes.mg.gov.br
98802-6284,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL MONSENHOR JOSÉ GUIMARÃES FONSECA",monsenhor@seduc.trescoracoes.mg.gov.br
98821-6760,Daniel Santos Ribeiro,SEDUC,"ESCOLA MUNICIPAL PROFESSOR OSCAR FRATTINI AMZALACK",oscarfrattini@seduc.trescoracoes.mg.gov.br
98802-6116,Daniel Santos Ribeiro,SEDUC,"CEMEI AFONSINA FONSECA MUSA",afonsinamusa@seduc.trescoracoes.mg.gov.br
98802-1391,Daniel Santos Ribeiro,SEDUC,"CEMEI MARISTELA MELIATO I",maristelameliato@seduc.trescoracoes.mg.gov.br
98802-4952,Daniel Santos Ribeiro,SEDUC,"CEMEI MARISTELA MELIATO II",maristelameliato2@seduc.trescoracoes.mg.gov.br
98821-7675,Daniel Santos Ribeiro,SEDUC,"CEMEI PROFESSOR JOSÉ DOS SANTOS NETO",joseneto@seduc.trescoracoes.mg.gov.br
98802-6395,Daniel Santos Ribeiro,SEDUC,"CEMEI PROFESSOR JOSÉ MARIA FERREIRA MACIEL",josemaciel@seduc.trescoracoes.mg.gov.br
98861-2467,Daniel Santos Ribeiro,SEDUC,"CEMEI PROFESSORA JOANA BRANCA NASCIMENTO",joanabranca@seduc.trescoracoes.mg.gov.br
98802-6236,Daniel Santos Ribeiro,SEDUC,"CEMEI PROFESSORA TEREZINHA APARECIDA VILELA POMPEU",terezinhapompeu@seduc.trescoracoes.mg.gov.br
98802-6548,Daniel Santos Ribeiro,SEDUC,"CEMEI STEFANIA FALCÃO MARGOTTI",margotti@seduc.trescoracoes.mg.gov.br
98802-3693,Daniel Santos Ribeiro,SEDUC,"CEMEI PROFESSOR JÚLIO BRENO NASCIMENTO",juliobreno@seduc.trescoracoes.mg.gov.br
98812-5036,Daniel Santos Ribeiro,SEDUC,INFORMÁTICA,informatica@seduc.trescoracoes.mg.gov.br
99812-4265,Daniel Santos Ribeiro,SEDUC,"REDE FÍSICA, MATERIAIS DIDÁTICOS E PATRIMÔNIO",redefisica@seduc.trescoracoes.mg.gov.br
3691-1141,Daniel Santos Ribeiro,SEDUC,"CENTRO DE REFERÊNCIA DO PROFESSOR - UNIDADE DE CURSOS E IMPRESSÃO",impressao@seduc.trescoracoes.mg.gov.br
3691-1093,Daniel Santos Ribeiro,SEDUC,"CENTRO DE REFERÊNCIA DO PROFESSOR - UNIDADE ADMINISTRATIVA, CERTIFICADOS, PROJETOS E CONVÊNIOS",capacitacao@seduc.trescoracoes.mg.gov.br
98812-4432,Daniel Santos Ribeiro,SEDUC,"TRANSPORTE ESCOLAR (PREFEITURA)",transporte@seduc.trescoracoes.mg.gov.br
98812-4303,Daniel Santos Ribeiro,SEDUC,"MERENDA ESCOLAR",merenda@seduc.trescoracoes.mg.gov.br
98861-4418,Daniel Santos Ribeiro,SEDUC,"ESCRITURAÇÃO ESCOLAR",escrituracao@seduc.trescoracoes.mg.gov.br
98802-5428,Daniel Santos Ribeiro,SEDUC,GABINETE,gabinete@seduc.trescoracoes.mg.gov.br
98802-5428,Daniel Santos Ribeiro,SEDUC,"CONTROLE INTERNO",interno@seduc.trescoracoes.mg.gov.br
98812-3386,Daniel Santos Ribeiro,SEDUC,"PEDAGÓGICO I - ADMINISTRATIVO",supervisao.escolar@seduc.trescoracoes.mg.gov.br
98812-4542,Daniel Santos Ribeiro,SEDUC,"PEDAGÓGICO II - EQUIPE GIDE E ATENDIMENTO AOS GESTORES ESCOLARES",inspecao.escolar@seduc.trescoracoes.mg.gov.br
98821-6328,Daniel Santos Ribeiro,SEDUC,"GESTÃO DE PESSOAL",pessoal@seduc.trescoracoes.mg.gov.br
98802-5428,Daniel Santos Ribeiro,SEDUC,CONTABILIDADE,contabilidade@seduc.trescoracoes.mg.gov.br
98812-4304,Daniel Santos Ribeiro,SEDUC,"NÚCLEO PSICOSSOCIAL E AGENDAMENTOS AO ESTUDANTE - CIEC",nucleopsicossocial@seduc.trescoracoes.mg.gov.br
98861-4081,Rachid Gadbem Neto,SEMS,"ATENÇÃO PRIMÁRIA",coordapsaudetc@gmail.com
3239-7178,Rachid Gadbem Neto,SEMS,COMPRAS,comprassaudepmtc@yahoo.com.br
98821-6013,Rachid Gadbem Neto,SEMS,COMPRAS,comprassaudepmtc@yahoo.com.br
98821-3875,Rachid Gadbem Neto,SEMS,FATURAMENTO,info@trescoracoes.mg.gov.br
98812-4997,Rachid Gadbem Neto,SEMS,"CEM - CENTRO DE ESPECIALIDADES MÉDICAS",info@trescoracoes.mg.gov.br
98812-4423,Rachid Gadbem Neto,SEMS,"VIGILÂNCIA SANITÁRIA",epidemiologiatc@gmail.com
3691-1065,Rachid Gadbem Neto,SEMS,"VIGILÂNCIA EPIDEMIOLÓGICA",epidemiologiatc@gmail.com
98821-8538,Rachid Gadbem Neto,SEMS,"VIGILÂNCIA EPIDEMIOLÓGICA",epidemiologiatc@gmail.com
98802-3481,Rachid Gadbem Neto,SEMS,"RAIO-X",info@trescoracoes.mg.gov.br
98821-5580,Rachid Gadbem Neto,SEMS,"ESF AMADEU MIGUEL",info@trescoracoes.mg.gov.br
988215554,Rachid Gadbem Neto,SEMS,"ESF BOA VENTURA",info@trescoracoes.mg.gov.br
98821-5310,Rachid Gadbem Neto,SEMS,"ESF CAIC",info@trescoracoes.mg.gov.br
98821-4120,Rachid Gadbem Neto,SEMS,"ESF CINTURÃO VERDE",info@trescoracoes.mg.gov.br
98821-4607,Rachid Gadbem Neto,SEMS,"ESF COLINAS I",info@trescoracoes.mg.gov.br
98821-7515,Rachid Gadbem Neto,SEMS,"ESF COLINAS II",info@trescoracoes.mg.gov.br
98821-4285,Rachid Gadbem Neto,SEMS,"ESF COLINAS III",info@trescoracoes.mg.gov.br
98812-2749,Rachid Gadbem Neto,SEMS,"ESF FÁTIMA I",info@trescoracoes.mg.gov.br
98821-5532,Rachid Gadbem Neto,SEMS,"ESF FLORA",info@trescoracoes.mg.gov.br
98821-6016,Rachid Gadbem Neto,SEMS,"ESF JARDIM PARAÍSO",info@trescoracoes.mg.gov.br
98821-4829,Rachid Gadbem Neto,SEMS,"ESF MONTE ALEGRE I",info@trescoracoes.mg.gov.br
98821-4783,Rachid Gadbem Neto,SEMS,"ESF MONTE ALEGRE II",info@trescoracoes.mg.gov.br
98821-4269,Rachid Gadbem Neto,SEMS,"ESF NOVO HORIZONTE",info@trescoracoes.mg.gov.br
98821-4287,Rachid Gadbem Neto,SEMS,"ESF RIO DO PEIXE",info@trescoracoes.mg.gov.br
98821-5569,Rachid Gadbem Neto,SEMS,"ESF SÃO PEDRO",info@trescoracoes.mg.gov.br
98861-3574,Rachid Gadbem Neto,SEMS,"UBS NOVA TRÊS CORAÇÕES",info@trescoracoes.mg.gov.br
988218990,Rachid Gadbem Neto,SEMS,"CER IV",info@trescoracoes.mg.gov.br
98821-5772,Rachid Gadbem Neto,SEMS,"CEO - CENTRO DE ESPECIALIDADES ODONTOLÓGICAS",info@trescoracoes.mg.gov.br
98802-3591,Rachid Gadbem Neto,SEMS,"CEO - CENTRO DE ESPECIALIDADES ODONTOLÓGICAS (WhatsApp)",info@trescoracoes.mg.gov.br
98812-3631,Rachid Gadbem Neto,SEMS,"COORDENAÇÃO SETOR ODONTOLOGIA - SEMS",coordenaodontotc@gmail.com
98821-5837,Rachid Gadbem Neto,SEMS,"CAP II",capsdoistc@gmail.com
3691-1075,Rachid Gadbem Neto,SEMS,"CAP AD",capsad.sems@trescoracoes.mg.gov.br
98861-3281,Rachid Gadbem Neto,SEMS,"CAP AD",capsad.sems@trescoracoes.mg.gov.br
98821-2372,Rachid Gadbem Neto,SEMS,"CAP IJ",capsijtc@gmail.com
98861-2610,Rachid Gadbem Neto,SEMS,"FARMÁCIA DE ALTO CUSTO",info@trescoracoes.mg.gov.br
98812-2251,Rachid Gadbem Neto,SEMS,"ASSISTÊNCIA FARMACÊUTICA",info@trescoracoes.mg.gov.br
3232-4051,Rachid Gadbem Neto,SEMS,"FARMÁCIA DE MINAS",info@trescoracoes.mg.gov.br
98821-9221,Rachid Gadbem Neto,SEMS,"REGULAÇÃO / TFD",info@trescoracoes.mg.gov.br
3239-7176,Lisa Paula de Andrade Vilela,SEDESO,"SEDE DA SECRETARIA",info@trescoracoes.mg.gov.br
98812-4165,Lisa Paula de Andrade Vilela,SEDESO,"SEDE DA SECRETARIA",info@trescoracoes.mg.gov.br
98821-9488,Lisa Paula de Andrade Vilela,SEDESO,"AUXILIO BRASIL / BOLSA FAMILIA",info@trescoracoes.mg.gov.br
3691-7139,Lisa Paula de Andrade Vilela,SEDESO,"ABRIGO MUNICIPAL - UNIDADE I",info@trescoracoes.mg.gov.br
3239-7138,Lisa Paula de Andrade Vilela,SEDESO,"ALMOXARIFADO - SEDESO",info@trescoracoes.mg.gov.br
3239-7139,Lisa Paula de Andrade Vilela,SEDESO,"CASA DE PASSAGEM",info@trescoracoes.mg.gov.br
3691-1167,Lisa Paula de Andrade Vilela,SEDESO,"CONSELHO TUTELAR",info@trescoracoes.mg.gov.br
98861-4077,Lisa Paula de Andrade Vilela,SEDESO,"CONSELHO TUTELAR (Plantão após expediente)",info@trescoracoes.mg.gov.br
98821-7973,Lisa Paula de Andrade Vilela,SEDESO,"CONSELHO TUTELAR (Plantão aos finais de semana)",info@trescoracoes.mg.gov.br
98821-6768,Lisa Paula de Andrade Vilela,SEDESO,"CENTRO DE CONVIVÊNCIA DO IDOSO",info@trescoracoes.mg.gov.br
98821-4839,Lisa Paula de Andrade Vilela,SEDESO,"CENTRO DE CONVIVÊNCIA DO CURUMIM",info@trescoracoes.mg.gov.br
3234-3015,Lisa Paula de Andrade Vilela,SEDESO,"CRAS - JARDIM PARAISO",info@trescoracoes.mg.gov.br
98821-7293,Lisa Paula de Andrade Vilela,SEDESO,"CRAS - JARDIM PARAISO",info@trescoracoes.mg.gov.br
98821-9467,Lisa Paula de Andrade Vilela,SEDESO,"CRAS - PARQUE JUSSARA",info@trescoracoes.mg.gov.br
3691-1098,Lisa Paula de Andrade Vilela,SEDESO,"CRAS - RIO DO PEIXE",info@trescoracoes.mg.gov.br
98821-7013,Lisa Paula de Andrade Vilela,SEDESO,"CRAS - RIO DO PEIXE",info@trescoracoes.mg.gov.br
3232-8351,Lisa Paula de Andrade Vilela,SEDESO,"CREAS - UNIDADE CENTRO DE REFERÊNCIA ESPECIALIZADO DE ASSISTÊNCIA SOCIAL",info@trescoracoes.mg.gov.br
98812-3041,Lisa Paula de Andrade Vilela,SEDESO,"CREAS - UNIDADE CENTRO DE REFERÊNCIA ESPECIALIZADO DE ASSISTÊNCIA SOCIAL",info@trescoracoes.mg.gov.br
3239-7100,Alexsandro Henrique de Souza,SARH,"RECEPÇÃO GERAL",recepcao.geral@trescoracoes.mg.gov.br
3239-7147,Alexsandro Henrique de Souza,SARH,"RECEPÇÃO SARH",recepcao.sarh@trescoracoes.mg.gov.br
98802-0475,Alexsandro Henrique de Souza,SARH,"RECEPÇÃO SARH",recepcao.sarh2@trescoracoes.mg.gov.br
98821-4273,Alexsandro Henrique de Souza,SARH,"RECEPÇÃO SARH",recepcao.sarh3@trescoracoes.mg.gov.br
3239-7141,Alexsandro Henrique de Souza,SARH,"FOLHA DE PAGAMENTO",folha.pagamento@trescoracoes.mg.gov.br
3239-7143,Alexsandro Henrique de Souza,SARH,"BENEFÍCIOS, ATOS E DOCUMENTOS",beneficios@trescoracoes.mg.gov.br
3239-7146,Alexsandro Henrique de Souza,SARH,"GP - GESTÃO DE PESSOAS",gestao.pessoas@trescoracoes.mg.gov.br
3239-7158,Alexsandro Henrique de Souza,SARH,ARQUIVO,arquivo@trescoracoes.mg.gov.br
3691-1156,Alexsandro Henrique de Souza,SARH,"RECEPÇÃO RH/SESMT",recepcao.sesmt@trescoracoes.mg.gov.br
98821-3836,Alexsandro Henrique de Souza,SARH,"RECEPÇÃO RH/SESMT",recepcao.sesmt2@trescoracoes.mg.gov.br
3691-1157,Alexsandro Henrique de Souza,SARH,"RH/SESMT",rh.sesmt@trescoracoes.mg.gov.br
3691-1029,Alexsandro Henrique de Souza,SARH,"RECEPÇÃO - IPRECOR",recepcao.iprecor@trescoracoes.mg.gov.br
3691-1029,Alexsandro Henrique de Souza,SARH,"BENEFÍCIOS / CONTABILIDADE - IPRECOR",beneficios.iprecor@trescoracoes.mg.gov.br
3691-1029,Alexsandro Henrique de Souza,SARH,"PRESIDENTE - IPRECOR",presidente.iprecor@trescoracoes.mg.gov.br
98812-4483,Gustavo João Roberto Gorgulho Franco,SEDEC,"DIRETORIA DE ATRAÇÃO DE INVESTIMENTOS E EMPREENDEDORISMO",invest.tc@trescoracoes.mg.gov.br
98821-4026,Gustavo João Roberto Gorgulho Franco,SEDEC,"PROTEÇÃO AO CONSUMIDOR - PROCON",procon@trescoracoes.mg.gov.br
98802-6659,Gustavo João Roberto Gorgulho Franco,SEDEC,"MINAS FÁCIL",mfalvara@trescoracoes.mg.gov.br
3239-7156,Thiago Mesquita Pereira,SEMCI,ADMINISTRATIVO,semci@trescoracoes.mg.gov.br
3239-7157,Thiago Mesquita Pereira,SEMCI,"CONTROLE ADMINISTRATIVO DO PATRIMÔNIO",semci@trescoracoes.mg.gov.br
3239-7155,Thiago Mesquita Pereira,SEMCI,GABINETE,semci@trescoracoes.mg.gov.br
3239-7500,Thiago Mesquita Pereira,SEMCI,OUVIDORIA,ouvidoria@trescoracoes.mg.gov.br
3239-7136,Ana Carolina Mafra Simões,SEFIN,CONTABILIDADE,protocolo.sefin@trescoracoes.mg.gov.br
98821-9011,Ana Carolina Mafra Simões,SEFIN,"DÍVIDA ATIVA",dividaativa.pmtc@trescoracoes.mg.gov.br
3239-7217,Ana Carolina Mafra Simões,SEFIN,"DÍVIDA ATIVA",dividaativa.pmtc@trescoracoes.mg.gov.br
98821-4779,Ana Carolina Mafra Simões,SEFIN,IPTU,iptu@trescoracoes.mg.gov.br
3239-7134,Ana Carolina Mafra Simões,SEFIN,ISS,fiscalpmtc@trescoracoes.mg.gov.br
3239-7234,Ana Carolina Mafra Simões,SEFIN,"PAV (POSTO DE ATENDIMENTO VIRTUAL DA RECEITA FEDERAL)",pav@trescoracoes.mg.gov.br
98812-3086,Ana Carolina Mafra Simões,SEFIN,TESOURARIA,leila@trescoracoes.mg.gov.br
3239-7101,Ana Carolina Mafra Simões,SEFIN,"TECNOLOGIA DA INFORMAÇÃO",dtipmtc@trescoracoes.mg.gov.br
98802-6664,Ana Carolina Mafra Simões,SEFIN,"TECNOLOGIA DA INFORMAÇÃO",dtipmtc@trescoracoes.mg.gov.br
98861-2859,Claudinei Ferreira,SELTC,"SECRETARIA MUNICIPAL DE LAZER, TURISMO E CULTURA",administrativo.seltc@trescoracoes.mg.gov.br
3691-1041,Claudinei Ferreira,SELTC,"CASA DA CULTURA GODOFREDO RANGEL",info@trescoracoes.mg.gov.br
3234-2179,Claudinei Ferreira,SELTC,"CASA PELÉ",info@trescoracoes.mg.gov.br
3239-7172,André Luis Ribeiro,SEPLAN,"ANÁLISE DE PROJETO",analisedeprojeto.seplan@trescoracoes.mg.gov.br
3239-7171,André Luis Ribeiro,SEPLAN,ADMINISTRATIVO,protocolo.seplan@trescoracoes.mg.gov.br
98861-4222,André Luis Ribeiro,SEPLAN,"ILUMINAÇÃO PÚBLICA",info@trescoracoes.mg.gov.br
3239-7174,André Luis Ribeiro,SEPLAN,"ENGENHARIA E ARQUITETURA",info@trescoracoes.mg.gov.br
3239-7175,André Luis Ribeiro,SEPLAN,"PROTOCOLO DE PROJETOS E FISCALIZAÇÃO",analisedeprojeto.seplan@trescoracoes.mg.gov.br
3239-7170,André Luis Ribeiro,SEPLAN,"PROTOCOLO DE PROJETOS E FISCALIZAÇÃO",analisedeprojeto.seplan@trescoracoes.mg.gov.br
3239-7122,Jorge Vitor da Costa,SEGOV,"DEPARTAMENTO ADMINISTRATIVO",info@trescoracoes.mg.gov.br
3239-7120,Jorge Vitor da Costa,SEGOV,"DEPARTAMENTO JURÍDICO",info@trescoracoes.mg.gov.br
3239-7144,Jorge Vitor da Costa,SEGOV,"DEPARTAMENTO DE ATOS",info@trescoracoes.mg.gov.br
3239-7160,Jorge Vitor da Costa,SEGOV,"DEPARTAMENTO DE COMPRAS",info@trescoracoes.mg.gov.br
3239-7161,Jorge Vitor da Costa,SEGOV,"DEPARTAMENTO DE COMPRAS",info@trescoracoes.mg.gov.br
3239-7162,Jorge Vitor da Costa,SEGOV,"DEPARTAMENTO DE LICITAÇÃO",info@trescoracoes.mg.gov.br
3239-7163,Jorge Vitor da Costa,SEGOV,"DEPARTAMENTO DE LICITAÇÃO",info@trescoracoes.mg.gov.br
3239-7110,Jorge Vitor da Costa,SEGOV,"RECEPÇÃO DO GABINETE DO PREFEITO",info@trescoracoes.mg.gov.br
3239-7205,Rogerio Ferraz Rivello,SEMMA,"Secretaria de Meio Ambiente e Defesa Animal",semmada@trescoracoes.mg.gov.br
98861-3145,Rogerio Ferraz Rivello,SEMMA,"Defesa Civil",semmada@trescoracoes.mg.gov.br
98861-4422,Rogerio Ferraz Rivello,SEMMA,"Defesa Animal (WhatsApp)",semmada@trescoracoes.mg.gov.br
98811-8286,Rogerio Ferraz Rivello,SEMMA,"IEF - Instituto Estadual de Florestas",semmada@trescoracoes.mg.gov.br
3232-3441,Rogerio Ferraz Rivello,SEMMA,CODEMA,semmada@trescoracoes.mg.gov.br
98861-4525,Rogerio Ferraz Rivello,SEMMA,"CODEMA (WhatsApp)",semmada@trescoracoes.mg.gov.br
98821-8462,Carlos Henrique Xavier Vilani,SEMOSP,"Departamento Pessoal, Reclamações e Solicitações",engenharia.semosp@trescoracoes.mg.gov.br
988124765,Carlos Henrique Xavier Vilani,SEMOSP,"Cemitério Municipal São João Batista",info@trescoracoes.mg.gov.br
3239-7190,Letícia Aparecida Belato Martins,SECOM,"Secretaria de Comunicação e Relações Institucionais",secom@trescoracoes.mg.gov.br
3239-7154,Letícia Aparecida Belato Martins,SECOM,"Secretaria de Comunicação e Relações Institucionais",secom@trescoracoes.mg.gov.br
98812-4004,Claudinei Ferreira,SESP,"SETOR ADMINISTRATIVO",esportetc01@gmail.com
98812-4004,Claudinei Ferreira,SESP,ESPORTIVO,esportetc01@gmail.com
98821-7438,Rogerio Ferraz Rivello,SEMAP,"Secretaria de Agricultura e Pecuária",semap@trescoracoes.mg.gov.br
98868-4016,André Luis Ribeiro,SEMOB,"Secretaria de Segurança Pública e Mobilidade Urbana",segurancapublica.semob@trescoracoes.mg.gov.br
3691-1170,André Luis Ribeiro,SEMOB,"Secretaria de Segurança Pública e Mobilidade Urbana",segurancapublica.semob@trescoracoes.mg.gov.br
98868-4016,André Luis Ribeiro,SEMOB,"SETOR DE DEFESA DA ATUAÇÃO, FICI E JARI",atendimento.semob@trescoracoes.mg.gov.br
3239-7152,Rudolfo de Souza Pereira,PGM,"Procuradoria Geral do Município",procuradoria@trescoracoes.mg.gov.br
3239-7177,Rudolfo de Souza Pereira,PGM,"EXECUÇÃO FISCAL",info@trescoracoes.mg.gov.br991687008,"Marco Antonio Vivas",SEFIN,DTI,markovivas@gmail.com
Can't render this file because it has a wrong number of fields in line 160.

View File

@@ -0,0 +1,99 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
class Ramais_Admin {
private $database;
public function __construct($database) {
$this->database = $database;
$this->init_hooks();
}
private function init_hooks() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_post_add_ramal', array($this, 'handle_add_ramal'));
}
public function add_admin_menu() {
add_menu_page(
__('Ramais Telefônicos', 'ramais-telefonicos'),
__('Ramais', 'ramais-telefonicos'),
'manage_options',
'ramais-telefonicos',
array($this, 'render_admin_page'),
'dashicons-phone',
20
);
}
public function render_admin_page() {
if (!current_user_can('manage_options')) {
wp_die(__('Você não tem permissão para acessar esta página.', 'ramais-telefonicos'));
}
$status = isset($_GET['status']) ? sanitize_text_field($_GET['status']) : '';
?>
<div class="wrap">
<h1><?php _e('Adicionar Novo Ramal', 'ramais-telefonicos'); ?></h1>
<?php if ($status === 'success'): ?>
<div class="notice notice-success"><p><?php _e('Ramal adicionado com sucesso!', 'ramais-telefonicos'); ?></p></div>
<?php elseif ($status === 'error'): ?>
<div class="notice notice-error"><p><?php _e('Erro ao adicionar ramal. Verifique os dados.', 'ramais-telefonicos'); ?></p></div>
<?php endif; ?>
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
<input type="hidden" name="action" value="add_ramal">
<?php wp_nonce_field('add_ramal_nonce'); ?>
<table class="form-table">
<tr>
<th scope="row"><label for="ramal"><?php _e('Ramal', 'ramais-telefonicos'); ?></label></th>
<td><input type="text" name="ramal" id="ramal" class="regular-text" required></td>
</tr>
<tr>
<th scope="row"><label for="responsavel"><?php _e('Responsável', 'ramais-telefonicos'); ?></label></th>
<td><input type="text" name="responsavel" id="responsavel" class="regular-text" required></td>
</tr>
<tr>
<th scope="row"><label for="secretaria"><?php _e('Secretaria', 'ramais-telefonicos'); ?></label></th>
<td><input type="text" name="secretaria" id="secretaria" class="regular-text" required></td>
</tr>
<tr>
<th scope="row"><label for="setor"><?php _e('Setor', 'ramais-telefonicos'); ?></label></th>
<td><input type="text" name="setor" id="setor" class="regular-text" required></td>
</tr>
<tr>
<th scope="row"><label for="email"><?php _e('Email', 'ramais-telefonicos'); ?></label></th>
<td><input type="email" name="email" id="email" class="regular-text" required></td>
</tr>
</table>
<?php submit_button(__('Adicionar Ramal', 'ramais-telefonicos')); ?>
</form>
</div>
<?php
}
public function handle_add_ramal() {
if (!current_user_can('manage_options') || !wp_verify_nonce($_POST['_wpnonce'], 'add_ramal_nonce')) {
wp_die(__('Ação não autorizada.', 'ramais-telefonicos'));
}
$data = array(
'ramal' => $_POST['ramal'] ?? '',
'responsavel' => $_POST['responsavel'] ?? '',
'secretaria' => $_POST['secretaria'] ?? '',
'setor' => $_POST['setor'] ?? '',
'email' => $_POST['email'] ?? ''
);
$success = $this->database->add_ramal($data);
$status = $success ? 'success' : 'error';
wp_redirect(admin_url('admin.php?page=ramais-telefonicos&status=' . $status));
exit;
}
}

View File

@@ -0,0 +1,43 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
class Ramais_Ajax {
private $database;
public function __construct($database) {
$this->database = $database;
$this->init_hooks();
}
private function init_hooks() {
add_action('wp_ajax_filtrar_ramais', array($this, 'ajax_filter_ramais'));
add_action('wp_ajax_nopriv_filtrar_ramais', array($this, 'ajax_filter_ramais'));
}
public function ajax_filter_ramais() {
check_ajax_referer('ramais_telefonicos_nonce', 'nonce');
$page = isset($_POST['page']) ? absint($_POST['page']) : 1;
$filters = [
'search' => isset($_POST['search']) ? sanitize_text_field($_POST['search']) : '',
'secretaria' => isset($_POST['secretaria']) ? sanitize_text_field($_POST['secretaria']) : '',
'setor' => isset($_POST['setor']) ? sanitize_text_field($_POST['setor']) : ''
];
$data = $this->database->get_filtered_ramais($filters, $page);
$ramais = $data['data'];
$total_pages = $data['pages'];
$current_page = $data['current_page'];
// Indica que é apenas a seção de resultados
$is_results_section = true;
ob_start();
include RAMAIS_TELEFONICOS_PLUGIN_DIR . 'templates/lista-ramais.php';
$html = ob_get_clean();
wp_send_json_success($html);
}
}

View File

@@ -0,0 +1,140 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
class Ramais_Database {
private $csv_file;
private $columns = array('ramal', 'responsavel', 'secretaria', 'setor', 'email');
public function __construct() {
$this->csv_file = RAMAIS_TELEFONICOS_CSV_FILE;
$this->ensure_csv_exists();
}
private function ensure_csv_exists() {
if (!file_exists($this->csv_file)) {
wp_mkdir_p(RAMAIS_TELEFONICOS_CSV_DIR);
$this->write_csv_row($this->columns);
}
}
public function get_all_ramais() {
if (!file_exists($this->csv_file)) {
return array();
}
$ramais = array();
$handle = fopen($this->csv_file, 'r');
if ($handle !== false) {
// Pula o cabeçalho
fgetcsv($handle);
while (($data = fgetcsv($handle)) !== false) {
if (count($data) === count($this->columns)) {
$ramais[] = array_combine($this->columns, $data);
}
}
fclose($handle);
}
return $ramais;
}
public function get_filtered_ramais($filters = array(), $page = 1, $per_page = RAMAIS_TELEFONICOS_PER_PAGE) {
$all_ramais = $this->get_all_ramais();
$filtered = array();
foreach ($all_ramais as $ramal) {
$match = true;
if (!empty($filters['search'])) {
$search = strtolower($filters['search']);
$match = false;
foreach ($ramal as $value) {
if (strpos(strtolower($value), $search) !== false) {
$match = true;
break;
}
}
}
if ($match && !empty($filters['secretaria']) && $ramal['secretaria'] !== $filters['secretaria']) {
$match = false;
}
if ($match && !empty($filters['setor']) && $ramal['setor'] !== $filters['setor']) {
$match = false;
}
if ($match) {
$filtered[] = $ramal;
}
}
$total = count($filtered);
$total_pages = ceil($total / $per_page);
$offset = ($page - 1) * $per_page;
$paginated = array_slice($filtered, $offset, $per_page);
return array(
'data' => $paginated,
'total' => $total,
'pages' => $total_pages,
'current_page' => $page
);
}
public function add_ramal($data) {
$sanitized = array();
foreach ($this->columns as $col) {
$sanitized[$col] = $this->sanitize_field($col, $data[$col] ?? '');
}
if ($this->validate_ramal($sanitized)) {
return $this->write_csv_row($sanitized);
}
return false;
}
private function sanitize_field($field, $value) {
switch ($field) {
case 'email':
return sanitize_email($value);
case 'ramal':
return preg_replace('/[^0-9]/', '', $value);
default:
return sanitize_text_field($value);
}
}
private function validate_ramal($data) {
foreach ($data as $value) {
if (empty($value)) {
return false;
}
}
return is_email($data['email']);
}
private function write_csv_row($data) {
$handle = fopen($this->csv_file, 'a');
if ($handle === false) {
return false;
}
$success = fputcsv($handle, $data);
fclose($handle);
return (bool)$success;
}
public function get_unique_values($field) {
$ramais = $this->get_all_ramais();
$values = array_column($ramais, $field);
$unique = array_unique($values);
sort($unique);
return $unique;
}
}

View File

@@ -0,0 +1,39 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
class Ramais_Frontend {
private $database;
public function __construct($database) {
$this->database = $database;
$this->init_hooks();
}
private function init_hooks() {
add_shortcode('lista_ramais', array($this, 'render_ramais_list'));
}
public function render_ramais_list($atts) {
$atts = shortcode_atts(array(
'per_page' => RAMAIS_TELEFONICOS_PER_PAGE
), $atts);
$page = isset($_GET['ramais_page']) ? absint($_GET['ramais_page']) : 1;
$filters = array(
'search' => isset($_GET['ramais_search']) ? sanitize_text_field($_GET['ramais_search']) : '',
'secretaria' => isset($_GET['ramais_secretaria']) ? sanitize_text_field($_GET['ramais_secretaria']) : '',
'setor' => isset($_GET['ramais_setor']) ? sanitize_text_field($_GET['ramais_setor']) : ''
);
$data = $this->database->get_filtered_ramais($filters, $page, $atts['per_page']);
$ramais = $data['data'];
$total_pages = $data['pages'];
$current_page = $data['current_page'];
ob_start();
include RAMAIS_TELEFONICOS_PLUGIN_DIR . 'templates/lista-ramais.php';
return ob_get_clean();
}
}

117
ramais-telefonicos.php Normal file
View File

@@ -0,0 +1,117 @@
<?php
/**
* Plugin Name: Sistema de Ramais Telefônicos
* Description: Plugin para gerenciar e exibir ramais telefônicos com busca, filtros e paginação.
* Shortcodes disponíveis: [lista_ramais], [lista_ramais per_page="10"]
* Version: 1.0
* Author: Marco Antonio Vivas
* Text Domain: ramais-telefonicos
*/
defined('ABSPATH') || exit;
// Definição de constantes
define('RAMAIS_TELEFONICOS_VERSION', '4.0');
define('RAMAIS_TELEFONICOS_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('RAMAIS_TELEFONICOS_PLUGIN_URL', plugin_dir_url(__FILE__));
define('RAMAIS_TELEFONICOS_CSV_DIR', wp_upload_dir()['basedir'] . '/ramais-telefonicos/');
define('RAMAIS_TELEFONICOS_CSV_FILE', RAMAIS_TELEFONICOS_CSV_DIR . 'bancodados.csv');
define('RAMAIS_TELEFONICOS_PER_PAGE', 15);
// Carrega as classes necessárias
require_once RAMAIS_TELEFONICOS_PLUGIN_DIR . 'includes/class-ramais-database.php';
require_once RAMAIS_TELEFONICOS_PLUGIN_DIR . 'includes/class-ramais-admin.php';
require_once RAMAIS_TELEFONICOS_PLUGIN_DIR . 'includes/class-ramais-frontend.php';
require_once RAMAIS_TELEFONICOS_PLUGIN_DIR . 'includes/class-ramais-ajax.php';
class Ramais_Telefonicos {
private static $instance = null;
public $database;
public $admin;
public $frontend;
public $ajax;
private function __construct() {
$this->init();
}
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
private function init() {
// Inicializa os componentes
$this->database = new Ramais_Database();
$this->admin = new Ramais_Admin($this->database);
$this->frontend = new Ramais_Frontend($this->database);
$this->ajax = new Ramais_Ajax($this->database);
// Hooks de ativação/desativação
register_activation_hook(__FILE__, array($this, 'activate'));
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
// Inicialização
add_action('plugins_loaded', array($this, 'load_textdomain'));
add_action('wp_enqueue_scripts', array($this, 'enqueue_assets'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
}
public function activate() {
// Cria o diretório se não existir
if (!file_exists(RAMAIS_TELEFONICOS_CSV_DIR)) {
wp_mkdir_p(RAMAIS_TELEFONICOS_CSV_DIR);
}
// Se o arquivo CSV não existe, cria com cabeçalho
if (!file_exists(RAMAIS_TELEFONICOS_CSV_FILE)) {
$header = array('Ramal', 'Responsável', 'Secretaria', 'Setor', 'Email');
$this->database->write_csv_row($header);
}
}
public function deactivate() {
// Nada a fazer por enquanto
}
public function load_textdomain() {
load_plugin_textdomain('ramais-telefonicos', false, dirname(plugin_basename(__FILE__)) . '/languages/');
}
public function enqueue_assets() {
wp_enqueue_style(
'ramais-telefonicos-css',
RAMAIS_TELEFONICOS_PLUGIN_URL . 'assets/css/ramais.css',
array(),
RAMAIS_TELEFONICOS_VERSION
);
wp_enqueue_script(
'ramais-telefonicos-js',
RAMAIS_TELEFONICOS_PLUGIN_URL . 'assets/js/ramais.js',
array('jquery'),
RAMAIS_TELEFONICOS_VERSION,
true
);
wp_localize_script('ramais-telefonicos-js', 'ramaisVars', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('ramais_telefonicos_nonce')
));
}
public function enqueue_admin_assets() {
wp_enqueue_style(
'ramais-telefonicos-admin-css',
RAMAIS_TELEFONICOS_PLUGIN_URL . 'assets/css/admin-ramais.css',
array(),
RAMAIS_TELEFONICOS_VERSION
);
}
}
// Inicializa o plugin
Ramais_Telefonicos::get_instance();

105
templates/lista-ramais.php Normal file
View File

@@ -0,0 +1,105 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
// Verifica se é a seção principal ou apenas resultados
$is_results_section = isset($is_results_section) ? $is_results_section : false;
// Obtém valores únicos para os filtros (só se for a chamada principal)
if (!$is_results_section) {
$secretarias = $this->database->get_unique_values('secretaria');
$setores = $this->database->get_unique_values('setor');
}
// Filtros atuais
$current_search = isset($filters['search']) ? esc_attr($filters['search']) : '';
$current_secretaria = isset($filters['secretaria']) ? esc_attr($filters['secretaria']) : '';
$current_setor = isset($filters['setor']) ? esc_attr($filters['setor']) : '';
?>
<div class="ramais-container">
<?php if (!$is_results_section): ?>
<!-- Seção de Filtros (só aparece na chamada principal) -->
<div class="ramais-filtros">
<input type="text" id="ramais-search"
placeholder="<?php esc_attr_e('Buscar por ramal, nome ou setor...', 'ramais-telefonicos'); ?>"
value="<?php echo $current_search; ?>">
<select id="ramais-secretaria">
<option value=""><?php _e('Todas as Secretarias', 'ramais-telefonicos'); ?></option>
<?php foreach ($secretarias as $secretaria): ?>
<?php if (!empty($secretaria)): ?>
<option value="<?php echo esc_attr($secretaria); ?>"
<?php selected($current_secretaria, $secretaria); ?>>
<?php echo esc_html($secretaria); ?>
</option>
<?php endif; ?>
<?php endforeach; ?>
</select>
<select id="ramais-setor">
<option value=""><?php _e('Todos os Setores', 'ramais-telefonicos'); ?></option>
<?php foreach ($setores as $setor): ?>
<?php if (!empty($setor)): ?>
<option value="<?php echo esc_attr($setor); ?>"
<?php selected($current_setor, $setor); ?>>
<?php echo esc_html($setor); ?>
</option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<?php endif; ?>
<!-- Seção de Resultados (sempre visível) -->
<div class="ramais-results">
<?php if (empty($ramais)): ?>
<p class="ramais-no-results">
<?php _e('Nenhum ramal encontrado com os filtros atuais.', 'ramais-telefonicos'); ?>
</p>
<?php else: ?>
<table class="ramais-table">
<thead>
<tr>
<th><?php _e('Ramal', 'ramais-telefonicos'); ?></th>
<th><?php _e('Responsável', 'ramais-telefonicos'); ?></th>
<th><?php _e('Secretaria', 'ramais-telefonicos'); ?></th>
<th><?php _e('Setor', 'ramais-telefonicos'); ?></th>
<th><?php _e('Email', 'ramais-telefonicos'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($ramais as $ramal): ?>
<tr>
<td><?php echo esc_html($ramal['ramal']); ?></td>
<td><?php echo esc_html($ramal['responsavel']); ?></td>
<td><?php echo esc_html($ramal['secretaria']); ?></td>
<td><?php echo esc_html($ramal['setor']); ?></td>
<td>
<?php if (!empty($ramal['email'])): ?>
<a href="mailto:<?php echo esc_attr($ramal['email']); ?>">
<?php echo esc_html($ramal['email']); ?>
</a>
<?php else: ?>
-
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php if ($total_pages > 1): ?>
<div class="ramais-pagination">
<?php for ($i = 1; $i <= $total_pages; $i++): ?>
<a href="#" class="ramais-page-link <?php echo $i === $current_page ? 'active' : ''; ?>"
data-page="<?php echo $i; ?>">
<?php echo $i; ?>
</a>
<?php endfor; ?>
</div>
<?php endif; ?>
<?php endif; ?>
</div>
</div>