Skip to content

Commit

Permalink
Merge pull request #527 from uspdev/alecostaweb-issue_520
Browse files Browse the repository at this point in the history
👍
  • Loading branch information
alecostaweb authored Nov 9, 2022
2 parents bd05b29 + 9044004 commit 440312a
Show file tree
Hide file tree
Showing 8 changed files with 395 additions and 174 deletions.
105 changes: 88 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,31 +59,67 @@ Exemplo de uso
print_r($emails);
```

### Como usar no laravel

Configuração padrão no .env.exemple da aplicação

```
# REPLICADO #########################################
# https://github.com/uspdev/replicado
REPLICADO_HOST=
REPLICADO_PORT=
REPLICADO_DATABASE=
REPLICADO_USERNAME=
REPLICADO_PASSWORD=
# Código da unidade (modificado em 11/2022 - #524)
REPLICADO_CODUNDCLG=
# Todos os códigos de colegiados da unidade, separados por vírgula (#524)
# (default=REPLICADO_CODUNDCLG)
REPLICADO_CODUNDCLGS=${REPLICADO_CODUNDCLG}
# Converte de/para UTF-8
REPLICADO_SYBASE=1
# habilita o uso do cache https://github.com/uspdev/cache (default=0)
REPLICADO_USAR_CACHE=0
# Se true mostra o retorno de erros do BD (default=APP_DEBUG)
REPLICADO_DEBUG=${APP_DEBUG}
```


### Explicações das variáveis

A maioria das variáveis são autoexplicativas mas outras não.

*REPLICADO_CODUNDCLG* -essa variável pode conter múltiplos valores pois representa a unidade ou o colegiado:
**REPLICADO_CODUNDCLG** - essa variável é o código da unidade. Até 11/2022, ela podia conter valores separados por vírgula. No entanto, para manter compatibilidade e organizar melhor, criou-se outra váriável para conter múltiplos valores:

REPLICADO_CODUNDCLG=8,27
REPLICADO_CODUNDCLG=8

Atenção, NÃO usar aspas, como no neste exemplo: *REPLICADO_CODUNDCLG="8,27"*.
**REPLICADO_CODUNDCLGS** (com S no final) - Representa os colegiados da unidade. Importante para as unidades que tem cursos compartilhados.

REPLICADO_SYBASE - serve para indicar se vc está usando SYBASE ou MSSQL. Implica:
REPLICADO_CODUNDCLGS=8,27

Atenção, NÃO usar aspas, como neste exemplo: *REPLICADO_CODUNDCLG="8,27"*.

**REPLICADO_SYBASE** - serve para indicar se vc está usando SYBASE ou MSSQL. Implica:
* na conversão para UTF-8 pela biblioteca ou pelo freetds
* na remoção de espaços adicionais no final das strings

Dependendo da configuração do MSSQL pode ser necessário ativar essa variável.

REPLICADO_USAR_CACHE - o replicado pode usar memcached através da biblioteca (https://github.com/uspdev/cache).
**REPLICADO_USAR_CACHE** - o replicado pode usar memcached através da biblioteca (https://github.com/uspdev/cache).

Para usar é necessário instalar ele com

composer require uspdev/Cache

e seguir a documentação da biblioteca para levantar o servidor memcached e configurar ele.

Por fim ative o cache do replicado com do
Por fim ative o cache do replicado com

putenv('REPLICADO_USAR_CACHE=1');

Expand All @@ -101,23 +137,58 @@ O replicado pode consultar tanto o MSSQL quanto o sybase-ase e em diversas vers

* Abra uma issue antes de começar a mexer no código. A discussão prévia é importante para alinhar as idéias.
* As contribuições serão aceitas por meio de pull requests. Para tanto faça as alterações em uma branch issue_xx.
* Ao criar um novo método, lembre de documentar o DOCBLOCK
* Ao criar um novo método, crie o teste correspondente
* A branch master é considerada estável e pode ser usada em produção, porém os releases têm sido regulares.
* Documentar o DOCBLOCK
* Texto principal, texto complementar, @param, @return
* @author seu-nome, em xx/xx/xxxx ou
* @author seu-nome, modificado em xx/xx/xxxx
* Coloque o sql em resources/queries
* Os argumentos dos métodos devem ser tipados, incluindo int, string etc
* Deve-se dar preferência para aspas simples em strings pois o PHP não tenta parsear seu conteúdo
* (11/2022) Caso ocorra algum erro, os métodos `DB::fetch` e `DB::fetchAll` retornam `false` e uma mensagem de erro. Em caso de retorno "vazio", alguns métodos precisam de tratamento:
* **obterXxxx**: `PDOStatement::fetch()` retorna false em caso de vazio. Nesse caso use\
`return DB::fetch($query) :? [];`
* **retornarXxxx**: deve retornar `null`
* Dar preferência para aspas simples em strings pois o PHP não tenta parsear seu conteúdo
* A branch `master` é considerada estável e pode ser usada em produção, porém os `releases` têm sido regulares.

Referência: `Pessoa::listarDesignados()`

Sugestão para nomear métodos:

* listarXxx - retorna lista de arrays de Xxx
* obterXxxx - retorna somente um registro (array) de Xxxx
* contarXxxx - retorna uma contagem (count()) de registros de Xxxx
* retornarXxxx - retorna um valor do registro (string, int, etc)
* verificarXxxx - retorna true ou false em função da condição Xxxx
1. listarXxx - retorna lista de registros de dados (fetchAll)
2. obterXxxx - retorna somente um registro (fetch)
3. contarXxxx - retorna uma contagem (count()) - retorno tipo int
4. retornarXxxx - retorna um valor do registro - retorno string, int, etc
5. verificarXxxx - retorna true ou false em função da condição - retorno bool

OBS1.: Quando passar parâmetro array simples, deixar opcional passar string separada por vírgula. Ex.: `Pessoa::contarServidoresSetor()`

OBS2.: (11/2022) As queries dos métodos devem ficar em `resources/queries` e as substituições, se necessário podem ser feitas no método `DB::getQuery('arquivo.sql', $replaces)`

OBS3.: (11/2022) Se necessário usar `REPLICADO_CODUNDCLGS` na query substituindo `__codundclgs__`, não é necessário carregar do `env` e colocar em `$replaces`. O método `DB::getQuery` já busca automaticamente e faz a substituição. Mas se quiser passar algo diferente do `env`, fique à vontade.

### Métodos deprecados

Se você utiliza um desses métodos nos seus sistemas, atualize para o novo método correspondente.

2020
- Pessoa::nome -> procurarPorNome (11/2020)
- Pessoa::nomeFonetico -> procurarPorNome (11/2020)

2021
- Pessoa::vinculosSiglas -> obterSiglasVinculosAtivos (3/2021)
- Pessoa::setoresSiglas -> obterSiglasSetoresAtivos (6/2021)
- Pessoa::emailusp -> retornarEmailUsp (6/2021)
- Pessoa::designados -> listarDesignados (7/2021)
- Graduacao::ativos -> listarAtivos (10/2021)
- Pessoa::nomeCompleto -> obterNome (12/2021)

2022
- Pessoa::servidores -> listarServidores (1/2022)
- Pessoa::vinculosSetores -> listarVinculosSetores (9/2022)
- Pessoa::tiposVinculos -> listarTiposVinculoExtenso (11/2022)
- Graduacao::curso -> obterCursoAtivo (11/2022)

Docblock

Coloque o campo @author no docblock do método. Assim facilita consultar o autor sobre o método.
### phpunit

Ao criar um método novo é necessário criar um método correspondente de teste, usando o phpunit. Para isso, você precisa de um banco de dados sybase ou mssql
Expand Down
8 changes: 8 additions & 0 deletions resources/queries/Graduacao.obterCursoAtivo.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
SELECT L.codpes, L.nompes, C.codcur, C.nomcur, H.codhab, H.nomhab, V.dtainivin, V.codcurgrd
FROM LOCALIZAPESSOA L
INNER JOIN VINCULOPESSOAUSP V ON (L.codpes = V.codpes) AND (L.codundclg = V.codclg)
INNER JOIN CURSOGR C ON (V.codcurgrd = C.codcur)
INNER JOIN HABILITACAOGR H ON (H.codhab = V.codhab)
WHERE (L.codpes = convert(int,:codpes))
AND (L.tipvin = 'ALUNOGR' AND L.codundclg IN (__codundclgs__))
AND (V.codcurgrd = H.codcur AND V.codhab = H.codhab)
6 changes: 6 additions & 0 deletions resources/queries/Pessoa.contarServidoresSetor.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
SELECT COUNT(*) total
FROM PESSOA P
INNER JOIN LOCALIZAPESSOA L ON (P.codpes = L.codpes)
WHERE L.codset IN (__codset__)
AND L.codfncetr = 0 -- exclui designados
__filtroAposentados__
12 changes: 12 additions & 0 deletions resources/queries/Pessoa.listarDesignados.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SELECT L.*, P.* FROM LOCALIZAPESSOA L
INNER JOIN PESSOA P ON (L.codpes = P.codpes)
WHERE L.tipvinext = 'Servidor Designado'
AND L.codundclg IN (__codundclgs__) --automatico do env por getQuery
AND L.sitatl = 'A'
AND L.codpes IN
(SELECT codpes
FROM LOCALIZAPESSOA L
WHERE L.tipvinext IN (__tipvinext__)
AND L.codundclg IN (__codundclgs__)
AND L.sitatl = 'A')
ORDER BY L.nompes
5 changes: 5 additions & 0 deletions resources/queries/Pessoa.listarTiposVinculoExtenso.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
SELECT DISTINCT tipvinext FROM LOCALIZAPESSOA
WHERE codundclg IN (__codundclgs__)
AND (tipvin IN ('ALUNOGR', 'ALUNOPOS', 'ALUNOCEU', 'ALUNOEAD', 'ALUNOPD', 'ALUNOCONVENIOINT', 'SERVIDOR', 'ESTAGIARIORH'))
AND (tipvinext NOT IN ('Servidor Designado', 'Servidor Aposentado'))
ORDER BY tipvinext
13 changes: 11 additions & 2 deletions src/DB.php
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ protected static function getLogger($channel_name)
*
* A $str_where pode ser colocada dentro de $query. Cuidado: ela vem iniciada pela string " WHERE ("
* $params pode ser passado diretamente no fetch/fetchAll
*
*
* 28/1/2022 - Adicionado $colunaSanitizada poara o caso de passar "tabela.coluna". $colunaSanitizada remove o ponto no $param
*
*
* @param array $filtros - campo_tabela => valor
* @param array $buscas - campo_tabela => valor
* @param array $tipos - campo_tabela => tipo (ex.: codpes => int)
Expand Down Expand Up @@ -188,6 +188,9 @@ public static function criaFiltroBusca(array $filtros, array $buscas, array $tip
* opcionalmente pode-se passar uma coleção tipo ['replace' => 'valor']
* para se realizar a substituição. Vai substituir '__replace__' por 'valor'
*
* Caso não seja passado ['codundclgs' => 'valor'], o método pegará automaticamente
* do env se necessário
*
* @param String $filename
* @param Array $repĺaces (default=[])
* @return String
Expand All @@ -209,6 +212,12 @@ public static function getQuery($filename, array $replaces = [])
$query = str_replace("__{$key}__", $val, $query);
}

if (str_contains($query, '__codundclgs__')) {
$codundclgs = getenv('REPLICADO_CODUNDCLGS');
$codundclgs = $codundclgs ?: getenv('REPLICADO_CODUNDCLG');
$query = str_replace("__codundclgs__", $codundclgs, $query);
}

return $query;
}
}
110 changes: 67 additions & 43 deletions src/Graduacao.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,6 @@ public static function verifica($codpes, $codundclgi)
return false;
}

/**
* Método para retornar alunos ativos na unidade
*
* @deprecated em 13/10/2021, em favor de listarAtivos()
* @param Int $condundclgi
* @param String $partNome (optional)
* @return array(campos tabela LOCALIZAPESSOA)
*/
public static function ativos($codundclgi, $parteNome = null)
{
$param = [
'codundclgi' => $codundclgi,
];
$query = " SELECT LOCALIZAPESSOA.* FROM LOCALIZAPESSOA";
$query .= " WHERE LOCALIZAPESSOA.tipvin = 'ALUNOGR' AND LOCALIZAPESSOA.codundclg = convert(int,:codundclgi)";
if (!is_null($parteNome)) {
$parteNome = trim(utf8_decode(Uteis::removeAcentos($parteNome)));
$parteNome = strtoupper(str_replace(' ', '%', $parteNome));
$query .= " AND nompesfon LIKE :parteNome";
$param['parteNome'] = '%' . Uteis::fonetico($parteNome) . '%';
}
$query .= " ORDER BY nompes ASC";
return DB::fetchAll($query, $param);
}

/**
* Lista alunos de graduação ativos na unidade, podendo filtrar por codcur, anoIngresso ou parteNome
*
Expand Down Expand Up @@ -119,27 +94,21 @@ public static function contarAtivos()
}

/**
* Método para retornar dados do curso de um aluno na unidade
* Método para retornar dados do curso de um aluno ativo na unidade
*
* Caso o aluno não esteja cursando, retorna array vazio
* Substitui método curso
*
* @param Int $codpes
* @param Int $codundclgi
* @return array(codpes, nompes, codcur, nomcur, codhab, nomhab, dtainivin, codcurgrd)
* @return Array (codpes, nompes, codcur, nomcur, codhab, nomhab, dtainivin, codcurgrd)
* @author Masakik, adaptado em 8/11/2022
*/
public static function curso($codpes, $codundclgi)
public static function obterCursoAtivo(int $codpes)
{
$query = " SELECT L.codpes, L.nompes, C.codcur, C.nomcur, H.codhab, H.nomhab, V.dtainivin, V.codcurgrd";
$query .= " FROM LOCALIZAPESSOA L";
$query .= " INNER JOIN VINCULOPESSOAUSP V ON (L.codpes = V.codpes) AND (L.codundclg = V.codclg)";
$query .= " INNER JOIN CURSOGR C ON (V.codcurgrd = C.codcur)";
$query .= " INNER JOIN HABILITACAOGR H ON (H.codhab = V.codhab)";
$query .= " WHERE (L.codpes = convert(int,:codpes))";
$query .= " AND (L.tipvin = 'ALUNOGR' AND L.codundclg = convert(int,:codundclgi))";
$query .= " AND (V.codcurgrd = H.codcur AND V.codhab = H.codhab)";
$param = [
'codpes' => $codpes,
'codundclgi' => $codundclgi,
];
return DB::fetch($query, $param);
$query = DB::getQuery('Graduacao.obterCursoAtivo.sql');
$param['codpes'] = $codpes;

return DB::fetch($query, $param) ?: [];
}

/**
Expand Down Expand Up @@ -243,7 +212,7 @@ public static function obterDisciplinas($arrCoddis)

/**
* Método para listar as disciplinas de graduação ativas
*
*
* Alterado o nome do método e aplicado filtro de disciplinas desativadas (4/2022)
*
* @return Array lista com com disciplinas
Expand Down Expand Up @@ -801,4 +770,59 @@ public static function listarDisciplinasAlunoAnoSemestre(int $codpes, int $anoSe

return DB::fetchAll($query, $param);
}

/********** INÍCIO - Métodos deprecados que devem ser eliminados numa futura major release ***********/

/**
* Método para retornar alunos ativos na unidade
*
* @deprecated em 13/10/2021, em favor de listarAtivos()
* @param Int $condundclgi
* @param String $partNome (optional)
* @return array(campos tabela LOCALIZAPESSOA)
*/
public static function ativos($codundclgi, $parteNome = null)
{
$param = [
'codundclgi' => $codundclgi,
];
$query = " SELECT LOCALIZAPESSOA.* FROM LOCALIZAPESSOA";
$query .= " WHERE LOCALIZAPESSOA.tipvin = 'ALUNOGR' AND LOCALIZAPESSOA.codundclg = convert(int,:codundclgi)";
if (!is_null($parteNome)) {
$parteNome = trim(utf8_decode(Uteis::removeAcentos($parteNome)));
$parteNome = strtoupper(str_replace(' ', '%', $parteNome));
$query .= " AND nompesfon LIKE :parteNome";
$param['parteNome'] = '%' . Uteis::fonetico($parteNome) . '%';
}
$query .= " ORDER BY nompes ASC";
return DB::fetchAll($query, $param);
}

/**
* (deprecated) Método para retornar dados do curso de um aluno na unidade
*
* @deprecated em 8/11/2022, em favor de obterCursoAtivo, por Masakik
* @param Int $codpes
* @param Int $codundclgi
* @return array(codpes, nompes, codcur, nomcur, codhab, nomhab, dtainivin, codcurgrd)
*/
public static function curso($codpes, $codundclgi)
{
$query = " SELECT L.codpes, L.nompes, C.codcur, C.nomcur, H.codhab, H.nomhab, V.dtainivin, V.codcurgrd";
$query .= " FROM LOCALIZAPESSOA L";
$query .= " INNER JOIN VINCULOPESSOAUSP V ON (L.codpes = V.codpes) AND (L.codundclg = V.codclg)";
$query .= " INNER JOIN CURSOGR C ON (V.codcurgrd = C.codcur)";
$query .= " INNER JOIN HABILITACAOGR H ON (H.codhab = V.codhab)";
$query .= " WHERE (L.codpes = convert(int,:codpes))";
$query .= " AND (L.tipvin = 'ALUNOGR' AND L.codundclg = convert(int,:codundclgi))";
$query .= " AND (V.codcurgrd = H.codcur AND V.codhab = H.codhab)";
$param = [
'codpes' => $codpes,
'codundclgi' => $codundclgi,
];
return DB::fetch($query, $param);
}


/********** FIM - Métodos deprecados que devem ser eliminados numa futura major release ***********/
}
Loading

0 comments on commit 440312a

Please sign in to comment.