diff --git a/README.md b/README.md index 1364e6f1d7bae15a0bd1465c2bebac87fe920194..ae7a75bd4ad2dec37842a9b0be274f13aa72326d 100644 --- a/README.md +++ b/README.md @@ -148,18 +148,26 @@ coddis, verdis, tipobg, coddis_equivalente, verdis_equivalente - *dump($numpat, $cols)*: recebe numpat e retorna todos campos da tabela bempatrimoniado - *verifica($numpat)*: recebe numpat e retorna true se o bem está ativo - - *ativos($params = null, $operador = 'AND')*: retorna todos campos da tabela BEMPATRIMONIADO dos patrimônios ativos. Pode-se utilizar o array $params no formato campo_tabela => valor para filtrar os bens e definir operador AND/OR (AND é o padrão); + - *bens($filtros = [], $buscas = [], $tipos = [])*: retorna todos campos da tabela BEMPATRIMONIADO dos patrimônios. Utilizar $filtros para valores exatos, $buscas com o *LIKE* e $tipos para colunas que precisam de convert. + + - *ativos($filtros = [], $buscas = [], $tipos = [])*: retorna todos campos da tabela BEMPATRIMONIADO dos patrimônios ATIVOS. Utilizar $filtros para valores exatos, $buscas com o *LIKE* e $tipos para colunas que precisam de convert. Em $filtros já é adicionado por padrão o 'stabem' = 'Ativo'. + * Exemplo utilização: ```php - $params = [ + $filtros = [ 'codpes' => 11111111, + 'codlocusp' => 11111, + ]; + $buscas = [ 'epfmarpat' => 'MARCA', - 'epforibem' => 'Doação', 'modpat' => 'CORE 2 DUO', - 'codlocusp' => 11111, ]; - $bens = Bempatrimoniado::ativos($params); // utiliza operador AND por padrão - $bens = Bempatrimoniado::ativos($params, 'OR'); + $tipos = [ + 'codpes' => 'int', + 'codlocusp' => 'numeric', + ] + $bens = Bempatrimoniado::bens($filtros, $buscas, $tipos); + $ativos = Bempatrimoniado::ativos($filtros, $buscas, $tipos); ``` ## Contribuindo com esse projeto diff --git a/src/Bempatrimoniado.php b/src/Bempatrimoniado.php index 7e89ccd972cee7a96c9c73b67df27ea63ae77b02..8892cdf31ccbbdda73d7649ae4c43d4772a6d315 100644 --- a/src/Bempatrimoniado.php +++ b/src/Bempatrimoniado.php @@ -36,40 +36,19 @@ class Bempatrimoniado } /** - * Retorna todos bens patrimoniados ativos (com opção de filtro) + * Retorna todos bens patrimoniados ativos (com opção de filtros e buscas) * - * @param array $params (opcional) - campo_tabela => valor - * @param string $operador (default = AND) - operador da cláusula WHERE + * @param array $filtros (default) - stabem => 'Ativo' + * @param array $buscas (opcional) - campo_tabela => valor + * @param array $tipos (opcional) - campo_tabela => tipo (ex.: codpes => int) * * @return array Retorna todos os campos da tabela BEMPATRIMONIADO */ - public static function ativos($params = null, $operador = 'AND') + public static function ativos(array $filtros = [], array $buscas = [], array $tipos = []) { - if (is_null($params)) { - $query = " SELECT * FROM BEMPATRIMONIADO WHERE stabem = 'Ativo'"; - } else { - $query = " SELECT * FROM BEMPATRIMONIADO WHERE stabem = 'Ativo' AND ("; - - foreach ($params as $campo => $valor) { - if (gettype($valor) == 'integer') { - $query .= " {$campo} = {$valor} "; - } else if (gettype($valor) == 'string') { - $valor = Uteis::removeAcentos($valor); - $query .= " {$campo} LIKE '%{$valor}%' COLLATE Latin1_General_CI_AI "; - } - - // Enquanto houver item no array, adiciona AND/OR na clásula WHERE - if (next($params)) { - $query .= $operador; - } else { - $query .= ")"; - } - } - } - - $result = DB::fetchAll($query); - $result = Uteis::utf8_converter($result); - $result = Uteis::trim_recursivo($result); + $filtros['stabem'] = 'Ativo'; + $result = self::bens($filtros, $buscas, $tipos); + return $result; } @@ -81,4 +60,29 @@ class Bempatrimoniado } return false; } + + /** + * Retorna todos bens patrimoniados (com opção de filtros e buscas) + * + * @param array $filtros (opcional) - campo_tabela => valor + * @param array $buscas (opcional) - campo_tabela => valor + * @param array $tipos (opcional) - campo_tabela => tipo (ex.: codpes => int) + * + * @return array Retorna todos os campos da tabela BEMPATRIMONIADO + */ + public static function bens(array $filtros = [], array $buscas = [], array $tipos = []) + { + $query = " SELECT * FROM BEMPATRIMONIADO "; + $filtros_buscas = DB::criaFiltroBusca($filtros, $buscas, $tipos); + // Atualiza a cláusula WHERE do sql + $query .= $filtros_buscas[0]; + // Define os parâmetros para cláusula WHERE + $params = $filtros_buscas[1]; + + $result = DB::fetchAll($query, $params); + $result = Uteis::utf8_converter($result); + $result = Uteis::trim_recursivo($result); + return $result; + } } + diff --git a/src/DB.php b/src/DB.php index 486f3b110c62041dd9d09bbb9bd794e3d48997e7..73dc73886ffcf8ee23543e24dc8382fcc79b2ee8 100644 --- a/src/DB.php +++ b/src/DB.php @@ -83,4 +83,68 @@ class DB } return self::$logger; } + + /** + * Retorna array contendo string formatada do WHERE com os filtros/buscas e + * as colunas => valores no formato para 'bind' + * + * @param array $filtros (opcional) - campo_tabela => valor + * @param array $buscas (opcional) - campo_tabela => valor + * @param array $tipos (opcional) - campo_tabela => tipo (ex.: codpes => int) + * + * @return array posição [0] => string WHERE, posição [1] = 'colunas' => valores + * + */ + public static function criaFiltroBusca(array $filtros, array $buscas, array $tipos) + { + // Abre o parênteses dos filtros + $str_where = ""; + $params = []; + if (!empty($filtros) && (count($filtros) > 0)) { + $str_where .= " WHERE ("; + foreach ($filtros as $coluna => $valor) { + if (array_key_exists($coluna, $tipos)) { + $str_where .= " {$coluna} = convert({$tipos[$coluna]}, :{$coluna}) "; + $params[$coluna] = "{$valor}"; + } else { + $str_where .= " {$coluna} = :{$coluna} "; + $params[$coluna] = "{$valor}"; + } + // Enquanto existir um filtro, adiciona o operador AND + if (next($filtros)) { + $str_where .= ' AND '; + } + } + } + + if (!empty($buscas) && (count($buscas) > 0)) { + // Caso exista um campo para busca, fecha os parênteses anterior + // e adiciona mais um AND (, que conterá os parâmetros de busca (OR) + if (!empty($str_where)) { + $str_where .= ') AND ('; + } else { + // Caso não tenha nenhum filtro anterior, adiciona o WHERE + $str_where .= " WHERE ("; + } + foreach ($buscas as $coluna => $valor) { + $str_where .= " {$coluna} LIKE :{$coluna} "; + $params[$coluna] = "%{$valor}%"; + + // Enquanto existir uma busca, adiciona o operador OR + if (next($buscas)) { + $str_where .= ' OR '; + } else { + // Fecha o parênteses do OR + $str_where .= ') '; + } + } + } else { + // Fecha o parênteses dos filtros, caso tenha sido aberto + if (!empty($str_where)) { + $str_where .= ')'; + } + } + + return [$str_where, $params]; + } }