From 3fd4d88c71f20ad53a2de0f6a1328898182ce219 Mon Sep 17 00:00:00 2001 From: Eriksen Costa Date: Sun, 19 Dec 2010 20:20:04 -0200 Subject: [PATCH] Removida a obrigatoriedade de lançamento de notas em Regra de Avaliação: --- ieducar/misc/database/deltas/33_atualiza_regra_avaliacao_nota_nao_mais_obrigatoria.sql | 34 ++++++++++++++++++++++++++++++++++ ieducar/misc/database/ieducar.sql | 3 ++- ieducar/modules/Avaliacao/Service/Boletim.php | 18 +++++++++++++----- ieducar/modules/Avaliacao/Views/BoletimController.php | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------- ieducar/modules/Avaliacao/Views/FaltaController.php | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- ieducar/modules/Avaliacao/Views/NotaController.php | 9 ++++++++- ieducar/modules/RegraAvaliacao/Model/Nota/TipoValor.php | 2 ++ ieducar/modules/RegraAvaliacao/Model/Regra.php | 28 +++++++++++++++++++++++----- ieducar/modules/RegraAvaliacao/Views/EditController.php | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- ieducar/modules/TabelaArredondamento/Model/Tabela.php | 6 +++++- ieducar/modules/TabelaArredondamento/Views/EditController.php | 4 +++- ieducar/modules/TabelaArredondamento/Views/TabelaTipoNotaAjax.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 408 insertions(+), 64 deletions(-) create mode 100644 ieducar/misc/database/deltas/33_atualiza_regra_avaliacao_nota_nao_mais_obrigatoria.sql create mode 100644 ieducar/modules/TabelaArredondamento/Views/TabelaTipoNotaAjax.php diff --git a/ieducar/misc/database/deltas/33_atualiza_regra_avaliacao_nota_nao_mais_obrigatoria.sql b/ieducar/misc/database/deltas/33_atualiza_regra_avaliacao_nota_nao_mais_obrigatoria.sql new file mode 100644 index 0000000..e7a3262 --- /dev/null +++ b/ieducar/misc/database/deltas/33_atualiza_regra_avaliacao_nota_nao_mais_obrigatoria.sql @@ -0,0 +1,34 @@ +-- // + +-- +-- Remove a obrigatoriedade de Fórmula de Média para uma Regra de Avaliação, +-- possibilitando que o campo contenha o valor NULL. +-- +-- @author Eriksen Costa +-- @license @@license@@ +-- @version $Id$ +-- + +ALTER TABLE modules.regra_avaliacao + ALTER COLUMN formula_media_id SET DEFAULT NULL; +ALTER TABLE modules.regra_avaliacao + ALTER COLUMN formula_media_id DROP NOT NULL; + +-- //@UNDO + +-- Não é o ideal, já que esse pode ser de uma instituição diferente. Mas como a +-- necessidade de um rollback é muito remota e precisamos satisfazer uma +-- foreign key, pegamos o primeiro id disponível. +UPDATE + modules.regra_avaliacao +SET + formula_media_id = (SELECT id FROM modules.formula_media OFFSET 0 LIMIT 1) +WHERE + formula_media_id IS NULL; + +ALTER TABLE modules.regra_avaliacao + ALTER COLUMN formula_media_id DROP DEFAULT; +ALTER TABLE modules.regra_avaliacao + ALTER COLUMN formula_media_id SET NOT NULL; + +-- // \ No newline at end of file diff --git a/ieducar/misc/database/ieducar.sql b/ieducar/misc/database/ieducar.sql index c7a7b36..2e22df6 100644 --- a/ieducar/misc/database/ieducar.sql +++ b/ieducar/misc/database/ieducar.sql @@ -10867,7 +10867,7 @@ SELECT pg_catalog.setval('parecer_geral_id_seq', 1, false); CREATE TABLE regra_avaliacao ( id integer NOT NULL, instituicao_id integer NOT NULL, - formula_media_id integer NOT NULL, + formula_media_id integer, formula_recuperacao_id integer DEFAULT 0, tabela_arredondamento_id integer, nome character varying(50) NOT NULL, @@ -25794,6 +25794,7 @@ INSERT INTO changelog VALUES (29, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '29_cria INSERT INTO changelog VALUES (30, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '30_cria_indices_otimizacao_queries_quadro_horarios.sql'); INSERT INTO changelog VALUES (31, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '31_remove_constraint_desnecessaria_pmieducar_quadro_horario_horarios.sql'); INSERT INTO changelog VALUES (32, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '32_corrige_comentario_em_indices.sql'); +INSERT INTO changelog VALUES (33, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '33_atualiza_regra_avaliacao_nota_nao_mais_obrigatoria.sql'); -- diff --git a/ieducar/modules/Avaliacao/Service/Boletim.php b/ieducar/modules/Avaliacao/Service/Boletim.php index 8de233e..7f44121 100644 --- a/ieducar/modules/Avaliacao/Service/Boletim.php +++ b/ieducar/modules/Avaliacao/Service/Boletim.php @@ -1163,11 +1163,6 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable */ public function getSituacaoComponentesCurriculares() { - // Carrega as médias pois este método pode ser chamado após a chamada a - // saveNotas(). - $mediasComponentes = $this->_loadNotaComponenteCurricularMedia() - ->getMediasComponentes(); - $situacao = new stdClass(); $situacao->situacao = 0; $situacao->componentesCurriculares = array(); @@ -1175,6 +1170,15 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable // A situação é "aprovado" por padrão $situacaoGeral = App_Model_MatriculaSituacao::APROVADO; + if ($this->getRegra()->get('tipoNota') == RegraAvaliacao_Model_Nota_TipoValor::NENHUM) { + return $situacao; + } + + // Carrega as médias pois este método pode ser chamado após a chamada a + // saveNotas(). + $mediasComponentes = $this->_loadNotaComponenteCurricularMedia() + ->getMediasComponentes(); + // Se não tiver nenhuma média ou a quantidade for diferente dos componentes // curriculares da matrícula, ainda está em andamento if (0 == count($mediasComponentes) || @@ -2261,6 +2265,10 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable */ public function saveNotas() { + if ($this->getRegra()->get('tipoNota') == RegraAvaliacao_Model_Nota_TipoValor::NENHUM) { + return $this; + } + $notaAluno = $this->_getNotaAluno(); $notas = $this->getNotas(); diff --git a/ieducar/modules/Avaliacao/Views/BoletimController.php b/ieducar/modules/Avaliacao/Views/BoletimController.php index 526b4c5..7513512 100644 --- a/ieducar/modules/Avaliacao/Views/BoletimController.php +++ b/ieducar/modules/Avaliacao/Views/BoletimController.php @@ -165,12 +165,27 @@ class BoletimController extends Core_Controller_Page_ViewController $this->addDetalhe(array('Série/Turma', $serie . ' / ' . $turma)); $this->addDetalhe(array('Situação', $situacao)); + // Booleano para saber se o tipo de nota é nenhum. + $nenhumaNota = ($this->_service->getRegra()->get('tipoNota') == + RegraAvaliacao_Model_Nota_TipoValor::NENHUM); + + // Booleano para saber o tipo de presença em que ocorre apuração + $porComponente = ($this->_service->getRegra()->get('tipoPresenca') == + RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE); + // Dados da regra de avaliação $this->addDetalhe(array('Regra avaliação', $this->_service->getRegra())); $this->addDetalhe(array('Apuração de falta', $this->_service->getRegra()->tipoPresenca)); $this->addDetalhe(array('Parecer descritivo', $this->_service->getRegra()->parecerDescritivo)); $this->addDetalhe(array('Progressão', $this->_service->getRegra()->tipoProgressao)); - $this->addDetalhe(array('Média', $this->_service->getRegra()->media)); + + if ($nenhumaNota) { + $media = 'Não usa nota'; + } + else { + $media = $this->_service->getRegra()->media; + } + $this->addDetalhe(array('Média', $media)); // Cria um array com a quantidade de etapas de 1 a n $etapas = range(1, $this->_service->getOption('etapas'), 1); @@ -186,10 +201,6 @@ class BoletimController extends Core_Controller_Page_ViewController 1 => array('style' => 'background-color: #FFFFFF') ); - // Booleano para saber o tipo de presença em que ocorre apuração - $porComponente = ($this->_service->getRegra()->get('tipoPresenca') == - RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE); - // Helper para criar links e urls $url = CoreExt_View_Helper_UrlHelper::getInstance(); @@ -208,7 +219,15 @@ class BoletimController extends Core_Controller_Page_ViewController foreach ($etapas as $etapa) { $data = array('data' => sprintf('Etapa %d', $etapa)); - $data['colspan'] = $porComponente ? 2 : 1; + + if ($nenhumaNota) { + $data['colspan'] = 1; + } + else { + $data['colspan'] = $porComponente ? 2 : 1; + } + + $data['attributes'] = $attributes; $labels[] = $data; } @@ -227,9 +246,15 @@ class BoletimController extends Core_Controller_Page_ViewController // Colspan para tabela com labels e sublabels $colspan += $porComponente && $sit->recuperacao ? 4 : 3; - $labels[] = array('data' => $porComponente ? '' : 'Média final', 'attributes' => $attributes, 'colspan' => $porComponente ? $colspan : 1); + if ($nenhumaNota) { + $colspan--; + } + + if (! $nenhumaNota) { + $labels[] = array('data' => $porComponente ? '' : 'Média', 'attributes' => $attributes, 'colspan' => $porComponente ? $colspan : 1); + } - // Inclui coluna para % de presença geral + // Inclui coluna para % de presença geral. if (!$porComponente) { if ($sit->recuperacao) { $labels[] = array('data' => 'Exame', 'attributes' => $attributes); @@ -250,11 +275,15 @@ class BoletimController extends Core_Controller_Page_ViewController $subLabels = array(); $subLabels[] = array('attributes' => $attributes); for ($i = 0, $loop = count($etapas); $i < $loop; $i++) { - $subLabels[] = array('data' => 'Nota', 'attributes' => $attributes); + if (! $nenhumaNota) { + $subLabels[] = array('data' => 'Nota', 'attributes' => $attributes); + } $subLabels[] = array('data' => 'Falta', 'attributes' => $attributes); } - $subLabels[] = array('data' => 'Média', 'attributes' => $attributes); + if (! $nenhumaNota) { + $subLabels[] = array('data' => 'Média', 'attributes' => $attributes); + } if ($sit->recuperacao) { $subLabels[] = array('data' => 'Exame', 'attributes' => $attributes); @@ -286,13 +315,23 @@ class BoletimController extends Core_Controller_Page_ViewController $faltasStats = $this->_service->getSituacaoFaltas(); // Texto do link - $linkText = ($porComponente ? 'nota/falta' : 'nota'); + if ($nenhumaNota) { + $linkText = 'falta'; + $linkPath = 'falta'; + } + else { + $linkText = ($porComponente ? 'nota/falta' : 'nota'); + $linkPath = 'nota'; + } // Parâmetros para o link de nota/falta nova $newLink = array( 'text' => 'Lançar ' . $linkText, - 'path' => 'nota', - 'query' => array('matricula' => $matricula['cod_matricula'], 'componenteCurricular' => 0) + 'path' => $linkPath, + 'query' => array( + 'matricula' => $matricula['cod_matricula'], + 'componenteCurricular' => 0 + ) ); $iteration = 0; @@ -302,12 +341,12 @@ class BoletimController extends Core_Controller_Page_ViewController // Nome do componente curricular $data[] = array('data' => $componente, 'attributes' => array('style' => 'padding: 5px; text-align: left')); - $notas = $notasComponentes[$id]; - $mediaSituacao = $mediasSituacoes->componentesCurriculares[$id]; - $medias = $mediasComponentes[$id]; - $faltas = $faltasComponentes[$id]; - $faltaStats = $faltasStats->componentesCurriculares[$id]; - $parecer = NULL; + $notas = $notasComponentes[$id]; + $mediaSituacao = $mediasSituacoes->componentesCurriculares[$id]; + $medias = $mediasComponentes[$id]; + $faltas = $faltasComponentes[$id]; + $faltaStats = $faltasStats->componentesCurriculares[$id]; + $parecer = NULL; // Caso os pareceres sejam por componente e anuais, recupera a instância if ($parecerComponenteAnual) { @@ -343,36 +382,64 @@ class BoletimController extends Core_Controller_Page_ViewController if (isset($faltas[$i])) { $update['query']['etapa'] = $faltas[$i]->etapa; - $falta = $url->l($faltas[$i]->quantidade, 'nota', $update); + $linkPath = $nenhumaNota ? 'falta' : 'nota'; + $falta = $url->l($faltas[$i]->quantidade, $linkPath, $update); } - if (is_null($nota)) { - if ($porComponente) { - if (is_null($falta)) { - $colspan = 2; - } - else { - $colspan = 1; + /* + * Exibição muito dinâmica. Em resumo, os casos são: + * + * 1. nota & falta componente + * 2. nota + * 3. falta componente + * 4. falta geral + */ + if ($nenhumaNota) { + $colspan = 1; + } + elseif (! $nenhumaNota && $porComponente && is_null($falta)) { + $colspan = 2; + } + else { + $colspan = 1; + } + + // Caso 1. + if (! $nenhumaNota) { + if ($nota) { + // Caso 2: resolvido com colspan. + $data[] = array('data' => $nota, 'attributes' => $attributes, 'colspan' => $colspan); + + if ($porComponente) { + $data[] = array('data' => $falta, 'attributes' => $attributes); } } else { - $colspan = NULL; + $data[] = array('data' => $new, 'attributes' => $attributes, 'colspan' => $colspan); + $new = ''; } - $data[] = array('data' => $new, 'attributes' => $attributes, 'colspan' => $colspan); - $new = ''; } - else { - $data[] = array('data' => $nota, 'attributes' => $attributes); - - if ($porComponente) { - $data[] = array('data' => $falta, 'attributes' => $attributes); + // Caso 3. + elseif ($nenhumaNota && $porComponente) { + if ($falta) { + $data[] = array('data' => $falta, 'attributes' => $attributes, 'colspan' => $colspan); + } + else { + $data[] = array('data' => $new, 'attributes' => $attributes, 'colspan' => $colspan); + $new = ''; } } + // Caso 4. + else { + $data[] = array('data' => '', 'attributes' => $attributes); + } } // Média no componente curricular - $media = $medias[0]->mediaArredondada . ($medias[0]->etapa == 'Rc' ? ' (Rc)' : ''); - $data[] = array('data' => $media, 'attributes' => $attributes); + if (! $nenhumaNota) { + $media = $medias[0]->mediaArredondada . ($medias[0]->etapa == 'Rc' ? ' (Rc)' : ''); + $data[] = array('data' => $media, 'attributes' => $attributes); + } // Adiciona uma coluna extra caso aluno esteja em exame em alguma componente curricular if ($sit->recuperacao) { @@ -470,14 +537,15 @@ class BoletimController extends Core_Controller_Page_ViewController $data[] = array('data' => $new, 'attributes' => $attributes); $new = ''; - if ($porComponente) { + if ($porComponente && ! $nenhumaNota) { $data[] = array('data' => '', 'attributes' => $attributes); } } } - // Porcentagem presença - $data[] = array(); + if (! $nenhumaNota) { + $data[] = array(); + } if ($sit->recuperacao) { $data[] = array('data' => '', 'attributes' => $attributes); @@ -487,6 +555,7 @@ class BoletimController extends Core_Controller_Page_ViewController $data[] = array('data' => '', 'attributes' => $attributes); } + // Porcentagem presença $data[] = array('data' => sprintf('%.2f%%', $faltasStats->porcentagemPresenca), 'attributes' => $attributes); $data[] = array('data' => $situacao->getValue($sit->falta->situacao), 'attributes' => $attributes); diff --git a/ieducar/modules/Avaliacao/Views/FaltaController.php b/ieducar/modules/Avaliacao/Views/FaltaController.php index f9e3ae7..5ca8f67 100644 --- a/ieducar/modules/Avaliacao/Views/FaltaController.php +++ b/ieducar/modules/Avaliacao/Views/FaltaController.php @@ -74,9 +74,9 @@ class FaltaController extends Core_Controller_Page_EditController protected $_etapa = NULL; /** - * @var Avaliacao_Model_NotaComponente + * @var int */ - protected $_nota = NULL; + protected $_componenteCurricular = NULL; /** * @var Avaliacao_Model_FaltaAbstract @@ -93,7 +93,7 @@ class FaltaController extends Core_Controller_Page_EditController $this->_options = array( 'new_success' => 'boletim', - 'new_success_params' => array('matricula' => $this->getRequest()->matricula), + 'new_success_params' => array('matricula' => $this->getRequest()->matricula), 'edit_success' => 'boletim', 'edit_success_params' => array('matricula' => $this->getRequest()->matricula), ); @@ -113,11 +113,23 @@ class FaltaController extends Core_Controller_Page_EditController { $this->_etapa = $this->getRequest()->etapa; $this->_matricula = $this->getRequest()->matricula; + $this->_componenteCurricular = $this->getRequest()->componenteCurricular; if (isset($this->_etapa) && isset($this->_matricula)) { return FALSE; } + if ($this->_regra->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { + $faltas = $this->_service->getFaltasComponentes(); + $faltas = isset($faltas[$this->_componenteCurricular]) ? + $faltas[$this->_componenteCurricular] : array(); + } + else { + $faltas = $this->_service->getFaltasGerais(); + } + + $this->_etapa = count($faltas) + 1; + return TRUE; } @@ -127,6 +139,7 @@ class FaltaController extends Core_Controller_Page_EditController protected function _initEditar() { $this->_falta = $this->_service->getFalta($this->_etapa); + $this->_parecer = $this->_service->getParecerDescritivo($this->_etapa, $this->_componenteCurricular); return TRUE; } @@ -137,16 +150,31 @@ class FaltaController extends Core_Controller_Page_EditController { $this->campoOculto('matricula', $this->_matricula); $this->campoOculto('etapa', $this->_etapa); + $this->campoOculto('componenteCurricular', $this->_componenteCurricular); $matricula = $this->_service->getOption('matriculaData'); + if (! isset($this->_etapa)) { + $this->_etapa = 1; + } + $this->campoRotulo('1nome', 'Nome', $matricula['nome']); $this->campoRotulo('2curso', 'Curso', $matricula['curso_nome']); $this->campoRotulo('3serie', 'Série', $matricula['serie_nome']); $this->campoRotulo('4turma', 'Turma', $matricula['turma_nome']); $this->campoRotulo('5etapa', 'Etapa', $this->_etapa == 'Rc' ? 'Recuperação' : $this->_etapa); + if ($this->_regra->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { + $componentes = $this->_service->getComponentes(); + $this->campoRotulo('6componente_curricular', 'Componente curricular', $componentes[$this->getRequest()->componenteCurricular]); + } + $this->campoLista('falta', 'Falta', range(0, 100, 1), $this->_falta->quantidade); + + // Caso o parecer seja por etapa e por componente + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { + $this->campoMemo('parecer', 'Parecer', $this->_parecer, 40, 10, TRUE); + } } /** @@ -157,13 +185,32 @@ class FaltaController extends Core_Controller_Page_EditController $quantidade = 0 < $this->getRequest()->falta ? (int) $this->getRequest()->falta : 0; - $falta = new Avaliacao_Model_FaltaGeral(array( - 'quantidade' => $quantidade, - 'etapa' => $this->getRequest()->etapa - )); + if ($this->_regra->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { + $falta = new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => $this->getRequest()->componenteCurricular, + 'quantidade' => $quantidade, + 'etapa' => $this->getRequest()->etapa + )); + $this->_service->addFalta($falta); + } + else { + $falta = new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => $quantidade, + 'etapa' => $this->getRequest()->etapa + )); + } $this->_service->addFalta($falta); + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { + $parecer = new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => $this->getRequest()->componenteCurricular, + 'parecer' => $this->getRequest()->parecer, + 'etapa' => $this->getRequest()->etapa + )); + $this->_service->addParecer($parecer); + } + try { $this->_service->save(); } diff --git a/ieducar/modules/Avaliacao/Views/NotaController.php b/ieducar/modules/Avaliacao/Views/NotaController.php index f1456dc..05ce9cb 100644 --- a/ieducar/modules/Avaliacao/Views/NotaController.php +++ b/ieducar/modules/Avaliacao/Views/NotaController.php @@ -105,7 +105,7 @@ class NotaController extends Core_Controller_Page_EditController $this->_options = array( 'new_success' => 'boletim', - 'new_success_params' => array('matricula' => $this->getRequest()->matricula), + 'new_success_params' => array('matricula' => $this->getRequest()->matricula), 'edit_success' => 'boletim', 'edit_success_params' => array('matricula' => $this->getRequest()->matricula), ); @@ -131,6 +131,13 @@ class NotaController extends Core_Controller_Page_EditController return FALSE; } + // Determina a etapa atual. + $this->_etapa = 1; + $notas = $this->_service->getNotasComponentes(); + if (isset($notas[$this->_componenteCurricular])) { + $this->_etapa = count($notas[$this->_componenteCurricular]) + 1; + } + return TRUE; } diff --git a/ieducar/modules/RegraAvaliacao/Model/Nota/TipoValor.php b/ieducar/modules/RegraAvaliacao/Model/Nota/TipoValor.php index 6b2db61..9e808cf 100644 --- a/ieducar/modules/RegraAvaliacao/Model/Nota/TipoValor.php +++ b/ieducar/modules/RegraAvaliacao/Model/Nota/TipoValor.php @@ -44,10 +44,12 @@ require_once 'CoreExt/Enum.php'; */ class RegraAvaliacao_Model_Nota_TipoValor extends CoreExt_Enum { + const NENHUM = 0; const NUMERICA = 1; const CONCEITUAL = 2; protected $_data = array( + self::NENHUM => 'Não usar nota', self::NUMERICA => 'Nota numérica', self::CONCEITUAL => 'Nota conceitual' ); diff --git a/ieducar/modules/RegraAvaliacao/Model/Regra.php b/ieducar/modules/RegraAvaliacao/Model/Regra.php index f10969a..cedef9f 100644 --- a/ieducar/modules/RegraAvaliacao/Model/Regra.php +++ b/ieducar/modules/RegraAvaliacao/Model/Regra.php @@ -76,7 +76,8 @@ class RegraAvaliacao_Model_Regra extends CoreExt_Entity 'tabelaArredondamento' => array( 'value' => 1, 'class' => 'TabelaArredondamento_Model_TabelaDataMapper', - 'file' => 'TabelaArredondamento/Model/TabelaDataMapper.php' + 'file' => 'TabelaArredondamento/Model/TabelaDataMapper.php', + 'null' => TRUE ), 'tipoProgressao' => array( 'value' => 1, @@ -97,7 +98,8 @@ class RegraAvaliacao_Model_Regra extends CoreExt_Entity 'formulaMedia' => array( 'value' => NULL, 'class' => 'FormulaMedia_Model_FormulaDataMapper', - 'file' => 'FormulaMedia/Model/FormulaDataMapper.php' + 'file' => 'FormulaMedia/Model/FormulaDataMapper.php', + 'null' => TRUE ), 'formulaRecuperacao' => array( 'value' => NULL, @@ -146,6 +148,20 @@ class RegraAvaliacao_Model_Regra extends CoreExt_Entity // Instituições $instituicoes = array_keys(App_Model_IedFinder::getInstituicoes()); + // Fórmula de média é obrigatória? + $isFormulaMediaRequired = TRUE; + + // Média é obrigatória? + $isMediaRequired = TRUE; + + if ($this->get('tipoNota') == RegraAvaliacao_Model_Nota_TipoValor::NENHUM) { + $isFormulaMediaRequired = FALSE; + $isMediaRequired = FALSE; + + // Aceita somente o valor NULL quando o tipo de nota é Nenhum. + $formulaMedia = $formulaMedia + array(NULL); + } + return array( 'instituicao' => new CoreExt_Validate_Choice(array( 'choices' => $instituicoes @@ -154,7 +170,8 @@ class RegraAvaliacao_Model_Regra extends CoreExt_Entity 'min' => 5, 'max' => 50 )), 'formulaMedia' => new CoreExt_Validate_Choice(array( - 'choices' => $formulaMedia + 'choices' => $formulaMedia, + 'required' => $isFormulaMediaRequired )), 'formulaRecuperacao' => new CoreExt_Validate_Choice(array( 'choices' => $formulaRecuperacao, @@ -179,8 +196,9 @@ class RegraAvaliacao_Model_Regra extends CoreExt_Entity )), 'media' => $this->validateIfEquals( 'tipoProgressao', RegraAvaliacao_Model_TipoProgressao::CONTINUADA, - 'CoreExt_Validate_Numeric', array('min' => 1, 'max' => 10), - array('required' => FALSE, 'min' => 0, 'max' => 10) + 'CoreExt_Validate_Numeric', + array('required' => $isMediaRequired, 'min' => 1, 'max' => 10), + array('required' => $isMediaRequired, 'min' => 0, 'max' => 10) ), 'porcentagemPresenca' => new CoreExt_Validate_Numeric(array( 'min' => 1, 'max' => 100 diff --git a/ieducar/modules/RegraAvaliacao/Views/EditController.php b/ieducar/modules/RegraAvaliacao/Views/EditController.php index 8d9f83e..f36e0d8 100644 --- a/ieducar/modules/RegraAvaliacao/Views/EditController.php +++ b/ieducar/modules/RegraAvaliacao/Views/EditController.php @@ -111,6 +111,102 @@ class EditController extends Core_Controller_Page_EditController ) ); + private $_tipoNotaJs = ' +var tipo_nota = new function() { + this.isNenhum = function(docObj, formId, fieldsName) { + var regex = new RegExp(fieldsName); + var form = docObj.getElementById(formId); + + for (var i = 0; i < form.elements.length; i++) { + var elementName = form.elements[i].name; + if (null !== elementName.match(regex)) { + if (form.elements[i].checked == false) { + continue; + } + + docObj.getElementById(\'tabelaArredondamento\').disabled = false; + docObj.getElementById(\'media\').disabled = false; + docObj.getElementById(\'formulaMedia\').disabled = false; + docObj.getElementById(\'formulaRecuperacao\').disabled = false; + + if (form.elements[i].value == 0) { + docObj.getElementById(\'tabelaArredondamento\').disabled = true; + docObj.getElementById(\'media\').disabled = true; + docObj.getElementById(\'formulaMedia\').disabled = true; + docObj.getElementById(\'formulaRecuperacao\').disabled = true; + } + + break; + } + } + }; +}; + +var tabela_arredondamento = new function() { + this.docObj = null; + + this.getTabelasArredondamento = function(docObj, tipoNota) { + tabela_arredondamento.docObj = docObj; + var xml = new ajax(tabela_arredondamento.parseResponse); + xml.envia("/modules/TabelaArredondamento/Views/TabelaTipoNotaAjax.php?tipoNota=" + tipoNota); + }; + + this.parseResponse = function() { + if (arguments[0] === null) { + return; + } + + docObj = tabela_arredondamento.docObj; + + tabelas = arguments[0].getElementsByTagName(\'tabela\'); + docObj.options.length = 0; + for (var i = 0; i < tabelas.length; i++) { + docObj[docObj.options.length] = new Option( + tabelas[i].firstChild.nodeValue, tabelas[i].getAttribute(\'id\'), false, false + ); + } + + if (tabelas.length == 0) { + docObj.options[0] = new Option( + \'O tipo de nota não possui tabela de arredondamento.\', \'\', false, false + ); + } + } +} +'; + + protected function _preRender() + { + parent::_preRender(); + + // Adiciona o código Javascript de controle do formulário. + $js = sprintf(' + ', + $this->_tipoNotaJs + ); + + $this->prependOutput($js); + } + /** * @see clsCadastro#Gerar() */ @@ -135,9 +231,14 @@ class EditController extends Core_Controller_Page_EditController // Tabela de arredondamento $tabelaArredondamento = $this->getDataMapper()->findTabelaArredondamento($this->getEntity()); $tabelaArredondamento = CoreExt_Entity::entityFilterAttr($tabelaArredondamento, 'id', 'nome'); + + if (empty($tabelaArredondamento)) { + $tabelaArredondamento = array(0 => 'O tipo de nota não possui tabela de arredondamento.'); + } + $this->campoLista('tabelaArredondamento', $this->_getLabel('tabelaArredondamento'), $tabelaArredondamento, $this->getEntity()->get('tabelaArredondamento'), '', - FALSE, $this->_getHelp('tabelaArredondamento')); + FALSE, $this->_getHelp('tabelaArredondamento'), '', FALSE, FALSE); // Tipo progressão $tipoProgressao = RegraAvaliacao_Model_TipoProgressao::getInstance(); @@ -147,14 +248,14 @@ class EditController extends Core_Controller_Page_EditController // Média $this->campoTexto('media', $this->_getLabel('media'), $this->getEntity()->media, - 5, 50, TRUE, FALSE, FALSE, $this->_getHelp('media')); + 5, 50, FALSE, FALSE, FALSE, $this->_getHelp('media')); // Cálculo média $formulas = $this->getDataMapper()->findFormulaMediaFinal(); $formulas = CoreExt_Entity::entityFilterAttr($formulas, 'id', 'nome'); $this->campoLista('formulaMedia', $this->_getLabel('formulaMedia'), $formulas, $this->getEntity()->get('formulaMedia'), '', FALSE, - $this->_getHelp('formulaMedia')); + $this->_getHelp('formulaMedia'), '', FALSE, FALSE); // Cálculo média recuperação $formulas = $this->getDataMapper()->findFormulaMediaRecuperacao(); diff --git a/ieducar/modules/TabelaArredondamento/Model/Tabela.php b/ieducar/modules/TabelaArredondamento/Model/Tabela.php index 127036c..d910bf6 100644 --- a/ieducar/modules/TabelaArredondamento/Model/Tabela.php +++ b/ieducar/modules/TabelaArredondamento/Model/Tabela.php @@ -91,11 +91,15 @@ class TabelaArredondamento_Model_Tabela extends CoreExt_Entity // Tipo nota $tipoNota = RegraAvaliacao_Model_Nota_TipoValor::getInstance(); + $tipoNotas = $tipoNota->getKeys(); + + // Remove "nenhum" das opções. + unset($tipoNotas[RegraAvaliacao_Model_Nota_TipoValor::NENHUM]); return array( 'instituicao' => new CoreExt_Validate_Choice(array('choices' => $instituicoes)), 'nome' => new CoreExt_Validate_String(array('min' => 5, 'max' => 50)), - 'tipoNota' => new CoreExt_Validate_Choice(array('choices' => $tipoNota->getKeys())) + 'tipoNota' => new CoreExt_Validate_Choice(array('choices' => $tipoNotas)) ); } diff --git a/ieducar/modules/TabelaArredondamento/Views/EditController.php b/ieducar/modules/TabelaArredondamento/Views/EditController.php index 7ca3991..7faf35b 100644 --- a/ieducar/modules/TabelaArredondamento/Views/EditController.php +++ b/ieducar/modules/TabelaArredondamento/Views/EditController.php @@ -154,7 +154,9 @@ class EditController extends Core_Controller_Page_EditController // Tipo de nota $notaTipoValor = RegraAvaliacao_Model_Nota_TipoValor::getInstance(); - $this->campoRadio('tipoNota', $this->_getLabel('tipoNota'), $notaTipoValor->getEnums(), + $notaTipos = $notaTipoValor->getEnums(); + unset($notaTipos[RegraAvaliacao_Model_Nota_TipoValor::NENHUM]); + $this->campoRadio('tipoNota', $this->_getLabel('tipoNota'), $notaTipos, $this->getEntity()->get('tipoNota'), '', $this->_getHelp('tipoNota')); // Parte condicional diff --git a/ieducar/modules/TabelaArredondamento/Views/TabelaTipoNotaAjax.php b/ieducar/modules/TabelaArredondamento/Views/TabelaTipoNotaAjax.php new file mode 100644 index 0000000..ac1bb8a --- /dev/null +++ b/ieducar/modules/TabelaArredondamento/Views/TabelaTipoNotaAjax.php @@ -0,0 +1,51 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package TabelaArredondamento + * @subpackage Modules + * @since Arquivo disponível desde a versão 1.2.0 + * @version $Id$ + */ + +require_once dirname(__FILE__) . '/../../../includes/bootstrap.php'; +require_once 'include/clsBanco.inc.php'; +require_once 'TabelaArredondamento/Model/TabelaDataMapper.php'; + +$tabelas = array(); + +if (isset($_GET['tipoNota'])) { + $tabela = new TabelaArredondamento_Model_TabelaDataMapper(); + $tabelas = $tabela->findAll(array(), array('tipoNota' => (int) $_GET['tipoNota'])); +} + +header('Content-type: text/xml'); + +echo "\n\n"; + +foreach ($tabelas as $tabela) { + echo sprintf('%s', $tabela->id, $tabela->nome); +} + +echo ''; -- libgit2 0.21.2