Commit c5eab2c1c42f7477f306c3c630706f3bcf0443af

Authored by Eriksen Costa Paixão
1 parent 5823bc31
Exists in master

Atualizado service {{{Avaliacao_Service_Boletim}}} para suportar pareceres descr…

…itivos. Refactoring nos casos de testes para torná-los mais simples e configuráveis para diferentes cenários
Showing 34 changed files with 6639 additions and 2074 deletions   Show diff stats
ieducar/lib/App/Model/Matricula.php
@@ -59,7 +59,9 @@ class App_Model_Matricula @@ -59,7 +59,9 @@ class App_Model_Matricula
59 $instance->cod_matricula = $matricula; 59 $instance->cod_matricula = $matricula;
60 $instance->ref_usuario_cad = $usuario; 60 $instance->ref_usuario_cad = $usuario;
61 $instance->ref_usuario_exc = $usuario; 61 $instance->ref_usuario_exc = $usuario;
62 - $instance->aprovado = ($aprovado == TRUE) ? 1 : 2; 62 + $instance->aprovado = ($aprovado == TRUE) ?
  63 + App_Model_MatriculaSituacao::APROVADO :
  64 + App_Model_MatriculaSituacao::REPROVADO;
63 65
64 return $instance->edita(); 66 return $instance->edita();
65 } 67 }
ieducar/modules/Avaliacao/Model/ParecerDescritivoAbstract.php
@@ -72,4 +72,14 @@ abstract class Avaliacao_Model_ParecerDescritivoAbstract extends Avaliacao_Model @@ -72,4 +72,14 @@ abstract class Avaliacao_Model_ParecerDescritivoAbstract extends Avaliacao_Model
72 'parecer' => new CoreExt_Validate_String() 72 'parecer' => new CoreExt_Validate_String()
73 ); 73 );
74 } 74 }
  75 +
  76 + /**
  77 + * Implementa método mágico __toString().
  78 + * @link http://br.php.net/__toString
  79 + * @return string
  80 + */
  81 + public function __toString()
  82 + {
  83 + return $this->parecer;
  84 + }
75 } 85 }
76 \ No newline at end of file 86 \ No newline at end of file
ieducar/modules/Avaliacao/Service/Boletim.php
@@ -47,6 +47,8 @@ require_once 'App/Model/MatriculaSituacao.php'; @@ -47,6 +47,8 @@ require_once 'App/Model/MatriculaSituacao.php';
47 * @package Avaliacao 47 * @package Avaliacao
48 * @subpackage Modules 48 * @subpackage Modules
49 * @since Classe disponível desde a versão 1.1.0 49 * @since Classe disponível desde a versão 1.1.0
  50 + * @todo Substituir todos os usos literais de 'Rc' e 'An' por constantes
  51 + * ou por um novo CoreExt_Enum
50 * @version @@package_version@@ 52 * @version @@package_version@@
51 */ 53 */
52 class Avaliacao_Service_Boletim implements CoreExt_Configurable 54 class Avaliacao_Service_Boletim implements CoreExt_Configurable
@@ -89,6 +91,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -89,6 +91,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
89 protected $_faltaAlunoDataMapper = NULL; 91 protected $_faltaAlunoDataMapper = NULL;
90 92
91 /** 93 /**
  94 + * @var Avaliacao_Model_ParecerDescritivoAlunoDataMapper
  95 + */
  96 + protected $_parecerDescritivoAlunoDataMapper = NULL;
  97 +
  98 + /**
92 * @var Avaliacao_Model_NotaComponenteDataMapper 99 * @var Avaliacao_Model_NotaComponenteDataMapper
93 */ 100 */
94 protected $_notaComponenteDataMapper = NULL; 101 protected $_notaComponenteDataMapper = NULL;
@@ -104,6 +111,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -104,6 +111,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
104 protected $_notaComponenteMediaDataMapper = NULL; 111 protected $_notaComponenteMediaDataMapper = NULL;
105 112
106 /** 113 /**
  114 + * @var Avaliacao_Model_ParecerDescritivoAbstractDataMapper
  115 + */
  116 + protected $_parecerDescritivoAbstractDataMapper = NULL;
  117 +
  118 + /**
107 * Uma instância de Avaliacao_Model_NotaAluno, que é a entrada que contém 119 * Uma instância de Avaliacao_Model_NotaAluno, que é a entrada que contém
108 * o cruzamento de matrícula com as notas do aluno nos diversos componentes 120 * o cruzamento de matrícula com as notas do aluno nos diversos componentes
109 * cursados. 121 * cursados.
@@ -122,6 +134,15 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -122,6 +134,15 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
122 protected $_faltaAluno = NULL; 134 protected $_faltaAluno = NULL;
123 135
124 /** 136 /**
  137 + * Uma instância de Avaliacao_Model_ParecerDescritivoAluno, que é a entrada
  138 + * que contém o cruzamento de matrícula com os pareceres do aluno nos diversos
  139 + * componentes cursados ou no geral.
  140 + *
  141 + * @var Avaliacao_Model_ParecerDescritivoAluno
  142 + */
  143 + protected $_parecerDescritivoAluno = NULL;
  144 +
  145 + /**
125 * Componentes que o aluno cursa, indexado pelo id de 146 * Componentes que o aluno cursa, indexado pelo id de
126 * ComponenteCurricular_Model_Componente. 147 * ComponenteCurricular_Model_Componente.
127 * @var array 148 * @var array
@@ -165,13 +186,49 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -165,13 +186,49 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
165 protected $_faltas = array(); 186 protected $_faltas = array();
166 187
167 /** 188 /**
  189 + * Pareceres descritivos adicionados no boletim para inclusão ou edição.
  190 + * @var array
  191 + */
  192 + protected $_pareceres = array();
  193 +
  194 + /**
  195 + * Pareceres descritivos do aluno nos componentes cursados.
  196 + * @var array
  197 + */
  198 + protected $_pareceresComponentes = array();
  199 +
  200 + /**
  201 + * Pareceres descritivos do aluno no geral.
  202 + * @var array
  203 + */
  204 + protected $_pareceresGerais = array();
  205 +
  206 + /**
  207 + * Validadores para instâncias de Avaliacao_Model_FaltaAbstract e
  208 + * Avaliacao_Model_NotaComponente.
  209 + *
  210 + * @see Avaliacao_Service_Boletim#_addValidators()
  211 + * @var array
  212 + */
  213 + protected $_validators = NULL;
  214 +
  215 + /**
  216 + * Validadores para uma instância de Avaliacao_Model_ParecerDescritivoAbstract
  217 + * adicionada no boletim.
  218 + *
  219 + * @see Avaliacao_Service_Boletim#_addParecerValidators()
  220 + * @var array
  221 + */
  222 + protected $_parecerValidators = NULL;
  223 +
  224 + /**
168 * Prioridade da situação da matrícula, usado para definir a situação 225 * Prioridade da situação da matrícula, usado para definir a situação
169 * das notas e faltas. 226 * das notas e faltas.
170 * @var array 227 * @var array
171 */ 228 */
172 protected $_situacaoPrioridade = array( 229 protected $_situacaoPrioridade = array(
173 - App_Model_MatriculaSituacao::EM_EXAME => 1,  
174 - App_Model_MatriculaSituacao::EM_ANDAMENTO => 2, 230 + App_Model_MatriculaSituacao::EM_ANDAMENTO => 1,
  231 + App_Model_MatriculaSituacao::EM_EXAME => 2,
175 App_Model_MatriculaSituacao::REPROVADO => 3, 232 App_Model_MatriculaSituacao::REPROVADO => 3,
176 App_Model_MatriculaSituacao::APROVADO_APOS_EXAME => 4, 233 App_Model_MatriculaSituacao::APROVADO_APOS_EXAME => 4,
177 App_Model_MatriculaSituacao::APROVADO => 5 234 App_Model_MatriculaSituacao::APROVADO => 5
@@ -193,7 +250,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -193,7 +250,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
193 $this->setOptions($options) 250 $this->setOptions($options)
194 ->_setMatriculaInfo() 251 ->_setMatriculaInfo()
195 ->_loadNotaComponenteCurricular() 252 ->_loadNotaComponenteCurricular()
196 - ->_loadFalta(); 253 + ->_loadFalta()
  254 + ->_loadParecerDescritivo();
197 } 255 }
198 256
199 /** 257 /**
@@ -242,6 +300,16 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -242,6 +300,16 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
242 unset($options['FaltaAbstractDataMapper']); 300 unset($options['FaltaAbstractDataMapper']);
243 } 301 }
244 302
  303 + if (isset($options['ParecerDescritivoAlunoDataMapper'])) {
  304 + $this->setParecerDescritivoAlunoDataMapper($options['ParecerDescritivoAlunoDataMapper']);
  305 + unset($options['ParecerDescritivoAlunoDataMapper']);
  306 + }
  307 +
  308 + if (isset($options['ParecerDescritivoAbstractDataMapper'])) {
  309 + $this->setParecerDescritivoAbstractDataMapper($options['ParecerDescritivoAbstractDataMapper']);
  310 + unset($options['ParecerDescritivoAbstractDataMapper']);
  311 + }
  312 +
245 $defaultOptions = array_keys($this->getOptions()); 313 $defaultOptions = array_keys($this->getOptions());
246 $passedOptions = array_keys($options); 314 $passedOptions = array_keys($options);
247 315
@@ -465,6 +533,70 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -465,6 +533,70 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
465 } 533 }
466 534
467 /** 535 /**
  536 + * Setter.
  537 + * @param Avaliacao_Model_ParecerDescritivoAlunoDataMapper $mapper
  538 + * @return App_Service_Boletim Provê interface fluída
  539 + */
  540 + public function setParecerDescritivoAlunoDataMapper(Avaliacao_Model_ParecerDescritivoAlunoDataMapper $mapper)
  541 + {
  542 + $this->_parecerDescritivoAlunoDataMapper = $mapper;
  543 + return $this;
  544 + }
  545 +
  546 + /**
  547 + * Getter.
  548 + * @return Avaliacao_Model_ParecerDescritivoAlunoDataMapper
  549 + */
  550 + public function getParecerDescritivoAlunoDataMapper()
  551 + {
  552 + if (is_null($this->_parecerDescritivoAlunoDataMapper)) {
  553 + require_once 'Avaliacao/Model/ParecerDescritivoAlunoDataMapper.php';
  554 + $this->setParecerDescritivoAlunoDataMapper(new Avaliacao_Model_ParecerDescritivoAlunoDataMapper());
  555 + }
  556 + return $this->_parecerDescritivoAlunoDataMapper;
  557 + }
  558 +
  559 + /**
  560 + * Setter.
  561 + * @param Avaliacao_Model_ParecerDescritivoAbstractDataMapper $mapper
  562 + * @return App_Service_Boletim Provê interface fluída
  563 + */
  564 + public function setParecerDescritivoAbstractDataMapper(Avaliacao_Model_ParecerDescritivoAbstractDataMapper $mapper)
  565 + {
  566 + $this->_parecerDescritivoAbstractDataMapper = $mapper;
  567 + return $this;
  568 + }
  569 +
  570 + /**
  571 + * Getter.
  572 + * @return Avaliacao_Model_ParecerDescritivoAbstractDataMapper
  573 + */
  574 + public function getParecerDescritivoAbstractDataMapper()
  575 + {
  576 + if (is_null($this->_parecerDescritivoAbstractDataMapper)) {
  577 + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo');
  578 +
  579 + switch($parecerDescritivo) {
  580 + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL:
  581 + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL:
  582 + $filename = 'Avaliacao/Model/ParecerDescritivoGeralDataMapper.php';
  583 + $class = 'Avaliacao_Model_ParecerDescritivoGeralDataMapper';
  584 + break;
  585 + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE:
  586 + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE:
  587 + $filename = 'Avaliacao/Model/ParecerDescritivoComponenteDataMapper.php';
  588 + $class = 'Avaliacao_Model_ParecerDescritivoComponenteDataMapper';
  589 + break;
  590 + }
  591 +
  592 + require_once $filename;
  593 + $this->setParecerDescritivoAbstractDataMapper(new $class());
  594 + }
  595 +
  596 + return $this->_parecerDescritivoAbstractDataMapper;
  597 + }
  598 +
  599 + /**
468 * Retorna as instâncias de Avaliacao_Model_NotaComponente do aluno. 600 * Retorna as instâncias de Avaliacao_Model_NotaComponente do aluno.
469 * @return array 601 * @return array
470 */ 602 */
@@ -501,6 +633,25 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -501,6 +633,25 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
501 } 633 }
502 634
503 /** 635 /**
  636 + * Retorna as instâncias de Avaliacao_Model_ParecerDescritivoComponente do
  637 + * aluno.
  638 + * @return array
  639 + */
  640 + public function getPareceresComponentes()
  641 + {
  642 + return $this->_pareceresComponentes;
  643 + }
  644 +
  645 + /**
  646 + * Retorna as instâncias de Avaliacao_Model_ParecerDescritivoGeral do aluno.
  647 + * @return array
  648 + */
  649 + public function getPareceresGerais()
  650 + {
  651 + return $this->_pareceresGerais;
  652 + }
  653 +
  654 + /**
504 * Retorna uma instância de Avaliacao_Model_NotaComponente. 655 * Retorna uma instância de Avaliacao_Model_NotaComponente.
505 * 656 *
506 * @param int $id O identificador de ComponenteCurricular_Model_Componente 657 * @param int $id O identificador de ComponenteCurricular_Model_Componente
@@ -557,6 +708,49 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -557,6 +708,49 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
557 return NULL; 708 return NULL;
558 } 709 }
559 710
  711 + /**
  712 + * Retorna uma instância de Avaliacao_Model_ParecerDescritivoAbstract.
  713 + *
  714 + * @param int $etapa A etapa para o qual o parecer foi lançado
  715 + * @param int $id O identificador de ComponenteCurricular_Model_Componente
  716 + * @return Avaliacao_Model_ParecerAbstract|NULL
  717 + */
  718 + public function getParecerDescritivo($etapa = 1, $id = NULL)
  719 + {
  720 + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo');
  721 +
  722 + $gerais = array(
  723 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL,
  724 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL
  725 + );
  726 +
  727 + $componentes = array(
  728 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE,
  729 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE
  730 + );
  731 +
  732 + if (in_array($parecerDescritivo, $gerais)) {
  733 + $pareceres = $this->getPareceresGerais();
  734 + }
  735 + elseif (in_array($parecerDescritivo, $componentes)) {
  736 + $pareceres = $this->getPareceresComponentes();
  737 +
  738 + if (!isset($pareceres[$id])) {
  739 + return NULL;
  740 + }
  741 +
  742 + $pareceres = $pareceres[$id];
  743 + }
  744 +
  745 + foreach ($pareceres as $parecer) {
  746 + if ($parecer->etapa == $etapa) {
  747 + return $parecer;
  748 + }
  749 + }
  750 +
  751 + return NULL;
  752 + }
  753 +
560 754
561 /** 755 /**
562 * Setter. 756 * Setter.
@@ -576,6 +770,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -576,6 +770,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
576 770
577 // Valores scalar de referência 771 // Valores scalar de referência
578 $matricula = App_Model_IedFinder::getMatricula($codMatricula); 772 $matricula = App_Model_IedFinder::getMatricula($codMatricula);
  773 +
579 $etapas = App_Model_IedFinder::getQuantidadeDeEtapasMatricula($codMatricula); 774 $etapas = App_Model_IedFinder::getQuantidadeDeEtapasMatricula($codMatricula);
580 $this->setOption('matriculaData', $matricula); 775 $this->setOption('matriculaData', $matricula);
581 $this->setOption('aprovado', $matricula['aprovado']); 776 $this->setOption('aprovado', $matricula['aprovado']);
@@ -688,6 +883,55 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -688,6 +883,55 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
688 } 883 }
689 884
690 /** 885 /**
  886 + * Carrega os pareceres do aluno, sejam gerais ou por componentes.
  887 + * @return App_Service_Boletim Provê interface fluída
  888 + */
  889 + protected function _loadParecerDescritivo()
  890 + {
  891 + if (!$this->hasParecerDescritivoAluno()) {
  892 + $this->_createParecerDescritivoAluno();
  893 + }
  894 +
  895 + $parecerDescritivoAluno = $this->_getParecerDescritivoAluno();
  896 +
  897 + $pareceres = $this->getParecerDescritivoAbstractDataMapper()->findAll(
  898 + array(), array('parecerDescritivoAluno' => $parecerDescritivoAluno->id), array('etapa' => 'ASC')
  899 + );
  900 +
  901 + $gerais = array(
  902 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL,
  903 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL
  904 + );
  905 +
  906 + $componentes = array(
  907 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE,
  908 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE
  909 + );
  910 +
  911 + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo');
  912 + if (in_array($parecerDescritivo, $gerais)) {
  913 + $pareceresGerais = array();
  914 +
  915 + foreach ($pareceres as $parecer) {
  916 + $pareceresGerais[$parecer->etapa] = $parecer;
  917 + }
  918 +
  919 + $this->_pareceresGerais = $pareceresGerais;
  920 + }
  921 + elseif (in_array($parecerDescritivo, $componentes)) {
  922 + $pareceresComponentes = array();
  923 +
  924 + foreach ($pareceres as $parecer) {
  925 + $pareceresComponentes[$parecer->get('componenteCurricular')][] = $parecer;
  926 + }
  927 +
  928 + $this->_pareceresComponentes = $pareceresComponentes;
  929 + }
  930 +
  931 + return $this;
  932 + }
  933 +
  934 + /**
691 * Setter. 935 * Setter.
692 * @param RegraAvaliacao_Model_Regra $regra 936 * @param RegraAvaliacao_Model_Regra $regra
693 * @return App_Service_Boletim Provê interface fluída 937 * @return App_Service_Boletim Provê interface fluída
@@ -811,7 +1055,6 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -811,7 +1055,6 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
811 $situacao->recuperacao = TRUE; 1055 $situacao->recuperacao = TRUE;
812 break; 1056 break;
813 case App_Model_MatriculaSituacao::REPROVADO: 1057 case App_Model_MatriculaSituacao::REPROVADO:
814 - $situacao->recuperacao = TRUE;  
815 $situacao->aprovado = FALSE; 1058 $situacao->aprovado = FALSE;
816 break; 1059 break;
817 } 1060 }
@@ -909,7 +1152,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -909,7 +1152,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
909 $this->hasRecuperacao()) { 1152 $this->hasRecuperacao()) {
910 $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::EM_EXAME; 1153 $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::EM_EXAME;
911 } 1154 }
912 - elseif ($etapa == 'Rc' && $media < $this->getRegra()->media) { 1155 + elseif (($etapa == $this->getOption('etapas') || $etapa == 'Rc') &&
  1156 + $media < $this->getRegra()->media) {
913 $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::REPROVADO; 1157 $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::REPROVADO;
914 } 1158 }
915 elseif ($etapa == 'Rc' && $media >= $this->getRegra()->media && $this->hasRecuperacao()) { 1159 elseif ($etapa == 'Rc' && $media >= $this->getRegra()->media && $this->hasRecuperacao()) {
@@ -1007,6 +1251,9 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1007,6 +1251,9 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1007 // Faltas 1251 // Faltas
1008 $faltasComponentes = array(); 1252 $faltasComponentes = array();
1009 1253
  1254 + // Etapa padrão
  1255 + $etapa = 0;
  1256 +
1010 // Faltas lançadas (persistidas) 1257 // Faltas lançadas (persistidas)
1011 $this->_loadFalta(); 1258 $this->_loadFalta();
1012 1259
@@ -1026,6 +1273,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1026,6 +1273,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1026 elseif ($presenca->tipoFalta == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { 1273 elseif ($presenca->tipoFalta == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) {
1027 $faltas = $this->_faltasComponentes; 1274 $faltas = $this->_faltasComponentes;
1028 $total = 0; 1275 $total = 0;
  1276 + $etapasComponentes = array();
1029 $faltasComponentes = array(); 1277 $faltasComponentes = array();
1030 1278
1031 foreach ($faltas as $key => $falta) { 1279 foreach ($faltas as $key => $falta) {
@@ -1033,11 +1281,14 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1033,11 +1281,14 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1033 $componenteTotal = array_sum(CoreExt_Entity::entityFilterAttr($falta, 1281 $componenteTotal = array_sum(CoreExt_Entity::entityFilterAttr($falta,
1034 'id', 'quantidade')); 1282 'id', 'quantidade'));
1035 1283
1036 - // Pega o id de ComponenteCurricular_Model_Componente da primeira etapa do array 1284 + // Pega o id de ComponenteCurricular_Model_Componente da última etapa do array
1037 $componenteEtapa = array_pop($falta); 1285 $componenteEtapa = array_pop($falta);
1038 $id = $componenteEtapa->get('componenteCurricular'); 1286 $id = $componenteEtapa->get('componenteCurricular');
1039 $etapa = $componenteEtapa->etapa; 1287 $etapa = $componenteEtapa->etapa;
1040 1288
  1289 + // Etapas lançadas
  1290 + $etapasComponentes[$etapa] = $etapa;
  1291 +
1041 // Usa stdClass como interface de acesso 1292 // Usa stdClass como interface de acesso
1042 $faltasComponentes[$id] = new stdClass(); 1293 $faltasComponentes[$id] = new stdClass();
1043 $faltasComponentes[$id]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; 1294 $faltasComponentes[$id]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
@@ -1064,13 +1315,17 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1064,13 +1315,17 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1064 App_Model_MatriculaSituacao::APROVADO : App_Model_MatriculaSituacao::REPROVADO; 1315 App_Model_MatriculaSituacao::APROVADO : App_Model_MatriculaSituacao::REPROVADO;
1065 } 1316 }
1066 1317
1067 - if ($this->_situacaoPrioritaria($faltasComponentes[$id]->situacao, $situacaoGeral)) {  
1068 - $situacaoGeral = $faltasComponentes[$id]->situacao;  
1069 - }  
1070 -  
1071 // Adiciona a quantidade de falta do componente ao total geral de faltas 1318 // Adiciona a quantidade de falta do componente ao total geral de faltas
1072 $total += $componenteTotal; 1319 $total += $componenteTotal;
1073 } 1320 }
  1321 +
  1322 + if (0 == count($faltasComponentes) ||
  1323 + count($faltasComponentes) != count($this->getComponentes())) {
  1324 + $etapa = 1;
  1325 + }
  1326 + else {
  1327 + $etapa = min($etapasComponentes);
  1328 + }
1074 } 1329 }
1075 1330
1076 // Total de faltas 1331 // Total de faltas
@@ -1091,7 +1346,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1091,7 +1346,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1091 1346
1092 // Situação geral. Última verificação pois somente ao fim é possível saber 1347 // Situação geral. Última verificação pois somente ao fim é possível saber
1093 // se está em andamento ou se pode estabelecer como aprovado ou reprovado 1348 // se está em andamento ou se pode estabelecer como aprovado ou reprovado
1094 - if ($etapa == $this->getOption('etapas') || $etapa == 'Rc') { 1349 + if ($etapa == $this->getOption('etapas') || $etapa === 'Rc') {
1095 $aprovado = ($presenca->porcentagemPresenca >= $this->getRegra()->porcentagemPresenca); 1350 $aprovado = ($presenca->porcentagemPresenca >= $this->getRegra()->porcentagemPresenca);
1096 $presenca->situacao = $aprovado ? 1351 $presenca->situacao = $aprovado ?
1097 App_Model_MatriculaSituacao::APROVADO : 1352 App_Model_MatriculaSituacao::APROVADO :
@@ -1270,7 +1525,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1270,7 +1525,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1270 protected function _hasFaltaGeral() 1525 protected function _hasFaltaGeral()
1271 { 1526 {
1272 $faltasGerais = $this->getFaltasGerais(); 1527 $faltasGerais = $this->getFaltasGerais();
1273 - if (!isset($faltasGerais)) { 1528 + if (0 == count($faltasGerais)) {
1274 return FALSE; 1529 return FALSE;
1275 } 1530 }
1276 return TRUE; 1531 return TRUE;
@@ -1334,6 +1589,63 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1334,6 +1589,63 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1334 } 1589 }
1335 1590
1336 /** 1591 /**
  1592 + * Verifica se o aluno tem pareceres lançados.
  1593 + * @return bool
  1594 + */
  1595 + public function hasParecerDescritivoAluno()
  1596 + {
  1597 + if (!is_null($this->_getParecerDescritivoAluno())) {
  1598 + return TRUE;
  1599 + }
  1600 + return FALSE;
  1601 + }
  1602 +
  1603 + /**
  1604 + * Setter.
  1605 + * @param Avaliacao_Model_ParecerDescritivoAluno $parecerDescritivoAluno
  1606 + * @return Avaliacao_Service_Boletim Provê interface fluída
  1607 + */
  1608 + protected function _setParecerDescritivoAluno(Avaliacao_Model_ParecerDescritivoAluno $parecerDescritivoAluno)
  1609 + {
  1610 + $this->_parecerDescritivoAluno = $parecerDescritivoAluno;
  1611 + return $this;
  1612 + }
  1613 +
  1614 + /**
  1615 + * Getter.
  1616 + * @return Avaliacao_Model_ParecerDescritivoAluno|NULL
  1617 + */
  1618 + protected function _getParecerDescritivoAluno()
  1619 + {
  1620 + if (!is_null($this->_parecerDescritivoAluno)) {
  1621 + return $this->_parecerDescritivoAluno;
  1622 + }
  1623 +
  1624 + $parecerDescritivoAluno = $this->getParecerDescritivoAlunoDataMapper()->findAll(
  1625 + array(), array('matricula' => $this->getOption('matricula'))
  1626 + );
  1627 +
  1628 + if (0 == count($parecerDescritivoAluno)) {
  1629 + return NULL;
  1630 + }
  1631 +
  1632 + $this->_setParecerDescritivoAluno($parecerDescritivoAluno[0]);
  1633 + return $this->_parecerDescritivoAluno;
  1634 + }
  1635 +
  1636 + /**
  1637 + * Cria e persiste uma instância de Avaliacao_Model_ParecerDescritivoAluno.
  1638 + * @return bool
  1639 + */
  1640 + protected function _createParecerDescritivoAluno()
  1641 + {
  1642 + $parecerDescritivoAluno = new Avaliacao_Model_ParecerDescritivoAluno();
  1643 + $parecerDescritivoAluno->matricula = $this->getOption('matricula');
  1644 + $parecerDescritivoAluno->parecerDescritivo = $this->getRegra()->get('parecerDescritivo');
  1645 + return $this->getParecerDescritivoAlunoDataMapper()->save($parecerDescritivoAluno);
  1646 + }
  1647 +
  1648 + /**
1337 * Adiciona um array de instâncias Avaliacao_Model_NotaComponente. 1649 * Adiciona um array de instâncias Avaliacao_Model_NotaComponente.
1338 * 1650 *
1339 * @param array $notas 1651 * @param array $notas
@@ -1348,6 +1660,79 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1348,6 +1660,79 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1348 } 1660 }
1349 1661
1350 /** 1662 /**
  1663 + * Verifica se existe alguma instância de Avaliacao_Model_ParecerDescritivoComponente
  1664 + * persistida para o aluno.
  1665 + *
  1666 + * @param int $id Field identity de ComponenteCurricular_Model_Componente
  1667 + * @return bool
  1668 + */
  1669 + protected function _hasParecerComponente($id)
  1670 + {
  1671 + $pareceresComponentes = $this->getPareceresComponentes();
  1672 + if (!isset($pareceresComponentes[$id])) {
  1673 + return FALSE;
  1674 + }
  1675 + return TRUE;
  1676 + }
  1677 +
  1678 + /**
  1679 + * Verifica se existe alguma instância de Avaliacao_Model_ParecerDescritivoGeral
  1680 + * persistida para o aluno.
  1681 + * @return bool
  1682 + */
  1683 + protected function _hasParecerGeral()
  1684 + {
  1685 + if (0 == count($this->getPareceresGerais())) {
  1686 + return FALSE;
  1687 + }
  1688 + return TRUE;
  1689 + }
  1690 +
  1691 + /**
  1692 + * Verifica se existe alguma instância de Avaliacao_Model_ParecerDescritivoAbstract
  1693 + * persistida em uma determinada etapa e retorna o field identity.
  1694 + *
  1695 + * @param Avaliacao_Model_ParecerDescritivoAbstract $instance
  1696 + * @return int|NULL
  1697 + */
  1698 + protected function _getParecerIdEtapa(Avaliacao_Model_ParecerDescritivoAbstract $instance)
  1699 + {
  1700 + $gerais = array(
  1701 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL,
  1702 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL
  1703 + );
  1704 +
  1705 + $componentes = array(
  1706 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE,
  1707 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE
  1708 + );
  1709 +
  1710 + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo');
  1711 +
  1712 + if (in_array($parecerDescritivo, $gerais)) {
  1713 + if (!$this->_hasParecerGeral()) {
  1714 + return NULL;
  1715 + }
  1716 +
  1717 + $pareceres = $this->getPareceresGerais();
  1718 + }
  1719 + elseif (in_array($parecerDescritivo, $componentes)) {
  1720 + if (!$this->_hasParecerComponente($instance->get('componenteCurricular'))) {
  1721 + return NULL;
  1722 + }
  1723 +
  1724 + $pareceres = $this->getPareceresComponentes();
  1725 + $pareceres = $pareceres[$instance->get('componenteCurricular')];
  1726 + }
  1727 +
  1728 + foreach ($pareceres as $parecer) {
  1729 + if ($instance->etapa == $parecer->etapa) {
  1730 + return $parecer->id;
  1731 + }
  1732 + }
  1733 + }
  1734 +
  1735 + /**
1351 * Adiciona notas no boletim. 1736 * Adiciona notas no boletim.
1352 * @param Avaliacao_Model_NotaComponente $nota 1737 * @param Avaliacao_Model_NotaComponente $nota
1353 * @return Avaliacao_Service_Boletim Provê interface fluída 1738 * @return Avaliacao_Service_Boletim Provê interface fluída
@@ -1414,19 +1799,65 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1414,19 +1799,65 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1414 } 1799 }
1415 1800
1416 /** 1801 /**
  1802 + * Adiciona uma array de instâncias de Avaliacao_Model_ParecerDescritivoAbstract
  1803 + * no boletim.
  1804 + *
  1805 + * @param array $pareceres
  1806 + * @return Avaliacao_Service_Boletim Provê interface fluída
  1807 + */
  1808 + public function addPareceres(array $pareceres)
  1809 + {
  1810 + foreach ($pareceres as $parecer) {
  1811 + $this->addParecer($parecer);
  1812 + }
  1813 + return $this;
  1814 + }
  1815 +
  1816 + /**
  1817 + * Adiciona uma instância de Avaliacao_Model_ParecerDescritivoAbstract no
  1818 + * boletim.
  1819 + *
  1820 + * @param Avaliacao_Model_ParecerDescritivoAbstract $parecer
  1821 + * @return Avaliacao_Service_Boletim Provê interface fluída
  1822 + */
  1823 + public function addParecer(Avaliacao_Model_ParecerDescritivoAbstract $parecer)
  1824 + {
  1825 + $key = 'p_' . spl_object_hash($parecer);
  1826 +
  1827 + $this->_pareceres[$key] = $parecer;
  1828 + $this->_updateParecerEtapa($parecer);
  1829 + $this->_addParecerValidators($parecer);
  1830 +
  1831 + return $this;
  1832 + }
  1833 +
  1834 + /**
  1835 + * Getter para as instâncias de Avaliacao_Model_ParecerDescritivoAbstract
  1836 + * adicionadas no boletim (não persistidas).
  1837 + *
  1838 + * @return array
  1839 + */
  1840 + public function getPareceres()
  1841 + {
  1842 + return $this->_pareceres;
  1843 + }
  1844 +
  1845 + /**
1417 * Atualiza as opções de validação de uma instância de 1846 * Atualiza as opções de validação de uma instância de
1418 * CoreExt_Validate_Validatable, com os valores permitidos para os atributos 1847 * CoreExt_Validate_Validatable, com os valores permitidos para os atributos
1419 * 'componenteCurricular' e 'etapa'. 1848 * 'componenteCurricular' e 'etapa'.
1420 * 1849 *
1421 * @param CoreExt_Validate_Validatable $nota 1850 * @param CoreExt_Validate_Validatable $nota
1422 * @return CoreExt_Validate_Validatable 1851 * @return CoreExt_Validate_Validatable
  1852 + * @todo Substituir variável estática por uma de instância {@see _updateParecerEtapa()}
1423 */ 1853 */
1424 protected function _addValidators(CoreExt_Validate_Validatable $validatable) 1854 protected function _addValidators(CoreExt_Validate_Validatable $validatable)
1425 { 1855 {
1426 - static $validators = NULL; 1856 + $validators = array();
1427 1857
1428 // Como os componentes serão os mesmos, fazemos cache do validador 1858 // Como os componentes serão os mesmos, fazemos cache do validador
1429 - if (is_null($validators)) { 1859 + if (is_null($this->_validators)) {
  1860 +
1430 $componentes = $this->getComponentes(); 1861 $componentes = $this->getComponentes();
1431 $componentes = CoreExt_Entity::entityFilterAttr($componentes, 'id', 'id'); 1862 $componentes = CoreExt_Entity::entityFilterAttr($componentes, 'id', 'id');
1432 1863
@@ -1442,9 +1873,13 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1442,9 +1873,13 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1442 $validators['etapa'] = new CoreExt_Validate_Choice( 1873 $validators['etapa'] = new CoreExt_Validate_Choice(
1443 array('choices' => $etapas 1874 array('choices' => $etapas
1444 )); 1875 ));
  1876 +
  1877 + $this->_validators = $validators;
1445 } 1878 }
1446 1879
1447 - if (!($validatable instanceof Avaliacao_Model_FaltaGeral)) { 1880 + $validators = $this->_validators;
  1881 +
  1882 + if ($this->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) {
1448 $validatable->setValidator('componenteCurricular', $validators['componenteCurricular']); 1883 $validatable->setValidator('componenteCurricular', $validators['componenteCurricular']);
1449 } 1884 }
1450 $validatable->setValidator('etapa', $validators['etapa']); 1885 $validatable->setValidator('etapa', $validators['etapa']);
@@ -1453,6 +1888,71 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1453,6 +1888,71 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1453 } 1888 }
1454 1889
1455 /** 1890 /**
  1891 + * Atualiza as opções de validação de uma instância de
  1892 + * Avaliacao_Model_ParecerDescritivoAbstract, com os valores permitidos
  1893 + * para os atributos 'componenteCurricular' e 'etapa'.
  1894 + *
  1895 + * @param Avaliacao_Model_ParecerDescritivoAbstract $instance
  1896 + * @return Avaliacao_Model_ParecerDescritivoAbstract
  1897 + */
  1898 + protected function _addParecerValidators(Avaliacao_Model_ParecerDescritivoAbstract $instance)
  1899 + {
  1900 + if (is_null($this->_parecerValidators)) {
  1901 + $validators = array();
  1902 +
  1903 + $anuais = array(
  1904 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL,
  1905 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE
  1906 + );
  1907 +
  1908 + $etapas = array(
  1909 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL,
  1910 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE
  1911 + );
  1912 +
  1913 + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo');
  1914 +
  1915 + if (in_array($parecerDescritivo, $anuais)) {
  1916 + $validators['etapa'] = new CoreExt_Validate_Choice(array(
  1917 + 'choices' => array('An')
  1918 + ));
  1919 + }
  1920 + elseif (in_array($parecerDescritivo, $etapas)) {
  1921 + $etapas = $this->getOption('etapas');
  1922 + $etapas = array_merge(range(1, $etapas, 1), array('Rc'));
  1923 +
  1924 + $validators['etapa'] = new CoreExt_Validate_Choice(array(
  1925 + 'choices' => $etapas
  1926 + ));
  1927 + }
  1928 +
  1929 + if ($instance instanceof Avaliacao_Model_ParecerDescritivoComponente) {
  1930 + $componentes = $this->getComponentes();
  1931 + $componentes = CoreExt_Entity::entityFilterAttr($componentes, 'id', 'id');
  1932 +
  1933 + $validators['componenteCurricular'] = new CoreExt_Validate_Choice(array(
  1934 + 'choices' => $componentes
  1935 + ));
  1936 + }
  1937 +
  1938 + // Armazena os validadores na instância
  1939 + $this->_parecerValidators = $validators;
  1940 + }
  1941 +
  1942 + $validators = $this->_parecerValidators;
  1943 +
  1944 + // Etapas
  1945 + $instance->setValidator('etapa', $validators['etapa']);
  1946 +
  1947 + // Componentes curriculares
  1948 + if ($instance instanceof Avaliacao_Model_ParecerDescritivoComponente) {
  1949 + $instance->setValidator('componenteCurricular', $validators['componenteCurricular']);
  1950 + }
  1951 +
  1952 + return $instance;
  1953 + }
  1954 +
  1955 + /**
1456 * Atualiza a etapa de uma instância de Avaliacao_Model_Etapa. 1956 * Atualiza a etapa de uma instância de Avaliacao_Model_Etapa.
1457 * 1957 *
1458 * @param Avaliacao_Model_Etapa $nota 1958 * @param Avaliacao_Model_Etapa $nota
@@ -1505,17 +2005,91 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1505,17 +2005,91 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1505 } 2005 }
1506 2006
1507 /** 2007 /**
  2008 + * Atualiza a etapa de uma instância de Avaliacao_Model_ParecerDescritivoAbstract
  2009 + * para a última etapa possível.
  2010 + *
  2011 + * @param Avaliacao_Model_ParecerDescritivoAbstract $instance
  2012 + * @return Avaliacao_Model_ParecerDescritivoAbstract
  2013 + */
  2014 + protected function _updateParecerEtapa(Avaliacao_Model_ParecerDescritivoAbstract $instance)
  2015 + {
  2016 + if (!is_null($instance->etapa)) {
  2017 + return $instance;
  2018 + }
  2019 +
  2020 + $proximaEtapa = 1;
  2021 +
  2022 + $anuais = array(
  2023 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL,
  2024 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE
  2025 + );
  2026 +
  2027 + $etapas = array(
  2028 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL,
  2029 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE
  2030 + );
  2031 +
  2032 + $componentes = array(
  2033 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE,
  2034 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE
  2035 + );
  2036 +
  2037 + $gerais = array(
  2038 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL,
  2039 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL
  2040 + );
  2041 +
  2042 + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo');
  2043 + if (in_array($parecerDescritivo, $anuais)) {
  2044 + $instance->etapa = 'An';
  2045 + return $instance;
  2046 + }
  2047 + elseif (in_array($parecerDescritivo, $etapas)) {
  2048 + $attrValues = array();
  2049 +
  2050 + if (in_array($parecerDescritivo, $gerais)) {
  2051 + $attrValues = $this->getPareceresGerais();
  2052 + }
  2053 + elseif (in_array($parecerDescritivo, $componentes)) {
  2054 + $pareceresComponentes = $this->getPareceresComponentes();
  2055 + if (isset($pareceresComponentes[$instance->get('componenteCurricular')])) {
  2056 + $attrValues = $pareceresComponentes[$instance->get('componenteCurricular')];
  2057 + }
  2058 + }
  2059 +
  2060 + if (0 < count($attrValues)) {
  2061 + $etapas = CoreExt_Entity::entityFilterAttr($attrValues, 'id', 'etapa');
  2062 + $proximaEtapa = max($etapas) + 1;
  2063 + }
  2064 + }
  2065 +
  2066 + if ($proximaEtapa <= $this->getOption('etapas')) {
  2067 + $instance->etapa = $proximaEtapa;
  2068 + }
  2069 + elseif ($this->hasRecuperacao()) {
  2070 + $instance->etapa = 'Rc';
  2071 + }
  2072 +
  2073 + return $instance;
  2074 + }
  2075 +
  2076 + /**
1508 * Arredonda uma nota através da tabela de arredondamento da regra de avaliação. 2077 * Arredonda uma nota através da tabela de arredondamento da regra de avaliação.
1509 * @param Avaliacao_Model_NotaComponente|int $nota 2078 * @param Avaliacao_Model_NotaComponente|int $nota
1510 * @return mixed 2079 * @return mixed
  2080 + * @throws CoreExt_Exception_InvalidArgumentException
1511 */ 2081 */
1512 public function arredondaNota($nota) 2082 public function arredondaNota($nota)
1513 { 2083 {
1514 if ($nota instanceof Avaliacao_Model_NotaComponente) { 2084 if ($nota instanceof Avaliacao_Model_NotaComponente) {
1515 $nota = $nota->nota; 2085 $nota = $nota->nota;
1516 } 2086 }
1517 - elseif (!is_numeric($nota)) {  
1518 - // @todo Exception? 2087 +
  2088 + if (!is_numeric($nota)) {
  2089 + require_once 'CoreExt/Exception/InvalidArgumentException.php';
  2090 + throw new CoreExt_Exception_InvalidArgumentException(sprintf(
  2091 + 'O parâmetro $nota ("%s") não é um valor numérico.', $nota
  2092 + ));
1519 } 2093 }
1520 2094
1521 return $this->getRegra()->tabelaArredondamento->round($nota); 2095 return $this->getRegra()->tabelaArredondamento->round($nota);
@@ -1532,6 +2106,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1532,6 +2106,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1532 { 2106 {
1533 $num1 = floatval($num1); 2107 $num1 = floatval($num1);
1534 $num2 = floatval($num2); 2108 $num2 = floatval($num2);
  2109 +
  2110 + if ($num1 == 0) {
  2111 + return 0;
  2112 + }
  2113 +
1535 $perc = $num2 / $num1; 2114 $perc = $num2 / $num1;
1536 return ($decimal == TRUE ? $perc : ($perc * 100)); 2115 return ($decimal == TRUE ? $perc : ($perc * 100));
1537 } 2116 }
@@ -1569,6 +2148,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1569,6 +2148,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1569 try { 2148 try {
1570 $this->saveNotas() 2149 $this->saveNotas()
1571 ->saveFaltas() 2150 ->saveFaltas()
  2151 + ->savePareceres()
1572 ->promover(); 2152 ->promover();
1573 } 2153 }
1574 catch (CoreExt_Service_Exception $e) { 2154 catch (CoreExt_Service_Exception $e) {
@@ -1582,7 +2162,6 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1582,7 +2162,6 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1582 /** 2162 /**
1583 * Insere ou atualiza as notas no boletim do aluno. 2163 * Insere ou atualiza as notas no boletim do aluno.
1584 * @return Avaliacao_Service_Boletim Provê interface fluída 2164 * @return Avaliacao_Service_Boletim Provê interface fluída
1585 - * @todo Criar teste para verificar se _getNotaIdEtapa retorna o esperado  
1586 */ 2165 */
1587 public function saveNotas() 2166 public function saveNotas()
1588 { 2167 {
@@ -1602,62 +2181,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1602,62 +2181,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1602 } 2181 }
1603 2182
1604 /** 2183 /**
1605 - * Atualiza a média dos componentes curriculares.  
1606 - */  
1607 - protected function _updateNotaComponenteMedia()  
1608 - {  
1609 - require_once 'Avaliacao/Model/NotaComponenteMedia.php';  
1610 - $this->_loadNotaComponenteCurricular(FALSE);  
1611 -  
1612 - foreach ($this->_notasComponentes as $id => $notasComponentes) {  
1613 - // Cria um array onde o índice é a etapa  
1614 - $etapasNotas = CoreExt_Entity::entityFilterAttr($notasComponentes, 'etapa', 'nota');  
1615 - $notas = array('Se' => 0, 'Et' => $this->getOption('etapas'));  
1616 -  
1617 - // Cria o array formatado para o cálculo da fórmula da média  
1618 - foreach ($etapasNotas as $etapa => $nota) {  
1619 - if (is_numeric($etapa)) {  
1620 - $notas['E' . $etapa] = $nota;  
1621 - $notas['Se'] += $nota;  
1622 - continue;  
1623 - }  
1624 - $notas[$etapa] = $nota;  
1625 - }  
1626 -  
1627 - // Calcula a média  
1628 - $media = $this->_calculaMedia($notas);  
1629 -  
1630 - // Cria uma nova instância de média, já com a nota arredondada e a etapa  
1631 - $notaComponenteCurricularMedia = new Avaliacao_Model_NotaComponenteMedia(array(  
1632 - 'notaAluno' => $this->_getNotaAluno()->id,  
1633 - 'componenteCurricular' => $id,  
1634 - 'media' => $media,  
1635 - 'mediaArredondada' => $this->arredondaNota($media),  
1636 - 'etapa' => $etapa  
1637 - ));  
1638 -  
1639 - try {  
1640 - // Se existir, marca como "old" para possibilitar a atualização  
1641 - $this->getNotaComponenteMediaDataMapper()->find(array(  
1642 - $notaComponenteCurricularMedia->get('notaAluno'),  
1643 - $notaComponenteCurricularMedia->get('componenteCurricular'),  
1644 - ));  
1645 -  
1646 - $notaComponenteCurricularMedia->markOld();  
1647 - }  
1648 - catch (Exception $e) {  
1649 - // Prossegue, sem problemas.  
1650 - }  
1651 -  
1652 - // Salva a média  
1653 - $this->getNotaComponenteMediaDataMapper()->save($notaComponenteCurricularMedia);  
1654 - }  
1655 - }  
1656 -  
1657 - /**  
1658 * Insere ou atualiza as faltas no boletim. 2184 * Insere ou atualiza as faltas no boletim.
1659 * @return Avaliacao_Service_Boletim Provê interface fluída 2185 * @return Avaliacao_Service_Boletim Provê interface fluída
1660 - * @todo Criar teste para verificar se _getFaltaIdEtapa retorna o esperado  
1661 */ 2186 */
1662 public function saveFaltas() 2187 public function saveFaltas()
1663 { 2188 {
@@ -1674,6 +2199,24 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1674,6 +2199,24 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1674 } 2199 }
1675 2200
1676 /** 2201 /**
  2202 + * Insere ou atualiza os pareceres no boletim.
  2203 + * @return Avaliacao_Service_Boletim Provê interface fluída
  2204 + */
  2205 + public function savePareceres()
  2206 + {
  2207 + $parecerAluno = $this->_getParecerDescritivoAluno();
  2208 + $pareceres = $this->getPareceres();
  2209 +
  2210 + foreach ($pareceres as $parecer) {
  2211 + $parecer->parecerDescritivoAluno = $parecerAluno->id;
  2212 + $parecer->id = $this->_getParecerIdEtapa($parecer);
  2213 + $this->getParecerDescritivoAbstractDataMapper()->save($parecer);
  2214 + }
  2215 +
  2216 + return $this;
  2217 + }
  2218 +
  2219 + /**
1677 * Promove o aluno de etapa escolar caso esteja aprovado de acordo com o 2220 * Promove o aluno de etapa escolar caso esteja aprovado de acordo com o
1678 * necessário estabelecido por tipoProgressao de 2221 * necessário estabelecido por tipoProgressao de
1679 * RegraAvaliacao_Model_Regra. 2222 * RegraAvaliacao_Model_Regra.
@@ -1729,6 +2272,59 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -1729,6 +2272,59 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable
1729 } 2272 }
1730 2273
1731 /** 2274 /**
  2275 + * Atualiza a média dos componentes curriculares.
  2276 + */
  2277 + protected function _updateNotaComponenteMedia()
  2278 + {
  2279 + require_once 'Avaliacao/Model/NotaComponenteMedia.php';
  2280 + $this->_loadNotaComponenteCurricular(FALSE);
  2281 +
  2282 + foreach ($this->_notasComponentes as $id => $notasComponentes) {
  2283 + // Cria um array onde o índice é a etapa
  2284 + $etapasNotas = CoreExt_Entity::entityFilterAttr($notasComponentes, 'etapa', 'nota');
  2285 + $notas = array('Se' => 0, 'Et' => $this->getOption('etapas'));
  2286 +
  2287 + // Cria o array formatado para o cálculo da fórmula da média
  2288 + foreach ($etapasNotas as $etapa => $nota) {
  2289 + if (is_numeric($etapa)) {
  2290 + $notas['E' . $etapa] = $nota;
  2291 + $notas['Se'] += $nota;
  2292 + continue;
  2293 + }
  2294 + $notas[$etapa] = $nota;
  2295 + }
  2296 +
  2297 + // Calcula a média
  2298 + $media = $this->_calculaMedia($notas);
  2299 +
  2300 + // Cria uma nova instância de média, já com a nota arredondada e a etapa
  2301 + $notaComponenteCurricularMedia = new Avaliacao_Model_NotaComponenteMedia(array(
  2302 + 'notaAluno' => $this->_getNotaAluno()->id,
  2303 + 'componenteCurricular' => $id,
  2304 + 'media' => $media,
  2305 + 'mediaArredondada' => $this->arredondaNota($media),
  2306 + 'etapa' => $etapa
  2307 + ));
  2308 +
  2309 + try {
  2310 + // Se existir, marca como "old" para possibilitar a atualização
  2311 + $this->getNotaComponenteMediaDataMapper()->find(array(
  2312 + $notaComponenteCurricularMedia->get('notaAluno'),
  2313 + $notaComponenteCurricularMedia->get('componenteCurricular'),
  2314 + ));
  2315 +
  2316 + $notaComponenteCurricularMedia->markOld();
  2317 + }
  2318 + catch (Exception $e) {
  2319 + // Prossegue, sem problemas.
  2320 + }
  2321 +
  2322 + // Salva a média
  2323 + $this->getNotaComponenteMediaDataMapper()->save($notaComponenteCurricularMedia);
  2324 + }
  2325 + }
  2326 +
  2327 + /**
1732 * Atualiza os dados da matrícula do aluno. 2328 * Atualiza os dados da matrícula do aluno.
1733 * 2329 *
1734 * @param int $matricula 2330 * @param int $matricula
ieducar/modules/Avaliacao/Views/BoletimController.php
@@ -81,7 +81,7 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -81,7 +81,7 @@ class BoletimController extends Core_Controller_Page_ViewController
81 81
82 $this->_service = new Avaliacao_Service_Boletim(array( 82 $this->_service = new Avaliacao_Service_Boletim(array(
83 'matricula' => $this->getRequest()->matricula, 83 'matricula' => $this->getRequest()->matricula,
84 - 'usuario' => $usuario 84 + 'usuario' => $usuario
85 )); 85 ));
86 86
87 $this->_situacao = $this->_service->getSituacaoAluno(); 87 $this->_situacao = $this->_service->getSituacaoAluno();
@@ -106,6 +106,30 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -106,6 +106,30 @@ class BoletimController extends Core_Controller_Page_ViewController
106 } 106 }
107 107
108 /** 108 /**
  109 + * Verifica um array de situações de componentes curriculares e retorna TRUE
  110 + * quando ao menos um dos componentes estiver encerrado (aprovado ou reprovado).
  111 + *
  112 + * @param array $componentes
  113 + * @return bool
  114 + */
  115 + protected function _componenteEncerrado(array $componentes)
  116 + {
  117 + foreach ($componentes as $situacao) {
  118 + switch ($situacao->situacao) {
  119 + case App_Model_MatriculaSituacao::APROVADO:
  120 + case App_Model_MatriculaSituacao::APROVADO_APOS_EXAME:
  121 + case App_Model_MatriculaSituacao::REPROVADO:
  122 + return TRUE;
  123 + break;
  124 + default:
  125 + break;
  126 + }
  127 + }
  128 +
  129 + return FALSE;
  130 + }
  131 +
  132 + /**
109 * @see clsCadastro#Gerar() 133 * @see clsCadastro#Gerar()
110 */ 134 */
111 public function Gerar() 135 public function Gerar()
@@ -148,13 +172,13 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -148,13 +172,13 @@ class BoletimController extends Core_Controller_Page_ViewController
148 $this->addDetalhe(array('Aluno', $nome)); 172 $this->addDetalhe(array('Aluno', $nome));
149 $this->addDetalhe(array('Escola', $escola)); 173 $this->addDetalhe(array('Escola', $escola));
150 $this->addDetalhe(array('Curso', $curso)); 174 $this->addDetalhe(array('Curso', $curso));
151 - $this->addDetalhe(array('Série', $serie));  
152 - $this->addDetalhe(array('Turma', $turma)); 175 + $this->addDetalhe(array('Série/Turma', $serie . ' / ' . $turma));
153 $this->addDetalhe(array('Situação', $situacao)); 176 $this->addDetalhe(array('Situação', $situacao));
154 177
155 // Dados da regra de avaliação 178 // Dados da regra de avaliação
156 $this->addDetalhe(array('Regra avaliação', $this->_service->getRegra())); 179 $this->addDetalhe(array('Regra avaliação', $this->_service->getRegra()));
157 $this->addDetalhe(array('Apuração de falta', $this->_service->getRegra()->tipoPresenca)); 180 $this->addDetalhe(array('Apuração de falta', $this->_service->getRegra()->tipoPresenca));
  181 + $this->addDetalhe(array('Parecer descritivo', $this->_service->getRegra()->parecerDescritivo));
158 $this->addDetalhe(array('Progressão', $this->_service->getRegra()->tipoProgressao)); 182 $this->addDetalhe(array('Progressão', $this->_service->getRegra()->tipoProgressao));
159 $this->addDetalhe(array('Média', $this->_service->getRegra()->media)); 183 $this->addDetalhe(array('Média', $this->_service->getRegra()->media));
160 184
@@ -199,11 +223,32 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -199,11 +223,32 @@ class BoletimController extends Core_Controller_Page_ViewController
199 $labels[] = $data; 223 $labels[] = $data;
200 } 224 }
201 225
202 - $colspan = $porComponente && $sit->recuperacao ? 4 : 3; 226 + // Flag para auxiliar na composição da tabela em casos onde o parecer
  227 + // descritivo é lançado anualmente e por componente
  228 + $parecerComponenteAnual = FALSE;
  229 + $colspan = 0;
  230 +
  231 + if ($this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE) {
  232 + if (TRUE == $this->_componenteEncerrado($sit->nota->componentesCurriculares)) {
  233 + $parecerComponenteAnual = TRUE;
  234 + $colspan++;
  235 + }
  236 + }
  237 +
  238 + // Colspan para tabela com labels e sublabels
  239 + $colspan += $porComponente && $sit->recuperacao ? 4 : 3;
203 $labels[] = array('data' => $porComponente ? '' : 'Média final', 'attributes' => $attributes, 'colspan' => $porComponente ? $colspan : 1); 240 $labels[] = array('data' => $porComponente ? '' : 'Média final', 'attributes' => $attributes, 'colspan' => $porComponente ? $colspan : 1);
204 241
205 // Inclui coluna para % de presença geral 242 // Inclui coluna para % de presença geral
206 if (!$porComponente) { 243 if (!$porComponente) {
  244 + if ($sit->recuperacao) {
  245 + $labels[] = array('data' => 'Exame', 'attributes' => $attributes);
  246 + }
  247 +
  248 + if ($parecerComponenteAnual) {
  249 + $labels[] = array('data' => 'Parecer', 'attributes' => $attributes);
  250 + }
  251 +
207 $labels[] = array('data' => 'Presença', 'attributes' => $attributes); 252 $labels[] = array('data' => 'Presença', 'attributes' => $attributes);
208 $labels[] = array('data' => 'Situação', 'attributes' => $attributes); 253 $labels[] = array('data' => 'Situação', 'attributes' => $attributes);
209 } 254 }
@@ -226,6 +271,10 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -226,6 +271,10 @@ class BoletimController extends Core_Controller_Page_ViewController
226 } 271 }
227 272
228 if ($porComponente) { 273 if ($porComponente) {
  274 + if ($parecerComponenteAnual) {
  275 + $subLabels[] = array('data' => 'Parecer', 'attributes' => $attributes);
  276 + }
  277 +
229 $subLabels[] = array('data' => 'Presença', 'attributes' => $attributes); 278 $subLabels[] = array('data' => 'Presença', 'attributes' => $attributes);
230 $subLabels[] = array('data' => 'Situação', 'attributes' => $attributes); 279 $subLabels[] = array('data' => 'Situação', 'attributes' => $attributes);
231 } 280 }
@@ -268,6 +317,13 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -268,6 +317,13 @@ class BoletimController extends Core_Controller_Page_ViewController
268 $medias = $mediasComponentes[$id]; 317 $medias = $mediasComponentes[$id];
269 $faltas = $faltasComponentes[$id]; 318 $faltas = $faltasComponentes[$id];
270 $faltaStats = $faltasStats->componentesCurriculares[$id]; 319 $faltaStats = $faltasStats->componentesCurriculares[$id];
  320 + $parecer = NULL;
  321 +
  322 + // Caso os pareceres sejam por componente e anuais, recupera a instância
  323 + if ($parecerComponenteAnual) {
  324 + $parecer = $this->_service->getPareceresComponentes();
  325 + $parecer = $parecer[$id];
  326 + }
271 327
272 if ($porComponente == TRUE) { 328 if ($porComponente == TRUE) {
273 $new = $url->l('Lançar nota', 'nota', 329 $new = $url->l('Lançar nota', 'nota',
@@ -324,6 +380,7 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -324,6 +380,7 @@ class BoletimController extends Core_Controller_Page_ViewController
324 } 380 }
325 } 381 }
326 382
  383 + // Média no componente curricular
327 $media = $medias[0]->mediaArredondada . ($medias[0]->etapa == 'Rc' ? ' (Rc)' : ''); 384 $media = $medias[0]->mediaArredondada . ($medias[0]->etapa == 'Rc' ? ' (Rc)' : '');
328 $data[] = array('data' => $media, 'attributes' => $attributes); 385 $data[] = array('data' => $media, 'attributes' => $attributes);
329 386
@@ -349,6 +406,36 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -349,6 +406,36 @@ class BoletimController extends Core_Controller_Page_ViewController
349 } 406 }
350 } 407 }
351 408
  409 + // Adiciona uma coluna extra caso o parecer seja por componente ao final do ano
  410 + if ($parecerComponenteAnual) {
  411 + $link = array(
  412 + 'text' => '',
  413 + 'path' => 'parecer',
  414 + 'query' => array('matricula' => $this->getRequest()->matricula)
  415 + );
  416 +
  417 + if (0 == count($parecer)) {
  418 + $text = 'Lançar';
  419 + }
  420 + else {
  421 + $text = 'Editar';
  422 + }
  423 +
  424 + $link['query']['componenteCurricular'] = $id;
  425 +
  426 + // @todo Constante ou CoreExt_Enum
  427 + $link['query']['etapa'] = 'An';
  428 +
  429 + $link = $url->l($text, $link['path'], array('query' => $link['query']));
  430 +
  431 + if (isset($mediaSituacao->situacao) && $mediaSituacao->situacao != App_Model_MatriculaSituacao::EM_ANDAMENTO) {
  432 + $data[] = array('data' => $link, 'attributes' => $attributes);
  433 + }
  434 + else {
  435 + $data[] = array('data' => '', 'attributes' => $attributes);
  436 + }
  437 + }
  438 +
352 // Informações extras como porcentagem de presença e situação do aluno 439 // Informações extras como porcentagem de presença e situação do aluno
353 if ($porComponente) { 440 if ($porComponente) {
354 $data[] = array('data' => sprintf('%.2f%%', $faltaStats->porcentagemPresenca), 'attributes' => $attributes); 441 $data[] = array('data' => sprintf('%.2f%%', $faltaStats->porcentagemPresenca), 'attributes' => $attributes);
@@ -406,21 +493,85 @@ class BoletimController extends Core_Controller_Page_ViewController @@ -406,21 +493,85 @@ class BoletimController extends Core_Controller_Page_ViewController
406 $data[] = array('data' => '', 'attributes' => $attributes); 493 $data[] = array('data' => '', 'attributes' => $attributes);
407 } 494 }
408 495
  496 + if ($parecerComponenteAnual) {
  497 + $data[] = array('data' => '', 'attributes' => $attributes);
  498 + }
  499 +
409 $data[] = array('data' => sprintf('%.2f%%', $faltasStats->porcentagemPresenca), 'attributes' => $attributes); 500 $data[] = array('data' => sprintf('%.2f%%', $faltasStats->porcentagemPresenca), 'attributes' => $attributes);
410 $data[] = array('data' => $situacao->getValue($sit->falta->situacao), 'attributes' => $attributes); 501 $data[] = array('data' => $situacao->getValue($sit->falta->situacao), 'attributes' => $attributes);
411 502
412 $table->addFooterRow($data, $zebra[$class ^ 1]); 503 $table->addFooterRow($data, $zebra[$class ^ 1]);
413 504
  505 + // Adiciona linha com links para lançamento de parecer descritivo geral por etapa
  506 + if ($this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL) {
  507 + $newLink = array(
  508 + 'text' => 'Lançar parecer',
  509 + 'path' => 'parecer',
  510 + 'query' => array('matricula' => $matricula['cod_matricula'])
  511 + );
  512 +
  513 + $data = array(0 => array('data' => 'Pareceres', 'attributes' => array('style' => 'padding: 5px; text-align: left')));
  514 + $pareceres = $this->_service->getPareceresGerais();
  515 +
  516 + for ($i = 1, $loop = count($etapas); $i <= $loop; $i++) {
  517 + if (isset($pareceres[$i])) {
  518 + $link = $newLink;
  519 + $link['text'] = 'Editar parecer';
  520 + $link['query']['etapa'] = $i;
  521 + $data[] = array('data' => $url->l($link['text'], $link['path'], array('query' => $link['query'])), 'attributes' => $attributes);
  522 + }
  523 + else {
  524 + if ('' == $newLink) {
  525 + $link = '';
  526 + }
  527 + else {
  528 + $link = $url->l($newLink['text'], $newLink['path'], array('query' => $newLink['query']));
  529 + }
  530 + $data[] = array('data' => $link, 'attributes' => $attributes);
  531 + $newLink = '';
  532 + }
  533 + }
  534 +
  535 + if ($sit->recuperacao) {
  536 + $data[] = array('data' => '', 'attributes' => $attributes);
  537 + }
  538 +
  539 + $data[] = array('data' => '', 'attributes' => $attributes);
  540 + $data[] = array('data' => '', 'attributes' => $attributes);
  541 +
  542 + $table->addFooterRow($data);
  543 + }
  544 +
414 // Adiciona tabela na página 545 // Adiciona tabela na página
415 $this->addDetalhe(array('Disciplinas', '<div id="disciplinas">' . $table . '</div>')); 546 $this->addDetalhe(array('Disciplinas', '<div id="disciplinas">' . $table . '</div>'));
416 547
  548 + // Adiciona link para lançamento de parecer descritivo anual geral
  549 + if (
  550 + FALSE == $sit->andamento &&
  551 + $this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL
  552 + ) {
  553 + if (0 == count($this->_service->getPareceresGerais())) {
  554 + $label = 'Lançar';
  555 + }
  556 + else {
  557 + $label = 'Editar';
  558 + }
  559 +
  560 + $link = array(
  561 + 'text' => $label . ' parecer descritivo do aluno',
  562 + 'path' => 'parecer',
  563 + 'query' => array('matricula' => $this->getRequest()->matricula)
  564 + );
  565 + $this->addDetalhe(array('Parecer descritivo anual', $url->l($link['text'], $link['path'], array('query' => $link['query']))));
  566 + }
  567 +
417 // Caso o tipo de progressão seja manual, a situação das notas/faltas não 568 // Caso o tipo de progressão seja manual, a situação das notas/faltas não
418 // esteja mais em "andamento" e a matrícula esteja em andamento, exibe 569 // esteja mais em "andamento" e a matrícula esteja em andamento, exibe
419 // botões de ação 570 // botões de ação
420 if ( 571 if (
421 $this->_service->getRegra()->get('tipoProgressao') == 572 $this->_service->getRegra()->get('tipoProgressao') ==
422 RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL && 573 RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL &&
423 - FALSE == $sit->andamento && $matricula['aprovado'] == 3 574 + FALSE == $sit->andamento && $matricula['aprovado'] == App_Model_MatriculaSituacao::EM_ANDAMENTO
424 ) { 575 ) {
425 $link = array( 576 $link = array(
426 'text' => 'sim', 577 'text' => 'sim',
ieducar/modules/Avaliacao/Views/NotaController.php
@@ -91,6 +91,11 @@ class NotaController extends Core_Controller_Page_EditController @@ -91,6 +91,11 @@ class NotaController extends Core_Controller_Page_EditController
91 protected $_falta = NULL; 91 protected $_falta = NULL;
92 92
93 /** 93 /**
  94 + * @var Avaliacao_Model_ParecerDescritivoAbstract
  95 + */
  96 + protected $_parecer = NULL;
  97 +
  98 + /**
94 * @see Core_Controller_Page_EditController#_preConstruct() 99 * @see Core_Controller_Page_EditController#_preConstruct()
95 */ 100 */
96 protected function _preConstruct() 101 protected function _preConstruct()
@@ -107,7 +112,7 @@ class NotaController extends Core_Controller_Page_EditController @@ -107,7 +112,7 @@ class NotaController extends Core_Controller_Page_EditController
107 112
108 $this->_service = new Avaliacao_Service_Boletim(array( 113 $this->_service = new Avaliacao_Service_Boletim(array(
109 'matricula' => $this->getRequest()->matricula, 114 'matricula' => $this->getRequest()->matricula,
110 - 'usuario' => $usuario 115 + 'usuario' => $usuario
111 )); 116 ));
112 117
113 $this->_regra = $this->_service->getRegra(); 118 $this->_regra = $this->_service->getRegra();
@@ -134,8 +139,9 @@ class NotaController extends Core_Controller_Page_EditController @@ -134,8 +139,9 @@ class NotaController extends Core_Controller_Page_EditController
134 */ 139 */
135 protected function _initEditar() 140 protected function _initEditar()
136 { 141 {
137 - $this->_nota = $this->_service->getNotaComponente($this->_componenteCurricular, $this->_etapa);  
138 - $this->_falta = $this->_service->getFalta($this->_componenteCurricular, $this->_etapa); 142 + $this->_nota = $this->_service->getNotaComponente($this->_componenteCurricular, $this->_etapa);
  143 + $this->_falta = $this->_service->getFalta($this->_etapa, $this->_componenteCurricular);
  144 + $this->_parecer = $this->_service->getParecerDescritivo($this->_etapa, $this->_componenteCurricular);
139 return TRUE; 145 return TRUE;
140 } 146 }
141 147
@@ -177,6 +183,11 @@ class NotaController extends Core_Controller_Page_EditController @@ -177,6 +183,11 @@ class NotaController extends Core_Controller_Page_EditController
177 if ($this->_regra->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { 183 if ($this->_regra->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) {
178 $this->campoLista('falta', 'Falta', range(0, 100, 1), $this->_falta->quantidade); 184 $this->campoLista('falta', 'Falta', range(0, 100, 1), $this->_falta->quantidade);
179 } 185 }
  186 +
  187 + // Caso o parecer seja por etapa e por componente
  188 + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) {
  189 + $this->campoMemo('parecer', 'Parecer', $this->_parecer, 40, 10, TRUE);
  190 + }
180 } 191 }
181 192
182 /** 193 /**
@@ -202,6 +213,15 @@ class NotaController extends Core_Controller_Page_EditController @@ -202,6 +213,15 @@ class NotaController extends Core_Controller_Page_EditController
202 $this->_service->addFalta($falta); 213 $this->_service->addFalta($falta);
203 } 214 }
204 215
  216 + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) {
  217 + $parecer = new Avaliacao_Model_ParecerDescritivoComponente(array(
  218 + 'componenteCurricular' => $this->getRequest()->componenteCurricular,
  219 + 'parecer' => $this->getRequest()->parecer,
  220 + 'etapa' => $this->getRequest()->etapa
  221 + ));
  222 + $this->_service->addParecer($parecer);
  223 + }
  224 +
205 try { 225 try {
206 $this->_service->save(); 226 $this->_service->save();
207 } 227 }
ieducar/modules/Avaliacao/Views/ParecerController.php 0 → 100644
@@ -0,0 +1,205 @@ @@ -0,0 +1,205 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage Modules
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Core/Controller/Page/EditController.php';
  33 +require_once 'Avaliacao/Model/ParecerDescritivoComponenteDataMapper.php';
  34 +require_once 'Avaliacao/Model/ParecerDescritivoGeralDataMapper.php';
  35 +require_once 'Avaliacao/Service/Boletim.php';
  36 +
  37 +/**
  38 + * ParecerController class.
  39 + *
  40 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  41 + * @category i-Educar
  42 + * @license @@license@@
  43 + * @package Avaliacao
  44 + * @subpackage Modules
  45 + * @since Classe disponível desde a versão 1.1.0
  46 + * @version @@package_version@@
  47 + */
  48 +class ParecerController extends Core_Controller_Page_EditController
  49 +{
  50 + protected $_dataMapper = 'Avaliacao_Model_ParecerDescritivoGeralDataMapper';
  51 + protected $_titulo = 'Avaliação do aluno | Parecer Descritivo';
  52 + protected $_processoAp = 642;
  53 + protected $_nivelAcessoOption = App_Model_NivelAcesso::SOMENTE_ESCOLA;
  54 + protected $_saveOption = TRUE;
  55 + protected $_deleteOption = FALSE;
  56 +
  57 + /**
  58 + * @var Avaliacao_Service_Boletim
  59 + */
  60 + protected $_service = NULL;
  61 +
  62 + /**
  63 + * @var RegraAvaliacao_Model_Regra
  64 + */
  65 + protected $_regra = NULL;
  66 +
  67 + /**
  68 + * @var int
  69 + */
  70 + protected $_matricula = NULL;
  71 +
  72 + /**
  73 + * @var int
  74 + */
  75 + protected $_componenteCurricular = NULL;
  76 +
  77 + /**
  78 + * @var string
  79 + */
  80 + protected $_etapa = NULL;
  81 +
  82 + /**
  83 + * @var Avaliacao_Model_ParecerDescritivoAbstract
  84 + */
  85 + protected $_parecer = NULL;
  86 +
  87 + /**
  88 + * @see Core_Controller_Page_EditController#_preConstruct()
  89 + */
  90 + protected function _preConstruct()
  91 + {
  92 + // Id do usuário na session
  93 + $usuario = $this->getSession()->id_pessoa;
  94 +
  95 + $this->_options = array(
  96 + 'new_success' => 'boletim',
  97 + 'new_success_params' => array('matricula' => $this->getRequest()->matricula),
  98 + 'edit_success' => 'boletim',
  99 + 'edit_success_params' => array('matricula' => $this->getRequest()->matricula),
  100 + );
  101 +
  102 + $this->_service = new Avaliacao_Service_Boletim(array(
  103 + 'matricula' => $this->getRequest()->matricula,
  104 + 'usuario' => $usuario
  105 + ));
  106 +
  107 + $this->_regra = $this->_service->getRegra();
  108 + }
  109 +
  110 + /**
  111 + * @see Core_Controller_Page_EditController#_initNovo()
  112 + */
  113 + protected function _initNovo()
  114 + {
  115 + $this->_etapa = $this->getRequest()->etapa;
  116 + $this->_matricula = $this->getRequest()->matricula;
  117 + $this->_componenteCurricular = $this->getRequest()->componenteCurricular;
  118 +
  119 + if (isset($this->_etapa) && isset($this->_matricula)) {
  120 + return FALSE;
  121 + }
  122 +
  123 + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE &&
  124 + !isset($this->_componenteCurricular)) {
  125 + return FALSE;
  126 + }
  127 +
  128 + return TRUE;
  129 + }
  130 +
  131 + /**
  132 + * @see Core_Controller_Page_EditController#_initEditar()
  133 + */
  134 + protected function _initEditar()
  135 + {
  136 + $this->_parecer = $this->_service->getParecerDescritivo($this->_etapa, $this->_componenteCurricular);
  137 + return TRUE;
  138 + }
  139 +
  140 + /**
  141 + * @see clsCadastro#Gerar()
  142 + */
  143 + public function Gerar()
  144 + {
  145 + $this->campoOculto('matricula', $this->_matricula);
  146 + $this->campoOculto('etapa', $this->_etapa);
  147 + $this->campoOculto('componenteCurricular', $this->_componenteCurricular);
  148 +
  149 + $matricula = $this->_service->getOption('matriculaData');
  150 +
  151 + $this->campoRotulo('1nome', 'Nome', $matricula['nome']);
  152 + $this->campoRotulo('2curso', 'Curso', $matricula['curso_nome']);
  153 + $this->campoRotulo('3serie', 'Série', $matricula['serie_nome']);
  154 +
  155 + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL) {
  156 + $this->campoRotulo('4etapa', 'Etapa', $this->_etapa == 'Rc' ? 'Recuperação' : $this->_etapa);
  157 + }
  158 + else {
  159 + $this->campoRotulo('4etapa', 'Etapa', 'Anual');
  160 + }
  161 +
  162 + if ($this->_componenteCurricular) {
  163 + $componentes = $this->_service->getComponentes();
  164 + $this->campoRotulo('5componente_curricular', 'Componente curricular', $componentes[$this->_componenteCurricular]);
  165 + }
  166 +
  167 + $this->campoMemo('parecer', 'Parecer', $this->_parecer, 40, 10, TRUE);
  168 + }
  169 +
  170 + /**
  171 + * @see Core_Controller_Page_EditController#_save()
  172 + */
  173 + protected function _save()
  174 + {
  175 + // Instancia o objeto correto e passa para o service
  176 + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE) {
  177 + $parecer = new Avaliacao_Model_ParecerDescritivoComponente(array(
  178 + 'componenteCurricular' => $this->getRequest()->componenteCurricular,
  179 + 'parecer' => $this->getRequest()->parecer,
  180 + 'etapa' => $this->getRequest()->etapa
  181 + ));
  182 + }
  183 + else {
  184 + $parecer = new Avaliacao_Model_ParecerDescritivoGeral(array(
  185 + 'parecer' => $this->getRequest()->parecer,
  186 + 'etapa' => $this->getRequest()->etapa
  187 + ));
  188 + }
  189 +
  190 + $this->_service->addParecer($parecer);
  191 +
  192 + try {
  193 + $this->_service->save();
  194 + }
  195 + catch (CoreExt_Service_Exception $e) {
  196 + // Ok. Não pode promover por se tratar de progressão manual ou por estar em andamento
  197 + }
  198 + catch (Exception $e) {
  199 + $this->mensagem = 'Erro no preenchimento do formulário. ';
  200 + return FALSE;
  201 + }
  202 +
  203 + return TRUE;
  204 + }
  205 +}
0 \ No newline at end of file 206 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Boletim/Common.php
@@ -1,387 +0,0 @@ @@ -1,387 +0,0 @@
1 -<?php  
2 -  
3 -/**  
4 - * i-Educar - Sistema de gestão escolar  
5 - *  
6 - * Copyright (C) 2006 Prefeitura Municipal de Itajaí  
7 - * <ctima@itajai.sc.gov.br>  
8 - *  
9 - * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo  
10 - * sob os termos da Licença Pública Geral GNU conforme publicada pela Free  
11 - * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)  
12 - * qualquer versão posterior.  
13 - *  
14 - * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM  
15 - * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU  
16 - * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral  
17 - * do GNU para mais detalhes.  
18 - *  
19 - * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto  
20 - * com este programa; se não, escreva para a Free Software Foundation, Inc., no  
21 - * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.  
22 - *  
23 - * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>  
24 - * @category i-Educar  
25 - * @license @@license@@  
26 - * @package Avaliacao  
27 - * @subpackage UnitTests  
28 - * @since Arquivo disponível desde a versão 1.1.0  
29 - * @version $Id$  
30 - */  
31 -  
32 -// Dependências do próprio módulo  
33 -require_once 'Avaliacao/Service/Boletim.php';  
34 -require_once 'Avaliacao/Model/NotaAlunoDataMapper.php';  
35 -require_once 'Avaliacao/Model/NotaComponenteDataMapper.php';  
36 -require_once 'Avaliacao/Model/NotaComponenteMediaDataMapper.php';  
37 -require_once 'Avaliacao/Model/FaltaAlunoDataMapper.php';  
38 -require_once 'Avaliacao/Model/FaltaComponenteDataMapper.php';  
39 -  
40 -// Dependência de outros módulos  
41 -require_once 'AreaConhecimento/Model/AreaDataMapper.php';  
42 -require_once 'ComponenteCurricular/Model/ComponenteDataMapper.php';  
43 -require_once 'ComponenteCurricular/Model/AnoEscolarDataMapper.php';  
44 -require_once 'FormulaMedia/Model/FormulaDataMapper.php';  
45 -require_once 'TabelaArredondamento/Model/TabelaDataMapper.php';  
46 -require_once 'TabelaArredondamento/Model/TabelaValorDataMapper.php';  
47 -require_once 'RegraAvaliacao/Model/RegraDataMapper.php';  
48 -  
49 -// Dependência de classes do namespace Ied_Pmieducar  
50 -require_once 'include/pmieducar/clsPmieducarSerie.inc.php';  
51 -require_once 'include/pmieducar/clsPmieducarMatricula.inc.php';  
52 -  
53 -/**  
54 - * BoletimTest class.  
55 - *  
56 - * Testa a API do service Avaliacao_Service_Boletim. Cria uma interface para  
57 - * a configuração de uma instância de RegraAvaliacao_Model_Regra, com o qual  
58 - * o service é bastante dependente.  
59 - *  
60 - * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>  
61 - * @category i-Educar  
62 - * @license @@license@@  
63 - * @package Avaliacao  
64 - * @subpackage UnitTests  
65 - * @since Classe disponível desde a versão 1.1.0  
66 - * @todo Todos os getters de DataMapper precisam de um teste para  
67 - * verificar se de fato retornam uma instância padrão  
68 - * @version @@package_version@@  
69 - */  
70 -abstract class Boletim_Common extends UnitBaseTest  
71 -{  
72 - /**  
73 - * @var Avaliacao_Service_Boletim  
74 - */  
75 - protected $_service = NULL;  
76 -  
77 - /**  
78 - * @var Avaliacao_Model_NotaAluno  
79 - */  
80 - protected $_notaAlunoExpected = NULL;  
81 -  
82 - /**  
83 - * @var Avaliacao_Model_FaltaAluno  
84 - */  
85 - protected $_faltaAlunoExpected = NULL;  
86 -  
87 - /**  
88 - * @var ComponenteCurricular_Model_ComponenteDataMapper  
89 - */  
90 - protected $_componenteDataMapperMock = NULL;  
91 -  
92 - /**  
93 - * Configura todos os mocks de depenência de Avaliacao_Service_Boletim  
94 - */  
95 - protected function setUp()  
96 - {  
97 - $this->_setUpLegacyMock();  
98 -  
99 - // Instancia a classe Service  
100 - $this->_service = new Avaliacao_Service_Boletim(array(  
101 - 'matricula' => 1,  
102 - 'usuario' => 1,  
103 - 'RegraDataMapper' => $this->_setUpRegraAvaliacao(),  
104 - 'ComponenteDataMapper' => $this->_componenteDataMapperMock,  
105 - 'NotaAlunoDataMapper' => $this->_setUpNotaAlunoDataMapper(),  
106 - 'NotaComponenteDataMapper' => $this->_setUpNotaComponenteDataMapper(),  
107 - 'NotaComponenteMediaDataMapper' => $this->_setUpNotaComponenteMediaDataMapper(),  
108 - 'FaltaAlunoDataMapper' => $this->_setUpFaltaAlunoDataMapperMock(),  
109 - 'FaltaAbstractDataMapper' => $this->_setUpFaltaAbstractDataMapperMock(),  
110 - ));  
111 - }  
112 -  
113 - /**  
114 - * Configura um mock de RegraAvaliacao_Model_Regra.  
115 - * @return RegraAvaliacao_Model_Regra  
116 - */  
117 - protected abstract function _setUpRegraAvaliacao();  
118 -  
119 - /**  
120 - * Configura um mock de Avaliacao_Model_NotaAlunoDataMapper.  
121 - *  
122 - * @return Avaliacao_Model_NotaAlunoDataMapper  
123 - */  
124 - protected abstract function _setUpNotaAlunoDataMapper();  
125 -  
126 - /**  
127 - * Configura uma instância de Avaliacao_Model_NotaAluno e guarda no atributo  
128 - * $_notaAlunoExpected.  
129 - */  
130 - protected abstract function _setUpNotaAluno();  
131 -  
132 - /**  
133 - * Configura um mock de Avaliacao_Model_NotaComponenteDataMapper.  
134 - * @return Avaliacao_Model_NotaComponenteDataMapper  
135 - */  
136 - protected abstract function _setUpNotaComponenteDataMapper();  
137 -  
138 - /**  
139 - * Configura um mock de Avaliacao_Model_NotaMediaComponenteDataMapper.  
140 - * @return Avaliacao_Model_NotaComponenteMediaDataMapper  
141 - */  
142 - protected abstract function _setUpNotaComponenteMediaDataMapper();  
143 -  
144 - /**  
145 - * Configura um mock de Avaliacao_Model_FaltaAlunoDataMapper e guarda uma  
146 - * instância (a que for salva pelo mock) no atributo $_faltaAlunoExpected.  
147 - *  
148 - * @return Avaliacao_Model_FaltaAlunoDataMapper  
149 - */  
150 - protected abstract function _setUpFaltaAlunoDataMapperMock();  
151 -  
152 - protected abstract function _setUpFaltaAluno();  
153 -  
154 - /**  
155 - * Configura um mock de Avaliacao_Model_FataAbstractDataMapper (Componente  
156 - * ou Geral).  
157 - *  
158 - * @return unknown_type  
159 - */  
160 - protected abstract function _setUpFaltaAbstractDataMapperMock();  
161 -  
162 - /**  
163 - * Configura mocks para as classes legadas (Ied_*).  
164 - */  
165 - protected function _setUpLegacyMock()  
166 - {  
167 - $this->_configuraDadosMatricula()  
168 - ->_configuraDadosDisciplina()  
169 - ->_configuraDadosEtapasCursadas();  
170 - }  
171 -  
172 - protected function _configuraDadosMatricula()  
173 - {  
174 - // Retorna para matrícula  
175 - $returnMatricula = array(  
176 - 'cod_matricula' => 1,  
177 - 'ref_ref_cod_escola' => 1,  
178 - 'ref_ref_cod_serie' => 1,  
179 - 'ref_cod_curso' => 1,  
180 - 'aprovado' => 1,  
181 - 'curso_carga_horaria' => (800 * 9),  
182 - 'curso_hora_falta' => (50 /60),  
183 - 'serie_carga_horaria' => 800  
184 - );  
185 -  
186 - // Mock para clsPmieducarMatricula  
187 - $matriculaMock = $this->getCleanMock('clsPmieducarMatricula');  
188 - $matriculaMock->expects($this->any())  
189 - ->method('detalhe')  
190 - ->will($this->returnValue($returnMatricula));  
191 -  
192 - // Registra a instância no repositório de classes de CoreExt_Entity  
193 - CoreExt_Entity::addClassToStorage('clsPmieducarMatricula',  
194 - $matriculaMock, NULL, TRUE  
195 - );  
196 -  
197 - // Retorno para clsPmieducarSerie  
198 - $returnSerie = array(  
199 - 'cod_serie' => 1,  
200 - 'regra_avaliacao_id' => 1,  
201 - 'carga_horaria' => 800  
202 - );  
203 -  
204 - // Mock para clsPmieducarMatricula  
205 - $serieMock = $this->getCleanMock('clsPmieducarSerie');  
206 - $serieMock->expects($this->any())  
207 - ->method('detalhe')  
208 - ->will($this->returnValue($returnSerie));  
209 -  
210 - // Registra a instância no repositório de classes de CoreExt_Entity  
211 - CoreExt_Entity::addClassToStorage('clsPmieducarSerie',  
212 - $serieMock, NULL, TRUE  
213 - );  
214 -  
215 -  
216 - // Retorno para clsPmieducarCurso  
217 - $returnCurso = array(  
218 - 'cod_curso' => 1,  
219 - 'carga_horaria' => (800 * 9),  
220 - 'hora_falta' => (50 / 60),  
221 - 'padrao_ano_escolar' => 1  
222 - );  
223 -  
224 - // Mock para clsPmieducarCurso  
225 - $cursoMock = $this->getCleanMock('clsPmieducarCurso');  
226 - $cursoMock->expects($this->any())  
227 - ->method('detalhe')  
228 - ->will($this->returnValue($returnCurso));  
229 -  
230 - // Registra a instância no repositório de classes de CoreExt_Entity  
231 - CoreExt_Entity::addClassToStorage('clsPmieducarCurso',  
232 - $cursoMock, NULL, TRUE  
233 - );  
234 -  
235 - return $this;  
236 - }  
237 -  
238 - protected function _configuraDadosDisciplina()  
239 - {  
240 - $componentes = array(  
241 - new ComponenteCurricular_Model_Componente(  
242 - array('id' => 1, 'nome' => 'Matemática', 'cargaHoraria' => 100)  
243 - ),  
244 - new ComponenteCurricular_Model_Componente(  
245 - array('id' => 2, 'nome' => 'Português', 'cargaHoraria' => 100)  
246 - ),  
247 - new ComponenteCurricular_Model_Componente(  
248 - array('id' => 3, 'nome' => 'Ciências', 'cargaHoraria' => 60)  
249 - ),  
250 - new ComponenteCurricular_Model_Componente(  
251 - array('id' => 4, 'nome' => 'Física', 'cargaHoraria' => 60)  
252 - )  
253 - );  
254 -  
255 - $expected = array(  
256 - $componentes[0],  
257 - $componentes[2]  
258 - );  
259 -  
260 - // Retorna para clsPmieducarEscolaSerieDisciplina  
261 - $returnEscolaSerieDisciplina = array(  
262 - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 1, 'carga_horaria' => 100),  
263 - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 2, 'carga_horaria' => 100),  
264 - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 3, 'carga_horaria' => 70),  
265 - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 4, 'carga_horaria' => 100),  
266 - );  
267 -  
268 - // Mock para clsPmieducarEscolaSerieDisciplina  
269 - $escolaMock = $this->getCleanMock('clsPmieducarEscolaSerieDisciplina');  
270 - $escolaMock->expects($this->any())  
271 - ->method('lista')  
272 - ->will($this->returnValue($returnEscolaSerieDisciplina));  
273 -  
274 - // Retorna para clsPmieducarDispensaDisciplina  
275 - $returnDispensa = array(  
276 - array('ref_cod_matricula' => 1, 'ref_cod_disciplina' => 2),  
277 - array('ref_cod_matricula' => 1, 'ref_cod_disciplina' => 4),  
278 - );  
279 -  
280 - // Mock para clsPmieducarDispensaDisciplina  
281 - $dispensaMock = $this->getCleanMock('clsPmieducarDispensaDisciplina');  
282 - $dispensaMock->expects($this->any())  
283 - ->method('lista')  
284 - ->with(1, 1, 1)  
285 - ->will($this->returnValue($returnDispensa));  
286 -  
287 - // Mock para ComponenteCurricular_Model_ComponenteDataMapper  
288 - $mapperMock = $this->getCleanMock('ComponenteCurricular_Model_ComponenteDataMapper');  
289 - $mapperMock->expects($this->any())  
290 - ->method('findComponenteCurricularAnoEscolar')  
291 - ->will($this->onConsecutiveCalls($expected[0], $expected[1]));  
292 -  
293 - // Guarda na instância, usado em setUp()  
294 - $this->_componenteDataMapperMock = $mapperMock;  
295 -  
296 - // Registra mocks  
297 - CoreExt_Entity::addClassToStorage('clsPmieducarEscolaSerieDisciplina',  
298 - $escolaMock, NULL, TRUE);  
299 - CoreExt_Entity::addClassToStorage('clsPmieducarDispensaDisciplina',  
300 - $dispensaMock, NULL, TRUE);  
301 -  
302 - return $this;  
303 - }  
304 -  
305 - /**  
306 - * É dependente do mock de clsPmieducarCurso de _configuraDadosMatricula  
307 - * (padrao_ano_escolar).  
308 - */  
309 - protected function _configuraDadosEtapasCursadas()  
310 - {  
311 - $returnEscolaAno = array(  
312 - array('ref_cod_escola' => 1, 'ano' => 2009, 'andamento' => 1, 'ativo' => 1)  
313 - );  
314 -  
315 - $returnAnoLetivo = array(  
316 - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 1),  
317 - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 2),  
318 - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 3),  
319 - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 4)  
320 - );  
321 -  
322 - // Mock para escola ano letivo (ano letivo em andamento)  
323 - $escolaAnoMock = $this->getCleanMock('clsPmieducarEscolaAnoLetivo');  
324 - $escolaAnoMock->expects($this->any())  
325 - ->method('lista')  
326 - ->with(1, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1)  
327 - ->will($this->returnValue($returnEscolaAno));  
328 -  
329 - // Mock para o ano letivo (módulos do ano)  
330 - $anoLetivoMock = $this->getCleanMock('clsPmieducarAnoLetivoModulo');  
331 - $anoLetivoMock->expects($this->any())  
332 - ->method('lista')  
333 - ->with(2009, 1)  
334 - ->will($this->returnValue($returnAnoLetivo));  
335 -  
336 - // Adiciona mocks ao repositório estático  
337 - CoreExt_Entity::addClassToStorage('clsPmieducarEscolaAnoLetivo',  
338 - $escolaAnoMock, NULL, TRUE);  
339 - CoreExt_Entity::addClassToStorage('clsPmieducarAnoLetivoModulo',  
340 - $anoLetivoMock, NULL, TRUE);  
341 -  
342 - return $this;  
343 - }  
344 -  
345 - /**  
346 - * @todo Refatorar método para uma classe stub, no diretório do módulo  
347 - * TabelaArredondamento  
348 - * @todo Está copiado em tests/Unit/App/Model/IedFinderTest.php  
349 - */  
350 - protected function _getTabelaArredondamentoNumerica()  
351 - {  
352 - $data = array(  
353 - 'tabelaArredondamento' => 1,  
354 - 'nome' => NULL,  
355 - 'descricao' => NULL,  
356 - 'valorMinimo' => -1,  
357 - 'valorMaximo' => 0  
358 - );  
359 -  
360 - $tabelaValores = array();  
361 -  
362 - for ($i = 0; $i <= 10; $i++) {  
363 - $data['nome'] = $i;  
364 - $data['valorMinimo'] += 1;  
365 - $data['valorMaximo'] += 1;  
366 -  
367 - if ($i == 10) {  
368 - $data['valorMinimo'] = 9;  
369 - $data['valorMaximo'] = 10;  
370 - }  
371 -  
372 - $tabelaValores[$i] = new TabelaArredondamento_Model_TabelaValor($data);  
373 - }  
374 -  
375 - $mapperMock = $this->getCleanMock('TabelaArredondamento_Model_TabelaValorDataMapper');  
376 - $mapperMock->expects($this->any())  
377 - ->method('findAll')  
378 - ->will($this->returnValue($tabelaValores));  
379 -  
380 - $tabelaDataMapper = new TabelaArredondamento_Model_TabelaDataMapper();  
381 - $tabelaDataMapper->setTabelaValorDataMapper($mapperMock);  
382 -  
383 - $tabela = new TabelaArredondamento_Model_Tabela(array('nome' => 'Numéricas'));  
384 - $tabela->setDataMapper($tabelaDataMapper);  
385 - return $tabela;  
386 - }  
387 -}  
388 \ No newline at end of file 0 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php
@@ -1,1192 +0,0 @@ @@ -1,1192 +0,0 @@
1 -<?php  
2 -  
3 -/**  
4 - * i-Educar - Sistema de gestão escolar  
5 - *  
6 - * Copyright (C) 2006 Prefeitura Municipal de Itajaí  
7 - * <ctima@itajai.sc.gov.br>  
8 - *  
9 - * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo  
10 - * sob os termos da Licença Pública Geral GNU conforme publicada pela Free  
11 - * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)  
12 - * qualquer versão posterior.  
13 - *  
14 - * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM  
15 - * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU  
16 - * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral  
17 - * do GNU para mais detalhes.  
18 - *  
19 - * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto  
20 - * com este programa; se não, escreva para a Free Software Foundation, Inc., no  
21 - * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.  
22 - *  
23 - * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>  
24 - * @category i-Educar  
25 - * @license @@license@@  
26 - * @package Avaliacao  
27 - * @subpackage UnitTests  
28 - * @since Arquivo disponível desde a versão 1.1.0  
29 - * @version $Id$  
30 - */  
31 -  
32 -require_once 'Avaliacao/_tests/Boletim/Common.php';  
33 -  
34 -/**  
35 - * NotaNumerica_FaltaComponente class.  
36 - *  
37 - * Configura mocks para todas as dependências de Avaliacao_Service_Boletim.  
38 - *  
39 - * A configuração é baseada nos mocks criados para para App_Model_IedFinder,  
40 - * onde é retornado os componentes curriculares 1 (matemática) e 3 (ciências),  
41 - * já que o aluno estaria dispensado dos outros dois componentes.  
42 - *  
43 - * - RegraAvaliacao_Model_Regra: nota numérica, progressiva, falta  
44 - * contabilizada por componente curricular, média 6, tabela de arredondamento,  
45 - * fórmula de média (aritmética simples)  
46 - *  
47 - * - FormulaMedia_Model_Formula: aritmética simples (Se / Et)  
48 - *  
49 - * - ComponenteCurricular_Model_ComponenteDataMapper: retorna componentes  
50 - * em que o aluno estaria cursando, conforme retornado por  
51 - * App_Model_IedFinder::getComponentesPorMatricula  
52 - *  
53 - * - Avaliacao_Model_NotaAlunoDataMapper: retorna uma instância de  
54 - * Avaliacao_Model_NotaAluno, para testar inicialização do service  
55 - *  
56 - * - Avaliacao_Model_NotaComponenteDataMapper: retorna uma instância de  
57 - * Avaliacao_Model_NotaComponente, para testar inicialização do service  
58 - *  
59 - * - Avaliacao_Model_FaltaAlunoDataMapper: retorna uma instância de  
60 - * Avaliacao_Model_FaltaAluno, para testar inicialização do service  
61 - *  
62 - * - Avaliacao_Model_FaltaAbstractDataMapper: retorna uma instância de  
63 - * Avaliacao_Model_FaltaComponente, para testa inicialização do service  
64 - * e casos para o qual a regra de avaliação registre faltas por componentes  
65 - * curriculares  
66 - *  
67 - * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>  
68 - * @category i-Educar  
69 - * @license @@license@@  
70 - * @package Avaliacao  
71 - * @subpackage UnitTests  
72 - * @since Classe disponível desde a versão 1.1.0  
73 - * @version @@package_version@@  
74 - */  
75 -class Boletim_NotaNumerica_FaltaComponenteTest extends Boletim_Common  
76 -{  
77 - /**  
78 - * @see Boletim_Common#_setUpRegraAvaliacao()  
79 - */  
80 - protected function _setUpRegraAvaliacao()  
81 - {  
82 - $formulaMedia = new FormulaMedia_Model_Formula(array(  
83 - 'id' => 1,  
84 - 'nome' => 'Média aritmética',  
85 - 'formulaMedia' => 'Se / Et'  
86 - ));  
87 -  
88 - $formulaRecuperacao = new FormulaMedia_Model_Formula(array(  
89 - 'id' => 2,  
90 - 'nome' => 'Média Ponderada',  
91 - 'formulaMedia' => 'Rc * 0.4 + Se / Et * 0.6'  
92 - ));  
93 -  
94 - // Retorno para mock RegraAvaliacao  
95 - $expected = new RegraAvaliacao_Model_Regra(array(  
96 - 'id' => 1,  
97 - 'nome' => 'Regra geral',  
98 - 'tipoNota' => RegraAvaliacao_Model_Nota_TipoValor::NUMERICA,  
99 - 'tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::CONTINUADA,  
100 - 'tipoPresenca' => RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE,  
101 - 'media' => 6,  
102 - 'tabelaArredondamento' => $this->_getTabelaArredondamentoNumerica(),  
103 - 'formulaMedia' => $formulaMedia,  
104 - 'formulaRecuperacao' => $formulaRecuperacao,  
105 - 'porcentagemPresenca' => 75  
106 - ));  
107 -  
108 - $regraMock = $this->getCleanMock('RegraAvaliacao_Model_RegraDataMapper');  
109 - $regraMock->expects($this->once())  
110 - ->method('find')  
111 - ->with(1)  
112 - ->will($this->returnValue($expected));  
113 -  
114 - return $regraMock;  
115 - }  
116 -  
117 - /**  
118 - * @see Boletim_Common#_setUpNotaAlunoDataMapper()  
119 - */  
120 - protected function _setUpNotaAlunoDataMapper()  
121 - {  
122 - $notaAluno = $this->_setUpNotaAluno();  
123 -  
124 - // Configura expectativas do mock de NotaAluno, que irá retornar vazio  
125 - // (aluno ainda não possui notas lançadas)  
126 - $notaAlunoMock = $this->getCleanMock('Avaliacao_Model_NotaAlunoDataMapper');  
127 - $notaAlunoMock->expects($this->any())  
128 - ->method('findAll')  
129 - ->with(array(), array('matricula' => 1))  
130 - ->will($this->onConsecutiveCalls(array(), array($notaAluno)));  
131 -  
132 - $notaAlunoMock->expects($this->any())  
133 - ->method('save')  
134 - ->will($this->returnValue(TRUE));  
135 -  
136 - return $notaAlunoMock;  
137 - }  
138 -  
139 - protected function _setUpNotaAluno()  
140 - {  
141 - $notaAluno = new Avaliacao_Model_NotaAluno(array('id' => 1, 'matricula' => 1));  
142 -  
143 - // Guarda na instância  
144 - $this->_notaAlunoExpected = $notaAluno;  
145 -  
146 - return $notaAluno;  
147 - }  
148 -  
149 - /**  
150 - * @see Boletim_Common#_setUpNotaComponenteDataMapper()  
151 - */  
152 - protected function _setUpNotaComponenteDataMapper()  
153 - {  
154 - $notaComponente = array(new Avaliacao_Model_NotaComponente(array(  
155 - 'id' => 1,  
156 - 'notaAluno' => 1,  
157 - 'componenteCurricular' => 1,  
158 - 'nota' => 7.5,  
159 - 'notaArredondada' => 7,  
160 - 'etapa' => 2  
161 - )));  
162 -  
163 - $notaComponenteMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper');  
164 - $notaComponenteMock->expects($this->at(0))  
165 - ->method('findAll')  
166 - ->with(array(), array('notaAluno' => 1))  
167 - ->will($this->returnValue($notaComponente));  
168 -  
169 - return $notaComponenteMock;  
170 - }  
171 -  
172 - /**  
173 - * @see Boletim_Common#_setUpNotaComponenteMediaDataMapper()  
174 - */  
175 - protected function _setUpNotaComponenteMediaDataMapper()  
176 - {  
177 - $notaComponenteMedia = array(new Avaliacao_Model_NotaComponenteMedia(array(  
178 - 'id' => 1,  
179 - 'notaAluno' => 1,  
180 - 'componenteCurricular' => 1,  
181 - 'media' => (7.5 + 6.5) / 4,  
182 - 'mediaArredondada' => 3.5,  
183 - 'etapa' => 2  
184 - )));  
185 -  
186 - $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');  
187 - $mock->expects($this->once())  
188 - ->method('findAll')  
189 - ->with(array(), array('notaAluno' => 1))  
190 - ->will($this->returnValue($notaComponenteMedia));  
191 -  
192 - return $mock;  
193 - }  
194 -  
195 - /**  
196 - * @see Boletim_Common#_setUpFaltaAlunoDataMapperMock()  
197 - */  
198 - protected function _setUpFaltaAlunoDataMapperMock()  
199 - {  
200 - $faltaAluno = $this->_setUpFaltaAluno();  
201 -  
202 - $faltaAlunoMock = $this->getCleanMock('Avaliacao_Model_FaltaAlunoDataMapper');  
203 - $faltaAlunoMock->expects($this->any())  
204 - ->method('findAll')  
205 - ->with(array(), array('matricula' => 1))  
206 - ->will($this->onConsecutiveCalls(array(), array($faltaAluno)));  
207 -  
208 - $faltaAlunoMock->expects($this->any())  
209 - ->method('save')  
210 - ->will($this->returnValue(TRUE));  
211 -  
212 - return $faltaAlunoMock;  
213 - }  
214 -  
215 - /**  
216 - * @see Boletim_Common#_setUpFaltaAluno()  
217 - */  
218 - protected function _setUpFaltaAluno()  
219 - {  
220 - $faltaAluno = new Avaliacao_Model_FaltaAluno(array(  
221 - 'id' => 1,  
222 - 'matricula' => 1,  
223 - 'tipoFalta' => RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE  
224 - ));  
225 -  
226 - // Guarda na instância  
227 - $this->_faltaAlunoExpected = $faltaAluno;  
228 -  
229 - return $faltaAluno;  
230 - }  
231 -  
232 - /**  
233 - * @see Boletim_Common#_setUpFaltaAbstractDataMapperMock()  
234 - */  
235 - protected function _setUpFaltaAbstractDataMapperMock()  
236 - {  
237 - // Retorno para mock de falta componentes  
238 - $faltaComponente = array(new Avaliacao_Model_FaltaComponente(array(  
239 - 'id' => 1,  
240 - 'faltaAluno' => 1,  
241 - 'componenteCurricular' => 1,  
242 - 'quantidade' => 4,  
243 - 'etapa' => 2  
244 - )));  
245 -  
246 - // Configura expectativas do mock  
247 - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper');  
248 - $faltaComponenteMock->expects($this->at(0))  
249 - ->method('findAll')  
250 - ->with(array(), array('faltaAluno' => 1))  
251 - ->will($this->returnValue($faltaComponente));  
252 -  
253 - return $faltaComponenteMock;  
254 - }  
255 -  
256 - /**  
257 - * @expectedException CoreExt_Service_Exception  
258 - */  
259 - public function testInstanciaLancaExcecaoCasoNumeroDeMatriculaNaoSejaInformado()  
260 - {  
261 - $service = new Avaliacao_Service_Boletim();  
262 - }  
263 -  
264 - public function testInstanciaRegraDeAvaliacaoAtravesDeUmNumeroDeMatricula()  
265 - {  
266 - $this->assertType('RegraAvaliacao_Model_Regra', $this->_service->getRegra());  
267 - }  
268 -  
269 - public function testInstanciaComponenteCurriculaAtravesDeUmNumeroDeMatricula()  
270 - {  
271 - $this->assertType('TabelaArredondamento_Model_Tabela', $this->_service->getTabelaArredondamento());  
272 - }  
273 -  
274 - public function testInstanciaDeNotaEAdicionadaApenasUmaVez()  
275 - {  
276 - $data = array(  
277 - new Avaliacao_Model_NotaComponente(  
278 - array('componenteCurricular' => 1, 'nota' => 5)  
279 - ),  
280 - new Avaliacao_Model_NotaComponente(  
281 - array('componenteCurricular' => 3, 'nota' => 7.25)  
282 - )  
283 - );  
284 -  
285 - $this->_service->addNota($data[0])  
286 - ->addNota($data[1])  
287 - ->addNota($data[0]);  
288 -  
289 - $notas = $this->_service->getNotas();  
290 - $notas = array(  
291 - array_shift($notas),  
292 - array_shift($notas)  
293 - );  
294 -  
295 - $this->assertEquals(2, count($notas));  
296 - $this->assertEquals($data[0], $notas[0]);  
297 - $this->assertEquals($data[1], $notas[1]);  
298 -  
299 - $data[0]->nota = 6;  
300 - $this->_service->addNota($data[0]);  
301 -  
302 - $this->assertEquals(2, count($this->_service->getNotas()));  
303 - }  
304 -  
305 - public function testValidacaoDeNotaNoBoletim()  
306 - {  
307 - // O aluno de matrícula "1" terá uma nota em matemática e nenhuma em ciências  
308 - $expected = array(  
309 - new Avaliacao_Model_NotaComponente(array('nota' => 6, 'componenteCurricular' => 1, 'etapa' => 1))  
310 - );  
311 -  
312 - // Não existe etapa 7, a máxima é 4 e Rc (recuperação).  
313 - $nota = new Avaliacao_Model_NotaComponente(array('componenteCurricular' => 1, 'nota' => 5.75, 'etapa' => 7));  
314 - $this->_service->addNota($nota);  
315 -  
316 - // O aluno não cursa o componente 9  
317 - $nota = new Avaliacao_Model_NotaComponente(array('componenteCurricular' => 9, 'nota' => 5.75, 'etapa' => 7));  
318 - $this->_service->addNota($nota);  
319 -  
320 - // Notas validáveis  
321 - $validatable = $this->_service->getNotas();  
322 -  
323 - // Inválido, irá atribuir a maior etapa possível  
324 - $nota = array_shift($validatable);  
325 - $this->assertEquals(3, $nota->etapa);  
326 -  
327 -  
328 - // Inválido, irá atribuir a maior etapa possível  
329 - $nota = array_shift($validatable);  
330 - $this->assertEquals(1, $nota->etapa);  
331 - }  
332 -  
333 - public function testValidacaoDeFaltaPorComponenteNoBoletim()  
334 - {  
335 - // Não existe etapa 7, a máxima é 4 e Rc (recuperação).  
336 - $falta = new Avaliacao_Model_FaltaComponente(array('componenteCurricular' => 1, 'quantidade' => 5, 'etapa' => 7));  
337 - $this->_service->addFalta($falta);  
338 -  
339 - // O aluno não cursa o componente 9  
340 - $falta = new Avaliacao_Model_FaltaComponente(array('componenteCurricular' => 9, 'quantidade' => 5, 'etapa' => 7));  
341 - $this->_service->addFalta($falta);  
342 -  
343 - // Faltas validáveis  
344 - $validatable = $this->_service->getFaltas();  
345 -  
346 - // Inválido, irá atribuir a maior etapa possível  
347 - $falta = array_shift($validatable);  
348 - $this->assertEquals(3, $falta->etapa);  
349 -  
350 - // Inválido, irá atribuir a maior etapa possível  
351 - $falta = array_shift($validatable);  
352 - $this->assertEquals(1, $falta->etapa);  
353 - }  
354 -  
355 - public function testArredondamentoDeNota()  
356 - {  
357 - $nota = new Avaliacao_Model_NotaComponente(array('nota' => 7.5));  
358 - $this->assertEquals(7, $this->_service->arredondaNota($nota));  
359 -  
360 - $nota = new Avaliacao_Model_NotaComponente(array('nota' => 8));  
361 - $this->assertEquals(7, $this->_service->arredondaNota($nota));  
362 - }  
363 -  
364 - public function testSalvaAsNotasNoBoletim()  
365 - {  
366 - $data = array(  
367 - new Avaliacao_Model_NotaComponente(  
368 - array('componenteCurricular' => 1, 'nota' => 5)  
369 - ),  
370 - new Avaliacao_Model_NotaComponente(  
371 - array('componenteCurricular' => 3, 'nota' => 7.25, 'etapa' => 1)  
372 - )  
373 - );  
374 -  
375 - // Adiciona mocks na instância  
376 - $this->_service->addNotas($data);  
377 -  
378 - // Configura o mock de NotaComponente, que irá persistir objetos  
379 - // Avaliacao_Model_NotaComponente  
380 - $notas = $this->_service->getNotas();  
381 - $toSave[0] = array_shift($notas);  
382 - $toSave[1] = array_shift($notas);  
383 - $toSave[0]->notaAluno = $this->_notaAlunoExpected;  
384 - $toSave[1]->notaAluno = $this->_notaAlunoExpected;  
385 -  
386 - // Usa o mesmo mock que foi criado em setUp()  
387 - $notaComponenteMock = $this->_service->getNotaComponenteDataMapper();  
388 -  
389 - // Depois de salvar as notas, retornaremos um conjunto completo, inclusive  
390 - // com a nota da primeira etapa que não tem em setUp().  
391 - $notasComponentes = array(  
392 - new Avaliacao_Model_NotaComponente(array(  
393 - 'id' => 1,  
394 - 'notaAluno' => 1,  
395 - 'componenteCurricular' => 1,  
396 - 'nota' => 6.5,  
397 - 'notaArredondada' => 6,  
398 - 'etapa' => 1  
399 - )),  
400 - new Avaliacao_Model_NotaComponente(array(  
401 - 'id' => 2,  
402 - 'notaAluno' => 1,  
403 - 'componenteCurricular' => 1,  
404 - 'nota' => 7.5,  
405 - 'notaArredondada' => 7,  
406 - 'etapa' => 2  
407 - )),  
408 - new Avaliacao_Model_NotaComponente(array(  
409 - 'id' => 3,  
410 - 'notaAluno' => 1,  
411 - 'componenteCurricular' => 1,  
412 - 'nota' => 5,  
413 - 'notaArredondada' => 4,  
414 - 'etapa' => 3  
415 - )),  
416 - new Avaliacao_Model_NotaComponente(array(  
417 - 'id' => 4,  
418 - 'notaAluno' => 1,  
419 - 'componenteCurricular' => 3,  
420 - 'nota' => 7.25,  
421 - 'notaArredondada' => 7,  
422 - 'etapa' => 1  
423 - ))  
424 - );  
425 -  
426 - $notaComponenteMock->expects($this->at(0))  
427 - ->method('save')  
428 - ->with($toSave[0]);  
429 -  
430 - $notaComponenteMock->expects($this->at(1))  
431 - ->method('save')  
432 - ->with($toSave[1]);  
433 -  
434 - $notaComponenteMock->expects($this->at(2))  
435 - ->method('findAll')  
436 - ->with(array(), array('notaAluno' => 1))  
437 - ->will($this->returnValue($notasComponentes));  
438 -  
439 - // Valores de retorno para NotaComponenteMedia  
440 - $notasComponentesMedia = array(  
441 - new Avaliacao_Model_NotaComponenteMedia(array(  
442 - 'notaAluno' => 1,  
443 - 'componenteCurricular' => 1,  
444 - 'media' => 3.5,  
445 - 'mediaArredondada' => 3  
446 - ))  
447 - );  
448 -  
449 - $notaComponenteMediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');  
450 - $notaComponenteMediaMock->expects($this->at(0))  
451 - ->method('find')  
452 - ->with(array(1, 1))  
453 - ->will($this->returnValue($notasComponentesMedia[0]));  
454 -  
455 - $notaComponenteMediaMock->expects($this->at(2))  
456 - ->method('find')  
457 - ->with(array(1, 3))  
458 - ->will($this->returnValue(NULL));  
459 -  
460 - $notaComponenteMediaMock->expects($this->at(1))  
461 - ->method('save');  
462 -  
463 - $notaComponenteMediaMock->expects($this->at(3))  
464 - ->method('save');  
465 -  
466 - // Atribui mock a instância  
467 - $this->_service->setNotaComponenteDataMapper($notaComponenteMock);  
468 - $this->_service->setNotaComponenteMediaDataMapper($notaComponenteMediaMock);  
469 -  
470 - // Salva as notas  
471 - $this->_service->saveNotas();  
472 -  
473 - // Verifica a etapa das notas  
474 - $notas = $this->_service->getNotas();  
475 -  
476 - $nota1 = array_shift($notas);  
477 - $nota2 = array_shift($notas);  
478 -  
479 - // Quantidade de etapas  
480 - $this->assertEquals(3, $nota1->etapa);  
481 - $this->assertEquals(1, $nota2->etapa);  
482 - }  
483 -  
484 - public function testSalvaAsFaltasNoBoletim()  
485 - {  
486 - $data = array(  
487 - new Avaliacao_Model_FaltaComponente(array(  
488 - 'componenteCurricular' => 1, 'quantidade' => 1  
489 - )),  
490 - new Avaliacao_Model_FaltaComponente(array(  
491 - 'componenteCurricular' => 3, 'quantidade' => 4  
492 - ))  
493 - );  
494 -  
495 - // Adiciona faltas  
496 - $this->_service->addFaltas($data);  
497 -  
498 - // Adiciona a instância de falta aluno  
499 - $faltas = $this->_service->getFaltas();  
500 - $toSave = array();  
501 - $toSave[0] = array_shift($faltas);  
502 - $toSave[1] = array_shift($faltas);  
503 -  
504 - $toSave[0]->faltaAluno = $this->_faltaAlunoExpected;  
505 - $toSave[1]->faltaAluno = $this->_faltaAlunoExpected;  
506 -  
507 - // Usa o mesmo mock que foi criado em setUp()  
508 - $faltaComponenteMock = $this->_service->getFaltaAbstractDataMapper();  
509 -  
510 - $faltaComponenteMock->expects($this->at(0))  
511 - ->method('save')  
512 - ->with($toSave[0]);  
513 -  
514 - $faltaComponenteMock->expects($this->at(1))  
515 - ->method('save')  
516 - ->with($toSave[1]);  
517 -  
518 - // Salva as faltas  
519 - $this->_service->saveFaltas();  
520 - }  
521 -  
522 - public function testSituacaoAlunoComponentesCurricularesEmExame()  
523 - {  
524 - $expected = new stdClass();  
525 - $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME;  
526 - $expected->componentesCurriculares = array();  
527 - $expected->componentesCurriculares[1] = new stdClass();  
528 - $expected->componentesCurriculares[3] = new stdClass();  
529 - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME;  
530 - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME;  
531 -  
532 - $returnValue = array(  
533 - new Avaliacao_Model_NotaComponenteMedia(array(  
534 - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 5.65, 'mediaArredondada' => 5.5, 'etapa' => 4  
535 - )),  
536 - new Avaliacao_Model_NotaComponenteMedia(array(  
537 - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 6, 'mediaArredondada' => 6, 'etapa' => 'Rc'  
538 - ))  
539 - );  
540 -  
541 - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');  
542 - $mediaMock->expects($this->once())  
543 - ->method('findAll')  
544 - ->with(array(), array('notaAluno' => 1))  
545 - ->will($this->returnValue($returnValue));  
546 -  
547 - $this->_service->setNotaComponenteMediaDataMapper($mediaMock);  
548 - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares());  
549 - }  
550 -  
551 - public function testSituacaoAlunoComponentesCurricularesReprovado()  
552 - {  
553 - $expected = new stdClass();  
554 - $expected->situacao = App_Model_MatriculaSituacao::REPROVADO;  
555 - $expected->componentesCurriculares = array();  
556 - $expected->componentesCurriculares[1] = new stdClass();  
557 - $expected->componentesCurriculares[3] = new stdClass();  
558 - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO;  
559 - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::REPROVADO;  
560 -  
561 - $returnValue = array(  
562 - new Avaliacao_Model_NotaComponenteMedia(array(  
563 - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 5.65, 'mediaArredondada' => 5.5, 'etapa' => 'Rc'  
564 - )),  
565 - new Avaliacao_Model_NotaComponenteMedia(array(  
566 - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 5.5, 'mediaArredondada' => 5.5, 'etapa' => 'Rc'  
567 - ))  
568 - );  
569 -  
570 - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');  
571 - $mediaMock->expects($this->once())  
572 - ->method('findAll')  
573 - ->with(array(), array('notaAluno' => 1))  
574 - ->will($this->returnValue($returnValue));  
575 -  
576 - $this->_service->setNotaComponenteMediaDataMapper($mediaMock);  
577 - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares());  
578 - }  
579 -  
580 - public function testSituacaoAlunoComponentesCurricularesEmAndamento()  
581 - {  
582 - $expected = new stdClass();  
583 - $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;  
584 - $expected->componentesCurriculares = array();  
585 - $expected->componentesCurriculares[1] = new stdClass();  
586 - $expected->componentesCurriculares[3] = new stdClass();  
587 - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;  
588 - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;  
589 -  
590 - $returnValue = array(  
591 - new Avaliacao_Model_NotaComponenteMedia(array(  
592 - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 5.65, 'mediaArredondada' => 5.5, 'etapa' => 3  
593 - )),  
594 - new Avaliacao_Model_NotaComponenteMedia(array(  
595 - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 6, 'mediaArredondada' => 6, 'etapa' => 4  
596 - ))  
597 - );  
598 -  
599 - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');  
600 - $mediaMock->expects($this->once())  
601 - ->method('findAll')  
602 - ->with(array(), array('notaAluno' => 1))  
603 - ->will($this->returnValue($returnValue));  
604 -  
605 - $this->_service->setNotaComponenteMediaDataMapper($mediaMock);  
606 - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares());  
607 - }  
608 -  
609 - public function testSituacaoAlunoComponentesCurricularesAprovado()  
610 - {  
611 - $expected = new stdClass();  
612 - $expected->situacao = App_Model_MatriculaSituacao::APROVADO;  
613 - $expected->componentesCurriculares = array();  
614 - $expected->componentesCurriculares[1] = new stdClass();  
615 - $expected->componentesCurriculares[3] = new stdClass();  
616 - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO;  
617 - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;  
618 -  
619 - $returnValue = array(  
620 - new Avaliacao_Model_NotaComponenteMedia(array(  
621 - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 7.65, 'mediaArredondada' => 7.5, 'etapa' => 4  
622 - )),  
623 - new Avaliacao_Model_NotaComponenteMedia(array(  
624 - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 6, 'mediaArredondada' => 6, 'etapa' => 4  
625 - ))  
626 - );  
627 -  
628 - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');  
629 - $mediaMock->expects($this->once())  
630 - ->method('findAll')  
631 - ->with(array(), array('notaAluno' => 1))  
632 - ->will($this->returnValue($returnValue));  
633 -  
634 - $this->_service->setNotaComponenteMediaDataMapper($mediaMock);  
635 - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares());  
636 - }  
637 -  
638 -/**  
639 - * @depends testSalvaAsFaltasNoBoletim  
640 - * @see Boletim_Common#_configuraDadosDisciplina():255 (carga horária do  
641 - * componente de id 3 - Ciências)  
642 - */  
643 - public function testSituacaoAlunoFaltaComponenteCurricularEmAndamento()  
644 - {  
645 - $faltasComponentes = array(  
646 - new Avaliacao_Model_FaltaComponente(array(  
647 - 'id' => 1,  
648 - 'faltaAluno' => 1,  
649 - 'componenteCurricular' => 1,  
650 - 'quantidade' => 0,  
651 - 'etapa' => 1  
652 - )),  
653 - new Avaliacao_Model_FaltaComponente(array(  
654 - 'id' => 2,  
655 - 'faltaAluno' => 1,  
656 - 'componenteCurricular' => 1,  
657 - 'quantidade' => 7,  
658 - 'etapa' => 2  
659 - )),  
660 - new Avaliacao_Model_FaltaComponente(array(  
661 - 'id' => 3,  
662 - 'faltaAluno' => 1,  
663 - 'componenteCurricular' => 1,  
664 - 'quantidade' => 1,  
665 - 'etapa' => 3  
666 - )),  
667 - new Avaliacao_Model_FaltaComponente(array(  
668 - 'id' => 4,  
669 - 'faltaAluno' => 1,  
670 - 'componenteCurricular' => 3,  
671 - 'quantidade' => 4,  
672 - 'etapa' => 1  
673 - ))  
674 - );  
675 -  
676 - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper');  
677 - $faltaComponenteMock->expects($this->once())  
678 - ->method('findAll')  
679 - ->with(array(), array('faltaAluno' => 1))  
680 - ->will($this->returnValue($faltasComponentes));  
681 -  
682 - $this->_service->setFaltaAbstractDataMapper($faltaComponenteMock);  
683 -  
684 - // Objeto de retorno esperado  
685 - $expected = new stdClass();  
686 - $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;  
687 - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE;  
688 - $expected->cargaHoraria = 800;  
689 - $expected->cursoHoraFalta = (50 / 60);  
690 - $expected->totalFaltas = 12;  
691 - $expected->horasFaltas = (12 * $expected->cursoHoraFalta);  
692 - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100);  
693 - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;  
694 - $expected->porcentagemPresencaRegra = 75;  
695 - $expected->componentesCurriculares = array();  
696 - $expected->componentesCurriculares[1] = new stdClass();  
697 - $expected->componentesCurriculares[3] = new stdClass();  
698 -  
699 - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;  
700 - $expected->componentesCurriculares[1]->horasFaltas = (8 * $expected->cursoHoraFalta);  
701 - $expected->componentesCurriculares[1]->porcentagemFalta = ((8 * $expected->cursoHoraFalta) / 100) * 100;  
702 - $expected->componentesCurriculares[1]->porcentagemPresenca = 100 - (((8 * $expected->cursoHoraFalta) / 100) * 100);  
703 -  
704 - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;  
705 - $expected->componentesCurriculares[3]->horasFaltas = (4 * $expected->cursoHoraFalta);  
706 - $expected->componentesCurriculares[3]->porcentagemFalta = ((4 * $expected->cursoHoraFalta) / 70) * 100;  
707 - $expected->componentesCurriculares[3]->porcentagemPresenca = 100 - (((4 * $expected->cursoHoraFalta) / 70) * 100);  
708 -  
709 - $presenca = $this->_service->getSituacaoFaltas();  
710 - $this->assertEquals($expected, $presenca);  
711 - }  
712 -  
713 - /**  
714 - * @depends testSalvaAsFaltasNoBoletim  
715 - * @see Boletim_Common#_configuraDadosDisciplina():255 (carga horária do  
716 - * componente de id 3 - Ciências)  
717 - */  
718 - public function testSituacaoAlunoFaltaComponenteCurricularAprovado()  
719 - {  
720 - $faltasComponentes = array(  
721 - new Avaliacao_Model_FaltaComponente(array(  
722 - 'id' => 1,  
723 - 'faltaAluno' => 1,  
724 - 'componenteCurricular' => 1,  
725 - 'quantidade' => 0,  
726 - 'etapa' => 1  
727 - )),  
728 - new Avaliacao_Model_FaltaComponente(array(  
729 - 'id' => 2,  
730 - 'faltaAluno' => 1,  
731 - 'componenteCurricular' => 1,  
732 - 'quantidade' => 7,  
733 - 'etapa' => 2  
734 - )),  
735 - new Avaliacao_Model_FaltaComponente(array(  
736 - 'id' => 3,  
737 - 'faltaAluno' => 1,  
738 - 'componenteCurricular' => 1,  
739 - 'quantidade' => 1,  
740 - 'etapa' => 3  
741 - )),  
742 - new Avaliacao_Model_FaltaComponente(array(  
743 - 'id' => 4,  
744 - 'faltaAluno' => 1,  
745 - 'componenteCurricular' => 1,  
746 - 'quantidade' => 4,  
747 - 'etapa' => 4  
748 - ))  
749 - );  
750 -  
751 - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper');  
752 - $faltaComponenteMock->expects($this->once())  
753 - ->method('findAll')  
754 - ->with(array(), array('faltaAluno' => 1))  
755 - ->will($this->returnValue($faltasComponentes));  
756 -  
757 - $this->_service->setFaltaAbstractDataMapper($faltaComponenteMock);  
758 -  
759 - // Objeto de retorno esperado  
760 - $expected = new stdClass();  
761 - $expected->situacao = App_Model_MatriculaSituacao::APROVADO;  
762 - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE;  
763 - $expected->cargaHoraria = 800;  
764 - $expected->cursoHoraFalta = (50 / 60);  
765 - $expected->totalFaltas = 12;  
766 - $expected->horasFaltas = (12 * $expected->cursoHoraFalta);  
767 - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100);  
768 - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;  
769 - $expected->porcentagemPresencaRegra = 75;  
770 - $expected->componentesCurriculares = array();  
771 - $expected->componentesCurriculares[1] = new stdClass();  
772 -  
773 - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO;  
774 - $expected->componentesCurriculares[1]->horasFaltas = (12 * $expected->cursoHoraFalta);  
775 - $expected->componentesCurriculares[1]->porcentagemFalta = ((12 * $expected->cursoHoraFalta) / 100) * 100;  
776 - $expected->componentesCurriculares[1]->porcentagemPresenca = 100 - (((12 * $expected->cursoHoraFalta) / 100) * 100);  
777 -  
778 - $presenca = $this->_service->getSituacaoFaltas();  
779 - $this->assertEquals($expected, $presenca);  
780 - }  
781 -  
782 -/**  
783 - * @depends testSalvaAsFaltasNoBoletim  
784 - * @see Boletim_Common#_configuraDadosDisciplina():255 (carga horária do  
785 - * componente de id 3 - Ciências)  
786 - */  
787 - public function testSituacaoAlunoFaltaComponenteCurricularReprovado()  
788 - {  
789 - $faltasComponentes = array(  
790 - new Avaliacao_Model_FaltaComponente(array(  
791 - 'id' => 1,  
792 - 'faltaAluno' => 1,  
793 - 'componenteCurricular' => 1,  
794 - 'quantidade' => 125,  
795 - 'etapa' => 1  
796 - )),  
797 - new Avaliacao_Model_FaltaComponente(array(  
798 - 'id' => 2,  
799 - 'faltaAluno' => 1,  
800 - 'componenteCurricular' => 1,  
801 - 'quantidade' => 125,  
802 - 'etapa' => 2  
803 - )),  
804 - new Avaliacao_Model_FaltaComponente(array(  
805 - 'id' => 3,  
806 - 'faltaAluno' => 1,  
807 - 'componenteCurricular' => 1,  
808 - 'quantidade' => 125,  
809 - 'etapa' => 3  
810 - )),  
811 - new Avaliacao_Model_FaltaComponente(array(  
812 - 'id' => 4,  
813 - 'faltaAluno' => 1,  
814 - 'componenteCurricular' => 1,  
815 - 'quantidade' => 125,  
816 - 'etapa' => 4  
817 - ))  
818 - );  
819 -  
820 - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper');  
821 - $faltaComponenteMock->expects($this->once())  
822 - ->method('findAll')  
823 - ->with(array(), array('faltaAluno' => 1))  
824 - ->will($this->returnValue($faltasComponentes));  
825 -  
826 - $this->_service->setFaltaAbstractDataMapper($faltaComponenteMock);  
827 -  
828 - // Objeto de retorno esperado  
829 - $expected = new stdClass();  
830 - $expected->situacao = App_Model_MatriculaSituacao::REPROVADO;  
831 - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE;  
832 - $expected->cargaHoraria = 800;  
833 - $expected->cursoHoraFalta = (50 / 60);  
834 - $expected->totalFaltas = 500;  
835 - $expected->horasFaltas = (500 * $expected->cursoHoraFalta);  
836 - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100);  
837 - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;  
838 - $expected->porcentagemPresencaRegra = 75;  
839 - $expected->componentesCurriculares = array();  
840 - $expected->componentesCurriculares[1] = new stdClass();  
841 -  
842 - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO;  
843 - $expected->componentesCurriculares[1]->horasFaltas = (500 * $expected->cursoHoraFalta);  
844 - $expected->componentesCurriculares[1]->porcentagemFalta = ((500 * $expected->cursoHoraFalta) / 100) * 100;  
845 - $expected->componentesCurriculares[1]->porcentagemPresenca = 100 - (((500 * $expected->cursoHoraFalta) / 100) * 100);  
846 -  
847 - $presenca = $this->_service->getSituacaoFaltas();  
848 - $this->assertEquals($expected, $presenca);  
849 - }  
850 -  
851 - public function testSituacaoAluno()  
852 - {  
853 - $notaSituacoes = array(  
854 - 1 => App_Model_MatriculaSituacao::APROVADO,  
855 - 2 => App_Model_MatriculaSituacao::APROVADO_APOS_EXAME,  
856 - 3 => App_Model_MatriculaSituacao::EM_ANDAMENTO,  
857 - 4 => App_Model_MatriculaSituacao::EM_EXAME,  
858 - 5 => App_Model_MatriculaSituacao::REPROVADO  
859 - );  
860 -  
861 - $faltaSituacoes = array(  
862 - 1 => App_Model_MatriculaSituacao::EM_ANDAMENTO,  
863 - 2 => App_Model_MatriculaSituacao::APROVADO,  
864 - 3 => App_Model_MatriculaSituacao::REPROVADO  
865 - );  
866 -  
867 - // Possibilidades  
868 - $expected = array(  
869 - 1 => array(  
870 - 1 => array(FALSE, TRUE, FALSE, FALSE),  
871 - 2 => array(TRUE, FALSE, FALSE, FALSE),  
872 - 3 => array(FALSE, FALSE, TRUE, FALSE)  
873 - ),  
874 - 2 => array(  
875 - 1 => array(FALSE, TRUE, FALSE, TRUE),  
876 - 2 => array(TRUE, FALSE, FALSE, TRUE),  
877 - 3 => array(FALSE, FALSE, TRUE, TRUE)  
878 - ),  
879 - 3 => array(  
880 - 1 => array(FALSE, TRUE, FALSE, FALSE),  
881 - 2 => array(FALSE, TRUE, FALSE, FALSE),  
882 - 3 => array(FALSE, TRUE, TRUE, FALSE)  
883 - ),  
884 - 4 => array(  
885 - 1 => array(FALSE, TRUE, FALSE, TRUE),  
886 - 2 => array(FALSE, TRUE, FALSE, TRUE),  
887 - 3 => array(FALSE, TRUE, TRUE, TRUE)  
888 - ),  
889 - 5 => array(  
890 - 1 => array(FALSE, TRUE, FALSE, TRUE),  
891 - 2 => array(FALSE, FALSE, FALSE, TRUE),  
892 - 3 => array(FALSE, FALSE, TRUE, TRUE)  
893 - )  
894 - );  
895 -  
896 - foreach ($notaSituacoes as $i => $notaSituacao) {  
897 - $nota = new stdClass();  
898 - $nota->situacao = $notaSituacao;  
899 -  
900 - foreach ($faltaSituacoes as $ii => $faltaSituacao) {  
901 - $service = $this->setExcludedMethods(array('getSituacaoAluno'))  
902 - ->getCleanMock('Avaliacao_Service_Boletim');  
903 -  
904 - $falta = new stdClass();  
905 - $falta->situacao = $faltaSituacao;  
906 -  
907 - $service->expects($this->once())  
908 - ->method('getSituacaoComponentesCurriculares')  
909 - ->will($this->returnValue($nota));  
910 -  
911 - $service->expects($this->once())  
912 - ->method('getSituacaoFaltas')  
913 - ->will($this->returnValue($falta));  
914 -  
915 - // Testa  
916 - $situacao = $service->getSituacaoAluno();  
917 -  
918 - $this->assertEquals($expected[$i][$ii][0], $situacao->aprovado, "Aprovado, caso $i - $ii");  
919 - $this->assertEquals($expected[$i][$ii][1], $situacao->andamento, "Andamento, caso $i - $ii");  
920 - $this->assertEquals($expected[$i][$ii][2], $situacao->retidoFalta, "Retido por falta, caso $i - $ii");  
921 - $this->assertEquals($expected[$i][$ii][3], $situacao->recuperacao, "Recuperação, caso $i - $ii");  
922 - }  
923 - }  
924 - }  
925 -  
926 - /**  
927 - * @expectedException CoreExt_Service_Exception  
928 - */  
929 - public function testPromoverLancaExcecaoComSituacaoEmAndamento()  
930 - {  
931 - $situacao = new stdClass();  
932 - $situacao->aprovado = FALSE;  
933 - $situacao->andamento = TRUE;  
934 -  
935 - $service = $this->setExcludedMethods(array('promover'))  
936 - ->getCleanMock('Avaliacao_Service_Boletim');  
937 -  
938 - $service->expects($this->once())  
939 - ->method('getSituacaoAluno')  
940 - ->will($this->returnValue($situacao));  
941 -  
942 - $service->promover();  
943 - }  
944 -  
945 - /**  
946 - * @expectedException CoreExt_Service_Exception  
947 - */  
948 - public function testPromoverMatriculaJaPromovidaLancaExcecao()  
949 - {  
950 - $situacao = new stdClass();  
951 - $situacao->aprovado = FALSE;  
952 - $situacao->andamento = FALSE;  
953 -  
954 - $service = $this->setExcludedMethods(array('promover'))  
955 - ->getCleanMock('Avaliacao_Service_Boletim');  
956 -  
957 - $service->expects($this->once())  
958 - ->method('getSituacaoAluno')  
959 - ->will($this->returnValue($situacao));  
960 -  
961 - $service->expects($this->once())  
962 - ->method('getOption')  
963 - ->with('aprovado')  
964 - ->will($this->returnValue(1));  
965 -  
966 - $service->promover();  
967 - }  
968 -  
969 - public function testPromoverComProgressaoContinuada()  
970 - {  
971 - $situacao = new stdClass();  
972 - $situacao->aprovado = FALSE;  
973 - $situacao->andamento = FALSE;  
974 - $situacao->retidoFalta = TRUE;  
975 - $situacao->recuperacao = TRUE;  
976 -  
977 - $service = $this->setExcludedMethods(array('promover'))  
978 - ->getCleanMock('Avaliacao_Service_Boletim');  
979 -  
980 - $service->expects($this->once())  
981 - ->method('getRegra')  
982 - ->will($this->returnValue(new RegraAvaliacao_Model_Regra(  
983 - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::CONTINUADA)  
984 - )));  
985 -  
986 - $service->expects($this->once())  
987 - ->method('getSituacaoAluno')  
988 - ->will($this->returnValue($situacao));  
989 -  
990 - $service->expects($this->any())  
991 - ->method('getOption')  
992 - ->will($this->onConsecutiveCalls(3, 1, 1));  
993 -  
994 - $service->expects($this->once())  
995 - ->method('_updateMatricula')  
996 - ->with(1, 1, TRUE);  
997 -  
998 - $service->promover();  
999 - }  
1000 -  
1001 - public function testPromoverComProgressaoNaoContinuadaMediaPresencaAprovado()  
1002 - {  
1003 - $situacao = new stdClass();  
1004 - $situacao->aprovado = TRUE;  
1005 - $situacao->andamento = FALSE;  
1006 - $situacao->retidoFalta = FALSE;  
1007 - $situacao->recuperacao = FALSE;  
1008 -  
1009 - $service = $this->setExcludedMethods(array('promover'))  
1010 - ->getCleanMock('Avaliacao_Service_Boletim');  
1011 -  
1012 - $service->expects($this->once())  
1013 - ->method('getRegra')  
1014 - ->will($this->returnValue(new RegraAvaliacao_Model_Regra(  
1015 - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA)  
1016 - )));  
1017 -  
1018 - $service->expects($this->once())  
1019 - ->method('getSituacaoAluno')  
1020 - ->will($this->returnValue($situacao));  
1021 -  
1022 - $service->expects($this->any())  
1023 - ->method('getOption')  
1024 - ->will($this->onConsecutiveCalls(3, 1, 1));  
1025 -  
1026 - $service->expects($this->once())  
1027 - ->method('_updateMatricula')  
1028 - ->with(1, 1, TRUE);  
1029 -  
1030 - $service->promover();  
1031 - }  
1032 -  
1033 - public function testPromoverComProgressaoNaoContinuadaMediaPresencaReprovado()  
1034 - {  
1035 - $situacao = new stdClass();  
1036 - $situacao->aprovado = FALSE;  
1037 - $situacao->andamento = FALSE;  
1038 - $situacao->retidoFalta = TRUE;  
1039 - $situacao->recuperacao = FALSE;  
1040 -  
1041 - $service = $this->setExcludedMethods(array('promover'))  
1042 - ->getCleanMock('Avaliacao_Service_Boletim');  
1043 -  
1044 - $service->expects($this->once())  
1045 - ->method('getRegra')  
1046 - ->will($this->returnValue(new RegraAvaliacao_Model_Regra(  
1047 - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA)  
1048 - )));  
1049 -  
1050 - $service->expects($this->once())  
1051 - ->method('getSituacaoAluno')  
1052 - ->will($this->returnValue($situacao));  
1053 -  
1054 - $service->expects($this->any())  
1055 - ->method('getOption')  
1056 - ->will($this->onConsecutiveCalls(3, 1, 1));  
1057 -  
1058 - $service->expects($this->once())  
1059 - ->method('_updateMatricula')  
1060 - ->with(1, 1, FALSE);  
1061 -  
1062 - $service->promover();  
1063 - }  
1064 -  
1065 - public function testPromoverComProgressaoNaoContinuadaMediaAprovado()  
1066 - {  
1067 - $situacao = new stdClass();  
1068 - $situacao->aprovado = TRUE;  
1069 - $situacao->andamento = FALSE;  
1070 - $situacao->retidoFalta = TRUE;  
1071 - $situacao->recuperacao = FALSE;  
1072 -  
1073 - $service = $this->setExcludedMethods(array('promover'))  
1074 - ->getCleanMock('Avaliacao_Service_Boletim');  
1075 -  
1076 - $service->expects($this->once())  
1077 - ->method('getRegra')  
1078 - ->will($this->returnValue(new RegraAvaliacao_Model_Regra(  
1079 - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA)  
1080 - )));  
1081 -  
1082 - $service->expects($this->once())  
1083 - ->method('getSituacaoAluno')  
1084 - ->will($this->returnValue($situacao));  
1085 -  
1086 - $service->expects($this->any())  
1087 - ->method('getOption')  
1088 - ->will($this->onConsecutiveCalls(3, 1, 1));  
1089 -  
1090 - $service->expects($this->once())  
1091 - ->method('_updateMatricula')  
1092 - ->with(1, 1, TRUE);  
1093 -  
1094 - $service->promover();  
1095 - }  
1096 -  
1097 - public function testPromoverComProgressaoNaoContinuadaMediaReprovado()  
1098 - {  
1099 - $situacao = new stdClass();  
1100 - $situacao->aprovado = FALSE;  
1101 - $situacao->andamento = FALSE;  
1102 - $situacao->retidoFalta = FALSE;  
1103 - $situacao->recuperacao = FALSE;  
1104 -  
1105 - $service = $this->setExcludedMethods(array('promover'))  
1106 - ->getCleanMock('Avaliacao_Service_Boletim');  
1107 -  
1108 - $service->expects($this->once())  
1109 - ->method('getRegra')  
1110 - ->will($this->returnValue(new RegraAvaliacao_Model_Regra(  
1111 - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA)  
1112 - )));  
1113 -  
1114 - $service->expects($this->once())  
1115 - ->method('getSituacaoAluno')  
1116 - ->will($this->returnValue($situacao));  
1117 -  
1118 - $service->expects($this->any())  
1119 - ->method('getOption')  
1120 - ->will($this->onConsecutiveCalls(3, 1, 1));  
1121 -  
1122 - $service->expects($this->once())  
1123 - ->method('_updateMatricula')  
1124 - ->with(1, 1, FALSE);  
1125 -  
1126 - $service->promover();  
1127 - }  
1128 -  
1129 - /**  
1130 - * @expectedException CoreExt_Service_Exception  
1131 - */  
1132 - public function testPromoverComProgressaoNaoContinuadaManualNaoConfirmadaLancaExcecao()  
1133 - {  
1134 - $situacao = new stdClass();  
1135 - $situacao->aprovado = FALSE;  
1136 - $situacao->andamento = FALSE;  
1137 - $situacao->retidoFalta = FALSE;  
1138 - $situacao->recuperacao = FALSE;  
1139 -  
1140 - $service = $this->setExcludedMethods(array('promover'))  
1141 - ->getCleanMock('Avaliacao_Service_Boletim');  
1142 -  
1143 - $service->expects($this->once())  
1144 - ->method('getRegra')  
1145 - ->will($this->returnValue(new RegraAvaliacao_Model_Regra(  
1146 - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL)  
1147 - )));  
1148 -  
1149 - $service->expects($this->once())  
1150 - ->method('getSituacaoAluno')  
1151 - ->will($this->returnValue($situacao));  
1152 -  
1153 - $service->expects($this->once())  
1154 - ->method('getOption')  
1155 - ->with('aprovado')  
1156 - ->will($this->returnValue(3));  
1157 -  
1158 - $service->promover();  
1159 - }  
1160 -  
1161 - public function testPromoverComProgressaoNaoContinuadaManualConfirmada()  
1162 - {  
1163 - $situacao = new stdClass();  
1164 - $situacao->aprovado = FALSE;  
1165 - $situacao->andamento = FALSE;  
1166 - $situacao->retidoFalta = FALSE;  
1167 - $situacao->recuperacao = FALSE;  
1168 -  
1169 - $service = $this->setExcludedMethods(array('promover'))  
1170 - ->getCleanMock('Avaliacao_Service_Boletim');  
1171 -  
1172 - $service->expects($this->once())  
1173 - ->method('getRegra')  
1174 - ->will($this->returnValue(new RegraAvaliacao_Model_Regra(  
1175 - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL)  
1176 - )));  
1177 -  
1178 - $service->expects($this->once())  
1179 - ->method('getSituacaoAluno')  
1180 - ->will($this->returnValue($situacao));  
1181 -  
1182 - $service->expects($this->any())  
1183 - ->method('getOption')  
1184 - ->will($this->onConsecutiveCalls(3, 1, 1));  
1185 -  
1186 - $service->expects($this->once())  
1187 - ->method('_updateMatricula')  
1188 - ->with(1, 1, TRUE);  
1189 -  
1190 - $service->promover(TRUE);  
1191 - }  
1192 -}  
1193 \ No newline at end of file 0 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaGeralTest.php
@@ -1,414 +0,0 @@ @@ -1,414 +0,0 @@
1 -<?php  
2 -  
3 -/**  
4 - * i-Educar - Sistema de gestão escolar  
5 - *  
6 - * Copyright (C) 2006 Prefeitura Municipal de Itajaí  
7 - * <ctima@itajai.sc.gov.br>  
8 - *  
9 - * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo  
10 - * sob os termos da Licença Pública Geral GNU conforme publicada pela Free  
11 - * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)  
12 - * qualquer versão posterior.  
13 - *  
14 - * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM  
15 - * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU  
16 - * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral  
17 - * do GNU para mais detalhes.  
18 - *  
19 - * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto  
20 - * com este programa; se não, escreva para a Free Software Foundation, Inc., no  
21 - * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.  
22 - *  
23 - * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>  
24 - * @category i-Educar  
25 - * @license @@license@@  
26 - * @package Avaliacao  
27 - * @subpackage UnitTests  
28 - * @since Arquivo disponível desde a versão 1.1.0  
29 - * @version $Id$  
30 - */  
31 -  
32 -require_once 'Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php';  
33 -require_once 'Avaliacao/Model/FaltaGeralDataMapper.php';  
34 -  
35 -/**  
36 - * NotaNumerica_FaltaGeral class.  
37 - *  
38 - * Realiza testes no service Avaliacao_Service_Boletim para casos onde a regra  
39 - * de avaliação contabiliza faltas no geral.  
40 - *  
41 - * Subclassifica classe de teste para casos de faltas por componentes,  
42 - * desativando ou modificando o comportamento por herança.  
43 - *  
44 - * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>  
45 - * @category i-Educar  
46 - * @license @@license@@  
47 - * @package Avaliacao  
48 - * @subpackage UnitTests  
49 - * @since Classe disponível desde a versão 1.1.0  
50 - * @version @@package_version@@  
51 - */  
52 -class Boletim_NotaNumerica_FaltaGeralTest extends Boletim_NotaNumerica_FaltaComponenteTest  
53 -{  
54 - /**  
55 - * @see Boletim_NotaNumerica_FaltaComponenteTest#_setUpFaltaAluno()  
56 - */  
57 - protected function _setUpFaltaAluno()  
58 - {  
59 - $faltaAluno = new Avaliacao_Model_FaltaAluno(array(  
60 - 'id' => 1,  
61 - 'matricula' => 1,  
62 - 'tipoFalta' => RegraAvaliacao_Model_TipoPresenca::GERAL  
63 - ));  
64 -  
65 - // Guarda na instância  
66 - $this->_faltaAlunoExpected = $faltaAluno;  
67 -  
68 - return $faltaAluno;  
69 - }  
70 -  
71 - /**  
72 - * @see Boletim_Common#_setUpFaltaAbstractDataMapperMock()  
73 - */  
74 - protected function _setUpFaltaAbstractDataMapperMock()  
75 - {  
76 - // Retorno para mock de falta componentes  
77 - $faltaComponente = array(new Avaliacao_Model_FaltaGeral(array(  
78 - 'id' => 1,  
79 - 'faltaAluno' => 1,  
80 - 'quantidade' => 4,  
81 - 'etapa' => 2  
82 - )));  
83 -  
84 - // Configura expectativas do mock  
85 - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper');  
86 - $faltaComponenteMock->expects($this->at(0))  
87 - ->method('findAll')  
88 - ->with(array(), array('faltaAluno' => 1))  
89 - ->will($this->returnValue($faltaComponente));  
90 -  
91 - return $faltaComponenteMock;  
92 - }  
93 -  
94 - public function testInstanciaLancaExcecaoCasoNumeroDeMatriculaNaoSejaInformado()  
95 - {  
96 - }  
97 -  
98 - public function testInstanciaRegraDeAvaliacaoAtravesDeUmNumeroDeMatricula()  
99 - {  
100 - }  
101 -  
102 - public function testInstanciaComponenteCurriculaAtravesDeUmNumeroDeMatricula()  
103 - {  
104 - }  
105 -  
106 - public function testInstanciaDeNotaEAdicionadaApenasUmaVez()  
107 - {  
108 - }  
109 -  
110 - public function testValidacaoDeNotaNoBoletim()  
111 - {  
112 - }  
113 -  
114 - public function testValidacaoDeFaltaPorComponenteNoBoletim()  
115 - {  
116 - }  
117 -  
118 - public function testValidacaoDeFaltaGeralNoBoletim()  
119 - {  
120 - // Não existe etapa 7, a máxima é 4 e Rc (recuperação).  
121 - $falta = new Avaliacao_Model_FaltaGeral(array('quantidade' => 5, 'etapa' => 7));  
122 - $this->_service->addFalta($falta);  
123 -  
124 - // O aluno não cursa o componente 9  
125 - $falta = new Avaliacao_Model_FaltaGeral(array('quantidade' => 5, 'etapa' => 7));  
126 - $this->_service->addFalta($falta);  
127 -  
128 - // Faltas validáveis  
129 - $validatable = $this->_service->getFaltas();  
130 -  
131 - // Inválido, irá atribuir a maior etapa possível  
132 - $falta = array_shift($validatable);  
133 - $this->assertEquals(3, $falta->etapa);  
134 -  
135 - // Inválido, irá atribuir a maior etapa possível  
136 - $falta = array_shift($validatable);  
137 - $this->assertEquals(3, $falta->etapa, 'Segunda');  
138 - }  
139 -  
140 - public function testArredondamentoDeNota()  
141 - {  
142 - }  
143 -  
144 - public function testSalvaAsNotasNoBoletim()  
145 - {  
146 - }  
147 -  
148 - public function testSalvaAsFaltasNoBoletim()  
149 - {  
150 - $data = array(  
151 - new Avaliacao_Model_FaltaGeral(array(  
152 - 'quantidade' => 1  
153 - )),  
154 - new Avaliacao_Model_FaltaGeral(array(  
155 - 'quantidade' => 4  
156 - ))  
157 - );  
158 -  
159 - // Adiciona faltas  
160 - $this->_service->addFaltas($data);  
161 -  
162 - // Adiciona a instância de falta aluno  
163 - $faltas = $this->_service->getFaltas();  
164 - $toSave = array();  
165 - $toSave[0] = array_shift($faltas);  
166 - $toSave[1] = array_shift($faltas);  
167 -  
168 - $toSave[0]->faltaAluno = $this->_faltaAlunoExpected;  
169 - $toSave[1]->faltaAluno = $this->_faltaAlunoExpected;  
170 -  
171 - // Usa o mesmo mock que foi criado em setUp()  
172 - $faltaComponenteMock = $this->_service->getFaltaAbstractDataMapper();  
173 -  
174 - $faltaComponenteMock->expects($this->at(0))  
175 - ->method('save')  
176 - ->with($toSave[0]);  
177 -  
178 - $faltaComponenteMock->expects($this->at(1))  
179 - ->method('save')  
180 - ->with($toSave[1]);  
181 -  
182 - // Salva as faltas  
183 - $this->_service->saveFaltas();  
184 - }  
185 -  
186 - public function testSituacaoAlunoComponentesCurricularesEmExame()  
187 - {  
188 - }  
189 -  
190 - public function testSituacaoAlunoComponentesCurricularesReprovado()  
191 - {  
192 - }  
193 -  
194 - public function testSituacaoAlunoComponentesCurricularesEmAndamento()  
195 - {  
196 - }  
197 -  
198 - public function testSituacaoAlunoComponentesCurricularesAprovado()  
199 - {  
200 - }  
201 -  
202 - public function testSituacaoAlunoFaltaComponenteCurricularReprovado()  
203 - {  
204 - }  
205 -  
206 - public function testSituacaoAlunoFaltaComponenteCurricularEmAndamento()  
207 - {  
208 - }  
209 -  
210 - public function testSituacaoAlunoFaltaComponenteCurricularAprovado()  
211 - {  
212 - }  
213 -  
214 - /**  
215 - * @depends testSalvaAsFaltasNoBoletim  
216 - */  
217 - public function testSituacaoAlunoFaltaGeralEmAndamento()  
218 - {  
219 - $faltasGerais = array(  
220 - new Avaliacao_Model_FaltaGeral(array(  
221 - 'id' => 1,  
222 - 'faltaAluno' => 1,  
223 - 'quantidade' => 1,  
224 - 'etapa' => 1  
225 - )),  
226 - new Avaliacao_Model_FaltaGeral(array(  
227 - 'id' => 2,  
228 - 'faltaAluno' => 1,  
229 - 'quantidade' => 4,  
230 - 'etapa' => 2  
231 - )),  
232 - new Avaliacao_Model_FaltaGeral(array(  
233 - 'id' => 3,  
234 - 'faltaAluno' => 1,  
235 - 'quantidade' => 5,  
236 - 'etapa' => 3  
237 - ))  
238 - );  
239 -  
240 - $faltaGeralMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper');  
241 - $faltaGeralMock->expects($this->once())  
242 - ->method('findAll')  
243 - ->with(array(), array('faltaAluno' => 1))  
244 - ->will($this->returnValue($faltasGerais));  
245 -  
246 - $this->_service->setFaltaAbstractDataMapper($faltaGeralMock);  
247 -  
248 - // Objeto de retorno esperado  
249 - $expected = new stdClass();  
250 - $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;  
251 - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::GERAL;  
252 - $expected->cargaHoraria = 800;  
253 - $expected->cursoHoraFalta = (50 / 60);  
254 - $expected->totalFaltas = 10;  
255 - $expected->horasFaltas = (10 * $expected->cursoHoraFalta);  
256 - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100);  
257 - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;  
258 - $expected->porcentagemPresencaRegra = 75;  
259 - $expected->componentesCurriculares = array();  
260 -  
261 - $presenca = $this->_service->getSituacaoFaltas();  
262 - $this->assertEquals($expected, $presenca);  
263 - }  
264 -  
265 - /**  
266 - * @depends testSalvaAsFaltasNoBoletim  
267 - */  
268 - public function testSituacaoAlunoFaltaGeralReprovado()  
269 - {  
270 - $faltasGerais = array(  
271 - new Avaliacao_Model_FaltaGeral(array(  
272 - 'id' => 1,  
273 - 'faltaAluno' => 1,  
274 - 'quantidade' => 125,  
275 - 'etapa' => 1  
276 - )),  
277 - new Avaliacao_Model_FaltaGeral(array(  
278 - 'id' => 2,  
279 - 'faltaAluno' => 1,  
280 - 'quantidade' => 125,  
281 - 'etapa' => 2  
282 - )),  
283 - new Avaliacao_Model_FaltaGeral(array(  
284 - 'id' => 3,  
285 - 'faltaAluno' => 1,  
286 - 'quantidade' => 125,  
287 - 'etapa' => 3  
288 - )),  
289 - new Avaliacao_Model_FaltaGeral(array(  
290 - 'id' => 4,  
291 - 'faltaAluno' => 1,  
292 - 'quantidade' => 125,  
293 - 'etapa' => 4  
294 - ))  
295 - );  
296 -  
297 - $faltaGeralMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper');  
298 - $faltaGeralMock->expects($this->once())  
299 - ->method('findAll')  
300 - ->with(array(), array('faltaAluno' => 1))  
301 - ->will($this->returnValue($faltasGerais));  
302 -  
303 - $this->_service->setFaltaAbstractDataMapper($faltaGeralMock);  
304 -  
305 - // Objeto de retorno esperado  
306 - $expected = new stdClass();  
307 - $expected->situacao = App_Model_MatriculaSituacao::REPROVADO;  
308 - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::GERAL;  
309 - $expected->cargaHoraria = 800;  
310 - $expected->cursoHoraFalta = (50 / 60);  
311 - $expected->totalFaltas = 500;  
312 - $expected->horasFaltas = (500 * $expected->cursoHoraFalta);  
313 - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100);  
314 - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;  
315 - $expected->porcentagemPresencaRegra = 75;  
316 - $expected->componentesCurriculares = array();  
317 -  
318 - $presenca = $this->_service->getSituacaoFaltas();  
319 - $this->assertEquals($expected, $presenca);  
320 - }  
321 -  
322 - /**  
323 - * @depends testSalvaAsFaltasNoBoletim  
324 - */  
325 - public function testSituacaoAlunoFaltaGeralAprovado()  
326 - {  
327 - $faltasGerais = array(  
328 - new Avaliacao_Model_FaltaGeral(array(  
329 - 'id' => 1,  
330 - 'faltaAluno' => 1,  
331 - 'quantidade' => 1,  
332 - 'etapa' => 1  
333 - )),  
334 - new Avaliacao_Model_FaltaGeral(array(  
335 - 'id' => 2,  
336 - 'faltaAluno' => 1,  
337 - 'quantidade' => 4,  
338 - 'etapa' => 2  
339 - )),  
340 - new Avaliacao_Model_FaltaGeral(array(  
341 - 'id' => 3,  
342 - 'faltaAluno' => 1,  
343 - 'quantidade' => 5,  
344 - 'etapa' => 3  
345 - )),  
346 - new Avaliacao_Model_FaltaGeral(array(  
347 - 'id' => 4,  
348 - 'faltaAluno' => 1,  
349 - 'quantidade' => 0,  
350 - 'etapa' => 4  
351 - ))  
352 - );  
353 -  
354 - $faltaGeralMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper');  
355 - $faltaGeralMock->expects($this->once())  
356 - ->method('findAll')  
357 - ->with(array(), array('faltaAluno' => 1))  
358 - ->will($this->returnValue($faltasGerais));  
359 -  
360 - $this->_service->setFaltaAbstractDataMapper($faltaGeralMock);  
361 -  
362 - // Objeto de retorno esperado  
363 - $expected = new stdClass();  
364 - $expected->situacao = App_Model_MatriculaSituacao::APROVADO;  
365 - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::GERAL;  
366 - $expected->cargaHoraria = 800;  
367 - $expected->cursoHoraFalta = (50 / 60);  
368 - $expected->totalFaltas = 10;  
369 - $expected->horasFaltas = (10 * $expected->cursoHoraFalta);  
370 - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100);  
371 - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;  
372 - $expected->porcentagemPresencaRegra = 75;  
373 - $expected->componentesCurriculares = array();  
374 -  
375 - $presenca = $this->_service->getSituacaoFaltas();  
376 - $this->assertEquals($expected, $presenca);  
377 - }  
378 -  
379 - public function testSituacaoAluno()  
380 - {  
381 - }  
382 -  
383 - public function testPromoverLancaExcecaoComSituacaoEmAndamento()  
384 - {  
385 - }  
386 -  
387 - public function testPromoverComProgressaoContinuada()  
388 - {  
389 - }  
390 -  
391 - public function testPromoverComProgressaoNaoContinuadaMediaPresencaAprovado()  
392 - {  
393 - }  
394 -  
395 - public function testPromoverComProgressaoNaoContinuadaMediaPresencaReprovado()  
396 - {  
397 - }  
398 -  
399 - public function testPromoverComProgressaoNaoContinuadaMediaAprovado()  
400 - {  
401 - }  
402 -  
403 - public function testPromoverComProgressaoNaoContinuadaMediaReprovado()  
404 - {  
405 - }  
406 -  
407 - public function testPromoverComProgressaoNaoContinuadaManualNaoConfirmadaLancaExcecao()  
408 - {  
409 - }  
410 -  
411 - public function testPromoverComProgressaoNaoContinuadaManualConfirmada()  
412 - {  
413 - }  
414 -}  
415 \ No newline at end of file 0 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/AllTests.php 0 → 100644
@@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage Tests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +/**
  33 + * Avaliacao_AllTests class.
  34 + *
  35 + * Arquivo de definição de suíte para o módulo.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage Tests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_AllTests extends TestCollector
  46 +{
  47 + protected $_name = 'Suíte de testes do service Avaliacao_Service_Boletim do módulo Avaliacao';
  48 + protected $_file = __FILE__;
  49 +
  50 + public static function suite()
  51 + {
  52 + $instance = new self;
  53 + return $instance->addDirectoryTests();
  54 + }
  55 +}
0 \ No newline at end of file 56 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/FaltaAlunoTest.php 0 → 100644
@@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_FaltaAlunoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_FaltaAlunoTest extends Avaliacao_Service_TestCommon
  46 +{
  47 + public function testCriaNovaInstanciaDeFaltaAluno()
  48 + {
  49 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  50 +
  51 + $faltaSave = clone $faltaAluno;
  52 + $faltaSave->id = NULL;
  53 +
  54 + // Configura mock para Avaliacao_Model_FaltaAlunoDataMapper
  55 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAlunoDataMapper');
  56 + $mock->expects($this->at(0))
  57 + ->method('findAll')
  58 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  59 + ->will($this->returnValue(array()));
  60 +
  61 + $mock->expects($this->at(1))
  62 + ->method('save')
  63 + ->with($faltaSave)
  64 + ->will($this->returnValue(TRUE));
  65 +
  66 + $mock->expects($this->at(2))
  67 + ->method('findAll')
  68 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  69 + ->will($this->returnValue(array($faltaAluno)));
  70 +
  71 + $this->_setFaltaAlunoDataMapperMock($mock);
  72 +
  73 + $service = $this->_getServiceInstance();
  74 + }
  75 +}
0 \ No newline at end of file 76 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/FaltaCommon.php 0 → 100644
@@ -0,0 +1,110 @@ @@ -0,0 +1,110 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_FaltaCommon abstract class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +abstract class Avaliacao_Service_FaltaCommon extends Avaliacao_Service_TestCommon
  46 +{
  47 + /**
  48 + * @return Avaliacao_Model_FaltaComponente
  49 + */
  50 + protected abstract function _getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim();
  51 +
  52 + /**
  53 + * @return Avaliacao_Model_FaltaComponente
  54 + */
  55 + protected abstract function _getFaltaTestAdicionaFaltaNoBoletim();
  56 +
  57 + /**
  58 + * Realiza asserções específicas para os validadores de uma instância de
  59 + * Avaliacao_Model_FaltaAbstract
  60 + */
  61 + protected abstract function _testAdicionaFaltaNoBoletimVerificaValidadores(Avaliacao_Model_FaltaAbstract $falta);
  62 +
  63 + /**
  64 + * @see Avaliacao_Service_FaltaCommon#_getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim()
  65 + */
  66 + public function testInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim()
  67 + {
  68 + $service = $this->_getServiceInstance();
  69 +
  70 + $falta = $this->_getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim();
  71 +
  72 + // Atribuição simples
  73 + $service->addFalta($falta)
  74 + ->addFalta($falta);
  75 +
  76 + $this->assertEquals(1, count($service->getFaltas()));
  77 +
  78 + // Via atribuição em lote
  79 + $falta = clone $falta;
  80 + $service->addFaltas(array($falta, $falta, $falta));
  81 +
  82 + $this->assertEquals(2, count($service->getFaltas()));
  83 + }
  84 +
  85 + /**
  86 + * @see Avaliacao_Service_FaltaCommon#_getFaltaTestAdicionaFaltaNoBoletim()
  87 + * @see Avaliacao_Service_FaltaCommon#_testAdicionaFaltaNoBoletimVerificaValidadores()
  88 + */
  89 + public function testAdicionaFaltaNoBoletim()
  90 + {
  91 + $service = $this->_getServiceInstance();
  92 +
  93 + $falta = $this->_getFaltaTestAdicionaFaltaNoBoletim();
  94 +
  95 + $faltaOriginal = clone $falta;
  96 + $service->addFalta($falta);
  97 +
  98 + $faltas = $service->getFaltas();
  99 + $serviceFalta = array_shift($faltas);
  100 +
  101 + // Valores declarados explicitamente, verificação explícita
  102 + $this->assertEquals($faltaOriginal->quantidade, $serviceFalta->quantidade);
  103 +
  104 + // Valores populados pelo service
  105 + $this->assertNotEquals($faltaOriginal->etapa, $serviceFalta->etapa);
  106 +
  107 + // Validadores injetados no objeto
  108 + $this->_testAdicionaFaltaNoBoletimVerificaValidadores($serviceFalta);
  109 + }
  110 +}
0 \ No newline at end of file 111 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteSituacaoTest.php 0 → 100644
@@ -0,0 +1,515 @@ @@ -0,0 +1,515 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/FaltaSituacaoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_FaltaComponenteSituacaoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_FaltaComponenteSituacaoTest extends Avaliacao_Service_FaltaSituacaoCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE);
  50 + parent::setUp();
  51 + }
  52 +
  53 + public function testSituacaoFaltasEmAndamento()
  54 + {
  55 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  56 + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, array());
  57 +
  58 + $expected = $this->_getExpectedSituacaoFaltas();
  59 +
  60 + // Configura a expectativa
  61 + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
  62 + $expected->porcentagemPresenca = 100;
  63 +
  64 + $service = $this->_getServiceInstance();
  65 +
  66 + $this->assertEquals($expected, $service->getSituacaoFaltas());
  67 + }
  68 +
  69 + public function testSituacaoFaltasEmAndamentoUmComponenteAprovadoDeQuatroTotais()
  70 + {
  71 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  72 + $componentes = $this->_getConfigOptions('escolaSerieDisciplina');
  73 +
  74 + $faltas = array(
  75 + new Avaliacao_Model_FaltaComponente(array(
  76 + 'id' => 1,
  77 + 'componenteCurricular' => 1,
  78 + 'quantidade' => 5,
  79 + 'etapa' => 1
  80 + )),
  81 + new Avaliacao_Model_FaltaComponente(array(
  82 + 'id' => 2,
  83 + 'componenteCurricular' => 1,
  84 + 'quantidade' => 5,
  85 + 'etapa' => 2
  86 + )),
  87 + new Avaliacao_Model_FaltaComponente(array(
  88 + 'id' => 3,
  89 + 'componenteCurricular' => 1,
  90 + 'quantidade' => 5,
  91 + 'etapa' => 3
  92 + )),
  93 + new Avaliacao_Model_FaltaComponente(array(
  94 + 'id' => 4,
  95 + 'componenteCurricular' => 1,
  96 + 'quantidade' => 5,
  97 + 'etapa' => 4
  98 + )),
  99 + );
  100 +
  101 + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas);
  102 +
  103 + $expected = $this->_getExpectedSituacaoFaltas();
  104 +
  105 + // Configura a expectativa
  106 + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
  107 +
  108 + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade'));
  109 + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta');
  110 + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100);
  111 + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;
  112 +
  113 + // Configura expectativa para o componente de id '1'
  114 + $componenteHoraFalta =
  115 + array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')) *
  116 + $this->_getConfigOption('curso', 'hora_falta');
  117 +
  118 + $componentePorcentagemFalta =
  119 + ($componenteHoraFalta / $componentes[0]['carga_horaria']) * 100;
  120 +
  121 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  122 +
  123 + $expected->componentesCurriculares[1] = new stdClass();
  124 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO;
  125 + $expected->componentesCurriculares[1]->horasFaltas = $componenteHoraFalta;
  126 + $expected->componentesCurriculares[1]->porcentagemFalta = $componentePorcentagemFalta;
  127 + $expected->componentesCurriculares[1]->porcentagemPresenca = $componentePorcentagemPresenca;
  128 +
  129 + $service = $this->_getServiceInstance();
  130 +
  131 + $this->assertEquals($expected, $service->getSituacaoFaltas());
  132 + }
  133 +
  134 + public function testSituacaoFaltasAprovado()
  135 + {
  136 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  137 + $componentes = $this->_getConfigOptions('escolaSerieDisciplina');
  138 +
  139 + $faltas = array(
  140 + // Matemática
  141 + new Avaliacao_Model_FaltaComponente(array(
  142 + 'id' => 1,
  143 + 'componenteCurricular' => 1,
  144 + 'quantidade' => 5,
  145 + 'etapa' => 1
  146 + )),
  147 + new Avaliacao_Model_FaltaComponente(array(
  148 + 'id' => 2,
  149 + 'componenteCurricular' => 1,
  150 + 'quantidade' => 5,
  151 + 'etapa' => 2
  152 + )),
  153 + new Avaliacao_Model_FaltaComponente(array(
  154 + 'id' => 3,
  155 + 'componenteCurricular' => 1,
  156 + 'quantidade' => 5,
  157 + 'etapa' => 3
  158 + )),
  159 + new Avaliacao_Model_FaltaComponente(array(
  160 + 'id' => 4,
  161 + 'componenteCurricular' => 1,
  162 + 'quantidade' => 5,
  163 + 'etapa' => 4
  164 + )),
  165 + // Português
  166 + new Avaliacao_Model_FaltaComponente(array(
  167 + 'id' => 5,
  168 + 'componenteCurricular' => 2,
  169 + 'quantidade' => 5,
  170 + 'etapa' => 1
  171 + )),
  172 + new Avaliacao_Model_FaltaComponente(array(
  173 + 'id' => 6,
  174 + 'componenteCurricular' => 2,
  175 + 'quantidade' => 5,
  176 + 'etapa' => 2
  177 + )),
  178 + new Avaliacao_Model_FaltaComponente(array(
  179 + 'id' => 7,
  180 + 'componenteCurricular' => 2,
  181 + 'quantidade' => 5,
  182 + 'etapa' => 3
  183 + )),
  184 + new Avaliacao_Model_FaltaComponente(array(
  185 + 'id' => 8,
  186 + 'componenteCurricular' => 2,
  187 + 'quantidade' => 5,
  188 + 'etapa' => 4
  189 + )),
  190 + // Ciências
  191 + new Avaliacao_Model_FaltaComponente(array(
  192 + 'id' => 9,
  193 + 'componenteCurricular' => 3,
  194 + 'quantidade' => 5,
  195 + 'etapa' => 1
  196 + )),
  197 + new Avaliacao_Model_FaltaComponente(array(
  198 + 'id' => 10,
  199 + 'componenteCurricular' => 3,
  200 + 'quantidade' => 5,
  201 + 'etapa' => 2
  202 + )),
  203 + new Avaliacao_Model_FaltaComponente(array(
  204 + 'id' => 11,
  205 + 'componenteCurricular' => 3,
  206 + 'quantidade' => 5,
  207 + 'etapa' => 3
  208 + )),
  209 + new Avaliacao_Model_FaltaComponente(array(
  210 + 'id' => 12,
  211 + 'componenteCurricular' => 3,
  212 + 'quantidade' => 5,
  213 + 'etapa' => 4
  214 + )),
  215 + // Fisica
  216 + new Avaliacao_Model_FaltaComponente(array(
  217 + 'id' => 13,
  218 + 'componenteCurricular' => 4,
  219 + 'quantidade' => 5,
  220 + 'etapa' => 1
  221 + )),
  222 + new Avaliacao_Model_FaltaComponente(array(
  223 + 'id' => 14,
  224 + 'componenteCurricular' => 4,
  225 + 'quantidade' => 5,
  226 + 'etapa' => 2
  227 + )),
  228 + new Avaliacao_Model_FaltaComponente(array(
  229 + 'id' => 15,
  230 + 'componenteCurricular' => 4,
  231 + 'quantidade' => 5,
  232 + 'etapa' => 3
  233 + )),
  234 + new Avaliacao_Model_FaltaComponente(array(
  235 + 'id' => 16,
  236 + 'componenteCurricular' => 4,
  237 + 'quantidade' => 5,
  238 + 'etapa' => 4
  239 + )),
  240 + );
  241 +
  242 + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas);
  243 +
  244 + $expected = $this->_getExpectedSituacaoFaltas();
  245 +
  246 + // Configura a expectativa
  247 + $expected->situacao = App_Model_MatriculaSituacao::APROVADO;
  248 +
  249 + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade'));
  250 + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta');
  251 + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100);
  252 + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;
  253 +
  254 + // Configura expectativa para o componente de id '1'
  255 + $componenteHoraFalta =
  256 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 0, 4), 'id', 'quantidade')) *
  257 + $this->_getConfigOption('curso', 'hora_falta');
  258 +
  259 + $componentePorcentagemFalta =
  260 + ($componenteHoraFalta / $componentes[0]['carga_horaria']) * 100;
  261 +
  262 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  263 +
  264 + $expected->componentesCurriculares[1] = new stdClass();
  265 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO;
  266 + $expected->componentesCurriculares[1]->horasFaltas = $componenteHoraFalta;
  267 + $expected->componentesCurriculares[1]->porcentagemFalta = $componentePorcentagemFalta;
  268 + $expected->componentesCurriculares[1]->porcentagemPresenca = $componentePorcentagemPresenca;
  269 +
  270 + // Configura expectativa para o componente de id '2'
  271 + $componenteHoraFalta =
  272 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 4, 4), 'id', 'quantidade')) *
  273 + $this->_getConfigOption('curso', 'hora_falta');
  274 +
  275 + $componentePorcentagemFalta =
  276 + ($componenteHoraFalta / $componentes[1]['carga_horaria']) * 100;
  277 +
  278 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  279 +
  280 + $expected->componentesCurriculares[2] = new stdClass();
  281 + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO;
  282 + $expected->componentesCurriculares[2]->horasFaltas = $componenteHoraFalta;
  283 + $expected->componentesCurriculares[2]->porcentagemFalta = $componentePorcentagemFalta;
  284 + $expected->componentesCurriculares[2]->porcentagemPresenca = $componentePorcentagemPresenca;
  285 +
  286 + // Configura expectativa para o componente de id '3'
  287 + $componenteHoraFalta =
  288 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 8, 4), 'id', 'quantidade')) *
  289 + $this->_getConfigOption('curso', 'hora_falta');
  290 +
  291 + $componentePorcentagemFalta =
  292 + ($componenteHoraFalta / $componentes[2]['carga_horaria']) * 100;
  293 +
  294 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  295 +
  296 + $expected->componentesCurriculares[3] = new stdClass();
  297 + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;
  298 + $expected->componentesCurriculares[3]->horasFaltas = $componenteHoraFalta;
  299 + $expected->componentesCurriculares[3]->porcentagemFalta = $componentePorcentagemFalta;
  300 + $expected->componentesCurriculares[3]->porcentagemPresenca = $componentePorcentagemPresenca;
  301 +
  302 + // Configura expectativa para o componente de id '4'
  303 + $componenteHoraFalta =
  304 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 12, 4), 'id', 'quantidade')) *
  305 + $this->_getConfigOption('curso', 'hora_falta');
  306 +
  307 + $componentePorcentagemFalta =
  308 + ($componenteHoraFalta / $componentes[3]['carga_horaria']) * 100;
  309 +
  310 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  311 +
  312 + $expected->componentesCurriculares[4] = new stdClass();
  313 + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO;
  314 + $expected->componentesCurriculares[4]->horasFaltas = $componenteHoraFalta;
  315 + $expected->componentesCurriculares[4]->porcentagemFalta = $componentePorcentagemFalta;
  316 + $expected->componentesCurriculares[4]->porcentagemPresenca = $componentePorcentagemPresenca;
  317 +
  318 + $service = $this->_getServiceInstance();
  319 +
  320 + $this->assertEquals($expected, $service->getSituacaoFaltas());
  321 + }
  322 +
  323 + /**
  324 + * Faltas para componentes funcionam usam os mesmos critérios das faltas
  325 + * gerais para a definição de aprovado ou reprovado: presença geral.
  326 + */
  327 + public function testSituacaoFaltasReprovado()
  328 + {
  329 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  330 + $componentes = $this->_getConfigOptions('escolaSerieDisciplina');
  331 +
  332 + $faltas = array(
  333 + // Matemática
  334 + new Avaliacao_Model_FaltaComponente(array(
  335 + 'id' => 1,
  336 + 'componenteCurricular' => 1,
  337 + 'quantidade' => 60,
  338 + 'etapa' => 1
  339 + )),
  340 + new Avaliacao_Model_FaltaComponente(array(
  341 + 'id' => 2,
  342 + 'componenteCurricular' => 1,
  343 + 'quantidade' => 60,
  344 + 'etapa' => 2
  345 + )),
  346 + new Avaliacao_Model_FaltaComponente(array(
  347 + 'id' => 3,
  348 + 'componenteCurricular' => 1,
  349 + 'quantidade' => 60,
  350 + 'etapa' => 3
  351 + )),
  352 + new Avaliacao_Model_FaltaComponente(array(
  353 + 'id' => 4,
  354 + 'componenteCurricular' => 1,
  355 + 'quantidade' => 55,
  356 + 'etapa' => 4
  357 + )),
  358 + // Português
  359 + new Avaliacao_Model_FaltaComponente(array(
  360 + 'id' => 5,
  361 + 'componenteCurricular' => 2,
  362 + 'quantidade' => 5,
  363 + 'etapa' => 1
  364 + )),
  365 + new Avaliacao_Model_FaltaComponente(array(
  366 + 'id' => 6,
  367 + 'componenteCurricular' => 2,
  368 + 'quantidade' => 5,
  369 + 'etapa' => 2
  370 + )),
  371 + new Avaliacao_Model_FaltaComponente(array(
  372 + 'id' => 7,
  373 + 'componenteCurricular' => 2,
  374 + 'quantidade' => 5,
  375 + 'etapa' => 3
  376 + )),
  377 + new Avaliacao_Model_FaltaComponente(array(
  378 + 'id' => 8,
  379 + 'componenteCurricular' => 2,
  380 + 'quantidade' => 5,
  381 + 'etapa' => 4
  382 + )),
  383 + // Ciências
  384 + new Avaliacao_Model_FaltaComponente(array(
  385 + 'id' => 9,
  386 + 'componenteCurricular' => 3,
  387 + 'quantidade' => 5,
  388 + 'etapa' => 1
  389 + )),
  390 + new Avaliacao_Model_FaltaComponente(array(
  391 + 'id' => 10,
  392 + 'componenteCurricular' => 3,
  393 + 'quantidade' => 5,
  394 + 'etapa' => 2
  395 + )),
  396 + new Avaliacao_Model_FaltaComponente(array(
  397 + 'id' => 11,
  398 + 'componenteCurricular' => 3,
  399 + 'quantidade' => 5,
  400 + 'etapa' => 3
  401 + )),
  402 + new Avaliacao_Model_FaltaComponente(array(
  403 + 'id' => 12,
  404 + 'componenteCurricular' => 3,
  405 + 'quantidade' => 5,
  406 + 'etapa' => 4
  407 + )),
  408 + // Fisica
  409 + new Avaliacao_Model_FaltaComponente(array(
  410 + 'id' => 13,
  411 + 'componenteCurricular' => 4,
  412 + 'quantidade' => 5,
  413 + 'etapa' => 1
  414 + )),
  415 + new Avaliacao_Model_FaltaComponente(array(
  416 + 'id' => 14,
  417 + 'componenteCurricular' => 4,
  418 + 'quantidade' => 5,
  419 + 'etapa' => 2
  420 + )),
  421 + new Avaliacao_Model_FaltaComponente(array(
  422 + 'id' => 15,
  423 + 'componenteCurricular' => 4,
  424 + 'quantidade' => 5,
  425 + 'etapa' => 3
  426 + )),
  427 + new Avaliacao_Model_FaltaComponente(array(
  428 + 'id' => 16,
  429 + 'componenteCurricular' => 4,
  430 + 'quantidade' => 5,
  431 + 'etapa' => 4
  432 + )),
  433 + );
  434 +
  435 + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas);
  436 +
  437 + $expected = $this->_getExpectedSituacaoFaltas();
  438 +
  439 + // Configura a expectativa
  440 + $expected->situacao = App_Model_MatriculaSituacao::REPROVADO;
  441 +
  442 + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade'));
  443 + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta');
  444 + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100);
  445 + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;
  446 +
  447 + // Configura expectativa para o componente de id '1'
  448 + $componenteHoraFalta =
  449 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 0, 4), 'id', 'quantidade')) *
  450 + $this->_getConfigOption('curso', 'hora_falta');
  451 +
  452 + $componentePorcentagemFalta =
  453 + ($componenteHoraFalta / $componentes[0]['carga_horaria']) * 100;
  454 +
  455 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  456 +
  457 + $expected->componentesCurriculares[1] = new stdClass();
  458 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO;
  459 + $expected->componentesCurriculares[1]->horasFaltas = $componenteHoraFalta;
  460 + $expected->componentesCurriculares[1]->porcentagemFalta = $componentePorcentagemFalta;
  461 + $expected->componentesCurriculares[1]->porcentagemPresenca = $componentePorcentagemPresenca;
  462 +
  463 + // Configura expectativa para o componente de id '2'
  464 + $componenteHoraFalta =
  465 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 4, 4), 'id', 'quantidade')) *
  466 + $this->_getConfigOption('curso', 'hora_falta');
  467 +
  468 + $componentePorcentagemFalta =
  469 + ($componenteHoraFalta / $componentes[1]['carga_horaria']) * 100;
  470 +
  471 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  472 +
  473 + $expected->componentesCurriculares[2] = new stdClass();
  474 + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO;
  475 + $expected->componentesCurriculares[2]->horasFaltas = $componenteHoraFalta;
  476 + $expected->componentesCurriculares[2]->porcentagemFalta = $componentePorcentagemFalta;
  477 + $expected->componentesCurriculares[2]->porcentagemPresenca = $componentePorcentagemPresenca;
  478 +
  479 + // Configura expectativa para o componente de id '3'
  480 + $componenteHoraFalta =
  481 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 8, 4), 'id', 'quantidade')) *
  482 + $this->_getConfigOption('curso', 'hora_falta');
  483 +
  484 + $componentePorcentagemFalta =
  485 + ($componenteHoraFalta / $componentes[2]['carga_horaria']) * 100;
  486 +
  487 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  488 +
  489 + $expected->componentesCurriculares[3] = new stdClass();
  490 + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;
  491 + $expected->componentesCurriculares[3]->horasFaltas = $componenteHoraFalta;
  492 + $expected->componentesCurriculares[3]->porcentagemFalta = $componentePorcentagemFalta;
  493 + $expected->componentesCurriculares[3]->porcentagemPresenca = $componentePorcentagemPresenca;
  494 +
  495 + // Configura expectativa para o componente de id '4'
  496 + $componenteHoraFalta =
  497 + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 12, 4), 'id', 'quantidade')) *
  498 + $this->_getConfigOption('curso', 'hora_falta');
  499 +
  500 + $componentePorcentagemFalta =
  501 + ($componenteHoraFalta / $componentes[3]['carga_horaria']) * 100;
  502 +
  503 + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta;
  504 +
  505 + $expected->componentesCurriculares[4] = new stdClass();
  506 + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO;
  507 + $expected->componentesCurriculares[4]->horasFaltas = $componenteHoraFalta;
  508 + $expected->componentesCurriculares[4]->porcentagemFalta = $componentePorcentagemFalta;
  509 + $expected->componentesCurriculares[4]->porcentagemPresenca = $componentePorcentagemPresenca;
  510 +
  511 + $service = $this->_getServiceInstance();
  512 +
  513 + $this->assertEquals($expected, $service->getSituacaoFaltas());
  514 + }
  515 +}
0 \ No newline at end of file 516 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteTest.php 0 → 100644
@@ -0,0 +1,291 @@ @@ -0,0 +1,291 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/FaltaCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_FaltaComponenteTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_FaltaComponenteTest extends Avaliacao_Service_FaltaCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE);
  50 + parent::setUp();
  51 + }
  52 +
  53 + protected function _getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim()
  54 + {
  55 + return new Avaliacao_Model_FaltaComponente(array(
  56 + 'componenteCurricular' => 1,
  57 + 'quantidade' => 5
  58 + ));
  59 + }
  60 +
  61 + protected function _getFaltaTestAdicionaFaltaNoBoletim()
  62 + {
  63 + return new Avaliacao_Model_FaltaComponente(array(
  64 + 'componenteCurricular' => 1,
  65 + 'quantidade' => 10
  66 + ));
  67 + }
  68 +
  69 + protected function _testAdicionaFaltaNoBoletimVerificaValidadores(Avaliacao_Model_FaltaAbstract $falta)
  70 + {
  71 + $this->assertEquals(1, $falta->get('componenteCurricular'));
  72 + $this->assertEquals(1, $falta->etapa);
  73 + $this->assertEquals(10, $falta->quantidade);
  74 +
  75 + $validators = $falta->getValidatorCollection();
  76 + $this->assertType('CoreExt_Validate_Choice', $validators['componenteCurricular']);
  77 + $this->assertType('CoreExt_Validate_Choice', $validators['etapa']);
  78 +
  79 + // Opções dos validadores
  80 +
  81 + // Componentes curriculares existentes para o aluno
  82 + $this->assertEquals(
  83 + array_keys($this->_getConfigOptions('componenteCurricular')),
  84 + array_values($validators['componenteCurricular']->getOption('choices'))
  85 + );
  86 +
  87 + // Etapas possíveis para o lançamento de nota
  88 + $this->assertEquals(
  89 + array_merge(range(1, count($this->_getConfigOptions('anoLetivoModulo'))), array('Rc')),
  90 + $validators['etapa']->getOption('choices')
  91 + );
  92 + }
  93 +
  94 + /**
  95 + * Testa o service adicionando faltas de apenas um componente curricular,
  96 + * para todas as etapas regulares (1 a 4).
  97 + */
  98 + public function testSalvarFaltasDeUmComponenteCurricularNoBoletim()
  99 + {
  100 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  101 +
  102 + $faltas = array(
  103 + new Avaliacao_Model_FaltaComponente(array(
  104 + 'componenteCurricular' => 1,
  105 + 'quantidade' => 7,
  106 + 'etapa' => 1
  107 + )),
  108 + new Avaliacao_Model_FaltaComponente(array(
  109 + 'componenteCurricular' => 1,
  110 + 'quantidade' => 9,
  111 + 'etapa' => 2
  112 + )),
  113 + new Avaliacao_Model_FaltaComponente(array(
  114 + 'componenteCurricular' => 1,
  115 + 'quantidade' => 8,
  116 + 'etapa' => 3
  117 + )),
  118 + new Avaliacao_Model_FaltaComponente(array(
  119 + 'componenteCurricular' => 1,
  120 + 'quantidade' => 8,
  121 + 'etapa' => 4
  122 + )),
  123 + );
  124 +
  125 + // Configura mock para Avaliacao_Model_FaltaComponenteDataMapper
  126 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper');
  127 +
  128 + $mock->expects($this->at(0))
  129 + ->method('findAll')
  130 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  131 + ->will($this->returnValue(array()));
  132 +
  133 + $mock->expects($this->at(1))
  134 + ->method('save')
  135 + ->with($faltas[0])
  136 + ->will($this->returnValue(TRUE));
  137 +
  138 + $mock->expects($this->at(2))
  139 + ->method('save')
  140 + ->with($faltas[1])
  141 + ->will($this->returnValue(TRUE));
  142 +
  143 + $mock->expects($this->at(3))
  144 + ->method('save')
  145 + ->with($faltas[2])
  146 + ->will($this->returnValue(TRUE));
  147 +
  148 + $mock->expects($this->at(4))
  149 + ->method('save')
  150 + ->with($faltas[3])
  151 + ->will($this->returnValue(TRUE));
  152 +
  153 + $this->_setFaltaAbstractDataMapperMock($mock);
  154 +
  155 + $service = $this->_getServiceInstance();
  156 +
  157 + $service->addFaltas($faltas);
  158 + $service->saveFaltas();
  159 + }
  160 +
  161 + /**
  162 + * Testa o service adicionando novas faltas para um componente curricular,
  163 + * que inclusive já tem a falta lançada para a segunda etapa.
  164 + */
  165 + public function testSalvasFaltasDeUmComponenteComEtapasLancadas()
  166 + {
  167 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  168 +
  169 + $faltas = array(
  170 + new Avaliacao_Model_FaltaComponente(array(
  171 + 'componenteCurricular' => 1,
  172 + 'quantidade' => 7,
  173 + 'etapa' => 2
  174 + )),
  175 + new Avaliacao_Model_FaltaComponente(array(
  176 + 'componenteCurricular' => 1,
  177 + 'quantidade' => 9,
  178 + 'etapa' => 3
  179 + ))
  180 + );
  181 +
  182 + $faltasPersistidas = array(
  183 + new Avaliacao_Model_FaltaComponente(array(
  184 + 'id' => 1,
  185 + 'faltaAluno' => $faltaAluno->id,
  186 + 'componenteCurricular' => 1,
  187 + 'quantidade' => 8,
  188 + 'etapa' => 1
  189 + )),
  190 + new Avaliacao_Model_FaltaComponente(array(
  191 + 'id' => 2,
  192 + 'faltaAluno' => $faltaAluno->id,
  193 + 'componenteCurricular' => 1,
  194 + 'quantidade' => 11,
  195 + 'etapa' => 2
  196 + ))
  197 + );
  198 +
  199 + // Configura mock para Avaliacao_Model_FaltaComponenteDataMapper
  200 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper');
  201 +
  202 + $mock->expects($this->at(0))
  203 + ->method('findAll')
  204 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  205 + ->will($this->returnValue($faltasPersistidas));
  206 +
  207 + $mock->expects($this->at(1))
  208 + ->method('save')
  209 + ->with($faltas[0])
  210 + ->will($this->returnValue(TRUE));
  211 +
  212 + $mock->expects($this->at(2))
  213 + ->method('save')
  214 + ->with($faltas[1])
  215 + ->will($this->returnValue(TRUE));
  216 +
  217 + $this->_setFaltaAbstractDataMapperMock($mock);
  218 +
  219 + $service = $this->_getServiceInstance();
  220 + $service->addFaltas($faltas);
  221 + $service->saveFaltas();
  222 + }
  223 +
  224 + public function testSalvasFaltasDeUmComponenteEAtualizadaEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas()
  225 + {
  226 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  227 +
  228 + $faltas = array(
  229 + new Avaliacao_Model_FaltaComponente(array(
  230 + 'componenteCurricular' => 1,
  231 + 'quantidade' => 7,
  232 + 'etapa' => 2
  233 + )),
  234 + // Etapa omitida, será atribuída a etapa '3'
  235 + new Avaliacao_Model_FaltaComponente(array(
  236 + 'componenteCurricular' => 1,
  237 + 'quantidade' => 9
  238 + ))
  239 + );
  240 +
  241 + $faltasPersistidas = array(
  242 + new Avaliacao_Model_FaltaComponente(array(
  243 + 'componenteCurricular' => 1,
  244 + 'id' => 1,
  245 + 'faltaAluno' => $faltaAluno->id,
  246 + 'quantidade' => 8,
  247 + 'etapa' => 1
  248 + )),
  249 + new Avaliacao_Model_FaltaComponente(array(
  250 + 'componenteCurricular' => 1,
  251 + 'id' => 2,
  252 + 'faltaAluno' => $faltaAluno->id,
  253 + 'quantidade' => 11,
  254 + 'etapa' => 2
  255 + ))
  256 + );
  257 +
  258 + // Configura mock para Avaliacao_Model_FaltaComponenteDataMapper
  259 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper');
  260 +
  261 + $mock->expects($this->at(0))
  262 + ->method('findAll')
  263 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  264 + ->will($this->returnValue($faltasPersistidas));
  265 +
  266 + $mock->expects($this->at(1))
  267 + ->method('save')
  268 + ->with($faltas[0])
  269 + ->will($this->returnValue(TRUE));
  270 +
  271 + $mock->expects($this->at(2))
  272 + ->method('save')
  273 + ->with($faltas[1])
  274 + ->will($this->returnValue(TRUE));
  275 +
  276 + $this->_setFaltaAbstractDataMapperMock($mock);
  277 +
  278 + $service = $this->_getServiceInstance();
  279 + $service->addFaltas($faltas);
  280 + $service->saveFaltas();
  281 +
  282 + $faltas = $service->getFaltas();
  283 +
  284 + $falta = array_shift($faltas);
  285 + $this->assertEquals(2, $falta->etapa);
  286 +
  287 + // Etapa atribuída automaticamente
  288 + $falta = array_shift($faltas);
  289 + $this->assertEquals(3, $falta->etapa);
  290 + }
  291 +}
0 \ No newline at end of file 292 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/FaltaGeralSituacaoTest.php 0 → 100644
@@ -0,0 +1,156 @@ @@ -0,0 +1,156 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/FaltaSituacaoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_FaltaGeralSituacaoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_FaltaGeralSituacaoTest extends Avaliacao_Service_FaltaSituacaoCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::GERAL);
  50 + parent::setUp();
  51 + }
  52 +
  53 + public function testSituacaoFaltasEmAndamento()
  54 + {
  55 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  56 + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, array());
  57 +
  58 + $expected = $this->_getExpectedSituacaoFaltas();
  59 +
  60 + // Configura a expectativa
  61 + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
  62 + $expected->porcentagemPresenca = 100;
  63 +
  64 + $service = $this->_getServiceInstance();
  65 +
  66 + $this->assertEquals($expected, $service->getSituacaoFaltas());
  67 + }
  68 +
  69 + public function testSituacaoFaltasAprovado()
  70 + {
  71 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  72 +
  73 + $faltas = array(
  74 + new Avaliacao_Model_FaltaGeral(array(
  75 + 'id' => 1,
  76 + 'quantidade' => 5,
  77 + 'etapa' => 1
  78 + )),
  79 + new Avaliacao_Model_FaltaGeral(array(
  80 + 'id' => 2,
  81 + 'quantidade' => 5,
  82 + 'etapa' => 2
  83 + )),
  84 + new Avaliacao_Model_FaltaGeral(array(
  85 + 'id' => 3,
  86 + 'quantidade' => 5,
  87 + 'etapa' => 3
  88 + )),
  89 + new Avaliacao_Model_FaltaGeral(array(
  90 + 'id' => 4,
  91 + 'quantidade' => 5,
  92 + 'etapa' => 4
  93 + )),
  94 + );
  95 +
  96 + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas);
  97 +
  98 + $expected = $this->_getExpectedSituacaoFaltas();
  99 +
  100 + // Configura a expectativa
  101 + $expected->situacao = App_Model_MatriculaSituacao::APROVADO;
  102 +
  103 + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade'));
  104 + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta');
  105 + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100);
  106 + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;
  107 +
  108 + $service = $this->_getServiceInstance();
  109 +
  110 + $this->assertEquals($expected, $service->getSituacaoFaltas());
  111 + }
  112 +
  113 + public function testSituacaoFaltasReprovado()
  114 + {
  115 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  116 +
  117 + $faltas = array(
  118 + new Avaliacao_Model_FaltaGeral(array(
  119 + 'id' => 1,
  120 + 'quantidade' => 180,
  121 + 'etapa' => 1
  122 + )),
  123 + new Avaliacao_Model_FaltaGeral(array(
  124 + 'id' => 2,
  125 + 'quantidade' => 180,
  126 + 'etapa' => 2
  127 + )),
  128 + new Avaliacao_Model_FaltaGeral(array(
  129 + 'id' => 3,
  130 + 'quantidade' => 180,
  131 + 'etapa' => 3
  132 + )),
  133 + new Avaliacao_Model_FaltaGeral(array(
  134 + 'id' => 4,
  135 + 'quantidade' => 180,
  136 + 'etapa' => 4
  137 + )),
  138 + );
  139 +
  140 + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas);
  141 +
  142 + $expected = $this->_getExpectedSituacaoFaltas();
  143 +
  144 + // Configura a expectativa
  145 + $expected->situacao = App_Model_MatriculaSituacao::REPROVADO;
  146 +
  147 + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade'));
  148 + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta');
  149 + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100);
  150 + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta;
  151 +
  152 + $service = $this->_getServiceInstance();
  153 +
  154 + $this->assertEquals($expected, $service->getSituacaoFaltas());
  155 + }
  156 +}
0 \ No newline at end of file 157 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/FaltaGeralTest.php 0 → 100644
@@ -0,0 +1,269 @@ @@ -0,0 +1,269 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/FaltaCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_FaltaGeralTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_FaltaGeralTest extends Avaliacao_Service_FaltaCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::GERAL);
  50 + parent::setUp();
  51 + }
  52 +
  53 + protected function _getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim()
  54 + {
  55 + return new Avaliacao_Model_FaltaGeral(array(
  56 + 'quantidade' => 10
  57 + ));
  58 + }
  59 +
  60 + protected function _getFaltaTestAdicionaFaltaNoBoletim()
  61 + {
  62 + return new Avaliacao_Model_FaltaComponente(array(
  63 + 'quantidade' => 10
  64 + ));
  65 + }
  66 +
  67 + protected function _testAdicionaFaltaNoBoletimVerificaValidadores(Avaliacao_Model_FaltaAbstract $falta)
  68 + {
  69 + $this->assertEquals(1, $falta->etapa);
  70 + $this->assertEquals(10, $falta->quantidade);
  71 +
  72 + $validators = $falta->getValidatorCollection();
  73 + $this->assertType('CoreExt_Validate_Choice', $validators['etapa']);
  74 + $this->assertFalse(isset($validators['componenteCurricular']));
  75 +
  76 + // Opções dos validadores
  77 +
  78 + // Etapas possíveis para o lançamento de nota
  79 + $this->assertEquals(
  80 + array_merge(range(1, count($this->_getConfigOptions('anoLetivoModulo'))), array('Rc')),
  81 + $validators['etapa']->getOption('choices')
  82 + );
  83 + }
  84 +
  85 + /**
  86 + * Testa o service adicionando faltas de apenas um componente curricular,
  87 + * para todas as etapas regulares (1 a 4).
  88 + */
  89 + public function testSalvarFaltasNoBoletim()
  90 + {
  91 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  92 +
  93 + $faltas = array(
  94 + new Avaliacao_Model_FaltaGeral(array(
  95 + 'quantidade' => 7,
  96 + 'etapa' => 1
  97 + )),
  98 + new Avaliacao_Model_FaltaGeral(array(
  99 + 'quantidade' => 11,
  100 + 'etapa' => 2
  101 + )),
  102 + new Avaliacao_Model_FaltaGeral(array(
  103 + 'quantidade' => 8,
  104 + 'etapa' => 3
  105 + )),
  106 + new Avaliacao_Model_FaltaGeral(array(
  107 + 'quantidade' => 8,
  108 + 'etapa' => 4
  109 + )),
  110 + );
  111 +
  112 + // Configura mock para Avaliacao_Model_FaltaGeralDataMapper
  113 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper');
  114 +
  115 + $mock->expects($this->at(0))
  116 + ->method('findAll')
  117 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  118 + ->will($this->returnValue(array()));
  119 +
  120 + $mock->expects($this->at(1))
  121 + ->method('save')
  122 + ->with($faltas[0])
  123 + ->will($this->returnValue(TRUE));
  124 +
  125 + $mock->expects($this->at(2))
  126 + ->method('save')
  127 + ->with($faltas[1])
  128 + ->will($this->returnValue(TRUE));
  129 +
  130 + $mock->expects($this->at(3))
  131 + ->method('save')
  132 + ->with($faltas[2])
  133 + ->will($this->returnValue(TRUE));
  134 +
  135 + $mock->expects($this->at(4))
  136 + ->method('save')
  137 + ->with($faltas[3])
  138 + ->will($this->returnValue(TRUE));
  139 +
  140 + $this->_setFaltaAbstractDataMapperMock($mock);
  141 +
  142 + $service = $this->_getServiceInstance();
  143 + $service->addFaltas($faltas);
  144 + $service->saveFaltas();
  145 + }
  146 +
  147 + /**
  148 + * Testa o service adicionando novas faltas para um componente curricular,
  149 + * que inclusive já tem a falta lançada para a segunda etapa.
  150 + */
  151 + public function testSalvasFaltasNoBoletimComEtapasLancadas()
  152 + {
  153 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  154 +
  155 + $faltas = array(
  156 + new Avaliacao_Model_FaltaGeral(array(
  157 + 'quantidade' => 7,
  158 + 'etapa' => 2
  159 + )),
  160 + new Avaliacao_Model_FaltaGeral(array(
  161 + 'quantidade' => 9,
  162 + 'etapa' => 3
  163 + ))
  164 + );
  165 +
  166 + $faltasPersistidas = array(
  167 + new Avaliacao_Model_FaltaGeral(array(
  168 + 'id' => 1,
  169 + 'faltaAluno' => $faltaAluno->id,
  170 + 'quantidade' => 8,
  171 + 'etapa' => 1
  172 + )),
  173 + new Avaliacao_Model_FaltaGeral(array(
  174 + 'id' => 2,
  175 + 'faltaAluno' => $faltaAluno->id,
  176 + 'quantidade' => 11,
  177 + 'etapa' => 2
  178 + ))
  179 + );
  180 +
  181 + // Configura mock para Avaliacao_Model_FaltaGeralDataMapper
  182 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper');
  183 +
  184 + $mock->expects($this->at(0))
  185 + ->method('findAll')
  186 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  187 + ->will($this->returnValue($faltasPersistidas));
  188 +
  189 + $mock->expects($this->at(1))
  190 + ->method('save')
  191 + ->with($faltas[0])
  192 + ->will($this->returnValue(TRUE));
  193 +
  194 + $mock->expects($this->at(2))
  195 + ->method('save')
  196 + ->with($faltas[1])
  197 + ->will($this->returnValue(TRUE));
  198 +
  199 + $this->_setFaltaAbstractDataMapperMock($mock);
  200 +
  201 + $service = $this->_getServiceInstance();
  202 + $service->addFaltas($faltas);
  203 + $service->saveFaltas();
  204 + }
  205 +
  206 + public function testSalvasFaltasAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas()
  207 + {
  208 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  209 +
  210 + $faltas = array(
  211 + new Avaliacao_Model_FaltaGeral(array(
  212 + 'quantidade' => 7,
  213 + 'etapa' => 2
  214 + )),
  215 + // Etapa omitida, será atribuída a etapa '3'
  216 + new Avaliacao_Model_FaltaGeral(array(
  217 + 'quantidade' => 9
  218 + ))
  219 + );
  220 +
  221 + $faltasPersistidas = array(
  222 + new Avaliacao_Model_FaltaGeral(array(
  223 + 'id' => 1,
  224 + 'faltaAluno' => $faltaAluno->id,
  225 + 'quantidade' => 8,
  226 + 'etapa' => 1
  227 + )),
  228 + new Avaliacao_Model_FaltaGeral(array(
  229 + 'id' => 2,
  230 + 'faltaAluno' => $faltaAluno->id,
  231 + 'quantidade' => 11,
  232 + 'etapa' => 2
  233 + ))
  234 + );
  235 +
  236 + // Configura mock para Avaliacao_Model_FaltaGeralDataMapper
  237 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper');
  238 +
  239 + $mock->expects($this->at(0))
  240 + ->method('findAll')
  241 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  242 + ->will($this->returnValue($faltasPersistidas));
  243 +
  244 + $mock->expects($this->at(1))
  245 + ->method('save')
  246 + ->with($faltas[0])
  247 + ->will($this->returnValue(TRUE));
  248 +
  249 + $mock->expects($this->at(2))
  250 + ->method('save')
  251 + ->with($faltas[1])
  252 + ->will($this->returnValue(TRUE));
  253 +
  254 + $this->_setFaltaAbstractDataMapperMock($mock);
  255 +
  256 + $service = $this->_getServiceInstance();
  257 + $service->addFaltas($faltas);
  258 + $service->saveFaltas();
  259 +
  260 + $faltas = $service->getFaltas();
  261 +
  262 + $falta = array_shift($faltas);
  263 + $this->assertEquals(2, $falta->etapa);
  264 +
  265 + // Etapa atribuída automaticamente
  266 + $falta = array_shift($faltas);
  267 + $this->assertEquals(3, $falta->etapa);
  268 + }
  269 +}
0 \ No newline at end of file 270 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/FaltaSituacaoCommon.php 0 → 100644
@@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_FaltaSituacaoCommon class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_FaltaSituacaoCommon extends Avaliacao_Service_TestCommon
  46 +{
  47 + protected function _setUpFaltaAbstractDataMapperMock(
  48 + Avaliacao_Model_FaltaAluno $faltaAluno, array $faltas)
  49 + {
  50 + // Configura mock para notas
  51 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAbstractDataMapper');
  52 +
  53 + $mock->expects($this->any())
  54 + ->method('findAll')
  55 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  56 + ->will($this->returnValue($faltas));
  57 +
  58 + $this->_setFaltaAbstractDataMapperMock($mock);
  59 + }
  60 +
  61 + protected function _getExpectedSituacaoFaltas()
  62 + {
  63 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  64 +
  65 + // Valores retornados pelas instâncias de classes legadas
  66 + $cursoHoraFalta = $this->_getConfigOption('curso', 'hora_falta');
  67 + $serieCargaHoraria = $this->_getConfigOption('serie', 'carga_horaria');
  68 +
  69 + // Porcentagem configurada na regra
  70 + $porcentagemPresenca = $this->_getRegraOption('porcentagemPresenca');
  71 +
  72 + $expected = new stdClass();
  73 + $expected->situacao = 0;
  74 + $expected->tipoFalta = 0;
  75 + $expected->cargaHoraria = 0;
  76 + $expected->cursoHoraFalta = 0;
  77 + $expected->totalFaltas = 0;
  78 + $expected->horasFaltas = 0;
  79 + $expected->porcentagemFalta = 0;
  80 + $expected->porcentagemPresenca = 0;
  81 + $expected->porcentagemPresencaRegra = 0;
  82 + $expected->componentesCurriculares = array();
  83 +
  84 + $expected->tipoFalta = $faltaAluno->get('tipoFalta');
  85 + $expected->cursoHoraFalta = $cursoHoraFalta;
  86 + $expected->porcentagemPresencaRegra = $porcentagemPresenca;
  87 + $expected->cargaHoraria = $serieCargaHoraria;
  88 +
  89 + return $expected;
  90 + }
  91 +}
0 \ No newline at end of file 92 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/InicializacaoTest.php 0 → 100644
@@ -0,0 +1,99 @@ @@ -0,0 +1,99 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_InicializacaoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_InicializacaoTest extends Avaliacao_Service_TestCommon
  46 +{
  47 + /**
  48 + * @expectedException CoreExt_Service_Exception
  49 + */
  50 + public function testInstanciaLancaExcecaoCasoCodigoDeMatriculaNaoSejaInformado()
  51 + {
  52 + new Avaliacao_Service_Boletim();
  53 + }
  54 +
  55 + /**
  56 + * @expectedException InvalidArgumentException
  57 + */
  58 + public function testInstanciaLancaExcecaoComOpcaoNaoAceitaPelaClasse()
  59 + {
  60 + new Avaliacao_Service_Boletim(array('matricula' => 1, 'foo' => 'bar'));
  61 + }
  62 +
  63 + public function testDadosDeMatriculaInicializados()
  64 + {
  65 + $service = $this->_getServiceInstance();
  66 + $options = $service->getOptions();
  67 +
  68 + $this->assertEquals($this->_getConfigOption('usuario', 'cod_usuario'),
  69 + $options['usuario']);
  70 +
  71 + $this->assertEquals($this->_getConfigOption('matricula', 'aprovado'),
  72 + $options['aprovado']);
  73 +
  74 + $this->assertEquals($this->_getConfigOption('curso', 'hora_falta'),
  75 + $options['cursoHoraFalta']);
  76 +
  77 + $this->assertEquals($this->_getConfigOption('curso', 'carga_horaria'),
  78 + $options['cursoCargaHoraria']);
  79 +
  80 + $this->assertEquals($this->_getConfigOption('serie', 'carga_horaria'),
  81 + $options['serieCargaHoraria']);
  82 +
  83 + $this->assertEquals(count($this->_getConfigOptions('anoLetivoModulo')),
  84 + $options['etapas']);
  85 +
  86 + $this->assertEquals($this->_getConfigOptions('componenteCurricular'),
  87 + $service->getComponentes());
  88 + }
  89 +
  90 + public function testInstanciaRegraDeAvaliacaoAtravesDeUmNumeroDeMatricula()
  91 + {
  92 + $service = $this->_getServiceInstance();
  93 + $this->assertType('RegraAvaliacao_Model_Regra', $service->getRegra());
  94 +
  95 + // TabelaArredondamento_Model_Tabela é recuperada através da instância de
  96 + // RegraAvaliacao_Model_Regra
  97 + $this->assertType('TabelaArredondamento_Model_Tabela', $service->getTabelaArredondamento());
  98 + }
  99 +}
0 \ No newline at end of file 100 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/NotaAlunoTest.php 0 → 100644
@@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +require_once 'Avaliacao/Model/NotaComponente.php';
  34 +
  35 +/**
  36 + * Avaliacao_Service_NotaAlunoTest class.
  37 + *
  38 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  39 + * @category i-Educar
  40 + * @license @@license@@
  41 + * @package Avaliacao
  42 + * @subpackage UnitTests
  43 + * @since Classe disponível desde a versão 1.1.0
  44 + * @version @@package_version@@
  45 + */
  46 +class Avaliacao_Service_NotaAlunoTest extends Avaliacao_Service_TestCommon
  47 +{
  48 + public function testCriaNovaInstanciaDeNotaAluno()
  49 + {
  50 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  51 + $notaSave = clone $notaAluno;
  52 + $notaSave->id = NULL;
  53 +
  54 + // Configura mock para Avaliacao_Model_NotaAlunoDataMapper
  55 + $mock = $this->getCleanMock('Avaliacao_Model_NotaAlunoDataMapper');
  56 + $mock->expects($this->at(0))
  57 + ->method('findAll')
  58 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  59 + ->will($this->returnValue(array()));
  60 +
  61 + $mock->expects($this->at(1))
  62 + ->method('save')
  63 + ->with($notaSave)
  64 + ->will($this->returnValue(TRUE));
  65 +
  66 + $mock->expects($this->at(2))
  67 + ->method('findAll')
  68 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  69 + ->will($this->returnValue(array($notaAluno)));
  70 +
  71 + $this->_setNotaAlunoDataMapperMock($mock);
  72 +
  73 + $service = $this->_getServiceInstance();
  74 + }
  75 +}
0 \ No newline at end of file 76 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/NotaConceitualSituacaoTest.php 0 → 100644
@@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/NotaSituacaoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_NotaConceitualSituacaoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_NotaConceitualSituacaoTest extends Avaliacao_Service_NotaSituacaoCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('tipoNota', RegraAvaliacao_Model_Nota_TipoValor::CONCEITUAL);
  50 + parent::setUp();
  51 + }
  52 +}
0 \ No newline at end of file 53 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/NotaNumericaSituacaoTest.php 0 → 100644
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/NotaSituacaoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_NotaNumericaSituacaoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_NotaNumericaSituacaoTest extends Avaliacao_Service_NotaSituacaoCommon
  46 +{
  47 +}
0 \ No newline at end of file 48 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/NotaRecuperacaoTest.php 0 → 100644
@@ -0,0 +1,250 @@ @@ -0,0 +1,250 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_NotaRecuperacaoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_NotaRecuperacaoTest extends Avaliacao_Service_TestCommon
  46 +{
  47 + public function testSalvarNotasDeUmComponenteCurricularNoBoletimEmRecuperacao()
  48 + {
  49 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  50 +
  51 + $notas = array(
  52 + new Avaliacao_Model_NotaComponente(array(
  53 + 'componenteCurricular' => 1,
  54 + 'nota' => 5,
  55 + 'etapa' => 1
  56 + )),
  57 + new Avaliacao_Model_NotaComponente(array(
  58 + 'componenteCurricular' => 1,
  59 + 'nota' => 5,
  60 + 'etapa' => 2
  61 + )),
  62 + new Avaliacao_Model_NotaComponente(array(
  63 + 'componenteCurricular' => 1,
  64 + 'nota' => 6,
  65 + 'etapa' => 3
  66 + )),
  67 + new Avaliacao_Model_NotaComponente(array(
  68 + 'componenteCurricular' => 1,
  69 + 'nota' => 6,
  70 + 'etapa' => 4
  71 + )),
  72 + new Avaliacao_Model_NotaComponente(array(
  73 + 'componenteCurricular' => 1,
  74 + 'nota' => 6,
  75 + 'etapa' => 'Rc'
  76 + )),
  77 + );
  78 +
  79 + $media = new Avaliacao_Model_NotaComponenteMedia(array(
  80 + 'notaAluno' => $notaAluno->id,
  81 + 'componenteCurricular' => 1,
  82 + 'media' => 5.7,
  83 + 'mediaArredondada' => 5,
  84 + 'etapa' => 'Rc'
  85 + ));
  86 +
  87 + $media->markOld();
  88 +
  89 + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper
  90 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper');
  91 +
  92 + $mock->expects($this->at(0))
  93 + ->method('findAll')
  94 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  95 + ->will($this->returnValue(array()));
  96 +
  97 + $mock->expects($this->at(1))
  98 + ->method('save')
  99 + ->with($notas[0])
  100 + ->will($this->returnValue(TRUE));
  101 +
  102 + $mock->expects($this->at(2))
  103 + ->method('save')
  104 + ->with($notas[1])
  105 + ->will($this->returnValue(TRUE));
  106 +
  107 + $mock->expects($this->at(3))
  108 + ->method('save')
  109 + ->with($notas[2])
  110 + ->will($this->returnValue(TRUE));
  111 +
  112 + $mock->expects($this->at(4))
  113 + ->method('save')
  114 + ->with($notas[3])
  115 + ->will($this->returnValue(TRUE));
  116 +
  117 + $mock->expects($this->at(5))
  118 + ->method('save')
  119 + ->with($notas[4])
  120 + ->will($this->returnValue(TRUE));
  121 +
  122 + $mock->expects($this->at(6))
  123 + ->method('findAll')
  124 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  125 + ->will($this->returnValue($notas));
  126 +
  127 + $this->_setNotaComponenteDataMapperMock($mock);
  128 +
  129 + // Configura mock para Avaliacao_Model_NotaComponenteMediaDataMapper
  130 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');
  131 +
  132 + $mock->expects($this->at(0))
  133 + ->method('findAll')
  134 + ->with(array(), array('notaAluno' => $notaAluno->id))
  135 + ->will($this->returnValue(array()));
  136 +
  137 + $mock->expects($this->at(1))
  138 + ->method('find')
  139 + ->with(array($notaAluno->id, $this->_getConfigOption('matricula', 'cod_matricula')))
  140 + ->will($this->returnValue(array()));
  141 +
  142 + $mock->expects($this->at(2))
  143 + ->method('save')
  144 + ->with($media)
  145 + ->will($this->returnValue(TRUE));
  146 +
  147 + $this->_setNotaComponenteMediaDataMapperMock($mock);
  148 +
  149 + $service = $this->_getServiceInstance();
  150 + $service->addNotas($notas);
  151 + $service->saveNotas();
  152 +
  153 + $notasSalvas = $service->getNotas();
  154 +
  155 + $etapas = array_merge(
  156 + range(1, count($this->_getConfigOptions('anoLetivoModulo'))),
  157 + array('Rc')
  158 + );
  159 +
  160 + foreach ($notasSalvas as $notaSalva) {
  161 + $key = array_search($notaSalva->etapa, $etapas, FALSE);
  162 + $this->assertTrue($key !== FALSE);
  163 + unset($etapas[$key]);
  164 + }
  165 + }
  166 +
  167 + public function testSalvarNotasDeUmComponenteCurricularNoBoletimEmRecuperacaoComNotasLancadas()
  168 + {
  169 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  170 +
  171 + $notas = array(
  172 + new Avaliacao_Model_NotaComponente(array(
  173 + 'componenteCurricular' => 1,
  174 + 'nota' => 5,
  175 + ))
  176 + );
  177 +
  178 + $notasPersistidas = array(
  179 + new Avaliacao_Model_NotaComponente(array(
  180 + 'id' => 1,
  181 + 'notaAluno' => $notaAluno->id,
  182 + 'componenteCurricular' => 1,
  183 + 'nota' => 6,
  184 + 'notaArredondada' => 6,
  185 + 'etapa' => 1
  186 + )),
  187 + new Avaliacao_Model_NotaComponente(array(
  188 + 'id' => 2,
  189 + 'notaAluno' => $notaAluno->id,
  190 + 'componenteCurricular' => 1,
  191 + 'nota' => 6,
  192 + 'notaArredondada' => 6,
  193 + 'etapa' => 2
  194 + )),
  195 + new Avaliacao_Model_NotaComponente(array(
  196 + 'id' => 3,
  197 + 'notaAluno' => $notaAluno->id,
  198 + 'componenteCurricular' => 1,
  199 + 'nota' => 6,
  200 + 'notaArredondada' => 6,
  201 + 'etapa' => 3
  202 + )),
  203 + new Avaliacao_Model_NotaComponente(array(
  204 + 'id' => 4,
  205 + 'notaAluno' => $notaAluno->id,
  206 + 'componenteCurricular' => 1,
  207 + 'nota' => 6,
  208 + 'notaArredondada' => 6,
  209 + 'etapa' => 4
  210 + ))
  211 + );
  212 +
  213 + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper
  214 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper');
  215 +
  216 + $mock->expects($this->at(0))
  217 + ->method('findAll')
  218 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  219 + ->will($this->returnValue($notasPersistidas));
  220 +
  221 + $mock->expects($this->at(1))
  222 + ->method('save')
  223 + ->with($notas[0])
  224 + ->will($this->returnValue(TRUE));
  225 +
  226 + $notasSalvas = array_merge($notasPersistidas, $notas);
  227 +
  228 + $mock->expects($this->at(2))
  229 + ->method('findAll')
  230 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  231 + ->will($this->returnValue($notasSalvas));
  232 +
  233 + $this->_setNotaComponenteDataMapperMock($mock);
  234 +
  235 + $service = $this->_getServiceInstance();
  236 + $service->addNotas($notas);
  237 + $service->saveNotas();
  238 +
  239 + $etapas = array_merge(
  240 + range(1, count($this->_getConfigOptions('anoLetivoModulo'))),
  241 + array('Rc')
  242 + );
  243 +
  244 + foreach ($notasSalvas as $notaSalva) {
  245 + $key = array_search($notaSalva->etapa, $etapas, FALSE);
  246 + $this->assertTrue($key !== FALSE);
  247 + unset($etapas[$key]);
  248 + }
  249 + }
  250 +}
0 \ No newline at end of file 251 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/NotaSituacaoCommon.php 0 → 100644
@@ -0,0 +1,436 @@ @@ -0,0 +1,436 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_NotaSituacaoCommon abstract class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +abstract class Avaliacao_Service_NotaSituacaoCommon extends Avaliacao_Service_TestCommon
  46 +{
  47 + protected function _setUpNotaComponenteMediaDataMapperMock(
  48 + Avaliacao_Model_NotaAluno $notaAluno, array $medias)
  49 + {
  50 + // Configura mock para notas
  51 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');
  52 +
  53 + $mock->expects($this->any())
  54 + ->method('findAll')
  55 + ->with(array(), array('notaAluno' => $notaAluno->id))
  56 + ->will($this->returnValue($medias));
  57 +
  58 + $this->_setNotaComponenteMediaDataMapperMock($mock);
  59 + }
  60 +
  61 + /**
  62 + * Nenhuma média lançada, óbvio que está em andamento.
  63 + */
  64 + public function testSituacaoComponentesCurricularesEmAndamento()
  65 + {
  66 + // Expectativa
  67 + $expected = new stdClass();
  68 + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
  69 + $expected->componentesCurriculares = array();
  70 +
  71 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  72 +
  73 + // Nenhuma média lançada
  74 + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, array());
  75 +
  76 + $service = $this->_getServiceInstance();
  77 +
  78 + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares());
  79 + }
  80 +
  81 + /**
  82 + * Um componente em exame, já que por padrão a regra de avaliação define uma
  83 + * fórmula de recuperação.
  84 + */
  85 + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotais()
  86 + {
  87 + // Expectativa
  88 + $expected = new stdClass();
  89 + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
  90 + $expected->componentesCurriculares = array();
  91 +
  92 + // Matemática estará em exame
  93 + $expected->componentesCurriculares[1] = new stdClass();
  94 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  95 +
  96 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  97 +
  98 + // Nenhuma média lançada
  99 + $medias = array(
  100 + 1 => new Avaliacao_Model_NotaComponenteMedia(array(
  101 + 'notaAluno' => $notaAluno->id,
  102 + 'componenteCurricular' => 1,
  103 + 'media' => 5,
  104 + 'mediaArredondada' => 5,
  105 + 'etapa' => 4
  106 + ))
  107 + );
  108 +
  109 + // Configura mock para notas
  110 + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias);
  111 +
  112 + $service = $this->_getServiceInstance();
  113 +
  114 + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares());
  115 + }
  116 +
  117 + /**
  118 + * Um componente em exame, já que por padrão a regra de avaliação define uma
  119 + * fórmula de recuperação. Quatro médias lançadas, 3 aprovadas.
  120 + */
  121 + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosAprovados()
  122 + {
  123 + // Expectativa
  124 + $expected = new stdClass();
  125 + $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  126 + $expected->componentesCurriculares = array();
  127 +
  128 + // Matemática estará em exame
  129 + $expected->componentesCurriculares[1] = new stdClass();
  130 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  131 +
  132 + $expected->componentesCurriculares[2] = new stdClass();
  133 + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO;
  134 +
  135 + $expected->componentesCurriculares[3] = new stdClass();
  136 + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;
  137 +
  138 + $expected->componentesCurriculares[4] = new stdClass();
  139 + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO;
  140 +
  141 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  142 +
  143 + // Nenhuma média lançada
  144 + $medias = array(
  145 + new Avaliacao_Model_NotaComponenteMedia(array(
  146 + 'notaAluno' => $notaAluno->id,
  147 + 'componenteCurricular' => 1,
  148 + 'media' => 5,
  149 + 'mediaArredondada' => 5,
  150 + 'etapa' => 4
  151 + )),
  152 + new Avaliacao_Model_NotaComponenteMedia(array(
  153 + 'notaAluno' => $notaAluno->id,
  154 + 'componenteCurricular' => 2,
  155 + 'media' => 6,
  156 + 'mediaArredondada' => 6,
  157 + 'etapa' => 4
  158 + )),
  159 + new Avaliacao_Model_NotaComponenteMedia(array(
  160 + 'notaAluno' => $notaAluno->id,
  161 + 'componenteCurricular' => 3,
  162 + 'media' => 6,
  163 + 'mediaArredondada' => 6,
  164 + 'etapa' => 4
  165 + )),
  166 + new Avaliacao_Model_NotaComponenteMedia(array(
  167 + 'notaAluno' => $notaAluno->id,
  168 + 'componenteCurricular' => 4,
  169 + 'media' => 6,
  170 + 'mediaArredondada' => 6,
  171 + 'etapa' => 4
  172 + ))
  173 + );
  174 +
  175 + // Configura mock para notas
  176 + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias);
  177 +
  178 + $service = $this->_getServiceInstance();
  179 +
  180 + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares());
  181 + }
  182 +
  183 + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosDoisAprovadosUmAndamento()
  184 + {
  185 + // Expectativa
  186 + $expected = new stdClass();
  187 + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
  188 + $expected->componentesCurriculares = array();
  189 +
  190 + // Matemática estará em exame
  191 + $expected->componentesCurriculares[1] = new stdClass();
  192 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  193 +
  194 + $expected->componentesCurriculares[2] = new stdClass();
  195 + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO;
  196 +
  197 + $expected->componentesCurriculares[3] = new stdClass();
  198 + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;
  199 +
  200 + $expected->componentesCurriculares[4] = new stdClass();
  201 + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO;
  202 +
  203 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  204 +
  205 + // Nenhuma média lançada
  206 + $medias = array(
  207 + new Avaliacao_Model_NotaComponenteMedia(array(
  208 + 'notaAluno' => $notaAluno->id,
  209 + 'componenteCurricular' => 1,
  210 + 'media' => 5,
  211 + 'mediaArredondada' => 5,
  212 + 'etapa' => 4
  213 + )),
  214 + new Avaliacao_Model_NotaComponenteMedia(array(
  215 + 'notaAluno' => $notaAluno->id,
  216 + 'componenteCurricular' => 2,
  217 + 'media' => 5.75,
  218 + 'mediaArredondada' => 5,
  219 + 'etapa' => 3
  220 + )),
  221 + new Avaliacao_Model_NotaComponenteMedia(array(
  222 + 'notaAluno' => $notaAluno->id,
  223 + 'componenteCurricular' => 3,
  224 + 'media' => 6,
  225 + 'mediaArredondada' => 6,
  226 + 'etapa' => 4
  227 + )),
  228 + new Avaliacao_Model_NotaComponenteMedia(array(
  229 + 'notaAluno' => $notaAluno->id,
  230 + 'componenteCurricular' => 4,
  231 + 'media' => 6,
  232 + 'mediaArredondada' => 6,
  233 + 'etapa' => 4
  234 + ))
  235 + );
  236 +
  237 + // Configura mock para notas
  238 + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias);
  239 +
  240 + $service = $this->_getServiceInstance();
  241 +
  242 + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares());
  243 + }
  244 +
  245 + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosUmAprovadoAposExameEDoisAprovados()
  246 + {
  247 + // Expectativa
  248 + $expected = new stdClass();
  249 + $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  250 + $expected->componentesCurriculares = array();
  251 +
  252 + // Matemática estará em exame
  253 + $expected->componentesCurriculares[1] = new stdClass();
  254 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  255 +
  256 + $expected->componentesCurriculares[2] = new stdClass();
  257 + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME;
  258 +
  259 + $expected->componentesCurriculares[3] = new stdClass();
  260 + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;
  261 +
  262 + $expected->componentesCurriculares[4] = new stdClass();
  263 + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO;
  264 +
  265 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  266 +
  267 + // Nenhuma média lançada
  268 + $medias = array(
  269 + new Avaliacao_Model_NotaComponenteMedia(array(
  270 + 'notaAluno' => $notaAluno->id,
  271 + 'componenteCurricular' => 1,
  272 + 'media' => 5,
  273 + 'mediaArredondada' => 5,
  274 + 'etapa' => 4
  275 + )),
  276 + new Avaliacao_Model_NotaComponenteMedia(array(
  277 + 'notaAluno' => $notaAluno->id,
  278 + 'componenteCurricular' => 2,
  279 + 'media' => 6.5,
  280 + 'mediaArredondada' => 6,
  281 + 'etapa' => 'Rc'
  282 + )),
  283 + new Avaliacao_Model_NotaComponenteMedia(array(
  284 + 'notaAluno' => $notaAluno->id,
  285 + 'componenteCurricular' => 3,
  286 + 'media' => 6,
  287 + 'mediaArredondada' => 6,
  288 + 'etapa' => 4
  289 + )),
  290 + new Avaliacao_Model_NotaComponenteMedia(array(
  291 + 'notaAluno' => $notaAluno->id,
  292 + 'componenteCurricular' => 4,
  293 + 'media' => 6,
  294 + 'mediaArredondada' => 6,
  295 + 'etapa' => 4
  296 + ))
  297 + );
  298 +
  299 + // Configura mock para notas
  300 + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias);
  301 +
  302 + $service = $this->_getServiceInstance();
  303 +
  304 + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares());
  305 + }
  306 +
  307 + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosUmAprovadoAposExameUmReprovadoEOutroAprovado()
  308 + {
  309 + // Expectativa
  310 + $expected = new stdClass();
  311 + $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  312 + $expected->componentesCurriculares = array();
  313 +
  314 + // Matemática estará em exame
  315 + $expected->componentesCurriculares[1] = new stdClass();
  316 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME;
  317 +
  318 + $expected->componentesCurriculares[2] = new stdClass();
  319 + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME;
  320 +
  321 + $expected->componentesCurriculares[3] = new stdClass();
  322 + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::REPROVADO;
  323 +
  324 + $expected->componentesCurriculares[4] = new stdClass();
  325 + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO;
  326 +
  327 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  328 +
  329 + // Nenhuma média lançada
  330 + $medias = array(
  331 + new Avaliacao_Model_NotaComponenteMedia(array(
  332 + 'notaAluno' => $notaAluno->id,
  333 + 'componenteCurricular' => 1,
  334 + 'media' => 5,
  335 + 'mediaArredondada' => 5,
  336 + 'etapa' => 4
  337 + )),
  338 + new Avaliacao_Model_NotaComponenteMedia(array(
  339 + 'notaAluno' => $notaAluno->id,
  340 + 'componenteCurricular' => 2,
  341 + 'media' => 6.5,
  342 + 'mediaArredondada' => 6,
  343 + 'etapa' => 'Rc'
  344 + )),
  345 + new Avaliacao_Model_NotaComponenteMedia(array(
  346 + 'notaAluno' => $notaAluno->id,
  347 + 'componenteCurricular' => 3,
  348 + 'media' => 5,
  349 + 'mediaArredondada' => 5,
  350 + 'etapa' => 'Rc'
  351 + )),
  352 + new Avaliacao_Model_NotaComponenteMedia(array(
  353 + 'notaAluno' => $notaAluno->id,
  354 + 'componenteCurricular' => 4,
  355 + 'media' => 6,
  356 + 'mediaArredondada' => 6,
  357 + 'etapa' => 4
  358 + ))
  359 + );
  360 +
  361 + // Configura mock para notas
  362 + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias);
  363 +
  364 + $service = $this->_getServiceInstance();
  365 +
  366 + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares());
  367 + }
  368 +
  369 +/**
  370 + * Um componente reprovado, com uma regra sem recuperação. Quatro médias
  371 + * lançadas, 3 aprovadas.
  372 + */
  373 + public function testSituacaoComponentesCurricularesUmComponenteLancadoReprovadoUmComponenteAbaixoDaMedia()
  374 + {
  375 + $this->_setRegraOption('formulaRecuperacao', NULL);
  376 +
  377 + // Expectativa
  378 + $expected = new stdClass();
  379 + $expected->situacao = App_Model_MatriculaSituacao::REPROVADO;
  380 + $expected->componentesCurriculares = array();
  381 +
  382 + // Matemática estará em exame
  383 + $expected->componentesCurriculares[1] = new stdClass();
  384 + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO;
  385 +
  386 + $expected->componentesCurriculares[2] = new stdClass();
  387 + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO;
  388 +
  389 + $expected->componentesCurriculares[3] = new stdClass();
  390 + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO;
  391 +
  392 + $expected->componentesCurriculares[4] = new stdClass();
  393 + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO;
  394 +
  395 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  396 +
  397 + // Nenhuma média lançada
  398 + $medias = array(
  399 + new Avaliacao_Model_NotaComponenteMedia(array(
  400 + 'notaAluno' => $notaAluno->id,
  401 + 'componenteCurricular' => 1,
  402 + 'media' => 5,
  403 + 'mediaArredondada' => 5,
  404 + 'etapa' => 4
  405 + )),
  406 + new Avaliacao_Model_NotaComponenteMedia(array(
  407 + 'notaAluno' => $notaAluno->id,
  408 + 'componenteCurricular' => 2,
  409 + 'media' => 6,
  410 + 'mediaArredondada' => 6,
  411 + 'etapa' => 4
  412 + )),
  413 + new Avaliacao_Model_NotaComponenteMedia(array(
  414 + 'notaAluno' => $notaAluno->id,
  415 + 'componenteCurricular' => 3,
  416 + 'media' => 6,
  417 + 'mediaArredondada' => 6,
  418 + 'etapa' => 4
  419 + )),
  420 + new Avaliacao_Model_NotaComponenteMedia(array(
  421 + 'notaAluno' => $notaAluno->id,
  422 + 'componenteCurricular' => 4,
  423 + 'media' => 6,
  424 + 'mediaArredondada' => 6,
  425 + 'etapa' => 4
  426 + ))
  427 + );
  428 +
  429 + // Configura mock para notas
  430 + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias);
  431 +
  432 + $service = $this->_getServiceInstance();
  433 +
  434 + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares());
  435 + }
  436 +}
0 \ No newline at end of file 437 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/NotaTest.php 0 → 100644
@@ -0,0 +1,323 @@ @@ -0,0 +1,323 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +require_once 'Avaliacao/Model/NotaComponente.php';
  34 +
  35 +/**
  36 + * Avaliacao_Service_NotaTest class.
  37 + *
  38 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  39 + * @category i-Educar
  40 + * @license @@license@@
  41 + * @package Avaliacao
  42 + * @subpackage UnitTests
  43 + * @since Classe disponível desde a versão 1.1.0
  44 + * @version @@package_version@@
  45 + */
  46 +class Avaliacao_Service_NotaTest extends Avaliacao_Service_TestCommon
  47 +{
  48 + public function testInstanciaDeNotaComponenteERegistradaApenasUmaVezNoBoletiom()
  49 + {
  50 + $service = $this->_getServiceInstance();
  51 +
  52 + $nota = new Avaliacao_Model_NotaComponente(array(
  53 + 'componenteCurricular' => 1,
  54 + 'nota' => 5
  55 + ));
  56 +
  57 + // Atribuição simples
  58 + $service->addNota($nota)
  59 + ->addNota($nota);
  60 +
  61 + $this->assertEquals(1, count($service->getNotas()));
  62 +
  63 + // Via atribuição em lote
  64 + $nota = clone $nota;
  65 + $service->addNotas(array($nota, $nota, $nota));
  66 +
  67 + $this->assertEquals(2, count($service->getNotas()));
  68 + }
  69 +
  70 + public function testAdicionaNotaNoBoletim()
  71 + {
  72 + $service = $this->_getServiceInstance();
  73 +
  74 + $nota = new Avaliacao_Model_NotaComponente(array(
  75 + 'componenteCurricular' => 1,
  76 + 'nota' => 5.72
  77 + ));
  78 +
  79 + $notaOriginal = clone $nota;
  80 + $service->addNota($nota);
  81 +
  82 + $notas = $service->getNotas();
  83 + $serviceNota = array_shift($notas);
  84 +
  85 + // Valores declarados explicitamente, verificação explícita
  86 + $this->assertEquals($notaOriginal->nota, $serviceNota->nota);
  87 + $this->assertEquals($notaOriginal->get('componenteCurricular'), $serviceNota->get('componenteCurricular'));
  88 +
  89 + // Valores populados pelo service
  90 + $this->assertNotEquals($notaOriginal->etapa, $serviceNota->etapa);
  91 + $this->assertEquals(1, $serviceNota->etapa);
  92 + $this->assertEquals(5, $serviceNota->notaArredondada);
  93 +
  94 + // Validadores injetados no objeto
  95 + $validators = $serviceNota->getValidatorCollection();
  96 + $this->assertType('CoreExt_Validate_Choice', $validators['componenteCurricular']);
  97 + $this->assertType('CoreExt_Validate_Choice', $validators['etapa']);
  98 +
  99 + // Opções dos validadores
  100 +
  101 + // Componentes curriculares existentes para o aluno
  102 + $this->assertEquals(
  103 + array_keys($this->_getConfigOptions('componenteCurricular')),
  104 + array_values($validators['componenteCurricular']->getOption('choices'))
  105 + );
  106 +
  107 + // Etapas possíveis para o lançamento de nota
  108 + $this->assertEquals(
  109 + array_merge(range(1, count($this->_getConfigOptions('anoLetivoModulo'))), array('Rc')),
  110 + $validators['etapa']->getOption('choices')
  111 + );
  112 + }
  113 +
  114 + /**
  115 + * Testa o service adicionando notas de apenas um componente curricular,
  116 + * para todas as etapas regulares (1 a 4).
  117 + */
  118 + public function testSalvarNotasDeUmComponenteCurricularNoBoletim()
  119 + {
  120 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  121 +
  122 + $notas = array(
  123 + new Avaliacao_Model_NotaComponente(array(
  124 + 'componenteCurricular' => 1,
  125 + 'nota' => 7.25,
  126 + 'etapa' => 1
  127 + )),
  128 + new Avaliacao_Model_NotaComponente(array(
  129 + 'componenteCurricular' => 1,
  130 + 'nota' => 9.25,
  131 + 'etapa' => 2
  132 + )),
  133 + new Avaliacao_Model_NotaComponente(array(
  134 + 'componenteCurricular' => 1,
  135 + 'nota' => 8,
  136 + 'etapa' => 3
  137 + )),
  138 + new Avaliacao_Model_NotaComponente(array(
  139 + 'componenteCurricular' => 1,
  140 + 'nota' => 8.5,
  141 + 'etapa' => 4
  142 + )),
  143 + );
  144 +
  145 + $media = new Avaliacao_Model_NotaComponenteMedia(array(
  146 + 'notaAluno' => $notaAluno->id,
  147 + 'componenteCurricular' => 1,
  148 + 'media' => 8.25,
  149 + 'mediaArredondada' => 8,
  150 + 'etapa' => 4
  151 + ));
  152 +
  153 + $media->markOld();
  154 +
  155 + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper
  156 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper');
  157 +
  158 + $mock->expects($this->at(0))
  159 + ->method('findAll')
  160 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  161 + ->will($this->returnValue(array()));
  162 +
  163 + $mock->expects($this->at(1))
  164 + ->method('save')
  165 + ->with($notas[0])
  166 + ->will($this->returnValue(TRUE));
  167 +
  168 + $mock->expects($this->at(2))
  169 + ->method('save')
  170 + ->with($notas[1])
  171 + ->will($this->returnValue(TRUE));
  172 +
  173 + $mock->expects($this->at(3))
  174 + ->method('save')
  175 + ->with($notas[2])
  176 + ->will($this->returnValue(TRUE));
  177 +
  178 + $mock->expects($this->at(4))
  179 + ->method('save')
  180 + ->with($notas[3])
  181 + ->will($this->returnValue(TRUE));
  182 +
  183 + $mock->expects($this->at(5))
  184 + ->method('findAll')
  185 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  186 + ->will($this->returnValue($notas));
  187 +
  188 + $this->_setNotaComponenteDataMapperMock($mock);
  189 +
  190 + // Configura mock para Avaliacao_Model_NotaComponenteMediaDataMapper
  191 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');
  192 +
  193 + $mock->expects($this->at(0))
  194 + ->method('findAll')
  195 + ->with(array(), array('notaAluno' => $notaAluno->id))
  196 + ->will($this->returnValue(array()));
  197 +
  198 + $mock->expects($this->at(1))
  199 + ->method('find')
  200 + ->with(array($notaAluno->id, $this->_getConfigOption('matricula', 'cod_matricula')))
  201 + ->will($this->returnValue(NULL));
  202 +
  203 + $mock->expects($this->at(2))
  204 + ->method('save')
  205 + ->with($media)
  206 + ->will($this->returnValue(TRUE));
  207 +
  208 + $this->_setNotaComponenteMediaDataMapperMock($mock);
  209 +
  210 + $service = $this->_getServiceInstance();
  211 +
  212 + $service->addNotas($notas);
  213 + $service->saveNotas();
  214 + }
  215 +
  216 + /**
  217 + * Testa o service adicionando novas notas para um componente curricular,
  218 + * que inclusive já tem a nota lançada para a segunda etapa.
  219 + */
  220 + public function testSalvasNotasDeUmComponenteComEtapasLancadas()
  221 + {
  222 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  223 +
  224 + $notas = array(
  225 + new Avaliacao_Model_NotaComponente(array(
  226 + 'componenteCurricular' => 1,
  227 + 'nota' => 7.25,
  228 + 'etapa' => 2
  229 + )),
  230 + new Avaliacao_Model_NotaComponente(array(
  231 + 'componenteCurricular' => 1,
  232 + 'nota' => 9.25,
  233 + 'etapa' => 3
  234 + ))
  235 + );
  236 +
  237 + $notasPersistidas = array(
  238 + new Avaliacao_Model_NotaComponente(array(
  239 + 'id' => 1,
  240 + 'notaAluno' => $notaAluno->id,
  241 + 'componenteCurricular' => 1,
  242 + 'nota' => 8.25,
  243 + 'notaArredondada' => 8,
  244 + 'etapa' => 1
  245 + )),
  246 + new Avaliacao_Model_NotaComponente(array(
  247 + 'id' => 2,
  248 + 'notaAluno' => $notaAluno->id,
  249 + 'componenteCurricular' => 1,
  250 + 'nota' => 9.5,
  251 + 'notaArredondada' => 9,
  252 + 'etapa' => 2
  253 + ))
  254 + );
  255 +
  256 + $mediasPersistidas = array(
  257 + new Avaliacao_Model_NotaComponenteMedia(array(
  258 + 'notaAluno' => $notaAluno->id,
  259 + 'componenteCurricular' => 1,
  260 + 'media' => 4.4375,
  261 + 'mediaArredondada' => 4,
  262 + 'etapa' => 2
  263 + ))
  264 + );
  265 +
  266 + $mediasPersistidas[0]->markOld();
  267 +
  268 + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper
  269 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper');
  270 +
  271 + $mock->expects($this->at(0))
  272 + ->method('findAll')
  273 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  274 + ->will($this->returnValue($notasPersistidas));
  275 +
  276 + $mock->expects($this->at(1))
  277 + ->method('save')
  278 + ->with($notas[0])
  279 + ->will($this->returnValue(TRUE));
  280 +
  281 + $mock->expects($this->at(2))
  282 + ->method('save')
  283 + ->with($notas[1])
  284 + ->will($this->returnValue(TRUE));
  285 +
  286 + $mock->expects($this->at(3))
  287 + ->method('findAll')
  288 + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC'))
  289 + ->will($this->returnValue(array($notasPersistidas[0], $notas[0], $notas[1])));
  290 +
  291 + $this->_setNotaComponenteDataMapperMock($mock);
  292 +
  293 + // Configura mock para Avaliacao_Model_NotaComponenteMediaDataMapper
  294 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');
  295 +
  296 + $mock->expects($this->at(0))
  297 + ->method('findAll')
  298 + ->with(array(), array('notaAluno' => $notaAluno->id))
  299 + ->will($this->returnValue($mediasPersistidas));
  300 +
  301 + $mock->expects($this->at(1))
  302 + ->method('find')
  303 + ->with(array($notaAluno->id, $this->_getConfigOption('matricula', 'cod_matricula')))
  304 + ->will($this->returnValue($mediasPersistidas[0]));
  305 +
  306 + // Valores de média esperados
  307 + $media = clone $mediasPersistidas[0];
  308 + $media->etapa = 3;
  309 + $media->media = 6.1875;
  310 + $media->mediaArredondada = 6;
  311 +
  312 + $mock->expects($this->at(2))
  313 + ->method('save')
  314 + ->with($media)
  315 + ->will($this->returnValue(TRUE));
  316 +
  317 + $this->_setNotaComponenteMediaDataMapperMock($mock);
  318 +
  319 + $service = $this->_getServiceInstance();
  320 + $service->addNotas($notas);
  321 + $service->saveNotas();
  322 + }
  323 +}
0 \ No newline at end of file 324 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoAlunoTest.php 0 → 100644
@@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_ParecerDescritivoAlunoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_ParecerDescritivoAlunoTest extends Avaliacao_Service_TestCommon
  46 +{
  47 + public function testCriaNovaInstanciaDeParecerDescritivoAluno()
  48 + {
  49 + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance');
  50 +
  51 + $parecerSave = clone $parecerAluno;
  52 + $parecerSave->id = NULL;
  53 +
  54 + // Configura mock para Avaliacao_Model_ParecerDescritivoAlunoDataMapper
  55 + $mock = $this->getCleanMock('Avaliacao_Model_ParecerDescritivoAlunoDataMapper');
  56 + $mock->expects($this->at(0))
  57 + ->method('findAll')
  58 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  59 + ->will($this->returnValue(array()));
  60 +
  61 + $mock->expects($this->at(1))
  62 + ->method('save')
  63 + ->with($parecerSave)
  64 + ->will($this->returnValue(TRUE));
  65 +
  66 + $mock->expects($this->at(2))
  67 + ->method('findAll')
  68 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  69 + ->will($this->returnValue(array($parecerAluno)));
  70 +
  71 + $this->_setParecerDescritivoAlunoDataMapperMock($mock);
  72 +
  73 + $service = $this->_getServiceInstance();
  74 + }
  75 +}
0 \ No newline at end of file 76 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoCommon.php 0 → 100644
@@ -0,0 +1,277 @@ @@ -0,0 +1,277 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_ParecerDescritivoCommon abstract class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +abstract class Avaliacao_Service_ParecerDescritivoCommon extends Avaliacao_Service_TestCommon
  46 +{
  47 + /**
  48 + * Retorna as etapas possíveis para a instância do parecer.
  49 + * @return array
  50 + */
  51 + protected function _getEtapasPossiveisParecer()
  52 + {
  53 + $parecerDescritivo = $this->_getRegraOption('parecerDescritivo');
  54 +
  55 + $anuais = array(
  56 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL,
  57 + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE
  58 + );
  59 +
  60 + $etapas = array(
  61 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL,
  62 + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE
  63 + );
  64 +
  65 + if (in_array($parecerDescritivo, $anuais)) {
  66 + return array('An');
  67 + }
  68 +
  69 + return $this->_getEtapasPossiveis();
  70 + }
  71 +
  72 + /**
  73 + * Retorna o nome da classe CoreExt_DataMapper correta de acordo com a
  74 + * configuração da regra. Método auxiliar para criação de mocks.
  75 + *
  76 + * @return string
  77 + */
  78 + protected function _getParecerDescritivoDataMapper()
  79 + {
  80 + $parecerDescritivo = $this->_getRegraOption('parecerDescritivo');
  81 +
  82 + switch($parecerDescritivo) {
  83 + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL:
  84 + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL:
  85 + $mapper = 'Avaliacao_Model_ParecerDescritivoGeralDataMapper';
  86 + break;
  87 + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE:
  88 + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE:
  89 + $mapper = 'Avaliacao_Model_ParecerDescritivoComponenteDataMapper';
  90 + break;
  91 + }
  92 +
  93 + return $mapper;
  94 + }
  95 +
  96 + /**
  97 + * @return Avaliacao_Model_ParecerDescritivoAbstract
  98 + * @see Avaliacao_Service_ParecerDescritivoCommon#testInstanciaDeParecerERegistradaApenasUmaVezNoBoletim()
  99 + */
  100 + protected abstract function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim();
  101 +
  102 + /**
  103 + * @return Avaliacao_Model_ParecerDescritivoAbstract
  104 + * @see Avaliacao_Service_ParecerDescritivoCommon#testAdicionaParecerNoBoletim()
  105 + */
  106 + protected abstract function _getTestAdicionaParecerNoBoletim();
  107 +
  108 + /**
  109 + * @param Avaliacao_Model_ParecerDescritivoAbstract $parecer
  110 + * @see Avaliacao_Service_ParecerDescritivoCommon#testAdicionaParecerNoBoletim()
  111 + */
  112 + protected abstract function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer);
  113 +
  114 + /**
  115 + * @return array
  116 + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvarPareceresNoBoletim()
  117 + */
  118 + protected abstract function _getTestSalvarPareceresNoBoletimInstanciasDePareceres();
  119 +
  120 + /**
  121 + * @return array
  122 + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvarPareceresNoBoletimComEtapasJaLancadas()
  123 + */
  124 + protected abstract function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias();
  125 +
  126 + /**
  127 + * @return array
  128 + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvarPareceresNoBoletimComEtapasJaLancadas()
  129 + */
  130 + protected abstract function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas();
  131 +
  132 + /**
  133 + * @return array
  134 + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas()
  135 + */
  136 + protected abstract function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias();
  137 +
  138 + /**
  139 + * @return array
  140 + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas()
  141 + */
  142 + protected abstract function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas();
  143 +
  144 + /**
  145 + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim()
  146 + */
  147 + public function testInstanciaDeParecerERegistradaApenasUmaVezNoBoletim()
  148 + {
  149 + $service = $this->_getServiceInstance();
  150 +
  151 + $parecer = $this->_getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim();
  152 +
  153 + $service->addParecer($parecer)
  154 + ->addParecer($parecer);
  155 +
  156 + $this->assertEquals(1, count($service->getPareceres()));
  157 +
  158 + $parecer = clone $parecer;
  159 + $service->addPareceres(array($parecer, $parecer, $parecer));
  160 +
  161 + $this->assertEquals(2, count($service->getPareceres()));
  162 + }
  163 +
  164 + /**
  165 + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestAdicionaParecerNoBoletim()
  166 + * @see Avaliacao_Service_ParecerDescritivoCommon#_testAdicionaParecerNoBoletimVerificaValidadores()
  167 + */
  168 + public function testAdicionaParecerNoBoletim()
  169 + {
  170 + $service = $this->_getServiceInstance();
  171 +
  172 + $parecer = $this->_getTestAdicionaParecerNoBoletim();
  173 +
  174 + $parecerOriginal = clone $parecer;
  175 + $service->addParecer($parecer);
  176 +
  177 + $pareceres = $service->getPareceres();
  178 + $serviceParecer = array_shift($pareceres);
  179 +
  180 + $this->_testAdicionaParecerNoBoletimVerificaValidadores($serviceParecer);
  181 + }
  182 +
  183 + /**
  184 + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvarPareceresNoBoletimInstanciasDePareceres()
  185 + */
  186 + public function testSalvarPareceresNoBoletim()
  187 + {
  188 + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance');
  189 +
  190 + $pareceres = $this->_getTestSalvarPareceresNoBoletimInstanciasDePareceres();
  191 +
  192 + // Configura mock para Avaliacao_Model_Parecer
  193 + $mock = $this->getCleanMock($this->_getParecerDescritivoDataMapper());
  194 +
  195 + $mock->expects($this->at(0))
  196 + ->method('findAll')
  197 + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC'))
  198 + ->will($this->returnValue(array()));
  199 +
  200 + foreach ($pareceres as $i => $parecer) {
  201 + $mock->expects($this->at($i + 1))
  202 + ->method('save')
  203 + ->with($parecer)
  204 + ->will($this->returnValue(TRUE));
  205 + }
  206 +
  207 + $this->_setParecerDescritivoAbstractDataMapperMock($mock);
  208 +
  209 + $service = $this->_getServiceInstance();
  210 + $service->addPareceres($pareceres);
  211 + $service->savePareceres();
  212 + }
  213 +
  214 + /**
  215 + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias()
  216 + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas()
  217 + */
  218 + public function testSalvarPareceresNoBoletimComEtapasJaLancadas()
  219 + {
  220 + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance');
  221 +
  222 + $pareceres = $this->_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias();
  223 +
  224 + // Configura mock para Avaliacao_Model_Parecer
  225 + $mock = $this->getCleanMock($this->_getParecerDescritivoDataMapper());
  226 +
  227 + $mock->expects($this->at(0))
  228 + ->method('findAll')
  229 + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC'))
  230 + ->will($this->returnValue($this->_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas()));
  231 +
  232 + foreach ($pareceres as $i => $parecer) {
  233 + $mock->expects($this->at($i + 1))
  234 + ->method('save')
  235 + ->with($parecer)
  236 + ->will($this->returnValue(TRUE));
  237 + }
  238 +
  239 + $this->_setParecerDescritivoAbstractDataMapperMock($mock);
  240 +
  241 + $service = $this->_getServiceInstance();
  242 + $service->addPareceres($pareceres);
  243 + $service->savePareceres();
  244 + }
  245 +
  246 + /**
  247 + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias()
  248 + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas()
  249 + */
  250 + public function testSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas()
  251 + {
  252 + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance');
  253 +
  254 + $pareceres = $this->_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias();
  255 +
  256 + // Configura mock para Avaliacao_Model_Parecer
  257 + $mock = $this->getCleanMock($this->_getParecerDescritivoDataMapper());
  258 +
  259 + $mock->expects($this->at(0))
  260 + ->method('findAll')
  261 + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC'))
  262 + ->will($this->returnValue($this->_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas()));
  263 +
  264 + foreach ($pareceres as $i => $parecer) {
  265 + $mock->expects($this->at($i + 1))
  266 + ->method('save')
  267 + ->with($parecer)
  268 + ->will($this->returnValue(TRUE));
  269 + }
  270 +
  271 + $this->_setParecerDescritivoAbstractDataMapperMock($mock);
  272 +
  273 + $service = $this->_getServiceInstance();
  274 + $service->addPareceres($pareceres);
  275 + $service->savePareceres();
  276 + }
  277 +}
0 \ No newline at end of file 278 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteAnualTest.php 0 → 100644
@@ -0,0 +1,165 @@ @@ -0,0 +1,165 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_ParecerDescritivoComponenteAnualTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_ParecerDescritivoComponenteAnualTest extends Avaliacao_Service_ParecerDescritivoCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE);
  50 + parent::setUp();
  51 + }
  52 +
  53 + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim()
  54 + {
  55 + return new Avaliacao_Model_ParecerDescritivoComponente(array(
  56 + 'componenteCurricular' => 1,
  57 + 'parecer' => 'Ok.'
  58 + ));
  59 + }
  60 +
  61 + protected function _getTestAdicionaParecerNoBoletim()
  62 + {
  63 + return new Avaliacao_Model_ParecerDescritivoComponente(array(
  64 + 'componenteCurricular' => 1,
  65 + 'parecer' => 'N/D.'
  66 + ));
  67 + }
  68 +
  69 + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres()
  70 + {
  71 + return array(
  72 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  73 + 'componenteCurricular' => 1,
  74 + 'parecer' => 'N/D.',
  75 + 'etapa' => 'An'
  76 + )),
  77 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  78 + 'componenteCurricular' => 2,
  79 + 'parecer' => 'N/D.',
  80 + 'etapa' => 'An'
  81 + )),
  82 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  83 + 'componenteCurricular' => 3,
  84 + 'parecer' => 'N/D.',
  85 + 'etapa' => 'An'
  86 + )),
  87 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  88 + 'componenteCurricular' => 4,
  89 + 'parecer' => 'N/D.',
  90 + 'etapa' => 'An'
  91 + ))
  92 + );
  93 + }
  94 +
  95 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias()
  96 + {
  97 + return array(
  98 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  99 + 'componenteCurricular' => 1,
  100 + 'parecer' => 'N/D.',
  101 + 'etapa' => 'An'
  102 + )),
  103 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  104 + 'componenteCurricular' => 2,
  105 + 'parecer' => 'N/D.',
  106 + 'etapa' => 'An'
  107 + ))
  108 + );
  109 + }
  110 +
  111 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas()
  112 + {
  113 + return array(
  114 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  115 + 'id' => 1,
  116 + 'componenteCurricular' => 1,
  117 + 'parecer' => 'N/D.',
  118 + 'etapa' => 'An'
  119 + ))
  120 + );
  121 + }
  122 +
  123 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias()
  124 + {
  125 + return array(
  126 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  127 + 'componenteCurricular' => 1,
  128 + 'parecer' => 'N/D.',
  129 + 'etapa' => 'An'
  130 + )),
  131 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  132 + 'componenteCurricular' => 2,
  133 + 'parecer' => 'N/D.',
  134 + ))
  135 + );
  136 + }
  137 +
  138 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas()
  139 + {
  140 + return array(
  141 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  142 + 'id' => 1,
  143 + 'componenteCurricular' => 1,
  144 + 'parecer' => 'N/D.',
  145 + 'etapa' => 'An'
  146 + )),
  147 + );
  148 + }
  149 +
  150 + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer)
  151 + {
  152 + $this->assertEquals(1, $parecer->get('componenteCurricular'));
  153 + $this->assertEquals('An', $parecer->etapa);
  154 + $this->assertEquals('N/D.', $parecer->parecer);
  155 +
  156 + $validators = $parecer->getValidatorCollection();
  157 +
  158 + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices'));
  159 +
  160 + $this->assertEquals(
  161 + $this->_getComponentesCursados(),
  162 + array_values($validators['componenteCurricular']->getOption('choices'))
  163 + );
  164 + }
  165 +}
0 \ No newline at end of file 166 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteEtapaTest.php 0 → 100644
@@ -0,0 +1,189 @@ @@ -0,0 +1,189 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_ParecerDescritivoComponenteEtapaTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_ParecerDescritivoComponenteEtapaTest extends Avaliacao_Service_ParecerDescritivoCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE);
  50 + parent::setUp();
  51 + }
  52 +
  53 + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim()
  54 + {
  55 + return new Avaliacao_Model_ParecerDescritivoComponente(array(
  56 + 'componenteCurricular' => 1,
  57 + 'parecer' => 'Ok.'
  58 + ));
  59 + }
  60 +
  61 + protected function _getTestAdicionaParecerNoBoletim()
  62 + {
  63 + return new Avaliacao_Model_ParecerDescritivoComponente(array(
  64 + 'componenteCurricular' => 1,
  65 + 'parecer' => 'N/D.'
  66 + ));
  67 + }
  68 +
  69 + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres()
  70 + {
  71 + return array(
  72 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  73 + 'componenteCurricular' => 1,
  74 + 'parecer' => 'N/D.',
  75 + 'etapa' => 1
  76 + )),
  77 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  78 + 'componenteCurricular' => 1,
  79 + 'parecer' => 'N/D.',
  80 + 'etapa' => 2
  81 + )),
  82 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  83 + 'componenteCurricular' => 1,
  84 + 'parecer' => 'N/D.',
  85 + 'etapa' => 3
  86 + )),
  87 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  88 + 'componenteCurricular' => 1,
  89 + 'parecer' => 'N/D.',
  90 + 'etapa' => 4
  91 + ))
  92 + );
  93 + }
  94 +
  95 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias()
  96 + {
  97 + return array(
  98 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  99 + 'componenteCurricular' => 1,
  100 + 'parecer' => 'N/D.',
  101 + 'etapa' => 1
  102 + )),
  103 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  104 + 'componenteCurricular' => 2,
  105 + 'parecer' => 'N/D.',
  106 + 'etapa' => 1
  107 + ))
  108 + );
  109 + }
  110 +
  111 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas()
  112 + {
  113 + return array(
  114 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  115 + 'id' => 1,
  116 + 'componenteCurricular' => 1,
  117 + 'parecer' => 'N/D.',
  118 + 'etapa' => 1
  119 + )),
  120 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  121 + 'id' => 2,
  122 + 'componenteCurricular' => 1,
  123 + 'parecer' => 'N/D.',
  124 + 'etapa' => 1
  125 + ))
  126 + );
  127 + }
  128 +
  129 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias()
  130 + {
  131 + return array(
  132 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  133 + 'componenteCurricular' => 1,
  134 + 'parecer' => 'N/A.',
  135 + 'etapa' => 4
  136 + )),
  137 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  138 + 'componenteCurricular' => 1,
  139 + 'parecer' => 'N/D.'
  140 + ))
  141 + );
  142 + }
  143 +
  144 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas()
  145 + {
  146 + return array(
  147 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  148 + 'id' => 1,
  149 + 'componenteCurricular' => 1,
  150 + 'parecer' => 'N/D.',
  151 + 'etapa' => 1
  152 + )),
  153 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  154 + 'id' => 2,
  155 + 'componenteCurricular' => 1,
  156 + 'parecer' => 'N/D.',
  157 + 'etapa' => 2
  158 + )),
  159 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  160 + 'id' => 3,
  161 + 'componenteCurricular' => 1,
  162 + 'parecer' => 'N/D.',
  163 + 'etapa' => 3
  164 + )),
  165 + new Avaliacao_Model_ParecerDescritivoComponente(array(
  166 + 'id' => 4,
  167 + 'componenteCurricular' => 1,
  168 + 'parecer' => 'N/D.',
  169 + 'etapa' => 4
  170 + )),
  171 + );
  172 + }
  173 +
  174 + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer)
  175 + {
  176 + $this->assertEquals(1, $parecer->get('componenteCurricular'));
  177 + $this->assertEquals(1, $parecer->etapa);
  178 + $this->assertEquals('N/D.', $parecer->parecer);
  179 +
  180 + $validators = $parecer->getValidatorCollection();
  181 +
  182 + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices'));
  183 +
  184 + $this->assertEquals(
  185 + $this->_getComponentesCursados(),
  186 + array_values($validators['componenteCurricular']->getOption('choices'))
  187 + );
  188 + }
  189 +}
0 \ No newline at end of file 190 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralAnualTest.php 0 → 100644
@@ -0,0 +1,128 @@ @@ -0,0 +1,128 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_ParecerDescritivoGeralAnualTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_ParecerDescritivoGeralAnualTest extends Avaliacao_Service_ParecerDescritivoCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL);
  50 + parent::setUp();
  51 + }
  52 +
  53 + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim()
  54 + {
  55 + return new Avaliacao_Model_ParecerDescritivoGeral(array(
  56 + 'parecer' => 'Ok.'
  57 + ));
  58 + }
  59 +
  60 + protected function _getTestAdicionaParecerNoBoletim()
  61 + {
  62 + return new Avaliacao_Model_ParecerDescritivoGeral(array(
  63 + 'parecer' => 'N/D.'
  64 + ));
  65 + }
  66 +
  67 + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres()
  68 + {
  69 + return array(
  70 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  71 + 'parecer' => 'N/D.',
  72 + 'etapa' => 'An'
  73 + ))
  74 + );
  75 + }
  76 +
  77 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias()
  78 + {
  79 + return array(
  80 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  81 + 'parecer' => 'N/D.',
  82 + 'etapa' => 'An'
  83 + ))
  84 + );
  85 + }
  86 +
  87 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas()
  88 + {
  89 + return array(
  90 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  91 + 'id' => 1,
  92 + 'parecer' => 'N/D.',
  93 + 'etapa' => 'An'
  94 + ))
  95 + );
  96 + }
  97 +
  98 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias()
  99 + {
  100 + return array(
  101 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  102 + 'parecer' => 'N/D.'
  103 + ))
  104 + );
  105 + }
  106 +
  107 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas()
  108 + {
  109 + return array(
  110 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  111 + 'id' => 1,
  112 + 'parecer' => 'N/D.',
  113 + 'etapa' => 'An'
  114 + ))
  115 + );
  116 + }
  117 +
  118 + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer)
  119 + {
  120 + $this->assertEquals(1, $parecer->etapa);
  121 + $this->assertEquals('N/D.', $parecer->parecer);
  122 +
  123 + $validators = $parecer->getValidatorCollection();
  124 +
  125 + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices'));
  126 + $this->assertFalse(isset($validators['componenteCurricular']));
  127 + }
  128 +}
0 \ No newline at end of file 129 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralEtapaTest.php 0 → 100644
@@ -0,0 +1,168 @@ @@ -0,0 +1,168 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_ParecerDescritivoGeralEtapaTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_ParecerDescritivoGeralEtapaTest extends Avaliacao_Service_ParecerDescritivoCommon
  46 +{
  47 + protected function setUp()
  48 + {
  49 + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL);
  50 + parent::setUp();
  51 + }
  52 +
  53 + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim()
  54 + {
  55 + return new Avaliacao_Model_ParecerDescritivoGeral(array(
  56 + 'parecer' => 'Ok.'
  57 + ));
  58 + }
  59 +
  60 + protected function _getTestAdicionaParecerNoBoletim()
  61 + {
  62 + return new Avaliacao_Model_ParecerDescritivoGeral(array(
  63 + 'parecer' => 'N/D.'
  64 + ));
  65 + }
  66 +
  67 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias()
  68 + {
  69 + return array(
  70 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  71 + 'parecer' => 'N/D.',
  72 + 'etapa' => 2
  73 + )),
  74 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  75 + 'parecer' => 'N/D.',
  76 + 'etapa' => 3
  77 + ))
  78 + );
  79 + }
  80 +
  81 + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas()
  82 + {
  83 + return array(
  84 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  85 + 'id' => 1,
  86 + 'parecer' => 'N/D.',
  87 + 'etapa' => 1
  88 + )),
  89 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  90 + 'id' => 1,
  91 + 'parecer' => 'N/D.',
  92 + 'etapa' => 2
  93 + ))
  94 + );
  95 + }
  96 +
  97 + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres()
  98 + {
  99 + return array(
  100 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  101 + 'etapa' => 1,
  102 + 'parecer' => 'N/D.'
  103 + )),
  104 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  105 + 'etapa' => 2,
  106 + 'parecer' => 'N/D.'
  107 + )),
  108 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  109 + 'etapa' => 3,
  110 + 'parecer' => 'N/D.'
  111 + )),
  112 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  113 + 'etapa' => 4,
  114 + 'parecer' => 'N/D.'
  115 + ))
  116 + );
  117 + }
  118 +
  119 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias()
  120 + {
  121 + return array(
  122 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  123 + 'parecer' => 'N/D.',
  124 + 'etapa' => 4
  125 + )),
  126 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  127 + 'parecer' => 'N/D.',
  128 + ))
  129 + );
  130 + }
  131 +
  132 + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas()
  133 + {
  134 + return array(
  135 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  136 + 'id' => 1,
  137 + 'parecer' => 'N/D.',
  138 + 'etapa' => 2
  139 + )),
  140 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  141 + 'id' => 2,
  142 + 'parecer' => 'N/D.',
  143 + 'etapa' => 2
  144 + )),
  145 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  146 + 'id' => 3,
  147 + 'parecer' => 'N/D.',
  148 + 'etapa' => 3
  149 + )),
  150 + new Avaliacao_Model_ParecerDescritivoGeral(array(
  151 + 'id' => 4,
  152 + 'parecer' => 'N/D.',
  153 + 'etapa' => 4
  154 + )),
  155 + );
  156 + }
  157 +
  158 + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer)
  159 + {
  160 + $this->assertEquals(1, $parecer->etapa);
  161 + $this->assertEquals('N/D.', $parecer->parecer);
  162 +
  163 + $validators = $parecer->getValidatorCollection();
  164 +
  165 + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices'));
  166 + $this->assertFalse(isset($validators['componenteCurricular']));
  167 + }
  168 +}
0 \ No newline at end of file 169 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/PromocaoAlunoTest.php 0 → 100644
@@ -0,0 +1,531 @@ @@ -0,0 +1,531 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_PromocaoAlunoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_PromocaoAlunoTest extends Avaliacao_Service_TestCommon
  46 +{
  47 + protected function _setUpRegraAvaliacaoMock($tipoProgressao)
  48 + {
  49 + $mock = $this->getCleanMock('RegraAvaliacao_Model_Regra');
  50 + $mock->expects($this->at(0))
  51 + ->method('get')
  52 + ->with('tipoProgressao')
  53 + ->will($this->returnValue($tipoProgressao));
  54 +
  55 + return $mock;
  56 + }
  57 +
  58 + /**
  59 + * @expectedException CoreExt_Service_Exception
  60 + */
  61 + public function testPromoverAlunoLancaExcecaoCasoSituacaoEstejaEmAndamento()
  62 + {
  63 + $situacao = new stdClass();
  64 + $situacao->aprovado = FALSE;
  65 + $situacao->andamento = TRUE;
  66 + $situacao->recuperacao = FALSE;
  67 + $situacao->retidoFalta = FALSE;
  68 +
  69 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  70 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  71 +
  72 + $service = $this->setExcludedMethods(array('promover'))
  73 + ->getCleanMock('Avaliacao_Service_Boletim');
  74 +
  75 + $service->expects($this->at(0))
  76 + ->method('getSituacaoAluno')
  77 + ->will($this->returnValue($situacao));
  78 +
  79 + $service->promover();
  80 + }
  81 +
  82 + /**
  83 + * @expectedException CoreExt_Service_Exception
  84 + */
  85 + public function testPromoverAlunoLancaExcecaoCasoMatriculaDoAlunoJaEstejaAprovadaOuReprovada()
  86 + {
  87 + $situacao = new stdClass();
  88 + $situacao->aprovado = TRUE;
  89 + $situacao->andamento = FALSE;
  90 + $situacao->recuperacao = FALSE;
  91 + $situacao->retidoFalta = FALSE;
  92 +
  93 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  94 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  95 +
  96 + $service = $this->setExcludedMethods(array('promover'))
  97 + ->getCleanMock('Avaliacao_Service_Boletim');
  98 +
  99 + $service->expects($this->at(0))
  100 + ->method('getSituacaoAluno')
  101 + ->will($this->returnValue($situacao));
  102 +
  103 + $service->expects($this->at(1))
  104 + ->method('getOption')
  105 + ->with('aprovado')
  106 + ->will($this->returnValue(App_Model_MatriculaSituacao::APROVADO));
  107 +
  108 + $service->promover();
  109 + }
  110 +
  111 + public function testPromoverAlunoAutomaticamenteProgressaoContinuada()
  112 + {
  113 + $situacao = new stdClass();
  114 + $situacao->aprovado = TRUE;
  115 + $situacao->andamento = FALSE;
  116 + $situacao->recuperacao = FALSE;
  117 + $situacao->retidoFalta = FALSE;
  118 +
  119 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  120 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  121 +
  122 + // Mock para RegraAvaliacao_Model_Regra
  123 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::CONTINUADA);
  124 +
  125 + $service = $this->setExcludedMethods(array('promover'))
  126 + ->getCleanMock('Avaliacao_Service_Boletim');
  127 +
  128 + $service->expects($this->at(0))
  129 + ->method('getSituacaoAluno')
  130 + ->will($this->returnValue($situacao));
  131 +
  132 + $service->expects($this->at(1))
  133 + ->method('getOption')
  134 + ->with('aprovado')
  135 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  136 +
  137 + $service->expects($this->at(2))
  138 + ->method('getRegra')
  139 + ->will($this->returnValue($regra));
  140 +
  141 + $service->expects($this->at(3))
  142 + ->method('getOption')
  143 + ->with('matricula')
  144 + ->will($this->returnValue($codMatricula));
  145 +
  146 + $service->expects($this->at(4))
  147 + ->method('getOption')
  148 + ->with('usuario')
  149 + ->will($this->returnValue($codUsuario));
  150 +
  151 + $service->expects($this->at(5))
  152 + ->method('_updateMatricula')
  153 + ->with($codMatricula, $codUsuario, TRUE)
  154 + ->will($this->returnValue(TRUE));
  155 +
  156 + $this->assertTrue($service->promover());
  157 + }
  158 +
  159 + public function testPromoverAlunoAutomaticamenteProgressaoNaoContinuadaAutoMediaPresenca()
  160 + {
  161 + $situacao = new stdClass();
  162 + $situacao->aprovado = TRUE;
  163 + $situacao->andamento = FALSE;
  164 + $situacao->recuperacao = FALSE;
  165 + $situacao->retidoFalta = FALSE;
  166 +
  167 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  168 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  169 +
  170 + // Mock para RegraAvaliacao_Model_Regra
  171 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA);
  172 +
  173 + $service = $this->setExcludedMethods(array('promover'))
  174 + ->getCleanMock('Avaliacao_Service_Boletim');
  175 +
  176 + $service->expects($this->at(0))
  177 + ->method('getSituacaoAluno')
  178 + ->will($this->returnValue($situacao));
  179 +
  180 + $service->expects($this->at(1))
  181 + ->method('getOption')
  182 + ->with('aprovado')
  183 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  184 +
  185 + $service->expects($this->at(2))
  186 + ->method('getRegra')
  187 + ->will($this->returnValue($regra));
  188 +
  189 + $service->expects($this->at(3))
  190 + ->method('getOption')
  191 + ->with('matricula')
  192 + ->will($this->returnValue($codMatricula));
  193 +
  194 + $service->expects($this->at(4))
  195 + ->method('getOption')
  196 + ->with('usuario')
  197 + ->will($this->returnValue($codUsuario));
  198 +
  199 + $service->expects($this->at(5))
  200 + ->method('_updateMatricula')
  201 + ->with($codMatricula, $codUsuario, TRUE)
  202 + ->will($this->returnValue(TRUE));
  203 +
  204 + $this->assertTrue($service->promover());
  205 + }
  206 +
  207 + public function testReprovarAlunoAutomaticamenteProgressaoNaoContinuadaAutoMediaPresenca()
  208 + {
  209 + $situacao = new stdClass();
  210 + $situacao->aprovado = TRUE;
  211 + $situacao->andamento = FALSE;
  212 + $situacao->recuperacao = FALSE;
  213 + $situacao->retidoFalta = TRUE;
  214 +
  215 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  216 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  217 +
  218 + // Mock para RegraAvaliacao_Model_Regra
  219 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA);
  220 +
  221 + $service = $this->setExcludedMethods(array('promover'))
  222 + ->getCleanMock('Avaliacao_Service_Boletim');
  223 +
  224 + $service->expects($this->at(0))
  225 + ->method('getSituacaoAluno')
  226 + ->will($this->returnValue($situacao));
  227 +
  228 + $service->expects($this->at(1))
  229 + ->method('getOption')
  230 + ->with('aprovado')
  231 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  232 +
  233 + $service->expects($this->at(2))
  234 + ->method('getRegra')
  235 + ->will($this->returnValue($regra));
  236 +
  237 + $service->expects($this->at(3))
  238 + ->method('getOption')
  239 + ->with('matricula')
  240 + ->will($this->returnValue($codMatricula));
  241 +
  242 + $service->expects($this->at(4))
  243 + ->method('getOption')
  244 + ->with('usuario')
  245 + ->will($this->returnValue($codUsuario));
  246 +
  247 + $service->expects($this->at(5))
  248 + ->method('_updateMatricula')
  249 + ->with($codMatricula, $codUsuario, FALSE)
  250 + ->will($this->returnValue(TRUE));
  251 +
  252 + $this->assertTrue($service->promover());
  253 + }
  254 +
  255 + public function testPromoverAlunoAutomaticamenteProgressaoNaoContinuadaAutoMedia()
  256 + {
  257 + $situacao = new stdClass();
  258 + $situacao->aprovado = TRUE;
  259 + $situacao->andamento = FALSE;
  260 + $situacao->recuperacao = FALSE;
  261 + $situacao->retidoFalta = TRUE; // Não considera retenção por falta
  262 +
  263 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  264 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  265 +
  266 + // Mock para RegraAvaliacao_Model_Regra
  267 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA);
  268 +
  269 + $service = $this->setExcludedMethods(array('promover'))
  270 + ->getCleanMock('Avaliacao_Service_Boletim');
  271 +
  272 + $service->expects($this->at(0))
  273 + ->method('getSituacaoAluno')
  274 + ->will($this->returnValue($situacao));
  275 +
  276 + $service->expects($this->at(1))
  277 + ->method('getOption')
  278 + ->with('aprovado')
  279 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  280 +
  281 + $service->expects($this->at(2))
  282 + ->method('getRegra')
  283 + ->will($this->returnValue($regra));
  284 +
  285 + $service->expects($this->at(3))
  286 + ->method('getOption')
  287 + ->with('matricula')
  288 + ->will($this->returnValue($codMatricula));
  289 +
  290 + $service->expects($this->at(4))
  291 + ->method('getOption')
  292 + ->with('usuario')
  293 + ->will($this->returnValue($codUsuario));
  294 +
  295 + $service->expects($this->at(5))
  296 + ->method('_updateMatricula')
  297 + ->with($codMatricula, $codUsuario, TRUE)
  298 + ->will($this->returnValue(TRUE));
  299 +
  300 + $this->assertTrue($service->promover());
  301 + }
  302 +
  303 + public function testPromoverAlunoManualmenteProgressaoNaoContinuadaLancaExcecaoSeNaoConfirmada()
  304 + {
  305 + $situacao = new stdClass();
  306 + $situacao->aprovado = FALSE; // Reprovado por nota
  307 + $situacao->andamento = FALSE;
  308 + $situacao->recuperacao = FALSE;
  309 + $situacao->retidoFalta = FALSE;
  310 +
  311 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  312 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  313 +
  314 + // Mock para RegraAvaliacao_Model_Regra
  315 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL);
  316 +
  317 + $service = $this->setExcludedMethods(array('promover'))
  318 + ->getCleanMock('Avaliacao_Service_Boletim');
  319 +
  320 + $service->expects($this->at(0))
  321 + ->method('getSituacaoAluno')
  322 + ->will($this->returnValue($situacao));
  323 +
  324 + $service->expects($this->at(1))
  325 + ->method('getOption')
  326 + ->with('aprovado')
  327 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  328 +
  329 + $service->expects($this->at(2))
  330 + ->method('getRegra')
  331 + ->will($this->returnValue($regra));
  332 +
  333 + try {
  334 + $service->promover();
  335 + $this->fail('Invocar o método "->promover()" sem uma confirmação booleana '
  336 + . 'explícita (TRUE ou FALSE) em uma progressão "NAO_CONTINUADA_MANUAL" '
  337 + . 'causa exceção.');
  338 + }
  339 + catch (CoreExt_Service_Exception $e)
  340 + {
  341 + }
  342 + }
  343 +
  344 + public function testPromoverAlunoManualmenteProgressaoNaoContinuada()
  345 + {
  346 + $situacao = new stdClass();
  347 + $situacao->aprovado = FALSE; // Reprovado por nota
  348 + $situacao->andamento = FALSE;
  349 + $situacao->recuperacao = FALSE;
  350 + $situacao->retidoFalta = FALSE;
  351 +
  352 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  353 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  354 +
  355 + // Mock para RegraAvaliacao_Model_Regra
  356 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL);
  357 +
  358 + $service = $this->setExcludedMethods(array('promover'))
  359 + ->getCleanMock('Avaliacao_Service_Boletim');
  360 +
  361 + $service->expects($this->at(0))
  362 + ->method('getSituacaoAluno')
  363 + ->will($this->returnValue($situacao));
  364 +
  365 + $service->expects($this->at(1))
  366 + ->method('getOption')
  367 + ->with('aprovado')
  368 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  369 +
  370 + $service->expects($this->at(2))
  371 + ->method('getRegra')
  372 + ->will($this->returnValue($regra));
  373 +
  374 + $service->expects($this->at(3))
  375 + ->method('getOption')
  376 + ->with('matricula')
  377 + ->will($this->returnValue($codMatricula));
  378 +
  379 + $service->expects($this->at(4))
  380 + ->method('getOption')
  381 + ->with('usuario')
  382 + ->will($this->returnValue($codUsuario));
  383 +
  384 + $service->expects($this->at(5))
  385 + ->method('_updateMatricula')
  386 + ->with($codMatricula, $codUsuario, TRUE)
  387 + ->will($this->returnValue(TRUE));
  388 +
  389 + $this->assertTrue($service->promover(TRUE));
  390 + }
  391 +
  392 + public function testReprovarAlunoManualmenteProgressaoNaoContinuada()
  393 + {
  394 + $situacao = new stdClass();
  395 + $situacao->aprovado = FALSE; // Reprovado por nota
  396 + $situacao->andamento = FALSE;
  397 + $situacao->recuperacao = FALSE;
  398 + $situacao->retidoFalta = FALSE;
  399 +
  400 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  401 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  402 +
  403 + // Mock para RegraAvaliacao_Model_Regra
  404 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL);
  405 +
  406 + $service = $this->setExcludedMethods(array('promover'))
  407 + ->getCleanMock('Avaliacao_Service_Boletim');
  408 +
  409 + $service->expects($this->at(0))
  410 + ->method('getSituacaoAluno')
  411 + ->will($this->returnValue($situacao));
  412 +
  413 + $service->expects($this->at(1))
  414 + ->method('getOption')
  415 + ->with('aprovado')
  416 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  417 +
  418 + $service->expects($this->at(2))
  419 + ->method('getRegra')
  420 + ->will($this->returnValue($regra));
  421 +
  422 + $service->expects($this->at(3))
  423 + ->method('getOption')
  424 + ->with('matricula')
  425 + ->will($this->returnValue($codMatricula));
  426 +
  427 + $service->expects($this->at(4))
  428 + ->method('getOption')
  429 + ->with('usuario')
  430 + ->will($this->returnValue($codUsuario));
  431 +
  432 + $service->expects($this->at(5))
  433 + ->method('_updateMatricula')
  434 + ->with($codMatricula, $codUsuario, FALSE)
  435 + ->will($this->returnValue(TRUE));
  436 +
  437 + $this->assertTrue($service->promover(FALSE));
  438 + }
  439 +
  440 + public function testSaveBoletim()
  441 + {
  442 + $situacao = new stdClass();
  443 + $situacao->aprovado = TRUE;
  444 + $situacao->andamento = FALSE;
  445 + $situacao->recuperacao = FALSE;
  446 + $situacao->retidoFalta = FALSE;
  447 +
  448 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  449 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  450 +
  451 + $service = $this->setExcludedMethods(array('save'))
  452 + ->getCleanMock('Avaliacao_Service_Boletim');
  453 +
  454 + $service->expects($this->at(0))
  455 + ->method('saveNotas')
  456 + ->will($this->returnValue($service));
  457 +
  458 + $service->expects($this->at(1))
  459 + ->method('saveFaltas')
  460 + ->will($this->returnValue($service));
  461 +
  462 + $service->expects($this->at(2))
  463 + ->method('savePareceres')
  464 + ->will($this->returnValue($service));
  465 +
  466 + $service->expects($this->at(3))
  467 + ->method('promover')
  468 + ->will($this->returnValue(TRUE));
  469 +
  470 + try {
  471 + $service->save();
  472 + }
  473 + catch (Exception $e) {
  474 + $this->fail('O método "->save()" não deveria ter lançado exceção com o '
  475 + . 'cenário de teste configurado.');
  476 + }
  477 + }
  478 +
  479 + public function testIntegracaoMatriculaPromoverAluno()
  480 + {
  481 + $situacao = new stdClass();
  482 + $situacao->aprovado = TRUE;
  483 + $situacao->andamento = FALSE;
  484 + $situacao->recuperacao = FALSE;
  485 + $situacao->retidoFalta = FALSE;
  486 +
  487 + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula');
  488 + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario');
  489 +
  490 + // Mock para RegraAvaliacao_Model_Regra
  491 + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::CONTINUADA);
  492 +
  493 + $service = $this->setExcludedMethods(array('promover', '_updateMatricula'))
  494 + ->getCleanMock('Avaliacao_Service_Boletim');
  495 +
  496 + $service->expects($this->at(0))
  497 + ->method('getSituacaoAluno')
  498 + ->will($this->returnValue($situacao));
  499 +
  500 + $service->expects($this->at(1))
  501 + ->method('getOption')
  502 + ->with('aprovado')
  503 + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO));
  504 +
  505 + $service->expects($this->at(2))
  506 + ->method('getRegra')
  507 + ->will($this->returnValue($regra));
  508 +
  509 + $service->expects($this->at(3))
  510 + ->method('getOption')
  511 + ->with('matricula')
  512 + ->will($this->returnValue($codMatricula));
  513 +
  514 + $service->expects($this->at(4))
  515 + ->method('getOption')
  516 + ->with('usuario')
  517 + ->will($this->returnValue($codUsuario));
  518 +
  519 + // Configura mock de instância de classe legada
  520 + $matricula = $this->getCleanMock('clsPmieducarMatricula');
  521 +
  522 + $matricula->expects($this->at(0))
  523 + ->method('edita')
  524 + ->will($this->returnValue(TRUE));
  525 +
  526 + CoreExt_Entity::addClassToStorage('clsPmieducarMatricula', $matricula,
  527 + 'include/pmieducar/clsPmieducarMatricula.inc.php', TRUE);
  528 +
  529 + $this->assertTrue($service->promover());
  530 + }
  531 +}
0 \ No newline at end of file 532 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/SituacaoTest.php 0 → 100644
@@ -0,0 +1,121 @@ @@ -0,0 +1,121 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_SituacaoTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_SituacaoTest extends Avaliacao_Service_TestCommon
  46 +{
  47 + public function testSituacaoAluno()
  48 + {
  49 + $notaSituacoes = array(
  50 + 1 => App_Model_MatriculaSituacao::APROVADO,
  51 + 2 => App_Model_MatriculaSituacao::APROVADO_APOS_EXAME,
  52 + 3 => App_Model_MatriculaSituacao::EM_ANDAMENTO,
  53 + 4 => App_Model_MatriculaSituacao::EM_EXAME,
  54 + 5 => App_Model_MatriculaSituacao::REPROVADO
  55 + );
  56 +
  57 + $faltaSituacoes = array(
  58 + 1 => App_Model_MatriculaSituacao::EM_ANDAMENTO,
  59 + 2 => App_Model_MatriculaSituacao::APROVADO,
  60 + 3 => App_Model_MatriculaSituacao::REPROVADO
  61 + );
  62 +
  63 + // Possibilidades
  64 + $expected = array(
  65 + 1 => array(
  66 + 1 => array(FALSE, TRUE, FALSE, FALSE),
  67 + 2 => array(TRUE, FALSE, FALSE, FALSE),
  68 + 3 => array(FALSE, FALSE, TRUE, FALSE)
  69 + ),
  70 + 2 => array(
  71 + 1 => array(FALSE, TRUE, FALSE, TRUE),
  72 + 2 => array(TRUE, FALSE, FALSE, TRUE),
  73 + 3 => array(FALSE, FALSE, TRUE, TRUE)
  74 + ),
  75 + 3 => array(
  76 + 1 => array(FALSE, TRUE, FALSE, FALSE),
  77 + 2 => array(FALSE, TRUE, FALSE, FALSE),
  78 + 3 => array(FALSE, TRUE, TRUE, FALSE)
  79 + ),
  80 + 4 => array(
  81 + 1 => array(FALSE, TRUE, FALSE, TRUE),
  82 + 2 => array(FALSE, TRUE, FALSE, TRUE),
  83 + 3 => array(FALSE, TRUE, TRUE, TRUE)
  84 + ),
  85 + 5 => array(
  86 + 1 => array(FALSE, TRUE, FALSE, FALSE),
  87 + 2 => array(FALSE, FALSE, FALSE, FALSE),
  88 + 3 => array(FALSE, FALSE, TRUE, FALSE)
  89 + )
  90 + );
  91 +
  92 + foreach ($notaSituacoes as $i => $notaSituacao) {
  93 + $nota = new stdClass();
  94 + $nota->situacao = $notaSituacao;
  95 +
  96 + foreach ($faltaSituacoes as $ii => $faltaSituacao) {
  97 + $service = $this->setExcludedMethods(array('getSituacaoAluno'))
  98 + ->getCleanMock('Avaliacao_Service_Boletim');
  99 +
  100 + $falta = new stdClass();
  101 + $falta->situacao = $faltaSituacao;
  102 +
  103 + $service->expects($this->once())
  104 + ->method('getSituacaoComponentesCurriculares')
  105 + ->will($this->returnValue($nota));
  106 +
  107 + $service->expects($this->once())
  108 + ->method('getSituacaoFaltas')
  109 + ->will($this->returnValue($falta));
  110 +
  111 + // Testa
  112 + $situacao = $service->getSituacaoAluno();
  113 +
  114 + $this->assertEquals($expected[$i][$ii][0], $situacao->aprovado, "Aprovado, caso $i - $ii");
  115 + $this->assertEquals($expected[$i][$ii][1], $situacao->andamento, "Andamento, caso $i - $ii");
  116 + $this->assertEquals($expected[$i][$ii][2], $situacao->retidoFalta, "Retido por falta, caso $i - $ii");
  117 + $this->assertEquals($expected[$i][$ii][3], $situacao->recuperacao, "Recuperação, caso $i - $ii");
  118 + }
  119 + }
  120 + }
  121 +}
0 \ No newline at end of file 122 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/TestCommon.php 0 → 100644
@@ -0,0 +1,951 @@ @@ -0,0 +1,951 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'include/pmieducar/clsPmieducarMatricula.inc.php';
  33 +require_once 'include/pmieducar/clsPmieducarSerie.inc.php';
  34 +require_once 'include/pmieducar/clsPmieducarCurso.inc.php';
  35 +require_once 'include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php';
  36 +require_once 'include/pmieducar/clsPmieducarDispensaDisciplina.inc.php';
  37 +
  38 +require_once 'AreaConhecimento/Model/AreaDataMapper.php';
  39 +
  40 +require_once 'FormulaMedia/Model/Formula.php';
  41 +require_once 'FormulaMedia/Model/FormulaDataMapper.php';
  42 +
  43 +require_once 'TabelaArredondamento/Model/TabelaValor.php';
  44 +require_once 'TabelaArredondamento/Model/TabelaValorDataMapper.php';
  45 +
  46 +require_once 'TabelaArredondamento/Model/Tabela.php';
  47 +require_once 'TabelaArredondamento/Model/TabelaDataMapper.php';
  48 +
  49 +require_once 'RegraAvaliacao/Model/Regra.php';
  50 +require_once 'RegraAvaliacao/Model/RegraDataMapper.php';
  51 +
  52 +require_once 'Avaliacao/Model/NotaAlunoDataMapper.php';
  53 +require_once 'Avaliacao/Model/NotaComponenteDataMapper.php';
  54 +require_once 'Avaliacao/Model/NotaComponenteMediaDataMapper.php';
  55 +
  56 +require_once 'Avaliacao/Model/FaltaAlunoDataMapper.php';
  57 +require_once 'Avaliacao/Model/FaltaGeralDataMapper.php';
  58 +require_once 'Avaliacao/Model/FaltaComponenteDataMapper.php';
  59 +
  60 +require_once 'Avaliacao/Model/ParecerDescritivoAlunoDataMapper.php';
  61 +require_once 'Avaliacao/Model/ParecerDescritivoAbstractDataMapper.php';
  62 +require_once 'Avaliacao/Model/ParecerDescritivoComponenteDataMapper.php';
  63 +require_once 'Avaliacao/Model/ParecerDescritivoGeralDataMapper.php';
  64 +
  65 +require_once 'Avaliacao/Service/Boletim.php';
  66 +
  67 +/**
  68 + * Avaliacao_Service_TestCommon abstract class.
  69 + *
  70 + * Configura o service Avaliacao_Service_Boletim com mocks de suas dependências
  71 + * para que seja mais simples o processo de teste dos diversos comportamentos.
  72 + * A configuração básica segue o melhor cenário: as instâncias de
  73 + * Avaliacao_Model_NotaAluno e Avaliacao_Model_FaltaAluno existirão. Nenhuma
  74 + * nota, média ou falta terá sido lançada.
  75 + *
  76 + * Alguns métodos podem ser sobrescritos para que os mocks retornem o
  77 + * comportamento desejado para a sessão de testes (como os métodos
  78 + * _getMatricula(), _getSerie()) ou, pode-se usar o setter _setConfigOption()
  79 + * para alterar apenas um dos valores default da classe.
  80 + *
  81 + * A configuração padrão do service é constituída de:
  82 + * - Código do usuário: 1
  83 + * - Código de matrícula: 1
  84 + * - RegraAvaliacao_Model_RegraDataMapper: configuração ampla. Ver o array
  85 + * $_regraOptions e o método _setRegraOption para entender a configuração
  86 + * da instância
  87 + * - ComponenteCurricular_Model_ComponenteDataMapper: mock que retorna
  88 + * diferentes instâncias de ComponenteCurricular_Model_Componente em cada
  89 + * chamada. Essas instâncias são definidas na opção 'componenteCurricular'
  90 + * do array $_config. Esses componentes correspondem com os valores
  91 + * retornados pelos mocks de classes legadas (configuradas nos métodos
  92 + * _setUp*Mock()
  93 + * - Avaliacao_Model_NotaAlunoDataMapper: mock que retorna uma instância
  94 + * de Avaliacao_Model_NotaAluno com as configurações padrão
  95 + * - Avaliacao_Model_NotaComponenteDataMapper: mock que retorna um array
  96 + * vazio. Não existem notas lançadas para o aluno
  97 + * - Avaliacao_Model_NotaComponenteMediaDataMapper: mock que retorna um array
  98 + * vazio. Não existem médias lançadas para o aluno
  99 + * - Avaliacao_Model_FaltaAlunoDataMapper: mock que retorna uma instância
  100 + * de Avaliacao_Model_FaltaAluno com as configurações padrão
  101 + * - Avaliacao_Model_FaltaAbstractDataMapper: mock que retorna um array
  102 + * vazio. Não existem faltas lançadas para o aluno.
  103 + * OBSERVAÇÃO: métodos que sobrescreverem este, devem estar conscientes de
  104 + * que é necessário configurar o mock para retornar objeto(s) de acordo
  105 + * com o 'tipoPresenca' da instância de 'RegraAvaliacao_Model_Regra'. Ver o
  106 + * array $_regraOptions para mais informações.
  107 + *
  108 + * Outro ponto fundamental é entender que boa parte da inicialização do service
  109 + * constitui a chamadas de instâncias das classes legadas, encapsuladas nos
  110 + * métodos de App_Model_IedFinder. Estes são configurados nos métodos
  111 + * _setUp*Mock(). Para alterar o comportamento desses métodos, existem duas
  112 + * opções:
  113 + *
  114 + * - Chamar o método _setConfigOptions() ou setConfigOption em uma sobrescrição
  115 + * de setUp()
  116 + * - Sobrescrever o método
  117 + *
  118 + * Recomenda-se usar os métodos _setConfigOption e _setRegraOption a
  119 + * sobrescrever os métodos já que proporcionam mais possibilidade de
  120 + * configuração para cada método de teste.
  121 + *
  122 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  123 + * @category i-Educar
  124 + * @license @@license@@
  125 + * @package Avaliacao
  126 + * @subpackage UnitTests
  127 + * @since Classe disponível desde a versão 1.1.0
  128 + * @version @@package_version@@
  129 + */
  130 +abstract class Avaliacao_Service_TestCommon extends UnitBaseTest
  131 +{
  132 + /**
  133 + * Array com as diretrizes de configuração para uso nas dependências de
  134 + * Avaliacao_Service_Boletim.
  135 + * @var array
  136 + */
  137 + protected $_config = array();
  138 +
  139 + /**
  140 + * @var RegraAvaliacao_Model_RegraDataMapper
  141 + */
  142 + protected $_regraDataMapperMock = NULL;
  143 +
  144 + /**
  145 + * Opções de configuração para RegraAvaliacao_Model_RegraDataMapper. Por
  146 + * padrão, a regra terá:
  147 + *
  148 + * - Identificador "1"
  149 + * - Nome "Regra geral"
  150 + * - Tipo de nota numérica
  151 + * - Progressão continuada
  152 + * - Presença por componente
  153 + * - Nenhum parecer descritivo
  154 + * - Média para promoção de "6"
  155 + * - Tabela de arredondamento com valores de 0 a 10
  156 + * - Fórmula de média aritmética simples (Soma etapas / Qtde etapas)
  157 + * - Fórmula de recuperação ponderada (Soma etapas x 0.6 + Recuperação x 0.4)
  158 + * - Porcentagem de presença mínima de "75%"
  159 + *
  160 + * Para alterar algum desses valores, basta usar o método
  161 + * _setRegraOption($key, $value) onde $key é a chave do array e $value o valor
  162 + * a ser usado.
  163 + *
  164 + * @var array
  165 + */
  166 + protected $_regraOptions = array(
  167 + 'id' => 1,
  168 + 'nome' => 'Regra geral',
  169 + 'tipoNota' => RegraAvaliacao_Model_Nota_TipoValor::NUMERICA,
  170 + 'tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::CONTINUADA,
  171 + 'tipoPresenca' => RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE,
  172 + 'parecerDescritivo' => RegraAvaliacao_Model_TipoParecerDescritivo::NENHUM,
  173 + 'media' => 6,
  174 + 'tabelaArredondamento' => NULL,
  175 + 'formulaMedia' => NULL,
  176 + 'formulaRecuperacao' => NULL,
  177 + 'porcentagemPresenca' => 75
  178 + );
  179 +
  180 + protected $_componenteDataMapperMock = NULL;
  181 +
  182 + protected $_notaAlunoDataMapperMock = NULL;
  183 +
  184 + protected $_notaComponenteDataMapperMock = NULL;
  185 +
  186 + protected $_notaComponenteMediaDataMapperMock = NULL;
  187 +
  188 + protected $_faltaAlunoDataMapperMock = NULL;
  189 +
  190 + protected $_faltaAbstractDataMapperMock = NULL;
  191 +
  192 + protected $_parecerDescritivoAlunoDataMapperMock = NULL;
  193 +
  194 + protected $_parecerDescritivoAbstractDataMapperMock = NULL;
  195 +
  196 + protected function setUp()
  197 + {
  198 + // Armazena valores de configuração para serem usados nas diferentes
  199 + // instâncias de objetos legados e novos
  200 + $this->_setConfigOptions('usuario', array('cod_usuario' => 1))
  201 + ->_setConfigOptions('matricula', $this->_getMatricula())
  202 + ->_setConfigOptions('serie', $this->_getSerie())
  203 + ->_setConfigOptions('curso', $this->_getCurso())
  204 + ->_setConfigOptions('escolaAnoLetivo', $this->_getEscolaAnoLetivo())
  205 + ->_setConfigOptions('anoLetivoModulo', $this->_getAnoLetivoModulo())
  206 + ->_setConfigOptions('escolaSerieDisciplina', $this->_getEscolaSerieDisciplina())
  207 + ->_setConfigOptions('dispensaDisciplina', $this->_getDispensaDisciplina())
  208 + ->_setConfigOptions('componenteCurricular', $this->_getComponenteCurricular())
  209 + ->_setConfigOptions('notaAluno', $this->_getNotaAluno())
  210 + ->_setConfigOptions('faltaAluno', $this->_getFaltaAluno())
  211 + ->_setConfigOptions('parecerDescritivoAluno', $this->_getParecerDescritivoAluno());
  212 +
  213 + // Configura atributos de RegraAvaliacao_Model_Regra
  214 + $this->_setRegraOption('formulaMedia', $this->_setUpFormulaMedia())
  215 + ->_setRegraOption('formulaRecuperacao', $this->_setUpFormulaRecuperacao())
  216 + ->_setRegraOption('tabelaArredondamento', $this->_setUpTabelaArredondamento());
  217 + }
  218 +
  219 + protected function _getServiceInstance()
  220 + {
  221 + // Configura mappers das dependências de Avalilacao_Service_Boletim
  222 + $mappers = array(
  223 + 'RegraDataMapper' => $this->_getRegraDataMapperMock(),
  224 + 'ComponenteDataMapper' => $this->_getComponenteDataMapperMock(),
  225 + 'NotaAlunoDataMapper' => $this->_getNotaAlunoDataMapperMock(),
  226 + 'NotaComponenteDataMapper' => $this->_getNotaComponenteDataMapperMock(),
  227 + 'NotaComponenteMediaDataMapper' => $this->_getNotaComponenteMediaDataMapperMock(),
  228 + 'FaltaAlunoDataMapper' => $this->_getFaltaAlunoDataMapperMock(),
  229 + 'FaltaAbstractDataMapper' => $this->_getFaltaAbstractDataMapperMock(),
  230 + 'ParecerDescritivoAlunoDataMapper' => $this->_getParecerDescritivoAlunoDataMapperMock(),
  231 + 'ParecerDescritivoAbstractDataMapper' => $this->_getParecerDescritivoAbstractDataMapperMock(),
  232 + );
  233 +
  234 + $this->_setConfigOptions('mappers', $mappers);
  235 +
  236 + // Cria os mocks das classes legadas
  237 + $this->_setUpMatriculaMock()
  238 + ->_setUpCursoMock()
  239 + ->_setUpSerieMock()
  240 + ->_setUpEscolaAnoLetivo()
  241 + ->_setUpAnoLetivoModulo()
  242 + ->_setUpEscolaSerieDisciplinaMock()
  243 + ->_setUpDispensaDisciplinaMock();
  244 +
  245 + // Instancia o service
  246 + return new Avaliacao_Service_Boletim($this->_getServiceOptions());
  247 + }
  248 +
  249 + /**
  250 + * Getter. Retorna o array de opções para a inicialização do service.
  251 + * @return array
  252 + */
  253 + protected function _getServiceOptions()
  254 + {
  255 + return array(
  256 + 'matricula' => $this->_getConfigOption('matricula', 'cod_matricula'),
  257 + 'usuario' => $this->_getConfigOption('usuario', 'cod_usuario'),
  258 + 'RegraDataMapper' => $this->_getConfigOption('mappers', 'RegraDataMapper'),
  259 + 'ComponenteDataMapper' => $this->_getConfigOption('mappers', 'ComponenteDataMapper'),
  260 + 'NotaAlunoDataMapper' => $this->_getConfigOption('mappers', 'NotaAlunoDataMapper'),
  261 + 'NotaComponenteDataMapper' => $this->_getConfigOption('mappers', 'NotaComponenteDataMapper'),
  262 + 'NotaComponenteMediaDataMapper' => $this->_getConfigOption('mappers', 'NotaComponenteMediaDataMapper'),
  263 + 'FaltaAlunoDataMapper' => $this->_getConfigOption('mappers', 'FaltaAlunoDataMapper'),
  264 + 'FaltaAbstractDataMapper' => $this->_getConfigOption('mappers', 'FaltaAbstractDataMapper'),
  265 + 'ParecerDescritivoAlunoDataMapper' => $this->_getConfigOption('mappers', 'ParecerDescritivoAlunoDataMapper'),
  266 + 'ParecerDescritivoAbstractDataMapper' => $this->_getConfigOption('mappers', 'ParecerDescritivoAbstractDataMapper'),
  267 + );
  268 + }
  269 +
  270 + /**
  271 + * Setter.
  272 + *
  273 + * @param string $namespace
  274 + * @param array $data
  275 + * @return Avaliacao_Service_TestCommon
  276 + */
  277 + protected function _setConfigOptions($namespace, array $data)
  278 + {
  279 + $namespace = strtolower($namespace);
  280 +
  281 + $this->_config[$namespace] = array();
  282 +
  283 + // Chama _setConfigOption() para não sobrescrever opções já configuradas
  284 + foreach ($data as $key => $value) {
  285 + $this->_setConfigOption($namespace, $key, $value);
  286 + }
  287 +
  288 + return $this;
  289 + }
  290 +
  291 + /**
  292 + * Getter.
  293 + *
  294 + * @param string $namespace
  295 + * @return mixed
  296 + */
  297 + protected function _getConfigOptions($namespace)
  298 + {
  299 + $namespace = strtolower($namespace);
  300 +
  301 + if (!isset($this->_config[$namespace])) {
  302 + throw new Exception('_getConfigOption namespace');
  303 + }
  304 +
  305 + return $this->_config[$namespace];
  306 + }
  307 +
  308 + /**
  309 + * Setter.
  310 + *
  311 + * @param string $namespace
  312 + * @param string $key
  313 + * @param mixed $value
  314 + * @return Avaliacao_Service_TestCommon
  315 + */
  316 + protected function _setConfigOption($namespace, $key, $value)
  317 + {
  318 + $namespace = strtolower($namespace);
  319 +
  320 + if (!isset($this->_config[$namespace])) {
  321 + $this->_config[$namespace] = array();
  322 + }
  323 +
  324 + $this->_config[$namespace][$key] = $value;
  325 + return $this;
  326 + }
  327 +
  328 + /**
  329 + * Getter.
  330 + *
  331 + * @param string $namespace
  332 + * @param string $key
  333 + * @return mixed
  334 + */
  335 + protected function _getConfigOption($namespace, $key)
  336 + {
  337 + $namespace = strtolower($namespace);
  338 +
  339 + if (!isset($this->_config[$namespace])) {
  340 + throw new Exception('_getConfigOption namespace');
  341 + }
  342 +
  343 + if (!isset($this->_config[$namespace][$key])) {
  344 + throw new Exception('_getConfigOption option name: ' . $key);
  345 + }
  346 +
  347 + return $this->_config[$namespace][$key];
  348 + }
  349 +
  350 + /**
  351 + * @return array
  352 + */
  353 + protected function _getMatricula()
  354 + {
  355 + return array(
  356 + 'cod_matricula' => 1,
  357 + 'ref_cod_curso' => 1,
  358 + 'ref_ref_cod_serie' => 1,
  359 + 'ref_ref_cod_escola' => 1,
  360 + 'aprovado' => 1
  361 + );
  362 + }
  363 +
  364 + /**
  365 + * @return array
  366 + */
  367 + protected function _getSerie()
  368 + {
  369 + return array(
  370 + 'regra_avaliacao_id' => 1,
  371 + 'carga_horaria' => 800
  372 + );
  373 + }
  374 +
  375 + /**
  376 + * @return array
  377 + */
  378 + protected function _getCurso()
  379 + {
  380 + return array(
  381 + 'carga_horaria' => 800 * 9,
  382 + 'hora_falta' => (50 / 60),
  383 + 'padrao_ano_escolar' => 1
  384 + );
  385 + }
  386 +
  387 + /**
  388 + * @return array
  389 + */
  390 + protected function _getEscolaAnoLetivo()
  391 + {
  392 + return array(array(
  393 + 'ref_cod_escola' => 1,
  394 + 'ano' => 2009,
  395 + 'andamento' => 1,
  396 + 'ativo' => 1
  397 + ));
  398 + }
  399 +
  400 + /**
  401 + * @return array
  402 + */
  403 + protected function _getAnoLetivoModulo()
  404 + {
  405 + return array(
  406 + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 1),
  407 + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 2),
  408 + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 3),
  409 + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 4)
  410 + );
  411 + }
  412 +
  413 + /**
  414 + * Retorna um array com as possíveis etapas a serem cursadas.
  415 + * @return array
  416 + * @todo Condicionar o retorno de 'Rc' caso exista recuperação na Regra
  417 + */
  418 + protected function _getEtapasPossiveis()
  419 + {
  420 + $etapas = count($this->_getConfigOptions('anoLetivoModulo'));
  421 + return array_merge(range(1, $etapas, 1), array('Rc'));
  422 + }
  423 +
  424 + /**
  425 + * @return array
  426 + */
  427 + protected function _getEscolaSerieDisciplina()
  428 + {
  429 + return array(
  430 + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 1, 'carga_horaria' => 250),
  431 + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 2, 'carga_horaria' => 250),
  432 + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 3, 'carga_horaria' => 150),
  433 + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 4, 'carga_horaria' => 150),
  434 + );
  435 + }
  436 +
  437 + /**
  438 + * @return array
  439 + */
  440 + protected function _getDispensaDisciplina()
  441 + {
  442 + return array();
  443 + }
  444 +
  445 + /**
  446 + * @return array
  447 + */
  448 + protected function _getComponenteCurricular()
  449 + {
  450 + return array(
  451 + 1 => new ComponenteCurricular_Model_Componente(
  452 + array('id' => 1, 'nome' => 'Matemática', 'cargaHoraria' => 100)
  453 + ),
  454 + 2 => new ComponenteCurricular_Model_Componente(
  455 + array('id' => 2, 'nome' => 'Português', 'cargaHoraria' => 100)
  456 + ),
  457 + 3 => new ComponenteCurricular_Model_Componente(
  458 + array('id' => 3, 'nome' => 'Ciências', 'cargaHoraria' => 60)
  459 + ),
  460 + 4 => new ComponenteCurricular_Model_Componente(
  461 + array('id' => 4, 'nome' => 'Física', 'cargaHoraria' => 60)
  462 + )
  463 + );
  464 + }
  465 +
  466 + /**
  467 + * Retorna os componentes cursados pelo aluno.
  468 + * @return array
  469 + */
  470 + protected function _getComponentesCursados()
  471 + {
  472 + return array_diff(
  473 + array_keys($this->_getComponenteCurricular()),
  474 + array_keys($this->_getDispensaDisciplina())
  475 + );
  476 + }
  477 +
  478 + /**
  479 + * @return Avaliacao_Model_NotaAluno
  480 + */
  481 + protected function _getNotaAluno()
  482 + {
  483 + $matricula = $this->_getConfigOption('matricula', 'cod_matricula');
  484 +
  485 + return array('instance' => new Avaliacao_Model_NotaAluno(array(
  486 + 'id' => 1,
  487 + 'matricula' => $matricula
  488 + )));
  489 + }
  490 +
  491 + /**
  492 + * @return array
  493 + */
  494 + protected function _getFaltaAluno()
  495 + {
  496 + $matricula = $this->_getConfigOption('matricula', 'cod_matricula');
  497 +
  498 + return array('instance' => new Avaliacao_Model_FaltaAluno(array(
  499 + 'id' => 1,
  500 + 'matricula' => $matricula,
  501 + 'tipoFalta' => $this->_getRegraOption('tipoPresenca')
  502 + )));
  503 + }
  504 +
  505 + /**
  506 + * @return array
  507 + */
  508 + protected function _getParecerDescritivoAluno()
  509 + {
  510 + $matricula = $this->_getConfigOption('matricula', 'cod_matricula');
  511 +
  512 + return array('instance' => new Avaliacao_Model_ParecerDescritivoAluno(array(
  513 + 'id' => 1,
  514 + 'matricula' => $matricula,
  515 + 'parecerDescritivo' => $this->_getRegraOption('parecerDescritivo')
  516 + )));
  517 + }
  518 +
  519 + /**
  520 + * @return clsPmieducarMatricula
  521 + */
  522 + protected function _setUpMatriculaMock()
  523 + {
  524 + $mock = $this->getCleanMock('clsPmieducarMatricula');
  525 +
  526 + $mock->expects($this->any())
  527 + ->method('detalhe')
  528 + ->will($this->returnValue($this->_getConfigOptions('matricula')));
  529 +
  530 + CoreExt_Entity::addClassToStorage('clsPmieducarMatricula',
  531 + $mock, NULL, TRUE
  532 + );
  533 +
  534 + return $this;
  535 + }
  536 +
  537 + /**
  538 + * @return clsPmieducarSerie
  539 + */
  540 + protected function _setUpSerieMock()
  541 + {
  542 + $mock = $this->getCleanMock('clsPmieducarSerie');
  543 +
  544 + $mock->expects($this->any())
  545 + ->method('detalhe')
  546 + ->will($this->returnValue($this->_getConfigOptions('serie')));
  547 +
  548 + CoreExt_Entity::addClassToStorage('clsPmieducarSerie',
  549 + $mock, NULL, TRUE
  550 + );
  551 +
  552 + return $this;
  553 + }
  554 +
  555 + /**
  556 + * @return clsPmieducarCurso
  557 + */
  558 + protected function _setUpCursoMock()
  559 + {
  560 + $mock = $this->getCleanMock('clsPmieducarCurso');
  561 +
  562 + $mock->expects($this->any())
  563 + ->method('detalhe')
  564 + ->will($this->returnValue($this->_getConfigOptions('curso')));
  565 +
  566 + CoreExt_Entity::addClassToStorage('clsPmieducarCurso',
  567 + $mock, NULL, TRUE
  568 + );
  569 +
  570 + return $this;
  571 + }
  572 +
  573 + /**
  574 + * @return clsPmieducarEscolaAnoLetivo
  575 + */
  576 + protected function _setUpEscolaAnoLetivo()
  577 + {
  578 + $mock = $this->getCleanMock('clsPmieducarEscolaAnoLetivo');
  579 +
  580 + $mock->expects($this->any())
  581 + ->method('lista')
  582 + ->with(1, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1)
  583 + ->will($this->returnValue($this->_getConfigOptions('escolaAnoLetivo')));
  584 +
  585 + CoreExt_Entity::addClassToStorage('clsPmieducarEscolaAnoLetivo',
  586 + $mock, NULL, TRUE
  587 + );
  588 +
  589 + return $this;
  590 + }
  591 +
  592 + /**
  593 + * @return clsPmieducarAnoLetivoModulo
  594 + */
  595 + protected function _setUpAnoLetivoModulo()
  596 + {
  597 + $mock = $this->getCleanMock('clsPmieducarAnoLetivoModulo');
  598 +
  599 + $mock->expects($this->any())
  600 + ->method('lista')
  601 + ->with(2009, 1)
  602 + ->will($this->returnValue($this->_getConfigOptions('anoLetivoModulo')));
  603 +
  604 + CoreExt_Entity::addClassToStorage('clsPmieducarAnoLetivoModulo',
  605 + $mock, NULL, TRUE
  606 + );
  607 +
  608 + return $this;
  609 + }
  610 +
  611 + /**
  612 + * @return clsPmieducarEscolaSerieDisciplina
  613 + */
  614 + protected function _setUpEscolaSerieDisciplinaMock()
  615 + {
  616 + $mock = $this->getCleanMock('clsPmieducarEscolaSerieDisciplina');
  617 +
  618 + $mock->expects($this->any())
  619 + ->method('lista')
  620 + ->will($this->returnValue($this->_getConfigOptions('escolaSerieDisciplina')));
  621 +
  622 + CoreExt_Entity::addClassToStorage('clsPmieducarEscolaSerieDisciplina',
  623 + $mock, NULL, TRUE
  624 + );
  625 +
  626 + return $this;
  627 + }
  628 +
  629 + /**
  630 + * @return clsPmieducarDispensaDisciplina
  631 + */
  632 + protected function _setUpDispensaDisciplinaMock()
  633 + {
  634 + $mock = $this->getCleanMock('clsPmieducarDispensaDisciplina');
  635 +
  636 + $mock->expects($this->any())
  637 + ->method('lista')
  638 + ->will($this->returnValue($this->_getConfigOptions('dispensaDisciplina')));
  639 +
  640 + CoreExt_Entity::addClassToStorage('clsPmieducarDispensaDisciplina',
  641 + $mock, NULL, TRUE
  642 + );
  643 +
  644 + return $this;
  645 + }
  646 +
  647 + /**
  648 + * Configura e retorna um mock de RegraAvaliacaoDataMapper que retorna uma
  649 + * instância de RegraAvaliacao_Model_Regra configurada de acordo com as
  650 + * opções do array $_regraOptions.
  651 + *
  652 + * @return RegraAvaliacao_Model_RegraDataMapper
  653 + */
  654 + protected function _getRegraDataMapperMock()
  655 + {
  656 + $regraAvaliacao = new RegraAvaliacao_Model_Regra($this->_regraOptions);
  657 +
  658 + $mock = $this->getCleanMock('RegraAvaliacao_Model_RegraDataMapper');
  659 + $mock->expects($this->any())
  660 + ->method('find')
  661 + ->with(1)
  662 + ->will($this->returnValue($regraAvaliacao));
  663 +
  664 + return $mock;
  665 + }
  666 +
  667 + /**
  668 + * Configura uma das opções a serem passadas durante a instanciação de
  669 + * RegraAvaliacao_Model_Regra.
  670 + *
  671 + * @param string $key
  672 + * @param mixed $value
  673 + */
  674 + protected function _setRegraOption($key, $value)
  675 + {
  676 + if (!array_key_exists($key, $this->_regraOptions)) {
  677 + require_once 'CoreExt/Exception/InvalidArgumentException.php';
  678 + throw new CoreExt_Exception_InvalidArgumentException('regraOption:' . $key);
  679 + }
  680 +
  681 + $this->_regraOptions[$key] = $value;
  682 + return $this;
  683 + }
  684 +
  685 + /**
  686 + * Getter.
  687 + *
  688 + * @param string $key
  689 + * @return mixed
  690 + */
  691 + protected function _getRegraOption($key)
  692 + {
  693 + if (!array_key_exists($key, $this->_regraOptions)) {
  694 + require_once 'CoreExt/Exception/InvalidArgumentException.php';
  695 + throw new CoreExt_Exception_InvalidArgumentException('regraOption: ' . $key);
  696 + }
  697 +
  698 + return $this->_regraOptions[$key];
  699 + }
  700 +
  701 + /**
  702 + * @return FormulaMedia_Model_Formula
  703 + */
  704 + protected function _setUpFormulaMedia()
  705 + {
  706 + return new FormulaMedia_Model_Formula(array(
  707 + 'id' => 1,
  708 + 'nome' => 'Média aritmética',
  709 + 'formulaMedia' => 'Se / Et',
  710 + 'tipoFormula' => FormulaMedia_Model_TipoFormula::MEDIA_FINAL
  711 + ));
  712 + }
  713 +
  714 + /**
  715 + * @return FormulaMedia_Model_Formula
  716 + */
  717 + protected function _setUpFormulaRecuperacao()
  718 + {
  719 + return new FormulaMedia_Model_Formula(array(
  720 + 'id' => 1,
  721 + 'nome' => 'Média ponderada',
  722 + 'formulaMedia' => '(Se / Et * 0.6) + (Rc * 0.4)',
  723 + 'tipoFormula' => FormulaMedia_Model_TipoFormula::MEDIA_RECUPERACAO
  724 + ));
  725 + }
  726 +
  727 + /**
  728 + * @return TabelaArredondamento_Model_Tabela
  729 + */
  730 + protected function _setUpTabelaArredondamento()
  731 + {
  732 + // Valores padrão dos atributos de TabelaArredondamento_Model_TabelaValor
  733 + $data = array(
  734 + 'tabelaArredondamento' => 1,
  735 + 'nome' => NULL,
  736 + 'descricao' => NULL,
  737 + 'valorMinimo' => -1,
  738 + 'valorMaximo' => 0
  739 + );
  740 +
  741 + $tabelaValores = array();
  742 +
  743 + for ($i = 0; $i <= 10; $i++) {
  744 + $data['nome'] = $i;
  745 + $data['valorMinimo'] += 1;
  746 + $data['valorMaximo'] += 1;
  747 +
  748 + if ($i == 10) {
  749 + $data['valorMinimo'] = 9;
  750 + $data['valorMaximo'] = 10;
  751 + }
  752 +
  753 + $tabelaValores[$i] = new TabelaArredondamento_Model_TabelaValor($data);
  754 + }
  755 +
  756 + $mock = $this->getCleanMock('TabelaArredondamento_Model_TabelaValorDataMapper');
  757 + $mock->expects($this->any())
  758 + ->method('findAll')
  759 + ->will($this->returnValue($tabelaValores));
  760 +
  761 + $tabelaDataMapper = new TabelaArredondamento_Model_TabelaDataMapper();
  762 + $tabelaDataMapper->setTabelaValorDataMapper($mock);
  763 +
  764 + $tabela = new TabelaArredondamento_Model_Tabela(array('nome' => 'Numéricas'));
  765 + $tabela->setDataMapper($tabelaDataMapper);
  766 +
  767 + return $tabela;
  768 + }
  769 +
  770 + protected function _setComponenteDataMapperMock(ComponenteCurricular_Model_ComponenteDataMapper $mapper)
  771 + {
  772 + $this->_componenteDataMapperMock = $mapper;
  773 + return $this;
  774 + }
  775 +
  776 + protected function _getComponenteDataMapperMock()
  777 + {
  778 + if (is_null($this->_componenteDataMapperMock)) {
  779 + $componentes = $this->_getConfigOptions('componenteCurricular');
  780 +
  781 + // Mock para ComponenteCurricular_Model_ComponenteDataMapper
  782 + $mock = $this->getCleanMock('ComponenteCurricular_Model_ComponenteDataMapper');
  783 + $mock->expects($this->any())
  784 + ->method('findComponenteCurricularAnoEscolar')
  785 + ->will(new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($componentes));
  786 +
  787 + $this->_setComponenteDataMapperMock($mock);
  788 + }
  789 +
  790 + return $this->_componenteDataMapperMock;
  791 + }
  792 +
  793 + protected function _setNotaAlunoDataMapperMock(Avaliacao_Model_NotaAlunoDataMapper $mapper = NULL)
  794 + {
  795 + $this->_notaAlunoDataMapperMock = $mapper;
  796 + return $this;
  797 + }
  798 +
  799 + protected function _getNotaAlunoDataMapperMock()
  800 + {
  801 + if (is_null($this->_notaAlunoDataMapperMock)) {
  802 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  803 +
  804 + $mock = $this->getCleanMock('Avaliacao_Model_NotaAlunoDataMapper');
  805 + $mock->expects($this->at(0))
  806 + ->method('findAll')
  807 + ->with(array(), array('matricula' => $notaAluno->matricula))
  808 + ->will($this->returnValue(array($notaAluno)));
  809 +
  810 + $this->_setNotaAlunoDataMapperMock($mock);
  811 + }
  812 +
  813 + return $this->_notaAlunoDataMapperMock;
  814 + }
  815 +
  816 + protected function _setNotaComponenteDataMapperMock(Avaliacao_Model_NotaComponenteDataMapper $mapper)
  817 + {
  818 + $this->_notaComponenteDataMapperMock = $mapper;
  819 + return $this;
  820 + }
  821 +
  822 + protected function _getNotaComponenteDataMapperMock()
  823 + {
  824 + if (is_null($this->_notaComponenteDataMapperMock)) {
  825 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper');
  826 + $mock->expects($this->at(0))
  827 + ->method('findAll')
  828 + ->with(array(), array('notaAluno' => $this->_getConfigOption('matricula', 'cod_matricula')), array('etapa' => 'ASC'))
  829 + ->will($this->returnValue(array()));
  830 +
  831 + $this->_setNotaComponenteDataMapperMock($mock);
  832 + }
  833 +
  834 + return $this->_notaComponenteDataMapperMock;
  835 + }
  836 +
  837 + protected function _setNotaComponenteMediaDataMapperMock(Avaliacao_Model_NotaComponenteMediaDataMapper $mapper)
  838 + {
  839 + $this->_notaComponenteMediaDataMapperMock = $mapper;
  840 + return $this;
  841 + }
  842 +
  843 + protected function _getNotaComponenteMediaDataMapperMock()
  844 + {
  845 + if (is_null($this->_notaComponenteMediaDataMapperMock)) {
  846 + $notaAluno = $this->_getConfigOption('notaAluno', 'instance');
  847 +
  848 + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper');
  849 + $mock->expects($this->at(0))
  850 + ->method('findAll')
  851 + ->with(array(), array('notaAluno' => $notaAluno->id))
  852 + ->will($this->returnValue(array()));
  853 +
  854 + $this->_setNotaComponenteMediaDataMapperMock($mock);
  855 + }
  856 +
  857 + return $this->_notaComponenteMediaDataMapperMock;
  858 + }
  859 +
  860 + protected function _setFaltaAlunoDataMapperMock(Avaliacao_Model_FaltaAlunoDataMapper $mapper = NULL)
  861 + {
  862 + $this->_faltaAlunoDataMapperMock = $mapper;
  863 + return $this;
  864 + }
  865 +
  866 + protected function _getFaltaAlunoDataMapperMock()
  867 + {
  868 + if (is_null($this->_faltaAlunoDataMapperMock)) {
  869 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  870 +
  871 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAlunoDataMapper');
  872 + $mock->expects($this->at(0))
  873 + ->method('findAll')
  874 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  875 + ->will($this->returnValue(array($faltaAluno)));
  876 +
  877 + $this->_setFaltaAlunoDataMapperMock($mock);
  878 + }
  879 +
  880 + return $this->_faltaAlunoDataMapperMock;
  881 + }
  882 +
  883 + protected function _setFaltaAbstractDataMapperMock(Avaliacao_Model_FaltaAbstractDataMapper $mapper)
  884 + {
  885 + $this->_faltaAbstractDataMapperMock = $mapper;
  886 + return $this;
  887 + }
  888 +
  889 + protected function _getFaltaAbstractDataMapperMock()
  890 + {
  891 + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance');
  892 +
  893 + if (is_null($this->_faltaAbstractDataMapperMock)) {
  894 + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAbstractDataMapper');
  895 + $mock->expects($this->at(0))
  896 + ->method('findAll')
  897 + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC'))
  898 + ->will($this->returnValue(array()));
  899 +
  900 + $this->_setFaltaAbstractDataMapperMock($mock);
  901 + }
  902 +
  903 + return $this->_faltaAbstractDataMapperMock;
  904 + }
  905 +
  906 + protected function _setParecerDescritivoAlunoDataMapperMock(Avaliacao_Model_ParecerDescritivoAlunoDataMapper $mapper)
  907 + {
  908 + $this->_parecerDescritivoAlunoDataMapperMock = $mapper;
  909 + return $this;
  910 + }
  911 +
  912 + protected function _getParecerDescritivoAlunoDataMapperMock()
  913 + {
  914 + if (is_null($this->_parecerDescritivoAlunoDataMapperMock)) {
  915 + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance');
  916 +
  917 + $mock = $this->getCleanMock('Avaliacao_Model_ParecerDescritivoAlunoDataMapper');
  918 + $mock->expects($this->at(0))
  919 + ->method('findAll')
  920 + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula')))
  921 + ->will($this->returnValue(array($parecerAluno)));
  922 +
  923 + $this->_setParecerDescritivoAlunoDataMapperMock($mock);
  924 + }
  925 +
  926 + return $this->_parecerDescritivoAlunoDataMapperMock;
  927 + }
  928 +
  929 + protected function _setParecerDescritivoAbstractDataMapperMock(Avaliacao_Model_ParecerDescritivoAbstractDataMapper $mapper)
  930 + {
  931 + $this->_parecerDescritivoAbstractDataMapperMock = $mapper;
  932 + return $this;
  933 + }
  934 +
  935 + protected function _getParecerDescritivoAbstractDataMapperMock()
  936 + {
  937 + if (is_null($this->_parecerDescritivoAbstractDataMapperMock)) {
  938 + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance');
  939 +
  940 + $mock = $this->getCleanMock('Avaliacao_Model_ParecerDescritivoAbstractDataMapper');
  941 + $mock->expects($this->at(0))
  942 + ->method('findAll')
  943 + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC'))
  944 + ->will($this->returnValue(array()));
  945 +
  946 + $this->_setParecerDescritivoAbstractDataMapperMock($mock);
  947 + }
  948 +
  949 + return $this->_parecerDescritivoAbstractDataMapperMock;
  950 + }
  951 +}
0 \ No newline at end of file 952 \ No newline at end of file
ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php 0 → 100644
@@ -0,0 +1,125 @@ @@ -0,0 +1,125 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage UnitTests
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'Avaliacao/_tests/Service/TestCommon.php';
  33 +
  34 +/**
  35 + * Avaliacao_Service_UtilityTest class.
  36 + *
  37 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  38 + * @category i-Educar
  39 + * @license @@license@@
  40 + * @package Avaliacao
  41 + * @subpackage UnitTests
  42 + * @since Classe disponível desde a versão 1.1.0
  43 + * @version @@package_version@@
  44 + */
  45 +class Avaliacao_Service_UtilityTest extends Avaliacao_Service_TestCommon
  46 +{
  47 + public function testArredondaNotaLancaExcecaoSeParametroNaoForInstanciaDeAvaliacaomodelnotacomponenteOuNumerico()
  48 + {
  49 + $service = $this->_getServiceInstance();
  50 +
  51 + try {
  52 + $service->arredondaNota(new Avaliacao_Model_NotaComponente());
  53 + $this->fail('O valor "instância Avaliacao_Model_NotaComponente()" deveria '
  54 + . 'ter causado um exceção pois o atributo "nota" é NULL por padrão.');
  55 + }
  56 + catch (CoreExt_Exception_InvalidArgumentException $e) {
  57 + }
  58 +
  59 + try {
  60 + $service->arredondaNota('abc 7.5');
  61 + $this->fail('O valor "abc 7.5" deveria ter causado um exceção.');
  62 + }
  63 + catch (CoreExt_Exception_InvalidArgumentException $e) {
  64 + }
  65 + }
  66 +
  67 + public function testArredondaNotaNumerica()
  68 + {
  69 + $service = $this->_getServiceInstance();
  70 + $this->assertEquals(5, $service->arredondaNota(5.5));
  71 + }
  72 +
  73 + public function testArredondaNotaConceitual()
  74 + {
  75 + // Valores padrão dos atributos de TabelaArredondamento_Model_TabelaValor
  76 + $data = array(
  77 + 'tabelaArredondamento' => 1,
  78 + 'nome' => NULL,
  79 + 'descricao' => NULL,
  80 + 'valorMinimo' => -1,
  81 + 'valorMaximo' => 0
  82 + );
  83 +
  84 + $tabelaValores = array();
  85 +
  86 + // I
  87 + $tabelaValores[0] = new TabelaArredondamento_Model_TabelaValor($data);
  88 + $tabelaValores[0]->nome = 'I';
  89 + $tabelaValores[0]->descricao = 'Incompleto';
  90 + $tabelaValores[0]->valorMinimo = 0;
  91 + $tabelaValores[0]->valorMaximo = 5.50;
  92 +
  93 + // S
  94 + $tabelaValores[1] = new TabelaArredondamento_Model_TabelaValor($data);
  95 + $tabelaValores[1]->nome = 'S';
  96 + $tabelaValores[1]->descricao = 'Suficiente';
  97 + $tabelaValores[1]->valorMinimo = 5.51;
  98 + $tabelaValores[1]->valorMaximo = 8;
  99 +
  100 + // O
  101 + $tabelaValores[2] = new TabelaArredondamento_Model_TabelaValor($data);
  102 + $tabelaValores[2]->nome = 'O';
  103 + $tabelaValores[2]->descricao = 'Ótimo';
  104 + $tabelaValores[2]->valorMinimo = 8.01;
  105 + $tabelaValores[2]->valorMaximo = 10.0;
  106 +
  107 + $mock = $this->getCleanMock('TabelaArredondamento_Model_TabelaValorDataMapper');
  108 + $mock->expects($this->any())
  109 + ->method('findAll')
  110 + ->will($this->returnValue($tabelaValores));
  111 +
  112 + $tabelaDataMapper = new TabelaArredondamento_Model_TabelaDataMapper();
  113 + $tabelaDataMapper->setTabelaValorDataMapper($mock);
  114 +
  115 + $tabela = new TabelaArredondamento_Model_Tabela(array('nome' => 'Conceituais'));
  116 + $tabela->setDataMapper($tabelaDataMapper);
  117 +
  118 + $this->_setRegraOption('tabelaArredondamento', $tabela);
  119 +
  120 + $service = $this->_getServiceInstance();
  121 + $this->assertEquals('I', $service->arredondaNota(5.49));
  122 + $this->assertEquals('S', $service->arredondaNota(6.50));
  123 + $this->assertEquals('O', $service->arredondaNota(9.15));
  124 + }
  125 +}
0 \ No newline at end of file 126 \ No newline at end of file