From 5516a061c984eab2f4a93e5eb0934d2aa26ad823 Mon Sep 17 00:00:00 2001 From: Eriksen Costa Paixão Date: Thu, 6 May 2010 23:18:06 +0000 Subject: [PATCH] Atualizado relatório '''Alunos 5ª Avaliação''' para usar o ''service'' {{{Avaliacao_Service_Boletim}}}: --- ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao.php | 4 ++-- ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao_proc.php | 372 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ieducar/intranet/include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php | 2 ++ ieducar/misc/database/deltas/19_atualiza_nome_de_relatorio_no_menu_e_permissoes.sql | 17 +++++++++++++++++ ieducar/misc/database/ieducar.sql | 5 +++-- ieducar/modules/Avaliacao/Service/Boletim.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/TabelaArredondamento/Model/Tabela.php | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/TabelaArredondamento/_tests/TabelaTest.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 470 insertions(+), 216 deletions(-) create mode 100644 ieducar/misc/database/deltas/19_atualiza_nome_de_relatorio_no_menu_e_permissoes.sql diff --git a/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao.php b/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao.php index c132b6d..257f73f 100644 --- a/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao.php +++ b/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao.php @@ -48,7 +48,7 @@ class clsIndexBase extends clsBase { function Formular() { - $this->SetTitulo($this->_instituicao . ' i-Educar - Alunos em 5ª Avaliação'); + $this->SetTitulo($this->_instituicao . ' i-Educar - Alunos em Exame'); $this->processoAp = 807; } } @@ -208,7 +208,7 @@ function acao2() return; } - showExpansivelImprimir(400, 200,'',[], 'Quinta Avaliação'); + showExpansivelImprimir(400, 200,'',[], 'Alunos em Exame'); document.formcadastro.target = 'miolo_' + (DOM_divs.length - 1); diff --git a/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao_proc.php b/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao_proc.php index 2df4bbd..7337989 100644 --- a/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao_proc.php +++ b/ieducar/intranet/educar_relatorio_alunos_quinta_avaliacao_proc.php @@ -34,6 +34,10 @@ require_once 'include/clsBanco.inc.php'; require_once 'include/pmieducar/geral.inc.php'; require_once 'include/relatorio.inc.php'; +require_once 'Avaliacao/Service/Boletim.php'; +require_once 'ComponenteCurricular/Model/ComponenteDataMapper.php'; +require_once 'RegraAvaliacao/Model/RegraDataMapper.php'; + /** * clsIndexBase class. * @@ -48,7 +52,7 @@ class clsIndexBase extends clsBase { function Formular() { - $this->SetTitulo($this->_instituicao . ' i-Educar - Alunos em 5ª Avaliação'); + $this->SetTitulo($this->_instituicao . ' i-Educar - Alunos em Exame'); $this->processoAp = 807; $this->renderMenu = FALSE; $this->renderMenuSuspenso = FALSE; @@ -77,13 +81,8 @@ class indice extends clsCadastro var $ano; - var $cursos = array(); - var $get_link; - var $media; - var $media_exame; - function renderHTML() { if ($_POST){ @@ -99,259 +98,208 @@ class indice extends clsCadastro $fonte = 'arial'; $corTexto = '#000000'; - if (is_numeric($this->ref_cod_escola) && is_numeric($this->ref_cod_curso) && - is_numeric($this->ref_cod_serie) && is_numeric($this->ref_cod_turma) && - is_numeric($this->ano) + if (!is_numeric($this->ref_cod_escola) || !is_numeric($this->ref_cod_curso) || + !is_numeric($this->ref_cod_serie) || !is_numeric($this->ref_cod_turma) || + !is_numeric($this->ano) ) { - + print $this->getError(); + return; } - $obj_ref_cod_curso = new clsPmieducarCurso($this->ref_cod_curso); - $det_ref_cod_curso = $obj_ref_cod_curso->detalhe(); - - $nm_curso = $det_ref_cod_curso['nm_curso']; - $padrao_ano_escolar = $det_ref_cod_curso['padrao_ano_escolar']; - - if ($padrao_ano_escolar) { - $obj_ano_letivo = new clsPmieducarEscolaAnoLetivo(); - $lst_ano_letivo = $obj_ano_letivo->lista($this->ref_cod_escola, $this->ano, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); - - if (is_array($lst_ano_letivo)) { - $det_ano_letivo = array_shift($lst_ano_letivo); - $ano_letivo = $det_ano_letivo['ano']; - - $obj_ano_letivo_modulo = new clsPmieducarAnoLetivoModulo(); - $lst_ano_letivo_modulo = $obj_ano_letivo_modulo->lista($ano_letivo, $this->ref_cod_escola); - - if (is_array($lst_ano_letivo_modulo)) { - $qtd_modulos = count($lst_ano_letivo_modulo); - } - } - else { - echo ' - '; - - return TRUE; - } - } - else { - $obj_turma_modulo = new clsPmieducarTurmaModulo(); - $lst_turma_modulo = $obj_turma_modulo->lista($registro['ref_cod_turma']); - - if (is_array($lst_turma_modulo)) { - $qtd_modulos = count($lst_turma_modulo); - } - } - - if ($this->ano == date('Y')) { - $sql = sprintf(' - SELECT - m.cod_matricula, - ( - SELECT - nome - FROM - pmieducar.aluno al, - cadastro.pessoa - WHERE - al.cod_aluno = m.ref_cod_aluno - AND al.ref_idpes = pessoa.idpes - ) AS nome - FROM - pmieducar.matricula m, - pmieducar.matricula_turma mt - WHERE - mt.ref_cod_turma = %d - AND mt.ref_cod_matricula = m.cod_matricula - AND m.aprovado = 3 - AND mt.ativo = 1 AND m.ativo = 1 - AND m.modulo > %d - AND m.ano = %d - ORDER BY - nome', $this->ref_cod_turma, $qtd_modulos, $this->ano); - } - else { - $sql = sprintf(' + // Instituição + $obj_instituicao = new clsPmieducarInstituicao($this->ref_cod_instituicao); + $nm_instituicao = $obj_instituicao->detalhe(); + $nm_instituicao = $nm_instituicao['nm_instituicao']; + + // Escola + $obj_escola = new clsPmieducarEscola($this->ref_cod_escola); + $nm_escola = $obj_escola->detalhe(); + $nm_escola = $nm_escola['nome']; + + // Curso + $obj_curso = new clsPmieducarCurso($this->ref_cod_curso); + $obj_curso->setCamposLista('media, media_exame, nm_curso'); + $det_curso = $obj_curso->detalhe(); + $nm_curso = $det_curso['nm_curso']; + + // Série + $obj_serie = new clsPmieducarSerie($this->ref_cod_serie); + $obj_serie->setCamposLista('nm_serie'); + $det_serie = $obj_serie->detalhe(); + $nm_serie = $det_serie['nm_serie']; + $regraId = $det_serie['regra_avaliacao_id']; + + // Turma + $obj_turma = new clsPmieducarTurma($this->ref_cod_turma); + $obj_turma->setCamposLista('nm_turma'); + $det_turma = $obj_turma->detalhe(); + $nm_turma = $det_turma['nm_turma']; + + // Situação da matrícula do aluno (aprovado) + $situacao = $this->ano == date('Y') ? + App_Model_MatriculaSituacao::EM_ANDAMENTO : + implode(', ', array( + App_Model_MatriculaSituacao::APROVADO, + App_Model_MatriculaSituacao::REPROVADO, + App_Model_MatriculaSituacao::EM_ANDAMENTO + )); + + $sql = sprintf(' + SELECT + m.cod_matricula, + ( SELECT - m.cod_matricula, - ( - SELECT - nome - FROM - pmieducar.aluno al, - cadastro.pessoa - WHERE - al.cod_aluno = m.ref_cod_aluno - AND al.ref_idpes = pessoa.idpes - ) AS nome + nome FROM - pmieducar.matricula m, - pmieducar.matricula_turma mt + pmieducar.aluno al, + cadastro.pessoa WHERE - mt.ref_cod_turma = %d - AND mt.ref_cod_matricula = m.cod_matricula - AND m.aprovado IN (1, 2, 3) - AND mt.ativo = 1 AND m.ativo = 1 - AND m.modulo > %d - AND m.ano = %d - ORDER BY - nome', $this->ref_cod_turma, $qtd_modulos, $this->ano); - } + al.cod_aluno = m.ref_cod_aluno + AND al.ref_idpes = pessoa.idpes + ) AS nome + FROM + pmieducar.matricula m, + pmieducar.matricula_turma mt + WHERE + mt.ref_cod_turma = %d + AND mt.ref_cod_matricula = m.cod_matricula + AND m.aprovado IN (%s) + AND mt.ativo = 1 + AND m.ativo = 1 + AND m.ano = %d + ORDER BY + nome', $this->ref_cod_turma, $situacao, $this->ano); $db = new clsBanco(); $db->Consulta($sql); + // Mappers + $regraMapper = new RegraAvaliacao_Model_RegraDataMapper(); + $componenteMapper = new ComponenteCurricular_Model_ComponenteDataMapper(); + + $regra = $regraMapper->find($regraId); + if (is_null($regra->formulaRecuperacao)) { + $regra = 'A regra de avaliação dessa série não possui uma fórmula de cálculo de recuperação.'; + } + else { + $regra = sprintf('Recuperação: %s; fórmula: %s.', $regra->formulaRecuperacao, $regra->formulaRecuperacao->formulaMedia); + } + if ($db->Num_Linhas()) { $alunos = array(); // Disciplinas da escola-série $obj_disciplinas = new clsPmieducarEscolaSerieDisciplina(); - $obj_disciplinas->setOrderby('nm_disciplina'); - $obj_disciplinas->setCamposLista('cod_disciplina, nm_disciplina'); $lst_disciplinas = $obj_disciplinas->lista($this->ref_cod_serie, - $this->ref_cod_escola, NULL, 1, TRUE); - - // Curso - $obj_curso = new clsPmieducarCurso($this->ref_cod_curso); - $obj_curso->setCamposLista('media, media_exame, nm_curso'); - $det_curso = $obj_curso->detalhe(); - - $this->media = $det_curso['media']; - $this->media_exame = $det_curso['media_exame']; + $this->ref_cod_escola, NULL, 1); // Instancia objeto de relatório padrão - $detalhes = sprintf('%s%s%s%s%s%s%s - Turma: %s %s', $this->nm_instituicao, - "\n", $this->nm_escola, "\n", $this->nm_curso, "\n", $this->nm_serie, - $this->nm_turma, date('d/m/Y')); + $detalhes = sprintf('%s%s%s%s%s%s%s - Turma: %s %s', $nm_instituicao, + "\n", $nm_escola, "\n", $nm_curso, "\n", $nm_serie, + $nm_turma, date('d/m/Y')); - $relatorio = new relatorios('Relação de alunos em 5ª avaliação', 210, - FALSE, 'Relação de alunos em 5ª avaliação', 'A4', $detalhes); + $relatorio = new relatorios('Relação de alunos em exame', 210, + FALSE, 'Relação de alunos em exame', 'A4', $detalhes); + $relatorio->exibe_produzido_por = FALSE; $relatorio->setMargem(20, 20, 20, 20); - // Escola - $obj_escola = new clsPmieducarEscola($this->ref_cod_escola); - $nm_escola = $obj_escola->detalhe(); - $nm_escola = $nm_escola['nome']; - $nm_curso = $det_curso['nm_curso']; - - // Série - $obj_serie = new clsPmieducarSerie($this->ref_cod_serie); - $obj_serie->setCamposLista('nm_serie'); - $det_serie = $obj_serie->detalhe(); - $nm_serie = $det_serie['nm_serie']; - - // Turma - $obj_turma = new clsPmieducarTurma($this->ref_cod_turma); - $obj_turma->setCamposLista('nm_turma'); - $det_turma = $obj_turma->detalhe(); - $nm_turma = $det_turma['nm_turma']; - $relatorio->novalinha(array(sprintf('Nome Escola: %s Ano: %d', $nm_escola, $this->ano)), 0, 12, TRUE, 'arial', FALSE, '#000000', '#d3d3d3', '#FFFFFF', FALSE, TRUE); - $relatorio->novalinha(array(sprintf('Curso: %s Ano/Série: %s Turma: %s Date: %s', $nm_curso, $nm_serie, $nm_turma, date('d/m/Y'))), + $relatorio->novalinha(array(sprintf('Curso: %s Ano/Série: %s Turma: %s', $nm_curso, $nm_serie, $nm_turma)), + 0, 12, TRUE, 'arial', FALSE, '#000000', '#d3d3d3', '#FFFFFF', FALSE, TRUE); + + $relatorio->novalinha(array(sprintf('%s Data: %s', $regra, date('d/m/Y'))), 0, 12, TRUE, 'arial', FALSE, '#000000', '#d3d3d3', '#FFFFFF', FALSE, TRUE); - $relatorio->novalinha(array('Matrícula', 'Nome Aluno', 'Disciplinas', 'Pontos', 'Nota 5º Av. Passar'), - 0, 12, TRUE, 'arial', array(50, 200, 150, 50), '#515151', '#d3d3d3', '#FFFFFF', FALSE, TRUE); + $relatorio->novalinha(array('Mat.', 'Nome Aluno', 'Componentes', 'Média', 'Nota necessária (mín.)'), + 0, 12, TRUE, 'arial', array(30, 180, 150, 60), '#515151', '#d3d3d3', '#FFFFFF', FALSE, TRUE); while ($db->ProximoRegistro()) { list($cod_matricula, $nome_aluno) = $db->Tupla(); - foreach ($lst_disciplinas as $disciplina) { - $obj_nota_aluno = new clsPmieducarNotaAluno(); - $obj_nota_aluno->setOrderby('modulo ASC'); - $lst_nota_aluno = $obj_nota_aluno->lista(NULL, NULL, NULL, - $this->ref_cod_serie, $this->ref_cod_escola, $disciplina['cod_disciplina'], - $cod_matricula, NULL, NULL, NULL, NULL, NULL, NULL, 1); + $boletim = new Avaliacao_Service_Boletim(array( + 'matricula' => $cod_matricula, + 'RegraDataMapper' => $regraMapper, + 'ComponenteDataMapper' => $componenteMapper + )); - $aluno_notas = array(); - $aluno_notas_normal = array(); + $componentes = $boletim->getComponentes(); + $medias = $boletim->getMediasComponentes(); + $situacao = $boletim->getSituacaoComponentesCurriculares(); - if (is_array($lst_nota_aluno)) { - $aluno_notas[$disciplina['cod_disciplina']] = 0; - - foreach ($lst_nota_aluno as $nota_aluno) { - $obj_avaliacao_valores = new clsPmieducarTipoAvaliacaoValores( - $nota_aluno['ref_ref_cod_tipo_avaliacao'], $nota_aluno['ref_sequencial'] - ); - - $det_avaliacao_valores = $obj_avaliacao_valores->detalhe(); - - $aluno_notas[$disciplina['cod_disciplina']] += $det_avaliacao_valores['valor']; - } + if ($situacao->situacao != App_Model_MatriculaSituacao::EM_EXAME) { + continue; + } - $aluno_notas_normal[$disciplina['cod_disciplina']] = $aluno_notas[$disciplina['cod_disciplina']]; + foreach ($situacao->componentesCurriculares as $id => $situacaoComponente) { + if ($situacaoComponente->situacao != App_Model_MatriculaSituacao::EM_EXAME) { + continue; + } - $aluno_notas[$disciplina['cod_disciplina']] /= count($lst_nota_aluno); + $mediaRecuperacao = $boletim->preverNotaRecuperacao($id); - $aluno_notas[$disciplina['cod_disciplina']] = sprintf('%01.1f', $aluno_notas[$disciplina['cod_disciplina']]); + if (!is_null($mediaRecuperacao)) { + $previsao = sprintf('%s (%.2f)', $mediaRecuperacao->nome, $mediaRecuperacao->valorMinimo); } - - if (is_array($aluno_notas)) { - foreach ($aluno_notas as $cod_disciplina => $media) { - if ($media < $this->media && $this->media_exame) { - // @todo WTF!??? Que diabos de nota fixa é essa? - // FÓRMULA: 30 - (SOMA DE PONTOS DOS 4 BIMESTRES) / 2. - // Ex: 30 - 23 / 2 = 3,5 - $nota_necessaria_passar = (30 - $aluno_notas_normal[$cod_disciplina]) / 2; - - $data = array( - $cod_matricula, - $nome_aluno, - $disciplina['nm_disciplina'], - $aluno_notas_normal[$cod_disciplina], - $nota_necessaria_passar - ); - - $relatorio->novalinha($data, 0, 12, FALSE, 'arial', - array(50, 200, 150, 50), '#515151', '#d3d3d3', '#FFFFFF', FALSE, TRUE); - } - } + else { + $previsao = 'Nenhuma nota possível.'; } - } - } - $this->get_link = $relatorio->fechaPdf(); + $data = array( + $cod_matricula, + $nome_aluno, + $componentes[$id], + $medias[$id][0]->mediaArredondada, + $previsao + ); - echo sprintf(' - ', $this->get_link); - - echo sprintf(' - -
- Se o download não iniciar automaticamente
- clique aqui!

- - Para visualizar os arquivos PDF, é necessário instalar o Adobe Acrobat Reader.
- Clique na Imagem para Baixar o instalador

-
-
-
- ', $this->get_link); + $relatorio->novalinha($data, 0, 12, FALSE, 'arial', + array(30, 180, 150, 60), '#515151', '#d3d3d3', '#FFFFFF', FALSE, TRUE); + } + } } else { - echo ' - '; + ', $this->get_link); + + echo sprintf(' + +
+ Se o download não iniciar automaticamente
+ clique aqui!

+ + Para visualizar os arquivos PDF, é necessário instalar o Adobe Acrobat Reader.
+ Clique na Imagem para Baixar o instalador

+
+
+
+ ', $this->get_link); + } - echo 'Nenhum aluno está em exame'; - } + function getError() + { + return ' + ' . + 'Nenhum aluno está em exame'; } function Editar() diff --git a/ieducar/intranet/include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php b/ieducar/intranet/include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php index 243bd64..bc26a4f 100644 --- a/ieducar/intranet/include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php +++ b/ieducar/intranet/include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php @@ -258,6 +258,8 @@ class clsPmieducarEscolaSerieDisciplina /** * Retorna uma lista de registros filtrados de acordo com os parâmetros. * @return array + * @todo Refatorar o primeiro if, tabela referenciada não armazena mais os + * componentes curriculares */ function lista($int_ref_ref_cod_serie = NULL, $int_ref_ref_cod_escola = NULL, $int_ref_cod_disciplina = NULL, $int_ativo = NULL, $boo_nome_disc = FALSE) diff --git a/ieducar/misc/database/deltas/19_atualiza_nome_de_relatorio_no_menu_e_permissoes.sql b/ieducar/misc/database/deltas/19_atualiza_nome_de_relatorio_no_menu_e_permissoes.sql new file mode 100644 index 0000000..01cda35 --- /dev/null +++ b/ieducar/misc/database/deltas/19_atualiza_nome_de_relatorio_no_menu_e_permissoes.sql @@ -0,0 +1,17 @@ +-- // + +-- +-- @author Eriksen Costa Paixão +-- @license @@license@@ +-- @version $Id$ +-- + +UPDATE portal.menu_submenu SET nm_submenu = 'Alunos em Exame' WHERE cod_menu_submenu = 917; +UPDATE pmicontrolesis.menu SET tt_menu = 'Alunos em Exame' WHERE cod_menu = 21184; + +-- //@UNDO + +UPDATE portal.menu_submenu SET nm_submenu = 'Alunos 5ª Avaliação' WHERE cod_menu_submenu = 917; +UPDATE pmicontrolesis.menu SET tt_menu = 'Alunos 5ª Avaliação' WHERE cod_menu = 21184; + +-- // \ No newline at end of file diff --git a/ieducar/misc/database/ieducar.sql b/ieducar/misc/database/ieducar.sql index dd616bf..b0584a6 100644 --- a/ieducar/misc/database/ieducar.sql +++ b/ieducar/misc/database/ieducar.sql @@ -17935,7 +17935,6 @@ INSERT INTO menu VALUES (21180, 911, 21126, 'Ficha de Rematrícula', 22, 'educar_ INSERT INTO menu VALUES (21181, 835, 21124, 'Relatório Quadros de Horário', 25, 'educar_relatorio_quadro_horario.php', '_self', 1, 15, 105); INSERT INTO menu VALUES (21182, 916, 21126, 'Registro de Trans. Expedidas', 25, 'educar_relatorio_registro_transferencias.php', '_self', 1, 15, 1); INSERT INTO menu VALUES (21183, 774, 21126, 'Relatório Alunos Idade x Sexo', 25, 'educar_relatorio_quadro_idade_sexo_serie.php', '_self', 1, 15, 1); -INSERT INTO menu VALUES (21184, 917, 21126, 'Alunos 5ª Avaliação', 26, 'educar_relatorio_alunos_quinta_avaliacao.php', '_self', 1, 15, 1); INSERT INTO menu VALUES (21185, 918, 21126, 'Ata Resultado Final', 28, 'educar_relatorio_ata_resultado_final.php', '_self', 1, 15, 1); INSERT INTO menu VALUES (21186, 836, 21126, 'Relatório de alunos por idade', 30, 'educar_relatorio_alunos_idade.php', '_self', 1, 15, 1); INSERT INTO menu VALUES (21187, 823, 21126, 'Resultado Final', 30, 'educar_relatorio_resultado_final.php', '_self', 1, 15, 1); @@ -17980,6 +17979,7 @@ INSERT INTO menu VALUES (21227, 947, 21226, 'Listar Regras', 0, 'module/RegraAva INSERT INTO menu VALUES (21228, 948, 21226, 'Fórmulas de Cálculo de Média', 1, 'module/FormulaMedia/index', '_self', 1, 15, 198); INSERT INTO menu VALUES (21229, 949, 21226, 'Tabelas de Arredondamento', 2, 'module/TabelaArredondamento/index', '_self', 1, 15, 199); INSERT INTO menu VALUES (21230, 693, 21126, 'Registro de Matrículas', 30, 'educar_relatorio_registro_matriculas.php', '_self', 1, 15, 1); +INSERT INTO menu VALUES (21184, 917, 21126, 'Alunos em Exame', 26, 'educar_relatorio_alunos_quinta_avaliacao.php', '_self', 1, 15, 1); -- @@ -19951,7 +19951,6 @@ INSERT INTO menu_submenu VALUES (845, 55, 2, 'Rematrícula Automática', 'educar_a INSERT INTO menu_submenu VALUES (944, 55, 2, 'Demonstrativo Alunos Defasados Nominal', 'educar_alunos_defasados_nominal.php', '', 3); INSERT INTO menu_submenu VALUES (930, 55, 2, 'Levantamento Alfab. e não Alfab.', 'educar_relatorio_alfabetizados.php', '', 3); INSERT INTO menu_submenu VALUES (918, 55, 2, 'Ata Resultado Final', 'educar_relatorio_ata_resultado_final.php', '', 3); -INSERT INTO menu_submenu VALUES (917, 55, 2, 'Alunos 5ª Avaliação', 'educar_relatorio_alunos_quinta_avaliacao.php', '', 3); INSERT INTO menu_submenu VALUES (911, 55, 2, 'Ficha de Rematrícula', 'educar_relatorio_ficha_rematricula.php', '', 3); INSERT INTO menu_submenu VALUES (916, 55, 2, 'Registro de Transferências Expedidas', 'educar_relatorio_registro_transferencias.php', '', 3); INSERT INTO menu_submenu VALUES (900, 55, 2, 'Relação de Alunos ANEEs Quantidade', 'educar_relatorio_relacao_qtd_aluno_pnee_escola.php', '', 3); @@ -19987,6 +19986,7 @@ INSERT INTO menu_submenu VALUES (946, 55, 2, 'Componentes Curriculares', 'module INSERT INTO menu_submenu VALUES (947, 55, 2, 'Regras de Avaliação', 'module/RegraAvaliacao/index', '', 3); INSERT INTO menu_submenu VALUES (948, 55, 2, 'Fórmula de Cálculo de Média', 'module/FormulaMedia/index', '', 3); INSERT INTO menu_submenu VALUES (949, 55, 2, 'Tabelas de Arredondamento de Nota', 'module/TabelaArredondamento/index', '', 3); +INSERT INTO menu_submenu VALUES (917, 55, 2, 'Alunos em Exame', 'educar_relatorio_alunos_quinta_avaliacao.php', '', 3); -- @@ -20097,6 +20097,7 @@ INSERT INTO changelog VALUES (15, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '15_atua INSERT INTO changelog VALUES (16, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '16_permissoes_para_modules_e_correcao_menus.sql'); INSERT INTO changelog VALUES (17, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '17_adiciona_campo_curso_componente_ano_escolar_e_atualiza_constraint_servidor_disciplina.sql'); INSERT INTO changelog VALUES (18, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '18_cria_tabelas_de_parecer_descritivo.sql'); +INSERT INTO changelog VALUES (19, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '19_atualiza_nome_de_relatorio_no_menu_e_permissoes.sql'); -- diff --git a/ieducar/modules/Avaliacao/Service/Boletim.php b/ieducar/modules/Avaliacao/Service/Boletim.php index a780e84..d7a574e 100644 --- a/ieducar/modules/Avaliacao/Service/Boletim.php +++ b/ieducar/modules/Avaliacao/Service/Boletim.php @@ -2107,13 +2107,62 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable return $this->getRegra()->tabelaArredondamento->round($nota); } + /** + * Prevê a nota necessária para que o aluno seja aprovado após a recuperação + * escolar. + * + * @param int $id + * @return TabelaArredondamento_Model_TabelaValor|NULL + * @see TabelaArredondamento_Model_Tabela#predictValue() + */ + public function preverNotaRecuperacao($id) + { + if (is_null($this->getRegra()->formulaRecuperacao) || !isset($this->_notasComponentes[$id])) { + return NULL; + } + + $notas = $this->_notasComponentes[$id]; + $somaEtapas = array_sum(CoreExt_Entity::entityFilterAttr($notas, 'etapa', 'nota')); + $formula = $this->getRegra()->formulaRecuperacao; + + $data = array( + 'formulaValues' => array( + 'Se' => $somaEtapas, + 'Et' => $this->getOption('etapas'), + 'Rc' => NULL + ), + 'expected' => array( + 'var' => 'Rc', + 'value' => $this->getRegra()->media + ) + ); + + foreach ($notas as $nota) { + $data['formulaValues']['E' . $nota->etapa] = $nota->nota; + } + return $this->getRegra()->tabelaArredondamento->predictValue($formula, $data); + } + /** + * @param numeric $falta + * @param numeric $horaFalta + * @return numeric + */ protected function _calculateHoraFalta($falta, $horaFalta) { return ($falta * $horaFalta); } + /** + * Calcula a proporção de $num2 para $num1. + * + * @param numeric $num1 + * @param numeric $num2 + * @param bool $decimal Opcional. Se o resultado é retornado como decimal + * ou percentual. O padrão é TRUE. + * @return float + */ protected function _calculatePorcentagem($num1, $num2, $decimal = TRUE) { $num1 = floatval($num1); diff --git a/ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php b/ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php index 543b265..f55a137 100644 --- a/ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php +++ b/ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php @@ -122,4 +122,55 @@ class Avaliacao_Service_UtilityTest extends Avaliacao_Service_TestCommon $this->assertEquals('S', $service->arredondaNota(6.50)); $this->assertEquals('O', $service->arredondaNota(9.15)); } + + public function testPreverNotaParaRecuperacao() + { + // Define as notas do aluno + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + $notas = array( + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 4, + 'etapa' => 1 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 4, + 'etapa' => 2 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 4, + 'etapa' => 3 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 4, + 'etapa' => 4 + )), + ); + + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($notas)); + + $this->_setNotaComponenteDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + + $expected = new TabelaArredondamento_Model_TabelaValor(array( + 'nome' => 10, + 'valorMinimo' => 9, + 'valorMaximo' => 10 + )); + + $ret = $service->preverNotaRecuperacao(1); + $this->assertEquals(array($expected->nome, $expected->valorMinimo, $expected->valorMaximo), + array($ret->nome, $ret->valorMinimo, $ret->valorMaximo)); + } } \ No newline at end of file diff --git a/ieducar/modules/TabelaArredondamento/Model/Tabela.php b/ieducar/modules/TabelaArredondamento/Model/Tabela.php index 8071159..127036c 100644 --- a/ieducar/modules/TabelaArredondamento/Model/Tabela.php +++ b/ieducar/modules/TabelaArredondamento/Model/Tabela.php @@ -137,6 +137,106 @@ class TabelaArredondamento_Model_Tabela extends CoreExt_Entity } /** + * Prevê em qual range de arredondamento de acordo com um valor esperado. A + * definição do valor a retornar é dada por uma instância de + * FormulaMedia_Model_Formula e um array com valores para as tokens da fórmula + * e o valor da variável a prever. Exemplo: + * + * + * array( + * 'Se' => 16, + * 'Et' => 4, + * 'E1' => 4, + * 'E2' => 4, + * 'E3' => 4, + * 'E4' => 4, + * 'Rc' => NULL + * ), + * 'expected' => array( + * 'var' => 'Rc', + * 'value' => 6 + * ) + * ); + * + * + * @param FormulaMedia_Model_Formula $formula + * @param array $data + * @return TabelaArredondamento_Model_TabelaValor|NULL Retorna NULL caso + * nenhuma instância de TabelaArredondamento_Model_TabelaValor corresponda + * ao valor esperado + * @todo Considerar o atributo valorMaximo da instância para o cálculo da + * fórmula. Pode ser útil para os casos de notas conceituais (Exemplo: uma + * nota "EP" que tem o range 5.25 a 7, sendo 6 a média de aprovação. Nesse + * caso somente o próximo range (se houvesse) daria o valor esperado para + * alcançar a média 6). + */ + public function predictValue(FormulaMedia_Model_Formula $formula, array $data) + { + $values = $data['formulaValues']; + $scale = pow(10, $this->_precision); + $return = NULL; + + if (0 == count($this->_tabelaValores)) { + $this->_tabelaValores = $this->getDataMapper()->findTabelaValor($this); + } + + $i = 0; + $total = count($this->_tabelaValores); + + foreach ($this->_tabelaValores as $tabelaValor) { + $process = array(); + $values[$data['expected']['var']] = $tabelaValor->valorMinimo; + $process[] = $values; + + // Se for o último item, verifica se a nota máxima também + if (++$i == $total) { + $values[$data['expected']['var']] = $tabelaValor->valorMaximo; + $process[] = $values; + } + + $valueRounded = $this->_getBestResultFromValuesArray($formula, $process); + + if ($valueRounded * $scale >= ($data['expected']['value'] * $scale)) { + $return = $tabelaValor; + break; + } + } + + return $return; + } + + /** + * @param FormulaMedia_Model_Formula $formula + * @param array $values + * @return TabelaArredondamento_Model_TabelaValor|NULL + */ + protected function _getBestResultFromValuesArray(FormulaMedia_Model_Formula $formula, array $values) + { + $best = NULL; + + foreach ($values as $value) { + $value = $formula->execFormulaMedia($value); + $rounded = $this->round($value); + + if (is_null($best)) { + $best = $rounded; + continue; + } + + if ($best < $rounded) { + $best = $rounded; + } + } + + return $rounded; + } + + /** * Método finder para TabelaArredondamento_Model_TabelaValor. Wrapper simples * para o mesmo método de TabelaArredondamento_Model_TabelaDataMapper. * diff --git a/ieducar/modules/TabelaArredondamento/_tests/TabelaTest.php b/ieducar/modules/TabelaArredondamento/_tests/TabelaTest.php index b7dcf6c..d5a21b4 100644 --- a/ieducar/modules/TabelaArredondamento/_tests/TabelaTest.php +++ b/ieducar/modules/TabelaArredondamento/_tests/TabelaTest.php @@ -32,6 +32,7 @@ require_once 'TabelaArredondamento/Model/Tabela.php'; require_once 'TabelaArredondamento/Model/TabelaDataMapper.php'; require_once 'TabelaArredondamento/Model/TabelaValorDataMapper.php'; +require_once 'FormulaMedia/Model/Formula.php'; require_once 'include/pmieducar/clsPmieducarInstituicao.inc.php'; /** @@ -142,6 +143,91 @@ class TabelaTest extends UnitBaseTest } } + public function testCalculoDeNotaNecessariaParaMedia() + { + $this->_entity->getDataMapper()->setTabelaValorDataMapper($this->_getMockTabelaValor()); + + $formula = new FormulaMedia_Model_Formula(array( + 'formulaMedia' => '(Se / Et * 0.6) + (Rc * 0.4)', + 'tipoFormula' => FormulaMedia_Model_TipoFormula::MEDIA_RECUPERACAO + )); + + $expected = new TabelaArredondamento_Model_TabelaValor(array( + 'nome' => 10, + 'valorMinimo' => 9.751, + 'valorMaximo' => 10 + )); + + $data = array( + 'formulaValues' => array( + 'Se' => 13.334, + 'Et' => 4, + 'Rc' => NULL + ), + 'expected' => array( + 'var' => 'Rc', + 'value' => 6 + ) + ); + + $ret = $this->_entity->predictValue($formula, $data); + $this->assertEquals(array($expected->nome, $expected->valorMinimo, $expected->valorMaximo), + array($ret->nome, $ret->valorMinimo, $ret->valorMaximo)); + + $expected = new TabelaArredondamento_Model_TabelaValor(array( + 'nome' => 9, + 'valorMinimo' => 8.751, + 'valorMaximo' => 9.250 + )); + + $data = array( + 'formulaValues' => array( + 'Se' => 16, + 'Et' => 4, + 'Rc' => NULL + ), + 'expected' => array( + 'var' => 'Rc', + 'value' => 6 + ) + ); + + $ret = $this->_entity->predictValue($formula, $data); + $this->assertEquals(array($expected->nome, $expected->valorMinimo, $expected->valorMaximo), + array($ret->nome, $ret->valorMinimo, $ret->valorMaximo)); + + $formula = new FormulaMedia_Model_Formula(array( + 'formulaMedia' => '((E1 + E2 + E3 + E4) / 4 * 0.6) + (Rc * 0.4)', + 'tipoFormula' => FormulaMedia_Model_TipoFormula::MEDIA_RECUPERACAO + )); + + $expected = new TabelaArredondamento_Model_TabelaValor(array( + 'nome' => 9, + 'valorMinimo' => 8.751, + 'valorMaximo' => 9.250 + )); + + $data = array( + 'formulaValues' => array( + 'Se' => NULL, + 'Et' => NULL, + 'E1' => 4, + 'E2' => 4, + 'E3' => 4, + 'E4' => 4, + 'Rc' => NULL + ), + 'expected' => array( + 'var' => 'Rc', + 'value' => 6 + ) + ); + + $ret = $this->_entity->predictValue($formula, $data); + $this->assertEquals(array($expected->nome, $expected->valorMinimo, $expected->valorMaximo), + array($ret->nome, $ret->valorMinimo, $ret->valorMaximo)); + } + /** * @group CoreExt_Locale */ -- libgit2 0.21.2