Initial commit
This commit is contained in:
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
68
README.md
Normal file
68
README.md
Normal 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.
|
16
assets/css/admin-ramais.css
Normal file
16
assets/css/admin-ramais.css
Normal 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
116
assets/css/ramais.css
Normal 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
58
assets/js/ramais.js
Normal 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
161
basedados/bancodados.csv
Normal 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.
|
99
includes/class-ramais-admin.php
Normal file
99
includes/class-ramais-admin.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
43
includes/class-ramais-ajax.php
Normal file
43
includes/class-ramais-ajax.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
140
includes/class-ramais-database.php
Normal file
140
includes/class-ramais-database.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
39
includes/class-ramais-frontend.php
Normal file
39
includes/class-ramais-frontend.php
Normal 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
117
ramais-telefonicos.php
Normal 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
105
templates/lista-ramais.php
Normal 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>
|
Reference in New Issue
Block a user