/** * @see CoreExt_Entity_Validatable#getDefaultValidatorCollection() */ public function getDefaultValidatorCollection() { // Enums $tipoNotaValor = RegraAvaliacao_Model_Nota_TipoValor::getInstance(); $tipoProgressao = RegraAvaliacao_Model_TipoProgressao::getInstance(); $tipoParecerDescritivo = RegraAvaliacao_Model_TipoParecerDescritivo::getInstance(); $tipoPresenca = RegraAvaliacao_Model_TipoPresenca::getInstance(); // ids de fórmulas de média $formulaMedia = $this->getDataMapper()->findFormulaMediaFinal(); $formulaMedia = CoreExt_Entity::entityFilterAttr($formulaMedia, 'id'); // ids de fórmulas de recuperação $formulaRecuperacao = $this->getDataMapper()->findFormulaMediaRecuperacao(); $formulaRecuperacao = CoreExt_Entity::entityFilterAttr($formulaRecuperacao, 'id'); $formulaRecuperacao[0] = NULL; // ids de tabelas de arredondamento $tabelas = $this->getDataMapper()->findTabelaArredondamento($this); $tabelas = CoreExt_Entity::entityFilterAttr($tabelas, 'id'); // 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)), 'nome' => new CoreExt_Validate_String(array('min' => 5, 'max' => 50)), 'formulaMedia' => new CoreExt_Validate_Choice(array('choices' => $formulaMedia, 'required' => $isFormulaMediaRequired)), 'formulaRecuperacao' => new CoreExt_Validate_Choice(array('choices' => $formulaRecuperacao, 'required' => FALSE)), 'tipoNota' => new CoreExt_Validate_Choice(array('choices' => $tipoNotaValor->getKeys())), 'tipoProgressao' => new CoreExt_Validate_Choice(array('choices' => $tipoProgressao->getKeys())), 'tabelaArredondamento' => new CoreExt_Validate_Choice(array('choices' => $tabelas, 'choice_error' => 'A tabela de arredondamento selecionada não ' . 'corresponde ao sistema de nota escolhido.')), 'parecerDescritivo' => new CoreExt_Validate_Choice(array('choices' => $tipoParecerDescritivo->getKeys())), 'tipoPresenca' => new CoreExt_Validate_Choice(array('choices' => $tipoPresenca->getKeys())), 'media' => $this->validateIfEquals('tipoProgressao', RegraAvaliacao_Model_TipoProgressao::CONTINUADA, '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)), 'mediaRecuperacao' => $this->validateIfEquals('tipoProgressao', RegraAvaliacao_Model_TipoProgressao::CONTINUADA, 'CoreExt_Validate_Numeric', array('required' => $isMediaRequired, 'min' => 1, 'max' => 14), array('required' => $isMediaRequired, 'min' => 0, 'max' => 14))); }
/** * Promove o aluno de etapa escolar caso esteja aprovado de acordo com o * necessário estabelecido por tipoProgressao de * RegraAvaliacao_Model_Regra. * * @param bool $ok Caso a progressão não seja automática, é necessário uma * confirmação externa para a promoção do aluno. * @return bool */ public function promover($ok = NULL) { $situacao = $this->getSituacaoAluno(); if (TRUE == $situacao->andamento) { require_once 'CoreExt/Service/Exception.php'; throw new CoreExt_Service_Exception('Não é possível promover uma matrícula em andamento.'); } // Se a matrícula já foi alterada (aluno aprovado ou reprovado), lança exceção. if (App_Model_MatriculaSituacao::EM_ANDAMENTO > $this->getOption('aprovado')) { require_once 'CoreExt/Service/Exception.php'; throw new CoreExt_Service_Exception('A matrícula já foi promovida.'); } $tipoProgressao = $this->getRegra()->get('tipoProgressao'); switch ($tipoProgressao) { case RegraAvaliacao_Model_TipoProgressao::CONTINUADA: $promover = TRUE; break; case RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA: $promover = $situacao->aprovado && !$situacao->retidoFalta; break; case RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA: $promover = $situacao->aprovado; break; case RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL: if (is_null($ok)) { $enum = RegraAvaliacao_Model_TipoProgressao::getInstance(); $message = sprintf('Para atualizar a matrícula em uma regra %s é ' . 'necessário confirmação externa no argumento "$ok".', $enum->getValue($tipoProgressao)); require_once 'CoreExt/Service/Exception.php'; throw new CoreExt_Service_Exception($message); } $promover = $ok; break; } return $this->_updateMatricula($this->getOption('matricula'), $this->getOption('usuario'), $promover); }
/** * @see clsCadastro#Gerar() */ public function Gerar() { $this->campoOculto('id', $this->getEntity()->id); // Instituição $instituicoes = App_Model_IedFinder::getInstituicoes(); $this->campoLista('instituicao', $this->_getLabel('instituicao'), $instituicoes, $this->getEntity()->instituicao); // Nome $this->campoTexto('nome', $this->_getLabel('nome'), $this->getEntity()->nome, 50, 50, TRUE, FALSE, FALSE, $this->_getHelp('nome')); // Nota tipo valor $notaTipoValor = RegraAvaliacao_Model_Nota_TipoValor::getInstance(); $this->campoRadio('tipoNota', $this->_getLabel('tipoNota'), $notaTipoValor->getEnums(), $this->getEntity()->get('tipoNota'), '', $this->_getHelp('tipoNota')); // 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, FALSE); // Tipo progressão $tipoProgressao = RegraAvaliacao_Model_TipoProgressao::getInstance(); $this->campoRadio('tipoProgressao', $this->_getLabel('tipoProgressao'), $tipoProgressao->getEnums(), $this->getEntity()->get('tipoProgressao'), '', $this->_getHelp('tipoProgressao')); // Média $this->campoTexto('media', $this->_getLabel('media'), $this->getEntity()->media, 5, 50, FALSE, FALSE, FALSE, $this->_getHelp('media')); $this->campoTexto('mediaRecuperacao', $this->_getLabel('mediaRecuperacao'), $this->getEntity()->mediaRecuperacao, 5, 50, FALSE, FALSE, FALSE, $this->_getHelp('mediaRecuperacao')); // 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'), '', FALSE, FALSE); // Cálculo média recuperação $formulas = $this->getDataMapper()->findFormulaMediaRecuperacao(); $formulasArray = array(0 => 'Não usar recuperação'); $formulasArray = $formulasArray + CoreExt_Entity::entityFilterAttr($formulas, 'id', 'nome'); $this->campoLista('formulaRecuperacao', $this->_getLabel('formulaRecuperacao'), $formulasArray, $this->getEntity()->get('formulaRecuperacao'), '', FALSE, $this->_getHelp('formulaRecuperacao'), '', FALSE, FALSE); // Porcentagem presença $this->campoTexto('porcentagemPresenca', $this->_getLabel('porcentagemPresenca'), $this->getEntity()->porcentagemPresenca, 5, 50, TRUE, FALSE, FALSE, $this->_getHelp('porcentagemPresenca')); // Parecer descritivo $parecerDescritivo = RegraAvaliacao_Model_TipoParecerDescritivo::getInstance(); $this->campoRadio('parecerDescritivo', $this->_getLabel('parecerDescritivo'), $parecerDescritivo->getEnums(), $this->getEntity()->get('parecerDescritivo'), '', $this->_getHelp('parecerDescritivo')); // Presença $tipoPresenca = RegraAvaliacao_Model_TipoPresenca::getInstance(); $this->campoRadio('tipoPresenca', $this->_getLabel('tipoPresenca'), $tipoPresenca->getEnums(), $this->getEntity()->get('tipoPresenca'), '', $this->_getHelp('tipoPresenca')); }
/** * Promove o aluno de etapa escolar caso esteja aprovado de acordo com o * necessário estabelecido por tipoProgressao de * RegraAvaliacao_Model_Regra. * * @param bool $ok Caso a progressão não seja automática, é necessário uma * confirmação externa para a promoção do aluno. * @return bool */ public function promover($novaSituacaoMatricula = NULL) { $tipoProgressao = $this->getRegra()->get('tipoProgressao'); $situacaoMatricula = $this->getOption('aprovado'); $situacaoBoletim = $this->getSituacaoAluno(); $exceptionMsg = ''; if ($situacaoBoletim->andamento) { $novaSituacaoMatricula = App_Model_MatriculaSituacao::EM_ANDAMENTO; } else { switch ($tipoProgressao) { case RegraAvaliacao_Model_TipoProgressao::CONTINUADA: $novaSituacaoMatricula = App_Model_MatriculaSituacao::APROVADO; break; case RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA: if ($situacaoBoletim->aprovado && !$situacaoBoletim->retidoFalta) { $novaSituacaoMatricula = App_Model_MatriculaSituacao::APROVADO; } else { $novaSituacaoMatricula = App_Model_MatriculaSituacao::REPROVADO; } break; case RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA: if ($situacaoBoletim->aprovado) { $novaSituacaoMatricula = App_Model_MatriculaSituacao::APROVADO; } else { $novaSituacaoMatricula = App_Model_MatriculaSituacao::REPROVADO; } break; case RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL && is_null($novaSituacaoMatricula): $tipoProgressaoInstance = RegraAvaliacao_Model_TipoProgressao::getInstance(); $exceptionMsg = sprintf('Para atualizar a matrícula em uma regra %s é ' . 'necessário passar o valor do argumento "$novaSituacaoMatricula".', $tipoProgressaoInstance->getValue($tipoProgressao)); break; } } if ($novaSituacaoMatricula == $situacaoMatricula) { $exceptionMsg = "Matrícula ({$this->getOption('matricula')}) não precisou ser promovida, " . "pois a nova situação continua a mesma da anterior ({$novaSituacaoMatricula})"; } if ($exceptionMsg) { require_once 'CoreExt/Service/Exception.php'; throw new CoreExt_Service_Exception($exceptionMsg); } return $this->_updateMatricula($this->getOption('matricula'), $this->getOption('usuario'), $novaSituacaoMatricula); }