function rodape($codMatricula, $nomeAluno, $situacao)
 {
     $corTexto = '#000000';
     $fonte = 'arial';
     $dataAtual = date('d/m/Y');
     $this->pdf->escreve_relativo('Data: ' . $dataAtual, 36, $this->page_y + 2, 100, 50, $fonte, 7, $corTexto, 'left');
     if (!$this->em_branco) {
         $this->pdf->escreve_relativo('Estou ciente do aproveitamento de ' . $nomeAluno . ', matrícula nº: ' . $codMatricula . '.', 68, $this->page_y + 12, 600, 50, $fonte, 9, $corTexto, 'left');
         /* if ($situacao->aprovado) {
              $situacao = App_Model_MatriculaSituacao::APROVADO;
            }
            elseif ($situacao->andamento) {
              $situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
            }
            elseif ($situacao->recuperacao) {
              $situacao = App_Model_MatriculaSituacao::EM_EXAME;
            }
            elseif ($situacao->retidoFalta) {
              $situacao = App_Model_MatriculaSituacao::RETIDO_FALTA;
            }
            else {
              $situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
            }*/
         $situacao = strtoupper(App_Model_MatriculaSituacao::getInstance()->getValue($situacao));
         $this->pdf->escreve_relativo('Aluno ' . $situacao, 68, $this->page_y + 62, 600, 50, $fonte, 9, $corTexto, 'center');
     }
     $this->pdf->escreve_relativo('Assinatura do Responsável(a)', 677, $this->page_y + 18, 200, 50, $fonte, 7, $corTexto, 'left');
     $this->pdf->linha_relativa(660, $this->page_y + 18, 130, 0, 0.4);
 }
 protected function getMatriculas()
 {
     if ($this->canGetMatriculas()) {
         $matriculas = new clsPmieducarMatricula();
         $matriculas->setOrderby('ano DESC, ref_ref_cod_serie DESC, cod_matricula DESC, aprovado');
         $matriculas = $matriculas->lista(null, null, null, null, null, null, $this->getRequest()->aluno_id, null, null, null, null, null, 1);
         $attrs = array('cod_matricula' => 'id', 'ref_cod_instituicao' => 'instituicao_id', 'ref_ref_cod_escola' => 'escola_id', 'ref_cod_curso' => 'curso_id', 'ref_ref_cod_serie' => 'serie_id', 'ref_cod_aluno' => 'aluno_id', 'nome' => 'aluno_nome', 'aprovado' => 'situacao', 'ano');
         $matriculas = Portabilis_Array_Utils::filterSet($matriculas, $attrs);
         foreach ($matriculas as $index => $matricula) {
             $turma = $this->loadTurmaByMatriculaId($matricula['id']);
             $matriculas[$index]['aluno_nome'] = $this->toUtf8($matricula['aluno_nome'], array('transform' => true));
             $matriculas[$index]['turma_id'] = $turma['id'];
             $matriculas[$index]['turma_nome'] = $turma['nome'];
             $matriculas[$index]['escola_nome'] = $this->loadEscolaNome($matricula['escola_id']);
             $matriculas[$index]['curso_nome'] = $this->loadCursoNome($matricula['curso_id']);
             $matriculas[$index]['serie_nome'] = $this->loadSerieNome($matricula['serie_id']);
             $matriculas[$index]['ultima_enturmacao'] = $this->loadNomeTurmaOrigem($matricula['id']);
             $matriculas[$index]['data_entrada'] = $this->loadTransferenciaDataEntrada($matricula['id']);
             $matriculas[$index]['data_saida'] = $this->loadTransferenciaDataSaida($matricula['id']);
             $matriculas[$index]['situacao'] = App_Model_MatriculaSituacao::getInstance()->getValue($matricula['situacao']);
             $matriculas[$index]['user_can_access'] = Portabilis_Utils_User::canAccessEscola($matricula['escola_id']);
             $matriculas[$index]['transferencia_em_aberto'] = $this->possuiTransferenciaEmAberto($matricula['id']);
         }
         return array('matriculas' => $matriculas);
     }
 }
 function getAlunoNotasFaltasTable($alunos_matriculados)
 {
     $fonte = 'arial';
     $corTexto = '#000000';
     $esquerda_original = 3;
     $espessura_linha = 0.3;
     $tam_texto = 9;
     $direita = 834;
     $altura = 20;
     $obj_serie = new clsPmieducarSerie($this->ref_cod_serie);
     $det_serie = $obj_serie->detalhe();
     $espacoDiv = $this->presencaGeral ? 1 : 2;
     foreach ($alunos_matriculados as $matricula => $aluno) {
         $boletim = new Avaliacao_Service_Boletim(array('matricula' => $matricula));
         $medias = $boletim->getMediasComponentes();
         if ($this->presencaGeral) {
             // Soma as faltas do aluno
             $faltas = array_sum(CoreExt_Entity::entityFilterAttr($boletim->getFaltasGerais(), 'etapa', 'quantidade'));
         } else {
             $faltas = $boletim->getFaltasComponentes();
         }
         $esquerda = $esquerda_original;
         // Matrícula
         $this->pdf->quadrado_relativo($esquerda, $this->page_y, $direita, $altura);
         $this->pdf->escreve_relativo($matricula, $esquerda, $this->page_y + 2, 45, 45, $fonte, $tam_texto, $corTexto, 'center');
         $this->pdf->linha_relativa($esquerda += 45, $this->page_y, 0, $altura);
         // Nome do aluno
         $espaco_nome = 150;
         $this->pdf->escreve_relativo($aluno['nome'], $esquerda, $this->page_y + 2, $espaco_nome, 45, $fonte, $tam_texto, $corTexto, 'center');
         $this->pdf->linha_relativa($esquerda += $espaco_nome, $this->page_y, 0, $altura);
         // Situação da matrícula
         $this->pdf->escreve_relativo(App_Model_MatriculaSituacao::getInstance()->getValue($aluno['aprovado']), $esquerda, $this->page_y + 4, 45, 45, $fonte, $tam_texto, $corTexto, 'center');
         $this->pdf->linha_relativa($esquerda += 45, $this->page_y, 0, $altura);
         $espacoComponentes = ceil(($direita - $esquerda) / (count($this->componentes) + ($this->presencaGeral ? 1 : 0)));
         // Exibe as médias e faltas do aluno
         foreach ($this->componentes as $id => $componente) {
             // Se não tem média, foi dispensado do componente
             if (!isset($medias[$id])) {
                 $media = 'D';
                 $faltas = 'D';
             } else {
                 $media = $medias[$id][0];
                 $media = $media->mediaArredondada;
                 if (!$this->presencaGeral) {
                     if (isset($faltas[$id])) {
                         $faltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas[$id], 'id', 'quantidade'));
                     }
                 }
             }
             // Média
             $this->pdf->escreve_relativo($media, $esquerda, $this->page_y + 4, $espacoComponentes / $espacoDiv, 50, $fonte, $tam_texto + 1, $corTexto, 'center');
             $this->pdf->linha_relativa($esquerda + $espacoComponentes / $espacoDiv, $this->page_y, 0, $altura);
             // Exibe as faltas no componente curricular, caso a presença não seja geral
             if (!$this->presencaGeral) {
                 $this->pdf->escreve_relativo($faltas, $esquerda + $espacoComponentes / $espacoDiv, $this->page_y + 4, $espacoComponentes / $espacoDiv, 100, $fonte, $tam_texto + 1, $corTexto, 'center');
             }
             $esquerda += $espacoComponentes;
             $this->pdf->linha_relativa($esquerda, $this->page_y, 0, $altura);
         }
         // Exibe as faltas no total, caso a presença seja geral
         if ($this->presencaGeral) {
             $this->pdf->escreve_relativo($faltas, $esquerda, $this->page_y + 4, $espacoComponentes, 50, $fonte, $tam_texto + 1, $corTexto, 'center');
             $esquerda += $espacoComponentes;
             $this->pdf->linha_relativa($esquerda, $this->page_y, 0, $altura);
         }
         $this->page_y += $altura;
         if ($this->page_y > $this->pdf->altura - $altura * 2) {
             $this->pdf->ClosePage();
             $this->pdf->OpenPage();
             $this->addCabecalho();
         }
     }
 }
