11 Commits

4 changed files with 84 additions and 60 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
PLAN-*.md

View File

@@ -1,6 +1,6 @@
# Simulador Mob-Out ARI-POLI-UPE
- Autor do Plugin wordpress - Copyright (C) 2026, Versão 1.0.20260629
- Autor do Plugin wordpress - Copyright (C) 2026, Versão 1.3.20260629
> Ruben Carlo Benante <rcb@beco.cc>\
> Data: 2026-06-29

View File

@@ -1 +1 @@
Plugin simulador-mob-out-ari-poli v1.0.20260629
Plugin simulador-mob-out-ari-poli v1.3.20260629

View File

@@ -3,7 +3,7 @@
Plugin Name: Simulador Mob-Out ARI-POLI
Plugin URI: https://code.beco.cc/beco/simulador-mob-out-ari-poli
Description: Calculadora de pré-seleção para mobilidade OUT da ARI/POLI-UPE, exibida via shortcode [simulador_mob].
Version: 1.0.20260629
Version: 1.3.20260629
Author: Ruben Carlo Benante
Author URI: https://beco.cc
License: GPLv3 or later
@@ -131,14 +131,28 @@ function limpaPost($valor){
//Função para pegar a entrada
function validar_entrada(){
global $entradas;
$entradas = array("lingua2" => 0, "lingua" => 0, "porcentagem" => 0, "repro_rec" => 0, "repro_nrec" => 0, "estagio" => 0, "estagio_exterior" => 0);
foreach ($_POST as $chave => $valor){
if (empty($valor)){
$item = 0;
$entradas[$chave] = $item;
// Lista completa dos campos numericos esperados. Inicializar todos em 0
// evita avisos de "Undefined array key" no PHP 8 quando o formulario chega
// incompleto, e o cast para float garante valores numericos (sem avisos de
// "non-numeric value") mesmo diante de um POST adulterado.
$campos = array(
'programa', 'mobilidade', 'lingua', 'lingua2', 'porcentagem',
'repro_rec', 'repro_nrec', 'media', 'ic', 'extensao', 'monitoria',
'art_periodicos', 'art_congresso', 'cap_livros', 'livros', 'resumos',
'evento_extensao', 'evento_pesquisa', 'congresso',
'estagio', 'estagio_exterior',
);
$entradas = array();
foreach ($campos as $campo) {
if (isset($_POST[$campo]) && $_POST[$campo] !== '') {
// Clampa negativos em 0: nenhum campo legitimo (notas, contagens,
// selecoes) e negativo; isto neutraliza POST adulterado, ja que o
// min="0" do HTML so vale no navegador.
$entradas[$campo] = max(0, (float) limpaPost($_POST[$campo]));
} else {
$item = limpaPost($valor);
$entradas[$chave] = $item;
$entradas[$campo] = 0;
}
}
}
@@ -202,12 +216,19 @@ function outras_brafitec($es, $ms, $est, $apy, $acy, $cy, $ly, $ry, $ea, $pa, $c
function simulador_mob_shortcode() {
\wp_enqueue_script( 'mathjax' );
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
//var_dump($_POST);
if (isset($_POST["calcular"])) {
validar_entrada();
global $entradas;
if ($entradas["programa"] != 4){
if ($entradas["media"] <= 0){
// Media curricular e a base da nota (peso 5 no Padrao V2, peso 7 no
// BRAFITEC). Sem ela, evita exibir uma nota baixa enganosa.
global $h, $h_brafitec;
$h = $h_brafitec = "Preencha a média curricular para calcular a nota.";
} elseif ($entradas["programa"] != 4){
global $o, $ro, $s, $y, $a, $h, $entradas;
$ro = nota_reprovacoes($entradas["repro_rec"], $entradas["repro_nrec"]);
$o = nota_historico($entradas["porcentagem"], $ro, $entradas["media"]);
@@ -263,11 +284,12 @@ ob_start();
<!-- TIPO DE MOBILIDADE -->
<?php imprime('','',"<br><br>"); ?>
<?php imprime('','',"<label>Tipo de mobilidade:</label>"); ?>
<?php imprime('','',"<input type='radio' name='mobilidade' id='simples' value='1' required></input>"); ?>
<?php imprime('','',"<label for='simples'>Mobilidade Simples</label>"); ?>
<?php imprime('','',"<input type='radio' name='mobilidade' id='dupla' value='2'></input>"); ?>
<?php imprime('','',"<label>Tipo de mobilidade:</label>&nbsp;"); ?>
<?php imprime('','',"<input type='radio' name='mobilidade' id='simples' value='1' required />&nbsp;"); ?>
<?php imprime('','',"<label for='simples'>Mobilidade Simples</label>&nbsp;&nbsp;"); ?>
<?php imprime('','',"<input type='radio' name='mobilidade' id='dupla' value='2' />&nbsp;"); ?>
<?php imprime('','',"<label for='dupla'>Dupla Diplomação</label><br>"); ?>
<?php imprime('','',"<em>Mobilidade dupla disponível apenas na seleção de primeiro semestre para início das atividades acadêmicas na Itália em Setembro.</em><br>"); ?>
<br><br>
<div id="div_lingua">
@@ -298,21 +320,21 @@ ob_start();
<!-- MÉDIA CURRICULAR -->
<tr>
<td class="labels"><label for="media">Média curricular:</label></td>
<td><input name="media" type="number" step="0.01" min="0" id="media"></input></td>
<td><input name="media" type="number" step="0.01" min="0" id="media" /></td>
<td><?php imprime("(Peso 5)", "(Peso 7)"); ?> </td>
</tr>
<!-- REPROVAÇÕES RECUPERADAS -->
<tr>
<td><label for="repro_rec">Número de reprovações recuperadas:</label></td>
<td><input name="repro_rec" type="number" min="0" id="repro_rec"></input></td>
<td><input name="repro_rec" type="number" min="0" id="repro_rec" /></td>
<td><?php imprime("(Peso 3)", "(Classificatório)"); ?> </td>
</tr>
<!-- REPROVAÇÕES NÃO RECUPERADAs -->
<tr>
<td><label for="repro_nrec">Número de reprovações não recuperadas:</label></td>
<td><input name="repro_nrec" type="number" min="0" id="repro_nrec" ></input></td>
<td><input name="repro_nrec" type="number" min="0" id="repro_nrec" /></td>
<td><?php imprime("(Peso 3)", "(Classificatório)"); ?> </td>
</tr>
@@ -325,9 +347,9 @@ ob_start();
<!-- PORCENTAGEM DO CURSO-->
<tr>
<td><label> <?php imprime("Está entre 50% e 80% do curso?", "Está entre 40% e 80% do curso?"); ?></label></td>
<td><input type="radio" name="porcentagem" id="porcentagem1" value="1" ></input>
<td><input type="radio" name="porcentagem" id="porcentagem1" value="1" />
<label for="porcentagem1">Sim</label>
<input type="radio" name="porcentagem" id="porcentagem2" value="0" ></input>
<input type="radio" name="porcentagem" id="porcentagem2" value="0" />
<label for="porcentagem2">Não</label><br>
</td>
<td><?php imprime("", "(Classificatório)"); ?> </td>
@@ -381,33 +403,33 @@ ob_start();
<!-- PESQUISA (IC) -->
<tr>
<td><label for="ic">Pesquisa (IC):</label></td>
<td><input type="number" name="ic" min="0" id="ic"></input></td>
<td><input type="number" name="ic" min="0" id="ic" /></td>
<td> <?php imprime("","(Peso 1.5)"); ?> </td>
</tr>
<!-- EXTENSÃO -->
<tr>
<td><label for="extensao">Extensão:</label></td>
<td><input type="number" name="extensao" min="0" id="extensao"></input></td>
<td><input type="number" name="extensao" min="0" id="extensao" /></td>
<td> <?php imprime("", "(Peso 1)"); ?> </td>
</tr>
<!-- MONITORIA -->
<tr>
<td><label for="monitoria">Monitoria:</label></td>
<td><input type="number" name="monitoria" min="0" id="monitoria"></input></td>
<td><input type="number" name="monitoria" min="0" id="monitoria" /></td>
<td> <?php imprime("", "(Peso 1)"); ?> </td>
</tr>
<?php imprime("", "<tr>"); ?>
<!-- ESTÁGIO NO EXTERIOR -->
<?php imprime("", "<td><label for='estagio_exterior'>Estágio no exterior:</label></td>"); ?>
<?php imprime("", "<td><input type='number' name='estagio_exterior' min='0' id='estagio_exterior'></input></td>");?>
<?php imprime("", "<td><input type='number' name='estagio_exterior' min='0' id='estagio_exterior' /></td>");?>
<?php imprime("", "<td>(Peso 0,5) </td>"); ?>
<?php imprime("", "</tr>") ?>
<?php imprime("", "<tr>"); ?>
<!-- ESTÁGIO -->
<?php imprime("", "<td><label for='estagio'>Estágio:</label></td>"); ?>
<?php imprime("", "<td><input type='number' name='estagio' min='0' id='estagio'></input></td>");?>
<?php imprime("", "<td><input type='number' name='estagio' min='0' id='estagio' /></td>");?>
<?php imprime("", "<td>(Peso 1) </td>"); ?>
<?php imprime("", "</tr>") ?>
<?php imprime("<tr>"); ?>
@@ -449,35 +471,35 @@ ob_start();
<!-- ARTIGOS COMPLETOS EM PERÍDICOS -->
<tr>
<td><label for="art_periodicos">Artigos completos em periódicos:</label></td>
<td><input type="number" name="art_periodicos" min="0" id="art_periodicos"></input></td>
<td><input type="number" name="art_periodicos" min="0" id="art_periodicos" /></td>
<td><?php imprime("(Peso 2)", ""); ?> </td>
</tr>
<!-- ARTIGOS COMPLETOS EM CONGRESSOS -->
<tr>
<td><label for="art_congresso">Artigos completos em congressos:</label></td>
<td><input type="number" name="art_congresso" min="0" id="art_congresso"></input></td>
<td><input type="number" name="art_congresso" min="0" id="art_congresso" /></td>
<td><?php imprime("(Peso 1)", ""); ?> </td>
</tr>
<!-- CAPÍTULO DE LIVROS -->
<tr>
<td><label for="cap_livros">Capítulos de livros:</label></td>
<td><input type="number" name="cap_livros" min="0" id="cap_livros"></input></td>
<td><input type="number" name="cap_livros" min="0" id="cap_livros" /></td>
<td><?php imprime("(Peso 2)", ""); ?> </td>
</tr>
<!-- LIVROS -->
<tr>
<td><label for="livros">Livros:</label></td>
<td><input type="number" name="livros" min="0" id="livros"></input></td>
<td><input type="number" name="livros" min="0" id="livros" /></td>
<td><?php imprime("(Peso 3)", ""); ?> </td>
</tr>
<!-- RESUMOS -->
<tr>
<td><label for="resumos">Resumos:</label></td>
<td><input type="number" name="resumos" min="0" id="resumos"></input></td>
<td><input type="number" name="resumos" min="0" id="resumos" /></td>
<td><?php imprime("(Peso 1)", ""); ?> </td>
</tr>
<?php imprime("<tr>"); ?>
@@ -522,21 +544,21 @@ ob_start();
<!-- PARTICIPAÇÃO EM EVENTOS DE EXTENSÃO -->
<tr>
<td><label for="evento_extensao">Extensão:</label></td>
<td><input type="number" name="evento_extensao" min="0" id="evento_extensao"></input></td>
<td><input type="number" name="evento_extensao" min="0" id="evento_extensao" /></td>
<td> <?php imprime("", ""); ?> </td>
</tr>
<!-- PARTICIPAÇÃO EM EVENTOS DE PESQUISA -->
<tr>
<td><label for="evento_pesquisa">Pesquisa:</label></td>
<td><input type="number" name="evento_pesquisa" min="0" id="evento_pesquisa"></input></td>
<td><input type="number" name="evento_pesquisa" min="0" id="evento_pesquisa" /></td>
<td> <?php imprime("", ""); ?> </td>
</tr>
<!-- PARTICIPAÇÃO EM CONGRESSOS ACADÊMICOS -->
<tr>
<td><label for="congresso">Congresso:</label></td>
<td><input type="number" name="congresso" min="0" id="congresso"></input></td>
<td><input type="number" name="congresso" min="0" id="congresso" /></td>
<td> <?php imprime("", ""); ?> </td>
</tr>
<?php imprime("<tr>"); ?>
@@ -579,18 +601,14 @@ ob_start();
<?php imprime("", "<tr>", "<tr>"); ?>
<?php imprime("", "<td> <label> Francês: </label> </td>", "<td> <label> Inglês: </label> </td>"); ?>
<?php imprime("", "<td>", "<td>"); ?>
<?php imprime("", "<input type='radio' name='lingua' id='a1' value='1' ></input>", "<input type='radio' name='lingua' id='a1' value='1' ></input>"); ?>
<?php imprime("", "<label for='a1'>A1</label>", "<label for='a1'>A1</label>"); ?>
<?php imprime("", "<input type='radio' name='lingua' id='a2' value='2' ></input>", "<input type='radio' name='lingua' id='a2' value='2' ></input>"); ?>
<?php imprime("", "<label for='a2'>A2</label>", "<label for='a2'>A2</label>"); ?>
<?php imprime("", "<input type='radio' name='lingua' id='b1' value='3' ></input>", "<input type='radio' name='lingua' id='b1' value='3' ></input>"); ?>
<?php imprime("", "<label for='b1'>B1</label>", "<label for='b1'>B1</label>"); ?>
<?php imprime("", "<input type='radio' name='lingua' id='b2' value='4' ></input>", "<input type='radio' name='lingua' id='b2' value='4' ></input>"); ?>
<?php imprime("", "<label for='b2'>B2</label>", "<label for='b2'>B2</label>"); ?>
<?php imprime("", "<input type='radio' name='lingua' id='c1' value='5' ></input>", "<input type='radio' name='lingua' id='c1' value='5' ></input>"); ?>
<?php imprime("", "<label for='c1'>C1</label>", " <label for='c1'>C1</label>"); ?>
<?php imprime("", "<input type='radio' name='lingua' id='c2' value='6' ></input>", "<input type='radio' name='lingua' id='c2' value='6' ></input>"); ?>
<?php imprime("", " <label for='c2'>C2</label>", " <label for='c2'>C2</label>"); ?>
<?php
$sie_niveis = array('A1' => 1, 'A2' => 2, 'B1' => 3, 'B2' => 4, 'C1' => 5, 'C2' => 6);
foreach ($sie_niveis as $sie_rotulo => $sie_valor) {
// Frances (BRAFITEC) e Ingles (POLITO) usam name='lingua'; nunca aparecem juntos, podem compartilhar o id.
$sie_radio = "<input type='radio' name='lingua' id='lng_{$sie_valor}' value='{$sie_valor}'> <label for='lng_{$sie_valor}'>{$sie_rotulo}</label> ";
imprime("", $sie_radio, $sie_radio);
}
?>
<?php imprime("", "</td>", "</td>"); ?>
<?php imprime("", "</tr>", "</tr>"); ?>
@@ -600,18 +618,12 @@ ob_start();
<?php imprime("", "", "<tr>") ?>
<?php imprime("", "", "<td> <label> Italiano: </label> </td>") ?>
<?php imprime("", "", "<td>") ?>
<?php imprime("", "", "<input type='radio' name='lingua2' id='a1' value='1' ></input>") ?>
<?php imprime("", "", "<label for='a1'>A1</label>") ?>
<?php imprime("", "", "<input type='radio' name='lingua2' id='a2' value='2' ></input>") ?>
<?php imprime("", "", "<label for='a2'>A2</label>") ?>
<?php imprime("", "", "<input type='radio' name='lingua2' id='b1' value='3' ></input>") ?>
<?php imprime("", "", "<label for='b1'>B1</label>") ?>
<?php imprime("", "", "<input type='radio' name='lingua2' id='b2' value='4' ></input>") ?>
<?php imprime("", "", "<label for='b2'>B2</label>") ?>
<?php imprime("", "", "<input type='radio' name='lingua2' id='c1' value='5' ></input>") ?>
<?php imprime("", "", " <label for='c1'>C1</label>") ?>
<?php imprime("", "", "<input type='radio' name='lingua2' id='c2' value='6' ></input>") ?>
<?php imprime("", "", "<label for='c2'>C2</label>") ?>
<?php
foreach ($sie_niveis as $sie_rotulo => $sie_valor) {
$sie_radio2 = "<input type='radio' name='lingua2' id='lng2_{$sie_valor}' value='{$sie_valor}'> <label for='lng2_{$sie_valor}'>{$sie_rotulo}</label> ";
imprime("", "", $sie_radio2);
}
?>
<?php imprime("", "</td>", "</td>") ?>
<?php imprime("", "</tr>", "</tr>") ?>
@@ -637,14 +649,12 @@ ob_start();
<input type="submit" name="calcular" id="calcular" value="Calcular nota">
<br><br>
<input type="reset" value="Reiniciar dados">
<input type="reset" value="Reiniciar dados" onclick="window.location.href='<?php echo \esc_url( \get_permalink() ); ?>';" />
<br>
</form>
</div>
</div>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<script type="text/javascript">
function start() {
var inputReproRec = document.querySelector("#repro_rec");
@@ -714,4 +724,17 @@ start();
return ob_get_clean();
}
function register_assets() {
// MathJax 3 renderiza as formulas $$...$$. Registrado aqui e carregado via
// wp_enqueue_script() so quando o shortcode aparece na pagina; no rodape e async.
\wp_register_script(
'mathjax',
'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js',
array(),
'3',
array( 'in_footer' => true, 'strategy' => 'async' )
);
}
\add_action( 'wp_enqueue_scripts', __NAMESPACE__ . '\\register_assets' );
\add_shortcode( 'simulador_mob', __NAMESPACE__ . '\\simulador_mob_shortcode' );