From 2ec380bbc48d14c5850098e3274efd9d7ffcfdbb Mon Sep 17 00:00:00 2001 From: Eriksen Costa Date: Wed, 21 Jul 2010 21:06:44 -0300 Subject: [PATCH] Adicionada classe {{{ComponenteCurricular_Model_Turma}}}. Usuário poderá definir componentes curriculares específicos para uma turma: --- ieducar/intranet/educar_turma_cad.php | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- ieducar/lib/App/Model/IedFinder.php | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- ieducar/misc/database/deltas/23_cria_tabela_modules_componente_curricular_turma.sql | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/misc/database/ieducar.sql | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/Service/Boletim.php | 37 ++++++++++++++++++++++++++++++++++++- ieducar/modules/Avaliacao/_data/install.sql | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++------------------ ieducar/modules/Avaliacao/_tests/Service/TestCommon.php | 38 ++++++++++++++++++++++++++++++++++++++ ieducar/modules/ComponenteCurricular/Model/Turma.php | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/ComponenteCurricular/Model/TurmaDataMapper.php | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/ComponenteCurricular/_tests/TurmaDataMapperTest.php | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/ComponenteCurricular/_tests/TurmaTest.php | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/tests/unit/App/Model/IedFinderTest.php | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------- 12 files changed, 945 insertions(+), 98 deletions(-) create mode 100644 ieducar/misc/database/deltas/23_cria_tabela_modules_componente_curricular_turma.sql create mode 100644 ieducar/modules/ComponenteCurricular/Model/Turma.php create mode 100644 ieducar/modules/ComponenteCurricular/Model/TurmaDataMapper.php create mode 100644 ieducar/modules/ComponenteCurricular/_tests/TurmaDataMapperTest.php create mode 100644 ieducar/modules/ComponenteCurricular/_tests/TurmaTest.php diff --git a/ieducar/intranet/educar_turma_cad.php b/ieducar/intranet/educar_turma_cad.php index 5c0819d..a42effc 100644 --- a/ieducar/intranet/educar_turma_cad.php +++ b/ieducar/intranet/educar_turma_cad.php @@ -324,8 +324,93 @@ class indice extends clsCadastro $this->campoHora( 'hora_fim_intervalo', 'Hora Fim Intervalo', $this->hora_fim_intervalo, FALSE); - // Inclui módulo - $this->campoQuebra(); + if ($this->ref_ref_cod_serie) { + require_once 'ComponenteCurricular/Model/ComponenteDataMapper.php'; + require_once 'ComponenteCurricular/Model/AnoEscolarDataMapper.php'; + require_once 'ComponenteCurricular/Model/TurmaDataMapper.php'; + + $disciplinas = ''; + $conteudo = ''; + + // Instancia o mapper de componente curricular + $mapper = new ComponenteCurricular_Model_ComponenteDataMapper(); + + // Instancia o mapper de ano escolar + $anoEscolar = new ComponenteCurricular_Model_AnoEscolarDataMapper(); + $lista = $anoEscolar->findComponentePorSerie($this->ref_ref_cod_serie); + + // Instancia o mapper de turma + $componenteTurmaMapper = new ComponenteCurricular_Model_TurmaDataMapper(); + $componentesTurma = $componenteTurmaMapper->findAll(array(), array('turma' => $this->cod_turma)); + + $componentes = array(); + foreach ($componentesTurma as $componenteTurma) { + $componentes[$componenteTurma->get('componenteCurricular')] = $componenteTurma; + } + unset($componentesTurma); + + $this->escola_serie_disciplina = array(); + + if (is_array($lista) && count($lista)) { + $conteudo .= '
'; + $conteudo .= ' Nome'; + $conteudo .= ' Carga horária'; + $conteudo .= ' Usar padrão do componente?'; + $conteudo .= '
'; + $conteudo .= '
'; + + foreach ($lista as $registro) { + $checked = ''; + + if (isset($componentes[$registro->id])) { + $checked = 'checked="checked"'; + } + + if (is_null($componentes[$registro->id]->cargaHoraria) || + 0 == $componentes[$registro->id]->cargaHoraria) { + $usarComponente = TRUE; + } + else { + $cargaHoraria = $componentes[$registro->id]->cargaHoraria; + } + $cargaComponente = $registro->cargaHoraria; + + $conteudo .= '
'; + $conteudo .= " "; + $conteudo .= " "; + $conteudo .= " "; + $conteudo .= '
'; + $conteudo .= '
'; + + $cargaHoraria = ''; + } + + $disciplinas = ''; + $disciplinas .= sprintf('', $conteudo); + $disciplinas .= '
%s
'; + } + else { + $disciplinas = 'A série/ano escolar não possui componentes curriculares cadastrados.'; + } + } + + $this->campoQuebra2(); + + $help = array(); + $componentes = App_Model_IedFinder::getEscolaSerieDisciplina($this->ref_ref_cod_serie, $this->ref_cod_escola); + foreach ($componentes as $componente) { + $help[] = sprintf('%s (%.0f h)', $componente->nome, $componente->cargaHoraria); + } + $help = ''; + + $label = 'Componentes curriculares:
' + . 'Observação: caso não defina os componentes
' + . 'curriculares para a turma, esta usará a definição
' + . 'da série/ano escolar da escola' + . $help; + + $this->campoRotulo('disciplinas_', $label, + "
$disciplinas
"); if ($_POST['turma_modulo']) { $this->turma_modulo = unserialize(urldecode($_POST['turma_modulo'])); @@ -540,14 +625,14 @@ class indice extends clsCadastro $this->ref_cod_instituicao_regente = $this->ref_cod_instituicao; - if ($this->multiseriada == 'on') { + if (isset($this->multiseriada)) { $this->multiseriada = 1; } else { $this->multiseriada = 0; } - if ($this->visivel == 'on') { + if (isset($this->visivel)) { $this->visivel = TRUE; } else { @@ -648,6 +733,11 @@ class indice extends clsCadastro return FALSE; } + + $this->atualizaComponentesCurriculares( + $this->ref_ref_cod_serie, $this->ref_cod_escola, $this->cod_turma, + $this->disciplinas, $this->carga_horaria, $this->usar_componente + ); } function Editar() @@ -658,14 +748,14 @@ class indice extends clsCadastro $this->ref_cod_instituicao_regente = $this->ref_cod_instituicao; - if ($this->multiseriada == 'on') { + if (isset($this->multiseriada)) { $this->multiseriada = 1; } else { $this->multiseriada = 0; } - if ($this->visivel == 'on') { + if (isset($this->visivel)) { $this->visivel = TRUE; } else { @@ -761,6 +851,11 @@ class indice extends clsCadastro $editou = $obj->edita(); } + $this->atualizaComponentesCurriculares( + $this->ref_ref_cod_serie, $this->ref_cod_escola, $this->cod_turma, + $this->disciplinas, $this->carga_horaria, $this->usar_componente + ); + if ($editou) { $this->mensagem .= 'Edição efetuada com sucesso.'; header('Location: educar_turma_lst.php'); @@ -774,6 +869,26 @@ class indice extends clsCadastro } } + function atualizaComponentesCurriculares($codSerie, $codEscola, $codTurma, $componentes, $cargaHoraria, $usarComponente) + { + require_once 'ComponenteCurricular/Model/TurmaDataMapper.php'; + $mapper = new ComponenteCurricular_Model_TurmaDataMapper(); + + $componentesTurma = array(); + + foreach ($componentes as $key => $value) { + $carga = isset($usarComponente[$key]) ? + NULL : $cargaHoraria[$key]; + + $componentesTurma[] = array( + 'id' => $value, + 'cargaHoraria' => $carga + ); + } + + $mapper->bulkUpdate($codSerie, $codEscola, $codTurma, $componentesTurma); + } + function Excluir() { @session_start(); @@ -1140,15 +1255,59 @@ document.getElementById('ref_ref_cod_serie').onchange = function() { if (this.value) { getHoraEscolaSerie(); + getComponentesCurriculares(this.value); } - if(document.getElementById('multiseriada').checked == true) { + if (document.getElementById('multiseriada').checked == true) { changeMultiSerie(); } hideMultiSerie(); } +function getComponentesCurriculares(campoSerie) +{ + var xml_disciplina = new ajax(parseComponentesCurriculares); + xml_disciplina.envia("educar_disciplina_xml.php?ser=" + campoSerie); +} + +function parseComponentesCurriculares(xml_disciplina) +{ + var campoDisciplinas = document.getElementById('disciplinas'); + var DOM_array = xml_disciplina.getElementsByTagName('disciplina'); + var conteudo = ''; + + if (DOM_array.length) { + conteudo += '
'; + conteudo += ' Nome'; + conteudo += '
'; + conteudo += '
'; + + for (var i = 0; i < DOM_array.length; i++) { + id = DOM_array[i].getAttribute("cod_disciplina"); + + conteudo += '
'; + conteudo += ' '; + conteudo += ' '; + conteudo += ' '; + conteudo += '
'; + conteudo += '
'; + } + } + else { + campoDisciplinas.innerHTML = 'A série/ano escolar não possui componentes ' + + 'curriculares cadastrados.'; + } + + if (conteudo) { + campoDisciplinas.innerHTML = ''; + campoDisciplinas.innerHTML += ''; + campoDisciplinas.innerHTML += '
'+ conteudo +'
'; + } +} + function hideMultiSerie() { setVisibility('tr_multiseriada', document.getElementById('ref_ref_cod_serie').value != '' ? true : false); @@ -1159,6 +1318,7 @@ function hideMultiSerie() setVisibility('ref_ref_cod_serie_mult', multiBool); setVisibility('tr_ref_ref_cod_serie_mult',multiBool); } + function PadraoAnoEscolar(xml) { var escola_curso_ = new Array(); diff --git a/ieducar/lib/App/Model/IedFinder.php b/ieducar/lib/App/Model/IedFinder.php index 8965b30..585fc61 100644 --- a/ieducar/lib/App/Model/IedFinder.php +++ b/ieducar/lib/App/Model/IedFinder.php @@ -239,20 +239,24 @@ class App_Model_IedFinder extends CoreExt_Entity * Retorna array com as referências de pmieducar.escola_serie_disciplina * a modules.componente_curricular ('ref_ref_cod_disciplina'). * - * @param int $codSerie - * @param int $codEscola - * @param ComponenteCurricular_Model_ComponenteDataMapper $mapper + * @param int $anoEscolar O código do ano escolar/série. + * @param int $escola O código da escola. + * @param ComponenteCurricular_Model_ComponenteDataMapper $mapper (Opcional) + * Instância do mapper para recuperar todas as instâncias persistidas de + * ComponenteCurricular_Model_Componente atribuídas no ano escolar/série da + * escola. * @return array - * @throws App_Model_Exception + * @throws App_Model_Exception caso não existam componentes curriculares + * atribuídos ao ano escolar/série da escola. */ - public static function getEscolaSerieDisciplina($codSerie, $codEscola, + public static function getEscolaSerieDisciplina($anoEscolar, $escola, ComponenteCurricular_Model_ComponenteDataMapper $mapper = NULL) { // Disciplinas na série na escola $escolaSerieDisciplina = self::addClassToStorage('clsPmieducarEscolaSerieDisciplina', NULL, 'include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php'); - $disciplinas = $escolaSerieDisciplina->lista($codSerie, $codEscola, NULL, 1); + $disciplinas = $escolaSerieDisciplina->lista($anoEscolar, $escola, NULL, 1); if (FALSE === $disciplinas) { throw new App_Model_Exception(sprintf( @@ -261,19 +265,91 @@ class App_Model_IedFinder extends CoreExt_Entity )); } + $componentes = array(); + foreach ($disciplinas as $disciplina) { + $componente = new stdClass(); + + $componente->id = $disciplina['ref_cod_disciplina']; + $componente->cargaHoraria = $disciplina['carga_horaria']; + + $componentes[] = $componente; + } + + return self::_hydrateComponentes($componentes, $anoEscolar, $mapper); + } + + /** + * Retorna as instâncias de ComponenteCurricular_Model_Componente de uma turma. + * + * @param int $anoEscolar O código do ano escolar/série da turma. + * @param int $escola O código da escola da turma. + * @param int $turma O código da turma. + * @param ComponenteCurricular_Model_TurmaDataMapper $mapper (Opcional) Instância + * do mapper para selecionar todas as referências de + * ComponenteCurricular_Model_Componente persistidas para a turma. + * @param ComponenteCurricular_Model_ComponenteDataMapper $componenteMapper (Opcional) + * Instância do mapper para recuperar as instâncias de + * ComponenteCurricular_Model_Componente recuperadas por $mapper. + * @return array + */ + public static function getComponentesTurma($anoEscolar, $escola, $turma, + ComponenteCurricular_Model_TurmaDataMapper $mapper = NULL, + ComponenteCurricular_Model_ComponenteDataMapper $componenteMapper = NULL) + { + if (is_null($mapper)) { + require_once 'ComponenteCurricular/Model/TurmaDataMapper.php'; + $mapper = new ComponenteCurricular_Model_TurmaDataMapper(); + } + + $componentesTurma = $mapper->findAll(array(), array('turma' => $turma)); + + // Não existem componentes específicos para a turma + if (0 == count($componentesTurma)) { + return self::getEscolaSerieDisciplina($anoEscolar, $escola, $componenteMapper); + } + + $componentes = array(); + foreach ($componentesTurma as $componenteTurma) { + $componente = new stdClass(); + + $componente->id = $componenteTurma->get('componenteCurricular'); + $componente->cargaHoraria = $componenteTurma->cargaHoraria; + + $componentes[] = $componente; + } + + return self::_hydrateComponentes($componentes, $anoEscolar, $componenteMapper); + } + + /** + * Recupera instâncias persistidas de ComponenteCurricular_Model_Componente, + * retornando-as com a carga horária padrão caso o componente identificado + * em $componentes possua uma carga horária (atributo cargaHoraria) nula. + * + * @param array $componentes (array(stdClass->id, stdClass->cargaHoraria)) + * @param int $anoEscolar O ano escolar/série para recuperar a carga + * horária padrão do componente curricular. + * @param ComponenteCurricular_Model_ComponenteDataMapper $mapper (Opcional) + * O mapper para recuperar a instância persistida com a carga horária padrão. + * @return array + */ + protected static function _hydrateComponentes(array $componentes, $anoEscolar, + ComponenteCurricular_Model_ComponenteDataMapper $mapper = NULL) + { if (is_null($mapper)) { require_once 'ComponenteCurricular/Model/ComponenteDataMapper.php'; $mapper = new ComponenteCurricular_Model_ComponenteDataMapper(); } $ret = array(); - foreach ($disciplinas as $disciplina) { - $id = $disciplina['ref_cod_disciplina']; - $carga = $disciplina['carga_horaria']; - $componente = $mapper->findComponenteCurricularAnoEscolar($id, $codSerie); + foreach ($componentes as $componentePlaceholder) { + $id = $componentePlaceholder->id; + $carga = $componentePlaceholder->cargaHoraria; + + $componente = $mapper->findComponenteCurricularAnoEscolar($id, $anoEscolar); - if (!is_null($carga)) { + if (! is_null($carga)) { $componente->cargaHoraria = $carga; } @@ -375,22 +451,27 @@ class App_Model_IedFinder extends CoreExt_Entity * de cursar. * * @param int $codMatricula - * @param ComponenteCurricular_Model_ComponenteDataMapper $mapper + * @param ComponenteCurricular_Model_ComponenteDataMapper $componenteMapper + * @param ComponenteCurricular_Model_TurmaDataMapper $turmaMapper * @return array * @throws App_Model_Exception */ public static function getComponentesPorMatricula($codMatricula, - ComponenteCurricular_Model_ComponenteDataMapper $mapper = NULL) + ComponenteCurricular_Model_ComponenteDataMapper $componenteMapper = NULL, + ComponenteCurricular_Model_TurmaDataMapper $turmaMapper = NULL) { $matricula = self::getMatricula($codMatricula); $codEscola = $matricula['ref_ref_cod_escola']; $codSerie = $matricula['ref_ref_cod_serie']; + $turma = $matricula['ref_cod_turma']; $serie = self::getSerie($codSerie); // Disciplinas da escola na série em que o aluno está matriculado - $componentes = self::getEscolaSerieDisciplina($codSerie, $codEscola, $mapper); + $componentes = self::getComponentesTurma( + $codSerie, $codEscola, $turma, $turmaMapper, $componenteMapper + ); // Dispensas do aluno $disciplinasDispensa = self::getDisciplinasDispensadasPorMatricula( diff --git a/ieducar/misc/database/deltas/23_cria_tabela_modules_componente_curricular_turma.sql b/ieducar/misc/database/deltas/23_cria_tabela_modules_componente_curricular_turma.sql new file mode 100644 index 0000000..f7383df --- /dev/null +++ b/ieducar/misc/database/deltas/23_cria_tabela_modules_componente_curricular_turma.sql @@ -0,0 +1,48 @@ +-- // + +-- +-- Cria a tabela modules.componente_curricular_turma para permitir a atribuição +-- de componentes curriculares a uma turma, dando mais flexibilidade de +-- configuração ao usuário. +-- +-- @author Eriksen Costa Paixão +-- @license @@license@@ +-- @version $Id$ +-- + +CREATE TABLE "modules"."componente_curricular_turma" ( + "componente_curricular_id" int NOT NULL, + "ano_escolar_id" int NOT NULL, + "escola_id" int NOT NULL, + "turma_id" int NOT NULL, + "carga_horaria" numeric(6,3), + PRIMARY KEY("componente_curricular_id","turma_id") +); + +ALTER TABLE "modules"."componente_curricular_turma" + ADD CONSTRAINT "componente_curricular_turma_componente_curricular_fkey" + FOREIGN KEY("componente_curricular_id") + REFERENCES "modules"."componente_curricular"("id") + ON DELETE RESTRICT + ON UPDATE NO ACTION; + +ALTER TABLE "modules"."componente_curricular_turma" + ADD CONSTRAINT "componente_curricular_turma_fkey" + FOREIGN KEY("turma_id") + REFERENCES "pmieducar"."turma"("cod_turma") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +CREATE INDEX "componente_curricular_turma_turma_idx" + ON "modules"."componente_curricular_turma"("turma_id"); + +-- //@UNDO + +DROP INDEX "componente_curricular_turma_turma_idx"; +ALTER TABLE "modules"."componente_curricular_turma" + DROP CONSTRAINT "componente_curricular_turma_componente_curricular_fkey" CASCADE; +ALTER TABLE "modules"."componente_curricular_turma" + DROP CONSTRAINT "componente_curricular_turma_fkey" CASCADE; +DROP TABLE "modules"."componente_curricular_turma"; + +-- // \ No newline at end of file diff --git a/ieducar/misc/database/ieducar.sql b/ieducar/misc/database/ieducar.sql index 368037e..4fbeb4d 100644 --- a/ieducar/misc/database/ieducar.sql +++ b/ieducar/misc/database/ieducar.sql @@ -10337,6 +10337,19 @@ SELECT pg_catalog.setval('componente_curricular_id_seq', 1, false); -- +-- Name: componente_curricular_turma; Type: TABLE; Schema: modules; Owner: -; Tablespace: +-- + +CREATE TABLE componente_curricular_turma ( + componente_curricular_id integer NOT NULL, + ano_escolar_id integer NOT NULL, + escola_id integer NOT NULL, + turma_id integer NOT NULL, + carga_horaria numeric(6,3) +); + + +-- -- Name: falta_aluno; Type: TABLE; Schema: modules; Owner: -; Tablespace: -- @@ -17718,6 +17731,12 @@ SET search_path = modules, pg_catalog; -- +-- Data for Name: componente_curricular_turma; Type: TABLE DATA; Schema: modules; Owner: - +-- + + + +-- -- Data for Name: falta_aluno; Type: TABLE DATA; Schema: modules; Owner: - -- @@ -20115,6 +20134,7 @@ INSERT INTO changelog VALUES (19, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '19_atua INSERT INTO changelog VALUES (20, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '20_remove_permissao_e_menu_diario_avaliacao_temp.sql'); INSERT INTO changelog VALUES (21, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '21_cria_tabelas_modulo_calendario.sql'); INSERT INTO changelog VALUES (22, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '22_cria_primary_key_em_modules_calendario_turma.sql'); +INSERT INTO changelog VALUES (23, 'Main', 'NOW()', 'NOW()', 'dbdeploy', '23_cria_tabela_modules_componente_curricular_turma.sql'); -- @@ -27017,6 +27037,14 @@ ALTER TABLE ONLY componente_curricular -- +-- Name: componente_curricular_turma_pkey; Type: CONSTRAINT; Schema: modules; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY componente_curricular_turma + ADD CONSTRAINT componente_curricular_turma_pkey PRIMARY KEY (componente_curricular_id, turma_id); + + +-- -- Name: falta_aluno_pkey; Type: CONSTRAINT; Schema: modules; Owner: -; Tablespace: -- @@ -28960,6 +28988,13 @@ CREATE UNIQUE INDEX componente_curricular_id_key ON componente_curricular USING -- +-- Name: componente_curricular_turma_turma_idx; Type: INDEX; Schema: modules; Owner: -; Tablespace: +-- + +CREATE INDEX componente_curricular_turma_turma_idx ON componente_curricular_turma USING btree (turma_id); + + +-- -- Name: regra_avaliacao_id_key; Type: INDEX; Schema: modules; Owner: -; Tablespace: -- @@ -32810,6 +32845,22 @@ ALTER TABLE ONLY componente_curricular -- +-- Name: componente_curricular_turma_componente_curricular_fkey; Type: FK CONSTRAINT; Schema: modules; Owner: - +-- + +ALTER TABLE ONLY componente_curricular_turma + ADD CONSTRAINT componente_curricular_turma_componente_curricular_fkey FOREIGN KEY (componente_curricular_id) REFERENCES componente_curricular(id) ON DELETE RESTRICT; + + +-- +-- Name: componente_curricular_turma_fkey; Type: FK CONSTRAINT; Schema: modules; Owner: - +-- + +ALTER TABLE ONLY componente_curricular_turma + ADD CONSTRAINT componente_curricular_turma_fkey FOREIGN KEY (turma_id) REFERENCES pmieducar.turma(cod_turma) ON DELETE CASCADE; + + +-- -- Name: falta_componente_curricular_falta_aluno_fk; Type: FK CONSTRAINT; Schema: modules; Owner: - -- diff --git a/ieducar/modules/Avaliacao/Service/Boletim.php b/ieducar/modules/Avaliacao/Service/Boletim.php index d7a574e..8de233e 100644 --- a/ieducar/modules/Avaliacao/Service/Boletim.php +++ b/ieducar/modules/Avaliacao/Service/Boletim.php @@ -79,6 +79,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable protected $_componenteDataMapper = NULL; /** + * @var ComponenteCurricular_Model_TurmaDataMapper + */ + protected $_componenteTurmaDataMapper = NULL; + + /** * @var RegraAvaliacao_Model_RegraDataMapper */ protected $_regraDataMapper = NULL; @@ -273,6 +278,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable unset($options['ComponenteDataMapper']); } + if (isset($options['ComponenteTurmaDataMapper'])) { + $this->setComponenteTurmaDataMapper($options['ComponenteTurmaDataMapper']); + unset($options['ComponenteTurmaDataMapper']); + } + if (isset($options['RegraDataMapper'])) { $this->setRegraDataMapper($options['RegraDataMapper']); unset($options['RegraDataMapper']); @@ -383,6 +393,30 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable /** * Setter. + * @param ComponenteCurricular_Model_TurmaDataMapper $mapper + * @return App_Service_Boletim Provê interface fluída + */ + public function setComponenteTurmaDataMapper(ComponenteCurricular_Model_TurmaDataMapper $mapper) + { + $this->_componenteTurmaDataMapper = $mapper; + return $this; + } + + /** + * Getter. + * @return ComponenteCurricular_Model_TurmaDataMapper + */ + public function getComponenteTurmaDataMapper() + { + if (is_null($this->_componenteTurmaDataMapper)) { + require_once 'ComponenteCurricular/Model/TurmaDataMapper.php'; + $this->setComponenteTurmaDataMapper(new ComponenteCurricular_Model_TurmaDataMapper()); + } + return $this->_componenteTurmaDataMapper; + } + + /** + * Setter. * @param RegraAvaliacao_Model_RegraDataMapper $mapper * @return App_Service_Boletim Provê interface fluída */ @@ -773,7 +807,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable )) ->_setComponentes(App_Model_IedFinder::getComponentesPorMatricula( - $codMatricula, $this->getComponenteDataMapper() + $codMatricula, $this->getComponenteDataMapper(), + $this->getComponenteTurmaDataMapper() )); // Valores scalar de referência diff --git a/ieducar/modules/Avaliacao/_data/install.sql b/ieducar/modules/Avaliacao/_data/install.sql index 8b7a3f8..570cb5d 100644 --- a/ieducar/modules/Avaliacao/_data/install.sql +++ b/ieducar/modules/Avaliacao/_data/install.sql @@ -8,14 +8,14 @@ -- @version $Id$ -- -CREATE TABLE "modules"."falta_aluno" ( +CREATE TABLE "modules"."falta_aluno" ( "id" serial NOT NULL, "matricula_id" int NOT NULL, "tipo_falta" smallint NOT NULL, PRIMARY KEY("id") ); -CREATE TABLE "modules"."falta_componente_curricular" ( +CREATE TABLE "modules"."falta_componente_curricular" ( "id" serial NOT NULL, "falta_aluno_id" int NOT NULL, "componente_curricular_id" int NOT NULL, @@ -24,7 +24,7 @@ CREATE TABLE "modules"."falta_componente_curricular" ( PRIMARY KEY("id") ); -CREATE TABLE "modules"."falta_geral" ( +CREATE TABLE "modules"."falta_geral" ( "id" serial NOT NULL, "falta_aluno_id" int NOT NULL, "quantidade" int NULL DEFAULT 0, @@ -32,13 +32,13 @@ CREATE TABLE "modules"."falta_geral" ( PRIMARY KEY("id") ); -CREATE TABLE "modules"."nota_aluno" ( +CREATE TABLE "modules"."nota_aluno" ( "id" serial NOT NULL, "matricula_id" int NOT NULL, PRIMARY KEY("id") ); -CREATE TABLE "modules"."nota_componente_curricular" ( +CREATE TABLE "modules"."nota_componente_curricular" ( "id" serial NOT NULL, "nota_aluno_id" int NOT NULL, "componente_curricular_id" int NOT NULL, @@ -48,7 +48,7 @@ CREATE TABLE "modules"."nota_componente_curricular" ( PRIMARY KEY("id") ); -CREATE TABLE "modules"."nota_componente_curricular_media" ( +CREATE TABLE "modules"."nota_componente_curricular_media" ( "nota_aluno_id" int NOT NULL, "componente_curricular_id" int NOT NULL, "media" decimal(5,3) NULL DEFAULT 0, @@ -57,50 +57,83 @@ CREATE TABLE "modules"."nota_componente_curricular_media" ( PRIMARY KEY("nota_aluno_id","componente_curricular_id") ); +CREATE TABLE "modules"."componente_curricular_turma" ( + "componente_curricular_id" int NOT NULL, + "ano_escolar_id" int NOT NULL, + "escola_id" int NOT NULL, + "turma_id" int NOT NULL, + "carga_horaria" numeric(6,3), + PRIMARY KEY("componente_curricular_id","turma_id") +); + ALTER TABLE "modules"."falta_componente_curricular" ADD CONSTRAINT "falta_componente_curricular_falta_aluno_fk" FOREIGN KEY("falta_aluno_id") REFERENCES "modules"."falta_aluno"("id") - ON DELETE CASCADE - ON UPDATE NO ACTION ; + ON DELETE CASCADE + ON UPDATE NO ACTION; ALTER TABLE "modules"."falta_geral" ADD CONSTRAINT "falta_geral_falta_aluno_fk" FOREIGN KEY("falta_aluno_id") REFERENCES "modules"."falta_aluno"("id") - ON DELETE CASCADE - ON UPDATE NO ACTION ; + ON DELETE CASCADE + ON UPDATE NO ACTION; ALTER TABLE "modules"."nota_componente_curricular" ADD CONSTRAINT "nota_componente_curricular_nota_aluno_fk" FOREIGN KEY("nota_aluno_id") REFERENCES "modules"."nota_aluno"("id") - ON DELETE CASCADE - ON UPDATE NO ACTION ; + ON DELETE CASCADE + ON UPDATE NO ACTION; ALTER TABLE "modules"."nota_componente_curricular_media" ADD CONSTRAINT "nota_componente_curricular_media_nota_aluno_fk" FOREIGN KEY("nota_aluno_id") REFERENCES "modules"."nota_aluno"("id") - ON DELETE CASCADE - ON UPDATE NO ACTION ; + ON DELETE CASCADE + ON UPDATE NO ACTION; + +ALTER TABLE "modules"."componente_curricular_turma" + ADD CONSTRAINT "componente_curricular_turma_componente_curricular_fkey" + FOREIGN KEY("componente_curricular_id") + REFERENCES "modules"."componente_curricular"("id") + ON DELETE RESTRICT + ON UPDATE NO ACTION; +ALTER TABLE "modules"."componente_curricular_turma" + ADD CONSTRAINT "componente_curricular_turma_fkey" + FOREIGN KEY("turma_id") + REFERENCES "pmieducar"."turma"("cod_turma") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +CREATE INDEX "componente_curricular_turma_turma_idx" + ON "modules"."componente_curricular_turma"("turma_id"); -- //@UNDO +DROP INDEX "componente_curricular_turma_turma_idx"; + ALTER TABLE "modules"."falta_componente_curricular" - DROP CONSTRAINT "falta_componente_curricular_falta_aluno_fk" CASCADE ; + DROP CONSTRAINT "falta_componente_curricular_falta_aluno_fk" CASCADE; ALTER TABLE "modules"."falta_geral" - DROP CONSTRAINT "falta_geral_falta_aluno_fk" CASCADE ; + DROP CONSTRAINT "falta_geral_falta_aluno_fk" CASCADE; ALTER TABLE "modules"."nota_componente_curricular" - DROP CONSTRAINT "nota_componente_curricular_nota_aluno_fk" CASCADE ; + DROP CONSTRAINT "nota_componente_curricular_nota_aluno_fk" CASCADE; ALTER TABLE "modules"."nota_componente_curricular_media" - DROP CONSTRAINT "nota_componente_curricular_media_nota_aluno_fk" CASCADE ; + DROP CONSTRAINT "nota_componente_curricular_media_nota_aluno_fk" CASCADE; +ALTER TABLE "modules"."componente_curricular_turma" + DROP CONSTRAINT "componente_curricular_turma_componente_curricular_fkey" CASCADE; +ALTER TABLE "modules"."componente_curricular_turma" + DROP CONSTRAINT "componente_curricular_turma_fkey" CASCADE; + DROP TABLE "modules"."falta_aluno"; DROP TABLE "modules"."falta_componente_curricular"; DROP TABLE "modules"."falta_geral"; DROP TABLE "modules"."nota_aluno"; DROP TABLE "modules"."nota_componente_curricular"; DROP TABLE "modules"."nota_componente_curricular_media"; +DROP TABLE "modules"."componente_curricular_turma"; -- // \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/TestCommon.php b/ieducar/modules/Avaliacao/_tests/Service/TestCommon.php index 3475e1c..3445c9d 100644 --- a/ieducar/modules/Avaliacao/_tests/Service/TestCommon.php +++ b/ieducar/modules/Avaliacao/_tests/Service/TestCommon.php @@ -49,6 +49,8 @@ require_once 'TabelaArredondamento/Model/TabelaDataMapper.php'; require_once 'RegraAvaliacao/Model/Regra.php'; require_once 'RegraAvaliacao/Model/RegraDataMapper.php'; +require_once 'ComponenteCurricular/Model/TurmaDataMapper.php'; + require_once 'Avaliacao/Model/NotaAlunoDataMapper.php'; require_once 'Avaliacao/Model/NotaComponenteDataMapper.php'; require_once 'Avaliacao/Model/NotaComponenteMediaDataMapper.php'; @@ -179,6 +181,8 @@ abstract class Avaliacao_Service_TestCommon extends UnitBaseTest protected $_componenteDataMapperMock = NULL; + protected $_componenteTurmaDataMapperMock = NULL; + protected $_notaAlunoDataMapperMock = NULL; protected $_notaComponenteDataMapperMock = NULL; @@ -205,6 +209,7 @@ abstract class Avaliacao_Service_TestCommon extends UnitBaseTest ->_setConfigOptions('escolaAnoLetivo', $this->_getEscolaAnoLetivo()) ->_setConfigOptions('anoLetivoModulo', $this->_getAnoLetivoModulo()) ->_setConfigOptions('modulo', $this->_getModulo()) + ->_setConfigOptions('componentesTurma', $this->_getComponentesTurma()) ->_setConfigOptions('escolaSerieDisciplina', $this->_getEscolaSerieDisciplina()) ->_setConfigOptions('dispensaDisciplina', $this->_getDispensaDisciplina()) ->_setConfigOptions('componenteCurricular', $this->_getComponenteCurricular()) @@ -224,6 +229,7 @@ abstract class Avaliacao_Service_TestCommon extends UnitBaseTest $mappers = array( 'RegraDataMapper' => $this->_getRegraDataMapperMock(), 'ComponenteDataMapper' => $this->_getComponenteDataMapperMock(), + 'ComponenteTurmaDataMapper' => $this->_getComponenteTurmaDataMapperMock(), 'NotaAlunoDataMapper' => $this->_getNotaAlunoDataMapperMock(), 'NotaComponenteDataMapper' => $this->_getNotaComponenteDataMapperMock(), 'NotaComponenteMediaDataMapper' => $this->_getNotaComponenteMediaDataMapperMock(), @@ -261,6 +267,7 @@ abstract class Avaliacao_Service_TestCommon extends UnitBaseTest 'usuario' => $this->_getConfigOption('usuario', 'cod_usuario'), 'RegraDataMapper' => $this->_getConfigOption('mappers', 'RegraDataMapper'), 'ComponenteDataMapper' => $this->_getConfigOption('mappers', 'ComponenteDataMapper'), + 'ComponenteTurmaDataMapper' => $this->_getConfigOption('mappers', 'ComponenteTurmaDataMapper'), 'NotaAlunoDataMapper' => $this->_getConfigOption('mappers', 'NotaAlunoDataMapper'), 'NotaComponenteDataMapper' => $this->_getConfigOption('mappers', 'NotaComponenteDataMapper'), 'NotaComponenteMediaDataMapper' => $this->_getConfigOption('mappers', 'NotaComponenteMediaDataMapper'), @@ -449,6 +456,14 @@ abstract class Avaliacao_Service_TestCommon extends UnitBaseTest /** * @return array */ + protected function _getComponentesTurma() + { + return array(); + } + + /** + * @return array + */ protected function _getEscolaSerieDisciplina() { return array( @@ -850,6 +865,29 @@ abstract class Avaliacao_Service_TestCommon extends UnitBaseTest return $this->_componenteDataMapperMock; } + protected function _setComponenteTurmaDataMapperMock(ComponenteCurricular_Model_TurmaDataMapper $mapper) + { + $this->_componenteTurmaDataMapperMock = $mapper; + return $this; + } + + protected function _getComponenteTurmaDataMapperMock() + { + if (is_null($this->_componenteTurmaDataMapperMock)) { + $componentes = $this->_getConfigOptions('componentesTurma'); + + // Mock para ComponenteCurricular_Model_TurmaDataMapper + $mock = $this->getCleanMock('ComponenteCurricular_Model_TurmaDataMapper'); + $mock->expects($this->any()) + ->method('findAll') + ->will(new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($componentes)); + + $this->_setComponenteTurmaDataMapperMock($mock); + } + + return $this->_componenteTurmaDataMapperMock; + } + protected function _setNotaAlunoDataMapperMock(Avaliacao_Model_NotaAlunoDataMapper $mapper = NULL) { $this->_notaAlunoDataMapperMock = $mapper; diff --git a/ieducar/modules/ComponenteCurricular/Model/Turma.php b/ieducar/modules/ComponenteCurricular/Model/Turma.php new file mode 100644 index 0000000..bc853a0 --- /dev/null +++ b/ieducar/modules/ComponenteCurricular/Model/Turma.php @@ -0,0 +1,85 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage Modules + * @since Arquivo disponível desde a versão 1.2.0 + * @version $Id$ + */ + +require_once 'CoreExt/Entity.php'; + +/** + * ComponenteCurricular_Model_Turma class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage Modules + * @since Classe disponível desde a versão 1.2.0 + * @version @@package_version@@ + */ +class ComponenteCurricular_Model_Turma extends CoreExt_Entity +{ + protected $_data = array( + 'componenteCurricular' => NULL, + 'anoEscolar' => NULL, + 'escola' => NULL, + 'turma' => NULL, + 'cargaHoraria' => NULL + ); + + protected $_dataTypes = array( + 'cargaHoraria' => 'numeric' + ); + + protected $_references = array( + 'componenteCurricular' => array( + 'value' => NULL, + 'class' => 'ComponenteCurricular_Model_ComponenteDataMapper', + 'file' => 'ComponenteCurricular/Model/ComponenteDataMapper.php' + ) + ); + + /** + * Construtor. Remove o campo identidade já que usa uma chave composta. + * @see CoreExt_Entity#__construct($options = array()) + */ + public function __construct($options = array()) { + parent::__construct($options); + unset($this->_data['id']); + } + + /** + * @see CoreExt_Entity_Validatable#getDefaultValidatorCollection() + */ + public function getDefaultValidatorCollection() + { + return array( + 'cargaHoraria' => new CoreExt_Validate_Numeric(array('required' => FALSE)) + ); + } +} \ No newline at end of file diff --git a/ieducar/modules/ComponenteCurricular/Model/TurmaDataMapper.php b/ieducar/modules/ComponenteCurricular/Model/TurmaDataMapper.php new file mode 100644 index 0000000..ed1e389 --- /dev/null +++ b/ieducar/modules/ComponenteCurricular/Model/TurmaDataMapper.php @@ -0,0 +1,137 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage Modules + * @since Arquivo disponível desde a versão 1.2.0 + * @version $Id$ + */ + +require_once 'CoreExt/DataMapper.php'; +require_once 'ComponenteCurricular/Model/Turma.php'; + +/** + * ComponenteCurricular_Model_TurmaDataMapper class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage Modules + * @since Classe disponível desde a versão 1.2.0 + * @version @@package_version@@ + */ +class ComponenteCurricular_Model_TurmaDataMapper extends CoreExt_DataMapper +{ + protected $_entityClass = 'ComponenteCurricular_Model_Turma'; + protected $_tableName = 'componente_curricular_turma'; + protected $_tableSchema = 'modules'; + + /** + * Os atributos anoEscolar e escola estão presentes apenas para + * fins de desnormalização. + * @var array + */ + protected $_attributeMap = array( + 'componenteCurricular' => 'componente_curricular_id', + 'anoEscolar' => 'ano_escolar_id', + 'escola' => 'escola_id', + 'turma' => 'turma_id', + 'cargaHoraria' => 'carga_horaria' + ); + + protected $_primaryKey = array( + 'componenteCurricular', 'turma' + ); + + /** + * Realiza uma operação de atualização em todas as instâncias persistidas de + * ComponenteCurricular_Model_Turma. A atualização envolve criar, atualizar + * e/ou apagar instâncias persistidas. + * + * No exemplo de código a seguir, se uma instância de + * ComponenteCurricular_Model_Turma com uma referência a componenteCurricular + * "1" existisse, esta teria seus atributos atualizados e persistidos + * novamente. Se a referência não existisse, uma nova instância de + * ComponenteCurricular_Model_Turma seria criada e persistida. Caso uma + * referência a "2" existisse, esta seria apagada por não estar referenciada + * no array $componentes. + * + * + * 1, 'cargaHoraria' => 100) + * ); + * $mapper->bulkUpdate(1, 1, 1, $componentes); + * + * + * + * + * @param int $anoEscolar O código do ano escolar/série. + * @param int $escola O código da escola. + * @param int $turma O código da turma. + * @param array $componentes (id => integer, cargaHoraria => float|null) + * @throws Exception + */ + public function bulkUpdate($anoEscolar, $escola, $turma, array $componentes) + { + $update = $insert = $delete = array(); + + $componentesTurma = $this->findAll(array(), array('turma' => $turma)); + + $objects = array(); + foreach ($componentesTurma as $componenteTurma) { + $objects[$componenteTurma->get('componenteCurricular')] = $componenteTurma; + } + + foreach ($componentes as $componente) { + $id = $componente['id']; + + if (isset($objects[$id])) { + $insert[$id] = $objects[$id]; + $insert[$id]->cargaHoraria = $componente['cargaHoraria']; + continue; + } + + $insert[$id] = new ComponenteCurricular_Model_Turma(array( + 'componenteCurricular' => $id, + 'anoEscolar' => $anoEscolar, + 'escola' => $escola, + 'turma' => $turma, + 'cargaHoraria' => $componente['cargaHoraria'] + )); + } + + $delete = array_diff(array_keys($objects), array_keys($insert)); + + foreach ($delete as $id) { + $this->delete($objects[$id]); + } + + foreach ($insert as $entry) { + $this->save($entry); + } + } +} \ No newline at end of file diff --git a/ieducar/modules/ComponenteCurricular/_tests/TurmaDataMapperTest.php b/ieducar/modules/ComponenteCurricular/_tests/TurmaDataMapperTest.php new file mode 100644 index 0000000..85b24b4 --- /dev/null +++ b/ieducar/modules/ComponenteCurricular/_tests/TurmaDataMapperTest.php @@ -0,0 +1,96 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.2.0 + * @version $Id$ + */ + +require_once 'ComponenteCurricular/Model/TurmaDataMapper.php'; + +/** + * TurmDataMapperTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.2.0 + * @version @@package_version@@ + */ +class TurmaDataMapperTest extends UnitBaseTest +{ + protected $_mapper = NULL; + + public function testBulkUpdate() + { + $returnValue = array( + array( + 'componente_curricular_id' => 1, + 'ano_escolar_id' => 1, + 'escola_id' => 1, + 'turma_id' => 1, + 'carga_horaria' => NULL + ), + array( + 'componente_curricular_id' => 3, + 'ano_escolar_id' => 1, + 'escola_id' => 1, + 'turma_id' => 1, + 'carga_horaria' => 100 + ) + ); + + $componentes = array( + array( + 'id' => 1, + 'cargaHoraria' => 100 + ), + array( + 'id' => 2, + 'cargaHoraria' => NULL + ) + ); + + $mock = $this->getDbMock(); + + // 1 SELECT, 1 DELETE, 1 INSERT e 1 UPDATE + $mock->expects($this->exactly(4)) + ->method('Consulta'); + + $mock->expects($this->exactly(3)) + ->method('ProximoRegistro') + ->will($this->onConsecutiveCalls(TRUE, TRUE, FALSE)); + + $mock->expects($this->exactly(2)) + ->method('Tupla') + ->will($this->onConsecutiveCalls($returnValue[0], $returnValue[1])); + + $mapper = new ComponenteCurricular_Model_TurmaDataMapper($mock); + $mapper->bulkUpdate(1, 1, 1, $componentes); + } +} \ No newline at end of file diff --git a/ieducar/modules/ComponenteCurricular/_tests/TurmaTest.php b/ieducar/modules/ComponenteCurricular/_tests/TurmaTest.php new file mode 100644 index 0000000..359e371 --- /dev/null +++ b/ieducar/modules/ComponenteCurricular/_tests/TurmaTest.php @@ -0,0 +1,59 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.2.0 + * @version $Id$ + */ + +require_once 'ComponenteCurricular/Model/Turma.php'; + +/** + * ComponenteCurricular_Model_TurmaTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package ComponenteCurricular + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.2.0 + * @version @@package_version@@ + */ +class ComponenteCurricular_Model_TurmaTest extends UnitBaseTest +{ + protected $_entity = NULL; + + protected function setUp() + { + $this->_entity = new ComponenteCurricular_Model_Turma(); + } + + public function testEntityValidators() + { + $validators = $this->_entity->getValidatorCollection(); + $this->assertType('CoreExt_Validate_Numeric', $validators['cargaHoraria']); + } +} \ No newline at end of file diff --git a/ieducar/tests/unit/App/Model/IedFinderTest.php b/ieducar/tests/unit/App/Model/IedFinderTest.php index 7464fba..610494b 100644 --- a/ieducar/tests/unit/App/Model/IedFinderTest.php +++ b/ieducar/tests/unit/App/Model/IedFinderTest.php @@ -44,6 +44,7 @@ require_once 'TabelaArredondamento/Model/TabelaDataMapper.php'; require_once 'TabelaArredondamento/Model/TabelaValorDataMapper.php'; require_once 'ComponenteCurricular/Model/ComponenteDataMapper.php'; require_once 'ComponenteCurricular/Model/AnoEscolarDataMapper.php'; +require_once 'ComponenteCurricular/Model/TurmaDataMapper.php'; require_once 'AreaConhecimento/Model/AreaDataMapper.php'; /** @@ -101,6 +102,58 @@ class App_Model_IedFinderTest extends UnitBaseTest return $tabela; } + /** + * Configura mocks para ComponenteCurricular_Model_ComponenteDataMapper e + * ComponenteCurricular_Model_TurmaDataMapper para o método getComponentesTurma(). + * + * @return array ('componenteMock', 'turmaMock', 'expected') + */ + protected function _getComponentesTurmaMock() + { + $returnComponenteMock = array( + 1 => new ComponenteCurricular_Model_Componente( + array('id' => 1, 'nome' => 'Matemática', 'cargaHoraria' => 100) + ), + 2 => new ComponenteCurricular_Model_Componente( + array('id' => 2, 'nome' => 'Português', 'cargaHoraria' => 100) + ) + ); + + $expected = $returnComponenteMock; + + $componenteMock = $this->getCleanMock('ComponenteCurricular_Model_ComponenteDataMapper'); + $componenteMock->expects($this->exactly(2)) + ->method('findComponenteCurricularAnoEscolar') + ->will($this->onConsecutiveCalls( + $returnComponenteMock[1], $returnComponenteMock[2] + )); + + $returnTurmaMock = array( + new ComponenteCurricular_Model_Turma( + array('componenteCurricular' => 1, 'cargaHoraria' => 200) + ), + new ComponenteCurricular_Model_Turma( + array('componenteCurricular' => 2, 'cargaHoraria' => NULL) + ) + ); + + $turmaMock = $this->getCleanMock('ComponenteCurricular_Model_TurmaDataMapper'); + $turmaMock->expects($this->once()) + ->method('findAll') + ->with(array(), array('turma' => 1)) + ->will($this->returnValue($returnTurmaMock)); + + // O primeiro componente tem carga horária definida na turma, o segundo usa o padrão do componente + $expected[1] = clone $expected[1]; + $expected[1]->cargaHoraria = 200; + + return array( + 'componenteMock' => $componenteMock, + 'turmaMock' => $turmaMock, + 'expected' => $expected + ); + } + public function testGetCurso() { $returnValue = array( @@ -237,6 +290,10 @@ class App_Model_IedFinderTest extends UnitBaseTest App_Model_IedFinder::addClassToStorage('clsPmieducarEscolaSerieDisciplina', $escolaMock, NULL, TRUE); + // O primeiro componente tem uma carga horária definida em escola-série. + $expected[1] = clone $returnAnoEscolar[1]; + $expected[1]->cargaHoraria = 80; + $componentes = App_Model_IedFinder::getEscolaSerieDisciplina(1, 1, $anoEscolarMock); $this->assertEquals( $expected, $componentes, @@ -244,6 +301,20 @@ class App_Model_IedFinderTest extends UnitBaseTest ); } + public function testGetComponentesTurma() + { + $mocks = $this->_getComponentesTurmaMock(); + + $componentes = App_Model_IedFinder::getComponentesTurma( + 1, 1, 1, $mocks['turmaMock'], $mocks['componenteMock'] + ); + + $this->assertEquals( + $mocks['expected'], $componentes, + '::getComponentesTurma() retorna os componentes de uma turma.' + ); + } + public function testGetMatricula() { $expected = array( @@ -353,81 +424,34 @@ class App_Model_IedFinderTest extends UnitBaseTest */ public function testGetComponentesPorMatricula() { - $componentes = array( - new ComponenteCurricular_Model_Componente( - array('id' => 1, 'nome' => 'Matemática', 'cargaHoraria' => 100) - ), - new ComponenteCurricular_Model_Componente( - array('id' => 2, 'nome' => 'Português', 'cargaHoraria' => 100) - ), - new ComponenteCurricular_Model_Componente( - array('id' => 3, 'nome' => 'Ciências', 'cargaHoraria' => 60) - ), - new ComponenteCurricular_Model_Componente( - array('id' => 4, 'nome' => 'Física', 'cargaHoraria' => 60) - ) - ); - - $expected = array( - 1 => $componentes[0], - 3 => $componentes[2] - ); - - // Retorna para clsPmieducarEscolaSerieDisciplina - $returnEscolaSerieDisciplina = array( - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 1, 'carga_horaria' => 80), - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 2, 'carga_horaria' => NULL), - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 3, 'carga_horaria' => NULL), - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 4, 'carga_horaria' => NULL), - ); - - // Mock para clsPmieducarEscolaSerieDisciplina - $escolaMock = $this->getCleanMock('clsPmieducarEscolaSerieDisciplina'); - $escolaMock->expects($this->any()) - ->method('lista') - ->will($this->returnValue($returnEscolaSerieDisciplina)); + // A turma possui apenas 2 componentes, com os ids: 1 e 2 + $mocks = $this->_getComponentesTurmaMock(); // Retorna para clsPmieducarDispensaDisciplina $returnDispensa = array( - array('ref_cod_matricula' => 1, 'ref_cod_disciplina' => 2), - array('ref_cod_matricula' => 1, 'ref_cod_disciplina' => 4), + array('ref_cod_matricula' => 1, 'ref_cod_disciplina' => 2) ); // Mock para clsPmieducarDispensaDisciplina $dispensaMock = $this->getCleanMock('clsPmieducarDispensaDisciplina'); - $dispensaMock->expects($this->any()) + $dispensaMock->expects($this->once()) ->method('lista') ->with(1, 1, 1) ->will($this->returnValue($returnDispensa)); - // Mock para ComponenteCurricular_Model_ComponenteDataMapper - $mapperMock = $this->getCleanMock('ComponenteCurricular_Model_ComponenteDataMapper'); - $mapperMock->expects($this->exactly(4)) - ->method('findComponenteCurricularAnoEscolar') - ->will($this->onConsecutiveCalls( - $componentes[0], $componentes[1], $componentes[2], $componentes[3] - )); - - // Registra mocks - CoreExt_Entity::addClassToStorage('clsPmieducarEscolaSerieDisciplina', - $escolaMock, NULL, TRUE); CoreExt_Entity::addClassToStorage('clsPmieducarDispensaDisciplina', $dispensaMock, NULL, TRUE); - $disciplinas = App_Model_IedFinder::getComponentesPorMatricula(1, $mapperMock); - - // O esperado é que use a carga horária de escola_serie_disciplina ao - // invés de componente_curricular_ano_escolar. - // Usa clone para clonar a instância, senão usaria a mesma (copy by reference) - $expected[1] = clone($expected[1]); - $expected[1]->cargaHoraria = 80; + $componentes = App_Model_IedFinder::getComponentesPorMatricula( + 1, $mocks['componenteMock'], $mocks['turmaMock'] + ); - $expected[3] = clone($expected[3]); - $expected[3]->cargaHoraria = 60; + $expected = $mocks['expected']; + $expected = array(1 => clone $expected[1]); $this->assertEquals( - $expected, $disciplinas, - '::getComponentesPorMatricula() retorna um array de ComponenteCurricular_Model_Componente para uma matrícula.' + $expected, $componentes, + '::getComponentesPorMatricula() retorna os componentes curriculares de uma matrícula, descartando aqueles em regime de dispensa (dispensa de componente)' ); } -- libgit2 0.21.2