From be7b62aa134a3f5fd8552bf6a4da1c4963fc5a41 Mon Sep 17 00:00:00 2001 From: Lucas D'Avila Date: Thu, 31 Jan 2013 22:23:27 -0200 Subject: [PATCH] Adicionado modulo laçamento de notas, faltas e pareceres descritivos por turma / aplicado correções ao serviço boletim / lançamento por aluno --- ieducar/modules/Avaliacao/Service/Boletim.php | 461 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------- ieducar/modules/Avaliacao/Views/BoletimController.php | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------- ieducar/modules/Avaliacao/Views/DiarioApiController.php | 999 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/Views/DiarioController.php | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/Views/FaltaController.php | 6 +++--- ieducar/modules/Avaliacao/Views/NotaController.php | 6 +++--- 6 files changed, 1468 insertions(+), 155 deletions(-) create mode 100644 ieducar/modules/Avaliacao/Views/DiarioApiController.php create mode 100644 ieducar/modules/Avaliacao/Views/DiarioController.php diff --git a/ieducar/modules/Avaliacao/Service/Boletim.php b/ieducar/modules/Avaliacao/Service/Boletim.php index 7f44121..9a95c1a 100644 --- a/ieducar/modules/Avaliacao/Service/Boletim.php +++ b/ieducar/modules/Avaliacao/Service/Boletim.php @@ -815,12 +815,13 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $matricula = App_Model_IedFinder::getMatricula($codMatricula); $etapas = App_Model_IedFinder::getQuantidadeDeModulosMatricula($codMatricula); - $this->setOption('matriculaData', $matricula); - $this->setOption('aprovado', $matricula['aprovado']); - $this->setOption('cursoHoraFalta', $matricula['curso_hora_falta']); + $this->setOption('matriculaData', $matricula); + $this->setOption('aprovado', $matricula['aprovado']); + $this->setOption('cursoHoraFalta', $matricula['curso_hora_falta']); $this->setOption('cursoCargaHoraria', $matricula['curso_carga_horaria']); $this->setOption('serieCargaHoraria', $matricula['serie_carga_horaria']); - $this->setOption('etapas', $etapas); + $this->setOption('serieDiasLetivos', $matricula['serie_dias_letivos']); + $this->setOption('etapas', $etapas); return $this; } @@ -1052,43 +1053,17 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable return FALSE; } - /** - * Retorna a situao geral do aluno, levando em considerao as situaes - * das notas (mdias) e faltas. O retorno baseado em booleanos, indicando - * se o aluno est aprovado, em andamento, em recuperao ou retido por falta. - * - * Retorna tambm a situao das notas e faltas tais quais retornadas pelos - * mtodos getSituacaoComponentesCurriculares() e getSituacaoFaltas(). - * - * - * aprovado = TRUE; - * $situacao->andamento = FALSE; - * $situacao->recuperacao = FALSE; - * $situacao->retidoFalta = FALSE; - * $situacao->nota = $this->getSituacaoComponentesCurriculares(); - * $situacao->falta = $this->getSituacaoFaltas(); - * - * - * @return stdClass - * @see Avaliacao_Service_Boletim#getSituacaoComponentesCurriculares() - * @see Avaliacao_Service_Boletim#getSituacaoFaltas() - */ - public function getSituacaoAluno() + + function getSituacaoNotaFalta($flagSituacaoNota, $flagSituacaoFalta) { - $situacao = new stdClass(); + $situacao = new stdClass(); + $situacao->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; $situacao->aprovado = TRUE; $situacao->andamento = FALSE; $situacao->recuperacao = FALSE; $situacao->retidoFalta = FALSE; - $situacao->nota = NULL; - $situacao->falta = NULL; - $nota = $this->getSituacaoComponentesCurriculares(); - $falta = $this->getSituacaoFaltas(); - - switch ($nota->situacao) { + switch ($flagSituacaoNota) { case App_Model_MatriculaSituacao::EM_ANDAMENTO: $situacao->aprovado = FALSE; $situacao->andamento = TRUE; @@ -1106,7 +1081,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable break; } - switch ($falta->situacao) { + switch ($flagSituacaoFalta) { case App_Model_MatriculaSituacao::EM_ANDAMENTO: $situacao->aprovado = FALSE; $situacao->andamento = TRUE; @@ -1114,20 +1089,69 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable case App_Model_MatriculaSituacao::REPROVADO: $situacao->retidoFalta = TRUE; $situacao->aprovado = FALSE; + + // Se reprovado por falta, mesmo que falte lanar a nota de exame, considera como reprovado. + $situacao->andamento = FALSE; break; case App_Model_MatriculaSituacao::APROVADO: $situacao->retidoFalta = FALSE; break; } - $situacao->nota = $nota; - $situacao->falta = $falta; + // seta situacao geral + if ($situacao->andamento and $situacao->recuperacao) + $situacao->situacao = App_Model_MatriculaSituacao::EM_EXAME; + + elseif (! $situacao->andamento and $situacao->aprovado and $situacao->recuperacao) + $situacao->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME; + + elseif (! $situacao->andamento and $situacao->aprovado) + $situacao->situacao = App_Model_MatriculaSituacao::APROVADO; + + elseif (! $situacao->andamento and (! $situacao->aprovado || $situacao->retidoFalta)) + $situacao->situacao = App_Model_MatriculaSituacao::REPROVADO; return $situacao; } + /** - * Retorna a situao dos componentes curriculares cursados pelo aluno. Possui + * Retorna a situao geral do aluno, levando em considerao as situaes + * das notas (mdias) e faltas. O retorno baseado em booleanos, indicando + * se o aluno est aprovado, em andamento, em recuperao ou retido por falta. + * + * Retorna tambm a situao das notas e faltas tais quais retornadas pelos + * mtodos getSituacaoComponentesCurriculares() e getSituacaoFaltas(). + * + * + * aprovado = TRUE; + * $situacao->andamento = FALSE; + * $situacao->recuperacao = FALSE; + * $situacao->retidoFalta = FALSE; + * $situacao->nota = $this->getSituacaoComponentesCurriculares(); + * $situacao->falta = $this->getSituacaoFaltas(); + * + * + * @return stdClass + * @see Avaliacao_Service_Boletim#getSituacaoComponentesCurriculares() + * @see Avaliacao_Service_Boletim#getSituacaoFaltas() + */ + public function getSituacaoAluno() + { + $situacaoNotas = $this->getSituacaoNotas(); + $situacaoFaltas = $this->getSituacaoFaltas(); + + $situacao = $this->getSituacaoNotaFalta($situacaoNotas->situacao, $situacaoFaltas->situacao); + $situacao->nota = $situacaoNotas; + $situacao->falta = $situacaoFaltas; + + return $situacao; + } + + /** + * Retorna a situao das notas lanadas para os componentes curriculares cursados pelo aluno. Possui * uma flag "situacao" global, que indica a situao global do aluno, podendo * ser: * @@ -1155,13 +1179,19 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable * $situacao->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO; * * - * Esses valores so definidos atravs da verificao SOMENTE das mdias dos + * Esses valores so definidos SOMENTE atravs da verificao das mdias dos * componentes curriculares j avaliados. * + * Obs: Anteriormente este metdo se chamava getSituacaoComponentesCurriculares, porem na verdade no retornava a + * situao dos componentes curriculares (que seria a situao baseada nas notas e das faltas lanadas) e sim + * ento foi renomeado este metodo para getSituacaoNotas, para que no metdo getSituacaoComponentesCurriculares + * fosse retornado a situao do baseada nas notas e faltas lanadas. + * + * * @return stdClass|NULL Retorna NULL caso no * @see App_Model_MatriculaSituacao */ - public function getSituacaoComponentesCurriculares() + public function getSituacaoNotas() { $situacao = new stdClass(); $situacao->situacao = 0; @@ -1174,8 +1204,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable return $situacao; } - // Carrega as mdias pois este mtodo pode ser chamado aps a chamada a - // saveNotas(). + // Carrega as mdias pois este mtodo pode ser chamado aps a chamada a saveNotas() $mediasComponentes = $this->_loadNotaComponenteCurricularMedia() ->getMediasComponentes(); @@ -1203,11 +1232,13 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $this->hasRecuperacao()) { $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::EM_EXAME; } - elseif (($etapa == $this->getOption('etapas') || $etapa == 'Rc') && - $media < $this->getRegra()->media) { + elseif ($etapa == $this->getOption('etapas') && $media < $this->getRegra()->media) { + $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::REPROVADO; + } + elseif ($etapa == 'Rc' && $media < $this->getRegra()->mediaRecuperacao) { $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::REPROVADO; } - elseif ($etapa == 'Rc' && $media >= $this->getRegra()->media && $this->hasRecuperacao()) { + elseif ($etapa == 'Rc' && $media >= $this->getRegra()->mediaRecuperacao && $this->hasRecuperacao()) { $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME; } elseif ($etapa < $this->getOption('etapas') && $etapa != 'Rc') { @@ -1275,40 +1306,31 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable */ public function getSituacaoFaltas() { - $presenca = new stdClass(); - $presenca->situacao = 0; - $presenca->tipoFalta = 0; - $presenca->cargaHoraria = 0; - $presenca->cursoHoraFalta = 0; + $presenca = new stdClass(); $presenca->totalFaltas = 0; $presenca->horasFaltas = 0; $presenca->porcentagemFalta = 0; $presenca->porcentagemPresenca = 0; - $presenca->porcentagemPresencaRegra = 0; - $presenca->componentesCurriculares = array(); - - // Tipo de falta do aluno - $tipoFalta = $this->_getFaltaAluno(); - $tipoFalta = $tipoFalta->get('tipoFalta'); - - $presenca->tipoFalta = $tipoFalta; - $presenca->cursoHoraFalta = $this->getOption('cursoHoraFalta'); $presenca->porcentagemPresencaRegra = $this->getRegra()->porcentagemPresenca; - $presenca->cargaHoraria = $this->getOption('serieCargaHoraria'); - // A situao "aprovado" por padro - $situacaoGeral = App_Model_MatriculaSituacao::APROVADO; + $presenca->tipoFalta = $this->getRegra()->get('tipoPresenca'); + $presenca->cargaHoraria = $this->getOption('serieCargaHoraria'); + $presenca->diasLetivos = $this->getOption('serieDiasLetivos'); - // Faltas - $faltasComponentes = array(); + $presenca->cursoHoraFalta = $this->getOption('cursoHoraFalta'); + $presenca->componentesCurriculares = array(); + $presenca->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; - // Etapa padro - $etapa = 0; + $etapa = 0; + $faltasComponentes = array(); - // Faltas lanadas (persistidas) + // Carrega faltas lanadas (persistidas) $this->_loadFalta(); - if ($presenca->tipoFalta == RegraAvaliacao_Model_TipoPresenca::GERAL) { + $tipoFaltaGeral = $presenca->tipoFalta == RegraAvaliacao_Model_TipoPresenca::GERAL; + $tipoFaltaPorComponente = $presenca->tipoFalta == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE; + + if ($tipoFaltaGeral) { $faltas = $this->_faltasGerais; if (0 == count($faltas)) { @@ -1316,12 +1338,12 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $etapa = 0; } else { - $total = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')); - $falta = (array_pop($faltas)); - $etapa = $falta->etapa; + $total = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')); + $etapa = array_pop($faltas)->etapa; } } - elseif ($presenca->tipoFalta == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { + + elseif ($tipoFaltaPorComponente) { $faltas = $this->_faltasComponentes; $total = 0; $etapasComponentes = array(); @@ -1334,8 +1356,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable // Pega o id de ComponenteCurricular_Model_Componente da ltima etapa do array $componenteEtapa = array_pop($falta); - $id = $componenteEtapa->get('componenteCurricular'); - $etapa = $componenteEtapa->etapa; + $id = $componenteEtapa->get('componenteCurricular'); + $etapa = $componenteEtapa->etapa; // Etapas lanadas $etapasComponentes[$etapa] = $etapa; @@ -1346,6 +1368,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $faltasComponentes[$id]->horasFaltas = NULL; $faltasComponentes[$id]->porcentagemFalta = NULL; $faltasComponentes[$id]->porcentagemPresenca = NULL; + $faltasComponentes[$id]->total = $componenteTotal; + //$faltasComponentes[$id]->componenteCurricular = $componenteEtapa; // Calcula a quantidade de horas/faltas no componente $faltasComponentes[$id]->horasFaltas = @@ -1360,10 +1384,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $faltasComponentes[$id]->porcentagemPresenca = 100 - $faltasComponentes[$id]->porcentagemFalta; + // Na ltima etapa seta situao presena como aprovado ou reprovado. if ($etapa == $this->getOption('etapas') || $etapa == 'Rc') { $aprovado = ($faltasComponentes[$id]->porcentagemPresenca >= $this->getRegra()->porcentagemPresenca); - $faltasComponentes[$id]->situacao = $aprovado ? - App_Model_MatriculaSituacao::APROVADO : App_Model_MatriculaSituacao::REPROVADO; + $faltasComponentes[$id]->situacao = $aprovado ? App_Model_MatriculaSituacao::APROVADO : + App_Model_MatriculaSituacao::REPROVADO; } // Adiciona a quantidade de falta do componente ao total geral de faltas @@ -1377,39 +1402,119 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable else { $etapa = min($etapasComponentes); } - } + } // fim if por_componente - // Total de faltas $presenca->totalFaltas = $total; - - // Horas faltas total $presenca->horasFaltas = $this->_calculateHoraFalta($total, $presenca->cursoHoraFalta); - // Porcentagem de faltas - $presenca->porcentagemFalta = $this->_calculatePorcentagem($presenca->cargaHoraria, - $presenca->horasFaltas, FALSE); - - // Porcentagem de presena geral - $presenca->porcentagemPresenca = 100 - $presenca->porcentagemFalta; + if ($tipoFaltaGeral) { + $presenca->porcentagemFalta = $this->_calculatePorcentagem($presenca->diasLetivos, + $presenca->totalFaltas, FALSE); + } + elseif ($tipoFaltaPorComponente) { + $presenca->porcentagemFalta = $this->_calculatePorcentagem($presenca->cargaHoraria, + $presenca->horasFaltas, FALSE); + } - // Componentes curriculares + $presenca->porcentagemPresenca = 100 - $presenca->porcentagemFalta; $presenca->componentesCurriculares = $faltasComponentes; - // Situao geral. ltima verificao pois somente ao fim possvel saber - // se est em andamento ou se pode estabelecer como aprovado ou reprovado + // Na ltima etapa seta situao presena como aprovado ou reprovado. if ($etapa == $this->getOption('etapas') || $etapa === 'Rc') { - $aprovado = ($presenca->porcentagemPresenca >= $this->getRegra()->porcentagemPresenca); - $presenca->situacao = $aprovado ? - App_Model_MatriculaSituacao::APROVADO : - App_Model_MatriculaSituacao::REPROVADO; - } - else { - $presenca->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + $aprovado = ($presenca->porcentagemPresenca >= $this->getRegra()->porcentagemPresenca); + $presenca->situacao = $aprovado ? App_Model_MatriculaSituacao::APROVADO : + App_Model_MatriculaSituacao::REPROVADO; } return $presenca; } + + /** + * Retorna a situao dos componentes curriculares cursados pelo aluno. Possui + * uma flag "situacao" global, que indica a situao global do aluno, podendo + * ser: + * + * - Em andamento + * - Em exame + * - Aprovado + * - Reprovado + * + * Esses valores so definidos no enum App_Model_MatriculaSituacao. + * + * Para cada componente curricular, ser indicado a situao do aluno no + * componente. + * + * Esses resultados so retornados como um objeto stdClass que possui dois + * atributos: "situacao" e "componentesCurriculares". O primeiro um tipo + * inteiro e o segundo um array indexado pelo id do componente e com um + * atributo inteiro "situacao": + * + * + * situacao = App_Model_MatriculaSituacao::APROVADO; + * $situacao->componentesCurriculares = array(); + * $situacao->componentesCurriculares[1] = new stdClass(); + * $situacao->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO; + * + * + * Esses valores so definidos atravs da verificao das mdias dos + * componentes curriculares j avaliados e das faltas lanadas. + * + * Obs: Anteriormente este metdo SOMENTE verificava a situao baseando-se nas mdias lanadas, + * porem o mesmo foi alterado para verificar a situao baseada nas notas e faltas lanadas. + * + * A implementa antiga deste metodo esta contida no metodo getSituacaoNotas + * + * @return stdClass|NULL Retorna NULL caso no + * @see App_Model_MatriculaSituacao + */ + public function getSituacaoComponentesCurriculares() + { + $situacao = new stdClass(); + $situacao->situacao = App_Model_MatriculaSituacao::APROVADO; + $situacao->componentesCurriculares = array(); + + $situacaoNotas = $this->getSituacaoNotas(); + $situacaoFaltas = $this->getSituacaofaltas(); + + foreach($situacaoNotas->componentesCurriculares as $ccId => $situacaoNotaCc) { + // seta tipos nota, falta + $tipoNotaNenhum = $this->getRegra()->get('tipoNota') == + RegraAvaliacao_Model_Nota_TipoValor::NENHUM; + + $tipoFaltaPorComponente = $this->getRegra()->get('tipoPresenca') == + RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE; + + // inicializa situacaoFaltaCc a ser usado caso tipoFaltaPorComponente + $situacaoFaltaCc = new stdClass(); + $situacaoFaltaCc->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + + // caso possua situacaoFalta para o componente substitui situacao inicializada + if ($tipoFaltaPorComponente and isset($situacaoFaltas->componentesCurriculares[$ccId])) + $situacaoFaltaCc = $situacaoFaltas->componentesCurriculares[$ccId]; + + // pega situao nota geral ou do componente + if ($tipoNotaNenhum) + $situacaoNota = $situacaoNotas->situacao; + else + $situacaoNota = $situacaoNotaCc->situacao; + + // pega situacao da falta componente ou geral. + if($tipoFaltaPorComponente) + $situacaoFalta = $situacaoFaltas->componentesCurriculares[$ccId]->situacao; + else + $situacaoFalta = $situacaoFaltas->situacao; + + $situacao->componentesCurriculares[$ccId] = $this->getSituacaoNotaFalta($situacaoNota, $situacaoFalta); + } + + // #FIXME verificar porque para regras sem nota, no retornado a situacao. + + return $situacao; + } + /** * Verifica se uma determinada situao tem prioridade sobre a outra. * @@ -1529,6 +1634,14 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable protected function _setFaltaAluno(Avaliacao_Model_FaltaAluno $falta) { $this->_faltaAluno = $falta; + $tipoFaltaAtual = $this->_faltaAluno->get('tipoFalta'); + $tipoFaltaRegraAvaliacao = $this->getRegra()->get('tipoPresenca'); + + if ($tipoFaltaAtual != $tipoFaltaRegraAvaliacao){ + $this->_faltaAluno->tipoFalta = $tipoFaltaRegraAvaliacao; + $this->getFaltaAlunoDataMapper()->save($this->_faltaAluno); + } + return $this; } @@ -2320,6 +2433,31 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable return $this; } + protected function updateSituacaoMatricula($situacaoNotasFaltas) + { + $matriculaSituacao = null; + + //se a situacao da matricula no aprovado e a situacao da nota e falta esto aprovadas, aprova a matricula + if (($this->getOption('aprovado') != App_Model_MatriculaSituacao::APROVADO) && + ($situacaoNotasFaltas->aprovado && ! $situacaoNotasFaltas->andamento)) + { + $matriculaSituacao = App_Model_MatriculaSituacao::APROVADO; + } + //se a situacao da matricula no reprovado e a situacao da nota e falta no esto aprovadas e nem em andamento, reprova a matricula + elseif (($this->getOption('aprovado') != App_Model_MatriculaSituacao::REPROVADO) && + (! $situacaoNotasFaltas->aprovado && ! $situacaoNotasFaltas->andamento)) + { + $matriculaSituacao = App_Model_MatriculaSituacao::REPROVADO; + } + elseif ($this->getOption('aprovado') != App_Model_MatriculaSituacao::EM_ANDAMENTO) + { + $matriculaSituacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + } + + if ($matriculaSituacao) + $this->_updateMatricula($this->getOption('matricula'), $this->getOption('usuario'), $matriculaSituacao); + } + /** * Promove o aluno de etapa escolar caso esteja aprovado de acordo com o * necessrio estabelecido por tipoProgressao de @@ -2329,52 +2467,65 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable * confirmao externa para a promoo do aluno. * @return bool */ - public function promover($ok = NULL) + + public function promover($novaSituacaoMatricula = NULL) { - $situacao = $this->getSituacaoAluno(); + $tipoProgressao = $this->getRegra()->get('tipoProgressao'); + $situacaoMatricula = $this->getOption('aprovado'); + $situacaoBoletim = $this->getSituacaoAluno(); + $exceptionMsg = ''; - if (TRUE == $situacao->andamento) { - require_once 'CoreExt/Service/Exception.php'; - throw new CoreExt_Service_Exception('No possvel promover uma matrcula em andamento.'); - } + if ($situacaoBoletim->andamento) + $novaSituacaoMatricula = App_Model_MatriculaSituacao::EM_ANDAMENTO; + else + { - // Se a matrcula j foi alterada (aluno aprovado ou reprovado), lana exceo. - if (App_Model_MatriculaSituacao::EM_ANDAMENTO > $this->getOption('aprovado')) { - require_once 'CoreExt/Service/Exception.php'; - throw new CoreExt_Service_Exception('A matrcula j foi promovida.'); - } + switch ($tipoProgressao) { + case RegraAvaliacao_Model_TipoProgressao::CONTINUADA: - $tipoProgressao = $this->getRegra()->get('tipoProgressao'); + $novaSituacaoMatricula = App_Model_MatriculaSituacao::APROVADO; + break; - 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 matrcula em uma regra %s ' - . 'necessrio confirmao externa no argumento "$ok".', - $enum->getValue($tipoProgressao)); - - require_once 'CoreExt/Service/Exception.php'; - throw new CoreExt_Service_Exception($message); - } + case RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA: - $promover = $ok; - break; + 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 matrcula em uma regra %s ' + . 'necessrio passar o valor do argumento "$novaSituacaoMatricula".', + $tipoProgressaoInstance->getValue($tipoProgressao)); + break; + } } - return $this->_updateMatricula($this->getOption('matricula'), $this->getOption('usuario'), - $promover); + if($novaSituacaoMatricula == $situacaoMatricula) + $exceptionMsg = "Matrcula ({$this->getOption('matricula')}) no precisou ser promovida, " . + "pois a nova situao 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); } + /** * Atualiza a mdia dos componentes curriculares. */ @@ -2441,4 +2592,46 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable { return App_Model_Matricula::atualizaMatricula($matricula, $usuario, $promover); } -} \ No newline at end of file + + + public function deleteNota($etapa, $ComponenteCurricularId) + { + // zera nota antes de deletar, para que a media seja recalculada + try { + $nota = new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => $ComponenteCurricularId, + 'nota' => 0, + 'etapa' => $etapa + )); + $this->addNota($nota); + $this->save(); + } + catch (Exception $e) { + error_log("Excessao ignorada ao zerar nota a ser removida: " . $e->getMessage()); + } + + $nota = $this->getNotaComponente($ComponenteCurricularId, $etapa); + $this->getNotaComponenteDataMapper()->delete($nota); + + return $this; + } + + + public function deleteFalta($etapa, $ComponenteCurricularId) + { + $nota = $this->getFalta($etapa, $ComponenteCurricularId); + $this->getFaltaAbstractDataMapper()->delete($nota); + + return $this; + } + + + public function deleteParecer($etapa, $ComponenteCurricularId) + { + $parecer = $this->getParecerDescritivo($etapa, $ComponenteCurricularId); + $this->getParecerDescritivoAbstractDataMapper()->delete($parecer); + + return $this; + } + +} diff --git a/ieducar/modules/Avaliacao/Views/BoletimController.php b/ieducar/modules/Avaliacao/Views/BoletimController.php index 7513512..0121730 100644 --- a/ieducar/modules/Avaliacao/Views/BoletimController.php +++ b/ieducar/modules/Avaliacao/Views/BoletimController.php @@ -66,7 +66,7 @@ class BoletimController extends Core_Controller_Page_ViewController */ protected $_service = NULL; - /** + /**z * @var stdClass */ protected $_situacao = NULL; @@ -188,7 +188,7 @@ class BoletimController extends Core_Controller_Page_ViewController $this->addDetalhe(array('Mdia', $media)); // Cria um array com a quantidade de etapas de 1 a n - $etapas = range(1, $this->_service->getOption('etapas'), 1); + $etapas = $this->getEtapas(); // Atributos para a tabela $attributes = array( @@ -245,7 +245,7 @@ class BoletimController extends Core_Controller_Page_ViewController } // Colspan para tabela com labels e sublabels - $colspan += $porComponente && $sit->recuperacao ? 4 : 3; + $colspan += $porComponente && $this->alunoPossuiNotaRec() ? 4 : 3; if ($nenhumaNota) { $colspan--; } @@ -256,7 +256,7 @@ class BoletimController extends Core_Controller_Page_ViewController // Inclui coluna para % de presena geral. if (!$porComponente) { - if ($sit->recuperacao) { + if ($this->alunoPossuiNotaRec()) { $labels[] = array('data' => 'Exame', 'attributes' => $attributes); } @@ -285,7 +285,7 @@ class BoletimController extends Core_Controller_Page_ViewController $subLabels[] = array('data' => 'Mdia', 'attributes' => $attributes); } - if ($sit->recuperacao) { + if ($this->alunoPossuiNotaRec()) { $subLabels[] = array('data' => 'Exame', 'attributes' => $attributes); } @@ -305,8 +305,8 @@ class BoletimController extends Core_Controller_Page_ViewController $attributes = array('style' => 'padding: 5px; text-align: center'); // Notas - $componentes = $this->_service->getComponentes(); - $notasComponentes = $this->_service->getNotasComponentes(); + $componentes = $this->getComponentesCurriculares(); + $notasComponentes = $this->getNotasComponentesCurriculares(); $mediasSituacoes = $this->_situacao->nota; $mediasComponentes = $this->_service->getMediasComponentes(); $faltasComponentes = $this->_service->getFaltasComponentes(); @@ -441,8 +441,8 @@ class BoletimController extends Core_Controller_Page_ViewController $data[] = array('data' => $media, 'attributes' => $attributes); } - // Adiciona uma coluna extra caso aluno esteja em exame em alguma componente curricular - if ($sit->recuperacao) { + // Adiciona uma coluna extra caso aluno esteja em exame em alguma componente curricular ou possua nota de exame + if ($sit->recuperacao || $this->alunoPossuiNotaRec()) { if ($mediaSituacao->situacao == App_Model_MatriculaSituacao::EM_EXAME || $mediaSituacao->situacao == App_Model_MatriculaSituacao::APROVADO_APOS_EXAME || $mediaSituacao->situacao == App_Model_MatriculaSituacao::REPROVADO) { @@ -450,9 +450,8 @@ class BoletimController extends Core_Controller_Page_ViewController $link['query']['componenteCurricular'] = $id; $link['query']['etapa'] = 'Rc'; - $notaRec = $i; - if (isset($notas[$notaRec]) && $notas[$notaRec]->etapa == 'Rc') { - $link['text'] = $notas[$notaRec]->notaArredondada; + if (isset($notas[$i]) && $notas[$i]->etapa == 'Rc') { + $link['text'] = $notas[$i]->notaArredondada; } $recuperacaoLink = $url->l($link['text'], $link['path'], array('query' => $link['query'])); @@ -547,7 +546,7 @@ class BoletimController extends Core_Controller_Page_ViewController $data[] = array(); } - if ($sit->recuperacao) { + if ($this->alunoPossuiNotaRec()) { $data[] = array('data' => '', 'attributes' => $attributes); } @@ -591,7 +590,7 @@ class BoletimController extends Core_Controller_Page_ViewController } } - if ($sit->recuperacao) { + if ($this->alunoPossuiNotaRec()) { $data[] = array('data' => '', 'attributes' => $attributes); } @@ -657,4 +656,61 @@ class BoletimController extends Core_Controller_Page_ViewController $this->addDetalhe(array('Promover aluno?', $links)); } } -} \ No newline at end of file + + + protected function getComponentesCurriculares(){ + if(! isset($this->_componentesCurriculares)) + $this->_componentesCurriculares = $this->_service->getComponentes(); + + return $this->_componentesCurriculares; + } + + + protected function getNotasComponentesCurriculares(){ + if(! isset($this->_notasComponentesCurriculares)) + $this->_notasComponentesCurriculares = $this->_service->getNotasComponentes(); + + return $this->_notasComponentesCurriculares; + } + + + protected function getEtapas(){ + if(! isset($this->_etapas)) + $this->_etapas = range(1, $this->_service->getOption('etapas'), 1); + + return $this->_etapas; + } + + + /** + * caso algum componente curricular e alguma etapa possua nota exame lanada, ento o aluno possui nota exame + */ + protected function alunoPossuiNotaRec(){ + + $notasComponentesCurriculares = $this->getNotasComponentesCurriculares(); + + if (! isset($this->_alunoPossuiNotaRec)){ + foreach($this->getComponentesCurriculares() as $cc){ + $notasCc = $notasComponentesCurriculares[$cc->get('id')]; + + foreach ($this->getEtapas() as $etapa){ + foreach($notasCc as $notaCc){ + if($notaCc->etapa == 'Rc'){ + $this->_alunoPossuiNotaRec = true; + break; + } + } + + if (isset($this->_alunoPossuiNotaRec)) + break; + } + + if (isset($this->_alunoPossuiNotaRec)) + break; + } + } + + return $this->_alunoPossuiNotaRec; + } + +} diff --git a/ieducar/modules/Avaliacao/Views/DiarioApiController.php b/ieducar/modules/Avaliacao/Views/DiarioApiController.php new file mode 100644 index 0000000..6c26275 --- /dev/null +++ b/ieducar/modules/Avaliacao/Views/DiarioApiController.php @@ -0,0 +1,999 @@ + + * + * 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 Lucas D'Avila + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage Modules + * @since Arquivo disponível desde a versão ? + * @version $Id$ + */ + +//require_once 'Core/Controller/Page/EditController.php'; + +require_once 'Avaliacao/Model/NotaComponenteDataMapper.php'; +require_once 'Avaliacao/Service/Boletim.php'; +require_once 'App/Model/MatriculaSituacao.php'; +require_once 'RegraAvaliacao/Model/TipoPresenca.php'; +require_once 'RegraAvaliacao/Model/TipoParecerDescritivo.php'; + +require_once 'include/pmieducar/clsPmieducarMatricula.inc.php'; + +require_once 'Portabilis/Controller/ApiCoreController.php'; +require_once 'Portabilis/Array/Utils.php'; +require_once 'Portabilis/Object/Utils.php'; + +class DiarioApiController extends ApiCoreController +{ + protected $_dataMapper = 'Avaliacao_Model_NotaComponenteDataMapper'; + protected $_processoAp = 644; + + // validations + + // post nota validations + + protected function validatesValueOfAttValueIsInOpcoesNotas() { + $expectedValues = array_keys($this->getOpcoesNotas()); + return $this->validator->validatesValueInSetOf($this->getRequest()->att_value, $expectedValues, 'att_value'); + } + + + protected function validatesCanChangeDiarioForAno() { + $escola = App_Model_IedFinder::getEscola($this->getRequest()->escola_id); + + $ano = new clsPmieducarEscolaAnoLetivo(); + $ano->ref_cod_escola = $this->getRequest()->escola_id; + $ano->ano = $this->getRequest()->ano; + $ano = $ano->detalhe(); + + $anoLetivoEncerrado = is_array($ano) && count($ano) > 0 && + $ano['ativo'] == 1 && $ano['andamento'] == 2; + + if ($escola['bloquear_lancamento_diario_anos_letivos_encerrados'] == '1' && $anoLetivoEncerrado) { + $this->messenger->append("O ano letivo '{$this->getRequest()->ano}' está encerrado, esta escola está configurada para não permitir alterar o diário de anos letivos encerrados."); + return false; + } + + return true; + } + + + protected function validatesRegraAvaliacaoHasNota() { + $isValid = $this->serviceBoletim()->getRegra()->get('tipoNota') != RegraAvaliacao_Model_Nota_TipoValor::NENHUM; + + if (! $isValid) + $this->messenger->append("Nota não lançada, pois a regra de avaliação não utiliza nota."); + + return $isValid; + } + + + protected function validatesRegraAvaliacaoHasFormulaRecuperacao() { + $isValid = $this->getRequest()->etapa != 'Rc' || + ! is_null($this->serviceBoletim()->getRegra()->formulaRecuperacao); + + if (! $isValid) + $this->messenger->append("Nota de recuperação não lançada, pois a fórmula de recuperação não possui fórmula de recuperação."); + + return $isValid; + } + + + protected function validatesRegraAvaliacaoHasFormulaRecuperacaoWithTypeRecuperacao() { + $isValid = $this->getRequest()->etapa != 'Rc' || + ($this->serviceBoletim()->getRegra()->formulaRecuperacao->get('tipoFormula') == + FormulaMedia_Model_TipoFormula::MEDIA_RECUPERACAO); + + if (! $isValid) + $this->messenger->append("Nota de recuperação não lançada, pois a fórmula de recuperação é diferente do tipo média recuperação."); + + return $isValid; + } + + + protected function validatesPreviousNotasHasBeenSet() { + $hasPreviousNotas = true; + $etapasWithoutNotas = array(); + + if($this->getRequest()->etapa == 'Rc') + $etapaRequest = $this->serviceBoletim()->getOption('etapas'); + else + $etapaRequest = $this->getRequest()->etapa; + + + for($etapa = 1; $etapa <= $etapaRequest; $etapa++) { + $nota = $this->getNotaAtual($etapa); + + if(($etapa != $this->getRequest()->etapa || $this->getRequest()->etapa == 'Rc') && + empty($nota) && ! is_numeric($nota)) { + $hasPreviousNotas = false; + $etapasWithoutNotas[] = $etapa; + } + } + + if (! $hasPreviousNotas) { + $this->messenger->append("Nota somente pode ser lançada após lançar notas nas etapas: " . + join(', ', $etapasWithoutNotas) . ' deste componente curricular.'); + } + + return $hasPreviousNotas; + } + + + // post falta validations + + protected function validatesPreviousFaltasHasBeenSet() { + $hasPreviousFaltas = true; + $etapasWithoutFaltas = array(); + + for($etapa = 1; $etapa <= $this->getRequest()->etapa; $etapa++) { + $falta = $this->getFaltaAtual($etapa); + + if($etapa != $this->getRequest()->etapa && empty($falta) && ! is_numeric($falta)) { + $hasPreviousFaltas = false; + $etapasWithoutFaltas[] = $etapa; + } + } + + if (! $hasPreviousFaltas) { + if ($this->serviceBoletim()->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { + $this->messenger->append("Falta somente pode ser lançada após lançar faltas nas etapas anteriores: " . + join(', ', $etapasWithoutFaltas) . ' deste componente curricular.'); + } + else{ + $this->messenger->append("Falta somente pode ser lançada após lançar faltas nas etapas anteriores: " . + join(', ', $etapasWithoutFaltas) . '.'); + } + } + + return $hasPreviousFaltas; + } + + + // post/ delete parecer validations + + protected function validatesEtapaParecer() { + $isValid = false; + $etapa = $this->getRequest()->etapa; + + $tiposParecerAnual = array(RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE, + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL); + + $parecerAnual = in_array($this->serviceBoletim()->getRegra()->get('parecerDescritivo'), + $tiposParecerAnual); + + if($parecerAnual && $etapa != 'An') + $this->messenger->append("Valor inválido para o atributo 'etapa', é esperado 'An' e foi recebido '{$etapa}'."); + elseif(! $parecerAnual && $etapa == 'An') + $this->messenger->append("Valor inválido para o atributo 'etapa', é esperado um valor diferente de 'An'."); + else + $isValid = true; + + return $isValid; + } + + + protected function validatesPresenceOfComponenteCurricularIdIfParecerComponente() { + $tiposParecerComponente = array(RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE, + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE); + + $parecerPorComponente = in_array($this->serviceBoletim()->getRegra()->get('parecerDescritivo'), + $tiposParecerComponente); + + return (! $parecerPorComponente) || $this->validatesPresenceOf('componente_curricular_id'); + } + + + // post parecer validations + + protected function validatesRegraAvaliacaoHasParecer() { + $tpParecer = $this->serviceBoletim()->getRegra()->get('parecerDescritivo'); + $isValid = $tpParecer != RegraAvaliacao_Model_TipoParecerDescritivo::NENHUM; + + if (! $isValid) + $this->messenger->append("Parecer descritivo não lançado, pois a regra de avaliação não utiliza parecer."); + + return $isValid; + } + + + + // delete nota validations + + protected function validatesInexistenceOfNotaExame() { + $isValid = true; + + if ($this->getRequest()->etapa != 'Rc') { + $notaExame = $this->getNotaAtual($etapa = 'Rc'); + $isValid = empty($notaExame); + + if(! $isValid) + $this->messenger->append('Nota da matrícula '. $this->getRequest()->matricula_id .' somente pode ser removida, após remover nota do exame.', 'error'); + } + + return $isValid; + } + + + protected function validatesInexistenceNotasInNextEtapas() { + $etapasComNota = array(); + + if (is_numeric($this->getRequest()->etapa)) { + $etapas = $this->serviceBoletim()->getOption('etapas'); + $etapa = $this->getRequest()->etapa + 1; + + for($etapa; $etapa <= $etapas; $etapa++) { + $nota = $this->getNotaAtual($etapa); + + if (! empty($nota)) + $etapasComNota[] = $etapa; + } + + if (! empty($etapasComNota)) { + $msg = "Nota somente pode ser removida, após remover as notas lançadas nas etapas posteriores: " . + join(', ', $etapasComNota) . '.'; + $this->messenger->append($msg, 'error'); + } + } + + return empty($etapasComNota); + } + + + // delete falta validations + + + protected function validatesInexistenceFaltasInNextEtapas() { + $etapasComFalta = array(); + + if (is_numeric($this->getRequest()->etapa)) { + $etapas = $this->serviceBoletim()->getOption('etapas'); + $etapa = $this->getRequest()->etapa + 1; + + for($etapa; $etapa <= $etapas; $etapa++) { + $falta = $this->getFaltaAtual($etapa); + + if(! empty($falta)) + $etapasComFalta[] = $etapa; + + } + + if (! empty($etapasComFalta)) + $this->messenger->append("Falta somente pode ser removida, após remover as faltas lançadas nas etapas posteriores: " . join(', ', $etapasComFalta) . '.', 'error'); + } + + return empty($etapasComFalta); + } + + + protected function validatesPresenceOfMatriculaIdOrComponenteCurricularId() { + if (empty($this->getRequest()->componente_curricular_id) && empty($this->getRequest()->matricula_id)) { + $this->messenger->append('É necessário receber matricula_id ou componente_curricular_id.', 'error'); + return false; + } + + return true; + } + + + // responders validations + + + protected function canGetMatriculas() { + return $this->validatesPresenceOf(array('instituicao_id', + 'escola_id', + 'curso_id', + 'curso_id', + 'serie_id', + 'turma_id', + 'ano', + 'etapa')) && + $this->validatesPresenceOfMatriculaIdOrComponenteCurricularId() && + $this->validatesCanChangeDiarioForAno(); + } + + + protected function canPost() { + return $this->validatesPresenceOf('etapa') && + $this->validatesPresenceOf('matricula_id'); + } + + + protected function canPostNota() { + return $this->canPost() && + $this->validatesIsNumeric('att_value') && + $this->validatesValueOfAttValueIsInOpcoesNotas(false) && + $this->validatesPresenceOf('componente_curricular_id') && + $this->validatesRegraAvaliacaoHasNota() && + $this->validatesRegraAvaliacaoHasFormulaRecuperacao() && + $this->validatesRegraAvaliacaoHasFormulaRecuperacaoWithTypeRecuperacao() && + $this->validatesPreviousNotasHasBeenSet(); + } + + + protected function canPostFalta() { + return $this->canPost() && + $this->validatesIsNumeric('att_value') && + $this->validatesPreviousFaltasHasBeenSet(); + } + + + protected function canPostParecer() { + + return $this->canPost() && + $this->validatesPresenceOf('att_value') && + $this->validatesEtapaParecer() && + $this->validatesRegraAvaliacaoHasParecer() && + $this->validatesPresenceOfComponenteCurricularIdIfParecerComponente(); + } + + + protected function canDelete() { + return $this->validatesPresenceOf('etapa'); + } + + + protected function canDeleteNota() { + return $this->canDelete() && + $this->validatesPresenceOf('componente_curricular_id') && + $this->validatesInexistenceOfNotaExame() && + $this->validatesInexistenceNotasInNextEtapas(); + } + + + protected function canDeleteFalta() { + return $this->canDelete() && + $this->validatesInexistenceFaltasInNextEtapas(); + } + + + protected function canDeleteParecer() { + return $this->canDelete() && + $this->validatesEtapaParecer() && + $this->validatesPresenceOfComponenteCurricularIdIfParecerComponente(); + } + + + // responders + + // post + + protected function postNota() { + if ($this->canPostNota()) { + + $nota = new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => $this->getRequest()->componente_curricular_id, + 'nota' => urldecode($this->getRequest()->att_value), + 'etapa' => $this->getRequest()->etapa)); + + $this->serviceBoletim()->addNota($nota); + $this->trySaveServiceBoletim(); + $this->messenger->append('Nota matrícula '. $this->getRequest()->matricula_id .' alterada com sucesso.', 'success'); + } + + $this->appendResponse('componente_curricular_id', $this->getRequest()->componente_curricular_id); + $this->appendResponse('matricula_id', $this->getRequest()->matricula_id); + $this->appendResponse('situacao', $this->getSituacaoMatricula()); + } + + + // TODO mover validacao para canPostFalta + protected function postFalta() { + + $canPost = $this->canPostFalta(); + if ($canPost && $this->serviceBoletim()->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) + $canPost = $this->validatesPresenceOf('componente_curricular_id'); + + if ($canPost) { + if ($this->serviceBoletim()->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) $falta = $this->getFaltaComponente(); + elseif ($this->serviceBoletim()->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::GERAL) + $falta = $this->getFaltaGeral(); + + $this->serviceBoletim()->addFalta($falta); + $this->trySaveServiceBoletim(); + $this->messenger->append('Falta matrícula '. $this->getRequest()->matricula_id .' alterada com sucesso.', 'success'); + } + + $this->appendResponse('componente_curricular_id', $this->getRequest()->componente_curricular_id); + $this->appendResponse('matricula_id', $this->getRequest()->matricula_id); + $this->appendResponse('situacao', $this->getSituacaoMatricula()); + } + + + protected function postParecer() { + + if ($this->canPostParecer()) { + $tpParecer = $this->serviceBoletim()->getRegra()->get('parecerDescritivo'); + $cnsParecer = RegraAvaliacao_Model_TipoParecerDescritivo; + + if ($tpParecer == $cnsParecer::ETAPA_COMPONENTE || $tpParecer == $cnsParecer::ANUAL_COMPONENTE) + $parecer = $this->getParecerComponente(); + else + $parecer = $this->getParecerGeral(); + + $this->serviceBoletim()->addParecer($parecer); + $this->trySaveServiceBoletim(); + $this->messenger->append('Parecer descritivo matricula '. $this->getRequest()->matricula_id .' alterado com sucesso.', 'success'); + } + + $this->appendResponse('componente_curricular_id', $this->getRequest()->componente_curricular_id); + $this->appendResponse('matricula_id', $this->getRequest()->matricula_id); + $this->appendResponse('situacao', $this->getSituacaoMatricula()); + } + + + // delete + + protected function deleteNota() { + if ($this->canDeleteNota()) { + + $nota = $this->getNotaAtual(); + if (empty($nota) && ! is_numeric($nota)) + $this->messenger->append('Nota matrícula '. $this->getRequest()->matricula_id .' inexistente ou já removida.', 'notice'); + else + { + $this->serviceBoletim()->deleteNota($this->getRequest()->etapa, $this->getRequest()->componente_curricular_id); + $this->trySaveServiceBoletim(); + $this->messenger->append('Nota matrícula '. $this->getRequest()->matricula_id .' removida com sucesso.', 'success'); + } + } + + $this->appendResponse('componente_curricular_id', $this->getRequest()->componente_curricular_id); + $this->appendResponse('matricula_id', $this->getRequest()->matricula_id); + $this->appendResponse('situacao', $this->getSituacaoMatricula()); + } + + + protected function deleteFalta() { + $canDelete = $this->canDeleteFalta(); + $cnsPresenca = RegraAvaliacao_Model_TipoPresenca; + $tpPresenca = $this->serviceBoletim()->getRegra()->get('tipoPresenca'); + + if ($canDelete && $tpPresenca == $cnsPresenca::POR_COMPONENTE) { + $canDelete = $this->validatesPresenceOf('componente_curricular_id'); + $componenteCurricularId = $this->getRequest()->componente_curricular_id; + } + else + $componenteCurricularId = null; + + if ($canDelete && is_null($this->getFaltaAtual())) { + $this->messenger->append('Falta matrícula '. $this->getRequest()->matricula_id .' inexistente ou já removida.', 'notice'); + } + elseif ($canDelete) { + $this->serviceBoletim()->deleteFalta($this->getRequest()->etapa, $componenteCurricularId); + $this->trySaveServiceBoletim(); + $this->messenger->append('Falta matrícula '. $this->getRequest()->matricula_id .' removida com sucesso.', 'success'); + } + + $this->appendResponse('componente_curricular_id', $this->getRequest()->componente_curricular_id); + $this->appendResponse('matricula_id', $this->getRequest()->matricula_id); + $this->appendResponse('situacao', $this->getSituacaoMatricula()); + } + + + protected function deleteParecer() { + if ($this->canDeleteParecer()) { + $parecerAtual = $this->getParecerAtual(); + + if ((is_null($parecerAtual) || $parecerAtual == '')) { + $this->messenger->append('Parecer descritivo matrícula '. $this->getRequest()->matricula_id .' inexistente ou já removido.', 'notice'); + } + else{ + $tpParecer = $this->serviceBoletim()->getRegra()->get('parecerDescritivo'); + $cnsParecer = RegraAvaliacao_Model_TipoParecerDescritivo; + + if ($tpParecer == $cnsParecer::ANUAL_COMPONENTE || $tpParecer == $cnsParecer::ETAPA_COMPONENTE) + $this->serviceBoletim()->deleteParecer($this->getRequest()->etapa, $this->getRequest()->componente_curricular_id); + else + $this->serviceBoletim()->deleteParecer($this->getRequest()->etapa); + + $this->trySaveServiceBoletim(); + $this->messenger->append('Parecer descritivo matrícula '. $this->getRequest()->matricula_id .' removido com sucesso.', 'success'); + } + } + + $this->appendResponse('componente_curricular_id', $this->getRequest()->componente_curricular_id); + $this->appendResponse('matricula_id', $this->getRequest()->matricula_id); + $this->appendResponse('situacao', $this->getSituacaoMatricula()); + } + + + // get + + protected function getMatriculas() { + $matriculas = array(); + + if ($this->canGetMatriculas()) { + $alunos = new clsPmieducarMatriculaTurma(); + $alunos->setOrderby('nome'); + + $alunos = $alunos->lista( + $this->getRequest()->matricula_id, + $this->getRequest()->turma_id, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + $this->getRequest()->serie_id, + $this->getRequest()->curso_id, + $this->getRequest()->escola_id, + $this->getRequest()->instituicao_id, + $this->getRequest()->aluno_id, + NULL, + NULL, + NULL, + NULL, + $this->getRequest()->ano, + NULL, + TRUE, + NULL, + NULL, + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ); + + if (! is_array($alunos)) + $alunos = array(); + + foreach($alunos as $aluno) { + $matricula = array(); + $matriculaId = $aluno['ref_cod_matricula']; + + // seta id da matricula a ser usado pelo metodo serviceBoletim + $this->setCurrentMatriculaId($matriculaId); + + $matricula['componentes_curriculares'] = $this->loadComponentesCurricularesForMatricula($matriculaId); + $matricula['matricula_id'] = $aluno['ref_cod_matricula']; + $matricula['aluno_id'] = $aluno['ref_cod_aluno']; + $matricula['nome'] = $this->safeString($aluno['nome_aluno']); + + $matriculas[] = $matricula; + } + } + + // adiciona regras de avaliacao + if(! empty($matriculas)) { + $this->appendResponse('details', $this->getRegraAvaliacao()); + $this->appendResponse('situacao', $this->getSituacaoMatricula()); + } + + $this->appendResponse('matricula_id', $this->getRequest()->matricula_id); + + return $matriculas; + } + + // metodos auxiliares responders + + + // TODO usar esta funcao onde é verificado se parecer geral + protected function parecerGeral() { + $tiposParecerGeral = array(RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL); + + return in_array($this->serviceBoletim()->getRegra()->get('parecerDescritivo'), $tiposParecerGeral); + } + + + protected function setCurrentMatriculaId($matriculaId) { + $this->_currentMatriculaId = $matriculaId; + } + + + protected function getCurrentMatriculaId() { + // caso tenha setado _currentMatriculaId, ignora matricula_id recebido nos parametros + if(! is_null($this->_currentMatriculaId)) + $matriculaId = $this->_currentMatriculaId; + elseif (! is_null($this->getRequest()->matricula_id)) + $matriculaId = $this->getRequest()->matricula_id; + else + throw new CoreExt_Exception("Não foi possivel recuperar o id da matricula atual."); + + return $matriculaId; + } + + + protected function serviceBoletim($reload = false) { + $matriculaId = $this->getCurrentMatriculaId(); + + if (! isset($this->_boletimServiceInstances)) + $this->_boletimServiceInstances = array(); + + // set service + if (! isset($this->_boletimServiceInstances[$matriculaId]) || $reload) { + try { + $params = array('matricula' => $matriculaId, 'usuario' => $this->getSession()->id_pessoa); + $this->_boletimServiceInstances[$matriculaId] = new Avaliacao_Service_Boletim($params); + } + catch (Exception $e){ + $this->messenger->append("Erro ao instanciar serviço boletim para matricula {$matriculaId}: " . $e->getMessage(), 'error', true); + } + } + + // validates service + if (is_null($this->_boletimServiceInstances[$matriculaId])) + throw new CoreExt_Exception("Não foi possivel instanciar o serviço boletim para a matricula $matriculaId."); + + return $this->_boletimServiceInstances[$matriculaId]; + } + + + protected function trySaveServiceBoletim() { + try { + $this->serviceBoletim()->save(); + } + catch (CoreExt_Service_Exception $e) { + // excecoes ignoradas :( pois servico lanca excecoes de alertas, que não são exatamente erros. + // error_log('CoreExt_Service_Exception ignorada: ' . $e->getMessage()); + } + } + + + + // metodos auxiliares getFalta + + protected function getQuantidadeFalta() { + $quantidade = (int) $this->getRequest()->att_value; + + if ($quantidade < 0) + $quantidade = 0; + + return $quantidade; + } + + + protected function getFaltaGeral() { + return new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => $this->getQuantidadeFalta(), + 'etapa' => $this->getRequest()->etapa + )); + } + + + protected function getFaltaComponente() { + return new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => $this->getRequest()->componente_curricular_id, + 'quantidade' => $this->getQuantidadeFalta(), + 'etapa' => $this->getRequest()->etapa + )); + } + + + // metodos auxiliares getParecer + + protected function getParecerComponente() { + return new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => $this->getRequest()->componente_curricular_id, + 'parecer' => $this->safeStringForDb($this->getRequest()->att_value), + 'etapa' => $this->getRequest()->etapa + )); + } + + + protected function getParecerGeral() { + return new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => $this->safeStringForDb($this->getRequest()->att_value), + 'etapa' => $this->getRequest()->etapa + )); + } + + + // metodos auxiliares getSituacaoMatricula + + protected function getSituacaoMatricula($ccId = null) { + if (is_null($ccId)) + $ccId = $this->getRequest()->componente_curricular_id; + + $situacao = 'Situação não recuperada'; + + try { + $situacaoCc = $this->serviceBoletim()->getSituacaoComponentesCurriculares()->componentesCurriculares[$ccId]; + $situacao = App_Model_MatriculaSituacao::getInstance()->getValue($situacaoCc->situacao); + } + catch (Exception $e) { + $matriculaId = $this->getRequest()->matricula_id; + $this->messenger->append("Erro ao recuperar situação da matrícula '$matriculaId': " . + $e->getMessage()); + } + + return $this->safeString($situacao); + } + + + // outros metodos auxiliares + + protected function loadComponentesCurricularesForMatricula($matriculaId) { + $componentesCurriculares = array(); + + $componenteCurricularId = $this->getRequest()->componente_curricular_id; + $_componentesCurriculares = App_Model_IedFinder::getComponentesPorMatricula($matriculaId, null, null, $componenteCurricularId); + + foreach($_componentesCurriculares as $_componente) { + $componente = array(); + + $componente['id'] = $_componente->get('id'); + $componente['nome'] = $this->safeString($_componente->get('nome')); + $componente['nota_atual'] = $this->getNotaAtual($etapa = null, $componente['id']); + $componente['nota_exame'] = $this->getNotaExame($componente['id']); + //$componente['nota_necessaria_exame'] = $this->getNotaNecessariaExame($componente['id']); + $componente['falta_atual'] = $this->getFaltaAtual($etapa = null, $componente['id']); + $componente['parecer_atual'] = $this->getParecerAtual($componente['id']); + $componente['situacao'] = $this->getSituacaoMatricula($componente['id']); + + $componentesCurriculares[] = $componente; + } + + // ordenado por id, da mesma maneira que nos boletins, + // obs: poderá ainda ocorrer diferença entre a ordem das areas de conhecimento? + return Portabilis_Array_Utils::sortByKey('id', $componentesCurriculares); + } + + + protected function getNotaAtual($etapa = null, $componenteCurricularId = null) { + // defaults + if (is_null($componenteCurricularId)) + $componenteCurricularId = $this->getRequest()->componente_curricular_id; + + if (is_null($etapa)) + $etapa = $this->getRequest()->etapa; + + // validacao + if (! is_numeric($componenteCurricularId)) { + throw new Exception('Não foi possivel obter a nota atual, pois não foi recebido o id do componente curricular.'); + } + + $nota = urldecode($this->serviceBoletim()->getNotaComponente($componenteCurricularId, $etapa)->nota); + + return str_replace(',', '.', $nota); + } + + + protected function getNotaExame($componenteCurricularId = null) { + // somente recupera nota de exame se estiver buscando as matriculas da ultima etapa + // se existe nota de exame, esta é recuperada mesmo que a regra de avaliação não use mais exame + if($this->getRequest()->etapa == $this->serviceBoletim()->getOption('etapas')) + $nota = $this->getNotaAtual($etapa = 'Rc', $componenteCurricularId); + else + $nota = ''; + + return $nota; + } + + protected function getNotaNecessariaExame($componenteCurricularId = null) { + if (is_null($componenteCurricularId)) + $componenteCurricularId = $this->getRequest()->componente_curricular_id; + + $nota = urldecode($this->serviceBoletim()->preverNotaRecuperacao($componenteCurricularId)); + + return str_replace(',', '.', $nota); + } + + + protected function getFaltaAtual($etapa = null, $componenteCurricularId = null) { + // defaults + if (is_null($componenteCurricularId)) + $componenteCurricularId = $this->getRequest()->componente_curricular_id; + + if (is_null($etapa)) + $etapa = $this->getRequest()->etapa; + + if ($this->serviceBoletim()->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { + if (! is_numeric($componenteCurricularId)) + throw new Exception('Não foi possivel obter a falta atual, pois não foi recebido o id do componente curricular.'); + + $falta = $this->serviceBoletim()->getFalta($etapa, $componenteCurricularId)->quantidade; + } + + elseif ($this->serviceBoletim()->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::GERAL) + $falta = $this->serviceBoletim()->getFalta($etapa)->quantidade; + + return $falta; + } + + + protected function getEtapaParecer() { + if($this->getRequest()->etapa != 'An' && ($this->serviceBoletim()->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE || $this->serviceBoletim()->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL)) { + return 'An'; + } + else + return $this->getRequest()->etapa; + } + + + protected function getParecerAtual($componenteCurricularId = null) { + // defaults + if (is_null($componenteCurricularId)) + $componenteCurricularId = $this->getRequest()->componente_curricular_id; + + $etapaComponente = $this->serviceBoletim()->getRegra()->get('parecerDescritivo') == + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE; + + $anualComponente = $this->serviceBoletim()->getRegra()->get('parecerDescritivo') == + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE; + + if ($etapaComponente or $anualComponente) { + if (! is_numeric($componenteCurricularId)) + throw new Exception('Não foi possivel obter o parecer descritivo atual, pois não foi recebido o id do componente curricular.'); + + $parecer = $this->serviceBoletim()->getParecerDescritivo($this->getEtapaParecer(), $componenteCurricularId)->parecer; + } + else + $parecer = $this->serviceBoletim()->getParecerDescritivo($this->getEtapaParecer())->parecer; + + return $this->safeString($parecer, $transform = false); + } + + + protected function getOpcoesFaltas() { + $opcoes = array(); + + foreach (range(0, 100, 1) as $f) + $opcoes[$f] = $f; + + return $opcoes; + } + + + protected function canGetOpcoesNotas() { + return true; + } + + + protected function getOpcoesNotas() { + $opcoes = array(); + + if ($this->canGetOpcoesNotas()) { + $tpNota = $this->serviceBoletim()->getRegra()->get('tipoNota'); + $cnsNota = RegraAvaliacao_Model_Nota_TipoValor; + + if ($tpNota != $cnsNota::NENHUM) { + $tabela = $this->serviceBoletim()->getRegra()->tabelaArredondamento->findTabelaValor(); + + foreach ($tabela as $item) { + if ($tpNota == $cnsNota::NUMERICA) { + $nota = str_replace(',', '.', (string) $item->nome); + $opcoes[$nota] = $nota; + } + else { + $nota = str_replace(',', '.', (string) $item->valorMaximo); + $opcoes[$nota] = $this->safeString($item->nome . ' (' . $item->descricao . ')'); + } + } + } + } + + return $opcoes; + } + + + protected function canGetRegraAvaliacao() { + return true; + } + + + protected function getRegraAvaliacao() { + $itensRegra = array(); + + if ($this->canGetRegraAvaliacao()) { + $regra = $this->serviceBoletim()->getRegra(); + $itensRegra['id'] = $regra->get('id'); + $itensRegra['nome'] = $this->safeString($regra->get('nome')); + + + // tipo presença + $cnsPresenca = RegraAvaliacao_Model_TipoPresenca; + $tpPresenca = $this->serviceBoletim()->getRegra()->get('tipoPresenca'); + + if($tpPresenca == $cnsPresenca::GERAL) + $itensRegra['tipo_presenca'] = 'geral'; + elseif($tpPresenca == $cnsPresenca::POR_COMPONENTE) + $itensRegra['tipo_presenca'] = 'por_componente'; + else + $itensRegra['tipo_presenca'] = $tpPresenca; + + + // tipo nota + $cnsNota = RegraAvaliacao_Model_Nota_TipoValor; + $tpNota = $this->serviceBoletim()->getRegra()->get('tipoNota'); + + if ($tpNota == $cnsNota::NENHUM) + $itensRegra['tipo_nota'] = 'nenhum'; + elseif ($tpNota == $cnsNota::NUMERICA) + $itensRegra['tipo_nota'] = 'numerica'; + elseif ($tpNota == $cnsNota::CONCEITUAL) { + $itensRegra['tipo_nota'] = 'conceitual'; + //incluido opcoes notas, pois notas conceituais requer isto para visualizar os nomes + } + else + $itensRegra['tipo_nota'] = $tpNota; + + + // tipo parecer + $cnsParecer = RegraAvaliacao_Model_TipoParecerDescritivo; + $tpParecer = $this->serviceBoletim()->getRegra()->get('parecerDescritivo'); + + if ($tpParecer == $cnsParecer::NENHUM) + $itensRegra['tipo_parecer_descritivo'] = 'nenhum'; + elseif ($tpParecer == $cnsParecer::ETAPA_COMPONENTE) + $itensRegra['tipo_parecer_descritivo'] = 'etapa_componente'; + elseif ($tpParecer == $cnsParecer::ETAPA_GERAL) + $itensRegra['tipo_parecer_descritivo'] = 'etapa_geral'; + elseif ($tpParecer == $cnsParecer::ANUAL_COMPONENTE) + $itensRegra['tipo_parecer_descritivo'] = 'anual_componente'; + elseif ($tpParecer == $cnsParecer::ANUAL_GERAL) + $itensRegra['tipo_parecer_descritivo'] = 'anual_geral'; + else + $itensRegra['tipo_parecer_descritivo'] = $tpParecer; + + // opcoes notas + $itensRegra['opcoes_notas'] = $this->getOpcoesNotas(); + + // etapas + $itensRegra['quantidade_etapas'] = $this->serviceBoletim()->getOption('etapas'); + } + + return $itensRegra; + } + + public function Gerar() { + if ($this->isRequestFor('get', 'matriculas')) + $this->appendResponse('matriculas', $this->getMatriculas()); + + elseif ($this->isRequestFor('post', 'nota') || $this->isRequestFor('post', 'nota_exame')) + $this->postNota(); + + elseif ($this->isRequestFor('post', 'falta')) + $this->postFalta(); + + elseif ($this->isRequestFor('post', 'parecer')) + $this->postParecer(); + + elseif ($this->isRequestFor('delete', 'nota') || $this->isRequestFor('delete', 'nota_exame')) + $this->deleteNota(); + + elseif ($this->isRequestFor('delete', 'falta')) + $this->deleteFalta(); + + elseif ($this->isRequestFor('delete', 'parecer')) + $this->deleteParecer(); + + else + $this->notImplementedOperationError(); + } +} diff --git a/ieducar/modules/Avaliacao/Views/DiarioController.php b/ieducar/modules/Avaliacao/Views/DiarioController.php new file mode 100644 index 0000000..0c38326 --- /dev/null +++ b/ieducar/modules/Avaliacao/Views/DiarioController.php @@ -0,0 +1,65 @@ + + * + * 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 Lucas D'Avila + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage Modules + * @since Arquivo disponível desde a versão ? + * @version $Id$ + */ + +require_once 'Portabilis/Controller/Page/ListController.php'; +require_once 'lib/Portabilis/View/Helper/Application.php'; +require_once 'Portabilis/Business/Professor.php'; + +/** + * DiarioController class. + * + * @author Lucas D'Avila + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage Modules + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ + +class DiarioController extends Portabilis_Controller_Page_ListController +{ + protected $_titulo = 'Lançamento por turma'; + protected $_processoAp = 644; + + public function Gerar() { + $this->inputsHelper()->input('ano'); + $this->inputsHelper()->dynamic(array('instituicao', 'escola', 'curso', 'serie', 'turma', 'etapa')); + $this->inputsHelper()->dynamic(array('componenteCurricular', 'matricula'), array('required' => false)); + + $this->loadResourceAssets($this->getDispatcher()); + } +} +?> + diff --git a/ieducar/modules/Avaliacao/Views/FaltaController.php b/ieducar/modules/Avaliacao/Views/FaltaController.php index 5ca8f67..ee611a1 100644 --- a/ieducar/modules/Avaliacao/Views/FaltaController.php +++ b/ieducar/modules/Avaliacao/Views/FaltaController.php @@ -173,7 +173,7 @@ class FaltaController extends Core_Controller_Page_EditController // 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); + $this->campoMemo('parecer', 'Parecer', $this->_parecer, 40, 10, false); } } @@ -202,7 +202,7 @@ class FaltaController extends Core_Controller_Page_EditController $this->_service->addFalta($falta); - if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { + if (trim($this->getRequest()->parecer) != '' && $this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { $parecer = new Avaliacao_Model_ParecerDescritivoComponente(array( 'componenteCurricular' => $this->getRequest()->componenteCurricular, 'parecer' => $this->getRequest()->parecer, @@ -224,4 +224,4 @@ class FaltaController extends Core_Controller_Page_EditController return TRUE; } -} \ No newline at end of file +} diff --git a/ieducar/modules/Avaliacao/Views/NotaController.php b/ieducar/modules/Avaliacao/Views/NotaController.php index 05ce9cb..14bcfe3 100644 --- a/ieducar/modules/Avaliacao/Views/NotaController.php +++ b/ieducar/modules/Avaliacao/Views/NotaController.php @@ -194,7 +194,7 @@ class NotaController extends Core_Controller_Page_EditController // 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); + $this->campoMemo('parecer', 'Parecer', $this->_parecer, 40, 10, false); } } @@ -221,7 +221,7 @@ class NotaController extends Core_Controller_Page_EditController $this->_service->addFalta($falta); } - if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { + if (trim($this->getRequest()->parecer) != '' && $this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { $parecer = new Avaliacao_Model_ParecerDescritivoComponente(array( 'componenteCurricular' => $this->getRequest()->componenteCurricular, 'parecer' => $this->getRequest()->parecer, @@ -243,4 +243,4 @@ class NotaController extends Core_Controller_Page_EditController return TRUE; } -} \ No newline at end of file +} -- libgit2 0.21.2