Example #4
0
 /**
  * @see clsCadastro#Gerar()
  */
 public function Gerar()
 {
     // Dados da matrícula
     $matricula = $this->_service->getOption('matriculaData');
     // Nome do aluno
     $nome = $matricula['nome'];
     // Nome da escola
     $escola = new clsPmieducarEscola($matricula['ref_ref_cod_escola']);
     $escola = $escola->detalhe();
     $escola = ucwords(strtolower($escola['nome']));
     // Nome do curso
     $curso = $matricula['curso_nome'];
     // Nome da série
     $serie = $matricula['serie_nome'];
     // Nome da turma
     $turma = $matricula['turma_nome'];
     // Situação da matrícula
     $situacao = App_Model_MatriculaSituacao::getInstance();
     $situacao = $situacao->getValue($matricula['aprovado']);
     // Dados da matrícula
     $this->addDetalhe(array('Aluno', $nome));
     $this->addDetalhe(array('Escola', $escola));
     $this->addDetalhe(array('Curso', $curso));
     $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));
     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);
     // Atributos para a tabela
     $attributes = array('style' => 'background-color: #A1B3BD; padding: 5px; text-align: center');
     // Atributos para a tabela de notas/faltas
     $zebra = array(0 => array('style' => 'background-color: #E4E9ED'), 1 => array('style' => 'background-color: #FFFFFF'));
     // Helper para criar links e urls
     $url = CoreExt_View_Helper_UrlHelper::getInstance();
     // Usa helper de tabela para criar a tabela de notas/faltas
     $table = CoreExt_View_Helper_TableHelper::getInstance();
     // Enum para situação de matrícula
     $situacao = App_Model_MatriculaSituacao::getInstance();
     // Situação do boletim do aluno
     $sit = $this->_situacao;
     // Títulos da tabela
     $labels = array();
     $labels[] = array('data' => 'Disciplinas', 'attributes' => $attributes);
     foreach ($etapas as $etapa) {
         $data = array('data' => sprintf('Etapa %d', $etapa));
         if ($nenhumaNota) {
             $data['colspan'] = 1;
         } else {
             $data['colspan'] = $porComponente ? 2 : 1;
         }
         $data['attributes'] = $attributes;
         $labels[] = $data;
     }
     // Flag para auxiliar na composição da tabela em casos onde o parecer
     // descritivo é lançado anualmente e por componente
     $parecerComponenteAnual = FALSE;
     $colspan = 0;
     if ($this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE) {
         if (TRUE == $this->_componenteEncerrado($sit->nota->componentesCurriculares)) {
             $parecerComponenteAnual = TRUE;
             $colspan++;
         }
     }
     // Colspan para tabela com labels e sublabels
     $colspan += $porComponente && $sit->recuperacao ? 4 : 3;
     if ($nenhumaNota) {
         $colspan--;
     }
     if (!$nenhumaNota) {
         $labels[] = array('data' => $porComponente ? '' : 'Média', 'attributes' => $attributes, 'colspan' => $porComponente ? $colspan : 1);
     }
     // Inclui coluna para % de presença geral.
     if (!$porComponente) {
         if ($sit->recuperacao) {
             $labels[] = array('data' => 'Exame', 'attributes' => $attributes);
         }
         if ($parecerComponenteAnual) {
             $labels[] = array('data' => 'Parecer', 'attributes' => $attributes);
         }
         $labels[] = array('data' => 'Presença', 'attributes' => $attributes);
         $labels[] = array('data' => 'Situação', 'attributes' => $attributes);
     }
     $table->addHeaderRow($labels);
     // Cria sub-header caso tenha faltas lançadas por componentes
     if ($porComponente) {
         $subLabels = array();
         $subLabels[] = array('attributes' => $attributes);
         for ($i = 0, $loop = count($etapas); $i < $loop; $i++) {
             if (!$nenhumaNota) {
                 $subLabels[] = array('data' => 'Nota', 'attributes' => $attributes);
             }
             $subLabels[] = array('data' => 'Falta', 'attributes' => $attributes);
         }
         if (!$nenhumaNota) {
             $subLabels[] = array('data' => 'Média', 'attributes' => $attributes);
         }
         if ($sit->recuperacao) {
             $subLabels[] = array('data' => 'Exame', 'attributes' => $attributes);
         }
         if ($porComponente) {
             if ($parecerComponenteAnual) {
                 $subLabels[] = array('data' => 'Parecer', 'attributes' => $attributes);
             }
             $subLabels[] = array('data' => 'Presença', 'attributes' => $attributes);
             $subLabels[] = array('data' => 'Situação', 'attributes' => $attributes);
         }
         $table->addHeaderRow($subLabels);
     }
     // Atributos usados pelos itens de dados
     $attributes = array('style' => 'padding: 5px; text-align: center');
     // Notas
     $componentes = $this->_service->getComponentes();
     $notasComponentes = $this->_service->getNotasComponentes();
     $mediasSituacoes = $this->_situacao->nota;
     $mediasComponentes = $this->_service->getMediasComponentes();
     $faltasComponentes = $this->_service->getFaltasComponentes();
     // Calcula as porcentagens de presença
     $faltasStats = $this->_service->getSituacaoFaltas();
     // Texto do link
     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' => $linkPath, 'query' => array('matricula' => $matricula['cod_matricula'], 'componenteCurricular' => 0));
     $iteration = 0;
     foreach ($componentes as $id => $componente) {
         $data = array();
         // 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;
         // Caso os pareceres sejam por componente e anuais, recupera a instância
         if ($parecerComponenteAnual) {
             $parecer = $this->_service->getPareceresComponentes();
             $parecer = $parecer[$id];
         }
         if ($porComponente == TRUE) {
             $new = $url->l('Lançar nota', 'nota', array('query' => array('matricula' => $matricula['cod_matricula'], 'componenteCurricular' => $id)));
         }
         $newLink['query']['componenteCurricular'] = $id;
         $new = $url->l($newLink['text'], $newLink['path'], array('query' => $newLink['query']));
         $update = array('query' => array('matricula' => $matricula['cod_matricula'], 'componenteCurricular' => $id, 'etapa' => 0));
         // Lista as notas do componente por etapa
         for ($i = 0, $loop = count($etapas); $i < $loop; $i++) {
             $nota = $falta = NULL;
             if (isset($notas[$i])) {
                 $update['query']['etapa'] = $notas[$i]->etapa;
                 $nota = $url->l($notas[$i]->notaArredondada, 'nota', $update);
             }
             if (isset($faltas[$i])) {
                 $update['query']['etapa'] = $faltas[$i]->etapa;
                 $linkPath = $nenhumaNota ? 'falta' : 'nota';
                 $falta = $url->l($faltas[$i]->quantidade, $linkPath, $update);
             }
             /*
              * 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 {
                     $data[] = array('data' => $new, 'attributes' => $attributes, 'colspan' => $colspan);
                     $new = '';
                 }
             } elseif ($nenhumaNota && $porComponente) {
                 if ($falta) {
                     $data[] = array('data' => $falta, 'attributes' => $attributes, 'colspan' => $colspan);
                 } else {
                     $data[] = array('data' => $new, 'attributes' => $attributes, 'colspan' => $colspan);
                     $new = '';
                 }
             } else {
                 $data[] = array('data' => '', 'attributes' => $attributes);
             }
         }
         // Média no componente curricular
         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) {
             if ($mediaSituacao->situacao == App_Model_MatriculaSituacao::EM_EXAME || $mediaSituacao->situacao == App_Model_MatriculaSituacao::APROVADO_APOS_EXAME || $mediaSituacao->situacao == App_Model_MatriculaSituacao::REPROVADO) {
                 $link = $newLink;
                 $link['query']['componenteCurricular'] = $id;
                 $link['query']['etapa'] = 'Rc';
                 $notaRec = $i;
                 if (isset($notas[$notaRec]) && $notas[$notaRec]->etapa == 'Rc') {
                     $link['text'] = $notas[$notaRec]->notaArredondada;
                 }
                 $recuperacaoLink = $url->l($link['text'], $link['path'], array('query' => $link['query']));
                 $data[] = array('data' => $recuperacaoLink, 'attributes' => $attributes);
             } else {
                 $data[] = array('data' => '', 'attributes' => $attributes);
             }
         }
         // Adiciona uma coluna extra caso o parecer seja por componente ao final do ano
         if ($parecerComponenteAnual) {
             $link = array('text' => '', 'path' => 'parecer', 'query' => array('matricula' => $this->getRequest()->matricula));
             if (0 == count($parecer)) {
                 $text = 'Lançar';
             } else {
                 $text = 'Editar';
             }
             $link['query']['componenteCurricular'] = $id;
             // @todo Constante ou CoreExt_Enum
             $link['query']['etapa'] = 'An';
             $link = $url->l($text, $link['path'], array('query' => $link['query']));
             if (isset($mediaSituacao->situacao) && $mediaSituacao->situacao != App_Model_MatriculaSituacao::EM_ANDAMENTO) {
                 $data[] = array('data' => $link, 'attributes' => $attributes);
             } else {
                 $data[] = array('data' => '', 'attributes' => $attributes);
             }
         }
         // Informações extras como porcentagem de presença e situação do aluno
         if ($porComponente) {
             $data[] = array('data' => sprintf('%.2f%%', $faltaStats->porcentagemPresenca), 'attributes' => $attributes);
         } else {
             $data[] = array('data' => '', 'attributes' => $attributes);
         }
         $data[] = array('data' => $situacao->getValue($mediaSituacao->situacao), 'attributes' => $attributes);
         $iteration++;
         $class = $iteration % 2;
         $table->addBodyRow($data, $zebra[$class]);
     }
     $newLink = array('text' => 'Lançar falta', 'path' => 'falta', 'query' => array('matricula' => $matricula['cod_matricula']));
     // Situação geral das faltas
     $data = array(0 => array('data' => 'Faltas', 'attributes' => array('style' => 'padding: 5px; text-align: left')));
     $faltas = $this->_service->getFaltasGerais();
     $new = $url->l($newLink['text'], $newLink['path'], array('query' => $newLink['query']));
     // Listas faltas (para faltas no geral)
     for ($i = 1, $loop = count($etapas); $i <= $loop; $i++) {
         if (isset($faltas[$i])) {
             $link = $newLink;
             $link['query']['etapa'] = $faltas[$i]->etapa;
             $link = $porComponente ? '' : $url->l($faltas[$i]->quantidade, $link['path'], array('query' => $link['query']));
             $data[] = array('data' => $link, 'attributes' => $attributes);
             if ($porComponente) {
                 $data[] = array('data' => '', 'attributes' => $attributes);
             }
         } else {
             $new = $porComponente ? '' : $new;
             $data[] = array('data' => $new, 'attributes' => $attributes);
             $new = '';
             if ($porComponente && !$nenhumaNota) {
                 $data[] = array('data' => '', 'attributes' => $attributes);
             }
         }
     }
     if (!$nenhumaNota) {
         $data[] = array();
     }
     if ($sit->recuperacao) {
         $data[] = array('data' => '', 'attributes' => $attributes);
     }
     if ($parecerComponenteAnual) {
         $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);
     $table->addFooterRow($data, $zebra[$class ^ 1]);
     // Adiciona linha com links para lançamento de parecer descritivo geral por etapa
     if ($this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL) {
         $newLink = array('text' => 'Lançar parecer', 'path' => 'parecer', 'query' => array('matricula' => $matricula['cod_matricula']));
         $data = array(0 => array('data' => 'Pareceres', 'attributes' => array('style' => 'padding: 5px; text-align: left')));
         $pareceres = $this->_service->getPareceresGerais();
         for ($i = 1, $loop = count($etapas); $i <= $loop; $i++) {
             if (isset($pareceres[$i])) {
                 $link = $newLink;
                 $link['text'] = 'Editar parecer';
                 $link['query']['etapa'] = $i;
                 $data[] = array('data' => $url->l($link['text'], $link['path'], array('query' => $link['query'])), 'attributes' => $attributes);
             } else {
                 if ('' == $newLink) {
                     $link = '';
                 } else {
                     $link = $url->l($newLink['text'], $newLink['path'], array('query' => $newLink['query']));
                 }
                 $data[] = array('data' => $link, 'attributes' => $attributes);
                 $newLink = '';
             }
         }
         if ($sit->recuperacao) {
             $data[] = array('data' => '', 'attributes' => $attributes);
         }
         $data[] = array('data' => '', 'attributes' => $attributes);
         $data[] = array('data' => '', 'attributes' => $attributes);
         $table->addFooterRow($data);
     }
     // Adiciona tabela na página
     $this->addDetalhe(array('Disciplinas', '<div id="disciplinas">' . $table . '</div>'));
     // Adiciona link para lançamento de parecer descritivo anual geral
     if (FALSE == $sit->andamento && $this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL) {
         if (0 == count($this->_service->getPareceresGerais())) {
             $label = 'Lançar';
         } else {
             $label = 'Editar';
         }
         $link = array('text' => $label . ' parecer descritivo do aluno', 'path' => 'parecer', 'query' => array('matricula' => $this->getRequest()->matricula));
         $this->addDetalhe(array('Parecer descritivo anual', $url->l($link['text'], $link['path'], array('query' => $link['query']))));
     }
     // Caso o tipo de progressão seja manual, a situação das notas/faltas não
     // esteja mais em "andamento" e a matrícula esteja em andamento, exibe
     // botões de ação
     if ($this->_service->getRegra()->get('tipoProgressao') == RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL && FALSE == $sit->andamento && $matricula['aprovado'] == App_Model_MatriculaSituacao::EM_ANDAMENTO) {
         $link = array('text' => 'sim', 'path' => 'boletim', 'query' => array('matricula' => $this->getRequest()->matricula, 'promove' => 1));
         $sim = '<span class="confirm yes">' . $url->l($link['text'], $link['path'], array('query' => $link['query'])) . '</span>';
         $link['text'] = 'não (retém o aluno)';
         $link['query']['promove'] = 0;
         $nao = '<span class="confirm no">' . $url->l($link['text'], $link['path'], array('query' => $link['query'])) . '</span>';
         $links = '<div style="padding: 5px 0 5px 0">' . $sim . $nao . '</div>';
         $this->addDetalhe(array('Promover aluno?', $links));
     }
 }
 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);
 }